@liberseek/boft-cli-win32-arm64 0.6.9 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,9 @@
20
20
  "muse",
21
21
  "kiro-cli",
22
22
  "codebuddy",
23
- "cursor-cli"
23
+ "cursor-cli",
24
+ "qoder",
25
+ "qoder-cn"
24
26
  ];
25
27
  var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
26
28
  function defaultIdFactory(sequence) {
@@ -151,6 +153,10 @@
151
153
  else if (agent === "codebuddy") delete state.codeBuddyModel;
152
154
  if (agent === "cursor-cli" && model) state.cursorCliModel = model;
153
155
  else if (agent === "cursor-cli") delete state.cursorCliModel;
156
+ if (agent === "qoder" && model) state.qoderModel = model;
157
+ else if (agent === "qoder") delete state.qoderModel;
158
+ if (agent === "qoder-cn" && model) state.qoderCnModel = model;
159
+ else if (agent === "qoder-cn") delete state.qoderCnModel;
154
160
  if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
155
161
  else if (agent === "pi") delete state.piThinkingOptionId;
156
162
  if (agent === "claude-code" && thinkingOptionId) {
@@ -175,6 +181,12 @@
175
181
  if (agent === "codebuddy" && thinkingOptionId) {
176
182
  state.codeBuddyThinkingOptionId = thinkingOptionId;
177
183
  } else if (agent === "codebuddy") delete state.codeBuddyThinkingOptionId;
184
+ if (agent === "qoder" && thinkingOptionId) {
185
+ state.qoderThinkingOptionId = thinkingOptionId;
186
+ } else if (agent === "qoder") delete state.qoderThinkingOptionId;
187
+ if (agent === "qoder-cn" && thinkingOptionId) {
188
+ state.qoderCnThinkingOptionId = thinkingOptionId;
189
+ } else if (agent === "qoder-cn") delete state.qoderCnThinkingOptionId;
178
190
  if (agent !== "codex") {
179
191
  const permissionModeByAgent = {};
180
192
  for (const candidate of [
@@ -189,7 +201,9 @@
189
201
  "muse",
190
202
  "kiro-cli",
191
203
  "codebuddy",
192
- "cursor-cli"
204
+ "cursor-cli",
205
+ "qoder",
206
+ "qoder-cn"
193
207
  ]) {
194
208
  const current = state.permissionModeByAgent?.[candidate];
195
209
  if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
@@ -217,6 +231,8 @@
217
231
  if (agent === "kiro-cli") return state.kiroCliModel;
218
232
  if (agent === "codebuddy") return state.codeBuddyModel;
219
233
  if (agent === "cursor-cli") return state.cursorCliModel;
234
+ if (agent === "qoder") return state.qoderModel;
235
+ if (agent === "qoder-cn") return state.qoderCnModel;
220
236
  return void 0;
221
237
  }
222
238
  thinkingOptionForAgent(composer, agent) {
@@ -230,6 +246,8 @@
230
246
  if (agent === "muse") return state.museThinkingOptionId;
231
247
  if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
232
248
  if (agent === "codebuddy") return state.codeBuddyThinkingOptionId;
249
+ if (agent === "qoder") return state.qoderThinkingOptionId;
250
+ if (agent === "qoder-cn") return state.qoderCnThinkingOptionId;
233
251
  return void 0;
234
252
  }
235
253
  permissionModeForAgent(composer, agent) {
@@ -257,6 +275,8 @@
257
275
  else if (agent === "kiro-cli") state.kiroCliModel = model;
258
276
  else if (agent === "codebuddy") state.codeBuddyModel = model;
259
277
  else if (agent === "cursor-cli") state.cursorCliModel = model;
278
+ else if (agent === "qoder") state.qoderModel = model;
279
+ else if (agent === "qoder-cn") state.qoderCnModel = model;
260
280
  else state.antigravityModel = model;
261
281
  return state;
262
282
  }
@@ -306,6 +326,14 @@
306
326
  state.codeBuddyThinkingOptionId = thinkingOptionId;
307
327
  } else if (agent === "codebuddy") {
308
328
  delete state.codeBuddyThinkingOptionId;
329
+ } else if (agent === "qoder" && thinkingOptionId) {
330
+ state.qoderThinkingOptionId = thinkingOptionId;
331
+ } else if (agent === "qoder") {
332
+ delete state.qoderThinkingOptionId;
333
+ } else if (agent === "qoder-cn" && thinkingOptionId) {
334
+ state.qoderCnThinkingOptionId = thinkingOptionId;
335
+ } else if (agent === "qoder-cn") {
336
+ delete state.qoderCnThinkingOptionId;
309
337
  }
310
338
  return state;
311
339
  }
@@ -14911,6 +14939,48 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
14911
14939
  // ../shared-contracts/dist/version.js
14912
14940
  var WORKSPACE_CONTRACT_VERSION = 1;
14913
14941
 
14942
+ // ../shared-contracts/dist/idle-release.js
14943
+ var IDLE_RELEASE_SETTINGS_METHOD = "codexhost/settings/idle-release/set";
14944
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
14945
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
14946
+ var idleReleaseSettingsSchema = external_exports.strictObject({
14947
+ enabled: external_exports.boolean(),
14948
+ timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
14949
+ });
14950
+ var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
14951
+ enabled: false,
14952
+ timeoutMinutes: 30
14953
+ });
14954
+
14955
+ // ../shared-contracts/dist/loaded-sessions.js
14956
+ var LOADED_SESSIONS_METHOD = "codexhost/sessions/loaded/list";
14957
+ var loadedSessionStateSchema = external_exports.enum([
14958
+ "idle",
14959
+ "running",
14960
+ "busy",
14961
+ "closing",
14962
+ "failed",
14963
+ "blocked"
14964
+ ]);
14965
+ var loadedSessionReasonSchema = external_exports.enum([
14966
+ "none",
14967
+ "disabled",
14968
+ "timeout",
14969
+ "operation",
14970
+ "background",
14971
+ "identity",
14972
+ "persistence",
14973
+ "closeFailed"
14974
+ ]);
14975
+ var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
14976
+ threadId: external_exports.string(),
14977
+ title: external_exports.string(),
14978
+ harnessId: external_exports.string(),
14979
+ state: loadedSessionStateSchema,
14980
+ reason: loadedSessionReasonSchema,
14981
+ inactiveMs: external_exports.number().nonnegative()
14982
+ }));
14983
+
14914
14984
  // ../shared-contracts/dist/ids.js
14915
14985
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
14916
14986
  message: "Identifier must not be empty or whitespace"
@@ -15782,6 +15852,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15782
15852
  return [...installed, ...uninstalled];
15783
15853
  }
15784
15854
  var AGENT_GROUP_PREFERENCE_STORAGE_KEY = "codexhost.agentGroupPreference.v1";
15855
+ var DEFAULT_MAIN_EXTERNAL_AGENTS = [
15856
+ "claude-code",
15857
+ "grok",
15858
+ "pi",
15859
+ "hermes",
15860
+ "opencode"
15861
+ ];
15862
+ var DEFAULT_MAIN_EXTERNAL_AGENT_SET = new Set(
15863
+ DEFAULT_MAIN_EXTERNAL_AGENTS
15864
+ );
15865
+ function defaultAgentGroupSection(agent) {
15866
+ return DEFAULT_MAIN_EXTERNAL_AGENT_SET.has(agent) ? "main" : "more";
15867
+ }
15785
15868
  var EXTERNAL_AGENTS = KNOWN_RENDERER_AGENTS.filter(
15786
15869
  (agent) => agent !== "codex"
15787
15870
  );
@@ -15822,7 +15905,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15822
15905
  function createAgentGroupPreferenceStore(storage = safeLocalStorage()) {
15823
15906
  let order = [...EXTERNAL_AGENTS];
15824
15907
  let sections = new Map(
15825
- EXTERNAL_AGENTS.map((agent) => [agent, "main"])
15908
+ EXTERNAL_AGENTS.map((agent) => [agent, defaultAgentGroupSection(agent)])
15826
15909
  );
15827
15910
  const listeners = /* @__PURE__ */ new Set();
15828
15911
  const stored = readStorage(storage);
@@ -15844,7 +15927,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15844
15927
  const persist = () => {
15845
15928
  writeStorage(
15846
15929
  storage,
15847
- order.map((agent) => ({ agent, section: sections.get(agent) ?? "main" }))
15930
+ order.map((agent) => ({
15931
+ agent,
15932
+ section: sections.get(agent) ?? defaultAgentGroupSection(agent)
15933
+ }))
15848
15934
  );
15849
15935
  };
15850
15936
  const notify = () => {
@@ -15852,10 +15938,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15852
15938
  };
15853
15939
  return {
15854
15940
  list() {
15855
- return order.map((agent) => ({ agent, section: sections.get(agent) ?? "main" }));
15941
+ return order.map((agent) => ({
15942
+ agent,
15943
+ section: sections.get(agent) ?? defaultAgentGroupSection(agent)
15944
+ }));
15856
15945
  },
15857
15946
  sectionOf(agent) {
15858
- return sections.get(agent) ?? "main";
15947
+ return sections.get(agent) ?? defaultAgentGroupSection(agent);
15859
15948
  },
15860
15949
  moveAgent(agent, section, beforeAgent = null) {
15861
15950
  if (!EXTERNAL_AGENTS.includes(agent)) return;
@@ -15880,10 +15969,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15880
15969
  for (const agent of EXTERNAL_AGENTS) {
15881
15970
  if (seen.has(agent)) continue;
15882
15971
  nextOrder.push(agent);
15883
- nextSections.set(agent, sections.get(agent) ?? "main");
15972
+ nextSections.set(agent, sections.get(agent) ?? defaultAgentGroupSection(agent));
15884
15973
  }
15885
15974
  const unchanged = nextOrder.length === order.length && nextOrder.every(
15886
- (agent, index) => agent === order[index] && (nextSections.get(agent) ?? "main") === (sections.get(agent) ?? "main")
15975
+ (agent, index) => agent === order[index] && (nextSections.get(agent) ?? defaultAgentGroupSection(agent)) === (sections.get(agent) ?? defaultAgentGroupSection(agent))
15887
15976
  );
15888
15977
  if (unchanged) return;
15889
15978
  order = nextOrder;
@@ -15892,7 +15981,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15892
15981
  },
15893
15982
  resetToDefault() {
15894
15983
  order = [...EXTERNAL_AGENTS];
15895
- sections = new Map(EXTERNAL_AGENTS.map((agent) => [agent, "main"]));
15984
+ sections = new Map(EXTERNAL_AGENTS.map((agent) => [agent, defaultAgentGroupSection(agent)]));
15896
15985
  persist();
15897
15986
  notify();
15898
15987
  },
@@ -15935,6 +16024,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15935
16024
  // src/assets/opencode-agent.png
15936
16025
  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=";
15937
16026
 
16027
+ // src/assets/qoder-agent.svg
16028
+ 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>';
16029
+
15938
16030
  // src/renderer-agent-icon.ts
15939
16031
  var RENDERER_AGENT_LABELS = {
15940
16032
  codex: "Codex",
@@ -15949,7 +16041,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15949
16041
  muse: "Meta Muse Code",
15950
16042
  "kiro-cli": "Kiro CLI",
15951
16043
  codebuddy: "CodeBuddy",
15952
- "cursor-cli": "Cursor CLI (Experimental)"
16044
+ "cursor-cli": "Cursor CLI (Experimental)",
16045
+ qoder: "Qoder",
16046
+ "qoder-cn": "Qoder CN"
15953
16047
  };
15954
16048
  var PI_PATHS = [
15955
16049
  {
@@ -16062,6 +16156,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16062
16156
  ownerDocument
16063
16157
  );
16064
16158
  }
16159
+ if (agent === "qoder" || agent === "qoder-cn") {
16160
+ const image = ownerDocument.createElement("img");
16161
+ image.src = qoder_agent_default;
16162
+ image.alt = "";
16163
+ image.draggable = false;
16164
+ image.style.width = `${size}px`;
16165
+ image.style.height = `${size}px`;
16166
+ image.style.objectFit = "contain";
16167
+ image.style.flex = "none";
16168
+ return image;
16169
+ }
16065
16170
  const mark = ownerDocument.createElement("img");
16066
16171
  mark.src = grok_agent_default;
16067
16172
  mark.alt = "";
@@ -16665,6 +16770,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16665
16770
  binary: "cursor-agent",
16666
16771
  posix: "curl https://cursor.com/install -fsS | bash",
16667
16772
  windows: "irm https://cursor.com/install.ps1 | iex"
16773
+ },
16774
+ qoder: {
16775
+ url: "https://docs.qoder.com/",
16776
+ binary: "qodercli",
16777
+ posix: "npm install -g @qoder-ai/qodercli",
16778
+ windows: "npm install -g @qoder-ai/qodercli"
16779
+ },
16780
+ "qoder-cn": {
16781
+ url: "https://docs.qoder.cn/",
16782
+ binary: "qoderclicn",
16783
+ posix: "npm install -g @qodercn-ai/qoderclicn",
16784
+ windows: "npm install -g @qodercn-ai/qoderclicn"
16668
16785
  }
16669
16786
  });
16670
16787
  function harnessInstallPlatform(window2) {
@@ -17234,7 +17351,7 @@ ${error51.stderrTail}`] : []
17234
17351
  }
17235
17352
  const requestedFocus = pendingFocusAgent;
17236
17353
  pendingFocusAgent = null;
17237
- if (requestedFocus && items.some((item) => item.key === requestedFocus) && expandedItemKey === null) {
17354
+ if (requestedFocus && items.some((item) => item.key === requestedFocus)) {
17238
17355
  expandedItemKey = requestedFocus;
17239
17356
  }
17240
17357
  const rowElements = /* @__PURE__ */ new Map();
@@ -17250,7 +17367,10 @@ ${error51.stderrTail}`] : []
17250
17367
  const preferenceOrder = groupPreference.list().filter((entry) => agentByKey.has(entry.agent));
17251
17368
  for (const item of groupableItems) {
17252
17369
  if (!preferenceOrder.some((entry) => entry.agent === item.key)) {
17253
- preferenceOrder.push({ agent: item.key, section: "main" });
17370
+ preferenceOrder.push({
17371
+ agent: item.key,
17372
+ section: defaultAgentGroupSection(item.key)
17373
+ });
17254
17374
  }
17255
17375
  }
17256
17376
  const mainEntries = partitionAgentsByInstallStatus(
@@ -17481,9 +17601,53 @@ ${error51.stderrTail}`] : []
17481
17601
  connectionSection: "Connections",
17482
17602
  generalSection: "General",
17483
17603
  otherSection: "Other",
17484
- appearanceDescription: "Adjust how thinking text is displayed in the conversation.",
17604
+ appearanceDescription: "Conversation display and local resource management.",
17605
+ appearanceGroup: "Appearance",
17606
+ loadedSessions: {
17607
+ title: "Loaded sessions",
17608
+ description: "Local external Harnesses only. Refreshes every 10 seconds without waking sessions or resetting activity. Released sessions disappear from this list.",
17609
+ columns: ["Session", "Harness", "State", "Since last activity", "Release constraint"],
17610
+ empty: "No loaded external sessions.",
17611
+ failed: "Could not load session status.",
17612
+ unavailable: "Local Host does not support session status or is unavailable.",
17613
+ loading: "Loading session status\u2026",
17614
+ minutes: "{minutes} min",
17615
+ states: {
17616
+ idle: "Idle",
17617
+ running: "Running",
17618
+ busy: "Busy",
17619
+ closing: "Releasing",
17620
+ failed: "Release failed",
17621
+ blocked: "Blocked"
17622
+ },
17623
+ reasons: {
17624
+ none: "\u2014",
17625
+ disabled: "Automatic release is off",
17626
+ timeout: "Timeout not reached",
17627
+ operation: "Turn or Host operation in progress",
17628
+ background: "Subagent, steering, command or interaction pending",
17629
+ identity: "Session identity unavailable or snapshot-only session",
17630
+ persistence: "Persistence or output error",
17631
+ closeFailed: "Restart Desktop before retrying"
17632
+ }
17633
+ },
17634
+ idleReleaseSection: "Resource management",
17635
+ idleReleaseTitle: "Release idle sessions",
17636
+ idleReleaseDescription: "Close background instances after the idle timeout; they resume on next use.",
17637
+ idleReleaseHelpLabel: "About releasing idle sessions",
17638
+ idleReleaseHelp: Object.freeze([
17639
+ "After an Agent finishes replying, its background process may continue running and using memory. Keeping more sessions open may increase resource usage.",
17640
+ "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."
17641
+ ]),
17642
+ idleReleaseTimeout: "Idle timeout",
17643
+ idleReleaseTimeoutDescription: "5\u20131440 minutes.",
17644
+ idleReleaseMinutes: "min",
17645
+ idleReleaseInvalid: "Enter a whole number from 5 to 1440.",
17646
+ idleReleasePending: "Syncing\u2026",
17647
+ idleReleaseUnavailable: "Not supported by this Host",
17648
+ idleReleaseFailed: "Sync failed, try again",
17485
17649
  reasoningSoftWrapTitle: "Wrap thinking text",
17486
- reasoningSoftWrapDescription: "Wrap long thinking lines in the transcript. Ordinary shell output is unaffected. Off by default.",
17650
+ reasoningSoftWrapDescription: "Wrap long lines in thinking blocks. Shell output is unaffected.",
17487
17651
  pageUnavailable: "Page unavailable",
17488
17652
  inDevelopment: "In development",
17489
17653
  notAvailable: "Not available",
@@ -17509,7 +17673,6 @@ ${error51.stderrTail}`] : []
17509
17673
  sessionImportUpdatedAt: "Updated",
17510
17674
  sessionImportSessionId: "Session ID",
17511
17675
  sessionImportRunning: "Running",
17512
- sessionImportRunningUnknown: "Activity unknown",
17513
17676
  sessionImportRunningHint: "Close this session in its native client before importing, then refresh.",
17514
17677
  sessionImportAction: "Import and open",
17515
17678
  sessionImportImporting: "Importing...",
@@ -17693,9 +17856,53 @@ ${error51.stderrTail}`] : []
17693
17856
  connectionSection: "\u8FDE\u63A5",
17694
17857
  generalSection: "\u901A\u7528",
17695
17858
  otherSection: "\u5176\u4ED6",
17696
- appearanceDescription: "\u8C03\u6574\u4F1A\u8BDD\u4E2D\u601D\u8003\u6587\u672C\u7684\u663E\u793A\u65B9\u5F0F\u3002",
17859
+ appearanceDescription: "\u4F1A\u8BDD\u663E\u793A\u4E0E\u672C\u5730\u8D44\u6E90\u7BA1\u7406\u3002",
17860
+ appearanceGroup: "\u5916\u89C2",
17861
+ loadedSessions: {
17862
+ title: "\u5DF2\u52A0\u8F7D\u4F1A\u8BDD",
17863
+ 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",
17864
+ columns: ["\u4F1A\u8BDD", "Harness", "\u72B6\u6001", "\u8DDD\u6700\u540E\u6D3B\u52A8", "\u6682\u4E0D\u80FD\u91CA\u653E\u7684\u539F\u56E0"],
17865
+ empty: "\u6682\u65E0\u5DF2\u52A0\u8F7D\u7684\u5916\u90E8\u4F1A\u8BDD\u3002",
17866
+ failed: "\u65E0\u6CD5\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u3002",
17867
+ unavailable: "\u672C\u5730 Host \u4E0D\u652F\u6301\u4F1A\u8BDD\u72B6\u6001\u67E5\u8BE2\u6216\u5F53\u524D\u4E0D\u53EF\u7528\u3002",
17868
+ loading: "\u6B63\u5728\u52A0\u8F7D\u4F1A\u8BDD\u72B6\u6001\u2026",
17869
+ minutes: "{minutes} \u5206\u949F",
17870
+ states: {
17871
+ idle: "\u7A7A\u95F2",
17872
+ running: "\u6267\u884C\u4E2D",
17873
+ busy: "\u5FD9\u788C",
17874
+ closing: "\u91CA\u653E\u4E2D",
17875
+ failed: "\u91CA\u653E\u5931\u8D25",
17876
+ blocked: "\u4E0D\u53EF\u91CA\u653E"
17877
+ },
17878
+ reasons: {
17879
+ none: "\u2014",
17880
+ disabled: "\u81EA\u52A8\u91CA\u653E\u5DF2\u5173\u95ED",
17881
+ timeout: "\u5C1A\u672A\u8FBE\u5230\u8D85\u65F6",
17882
+ operation: "\u4EFB\u52A1\u6216 Host \u64CD\u4F5C\u5C1A\u672A\u7ED3\u675F",
17883
+ background: "\u5B58\u5728\u5B50\u4EFB\u52A1\u3001\u8F6C\u5411\u3001\u547D\u4EE4\u6216\u5F85\u5904\u7406\u4EA4\u4E92",
17884
+ identity: "\u7F3A\u5C11\u53EF\u6062\u590D\u8EAB\u4EFD\u6216\u4EC5\u6709\u5FEB\u7167",
17885
+ persistence: "\u6301\u4E45\u5316\u6216\u8F93\u51FA\u5F02\u5E38",
17886
+ closeFailed: "\u9700\u91CD\u542F Desktop \u540E\u91CD\u8BD5"
17887
+ }
17888
+ },
17889
+ idleReleaseSection: "\u8D44\u6E90\u7BA1\u7406",
17890
+ idleReleaseTitle: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD",
17891
+ idleReleaseDescription: "\u7A7A\u95F2\u8D85\u65F6\u540E\u5173\u95ED\u540E\u53F0\u5B9E\u4F8B\uFF0C\u518D\u6B21\u4F7F\u7528\u65F6\u81EA\u52A8\u6062\u590D\u3002",
17892
+ idleReleaseHelpLabel: "\u81EA\u52A8\u91CA\u653E\u7A7A\u95F2\u4F1A\u8BDD\u8BF4\u660E",
17893
+ idleReleaseHelp: Object.freeze([
17894
+ "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",
17895
+ "\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"
17896
+ ]),
17897
+ idleReleaseTimeout: "\u7A7A\u95F2\u8D85\u65F6",
17898
+ idleReleaseTimeoutDescription: "5\uFF5E1440 \u5206\u949F\u3002",
17899
+ idleReleaseMinutes: "\u5206\u949F",
17900
+ idleReleaseInvalid: "\u8BF7\u8F93\u5165 5\uFF5E1440 \u4E4B\u95F4\u7684\u6574\u6570\u3002",
17901
+ idleReleasePending: "\u540C\u6B65\u4E2D\u2026",
17902
+ idleReleaseUnavailable: "\u5F53\u524D Host \u4E0D\u652F\u6301",
17903
+ idleReleaseFailed: "\u540C\u6B65\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5",
17697
17904
  reasoningSoftWrapTitle: "\u6362\u884C\u663E\u793A\u601D\u8003\u6587\u672C",
17698
- 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",
17905
+ reasoningSoftWrapDescription: "\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\uFF0C\u4E0D\u5F71\u54CD Shell \u8F93\u51FA\u3002",
17699
17906
  pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
17700
17907
  inDevelopment: "\u5F00\u53D1\u4E2D",
17701
17908
  notAvailable: "\u6682\u4E0D\u53EF\u7528",
@@ -17721,7 +17928,6 @@ ${error51.stderrTail}`] : []
17721
17928
  sessionImportUpdatedAt: "\u66F4\u65B0\u65F6\u95F4",
17722
17929
  sessionImportSessionId: "\u4F1A\u8BDD ID",
17723
17930
  sessionImportRunning: "\u8FD0\u884C\u4E2D",
17724
- sessionImportRunningUnknown: "\u8FD0\u884C\u72B6\u6001\u672A\u77E5",
17725
17931
  sessionImportRunningHint: "\u8BF7\u5148\u5728\u539F\u751F\u5BA2\u6237\u7AEF\u5173\u95ED\u8BE5\u4F1A\u8BDD\uFF0C\u518D\u5237\u65B0\u5E76\u5BFC\u5165\u3002",
17726
17932
  sessionImportAction: "\u5BFC\u5165\u5E76\u6253\u5F00",
17727
17933
  sessionImportImporting: "\u6B63\u5728\u5BFC\u5165\u2026\u2026",
@@ -17933,20 +18139,6 @@ ${error51.stderrTail}`] : []
17933
18139
  function openConnectionsSettings(opener) {
17934
18140
  openSettingsPage("connections", opener);
17935
18141
  }
17936
- var RENDERER_AGENT_INSTALL_URLS = {
17937
- pi: "https://pi.dev/",
17938
- "claude-code": "https://code.claude.com/docs/en/quickstart",
17939
- "deepseek-harness": "https://github.com/deepseek-ai/deepseek-harness",
17940
- opencode: "https://opencode.ai/docs/",
17941
- grok: "https://grok.com/",
17942
- omp: "https://github.com/can1357/oh-my-pi",
17943
- antigravity: "https://antigravity.google/product/antigravity-cli",
17944
- "kiro-cli": "https://kiro.dev/docs/cli/",
17945
- codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
17946
- "cursor-cli": "https://cursor.com/docs/cli/installation",
17947
- hermes: "https://hermes-agent.nousresearch.com/docs",
17948
- muse: "https://www.meta.ai/"
17949
- };
17950
18142
  var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
17951
18143
  var AGENT_MENU_WIDTH = 224;
17952
18144
  var AGENT_GROUP_CTA_THRESHOLD = 5;
@@ -18014,7 +18206,7 @@ ${error51.stderrTail}`] : []
18014
18206
  return !menu.hidden;
18015
18207
  }
18016
18208
  }
18017
- function mountRendererAgentPicker(composerId, enabledAgents, onSelect, onDownload, onOpen, groupPreference = getSharedAgentGroupPreferenceStore()) {
18209
+ function mountRendererAgentPicker(composerId, enabledAgents, onSelect, onOpen, groupPreference = getSharedAgentGroupPreferenceStore()) {
18018
18210
  const root = document.createElement("div");
18019
18211
  root.setAttribute(CONTROL_ATTRIBUTE, composerId);
18020
18212
  root.style.display = "inline-flex";
@@ -18189,12 +18381,8 @@ ${error51.stderrTail}`] : []
18189
18381
  });
18190
18382
  control2.addEventListener("click", (event) => {
18191
18383
  event.stopPropagation();
18192
- if (control2.dataset.mode === "error") {
18193
- requestConnectionsPageFocus(agent);
18194
- openConnectionsSettings(trigger);
18195
- } else {
18196
- onDownload(agent);
18197
- }
18384
+ requestConnectionsPageFocus(agent);
18385
+ openConnectionsSettings(trigger);
18198
18386
  });
18199
18387
  return control2;
18200
18388
  })();
@@ -18337,6 +18525,7 @@ ${error51.stderrTail}`] : []
18337
18525
  initiallyHidden: true,
18338
18526
  bordered: true
18339
18527
  });
18528
+ let notInstalled = /* @__PURE__ */ new Set();
18340
18529
  let mainAgents = [...enabledAgents];
18341
18530
  let moreAgents = [];
18342
18531
  const regroup = () => {
@@ -18357,10 +18546,12 @@ ${error51.stderrTail}`] : []
18357
18546
  for (const agent of enabledAgents) {
18358
18547
  if (seen.has(agent)) continue;
18359
18548
  seen.add(agent);
18360
- nextMain.push(agent);
18549
+ if (agent === "codex" || defaultAgentGroupSection(agent) === "main") nextMain.push(agent);
18550
+ else nextMore.push(agent);
18361
18551
  }
18362
- mainAgents = nextMain;
18363
- moreAgents = nextMore;
18552
+ const installationOrder = (a, b) => Number(notInstalled.has(a)) - Number(notInstalled.has(b));
18553
+ mainAgents = nextMain.sort(installationOrder);
18554
+ moreAgents = nextMore.sort(installationOrder);
18364
18555
  const mainChildren = [];
18365
18556
  for (const agent of mainAgents) {
18366
18557
  const row = rowsByAgent.get(agent);
@@ -18437,6 +18628,18 @@ ${error51.stderrTail}`] : []
18437
18628
  menu,
18438
18629
  agents: [...enabledAgents],
18439
18630
  options,
18631
+ updateAvailability(availability) {
18632
+ const next = new Set(
18633
+ enabledAgents.filter(
18634
+ (agent) => agent !== "codex" && availability[agent] === "notInstalled"
18635
+ )
18636
+ );
18637
+ if (next.size === notInstalled.size && [...next].every((agent) => notInstalled.has(agent))) {
18638
+ return;
18639
+ }
18640
+ notInstalled = next;
18641
+ regroup();
18642
+ },
18440
18643
  close,
18441
18644
  dispose() {
18442
18645
  close();
@@ -18460,6 +18663,7 @@ ${error51.stderrTail}`] : []
18460
18663
  control.agents,
18461
18664
  availability
18462
18665
  );
18666
+ control.updateAvailability(availability);
18463
18667
  if (control.iconSlot.dataset.agent !== state.agent) {
18464
18668
  control.iconSlot.replaceChildren(createRendererAgentIcon(state.agent));
18465
18669
  control.iconSlot.dataset.agent = state.agent;
@@ -18643,6 +18847,113 @@ ${error51.stderrTail}`] : []
18643
18847
  (ownerDocument.head ?? ownerDocument.documentElement).append(style);
18644
18848
  }
18645
18849
 
18850
+ // src/renderer-model-favorites.ts
18851
+ var STORAGE_KEY = "codexhost.model-favorites.v1";
18852
+ function rendererStorage() {
18853
+ try {
18854
+ return window.localStorage;
18855
+ } catch {
18856
+ return null;
18857
+ }
18858
+ }
18859
+ function readModelFavorites(harnessId, storage = rendererStorage()) {
18860
+ try {
18861
+ const value = JSON.parse(storage?.getItem(`${STORAGE_KEY}:${harnessId}`) ?? "[]");
18862
+ return new Set(
18863
+ Array.isArray(value) ? value.filter((id) => typeof id === "string" && id.length > 0) : []
18864
+ );
18865
+ } catch {
18866
+ return /* @__PURE__ */ new Set();
18867
+ }
18868
+ }
18869
+ function writeModelFavorites(harnessId, favorites, storage = rendererStorage()) {
18870
+ try {
18871
+ storage?.setItem(`${STORAGE_KEY}:${harnessId}`, JSON.stringify([...favorites]));
18872
+ } catch {
18873
+ }
18874
+ }
18875
+
18876
+ // ../../node_modules/lucide/dist/esm/icons/star.mjs
18877
+ var Star = [
18878
+ [
18879
+ "path",
18880
+ {
18881
+ d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"
18882
+ }
18883
+ ]
18884
+ ];
18885
+
18886
+ // src/renderer-model-option-style.ts
18887
+ var STYLE_ATTRIBUTE3 = "data-codexhost-model-option-style";
18888
+ function ensureModelOptionStyle(ownerDocument) {
18889
+ if (ownerDocument.querySelector(`style[${STYLE_ATTRIBUTE3}]`)) return;
18890
+ const style = ownerDocument.createElement("style");
18891
+ style.setAttribute(STYLE_ATTRIBUTE3, "true");
18892
+ style.textContent = `
18893
+ [data-codexhost-model-row] {
18894
+ display: flex;
18895
+ align-items: center;
18896
+ border-radius: 8px;
18897
+ padding: 0 4px;
18898
+ }
18899
+ [data-codexhost-model-row]:hover,
18900
+ [data-codexhost-model-row]:focus-within {
18901
+ background: var(--color-token-list-hover-background, rgba(127, 127, 127, .07));
18902
+ }
18903
+ [data-codexhost-model-row] > button[data-model-id] {
18904
+ background: transparent;
18905
+ min-height: 36px;
18906
+ }
18907
+ [data-codexhost-model-row] > button[data-favorite-model-id] {
18908
+ display: inline-flex;
18909
+ align-items: center;
18910
+ justify-content: center;
18911
+ flex: none;
18912
+ width: 24px;
18913
+ height: 24px;
18914
+ padding: 4px;
18915
+ border: 0;
18916
+ border-radius: 999px;
18917
+ background: transparent;
18918
+ color: var(--color-token-border, #dcdce2);
18919
+ cursor: pointer;
18920
+ }
18921
+ [data-codexhost-model-row] > button[data-favorite-model-id]:hover {
18922
+ background: var(--color-token-list-hover-background, rgba(127, 127, 127, .09));
18923
+ color: var(--color-token-text-secondary, #85858f);
18924
+ }
18925
+ [data-codexhost-model-row] > button[data-favorite-model-id][aria-pressed="true"] {
18926
+ color: #f59e0b;
18927
+ }
18928
+ [data-codexhost-model-row] button:focus-visible {
18929
+ outline: 2px solid var(--color-token-text-secondary, #85858f);
18930
+ outline-offset: -2px;
18931
+ }
18932
+ [data-favorite-model-id] > svg {
18933
+ width: 16px;
18934
+ height: 16px;
18935
+ fill: none;
18936
+ stroke: currentColor;
18937
+ stroke-width: 2;
18938
+ stroke-linejoin: round;
18939
+ }
18940
+ [data-favorite-model-id][aria-pressed="true"] > svg {
18941
+ fill: currentColor;
18942
+ }
18943
+ `;
18944
+ (ownerDocument.head ?? ownerDocument.documentElement).append(style);
18945
+ }
18946
+ function createModelFavoriteIcon(ownerDocument) {
18947
+ return ownerDocument.adoptNode(
18948
+ createElement(Star, {
18949
+ width: 16,
18950
+ height: 16,
18951
+ "aria-hidden": "true",
18952
+ focusable: "false"
18953
+ })
18954
+ );
18955
+ }
18956
+
18646
18957
  // src/renderer-model-picker.ts
18647
18958
  var MENU_CLASSES = `fixed z-50 overflow-hidden ${PICKER_POPOVER_CLASS}`;
18648
18959
  var SEARCH_INPUT_CLASSES = "mb-1 w-full shrink-0 rounded-lg px-2 py-1.5 text-sm outline-none placeholder:text-token-text-tertiary disabled:cursor-not-allowed disabled:opacity-40";
@@ -18792,13 +19103,30 @@ ${error51.stderrTail}`] : []
18792
19103
  let visibleCount = 0;
18793
19104
  for (const option of control.options.values()) {
18794
19105
  const matches = query.length === 0 || option.searchText.includes(query);
18795
- option.button.hidden = !matches;
19106
+ option.row.hidden = !matches;
19107
+ option.row.style.display = matches ? "flex" : "none";
18796
19108
  if (matches) visibleCount += 1;
18797
19109
  }
18798
19110
  control.searchEmpty.hidden = query.length === 0 || visibleCount > 0;
18799
19111
  }
19112
+ function syncFavorite(option, favorite) {
19113
+ option.favorite.setAttribute("aria-pressed", String(favorite));
19114
+ const label = `${favorite ? "Unfavorite" : "Favorite"} ${option.label}`;
19115
+ option.favorite.setAttribute("aria-label", label);
19116
+ option.favorite.title = label;
19117
+ }
19118
+ function orderModelFavorites(control) {
19119
+ for (const favorite of [true, false]) {
19120
+ for (const [id, option] of control.options) {
19121
+ const isFavorite = control.favorites.has(id);
19122
+ syncFavorite(option, isFavorite);
19123
+ if (isFavorite === favorite) control.modelMenu.append(option.row);
19124
+ }
19125
+ }
19126
+ }
18800
19127
  function mountRendererModelPicker(composerId, onSelectModel, onSelectThinking) {
18801
19128
  ensureRendererTriggerChipStyle(document);
19129
+ ensureModelOptionStyle(document);
18802
19130
  const root = document.createElement("div");
18803
19131
  root.setAttribute("data-codexhost-model-control", composerId);
18804
19132
  root.className = "relative min-w-0";
@@ -18909,7 +19237,8 @@ ${error51.stderrTail}`] : []
18909
19237
  const movedToComposer = active === document.body || active instanceof Element && (active.matches('textarea, [contenteditable="true"], [role="textbox"]') || active.closest('textarea, [contenteditable="true"], [role="textbox"]') !== null);
18910
19238
  if (!movedToComposer) return;
18911
19239
  requestAnimationFrame(() => {
18912
- if (popoverOpen2(modelMenu) && searchInput.isConnected) searchInput.focus();
19240
+ if (popoverOpen2(modelMenu) && searchInput.isConnected && !modelMenu.contains(document.activeElement))
19241
+ searchInput.focus();
18913
19242
  });
18914
19243
  };
18915
19244
  searchInput.addEventListener("blur", onSearchBlur);
@@ -18928,6 +19257,9 @@ ${error51.stderrTail}`] : []
18928
19257
  };
18929
19258
  const openModelMenu = (standalone = false) => {
18930
19259
  if (!standalone && !popoverOpen2(menu) || popoverOpen2(modelMenu)) return;
19260
+ control.favorites = readModelFavorites(control.harnessId);
19261
+ orderModelFavorites(control);
19262
+ modelMenu.scrollTop = 0;
18931
19263
  modelMenu.showPopover();
18932
19264
  positionModelMenu(control, standalone);
18933
19265
  modelButton.setAttribute("aria-expanded", "true");
@@ -18971,6 +19303,22 @@ ${error51.stderrTail}`] : []
18971
19303
  }
18972
19304
  };
18973
19305
  const onModelMenuClick = (event) => {
19306
+ const favoriteButton = event.target instanceof Element ? event.target.closest("button[data-favorite-model-id]") : null;
19307
+ const favoriteId = favoriteButton?.dataset.favoriteModelId;
19308
+ if (favoriteId) {
19309
+ event.stopPropagation();
19310
+ control.favorites = readModelFavorites(control.harnessId);
19311
+ if (control.favorites.has(favoriteId)) control.favorites.delete(favoriteId);
19312
+ else control.favorites.add(favoriteId);
19313
+ writeModelFavorites(control.harnessId, control.favorites);
19314
+ const focused = document.activeElement;
19315
+ orderModelFavorites(control);
19316
+ if (focused instanceof HTMLElement && modelMenu.contains(focused)) {
19317
+ focused.focus({ preventScroll: true });
19318
+ }
19319
+ modelMenu.scrollTop = 0;
19320
+ return;
19321
+ }
18974
19322
  const target = event.target instanceof Element ? event.target.closest("button[data-model-id]") : null;
18975
19323
  if (!target?.dataset.modelId) return;
18976
19324
  close();
@@ -19022,6 +19370,8 @@ ${error51.stderrTail}`] : []
19022
19370
  searchInput,
19023
19371
  searchHeader,
19024
19372
  searchEmpty,
19373
+ harnessId: "",
19374
+ favorites: /* @__PURE__ */ new Set(),
19025
19375
  options,
19026
19376
  thinkingOptions,
19027
19377
  close,
@@ -19103,17 +19453,37 @@ ${error51.stderrTail}`] : []
19103
19453
  text.title = model.label;
19104
19454
  const check2 = createCheck();
19105
19455
  button.append(text, check2);
19456
+ const row = document.createElement("div");
19457
+ row.setAttribute("role", "presentation");
19458
+ row.dataset.codexhostModelRow = "true";
19459
+ button.style.minWidth = "0";
19460
+ button.style.flex = "1";
19461
+ const favorite = document.createElement("button");
19462
+ favorite.type = "button";
19463
+ favorite.dataset.favoriteModelId = model.ref.id;
19464
+ favorite.append(createModelFavoriteIcon(document));
19465
+ row.append(button, favorite);
19106
19466
  control.options.set(model.ref.id, {
19467
+ row,
19468
+ favorite,
19469
+ label: model.label,
19107
19470
  button,
19108
19471
  check: check2,
19109
19472
  searchText: `${model.label} ${model.ref.id}`.toLowerCase()
19110
19473
  });
19111
- control.modelMenu.append(button);
19474
+ control.modelMenu.append(row);
19112
19475
  }
19476
+ orderModelFavorites(control);
19113
19477
  applyModelSearchFilter(control);
19114
19478
  if (popoverOpen2(control.modelMenu)) control.searchInput.focus();
19115
19479
  }
19116
- function renderRendererModelPicker(control, view, visible) {
19480
+ function renderRendererModelPicker(control, view, visible, harnessId = "") {
19481
+ if (control.harnessId !== harnessId) {
19482
+ control.close();
19483
+ control.harnessId = harnessId;
19484
+ control.favorites = readModelFavorites(harnessId);
19485
+ delete control.root.dataset.catalogSignature;
19486
+ }
19117
19487
  control.root.style.display = visible ? "inline-flex" : "none";
19118
19488
  control.root.style.alignItems = "center";
19119
19489
  control.root.style.alignSelf = "center";
@@ -21211,7 +21581,7 @@ ${error51.stderrTail}`] : []
21211
21581
  setNativeControlHidden(control.nativeContextUsageControl, false);
21212
21582
  setNativeControlHidden(control.nativePermissionModeControl, hidePermissionMode);
21213
21583
  }
21214
- function mountComposerAgentControl(composer, composerId, sendButton, enabledAgents, onSelect, onDownload, onOpenProviderPicker, onSelectModel, onSelectThinking, onSelectPermissionMode, onSelectCommand) {
21584
+ function mountComposerAgentControl(composer, composerId, sendButton, enabledAgents, onSelect, onOpenProviderPicker, onSelectModel, onSelectThinking, onSelectPermissionMode, onSelectCommand) {
21215
21585
  const nativeModelControl = captureNativeControl(nativeModelControlForComposer(composer));
21216
21586
  const nativeContextUsageControl = captureNativeControl(
21217
21587
  nativeContextUsageControlForComposer(composer)
@@ -21223,7 +21593,6 @@ ${error51.stderrTail}`] : []
21223
21593
  composerId,
21224
21594
  enabledAgents,
21225
21595
  onSelect,
21226
- onDownload,
21227
21596
  onOpenProviderPicker
21228
21597
  );
21229
21598
  const modelPicker = mountRendererModelPicker(composerId, onSelectModel, onSelectThinking);
@@ -21303,7 +21672,7 @@ ${error51.stderrTail}`] : []
21303
21672
  pickerView.nativeModelHidden,
21304
21673
  switching || state.agent !== "codex"
21305
21674
  );
21306
- renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex");
21675
+ renderRendererModelPicker(control.modelPicker, modelView, state.agent !== "codex", state.agent);
21307
21676
  const permissionModeVisible = state.agent !== "codex" && permissionModeView.status !== "idle" && permissionModeView.status !== "loading" && permissionModeView.status !== "unsupported" && control.nativePermissionModeControlVerified;
21308
21677
  renderRendererPermissionModePicker(
21309
21678
  control.permissionModePicker,
@@ -21540,6 +21909,98 @@ ${error51.stderrTail}`] : []
21540
21909
  };
21541
21910
  }
21542
21911
 
21912
+ // src/renderer-idle-release-preference.ts
21913
+ var IDLE_RELEASE_STORAGE_KEY = "codexhost.idle-release.v1";
21914
+ var IDLE_RELEASE_CHANGE_EVENT = "codexhost:idle-release-changed";
21915
+ var IDLE_RELEASE_STATUS_EVENT = "codexhost:idle-release-status";
21916
+ function readIdleReleasePreference(owner) {
21917
+ try {
21918
+ const raw = owner.localStorage.getItem(IDLE_RELEASE_STORAGE_KEY);
21919
+ const parsed = idleReleaseSettingsSchema.safeParse(raw ? JSON.parse(raw) : null);
21920
+ if (parsed.success) return parsed.data;
21921
+ } catch {
21922
+ }
21923
+ return { ...DEFAULT_IDLE_RELEASE_SETTINGS };
21924
+ }
21925
+ function writeIdleReleasePreference(owner, value) {
21926
+ const parsed = idleReleaseSettingsSchema.safeParse(value);
21927
+ if (!parsed.success) return false;
21928
+ try {
21929
+ owner.localStorage.setItem(IDLE_RELEASE_STORAGE_KEY, JSON.stringify(parsed.data));
21930
+ } catch {
21931
+ return false;
21932
+ }
21933
+ owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
21934
+ return true;
21935
+ }
21936
+ function installIdleReleasePreferenceSync(owner) {
21937
+ let client = null;
21938
+ let disposed = false;
21939
+ let generation = 0;
21940
+ let work = { pending: false, dirty: false };
21941
+ const publish = (value) => {
21942
+ owner.dispatchEvent(new CustomEvent(IDLE_RELEASE_STATUS_EVENT, { detail: value }));
21943
+ };
21944
+ const sync = async () => {
21945
+ const currentWork = work;
21946
+ const version2 = generation;
21947
+ currentWork.dirty = true;
21948
+ if (currentWork.pending || disposed) return;
21949
+ currentWork.pending = true;
21950
+ try {
21951
+ while (currentWork.dirty && !disposed && version2 === generation) {
21952
+ currentWork.dirty = false;
21953
+ const target = client;
21954
+ if (!target) {
21955
+ publish("pending");
21956
+ continue;
21957
+ }
21958
+ if (!target.setIdleReleaseSettings) {
21959
+ publish("unavailable");
21960
+ continue;
21961
+ }
21962
+ const settings = readIdleReleasePreference(owner);
21963
+ publish("pending");
21964
+ try {
21965
+ await target.setIdleReleaseSettings(settings);
21966
+ if (!disposed && version2 === generation && !currentWork.dirty) publish("applied");
21967
+ } catch (error51) {
21968
+ if (!disposed && version2 === generation) {
21969
+ publish(error51 instanceof RendererMethodUnavailableError ? "unavailable" : "failed");
21970
+ }
21971
+ }
21972
+ }
21973
+ } finally {
21974
+ currentWork.pending = false;
21975
+ }
21976
+ };
21977
+ const changed = () => {
21978
+ void sync();
21979
+ };
21980
+ const storage = (event) => {
21981
+ if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) changed();
21982
+ };
21983
+ owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
21984
+ owner.addEventListener("storage", storage);
21985
+ return {
21986
+ connect(next) {
21987
+ if (disposed) return;
21988
+ if (next === client) return;
21989
+ client = next;
21990
+ generation += 1;
21991
+ work = { pending: false, dirty: false };
21992
+ void sync();
21993
+ },
21994
+ dispose() {
21995
+ disposed = true;
21996
+ generation += 1;
21997
+ client = null;
21998
+ owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, changed);
21999
+ owner.removeEventListener("storage", storage);
22000
+ }
22001
+ };
22002
+ }
22003
+
21543
22004
  // src/renderer-sidebar-agent-icons.ts
21544
22005
  var SIDEBAR_THREAD_ROW_ATTRIBUTE = "data-app-action-sidebar-thread-row";
21545
22006
  var SIDEBAR_THREAD_ROW_SELECTOR = `[${SIDEBAR_THREAD_ROW_ATTRIBUTE}]`;
@@ -22567,6 +23028,15 @@ ${error51.stderrTail}`] : []
22567
23028
  return harnessConfigurationStateSchema.parse(result);
22568
23029
  };
22569
23030
  return Object.freeze({
23031
+ async listLoadedSessions() {
23032
+ return loadedSessionsSchema.parse(await manager.sendRequest(LOADED_SESSIONS_METHOD, {}));
23033
+ },
23034
+ async setIdleReleaseSettings(settings) {
23035
+ const params = idleReleaseSettingsSchema.parse(settings);
23036
+ return idleReleaseSettingsSchema.parse(
23037
+ await manager.sendRequest(IDLE_RELEASE_SETTINGS_METHOD, params)
23038
+ );
23039
+ },
22570
23040
  ...createRendererSessionImportClient(
22571
23041
  async (method, params) => manager.sendRequest(method, params)
22572
23042
  ),
@@ -23248,6 +23718,7 @@ ${error51.stderrTail}`] : []
23248
23718
  });
23249
23719
  };
23250
23720
  const usageSubscription = createThreadUsageSubscriptionRelay();
23721
+ const idleReleaseSync = installIdleReleasePreferenceSync(window);
23251
23722
  const requestRouteResolver = createRendererRequestRouteResolver(
23252
23723
  () => window.__codexhostDraftPrewarmPolicyV1,
23253
23724
  () => findActivePrewarmTargets(document)
@@ -23258,7 +23729,7 @@ ${error51.stderrTail}`] : []
23258
23729
  const target = targets[0];
23259
23730
  if (targets.length !== 1 || !target) return null;
23260
23731
  const cached2 = clientsByTarget.get(target);
23261
- if (cached2?.policy === policy && cached2.requestClient === target.requestClient)
23732
+ if (cached2 && (policy === null || cached2.policy === policy) && cached2.requestClient === target.requestClient)
23262
23733
  return cached2.client;
23263
23734
  const client = createRendererModelClient([target]);
23264
23735
  if (client) {
@@ -23278,6 +23749,10 @@ ${error51.stderrTail}`] : []
23278
23749
  const policy = route?.policy ?? null;
23279
23750
  const client = route ? modelClientForTargets(route.targets, route.policy) : null;
23280
23751
  usageSubscription.connect(client);
23752
+ const localClient = policy?.hostId === "local" ? client : modelClientForTargets(
23753
+ rendererRequestTargetsForHost(findActivePrewarmTargets(document), "local") ?? []
23754
+ );
23755
+ idleReleaseSync.connect(localClient);
23281
23756
  if (activeRoutePolicy === policy && activeRouteClient === client) return client;
23282
23757
  activeRoutePolicy = policy;
23283
23758
  activeRouteClient = client;
@@ -23492,7 +23967,8 @@ ${error51.stderrTail}`] : []
23492
23967
  () => syncActiveRoute(null),
23493
23968
  () => forkControl.dispose(),
23494
23969
  ...turnControlCleanups,
23495
- () => usageSubscription.dispose()
23970
+ () => usageSubscription.dispose(),
23971
+ () => idleReleaseSync.dispose()
23496
23972
  ];
23497
23973
  for (const cleanup of cleanups) {
23498
23974
  try {
@@ -24158,14 +24634,14 @@ ${error51.stderrTail}`] : []
24158
24634
 
24159
24635
  // src/renderer-permission-mode-preference.ts
24160
24636
  var CLAUDE_PERMISSION_MODE_PREFERENCE_KEY = "codexhost.claude-code.permission-mode.v1";
24161
- function rendererStorage() {
24637
+ function rendererStorage2() {
24162
24638
  try {
24163
24639
  return window.localStorage;
24164
24640
  } catch {
24165
24641
  return null;
24166
24642
  }
24167
24643
  }
24168
- function readClaudePermissionModePreference(catalog, storage = rendererStorage()) {
24644
+ function readClaudePermissionModePreference(catalog, storage = rendererStorage2()) {
24169
24645
  if (!storage) return void 0;
24170
24646
  try {
24171
24647
  const parsed = harnessPermissionModeIdSchema.safeParse(
@@ -24176,7 +24652,7 @@ ${error51.stderrTail}`] : []
24176
24652
  return void 0;
24177
24653
  }
24178
24654
  }
24179
- function writeClaudePermissionModePreference(permissionModeId, storage = rendererStorage()) {
24655
+ function writeClaudePermissionModePreference(permissionModeId, storage = rendererStorage2()) {
24180
24656
  if (!storage) return;
24181
24657
  try {
24182
24658
  storage.setItem(CLAUDE_PERMISSION_MODE_PREFERENCE_KEY, permissionModeId);
@@ -24186,7 +24662,7 @@ ${error51.stderrTail}`] : []
24186
24662
 
24187
24663
  // src/renderer-new-thread-preference.ts
24188
24664
  var RENDERER_NEW_THREAD_PREFERENCE_KEY = "codexhost.new-thread-preference.v1";
24189
- function rendererStorage2() {
24665
+ function rendererStorage3() {
24190
24666
  try {
24191
24667
  return window.localStorage;
24192
24668
  } catch {
@@ -24241,11 +24717,11 @@ ${error51.stderrTail}`] : []
24241
24717
  } catch {
24242
24718
  }
24243
24719
  }
24244
- function readNewThreadAgentPreference(enabledAgents, storage = rendererStorage2()) {
24720
+ function readNewThreadAgentPreference(enabledAgents, storage = rendererStorage3()) {
24245
24721
  const agent = readPreference(storage)?.lastAgent;
24246
24722
  return agent && enabledAgents.has(agent) ? agent : void 0;
24247
24723
  }
24248
- function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage = rendererStorage2()) {
24724
+ function readNewThreadExternalConfigurationPreference(agent, catalog, permissionModes, storage = rendererStorage3()) {
24249
24725
  const preference = readPreference(storage)?.externalByAgent[agent];
24250
24726
  if (!preference) return void 0;
24251
24727
  const catalogModel = catalog.models.find(({ ref }) => ref.id === preference.model.id);
@@ -24258,7 +24734,7 @@ ${error51.stderrTail}`] : []
24258
24734
  ...permissionModeId ? { permissionModeId } : {}
24259
24735
  };
24260
24736
  }
24261
- function writeNewThreadAgentPreference(agent, storage = rendererStorage2()) {
24737
+ function writeNewThreadAgentPreference(agent, storage = rendererStorage3()) {
24262
24738
  const current = readPreference(storage);
24263
24739
  writePreference(
24264
24740
  {
@@ -24269,7 +24745,7 @@ ${error51.stderrTail}`] : []
24269
24745
  storage
24270
24746
  );
24271
24747
  }
24272
- function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage = rendererStorage2()) {
24748
+ function writeNewThreadExternalConfigurationPreference(agent, model, thinkingOptionId, permissionModeId, storage = rendererStorage3()) {
24273
24749
  const current = readPreference(storage);
24274
24750
  writePreference(
24275
24751
  {
@@ -24956,10 +25432,10 @@ ${error51.stderrTail}`] : []
24956
25432
  );
24957
25433
  const actionArea = document2.createElement("div");
24958
25434
  actionArea.className = "settings-session-import-row__action";
24959
- if (candidate.running !== false) {
25435
+ if (candidate.running === true) {
24960
25436
  const running = document2.createElement("span");
24961
25437
  running.className = "settings-session-import-running";
24962
- running.textContent = candidate.running === null ? messages.sessionImportRunningUnknown : messages.sessionImportRunning;
25438
+ running.textContent = messages.sessionImportRunning;
24963
25439
  running.title = messages.sessionImportRunningHint;
24964
25440
  running.setAttribute("aria-hidden", "true");
24965
25441
  actionArea.append(
@@ -25229,8 +25705,319 @@ ${error51.stderrTail}`] : []
25229
25705
  });
25230
25706
  }
25231
25707
 
25708
+ // src/settings/loaded-sessions-table.ts
25709
+ function mountLoadedSessionsTable(context, messages, getClient) {
25710
+ const document2 = context.content.ownerDocument;
25711
+ const owner = document2.defaultView;
25712
+ if (!owner) return () => void 0;
25713
+ const text = messages.loadedSessions;
25714
+ const container = document2.createElement("div");
25715
+ container.className = "border-t border-settings-border";
25716
+ const header = document2.createElement("div");
25717
+ header.className = "px-4 pt-4";
25718
+ const title = document2.createElement("p");
25719
+ title.className = "m-0 text-sm font-medium";
25720
+ title.textContent = text.title;
25721
+ const description = document2.createElement("p");
25722
+ description.className = "text-xs text-settings-muted";
25723
+ description.textContent = text.description;
25724
+ const status = document2.createElement("p");
25725
+ status.className = "p-4 text-sm text-settings-muted";
25726
+ status.setAttribute("role", "status");
25727
+ status.textContent = text.loading;
25728
+ const scroll = document2.createElement("div");
25729
+ scroll.className = "overflow-x-auto";
25730
+ const table = document2.createElement("table");
25731
+ table.className = "w-full text-left text-sm";
25732
+ table.setAttribute("aria-label", text.title);
25733
+ const head = table.createTHead().insertRow();
25734
+ for (const label of text.columns) {
25735
+ const cell = document2.createElement("th");
25736
+ cell.scope = "col";
25737
+ cell.className = "px-4 py-3 font-medium text-settings-muted";
25738
+ cell.textContent = label;
25739
+ head.append(cell);
25740
+ }
25741
+ const body = table.createTBody();
25742
+ scroll.append(table);
25743
+ scroll.hidden = true;
25744
+ header.append(title, description);
25745
+ container.append(header, status, scroll);
25746
+ context.content.append(container);
25747
+ let disposed = false;
25748
+ let timer;
25749
+ let requestTimer;
25750
+ const refresh = async () => {
25751
+ try {
25752
+ const client = getClient();
25753
+ if (!client?.listLoadedSessions) {
25754
+ status.textContent = text.unavailable;
25755
+ status.hidden = false;
25756
+ scroll.hidden = true;
25757
+ return;
25758
+ }
25759
+ const rows = await Promise.race([
25760
+ client.listLoadedSessions(),
25761
+ new Promise((_, reject) => {
25762
+ requestTimer = owner.setTimeout(
25763
+ () => reject(new Error("Session status timed out")),
25764
+ 1e4
25765
+ );
25766
+ })
25767
+ ]);
25768
+ if (disposed || context.signal.aborted) return;
25769
+ body.replaceChildren();
25770
+ for (const row of rows.toSorted(
25771
+ (a, b) => b.inactiveMs - a.inactiveMs || a.harnessId.localeCompare(b.harnessId) || a.threadId.localeCompare(b.threadId)
25772
+ )) {
25773
+ const tr = body.insertRow();
25774
+ const values = [
25775
+ row.title,
25776
+ row.harnessId,
25777
+ text.states[row.state],
25778
+ text.minutes.replace("{minutes}", String(Math.floor(row.inactiveMs / 6e4))),
25779
+ text.reasons[row.reason]
25780
+ ];
25781
+ for (const value of values) {
25782
+ const cell = tr.insertCell();
25783
+ cell.className = "max-w-64 break-words px-4 py-3 align-top";
25784
+ cell.textContent = value;
25785
+ }
25786
+ tr.title = row.threadId;
25787
+ }
25788
+ status.textContent = rows.length ? "" : text.empty;
25789
+ status.hidden = rows.length > 0;
25790
+ scroll.hidden = rows.length === 0;
25791
+ } catch (error51) {
25792
+ if (disposed || context.signal.aborted) return;
25793
+ status.textContent = error51 instanceof RendererMethodUnavailableError ? text.unavailable : text.failed;
25794
+ status.hidden = false;
25795
+ scroll.hidden = true;
25796
+ } finally {
25797
+ owner.clearTimeout(requestTimer);
25798
+ if (!disposed && !context.signal.aborted)
25799
+ timer = owner.setTimeout(() => void refresh(), 1e4);
25800
+ }
25801
+ };
25802
+ void refresh();
25803
+ return () => {
25804
+ disposed = true;
25805
+ owner.clearTimeout(timer);
25806
+ owner.clearTimeout(requestTimer);
25807
+ };
25808
+ }
25809
+
25810
+ // src/settings/preference-ui.ts
25811
+ var nextPreferenceId = 0;
25812
+ function preferenceId(prefix) {
25813
+ nextPreferenceId += 1;
25814
+ return `codexhost-${prefix}-${nextPreferenceId}`;
25815
+ }
25816
+ function createPreferenceGroup(document2, title) {
25817
+ const group = document2.createElement("section");
25818
+ group.className = "mt-7 first-of-type:mt-0";
25819
+ const header = document2.createElement("div");
25820
+ header.className = "mb-2 flex min-h-6 items-center gap-2 px-1";
25821
+ const heading = document2.createElement("h3");
25822
+ heading.id = preferenceId("preference-group");
25823
+ heading.className = "m-0 text-[13px] leading-5 font-semibold text-settings-text";
25824
+ heading.textContent = title;
25825
+ header.append(heading);
25826
+ const card = document2.createElement("div");
25827
+ card.className = "rounded-[10px] border border-settings-border bg-settings-panel";
25828
+ group.setAttribute("aria-labelledby", heading.id);
25829
+ group.append(header, card);
25830
+ return { group, header, card };
25831
+ }
25832
+ function createPreferenceItem(document2, input) {
25833
+ const item = document2.createElement("div");
25834
+ 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";
25835
+ const copy = document2.createElement("div");
25836
+ copy.className = "flex min-w-0 flex-col gap-0.5";
25837
+ const heading = document2.createElement("div");
25838
+ heading.className = "flex items-center gap-1.5";
25839
+ const title = document2.createElement("label");
25840
+ title.htmlFor = input.controlId;
25841
+ title.className = "cursor-pointer text-[13px] leading-5 font-medium text-settings-text";
25842
+ title.textContent = input.title;
25843
+ heading.append(title);
25844
+ if (input.help) heading.append(createHelpTooltip(document2, input.help.label, input.help.lines));
25845
+ const description = document2.createElement("div");
25846
+ description.id = preferenceId("preference-description");
25847
+ description.className = "text-xs leading-[18px] text-settings-muted data-[invalid=true]:text-settings-danger";
25848
+ description.textContent = input.description;
25849
+ copy.append(heading, description);
25850
+ item.append(copy);
25851
+ return { item, description };
25852
+ }
25853
+ function createHelpTooltip(document2, label, lines) {
25854
+ const wrapper = document2.createElement("span");
25855
+ wrapper.className = "group relative inline-flex";
25856
+ const button = document2.createElement("button");
25857
+ button.type = "button";
25858
+ 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";
25859
+ button.setAttribute("aria-label", label);
25860
+ button.append(createRendererSettingsIcon("help", 14));
25861
+ const tooltip = document2.createElement("div");
25862
+ tooltip.id = preferenceId("preference-tooltip");
25863
+ tooltip.setAttribute("role", "tooltip");
25864
+ 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";
25865
+ const list = document2.createElement("ul");
25866
+ list.className = "m-0 grid list-disc gap-1 pl-4 marker:text-settings-subtle";
25867
+ for (const line of lines) {
25868
+ const item = document2.createElement("li");
25869
+ item.textContent = line;
25870
+ list.append(item);
25871
+ }
25872
+ tooltip.append(list);
25873
+ button.setAttribute("aria-describedby", tooltip.id);
25874
+ button.addEventListener("keydown", (event) => {
25875
+ if (event.key === "Escape") button.blur();
25876
+ });
25877
+ wrapper.append(button, tooltip);
25878
+ return wrapper;
25879
+ }
25880
+ function createPreferenceSwitch(document2, id, describedBy) {
25881
+ const input = document2.createElement("input");
25882
+ input.type = "checkbox";
25883
+ input.id = id;
25884
+ input.setAttribute("role", "switch");
25885
+ input.setAttribute("aria-describedby", describedBy);
25886
+ 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";
25887
+ return input;
25888
+ }
25889
+ function createNumberField(document2, input) {
25890
+ const field = document2.createElement("div");
25891
+ 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";
25892
+ const control = document2.createElement("input");
25893
+ control.type = "number";
25894
+ control.id = input.id;
25895
+ control.min = String(input.min);
25896
+ control.max = String(input.max);
25897
+ control.step = "1";
25898
+ control.setAttribute("aria-describedby", input.describedBy);
25899
+ control.className = "w-14 border-0 bg-transparent p-0 text-right text-[13px] leading-5 text-settings-text tabular-nums outline-none";
25900
+ const unit = document2.createElement("span");
25901
+ unit.className = "text-xs text-settings-muted";
25902
+ unit.setAttribute("aria-hidden", "true");
25903
+ unit.textContent = input.unit;
25904
+ field.append(control, unit);
25905
+ return { field, control };
25906
+ }
25907
+
25908
+ // src/settings/idle-release-controls.ts
25909
+ function mountIdleReleaseControls(context, messages, getLoadedSessionsClient) {
25910
+ const { content } = context;
25911
+ const document2 = content.ownerDocument;
25912
+ const owner = document2.defaultView;
25913
+ if (!owner) return () => void 0;
25914
+ const { group, header, card } = createPreferenceGroup(document2, messages.idleReleaseSection);
25915
+ const status = document2.createElement("div");
25916
+ 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";
25917
+ const statusDot = document2.createElement("span");
25918
+ statusDot.setAttribute("aria-hidden", "true");
25919
+ 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";
25920
+ const statusText = document2.createElement("span");
25921
+ statusText.setAttribute("role", "status");
25922
+ status.append(statusDot, statusText);
25923
+ header.append(status);
25924
+ const enabledId = preferenceId("idle-release-enabled");
25925
+ const toggle = createPreferenceItem(document2, {
25926
+ title: messages.idleReleaseTitle,
25927
+ description: messages.idleReleaseDescription,
25928
+ controlId: enabledId,
25929
+ help: { label: messages.idleReleaseHelpLabel, lines: messages.idleReleaseHelp }
25930
+ });
25931
+ const enabled = createPreferenceSwitch(document2, enabledId, toggle.description.id);
25932
+ toggle.item.append(enabled);
25933
+ const minutesId = preferenceId("idle-release-minutes");
25934
+ const timeout = createPreferenceItem(document2, {
25935
+ title: messages.idleReleaseTimeout,
25936
+ description: messages.idleReleaseTimeoutDescription,
25937
+ controlId: minutesId
25938
+ });
25939
+ const { field, control: minutes } = createNumberField(document2, {
25940
+ id: minutesId,
25941
+ describedBy: timeout.description.id,
25942
+ unit: messages.idleReleaseMinutes,
25943
+ min: IDLE_RELEASE_TIMEOUT_MINUTES_MIN,
25944
+ max: IDLE_RELEASE_TIMEOUT_MINUTES_MAX
25945
+ });
25946
+ timeout.item.append(field);
25947
+ timeout.item.id = preferenceId("idle-release-timeout");
25948
+ enabled.setAttribute("aria-controls", timeout.item.id);
25949
+ card.append(toggle.item, timeout.item);
25950
+ content.append(group);
25951
+ const disposeTable = mountLoadedSessionsTable(
25952
+ { ...context, content: card },
25953
+ messages,
25954
+ getLoadedSessionsClient
25955
+ );
25956
+ const statusMessages = {
25957
+ pending: messages.idleReleasePending,
25958
+ unavailable: messages.idleReleaseUnavailable,
25959
+ failed: messages.idleReleaseFailed
25960
+ };
25961
+ const showStatus = (value) => {
25962
+ status.dataset.state = value;
25963
+ status.hidden = value === "applied";
25964
+ statusText.textContent = value === "applied" ? "" : statusMessages[value];
25965
+ };
25966
+ const setInvalid = (invalid) => {
25967
+ field.dataset.invalid = String(invalid);
25968
+ timeout.description.dataset.invalid = String(invalid);
25969
+ timeout.description.textContent = invalid ? messages.idleReleaseInvalid : messages.idleReleaseTimeoutDescription;
25970
+ minutes.setAttribute("aria-invalid", String(invalid));
25971
+ minutes.setCustomValidity(invalid ? messages.idleReleaseInvalid : "");
25972
+ };
25973
+ const sync = () => {
25974
+ const settings = readIdleReleasePreference(owner);
25975
+ enabled.checked = settings.enabled;
25976
+ timeout.item.hidden = !settings.enabled;
25977
+ if (!settings.enabled && minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
25978
+ if (minutes.getAttribute("aria-invalid") !== "true") {
25979
+ minutes.value = String(settings.timeoutMinutes);
25980
+ }
25981
+ };
25982
+ const save = (settings) => {
25983
+ if (writeIdleReleasePreference(owner, settings)) return;
25984
+ sync();
25985
+ showStatus("failed");
25986
+ };
25987
+ enabled.addEventListener("change", () => {
25988
+ save({ ...readIdleReleasePreference(owner), enabled: enabled.checked });
25989
+ });
25990
+ minutes.addEventListener("change", () => {
25991
+ const parsed = idleReleaseSettingsSchema.safeParse({
25992
+ enabled: readIdleReleasePreference(owner).enabled,
25993
+ timeoutMinutes: minutes.valueAsNumber
25994
+ });
25995
+ setInvalid(!parsed.success);
25996
+ if (parsed.success) save(parsed.data);
25997
+ });
25998
+ minutes.addEventListener("input", () => {
25999
+ if (minutes.getAttribute("aria-invalid") === "true") setInvalid(false);
26000
+ });
26001
+ const storage = (event) => {
26002
+ if (event.key === IDLE_RELEASE_STORAGE_KEY || event.key === null) sync();
26003
+ };
26004
+ const onStatus = (event) => showStatus(event.detail);
26005
+ owner.addEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
26006
+ owner.addEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
26007
+ owner.addEventListener("storage", storage);
26008
+ sync();
26009
+ showStatus("pending");
26010
+ owner.dispatchEvent(new Event(IDLE_RELEASE_CHANGE_EVENT));
26011
+ return () => {
26012
+ disposeTable();
26013
+ owner.removeEventListener(IDLE_RELEASE_CHANGE_EVENT, sync);
26014
+ owner.removeEventListener(IDLE_RELEASE_STATUS_EVENT, onStatus);
26015
+ owner.removeEventListener("storage", storage);
26016
+ };
26017
+ }
26018
+
25232
26019
  // src/settings/appearance-page.ts
25233
- function createAppearanceSettingsPage(messages) {
26020
+ function createAppearanceSettingsPage(messages, getLoadedSessionsClient = () => null) {
25234
26021
  return Object.freeze({
25235
26022
  id: "appearance",
25236
26023
  label: messages.pageLabels.appearance,
@@ -25245,30 +26032,34 @@ ${error51.stderrTail}`] : []
25245
26032
  const description = document2.createElement("p");
25246
26033
  description.className = "settings-page-description";
25247
26034
  description.textContent = messages.appearanceDescription;
25248
- const row = document2.createElement("label");
25249
- row.className = "settings-preference-row";
25250
- const copy = document2.createElement("span");
25251
- copy.className = "settings-preference-row__copy";
25252
- const title = document2.createElement("strong");
25253
- title.textContent = messages.reasoningSoftWrapTitle;
25254
- const detail = document2.createElement("span");
25255
- detail.textContent = messages.reasoningSoftWrapDescription;
25256
- copy.append(title, detail);
25257
- const checkbox = document2.createElement("input");
25258
- checkbox.type = "checkbox";
25259
- checkbox.className = "settings-preference-checkbox";
25260
- checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
25261
- checkbox.setAttribute("aria-label", messages.reasoningSoftWrapTitle);
25262
- checkbox.addEventListener("change", () => {
25263
- setReasoningTranscriptSoftWrap(ownerWindow, checkbox.checked);
26035
+ const { group, card } = createPreferenceGroup(document2, messages.appearanceGroup);
26036
+ const softWrapId = preferenceId("reasoning-soft-wrap");
26037
+ const row = createPreferenceItem(document2, {
26038
+ title: messages.reasoningSoftWrapTitle,
26039
+ description: messages.reasoningSoftWrapDescription,
26040
+ controlId: softWrapId
26041
+ });
26042
+ const toggle = createPreferenceSwitch(document2, softWrapId, row.description.id);
26043
+ toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
26044
+ toggle.addEventListener("change", () => {
26045
+ setReasoningTranscriptSoftWrap(ownerWindow, toggle.checked);
25264
26046
  });
25265
26047
  const sync = () => {
25266
- checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
26048
+ toggle.checked = readReasoningTranscriptSoftWrap(ownerWindow);
25267
26049
  };
25268
26050
  ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
25269
- row.append(copy, checkbox);
25270
- context.content.append(heading, description, row);
25271
- return () => ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
26051
+ row.item.append(toggle);
26052
+ card.append(row.item);
26053
+ context.content.append(heading, description, group);
26054
+ const disposeIdleRelease = mountIdleReleaseControls(
26055
+ context,
26056
+ messages,
26057
+ getLoadedSessionsClient
26058
+ );
26059
+ return () => {
26060
+ ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
26061
+ disposeIdleRelease();
26062
+ };
25272
26063
  }
25273
26064
  });
25274
26065
  }
@@ -27057,12 +27848,12 @@ ${error51.stderrTail}`] : []
27057
27848
  }
27058
27849
  });
27059
27850
  }
27060
- 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"))) {
27851
+ 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) {
27061
27852
  return Object.freeze([
27062
27853
  createConnectionsSettingsPage(messages, getDiagnostics),
27063
27854
  createAccountsSettingsPage(messages, getAccountClient),
27064
27855
  createSessionImportSettingsPage(messages, getSessionImportClient, openImportedThread),
27065
- createAppearanceSettingsPage(messages),
27856
+ createAppearanceSettingsPage(messages, getLoadedSessionsClient),
27066
27857
  createPluginsSettingsPage(messages, getDiagnostics),
27067
27858
  updatesPage(messages, getUpdateClient),
27068
27859
  aboutPage(messages)
@@ -27082,70 +27873,2398 @@ ${error51.stderrTail}`] : []
27082
27873
  }
27083
27874
 
27084
27875
  // src/settings/shell.css
27085
- var shell_default = ':host {\n /* Inherit Codex Desktop color-scheme; light-dark() tracks the host page. */\n --settings-bg: light-dark(#ffffff, #181818);\n --settings-sidebar: light-dark(#f4f4f5, #1c1c1c);\n --settings-panel: transparent;\n --settings-text: light-dark(#171717, #f5f5f5);\n --settings-muted: light-dark(#737373, #a1a1a1);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-divider: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));\n --settings-hover: light-dark(rgb(15 23 42 / 5%), rgb(255 255 255 / 6%));\n --settings-active: light-dark(rgb(51 156 255 / 14%), rgb(51 156 255 / 12%));\n --settings-focus: #339cff;\n --settings-elevated: light-dark(#ffffff, #2c2c2e);\n --settings-inset: light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 18%));\n --settings-surface: light-dark(rgb(15 23 42 / 3%), rgb(255 255 255 / 2%));\n --settings-surface-strong: light-dark(rgb(15 23 42 / 6%), rgb(255 255 255 / 6%));\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-mark: light-dark(#52525b, #d4d8de);\n --settings-dialog-shadow: light-dark(\n 0 24px 64px rgb(15 23 42 / 16%),\n 0 24px 64px rgb(0 0 0 / 38%)\n );\n --settings-backdrop: light-dark(rgb(15 23 42 / 28%), rgb(0 0 0 / 52%));\n --settings-segmented-shadow:\n 0 0 0 0.5px light-dark(rgb(15 23 42 / 6%), rgb(0 0 0 / 4%)),\n 0 3px 1px 0 light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 4%)),\n 0 3px 8px 0 light-dark(rgb(15 23 42 / 10%), rgb(0 0 0 / 12%));\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 --settings-dialog-max-width: 1120px;\n --settings-dialog-max-height: 780px;\n --settings-dialog-inset: max(52px, env(titlebar-area-height, 0px));\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.codexhost-settings-dialog {\n width: min(var(--settings-dialog-max-width), calc(100vw - 2 * var(--settings-dialog-inset)));\n height: min(var(--settings-dialog-max-height), calc(100vh - 2 * var(--settings-dialog-inset)));\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: 12px;\n box-shadow: var(--settings-dialog-shadow);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: var(--settings-backdrop);\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: 28px;\n padding: 7px 9px 3px 4px;\n color: var(--settings-muted);\n font-size: 12px;\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: 14px;\n font-weight: 600;\n line-height: 21px;\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-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 padding: 0 0 28px;\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-strong);\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-strong);\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 min-width: 0;\n margin: 0 0 16px;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 8px;\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: transparent;\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-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n}\n\n.settings-session-import-search {\n align-items: stretch;\n margin: 16px 0 0;\n}\n\n.settings-session-import-pagination {\n margin: 16px 0 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 box-sizing: border-box;\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,\n.settings-session-import-search .settings-command-button {\n box-sizing: border-box;\n height: 36px;\n min-height: 36px;\n padding: 6px 10px;\n border-radius: 6px;\n}\n\n.settings-session-import-pagination select {\n min-height: 28px;\n padding: 2px 8px;\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 line-height: 18px;\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: none;\n min-width: 0;\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-content {\n margin-top: 16px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 0;\n gap: 12px;\n padding: 12px 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-strong);\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: 8px 0 0;\n}\n\n.settings-connection-page-header .settings-page-description + .settings-page-description {\n margin-top: 8px;\n}\n\n.settings-update-header {\n margin-bottom: 8px;\n}\n\n.settings-connections-content,\n.settings-plugins-content,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-content,\n.settings-plugins-content {\n display: grid;\n gap: 12px;\n}\n\n.settings-connection-list {\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-segmented {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n padding: 2px;\n gap: 3px;\n background: var(--settings-surface-strong);\n border-radius: 10px;\n}\n\n.settings-segmented__item {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 28px;\n padding: 4px 14px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n white-space: nowrap;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n transition:\n color 0.15s ease,\n background-color 0.15s ease,\n box-shadow 0.15s ease;\n}\n\n.settings-segmented__item:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-segmented__item--selected,\n.settings-segmented__item[aria-selected="true"],\n.settings-segmented__item[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-elevated);\n box-shadow: var(--settings-segmented-shadow);\n}\n\n.settings-segmented__item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.settings-segmented__item:disabled:hover {\n color: var(--settings-muted);\n background: transparent;\n}\n\n.settings-segmented__item: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 /* Component : Status : Actions = 4 : 3 : 3 */\n grid-template-columns: minmax(0, 4fr) minmax(0, 3fr) minmax(0, 3fr);\n align-items: center;\n min-width: 0;\n column-gap: 16px;\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: var(--settings-surface);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row,\n.settings-connection-rows > .settings-connection-block {\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-rows > .settings-connection-row:last-child,\n.settings-connection-rows > .settings-connection-block:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\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-mark);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface-strong);\n border-radius: 7px;\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-table-header > :last-child {\n text-align: end;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n gap: 6px;\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-inline-detail {\n display: grid;\n gap: 12px;\n margin-top: 2px;\n padding: 14px 12px 16px;\n border-top: 1px solid var(--settings-divider);\n background: var(--settings-inset);\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-divider[data-connection-drag-over="true"] {\n color: var(--settings-focus);\n background: rgb(51 156 255 / 8%);\n border-radius: 6px;\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 padding: 0;\n color: var(--settings-focus);\n font: inherit;\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-connection-install-link:hover,\n.settings-connection-install-link:focus-visible {\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-command {\n display: grid;\n gap: 4px;\n margin-top: 8px;\n}\n\n.settings-connection-install-command span {\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 14px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n\n.settings-connection-install-command code {\n display: block;\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 font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n}\n\n.settings-connection-install-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n\n.settings-connection-copy-prompt {\n position: relative;\n}\n\n.settings-connection-copy-prompt__tooltip {\n position: absolute;\n z-index: 4;\n bottom: calc(100% + 6px);\n left: 0;\n width: max-content;\n max-width: min(360px, 72vw);\n max-height: 180px;\n overflow: auto;\n padding: 8px 10px;\n color: var(--settings-text);\n font-size: 11px;\n line-height: 16px;\n white-space: pre-wrap;\n text-align: left;\n background: var(--settings-elevated);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n box-shadow: 0 10px 24px rgb(0 0 0 / 22%);\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-copy-prompt:hover .settings-connection-copy-prompt__tooltip,\n.settings-connection-copy-prompt:focus-within .settings-connection-copy-prompt__tooltip {\n opacity: 1;\n visibility: visible;\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-page {\n display: flex;\n flex-direction: column;\n gap: 18px;\n box-sizing: border-box;\n min-height: min(620px, calc(100vh - 200px));\n max-width: 720px;\n}\n\n.settings-about-page > .settings-section-label {\n padding-bottom: 10px;\n}\n\n.settings-about-panel {\n display: grid;\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-lead,\n.settings-about-extension,\n.settings-about-closing p,\n.settings-about-copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-lead {\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-about-agents {\n display: grid;\n gap: 10px;\n margin: 2px 0;\n padding: 0;\n list-style: none;\n}\n\n.settings-about-agent {\n display: grid;\n gap: 4px;\n padding-left: 2px;\n}\n\n.settings-about-agent-name {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-about-agent-name::before {\n content: "\xB7 ";\n color: var(--settings-muted);\n font-weight: 600;\n}\n\n.settings-about-agent-description {\n display: block;\n padding-left: 0.85em;\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 400;\n line-height: 18px;\n}\n\n.settings-about-closing {\n display: grid;\n gap: 8px;\n}\n\n.settings-about-repository {\n gap: 10px;\n}\n\n.settings-about-open-source {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.35em;\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\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: 4px 0 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: #7cb8ff;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n}\n\n.settings-about-repository-link .codexhost-settings-icon {\n display: block;\n flex: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-brand {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: auto;\n padding-top: 12px;\n color: inherit;\n opacity: 0.9;\n text-decoration: none;\n transition: opacity 160ms ease;\n}\n\n.settings-about-brand:hover {\n opacity: 1;\n}\n\n.settings-about-brand-video {\n width: 40px;\n height: 40px;\n flex: none;\n overflow: hidden;\n object-fit: cover;\n border-radius: 999px;\n box-shadow: 0 1px 2px rgb(0 0 0 / 18%);\n}\n\n.settings-about-brand-copy {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n\n.settings-about-brand-name {\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 800;\n letter-spacing: 0.18em;\n line-height: 18px;\n}\n\n.settings-about-brand-tagline {\n color: var(--settings-muted);\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.18em;\n line-height: 16px;\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 0 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/* Soft status copy and the Update action should not sit in a framed card. */\n.settings-update-panel[data-update-state="unavailable"],\n.settings-update-panel[data-update-state="failed"],\n.settings-update-panel[data-update-state="error"],\n.settings-update-panel[data-update-state="available"] {\n padding: 4px 0 0;\n border: 0;\n border-radius: 0;\n}\n\n.settings-update-panel__status-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n\n.settings-update-panel__status-row .settings-update-actions {\n flex: none;\n}\n\n.settings-update-panel__status-row .settings-update-panel__head {\n flex: 1 1 auto;\n min-width: 0;\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"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"]\n .settings-update-panel__head\n .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel[data-update-state="unavailable"]\n .settings-update-panel__head\n .codexhost-settings-icon {\n color: var(--settings-muted);\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-strong);\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-muted);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button--secondary .codexhost-settings-icon,\n.settings-update-link .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-command-button:hover:not(.settings-command-button--secondary) {\n filter: brightness(1.08);\n}\n\n.settings-command-button--danger {\n color: var(--settings-danger);\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: var(--settings-danger-bg);\n border-color: var(--settings-danger-border);\n}\n\n.settings-command-button--secondary:hover,\n.settings-update-link:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-command-button--secondary:hover .codexhost-settings-icon,\n.settings-update-link:hover .codexhost-settings-icon {\n color: var(--settings-text);\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.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.settings-session-import-content {\n display: grid;\n min-width: 0;\n gap: 12px;\n margin-top: 16px;\n}\n\n.settings-session-import-list {\n display: grid;\n min-width: 0;\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n min-width: 0;\n gap: 16px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-session-import-row:last-child {\n border-bottom: 0;\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 color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-row__cwd {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: center;\n flex: none;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: #f5c542;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 16px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 6px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\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: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 18px;\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 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-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-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-connection-page-header {\n flex-direction: column;\n }\n\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n justify-content: flex-start;\n flex-wrap: wrap;\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 :host([data-theme="light"]),\n :host([data-theme="dark"]) {\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-elevated: Canvas;\n --settings-surface-strong: Canvas;\n --settings-mark: CanvasText;\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';
27086
-
27087
- // src/settings/accounts.css
27088
- 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-status {\n margin: 0 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin: 0 0 16px;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-text);\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n height: 36px;\n min-width: 180px;\n max-width: 100%;\n margin-right: auto;\n padding: 0 10px;\n color: var(--settings-muted);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-search input {\n flex: 1;\n min-width: 0;\n width: 210px;\n padding: 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-search input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-search:focus-within {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-account-groups {\n display: grid;\n gap: 18px;\n}\n.settings-account-group__title {\n margin: 0 0 8px;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n.settings-account-list {\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n container-type: inline-size;\n}\n.settings-account-list > .settings-account-empty {\n margin: 0;\n padding: 28px 16px;\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: 10px 16px;\n color: var(--settings-muted);\n background: var(--settings-surface);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\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--api th:nth-child(1) {\n width: 48%;\n}\n.settings-account-table--api th:nth-child(2) {\n width: 32%;\n}\n.settings-account-table--api th:nth-child(3) {\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: transparent;\n}\n.settings-account-row:hover {\n background: var(--settings-hover);\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:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n.settings-account-usage__meter--balance {\n display: flex;\n grid-template-columns: none;\n justify-content: flex-start;\n gap: 6px;\n}\n.settings-account-usage__balance {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n font-size: 14px;\n font-weight: 600;\n}\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(--settings-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:not(.settings-segmented__item):not(input) {\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-elevated);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: var(--settings-dialog-shadow);\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: var(--settings-backdrop);\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 .settings-account-table--api .settings-account-usage-cell {\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';
27876
+ var shell_default = `:host {
27877
+ /* Inherit Codex Desktop color-scheme; light-dark() tracks the host page. */
27878
+ --settings-titlebar-height: env(titlebar-area-height, 0px);
27879
+ --settings-bg: light-dark(#ffffff, #181818);
27880
+ --settings-sidebar: light-dark(#f4f4f5, #1c1c1c);
27881
+ --settings-panel: transparent;
27882
+ --settings-text: light-dark(#171717, #f5f5f5);
27883
+ --settings-muted: light-dark(#737373, #a1a1a1);
27884
+ --settings-subtle: light-dark(#8a8a8a, #777777);
27885
+ --settings-border: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));
27886
+ --settings-divider: light-dark(rgb(15 23 42 / 10%), rgb(255 255 255 / 10%));
27887
+ --settings-hover: light-dark(rgb(15 23 42 / 5%), rgb(255 255 255 / 6%));
27888
+ --settings-active: light-dark(rgb(51 156 255 / 14%), rgb(51 156 255 / 12%));
27889
+ --settings-focus: #339cff;
27890
+ --settings-elevated: light-dark(#ffffff, #2c2c2e);
27891
+ --settings-inset: light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 18%));
27892
+ --settings-surface: light-dark(rgb(15 23 42 / 3%), rgb(255 255 255 / 2%));
27893
+ --settings-surface-strong: light-dark(rgb(15 23 42 / 6%), rgb(255 255 255 / 6%));
27894
+ --settings-surface-hover: light-dark(#eeeeee, #303030);
27895
+ --settings-mark: light-dark(#52525b, #d4d8de);
27896
+ --settings-dialog-shadow: light-dark(
27897
+ 0 24px 64px rgb(15 23 42 / 16%),
27898
+ 0 24px 64px rgb(0 0 0 / 38%)
27899
+ );
27900
+ --settings-backdrop: light-dark(rgb(15 23 42 / 28%), rgb(0 0 0 / 52%));
27901
+ --settings-segmented-shadow:
27902
+ 0 0 0 0.5px light-dark(rgb(15 23 42 / 6%), rgb(0 0 0 / 4%)),
27903
+ 0 3px 1px 0 light-dark(rgb(15 23 42 / 4%), rgb(0 0 0 / 4%)),
27904
+ 0 3px 8px 0 light-dark(rgb(15 23 42 / 10%), rgb(0 0 0 / 12%));
27905
+ --settings-primary: light-dark(#171717, #f4f4f4);
27906
+ --settings-primary-hover: light-dark(#2f2f2f, #ffffff);
27907
+ --settings-primary-text: light-dark(#ffffff, #171717);
27908
+ --settings-warning: light-dark(#8a5500, #f5c96a);
27909
+ --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));
27910
+ --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));
27911
+ --settings-danger: light-dark(#b42318, #f87171);
27912
+ --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));
27913
+ --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));
27914
+ --settings-success: light-dark(#16784a, #4ade80);
27915
+ --settings-dialog-max-width: 1120px;
27916
+ --settings-dialog-max-height: 780px;
27917
+ --settings-dialog-inset: 52px;
27918
+ color: var(--settings-text);
27919
+ color-scheme: inherit;
27920
+ font:
27921
+ 13px/1.5 system-ui,
27922
+ -apple-system,
27923
+ BlinkMacSystemFont,
27924
+ "Segoe UI",
27925
+ sans-serif;
27926
+ letter-spacing: 0;
27927
+ }
27089
27928
 
27090
- // src/settings/shell.ts
27091
- var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
27092
- var RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
27093
- function isRendererSettingsDialogSupported(dialog) {
27094
- return typeof dialog.showModal === "function" && typeof dialog.close === "function";
27095
- }
27096
- function resolveRendererSettingsTheme(ownerDocument = document) {
27097
- try {
27098
- const scheme = ownerDocument.defaultView?.getComputedStyle(ownerDocument.documentElement).colorScheme.toLowerCase();
27099
- if (scheme?.includes("dark") && !scheme.includes("light")) return "dark";
27100
- if (scheme?.includes("light") && !scheme.includes("dark")) return "light";
27101
- } catch {
27102
- }
27103
- return "dark";
27929
+ /* Element defaults stay below Tailwind utilities; unlayered component classes still override them. */
27930
+ @layer base {
27931
+ *,
27932
+ *::before,
27933
+ *::after {
27934
+ box-sizing: border-box;
27935
+ letter-spacing: 0;
27104
27936
  }
27105
- function applyRendererSettingsTheme(root, ownerDocument) {
27106
- root.dataset.theme = resolveRendererSettingsTheme(ownerDocument);
27937
+
27938
+ button,
27939
+ input,
27940
+ select {
27941
+ font: inherit;
27107
27942
  }
27108
- function setActiveNavigation(buttons, activePageId) {
27109
- for (const [pageId, button] of buttons) {
27110
- if (pageId === activePageId) button.setAttribute("aria-current", "page");
27111
- else button.removeAttribute("aria-current");
27112
- }
27943
+
27944
+ button {
27945
+ color: inherit;
27113
27946
  }
27114
- function mountRendererSettingsShell(registry2, ownerDocument = document, messages = DEFAULT_RENDERER_SETTINGS_MESSAGES) {
27115
- const resolvedRegistry = registry2 ?? createDefaultRendererSettingsRegistry(messages);
27116
- if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
27117
- if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
27118
- throw new Error("A codexhost settings shell is already mounted");
27119
- }
27120
- const root = ownerDocument.createElement("div");
27121
- root.setAttribute(SETTINGS_SHELL_ATTRIBUTE, "v1");
27122
- root.lang = messages.locale;
27123
- applyRendererSettingsTheme(root, ownerDocument);
27124
- root.style.colorScheme = RENDERER_SETTINGS_COLOR_SCHEME;
27125
- const shadow = root.attachShadow({ mode: "open" });
27126
- const style = ownerDocument.createElement("style");
27127
- style.textContent = `${shell_default}
27128
- ${accounts_default}`;
27129
- const dialog = ownerDocument.createElement("dialog");
27130
- dialog.className = "codexhost-settings-dialog";
27131
- const frame = ownerDocument.createElement("div");
27132
- frame.className = "settings-frame";
27133
- const header = ownerDocument.createElement("header");
27134
- header.className = "settings-header";
27135
- const brand = ownerDocument.createElement("div");
27136
- brand.className = "settings-brand";
27137
- const brandMark = ownerDocument.createElement("span");
27138
- brandMark.className = "settings-brand__mark";
27139
- brandMark.append(createRendererSettingsBrandIcon(32));
27140
- const brandCopy = ownerDocument.createElement("span");
27141
- brandCopy.className = "settings-brand__copy";
27142
- const brandName = ownerDocument.createElement("span");
27143
- brandName.className = "settings-brand__name";
27144
- brandName.textContent = "BOFT CLI";
27145
- const brandTitle = ownerDocument.createElement("span");
27146
- brandTitle.className = "settings-brand__title";
27147
- brandTitle.id = "codexhost-settings-dialog-title";
27148
- brandTitle.textContent = messages.title;
27947
+ }
27948
+
27949
+ [hidden] {
27950
+ display: none !important;
27951
+ }
27952
+
27953
+ .codexhost-settings-dialog {
27954
+ /* Native window controls sit above the DOM top layer. Center below them. */
27955
+ inset: var(--settings-titlebar-height) 0 0;
27956
+ width: min(var(--settings-dialog-max-width), calc(100vw - 2 * var(--settings-dialog-inset)));
27957
+ height: min(
27958
+ var(--settings-dialog-max-height),
27959
+ calc(100vh - var(--settings-titlebar-height) - 2 * var(--settings-dialog-inset))
27960
+ );
27961
+ -webkit-app-region: no-drag;
27962
+ max-width: none;
27963
+ max-height: none;
27964
+ margin: auto;
27965
+ padding: 0;
27966
+ overflow: hidden;
27967
+ color: var(--settings-text);
27968
+ background: var(--settings-bg);
27969
+ border: 1px solid var(--settings-border);
27970
+ border-radius: 12px;
27971
+ box-shadow: var(--settings-dialog-shadow);
27972
+ }
27973
+
27974
+ .codexhost-settings-dialog::backdrop {
27975
+ /* Backdrops do not inherit the shell's custom properties. */
27976
+ top: env(titlebar-area-height, 0px);
27977
+ -webkit-app-region: no-drag;
27978
+ background: light-dark(rgb(15 23 42 / 28%), rgb(0 0 0 / 52%));
27979
+ backdrop-filter: blur(1px);
27980
+ }
27981
+
27982
+ .settings-frame,
27983
+ .settings-layout {
27984
+ width: 100%;
27985
+ height: 100%;
27986
+ min-width: 0;
27987
+ min-height: 0;
27988
+ }
27989
+
27990
+ .settings-frame {
27991
+ display: flex;
27992
+ flex-direction: column;
27993
+ }
27994
+
27995
+ .settings-layout {
27996
+ flex: 1;
27997
+ display: grid;
27998
+ grid-template-columns: 184px minmax(0, 1fr);
27999
+ background: var(--settings-bg);
28000
+ }
28001
+
28002
+ .settings-sidebar {
28003
+ display: flex;
28004
+ min-width: 0;
28005
+ min-height: 0;
28006
+ flex-direction: column;
28007
+ overflow: hidden;
28008
+ background: var(--settings-sidebar);
28009
+ border-right: 1px solid var(--settings-border);
28010
+ padding-top: 14px;
28011
+ }
28012
+
28013
+ .settings-header {
28014
+ display: flex;
28015
+ align-items: center;
28016
+ min-width: 0;
28017
+ height: 48px;
28018
+ flex: none;
28019
+ padding: 0 12px;
28020
+ border-bottom: 1px solid var(--settings-border);
28021
+ }
28022
+
28023
+ .settings-header-actions {
28024
+ display: flex;
28025
+ align-items: center;
28026
+ flex: none;
28027
+ gap: 12px;
28028
+ margin-left: auto;
28029
+ }
28030
+
28031
+ .settings-brand {
28032
+ display: flex;
28033
+ align-items: center;
28034
+ min-width: 0;
28035
+ gap: 7px;
28036
+ }
28037
+
28038
+ .settings-brand__mark {
28039
+ display: inline-flex;
28040
+ align-items: center;
28041
+ justify-content: center;
28042
+ width: 26px;
28043
+ height: 26px;
28044
+ flex: none;
28045
+ color: var(--settings-text);
28046
+ }
28047
+
28048
+ .settings-brand__mark .codexhost-settings-icon {
28049
+ width: 24px;
28050
+ height: 24px;
28051
+ object-fit: contain;
28052
+ }
28053
+
28054
+ .settings-brand__copy {
28055
+ display: flex;
28056
+ min-width: 0;
28057
+ align-items: baseline;
28058
+ gap: 0;
28059
+ line-height: 20px;
28060
+ }
28061
+
28062
+ .settings-brand__name {
28063
+ overflow: hidden;
28064
+ color: var(--settings-text);
28065
+ font-size: 13px;
28066
+ font-weight: 600;
28067
+ text-overflow: ellipsis;
28068
+ white-space: nowrap;
28069
+ }
28070
+
28071
+ .settings-brand__title {
28072
+ margin-left: 8px;
28073
+ padding-left: 8px;
28074
+ color: var(--settings-muted);
28075
+ font-size: 13px;
28076
+ font-weight: 400;
28077
+ border-left: 1px solid var(--settings-border);
28078
+ }
28079
+
28080
+ .settings-nav {
28081
+ display: flex;
28082
+ min-width: 0;
28083
+ min-height: 0;
28084
+ flex: 1;
28085
+ flex-direction: column;
28086
+ gap: 2px;
28087
+ padding: 0 7px 10px;
28088
+ overflow-y: auto;
28089
+ }
28090
+
28091
+ .settings-nav-section-label {
28092
+ min-height: 28px;
28093
+ padding: 7px 9px 3px 4px;
28094
+ color: var(--settings-muted);
28095
+ font-size: 12px;
28096
+ font-weight: 600;
28097
+ line-height: 18px;
28098
+ }
28099
+
28100
+ .settings-nav-section-label:not(:first-child) {
28101
+ margin-top: 8px;
28102
+ }
28103
+
28104
+ .settings-nav-button {
28105
+ display: grid;
28106
+ grid-template-columns: 16px minmax(0, 1fr);
28107
+ align-items: center;
28108
+ width: 100%;
28109
+ position: relative;
28110
+ min-height: 34px;
28111
+ flex: none;
28112
+ gap: 9px;
28113
+ padding: 6px 9px;
28114
+ color: var(--settings-text);
28115
+ font-size: 14px;
28116
+ font-weight: 600;
28117
+ line-height: 21px;
28118
+ text-align: left;
28119
+ background: transparent;
28120
+ border: 0;
28121
+ border-radius: 8px;
28122
+ cursor: pointer;
28123
+ }
28124
+
28125
+ .settings-nav-button .codexhost-settings-icon {
28126
+ width: 16px;
28127
+ height: 16px;
28128
+ opacity: 0.9;
28129
+ }
28130
+
28131
+ .settings-nav-button:hover {
28132
+ background: var(--settings-hover);
28133
+ }
28134
+
28135
+ .settings-nav-button[aria-current="page"] {
28136
+ background: var(--settings-active);
28137
+ color: var(--settings-text);
28138
+ font-weight: 500;
28139
+ }
28140
+
28141
+ .settings-nav-button span {
28142
+ min-width: 0;
28143
+ overflow: hidden;
28144
+ text-overflow: ellipsis;
28145
+ white-space: nowrap;
28146
+ }
28147
+
28148
+ .settings-icon-button {
28149
+ display: inline-flex;
28150
+ align-items: center;
28151
+ justify-content: center;
28152
+ width: 28px;
28153
+ height: 28px;
28154
+ flex: none;
28155
+ padding: 0;
28156
+ color: var(--settings-muted);
28157
+ background: transparent;
28158
+ border: 0;
28159
+ border-radius: 8px;
28160
+ cursor: pointer;
28161
+ }
28162
+
28163
+ .settings-icon-button:hover {
28164
+ color: var(--settings-text);
28165
+ background: var(--settings-hover);
28166
+ }
28167
+
28168
+ .settings-icon-button:focus-visible,
28169
+ .settings-nav-button:focus-visible {
28170
+ outline: 2px solid var(--settings-focus);
28171
+ outline-offset: 1px;
28172
+ }
28173
+
28174
+ .settings-page {
28175
+ display: block;
28176
+ position: relative;
28177
+ min-width: 0;
28178
+ min-height: 0;
28179
+ overflow-y: auto;
28180
+ background: var(--settings-bg);
28181
+ scrollbar-gutter: stable;
28182
+ }
28183
+
28184
+ .settings-page__content {
28185
+ width: min(930px, calc(100% - 80px));
28186
+ margin-inline: auto;
28187
+ }
28188
+
28189
+ .settings-page__content {
28190
+ min-width: 0;
28191
+ padding: 28px 0 36px;
28192
+ }
28193
+
28194
+ .settings-section-label {
28195
+ min-height: auto;
28196
+ padding: 0 0 28px;
28197
+ color: var(--settings-text);
28198
+ font-size: 18px;
28199
+ font-weight: 600;
28200
+ line-height: 26px;
28201
+ }
28202
+
28203
+ .settings-status-list,
28204
+ .settings-empty {
28205
+ overflow: hidden;
28206
+ background: var(--settings-panel);
28207
+ }
28208
+
28209
+ .settings-status-row {
28210
+ display: grid;
28211
+ grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);
28212
+ position: relative;
28213
+ align-items: center;
28214
+ min-height: 72px;
28215
+ gap: 20px;
28216
+ padding: 12px 0;
28217
+ }
28218
+
28219
+ .settings-status-row:not(:last-child)::after {
28220
+ content: "";
28221
+ position: absolute;
28222
+ right: 0;
28223
+ bottom: 0;
28224
+ left: 0;
28225
+ height: 1px;
28226
+ background: var(--settings-divider);
28227
+ }
28228
+
28229
+ .settings-status-row__identity {
28230
+ display: inline-flex;
28231
+ align-items: center;
28232
+ min-width: 0;
28233
+ color: var(--settings-text);
28234
+ gap: 10px;
28235
+ font-size: 14px;
28236
+ font-weight: 500;
28237
+ line-height: 22px;
28238
+ }
28239
+
28240
+ .settings-status-row__icon {
28241
+ display: inline-flex;
28242
+ align-items: center;
28243
+ justify-content: center;
28244
+ width: 36px;
28245
+ height: 36px;
28246
+ flex: none;
28247
+ color: var(--settings-muted);
28248
+ background: var(--settings-surface-strong);
28249
+ border-radius: 50%;
28250
+ }
28251
+
28252
+ .settings-status-badge {
28253
+ flex: none;
28254
+ padding: 3px 8px;
28255
+ color: var(--settings-muted);
28256
+ font-size: 11px;
28257
+ font-weight: 500;
28258
+ line-height: 18px;
28259
+ background: var(--settings-surface-strong);
28260
+ border: 1px solid var(--settings-border);
28261
+ border-radius: 6px;
28262
+ }
28263
+
28264
+ .settings-status-row__detail {
28265
+ min-width: 0;
28266
+ color: var(--settings-muted);
28267
+ font-size: 13px;
28268
+ line-height: 20px;
28269
+ }
28270
+
28271
+ .settings-page-description {
28272
+ max-width: 760px;
28273
+ margin: -10px 0 20px;
28274
+ color: var(--settings-muted);
28275
+ font-size: 12px;
28276
+ line-height: 18px;
28277
+ }
28278
+
28279
+ .settings-session-import-header {
28280
+ display: flex;
28281
+ align-items: flex-start;
28282
+ justify-content: space-between;
28283
+ gap: 24px;
28284
+ }
28285
+
28286
+ .settings-session-import-header .settings-section-label {
28287
+ min-width: 0;
28288
+ }
28289
+
28290
+ .settings-session-import-harness {
28291
+ display: flex;
28292
+ min-width: 0;
28293
+ margin: 0 0 16px;
28294
+ }
28295
+
28296
+ .settings-session-import-harness__options {
28297
+ display: flex;
28298
+ flex-wrap: wrap;
28299
+ align-items: center;
28300
+ width: fit-content;
28301
+ max-width: 100%;
28302
+ gap: 8px;
28303
+ }
28304
+
28305
+ .settings-session-import-harness__option {
28306
+ min-height: 32px;
28307
+ flex: none;
28308
+ padding: 6px 10px;
28309
+ color: var(--settings-muted);
28310
+ font: inherit;
28311
+ font-size: 12px;
28312
+ white-space: nowrap;
28313
+ background: transparent;
28314
+ border: 1px solid var(--settings-border);
28315
+ border-radius: 6px;
28316
+ cursor: pointer;
28317
+ }
28318
+
28319
+ .settings-session-import-harness__option[aria-pressed="true"] {
28320
+ color: var(--settings-text);
28321
+ background: var(--settings-active);
28322
+ border-color: rgb(51 156 255 / 50%);
28323
+ }
28324
+
28325
+ .settings-session-import-harness__option:disabled {
28326
+ opacity: 0.38;
28327
+ cursor: not-allowed;
28328
+ }
28329
+
28330
+ .settings-session-import-harness__option:focus-visible {
28331
+ outline: 2px solid var(--settings-focus);
28332
+ outline-offset: 2px;
28333
+ }
28334
+
28335
+ .settings-session-import-search,
28336
+ .settings-session-import-pagination {
28337
+ display: flex;
28338
+ flex-wrap: wrap;
28339
+ align-items: center;
28340
+ gap: 10px;
28341
+ }
28342
+
28343
+ .settings-session-import-search {
28344
+ align-items: stretch;
28345
+ margin: 16px 0 0;
28346
+ }
28347
+
28348
+ .settings-session-import-pagination {
28349
+ margin: 16px 0 0;
28350
+ }
28351
+
28352
+ .settings-session-import-search input {
28353
+ flex: 1;
28354
+ min-width: 160px;
28355
+ }
28356
+
28357
+ .settings-session-import-search input,
28358
+ .settings-session-import-pagination select {
28359
+ box-sizing: border-box;
28360
+ color: var(--settings-text);
28361
+ background: var(--settings-bg);
28362
+ border: 1px solid var(--settings-border);
28363
+ border-radius: 6px;
28364
+ }
28365
+
28366
+ .settings-session-import-search input,
28367
+ .settings-session-import-search .settings-command-button {
28368
+ box-sizing: border-box;
28369
+ height: 36px;
28370
+ min-height: 36px;
28371
+ padding: 6px 10px;
28372
+ border-radius: 6px;
28373
+ }
28374
+
28375
+ .settings-session-import-pagination select {
28376
+ min-height: 28px;
28377
+ padding: 2px 8px;
28378
+ }
28379
+
28380
+ .settings-session-import-search input:focus-visible,
28381
+ .settings-session-import-pagination select:focus-visible {
28382
+ outline: 2px solid var(--settings-focus);
28383
+ outline-offset: 2px;
28384
+ }
28385
+
28386
+ .settings-session-import-pagination {
28387
+ color: var(--settings-muted);
28388
+ font-size: 12px;
28389
+ line-height: 18px;
28390
+ }
28391
+
28392
+ .settings-session-import-pagination label {
28393
+ display: flex;
28394
+ align-items: center;
28395
+ gap: 8px;
28396
+ }
28397
+
28398
+ .settings-session-import-pagination > span {
28399
+ flex: none;
28400
+ min-width: 0;
28401
+ }
28402
+
28403
+ .settings-session-import-pagination__navigation {
28404
+ display: flex;
28405
+ gap: 8px;
28406
+ margin-left: auto;
28407
+ }
28408
+
28409
+ .settings-session-import-content,
28410
+ .settings-session-import-list {
28411
+ display: grid;
28412
+ gap: 10px;
28413
+ }
28414
+
28415
+ .settings-session-import-content {
28416
+ margin-top: 16px;
28417
+ }
28418
+
28419
+ .settings-session-import-status {
28420
+ display: flex;
28421
+ align-items: center;
28422
+ min-height: 0;
28423
+ gap: 12px;
28424
+ padding: 12px 16px;
28425
+ color: var(--settings-muted);
28426
+ background: var(--settings-panel);
28427
+ border: 1px solid var(--settings-border);
28428
+ border-radius: 8px;
28429
+ }
28430
+
28431
+ .settings-session-import-status.is-error {
28432
+ color: #ef4444;
28433
+ }
28434
+
28435
+ .settings-session-import-recovery {
28436
+ display: grid;
28437
+ justify-items: start;
28438
+ gap: 14px;
28439
+ padding: 16px;
28440
+ background: var(--settings-panel);
28441
+ border: 1px solid var(--settings-border);
28442
+ border-radius: 8px;
28443
+ }
28444
+
28445
+ .settings-session-import-recovery:focus-visible {
28446
+ outline: 2px solid var(--settings-focus);
28447
+ outline-offset: 2px;
28448
+ }
28449
+
28450
+ .settings-session-import-recovery__copy {
28451
+ display: grid;
28452
+ gap: 4px;
28453
+ }
28454
+
28455
+ .settings-session-import-recovery__copy strong {
28456
+ color: var(--settings-text);
28457
+ font-size: 14px;
28458
+ }
28459
+
28460
+ .settings-session-import-recovery__copy p {
28461
+ margin: 0;
28462
+ color: var(--settings-muted);
28463
+ font-size: 13px;
28464
+ line-height: 20px;
28465
+ }
28466
+
28467
+ .settings-session-import-recovery__path {
28468
+ display: flex;
28469
+ align-items: stretch;
28470
+ width: 100%;
28471
+ min-width: 0;
28472
+ overflow: hidden;
28473
+ border: 1px solid var(--settings-border);
28474
+ border-radius: 6px;
28475
+ }
28476
+
28477
+ .settings-session-import-recovery__path code {
28478
+ min-width: 0;
28479
+ flex: 1;
28480
+ padding: 8px 10px;
28481
+ overflow-x: auto;
28482
+ color: var(--settings-text);
28483
+ font-size: 12px;
28484
+ line-height: 20px;
28485
+ white-space: nowrap;
28486
+ }
28487
+
28488
+ .settings-session-import-recovery__path .settings-command-button {
28489
+ min-height: 0;
28490
+ flex: none;
28491
+ border-width: 0 0 0 1px;
28492
+ border-radius: 0;
28493
+ }
28494
+
28495
+ .settings-session-import-row {
28496
+ display: grid;
28497
+ grid-template-columns: minmax(0, 1fr) auto;
28498
+ align-items: center;
28499
+ gap: 20px;
28500
+ min-width: 0;
28501
+ padding: 16px;
28502
+ background: var(--settings-panel);
28503
+ border: 1px solid var(--settings-border);
28504
+ border-radius: 8px;
28505
+ }
28506
+
28507
+ .settings-session-import-row__copy {
28508
+ display: grid;
28509
+ min-width: 0;
28510
+ gap: 4px;
28511
+ }
28512
+
28513
+ .settings-session-import-row__copy strong {
28514
+ overflow: hidden;
28515
+ color: var(--settings-text);
28516
+ font-size: 14px;
28517
+ text-overflow: ellipsis;
28518
+ white-space: nowrap;
28519
+ }
28520
+
28521
+ .settings-session-import-row__copy span,
28522
+ .settings-session-import-row__cwd {
28523
+ overflow: hidden;
28524
+ color: var(--settings-muted);
28525
+ font-size: 12px;
28526
+ line-height: 18px;
28527
+ text-overflow: ellipsis;
28528
+ white-space: nowrap;
28529
+ }
28530
+
28531
+ .settings-session-import-row__cwd {
28532
+ display: block;
28533
+ min-width: 0;
28534
+ background: transparent;
28535
+ }
28536
+
28537
+ .settings-session-import-row__action {
28538
+ display: flex;
28539
+ align-items: flex-end;
28540
+ flex-direction: column;
28541
+ gap: 8px;
28542
+ }
28543
+
28544
+ .settings-session-import-running {
28545
+ color: var(--settings-muted);
28546
+ font-size: 12px;
28547
+ }
28548
+
28549
+ .settings-connection-page-header {
28550
+ display: flex;
28551
+ align-items: flex-start;
28552
+ justify-content: space-between;
28553
+ gap: 18px;
28554
+ margin-bottom: 18px;
28555
+ }
28556
+
28557
+ .settings-connection-page-header .settings-section-label {
28558
+ padding-bottom: 0;
28559
+ }
28560
+
28561
+ .settings-connection-page-header .settings-page-description {
28562
+ margin: 8px 0 0;
28563
+ }
28564
+
28565
+ .settings-connection-page-header .settings-page-description + .settings-page-description {
28566
+ margin-top: 8px;
28567
+ }
28568
+
28569
+ .settings-update-header {
28570
+ margin-bottom: 8px;
28571
+ }
28572
+
28573
+ .settings-connections-content,
28574
+ .settings-plugins-content,
28575
+ .settings-connection-list,
28576
+ .settings-connection-rows {
28577
+ min-width: 0;
28578
+ }
28579
+
28580
+ .settings-connections-content,
28581
+ .settings-plugins-content {
28582
+ display: grid;
28583
+ gap: 12px;
28584
+ }
28585
+
28586
+ .settings-connection-list {
28587
+ overflow: hidden;
28588
+ background: var(--settings-surface);
28589
+ border: 1px solid var(--settings-border);
28590
+ border-radius: 10px;
28591
+ }
28592
+
28593
+ .settings-segmented {
28594
+ display: inline-flex;
28595
+ flex-wrap: wrap;
28596
+ align-items: center;
28597
+ width: fit-content;
28598
+ max-width: 100%;
28599
+ padding: 2px;
28600
+ gap: 3px;
28601
+ background: var(--settings-surface-strong);
28602
+ border-radius: 10px;
28603
+ }
28604
+
28605
+ .settings-segmented__item {
28606
+ position: relative;
28607
+ display: inline-flex;
28608
+ align-items: center;
28609
+ justify-content: center;
28610
+ min-height: 28px;
28611
+ padding: 4px 14px;
28612
+ color: var(--settings-muted);
28613
+ font: inherit;
28614
+ font-size: 12px;
28615
+ font-weight: 600;
28616
+ line-height: 18px;
28617
+ white-space: nowrap;
28618
+ background: transparent;
28619
+ border: 0;
28620
+ border-radius: 8px;
28621
+ cursor: pointer;
28622
+ transition:
28623
+ color 0.15s ease,
28624
+ background-color 0.15s ease,
28625
+ box-shadow 0.15s ease;
28626
+ }
28627
+
28628
+ .settings-segmented__item:hover {
28629
+ color: var(--settings-text);
28630
+ background: var(--settings-hover);
28631
+ }
28632
+
28633
+ .settings-segmented__item--selected,
28634
+ .settings-segmented__item[aria-selected="true"],
28635
+ .settings-segmented__item[aria-pressed="true"] {
28636
+ color: var(--settings-text);
28637
+ background: var(--settings-elevated);
28638
+ box-shadow: var(--settings-segmented-shadow);
28639
+ }
28640
+
28641
+ .settings-segmented__item:disabled {
28642
+ opacity: 0.5;
28643
+ cursor: not-allowed;
28644
+ }
28645
+
28646
+ .settings-segmented__item:disabled:hover {
28647
+ color: var(--settings-muted);
28648
+ background: transparent;
28649
+ }
28650
+
28651
+ .settings-segmented__item:focus-visible,
28652
+ .settings-connection-row:focus-visible,
28653
+ .settings-connection-install-link:focus-visible,
28654
+ .settings-connection-view-error:focus-visible {
28655
+ outline: 2px solid var(--settings-focus);
28656
+ outline-offset: 1px;
28657
+ }
28658
+
28659
+ .settings-connection-host-tabs {
28660
+ display: flex;
28661
+ align-items: center;
28662
+ min-width: 0;
28663
+ gap: 6px;
28664
+ overflow-x: auto;
28665
+ overflow-y: hidden;
28666
+ overscroll-behavior-x: contain;
28667
+ scrollbar-width: none;
28668
+ scroll-behavior: smooth;
28669
+ scroll-snap-type: x proximity;
28670
+ touch-action: pan-x;
28671
+ }
28672
+
28673
+ .settings-connection-host-tabs::-webkit-scrollbar {
28674
+ display: none;
28675
+ }
28676
+
28677
+ .settings-connection-host-tab {
28678
+ display: inline-flex;
28679
+ align-items: center;
28680
+ height: 30px;
28681
+ min-width: max-content;
28682
+ flex: none;
28683
+ padding: 0 9px;
28684
+ color: var(--settings-muted);
28685
+ font: inherit;
28686
+ font-size: 12px;
28687
+ line-height: 18px;
28688
+ white-space: nowrap;
28689
+ background: var(--settings-inset);
28690
+ border: 1px solid var(--settings-border);
28691
+ border-radius: 7px;
28692
+ cursor: pointer;
28693
+ scroll-snap-align: start;
28694
+ }
28695
+
28696
+ .settings-connection-host-tab:hover {
28697
+ color: var(--settings-text);
28698
+ background: var(--settings-hover);
28699
+ }
28700
+
28701
+ .settings-connection-host-tab[aria-selected="true"] {
28702
+ color: var(--settings-text);
28703
+ font-weight: 600;
28704
+ background: var(--settings-active);
28705
+ border-color: var(--settings-border);
28706
+ }
28707
+
28708
+ .settings-connection-table-header,
28709
+ .settings-connection-row {
28710
+ display: grid;
28711
+ /* Component : Status : Actions = 4 : 3 : 3 */
28712
+ grid-template-columns: minmax(0, 4fr) minmax(0, 3fr) minmax(0, 3fr);
28713
+ align-items: center;
28714
+ min-width: 0;
28715
+ column-gap: 16px;
28716
+ }
28717
+
28718
+ .settings-connection-table-header {
28719
+ min-height: 30px;
28720
+ padding: 0 10px;
28721
+ color: var(--settings-muted);
28722
+ font-size: 10px;
28723
+ font-weight: 600;
28724
+ line-height: 16px;
28725
+ text-transform: uppercase;
28726
+ letter-spacing: 0.06em;
28727
+ background: var(--settings-surface);
28728
+ border-bottom: 1px solid var(--settings-divider);
28729
+ }
28730
+
28731
+ .settings-connection-rows > .settings-connection-row,
28732
+ .settings-connection-rows > .settings-connection-block {
28733
+ border-bottom: 1px solid var(--settings-divider);
28734
+ }
28735
+
28736
+ .settings-connection-rows > .settings-connection-row:last-child,
28737
+ .settings-connection-rows > .settings-connection-block:last-child {
28738
+ border-bottom: 0;
28739
+ }
28740
+
28741
+ .settings-connection-row {
28742
+ min-height: 52px;
28743
+ padding: 8px 10px;
28744
+ cursor: pointer;
28745
+ }
28746
+
28747
+ .settings-connection-row:hover {
28748
+ background: var(--settings-hover);
28749
+ }
28750
+
28751
+ .settings-connection-row[data-connection-selected="true"] {
28752
+ background: var(--settings-surface);
28753
+ }
28754
+
28755
+ .settings-connection-row__identity,
28756
+ .settings-connection-inspector__identity {
28757
+ display: inline-flex;
28758
+ align-items: center;
28759
+ min-width: 0;
28760
+ gap: 8px;
28761
+ color: var(--settings-text);
28762
+ }
28763
+
28764
+ .settings-connection-row__identity strong,
28765
+ .settings-connection-inspector__identity strong {
28766
+ min-width: 0;
28767
+ overflow-wrap: anywhere;
28768
+ font-size: 12px;
28769
+ font-weight: 500;
28770
+ line-height: 18px;
28771
+ }
28772
+
28773
+ .settings-connection-row__mark {
28774
+ display: inline-flex;
28775
+ align-items: center;
28776
+ justify-content: center;
28777
+ width: 24px;
28778
+ height: 24px;
28779
+ flex: none;
28780
+ color: var(--settings-mark);
28781
+ font-size: 10px;
28782
+ font-weight: 700;
28783
+ background: var(--settings-surface-strong);
28784
+ border-radius: 7px;
28785
+ }
28786
+
28787
+ .settings-connection-row__mark--logo {
28788
+ color: var(--settings-text);
28789
+ background: transparent;
28790
+ }
28791
+
28792
+ .settings-connection-row__mark--logo > img,
28793
+ .settings-connection-row__mark--logo > svg {
28794
+ display: block;
28795
+ max-width: 18px;
28796
+ max-height: 18px;
28797
+ }
28798
+
28799
+ .settings-connection-table-header > :last-child {
28800
+ text-align: end;
28801
+ }
28802
+
28803
+ .settings-connection-row__status {
28804
+ display: inline-flex;
28805
+ align-items: center;
28806
+ width: fit-content;
28807
+ max-width: 100%;
28808
+ gap: 6px;
28809
+ color: var(--settings-muted);
28810
+ font-size: 11px;
28811
+ font-weight: 500;
28812
+ line-height: 18px;
28813
+ }
28814
+
28815
+ .settings-connection-row__status::before {
28816
+ width: 6px;
28817
+ height: 6px;
28818
+ flex: none;
28819
+ content: "";
28820
+ background: currentColor;
28821
+ border-radius: 50%;
28822
+ }
28823
+
28824
+ .settings-connection-row__status[data-connection-tone="ready"] {
28825
+ color: var(--settings-success);
28826
+ }
28827
+
28828
+ .settings-connection-row__status[data-connection-tone="checking"] {
28829
+ color: var(--settings-warning);
28830
+ }
28831
+
28832
+ .settings-connection-row__status[data-connection-tone="setup"] {
28833
+ color: var(--settings-muted);
28834
+ }
28835
+
28836
+ .settings-connection-row__status[data-connection-tone="setup"]::before {
28837
+ background: transparent;
28838
+ border: 1.5px solid currentColor;
28839
+ }
28840
+
28841
+ .settings-connection-row__status[data-connection-tone="failed"] {
28842
+ color: var(--settings-danger);
28843
+ }
28844
+
28845
+ .settings-connection-row__action {
28846
+ display: flex;
28847
+ align-items: center;
28848
+ justify-content: flex-end;
28849
+ min-width: 0;
28850
+ gap: 4px;
28851
+ }
28852
+
28853
+ .settings-connection-row__handle {
28854
+ display: inline-flex;
28855
+ flex: none;
28856
+ align-items: center;
28857
+ justify-content: center;
28858
+ width: 16px;
28859
+ color: var(--settings-muted);
28860
+ cursor: grab;
28861
+ opacity: 0.6;
28862
+ }
28863
+
28864
+ .settings-connection-row__handle:hover {
28865
+ opacity: 1;
28866
+ }
28867
+
28868
+ .settings-connection-row[draggable="true"] {
28869
+ cursor: grab;
28870
+ }
28871
+
28872
+ .settings-connection-row[data-connection-dragging="true"] {
28873
+ opacity: 0.4;
28874
+ }
28875
+
28876
+ .settings-connection-row[data-connection-drop-indicator="before"] {
28877
+ box-shadow: inset 0 2px 0 0 var(--settings-focus);
28878
+ }
28879
+
28880
+ .settings-connection-row[data-connection-drop-indicator="after"] {
28881
+ box-shadow: inset 0 -2px 0 0 var(--settings-focus);
28882
+ }
28883
+
28884
+ .settings-connection-inline-detail {
28885
+ display: grid;
28886
+ gap: 12px;
28887
+ margin-top: 2px;
28888
+ padding: 14px 12px 16px;
28889
+ border-top: 1px solid var(--settings-divider);
28890
+ background: var(--settings-inset);
28891
+ }
28892
+
28893
+ .settings-connection-group-divider {
28894
+ padding: 10px 12px 6px;
28895
+ color: var(--settings-muted);
28896
+ font-size: 10px;
28897
+ font-weight: 600;
28898
+ line-height: 16px;
28899
+ text-transform: uppercase;
28900
+ letter-spacing: 0.06em;
28901
+ /* No border-top here: the row immediately above already carries its own
28902
+ border-bottom (it is no longer :last-child once this divider follows
28903
+ it), so adding one here would double the separator line. */
28904
+ }
28905
+
28906
+ .settings-connection-group-divider[data-connection-drag-over="true"] {
28907
+ color: var(--settings-focus);
28908
+ background: rgb(51 156 255 / 8%);
28909
+ border-radius: 6px;
28910
+ }
28911
+
28912
+ .settings-connection-group-more[data-connection-drag-over="true"] {
28913
+ background: rgb(51 156 255 / 8%);
28914
+ }
28915
+
28916
+ .settings-connection-group-hint {
28917
+ display: grid;
28918
+ gap: 3px;
28919
+ margin: 0 12px 12px;
28920
+ padding: 14px 16px;
28921
+ text-align: center;
28922
+ border: 1.5px dashed var(--settings-border);
28923
+ border-radius: 10px;
28924
+ }
28925
+
28926
+ .settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {
28927
+ border-color: var(--settings-focus);
28928
+ }
28929
+
28930
+ .settings-connection-group-hint strong {
28931
+ color: var(--settings-text);
28932
+ font-size: 12.5px;
28933
+ font-weight: 500;
28934
+ line-height: 18px;
28935
+ }
28936
+
28937
+ .settings-connection-group-hint span {
28938
+ color: var(--settings-muted);
28939
+ font-size: 12px;
28940
+ line-height: 17px;
28941
+ }
28942
+
28943
+ .settings-connection-group-reset {
28944
+ display: flex;
28945
+ width: 100%;
28946
+ align-items: center;
28947
+ gap: 6px;
28948
+ padding: 10px 12px;
28949
+ color: var(--settings-muted);
28950
+ font: inherit;
28951
+ font-size: 12px;
28952
+ text-align: left;
28953
+ background: transparent;
28954
+ border: 0;
28955
+ border-top: 1px solid var(--settings-divider);
28956
+ cursor: pointer;
28957
+ }
28958
+
28959
+ .settings-connection-group-reset:hover {
28960
+ color: var(--settings-text);
28961
+ background: var(--settings-hover);
28962
+ }
28963
+
28964
+ .settings-connection-install-link {
28965
+ display: inline-flex;
28966
+ align-items: center;
28967
+ justify-content: center;
28968
+ width: 26px;
28969
+ height: 26px;
28970
+ padding: 0;
28971
+ color: var(--settings-focus);
28972
+ font: inherit;
28973
+ text-decoration: none;
28974
+ background: transparent;
28975
+ border: 1px solid transparent;
28976
+ border-radius: 7px;
28977
+ cursor: pointer;
28978
+ }
28979
+
28980
+ .settings-connection-install-link:hover,
28981
+ .settings-connection-install-link:focus-visible {
28982
+ color: var(--settings-focus);
28983
+ background: var(--settings-active);
28984
+ border-color: var(--settings-border);
28985
+ }
28986
+
28987
+ .settings-connection-view-error {
28988
+ padding: 4px 7px;
28989
+ color: var(--settings-danger);
28990
+ font: inherit;
28991
+ font-size: 11px;
28992
+ line-height: 18px;
28993
+ background: transparent;
28994
+ border: 0;
28995
+ border-radius: 6px;
28996
+ cursor: pointer;
28997
+ }
28998
+
28999
+ .settings-connection-view-error:hover {
29000
+ color: var(--settings-danger);
29001
+ background: var(--settings-danger-bg);
29002
+ }
29003
+
29004
+ .settings-connection-inspector {
29005
+ position: sticky;
29006
+ top: 18px;
29007
+ }
29008
+
29009
+ .settings-connection-inspector__header {
29010
+ display: flex;
29011
+ align-items: flex-start;
29012
+ justify-content: space-between;
29013
+ min-width: 0;
29014
+ gap: 10px;
29015
+ padding: 12px;
29016
+ border-bottom: 1px solid var(--settings-divider);
29017
+ }
29018
+
29019
+ .settings-connection-inspector__body {
29020
+ display: grid;
29021
+ min-width: 0;
29022
+ gap: 12px;
29023
+ padding: 12px;
29024
+ }
29025
+
29026
+ .settings-connection-install-callout {
29027
+ display: grid;
29028
+ grid-template-columns: 28px minmax(0, 1fr);
29029
+ gap: 9px;
29030
+ padding: 11px;
29031
+ background: var(--settings-surface);
29032
+ border: 0;
29033
+ border-radius: 8px;
29034
+ }
29035
+
29036
+ .settings-connection-install-callout__icon {
29037
+ display: inline-flex;
29038
+ align-items: center;
29039
+ justify-content: center;
29040
+ width: 28px;
29041
+ height: 28px;
29042
+ color: var(--settings-focus);
29043
+ background: var(--settings-active);
29044
+ border-radius: 7px;
29045
+ }
29046
+
29047
+ .settings-connection-install-callout strong,
29048
+ .settings-connection-error-summary strong,
29049
+ .settings-connection-state-summary strong {
29050
+ display: block;
29051
+ margin: 0 0 4px;
29052
+ color: var(--settings-text);
29053
+ font-size: 12px;
29054
+ font-weight: 500;
29055
+ line-height: 18px;
29056
+ }
29057
+
29058
+ .settings-connection-install-callout p,
29059
+ .settings-connection-error-summary p,
29060
+ .settings-connection-state-summary p,
29061
+ .settings-connection-issue-note {
29062
+ margin: 0;
29063
+ color: var(--settings-muted);
29064
+ font-size: 11px;
29065
+ line-height: 16px;
29066
+ }
29067
+
29068
+ .settings-connection-install-command {
29069
+ display: grid;
29070
+ gap: 4px;
29071
+ margin-top: 8px;
29072
+ }
29073
+
29074
+ .settings-connection-install-command span {
29075
+ color: var(--settings-muted);
29076
+ font-size: 10px;
29077
+ font-weight: 600;
29078
+ line-height: 14px;
29079
+ letter-spacing: 0.04em;
29080
+ text-transform: uppercase;
29081
+ }
29082
+
29083
+ .settings-connection-install-command code {
29084
+ display: block;
29085
+ min-width: 0;
29086
+ overflow-wrap: anywhere;
29087
+ color: var(--settings-text);
29088
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
29089
+ font-size: 11px;
29090
+ line-height: 16px;
29091
+ white-space: pre-wrap;
29092
+ }
29093
+
29094
+ .settings-connection-install-actions {
29095
+ display: flex;
29096
+ flex-wrap: wrap;
29097
+ align-items: center;
29098
+ gap: 8px;
29099
+ }
29100
+
29101
+ .settings-connection-copy-prompt {
29102
+ position: relative;
29103
+ }
29104
+
29105
+ .settings-connection-copy-prompt__tooltip {
29106
+ position: absolute;
29107
+ z-index: 4;
29108
+ bottom: calc(100% + 6px);
29109
+ left: 0;
29110
+ width: max-content;
29111
+ max-width: min(360px, 72vw);
29112
+ max-height: 180px;
29113
+ overflow: auto;
29114
+ padding: 8px 10px;
29115
+ color: var(--settings-text);
29116
+ font-size: 11px;
29117
+ line-height: 16px;
29118
+ white-space: pre-wrap;
29119
+ text-align: left;
29120
+ background: var(--settings-elevated);
29121
+ border: 1px solid var(--settings-border);
29122
+ border-radius: 8px;
29123
+ box-shadow: 0 10px 24px rgb(0 0 0 / 22%);
29124
+ opacity: 0;
29125
+ visibility: hidden;
29126
+ pointer-events: none;
29127
+ transition: opacity 120ms ease;
29128
+ }
29129
+
29130
+ .settings-connection-copy-prompt:hover .settings-connection-copy-prompt__tooltip,
29131
+ .settings-connection-copy-prompt:focus-within .settings-connection-copy-prompt__tooltip {
29132
+ opacity: 1;
29133
+ visibility: visible;
29134
+ }
29135
+
29136
+ .settings-connection-error-summary {
29137
+ padding: 13px 14px;
29138
+ color: var(--settings-danger);
29139
+ background: var(--settings-danger-bg);
29140
+ border: 1px solid var(--settings-danger-border);
29141
+ border-radius: 10px;
29142
+ }
29143
+
29144
+ .settings-connection-error-metadata {
29145
+ display: grid;
29146
+ gap: 7px;
29147
+ padding: 12px;
29148
+ background: var(--settings-inset);
29149
+ border: 1px solid var(--settings-border);
29150
+ border-radius: 9px;
29151
+ }
29152
+
29153
+ .settings-connection-detail-line {
29154
+ display: grid;
29155
+ grid-template-columns: 92px minmax(0, 1fr);
29156
+ gap: 10px;
29157
+ min-width: 0;
29158
+ color: var(--settings-muted);
29159
+ font-size: 10px;
29160
+ line-height: 16px;
29161
+ }
29162
+
29163
+ .settings-connection-detail-line code {
29164
+ min-width: 0;
29165
+ overflow-wrap: anywhere;
29166
+ color: var(--settings-text);
29167
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
29168
+ white-space: pre-wrap;
29169
+ }
29170
+
29171
+ .settings-connection-error-log-header {
29172
+ display: flex;
29173
+ align-items: center;
29174
+ justify-content: space-between;
29175
+ gap: 10px;
29176
+ }
29177
+
29178
+ .settings-connection-error-log-header strong {
29179
+ color: var(--settings-text);
29180
+ font-size: 11px;
29181
+ font-weight: 600;
29182
+ }
29183
+
29184
+ .settings-connection-error-log-header .settings-command-button {
29185
+ min-height: 30px;
29186
+ padding: 5px 9px;
29187
+ font-size: 11px;
29188
+ }
29189
+
29190
+ .settings-connection-stderr {
29191
+ max-height: 220px;
29192
+ min-width: 0;
29193
+ margin: 0;
29194
+ padding: 11px;
29195
+ overflow: auto;
29196
+ color: var(--settings-text);
29197
+ font:
29198
+ 10px/16px ui-monospace,
29199
+ "SFMono-Regular",
29200
+ Consolas,
29201
+ "Liberation Mono",
29202
+ monospace;
29203
+ white-space: pre-wrap;
29204
+ overflow-wrap: anywhere;
29205
+ background: var(--settings-inset);
29206
+ border: 1px solid var(--settings-border);
29207
+ border-radius: 9px;
29208
+ }
29209
+
29210
+ .settings-connection-error-actions {
29211
+ display: grid;
29212
+ grid-template-columns: minmax(0, 1fr);
29213
+ gap: 8px;
29214
+ }
29215
+
29216
+ .settings-connection-error-actions .settings-command-button {
29217
+ width: 100%;
29218
+ }
29219
+
29220
+ .settings-connection-issue-note {
29221
+ margin-top: -4px;
29222
+ }
29223
+
29224
+ .settings-connection-state-summary {
29225
+ padding: 14px;
29226
+ background: var(--settings-surface);
29227
+ border: 1px solid var(--settings-border);
29228
+ border-radius: 10px;
29229
+ }
29230
+
29231
+ .settings-empty {
29232
+ display: flex;
29233
+ align-items: center;
29234
+ min-height: 72px;
29235
+ padding: 12px 16px;
29236
+ }
29237
+
29238
+ .settings-empty > div {
29239
+ display: grid;
29240
+ min-width: 0;
29241
+ gap: 2px;
29242
+ }
29243
+
29244
+ .settings-empty strong {
29245
+ color: var(--settings-text);
29246
+ font-size: 13px;
29247
+ font-weight: 500;
29248
+ line-height: 19px;
29249
+ }
29250
+
29251
+ .settings-empty span {
29252
+ color: var(--settings-muted);
29253
+ font-size: 13px;
29254
+ line-height: 19px;
29255
+ }
29256
+
29257
+ .settings-about-page {
29258
+ display: flex;
29259
+ flex-direction: column;
29260
+ gap: 18px;
29261
+ box-sizing: border-box;
29262
+ min-height: min(620px, calc(100vh - 200px));
29263
+ max-width: 720px;
29264
+ }
29265
+
29266
+ .settings-about-page > .settings-section-label {
29267
+ padding-bottom: 10px;
29268
+ }
29269
+
29270
+ .settings-about-panel {
29271
+ display: grid;
29272
+ gap: 18px;
29273
+ padding: 24px;
29274
+ background: var(--settings-panel);
29275
+ border: 1px solid var(--settings-border);
29276
+ border-radius: 12px;
29277
+ }
29278
+
29279
+ .settings-about-product {
29280
+ color: var(--settings-text);
29281
+ font-size: 24px;
29282
+ font-weight: 700;
29283
+ line-height: 32px;
29284
+ }
29285
+
29286
+ .settings-about-tagline {
29287
+ color: var(--settings-text);
29288
+ font-size: 16px;
29289
+ font-weight: 600;
29290
+ line-height: 24px;
29291
+ }
29292
+
29293
+ .settings-about-copy {
29294
+ display: grid;
29295
+ max-width: 660px;
29296
+ gap: 12px;
29297
+ }
29298
+
29299
+ .settings-about-lead,
29300
+ .settings-about-extension,
29301
+ .settings-about-closing p,
29302
+ .settings-about-copy p {
29303
+ margin: 0;
29304
+ color: var(--settings-muted);
29305
+ font-size: 13px;
29306
+ line-height: 21px;
29307
+ }
29308
+
29309
+ .settings-about-lead {
29310
+ color: var(--settings-text);
29311
+ font-weight: 500;
29312
+ }
29313
+
29314
+ .settings-about-agents {
29315
+ display: grid;
29316
+ gap: 10px;
29317
+ margin: 2px 0;
29318
+ padding: 0;
29319
+ list-style: none;
29320
+ }
29321
+
29322
+ .settings-about-agent {
29323
+ display: grid;
29324
+ gap: 4px;
29325
+ padding-left: 2px;
29326
+ }
29327
+
29328
+ .settings-about-agent-name {
29329
+ color: var(--settings-text);
29330
+ font-size: 13px;
29331
+ font-weight: 600;
29332
+ line-height: 18px;
29333
+ }
29334
+
29335
+ .settings-about-agent-name::before {
29336
+ content: "\xB7 ";
29337
+ color: var(--settings-muted);
29338
+ font-weight: 600;
29339
+ }
29340
+
29341
+ .settings-about-agent-description {
29342
+ display: block;
29343
+ padding-left: 0.85em;
29344
+ color: var(--settings-muted);
29345
+ font-size: 12px;
29346
+ font-weight: 400;
29347
+ line-height: 18px;
29348
+ }
29349
+
29350
+ .settings-about-closing {
29351
+ display: grid;
29352
+ gap: 8px;
29353
+ }
29354
+
29355
+ .settings-about-repository {
29356
+ gap: 10px;
29357
+ }
29358
+
29359
+ .settings-about-open-source {
29360
+ display: flex;
29361
+ align-items: center;
29362
+ flex-wrap: wrap;
29363
+ gap: 0.35em;
29364
+ margin: 0;
29365
+ color: var(--settings-muted);
29366
+ font-size: 13px;
29367
+ line-height: 21px;
29368
+ }
29369
+
29370
+ .settings-about-repository p {
29371
+ margin: 0;
29372
+ color: var(--settings-muted);
29373
+ font-size: 13px;
29374
+ line-height: 21px;
29375
+ }
29376
+
29377
+ .settings-about-star-callout {
29378
+ margin: 4px 0 0;
29379
+ color: var(--settings-warning);
29380
+ font-size: 14px;
29381
+ font-weight: 600;
29382
+ line-height: 22px;
29383
+ }
29384
+
29385
+ .settings-about-repository-link {
29386
+ display: inline-flex;
29387
+ align-items: center;
29388
+ gap: 6px;
29389
+ color: #7cb8ff;
29390
+ font-weight: 600;
29391
+ line-height: 1;
29392
+ text-decoration: none;
29393
+ }
29394
+
29395
+ .settings-about-repository-link .codexhost-settings-icon {
29396
+ display: block;
29397
+ flex: none;
29398
+ }
29399
+
29400
+ .settings-about-repository-link:hover {
29401
+ text-decoration: underline;
29402
+ }
29403
+
29404
+ .settings-about-brand {
29405
+ display: flex;
29406
+ align-items: center;
29407
+ justify-content: center;
29408
+ gap: 12px;
29409
+ margin-top: auto;
29410
+ padding-top: 12px;
29411
+ color: inherit;
29412
+ opacity: 0.9;
29413
+ text-decoration: none;
29414
+ transition: opacity 160ms ease;
29415
+ }
29416
+
29417
+ .settings-about-brand:hover {
29418
+ opacity: 1;
29419
+ }
29420
+
29421
+ .settings-about-brand-video {
29422
+ width: 40px;
29423
+ height: 40px;
29424
+ flex: none;
29425
+ overflow: hidden;
29426
+ object-fit: cover;
29427
+ border-radius: 999px;
29428
+ box-shadow: 0 1px 2px rgb(0 0 0 / 18%);
29429
+ }
29430
+
29431
+ .settings-about-brand-copy {
29432
+ display: flex;
29433
+ flex-direction: column;
29434
+ align-items: flex-start;
29435
+ gap: 2px;
29436
+ }
29437
+
29438
+ .settings-about-brand-name {
29439
+ color: var(--settings-text);
29440
+ font-size: 14px;
29441
+ font-weight: 800;
29442
+ letter-spacing: 0.18em;
29443
+ line-height: 18px;
29444
+ }
29445
+
29446
+ .settings-about-brand-tagline {
29447
+ color: var(--settings-muted);
29448
+ font-size: 12px;
29449
+ font-weight: 500;
29450
+ letter-spacing: 0.18em;
29451
+ line-height: 16px;
29452
+ }
29453
+
29454
+ .settings-page-error {
29455
+ padding: 16px;
29456
+ color: var(--settings-text);
29457
+ font-size: 13px;
29458
+ background: var(--settings-panel);
29459
+ border: 1px solid var(--settings-border);
29460
+ border-radius: 20px;
29461
+ }
29462
+
29463
+ .settings-update-metadata {
29464
+ display: grid;
29465
+ grid-template-columns: repeat(3, minmax(0, 1fr));
29466
+ gap: 24px;
29467
+ margin-bottom: 24px;
29468
+ padding: 0 0 20px;
29469
+ border-bottom: 1px solid var(--settings-divider);
29470
+ }
29471
+
29472
+ .settings-update-metadata__item {
29473
+ display: grid;
29474
+ min-width: 0;
29475
+ gap: 4px;
29476
+ }
29477
+
29478
+ .settings-update-metadata__item span {
29479
+ color: var(--settings-muted);
29480
+ font-size: 12px;
29481
+ line-height: 18px;
29482
+ }
29483
+
29484
+ .settings-update-metadata__item strong {
29485
+ min-width: 0;
29486
+ overflow-wrap: anywhere;
29487
+ color: var(--settings-text);
29488
+ font-size: 15px;
29489
+ font-weight: 500;
29490
+ line-height: 22px;
29491
+ }
29492
+
29493
+ /* The only emphasis on this screen: a latest version newer than the installed one. */
29494
+ .settings-update-metadata__value--newer {
29495
+ color: var(--settings-focus);
29496
+ }
29497
+
29498
+ .settings-update-panel {
29499
+ display: grid;
29500
+ gap: 12px;
29501
+ padding: 20px;
29502
+ color: var(--settings-text);
29503
+ background: var(--settings-panel);
29504
+ border: 1px solid var(--settings-border);
29505
+ border-radius: 8px;
29506
+ }
29507
+
29508
+ /* Soft status copy and the Update action should not sit in a framed card. */
29509
+ .settings-update-panel[data-update-state="unavailable"],
29510
+ .settings-update-panel[data-update-state="failed"],
29511
+ .settings-update-panel[data-update-state="error"],
29512
+ .settings-update-panel[data-update-state="available"] {
29513
+ padding: 4px 0 0;
29514
+ border: 0;
29515
+ border-radius: 0;
29516
+ }
29517
+
29518
+ .settings-update-panel__status-row {
29519
+ display: flex;
29520
+ align-items: center;
29521
+ flex-wrap: wrap;
29522
+ gap: 8px;
29523
+ min-width: 0;
29524
+ }
29525
+
29526
+ .settings-update-panel__status-row .settings-update-actions {
29527
+ flex: none;
29528
+ }
29529
+
29530
+ .settings-update-panel__status-row .settings-update-panel__head {
29531
+ flex: 1 1 auto;
29532
+ min-width: 0;
29533
+ }
29534
+
29535
+ .settings-update-panel__head {
29536
+ display: flex;
29537
+ align-items: center;
29538
+ min-width: 0;
29539
+ gap: 8px;
29540
+ }
29541
+
29542
+ .settings-update-panel__head .codexhost-settings-icon {
29543
+ color: var(--settings-muted);
29544
+ }
29545
+
29546
+ .settings-update-panel[data-update-state="available"]
29547
+ .settings-update-panel__head
29548
+ .codexhost-settings-icon,
29549
+ .settings-update-panel[data-update-state="downloading"]
29550
+ .settings-update-panel__head
29551
+ .codexhost-settings-icon,
29552
+ .settings-update-panel[data-update-state="installing"]
29553
+ .settings-update-panel__head
29554
+ .codexhost-settings-icon,
29555
+ .settings-update-panel[data-update-state="restarting"]
29556
+ .settings-update-panel__head
29557
+ .codexhost-settings-icon {
29558
+ color: var(--settings-focus);
29559
+ }
29560
+
29561
+ .settings-update-panel[data-update-state="current"]
29562
+ .settings-update-panel__head
29563
+ .codexhost-settings-icon {
29564
+ color: var(--settings-success);
29565
+ }
29566
+
29567
+ .settings-update-panel[data-update-state="failed"]
29568
+ .settings-update-panel__head
29569
+ .codexhost-settings-icon,
29570
+ .settings-update-panel[data-update-state="error"]
29571
+ .settings-update-panel__head
29572
+ .codexhost-settings-icon {
29573
+ color: var(--settings-danger);
29574
+ }
29575
+
29576
+ .settings-update-panel[data-update-state="unavailable"]
29577
+ .settings-update-panel__head
29578
+ .codexhost-settings-icon {
29579
+ color: var(--settings-muted);
29580
+ }
29581
+
29582
+ .settings-update-panel__title {
29583
+ min-width: 0;
29584
+ overflow-wrap: anywhere;
29585
+ color: var(--settings-text);
29586
+ font-size: 14px;
29587
+ font-weight: 600;
29588
+ line-height: 22px;
29589
+ }
29590
+
29591
+ .settings-update-summary,
29592
+ .settings-update-error {
29593
+ margin: 0;
29594
+ overflow-wrap: anywhere;
29595
+ font-size: 13px;
29596
+ line-height: 20px;
29597
+ }
29598
+
29599
+ .settings-update-summary {
29600
+ color: var(--settings-muted);
29601
+ }
29602
+
29603
+ .settings-update-error {
29604
+ color: var(--settings-danger);
29605
+ }
29606
+
29607
+ .settings-update-progress {
29608
+ width: 100%;
29609
+ height: 8px;
29610
+ accent-color: var(--settings-focus);
29611
+ }
29612
+
29613
+ .settings-update-progress-detail {
29614
+ color: var(--settings-muted);
29615
+ font-size: 12px;
29616
+ line-height: 18px;
29617
+ }
29618
+
29619
+ /* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */
29620
+ .settings-update-notes-section {
29621
+ min-width: 0;
29622
+ margin-top: 24px;
29623
+ padding-top: 24px;
29624
+ border-top: 1px solid var(--settings-divider);
29625
+ }
29626
+
29627
+ .settings-update-notes-section:empty {
29628
+ display: none;
29629
+ }
29630
+
29631
+ .settings-update-notes {
29632
+ display: grid;
29633
+ min-width: 0;
29634
+ gap: 12px;
29635
+ color: var(--settings-muted);
29636
+ font-size: 14px;
29637
+ line-height: 22px;
29638
+ overflow-wrap: anywhere;
29639
+ }
29640
+
29641
+ .settings-update-notes > :first-child {
29642
+ margin-top: 0;
29643
+ }
29644
+
29645
+ .settings-update-notes > :last-child {
29646
+ margin-bottom: 0;
29647
+ }
29648
+
29649
+ .settings-update-notes h1,
29650
+ .settings-update-notes h2,
29651
+ .settings-update-notes h3,
29652
+ .settings-update-notes h4,
29653
+ .settings-update-notes h5,
29654
+ .settings-update-notes h6 {
29655
+ margin: 6px 0 0;
29656
+ color: var(--settings-text);
29657
+ font-weight: 600;
29658
+ }
29659
+
29660
+ .settings-update-notes h1 {
29661
+ font-size: 18px;
29662
+ line-height: 26px;
29663
+ }
29664
+
29665
+ .settings-update-notes h2 {
29666
+ font-size: 17px;
29667
+ line-height: 24px;
29668
+ }
29669
+
29670
+ .settings-update-notes h3,
29671
+ .settings-update-notes h4,
29672
+ .settings-update-notes h5,
29673
+ .settings-update-notes h6 {
29674
+ font-size: 14px;
29675
+ line-height: 22px;
29676
+ }
29677
+
29678
+ .settings-update-notes p,
29679
+ .settings-update-notes ul,
29680
+ .settings-update-notes ol,
29681
+ .settings-update-notes pre,
29682
+ .settings-update-notes blockquote {
29683
+ margin: 0;
29684
+ }
29685
+
29686
+ .settings-update-notes ul,
29687
+ .settings-update-notes ol {
29688
+ padding-left: 24px;
29689
+ }
29690
+
29691
+ .settings-update-notes li {
29692
+ padding-left: 4px;
29693
+ }
29694
+
29695
+ .settings-update-notes li::marker {
29696
+ color: var(--settings-muted);
29697
+ font-size: 0.85em;
29698
+ }
29699
+
29700
+ .settings-update-notes li + li {
29701
+ margin-top: 14px;
29702
+ }
29703
+
29704
+ .settings-update-notes .release-note-translation {
29705
+ display: block;
29706
+ margin-top: 3px;
29707
+ color: var(--settings-muted);
29708
+ font-size: 13px;
29709
+ line-height: 20px;
29710
+ }
29711
+
29712
+ .settings-update-notes blockquote {
29713
+ padding: 8px 12px;
29714
+ color: var(--settings-muted);
29715
+ border-left: 3px solid var(--settings-focus);
29716
+ background: var(--settings-surface);
29717
+ }
29718
+
29719
+ .settings-update-notes hr {
29720
+ width: 100%;
29721
+ margin: 2px 0;
29722
+ border: 0;
29723
+ border-top: 1px solid var(--settings-divider);
29724
+ }
29725
+
29726
+ .settings-update-notes strong {
29727
+ color: var(--settings-text);
29728
+ font-weight: 600;
29729
+ }
29730
+
29731
+ .settings-update-notes a {
29732
+ color: var(--settings-focus);
29733
+ text-decoration: none;
29734
+ }
29735
+
29736
+ .settings-update-notes a:hover {
29737
+ text-decoration: underline;
29738
+ }
29739
+
29740
+ .settings-update-notes code {
29741
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
29742
+ font-size: 12px;
29743
+ }
29744
+
29745
+ .settings-update-notes :not(pre) > code {
29746
+ padding: 1px 5px;
29747
+ background: var(--settings-surface-strong);
29748
+ border-radius: 4px;
29749
+ }
29750
+
29751
+ .settings-update-notes pre {
29752
+ min-width: 0;
29753
+ max-width: 100%;
29754
+ padding: 10px 12px;
29755
+ overflow-x: auto;
29756
+ overflow-y: hidden;
29757
+ background: var(--settings-inset);
29758
+ border-radius: 6px;
29759
+ }
29760
+
29761
+ .settings-update-notes pre code {
29762
+ line-height: 18px;
29763
+ white-space: pre-wrap;
29764
+ }
29765
+
29766
+ /* Manual update sits directly under the status panel, not behind a disclosure:
29767
+ automatic updates can fail for machine-local reasons and this is the way out. */
29768
+ .settings-update-controls {
29769
+ display: grid;
29770
+ min-width: 0;
29771
+ gap: 10px;
29772
+ margin-top: 24px;
29773
+ }
29774
+
29775
+ .settings-update-manual-title {
29776
+ color: var(--settings-text);
29777
+ font-size: 15px;
29778
+ font-weight: 600;
29779
+ line-height: 22px;
29780
+ }
29781
+
29782
+ .settings-update-manual {
29783
+ display: grid;
29784
+ min-width: 0;
29785
+ gap: 8px;
29786
+ }
29787
+
29788
+ .settings-update-manual[hidden] {
29789
+ display: none;
29790
+ }
29791
+
29792
+ .settings-update-manual-description {
29793
+ margin: 0;
29794
+ color: var(--settings-muted);
29795
+ font-size: 12px;
29796
+ line-height: 18px;
29797
+ }
29798
+
29799
+ .settings-update-manual-description.is-fallback {
29800
+ color: var(--settings-danger);
29801
+ }
29802
+
29803
+ .settings-update-command {
29804
+ display: flex;
29805
+ align-items: stretch;
29806
+ min-width: 0;
29807
+ overflow: hidden;
29808
+ border: 1px solid var(--settings-border);
29809
+ border-radius: 6px;
29810
+ }
29811
+
29812
+ .settings-update-command code {
29813
+ min-width: 0;
29814
+ flex: 1;
29815
+ padding: 9px 12px;
29816
+ overflow-x: auto;
29817
+ color: var(--settings-text);
29818
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
29819
+ font-size: 12px;
29820
+ line-height: 20px;
29821
+ white-space: nowrap;
29822
+ }
29823
+
29824
+ .settings-update-command__copy {
29825
+ display: inline-flex;
29826
+ align-items: center;
29827
+ flex: none;
29828
+ gap: 6px;
29829
+ padding: 0 12px;
29830
+ color: var(--settings-muted);
29831
+ font-size: 12px;
29832
+ background: transparent;
29833
+ border: 0;
29834
+ border-left: 1px solid var(--settings-border);
29835
+ cursor: pointer;
29836
+ }
29837
+
29838
+ .settings-update-command__copy:hover {
29839
+ color: var(--settings-text);
29840
+ background: var(--settings-hover);
29841
+ }
29842
+
29843
+ .settings-update-command__copy:focus-visible {
29844
+ outline: 2px solid var(--settings-focus);
29845
+ outline-offset: -2px;
29846
+ }
29847
+
29848
+ .settings-update-actions {
29849
+ display: flex;
29850
+ align-items: center;
29851
+ min-width: 0;
29852
+ gap: 12px;
29853
+ flex-wrap: wrap;
29854
+ }
29855
+
29856
+ .settings-command-button,
29857
+ .settings-update-link {
29858
+ display: inline-flex;
29859
+ align-items: center;
29860
+ justify-content: center;
29861
+ flex: none;
29862
+ width: max-content;
29863
+ max-width: 100%;
29864
+ min-height: 30px;
29865
+ gap: 6px;
29866
+ padding: 5px 10px;
29867
+ white-space: nowrap;
29868
+ color: var(--settings-primary-text);
29869
+ font: inherit;
29870
+ font-size: 12px;
29871
+ text-decoration: none;
29872
+ background: var(--settings-primary);
29873
+ border: 1px solid var(--settings-primary);
29874
+ border-radius: 7px;
29875
+ cursor: pointer;
29876
+ }
29877
+
29878
+ .settings-command-button--secondary,
29879
+ .settings-update-link {
29880
+ color: var(--settings-muted);
29881
+ background: transparent;
29882
+ border-color: var(--settings-border);
29883
+ }
29884
+
29885
+ .settings-command-button--secondary .codexhost-settings-icon,
29886
+ .settings-update-link .codexhost-settings-icon {
29887
+ color: var(--settings-muted);
29888
+ }
29889
+
29890
+ .settings-command-button:hover:not(.settings-command-button--secondary) {
29891
+ filter: brightness(1.08);
29892
+ }
29893
+
29894
+ .settings-command-button--danger {
29895
+ color: var(--settings-danger);
29896
+ }
29897
+
29898
+ .settings-command-button--danger:hover:not(:disabled) {
29899
+ color: #fecaca;
29900
+ background: var(--settings-danger-bg);
29901
+ border-color: var(--settings-danger-border);
29902
+ }
29903
+
29904
+ .settings-command-button--secondary:hover,
29905
+ .settings-update-link:hover {
29906
+ color: var(--settings-text);
29907
+ background: var(--settings-hover);
29908
+ }
29909
+
29910
+ .settings-command-button--secondary:hover .codexhost-settings-icon,
29911
+ .settings-update-link:hover .codexhost-settings-icon {
29912
+ color: var(--settings-text);
29913
+ }
29914
+
29915
+ .settings-command-button:disabled,
29916
+ .settings-command-button[aria-disabled="true"] {
29917
+ opacity: 0.55;
29918
+ cursor: not-allowed;
29919
+ filter: none;
29920
+ }
29921
+
29922
+ .settings-command-button:focus-visible,
29923
+ .settings-update-link:focus-visible {
29924
+ outline: 2px solid var(--settings-focus);
29925
+ outline-offset: 2px;
29926
+ }
29927
+
29928
+ .settings-visually-hidden {
29929
+ position: absolute;
29930
+ width: 1px;
29931
+ height: 1px;
29932
+ padding: 0;
29933
+ margin: -1px;
29934
+ overflow: hidden;
29935
+ clip: rect(0, 0, 0, 0);
29936
+ white-space: nowrap;
29937
+ border: 0;
29938
+ }
29939
+
29940
+ .settings-session-import-content {
29941
+ display: grid;
29942
+ min-width: 0;
29943
+ gap: 12px;
29944
+ margin-top: 16px;
29945
+ }
29946
+
29947
+ .settings-session-import-list {
29948
+ display: grid;
29949
+ min-width: 0;
29950
+ overflow: hidden;
29951
+ background: var(--settings-surface);
29952
+ border: 1px solid var(--settings-border);
29953
+ border-radius: 12px;
29954
+ }
29955
+
29956
+ .settings-session-import-row {
29957
+ display: grid;
29958
+ grid-template-columns: minmax(0, 1fr) auto;
29959
+ align-items: center;
29960
+ min-width: 0;
29961
+ gap: 16px;
29962
+ padding: 14px 16px;
29963
+ border-bottom: 1px solid var(--settings-divider);
29964
+ }
29965
+
29966
+ .settings-session-import-row:last-child {
29967
+ border-bottom: 0;
29968
+ }
29969
+
29970
+ .settings-session-import-row__copy {
29971
+ display: grid;
29972
+ min-width: 0;
29973
+ gap: 4px;
29974
+ }
29975
+
29976
+ .settings-session-import-row__copy strong {
29977
+ color: var(--settings-text);
29978
+ font-size: 14px;
29979
+ font-weight: 600;
29980
+ line-height: 20px;
29981
+ }
29982
+
29983
+ .settings-session-import-row__copy span,
29984
+ .settings-session-import-row__cwd {
29985
+ min-width: 0;
29986
+ overflow-wrap: anywhere;
29987
+ color: var(--settings-muted);
29988
+ font-size: 12px;
29989
+ line-height: 18px;
29990
+ }
29991
+
29992
+ .settings-session-import-row__cwd {
29993
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
29994
+ }
29995
+
29996
+ .settings-session-import-row__action {
29997
+ display: flex;
29998
+ align-items: center;
29999
+ flex: none;
30000
+ gap: 8px;
30001
+ }
30002
+
30003
+ .settings-session-import-running {
30004
+ color: #f5c542;
30005
+ font-size: 12px;
30006
+ font-weight: 500;
30007
+ line-height: 18px;
30008
+ white-space: nowrap;
30009
+ }
30010
+
30011
+ .settings-session-import-recovery {
30012
+ display: grid;
30013
+ min-width: 0;
30014
+ gap: 12px;
30015
+ padding: 16px;
30016
+ background: var(--settings-surface);
30017
+ border: 1px solid var(--settings-border);
30018
+ border-radius: 12px;
30019
+ }
30020
+
30021
+ .settings-session-import-recovery__copy {
30022
+ display: grid;
30023
+ gap: 6px;
30024
+ }
30025
+
30026
+ .settings-session-import-recovery__copy strong {
30027
+ color: var(--settings-text);
30028
+ font-size: 15px;
30029
+ font-weight: 600;
30030
+ line-height: 22px;
30031
+ }
30032
+
30033
+ .settings-session-import-recovery__copy p {
30034
+ margin: 0;
30035
+ color: var(--settings-muted);
30036
+ font-size: 13px;
30037
+ line-height: 20px;
30038
+ }
30039
+
30040
+ .settings-session-import-recovery__path {
30041
+ display: flex;
30042
+ align-items: center;
30043
+ min-width: 0;
30044
+ gap: 8px;
30045
+ }
30046
+
30047
+ .settings-session-import-recovery__path code {
30048
+ min-width: 0;
30049
+ flex: 1;
30050
+ overflow-wrap: anywhere;
30051
+ color: var(--settings-text);
30052
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
30053
+ font-size: 12px;
30054
+ line-height: 18px;
30055
+ }
30056
+
30057
+ .codexhost-settings-icon {
30058
+ display: block;
30059
+ flex: none;
30060
+ stroke: currentColor;
30061
+ }
30062
+
30063
+ @media (max-width: 720px) {
30064
+ .codexhost-settings-dialog {
30065
+ width: calc(100vw - 16px);
30066
+ height: calc(100vh - var(--settings-titlebar-height) - 16px);
30067
+ border-radius: 10px;
30068
+ }
30069
+
30070
+ .settings-layout {
30071
+ grid-template-columns: minmax(0, 1fr);
30072
+ grid-template-rows: auto minmax(0, 1fr);
30073
+ }
30074
+
30075
+ .settings-sidebar {
30076
+ border-right: 0;
30077
+ border-bottom: 1px solid var(--settings-border);
30078
+ }
30079
+
30080
+ .settings-header {
30081
+ height: 56px;
30082
+ padding-inline: 14px;
30083
+ }
30084
+
30085
+ .settings-sidebar {
30086
+ padding-top: 20px;
30087
+ }
30088
+
30089
+ .settings-nav {
30090
+ flex: none;
30091
+ flex-direction: row;
30092
+ gap: 4px;
30093
+ padding: 7px 8px 8px;
30094
+ overflow-x: auto;
30095
+ overflow-y: hidden;
30096
+ }
30097
+
30098
+ .settings-nav-section-label {
30099
+ display: none;
30100
+ }
30101
+
30102
+ .settings-nav-button {
30103
+ width: auto;
30104
+ min-width: max-content;
30105
+ min-height: 34px;
30106
+ grid-template-columns: 16px auto;
30107
+ border-radius: 10px;
30108
+ }
30109
+
30110
+ .settings-page__content {
30111
+ width: calc(100% - 40px);
30112
+ }
30113
+
30114
+ .settings-page__content {
30115
+ padding-top: 32px;
30116
+ padding-bottom: 32px;
30117
+ }
30118
+
30119
+ .settings-section-label {
30120
+ padding-bottom: 20px;
30121
+ font-size: 20px;
30122
+ line-height: 26px;
30123
+ }
30124
+
30125
+ .settings-update-metadata {
30126
+ grid-template-columns: minmax(0, 1fr);
30127
+ gap: 16px;
30128
+ }
30129
+
30130
+ .settings-status-row {
30131
+ grid-template-columns: minmax(0, 1fr) auto;
30132
+ gap: 16px;
30133
+ }
30134
+
30135
+ .settings-connection-page-header {
30136
+ flex-direction: column;
30137
+ }
30138
+
30139
+ .settings-connection-page-header > .settings-command-button {
30140
+ width: 100%;
30141
+ }
30142
+
30143
+ .settings-session-import-row {
30144
+ grid-template-columns: minmax(0, 1fr);
30145
+ }
30146
+
30147
+ .settings-session-import-row__action {
30148
+ justify-content: flex-start;
30149
+ flex-wrap: wrap;
30150
+ }
30151
+
30152
+ .settings-status-row__detail {
30153
+ grid-column: 1 / -1;
30154
+ margin: -8px 0 0 58px;
30155
+ }
30156
+ }
30157
+
30158
+ @media (forced-colors: active) {
30159
+ :host,
30160
+ :host([data-theme="light"]),
30161
+ :host([data-theme="dark"]) {
30162
+ --settings-bg: Canvas;
30163
+ --settings-sidebar: Canvas;
30164
+ --settings-panel: Canvas;
30165
+ --settings-surface: Canvas;
30166
+ --settings-surface-hover: Highlight;
30167
+ --settings-inset: Canvas;
30168
+ --settings-text: CanvasText;
30169
+ --settings-muted: GrayText;
30170
+ --settings-subtle: GrayText;
30171
+ --settings-border: ButtonBorder;
30172
+ --settings-divider: ButtonBorder;
30173
+ --settings-hover: Highlight;
30174
+ --settings-active: Highlight;
30175
+ --settings-focus: Highlight;
30176
+ --settings-elevated: Canvas;
30177
+ --settings-surface-strong: Canvas;
30178
+ --settings-mark: CanvasText;
30179
+ --settings-primary: ButtonFace;
30180
+ --settings-primary-hover: Highlight;
30181
+ --settings-primary-text: ButtonText;
30182
+ --settings-warning: CanvasText;
30183
+ --settings-warning-bg: Canvas;
30184
+ --settings-warning-border: ButtonBorder;
30185
+ --settings-danger: CanvasText;
30186
+ --settings-danger-bg: Canvas;
30187
+ --settings-danger-border: ButtonBorder;
30188
+ --settings-success: CanvasText;
30189
+ }
30190
+ }
30191
+
30192
+ @media (prefers-reduced-motion: reduce) {
30193
+ *,
30194
+ *::before,
30195
+ *::after {
30196
+ scroll-behavior: auto !important;
30197
+ transition-duration: 0s !important;
30198
+ }
30199
+ }
30200
+ `;
30201
+
30202
+ // src/settings/accounts.css
30203
+ 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-status {\n margin: 0 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin: 0 0 16px;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-text);\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n height: 36px;\n min-width: 180px;\n max-width: 100%;\n margin-right: auto;\n padding: 0 10px;\n color: var(--settings-muted);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-search input {\n flex: 1;\n min-width: 0;\n width: 210px;\n padding: 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-search input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-search:focus-within {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-account-groups {\n display: grid;\n gap: 18px;\n}\n.settings-account-group__title {\n margin: 0 0 8px;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n.settings-account-list {\n overflow: hidden;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n container-type: inline-size;\n}\n.settings-account-list > .settings-account-empty {\n margin: 0;\n padding: 28px 16px;\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: 10px 16px;\n color: var(--settings-muted);\n background: var(--settings-surface);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\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--api th:nth-child(1) {\n width: 48%;\n}\n.settings-account-table--api th:nth-child(2) {\n width: 32%;\n}\n.settings-account-table--api th:nth-child(3) {\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: transparent;\n}\n.settings-account-row:hover {\n background: var(--settings-hover);\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:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n.settings-account-usage__meter--balance {\n display: flex;\n grid-template-columns: none;\n justify-content: flex-start;\n gap: 6px;\n}\n.settings-account-usage__balance {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n font-size: 14px;\n font-weight: 600;\n}\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(--settings-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:not(.settings-segmented__item):not(input) {\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-elevated);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: var(--settings-dialog-shadow);\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: var(--settings-backdrop);\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 .settings-account-table--api .settings-account-usage-cell {\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';
30204
+
30205
+ // src/settings/tailwind.css
30206
+ 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}.blur{--tw-blur:blur(8px);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,)}.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';
30207
+
30208
+ // src/settings/shell.ts
30209
+ var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
30210
+ var RENDERER_SETTINGS_COLOR_SCHEME = "inherit";
30211
+ function isRendererSettingsDialogSupported(dialog) {
30212
+ return typeof dialog.showModal === "function" && typeof dialog.close === "function";
30213
+ }
30214
+ function resolveRendererSettingsTheme(ownerDocument = document) {
30215
+ try {
30216
+ const scheme = ownerDocument.defaultView?.getComputedStyle(ownerDocument.documentElement).colorScheme.toLowerCase();
30217
+ if (scheme?.includes("dark") && !scheme.includes("light")) return "dark";
30218
+ if (scheme?.includes("light") && !scheme.includes("dark")) return "light";
30219
+ } catch {
30220
+ }
30221
+ return "dark";
30222
+ }
30223
+ function applyRendererSettingsTheme(root, ownerDocument) {
30224
+ root.dataset.theme = resolveRendererSettingsTheme(ownerDocument);
30225
+ }
30226
+ function setActiveNavigation(buttons, activePageId) {
30227
+ for (const [pageId, button] of buttons) {
30228
+ if (pageId === activePageId) button.setAttribute("aria-current", "page");
30229
+ else button.removeAttribute("aria-current");
30230
+ }
30231
+ }
30232
+ function mountRendererSettingsShell(registry2, ownerDocument = document, messages = DEFAULT_RENDERER_SETTINGS_MESSAGES) {
30233
+ const resolvedRegistry = registry2 ?? createDefaultRendererSettingsRegistry(messages);
30234
+ if (!ownerDocument.body) throw new Error("Renderer document body is unavailable");
30235
+ if (ownerDocument.querySelector(`[${SETTINGS_SHELL_ATTRIBUTE}]`)) {
30236
+ throw new Error("A codexhost settings shell is already mounted");
30237
+ }
30238
+ const root = ownerDocument.createElement("div");
30239
+ root.setAttribute(SETTINGS_SHELL_ATTRIBUTE, "v1");
30240
+ root.lang = messages.locale;
30241
+ applyRendererSettingsTheme(root, ownerDocument);
30242
+ root.style.colorScheme = RENDERER_SETTINGS_COLOR_SCHEME;
30243
+ const shadow = root.attachShadow({ mode: "open" });
30244
+ const style = ownerDocument.createElement("style");
30245
+ style.textContent = `${tailwind_default}
30246
+ ${shell_default}
30247
+ ${accounts_default}`;
30248
+ const dialog = ownerDocument.createElement("dialog");
30249
+ dialog.className = "codexhost-settings-dialog";
30250
+ const frame = ownerDocument.createElement("div");
30251
+ frame.className = "settings-frame";
30252
+ const header = ownerDocument.createElement("header");
30253
+ header.className = "settings-header";
30254
+ const brand = ownerDocument.createElement("div");
30255
+ brand.className = "settings-brand";
30256
+ const brandMark = ownerDocument.createElement("span");
30257
+ brandMark.className = "settings-brand__mark";
30258
+ brandMark.append(createRendererSettingsBrandIcon(32));
30259
+ const brandCopy = ownerDocument.createElement("span");
30260
+ brandCopy.className = "settings-brand__copy";
30261
+ const brandName = ownerDocument.createElement("span");
30262
+ brandName.className = "settings-brand__name";
30263
+ brandName.textContent = "BOFT CLI";
30264
+ const brandTitle = ownerDocument.createElement("span");
30265
+ brandTitle.className = "settings-brand__title";
30266
+ brandTitle.id = "codexhost-settings-dialog-title";
30267
+ brandTitle.textContent = messages.title;
27149
30268
  brandCopy.append(brandName, brandTitle);
27150
30269
  brand.append(brandMark, brandCopy);
27151
30270
  const headerActions = ownerDocument.createElement("div");
@@ -27349,8 +30468,10 @@ ${accounts_default}`;
27349
30468
 
27350
30469
  // src/settings/trigger.ts
27351
30470
  var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
30471
+ var SETTINGS_HEADER_SURFACE_SELECTOR = '[data-testid="app-shell-header-context-menu-surface"]';
27352
30472
  var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
27353
30473
  var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
30474
+ var SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR = ':scope > [data-app-shell-header-obstacle="true"]';
27354
30475
  function measuredBounds(element) {
27355
30476
  const bounds = element.getBoundingClientRect();
27356
30477
  return {
@@ -27362,11 +30483,23 @@ ${accounts_default}`;
27362
30483
  height: bounds.height
27363
30484
  };
27364
30485
  }
30486
+ function findNativeHeaderActionGroup(header) {
30487
+ const surface = header.querySelector(SETTINGS_HEADER_SURFACE_SELECTOR);
30488
+ if (!surface) return null;
30489
+ const groups = [
30490
+ ...surface.querySelectorAll(SETTINGS_HEADER_NATIVE_ACTION_GROUP_SELECTOR)
30491
+ ];
30492
+ return groups.at(-1) ?? null;
30493
+ }
27365
30494
  function findRendererSettingsHeaderInsertionPoint(ownerDocument) {
27366
30495
  const header = ownerDocument.querySelector(SETTINGS_APPLICATION_HEADER_SELECTOR);
27367
30496
  if (!header) return null;
27368
30497
  const headerBounds = measuredBounds(header);
27369
30498
  if (headerBounds.width <= 0 || headerBounds.height <= 0) return null;
30499
+ const nativeActionGroup = findNativeHeaderActionGroup(header);
30500
+ if (nativeActionGroup?.parentElement) {
30501
+ return { parent: nativeActionGroup.parentElement, before: nativeActionGroup };
30502
+ }
27370
30503
  const endSlot = [...header.querySelectorAll(SETTINGS_HEADER_SLOT_SELECTOR)].filter((slot) => {
27371
30504
  const bounds = measuredBounds(slot);
27372
30505
  return bounds.width > 0 && bounds.height > 0;
@@ -27686,7 +30819,8 @@ ${accounts_default}`;
27686
30819
  }
27687
30820
  await options.openImportedThread(threadId, signal, hostId);
27688
30821
  if (!disposed && !signal.aborted) shell?.close();
27689
- }
30822
+ },
30823
+ options.getLoadedSessionsClient ?? (() => null)
27690
30824
  );
27691
30825
  const nextShell = installRendererSettingsShell(definitions, messages, ownerWindow.document);
27692
30826
  const nextTrigger = installRendererSettingsHeaderTrigger({
@@ -27844,7 +30978,9 @@ ${accounts_default}`;
27844
30978
  muse: harnessIdSchema.parse("muse"),
27845
30979
  "kiro-cli": harnessIdSchema.parse("kiro-cli"),
27846
30980
  codebuddy: harnessIdSchema.parse("codebuddy"),
27847
- "cursor-cli": harnessIdSchema.parse("cursor-cli")
30981
+ "cursor-cli": harnessIdSchema.parse("cursor-cli"),
30982
+ qoder: harnessIdSchema.parse("qoder"),
30983
+ "qoder-cn": harnessIdSchema.parse("qoder-cn")
27848
30984
  };
27849
30985
  var externalAgents = [
27850
30986
  "pi",
@@ -27858,7 +30994,9 @@ ${accounts_default}`;
27858
30994
  "muse",
27859
30995
  "kiro-cli",
27860
30996
  "codebuddy",
27861
- "cursor-cli"
30997
+ "cursor-cli",
30998
+ "qoder",
30999
+ "qoder-cn"
27862
31000
  ];
27863
31001
  function isRetryableHarnessAvailability(availability, error51) {
27864
31002
  return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
@@ -28071,7 +31209,7 @@ ${accounts_default}`;
28071
31209
  throw new Error(`${agent} Thread reported an incompatible transport Model`);
28072
31210
  }
28073
31211
  const model = inspection.effectiveModel ?? transportSelection?.model;
28074
- const thinkingOptionId = selectableThinkingOptionId(inspection) ?? transportSelection?.thinkingOptionId;
31212
+ const thinkingOptionId = inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? transportSelection?.thinkingOptionId;
28075
31213
  const permissionModeId = inspection.effectivePermissionModeId ?? transportSelection?.permissionModeId;
28076
31214
  return {
28077
31215
  agent,
@@ -28166,16 +31304,14 @@ ${accounts_default}`;
28166
31304
  const controllerTarget = (target, hostId) => scopedComposerTarget(target, hostId);
28167
31305
  let usageNotificationDispose = null;
28168
31306
  const localAgentForSidebarThread = (input) => {
28169
- const mountedHostId = modelControl?.currentHostId?.() ?? "local";
28170
- if (input.hostId !== mountedHostId) return null;
28171
31307
  for (const mounted of mountedByComposer.values()) {
28172
31308
  const target = mounted.modelTarget;
28173
- if (target?.[0] === "default" && input.draftId !== null && target[1] === input.draftId) {
28174
- return controller.get(mounted.composer).agent;
28175
- }
28176
- if (target?.[0] === "conversation" && input.threadId !== null && target[1] === input.threadId && mounted.ownershipStatus === "ready") {
28177
- return controller.get(mounted.composer).agent;
28178
- }
31309
+ const matchesDraft = target?.[0] === "default" && input.draftId !== null && target[1] === input.draftId;
31310
+ const matchesConversation = target?.[0] === "conversation" && input.threadId !== null && target[1] === input.threadId && mounted.ownershipStatus === "ready";
31311
+ if (!matchesDraft && !matchesConversation) continue;
31312
+ const mountedHostId = modelControl?.currentHostId?.() ?? "local";
31313
+ if (input.hostId !== mountedHostId) return null;
31314
+ return controller.get(mounted.composer).agent;
28179
31315
  }
28180
31316
  return null;
28181
31317
  };
@@ -28197,6 +31333,7 @@ ${accounts_default}`;
28197
31333
  getUpdateClient: () => modelControl,
28198
31334
  getAccountClient: () => modelControl,
28199
31335
  getConnectionDiagnostics: () => connectionDiagnostics,
31336
+ getLoadedSessionsClient: () => modelClientForHost("local"),
28200
31337
  getSessionImportClient: () => {
28201
31338
  const hostId = activeModelHostId() ?? "local";
28202
31339
  const client = modelClientForHost(hostId);
@@ -28239,7 +31376,9 @@ ${accounts_default}`;
28239
31376
  muse: void 0,
28240
31377
  "kiro-cli": void 0,
28241
31378
  codebuddy: void 0,
28242
- "cursor-cli": void 0
31379
+ "cursor-cli": void 0,
31380
+ qoder: void 0,
31381
+ "qoder-cn": void 0
28243
31382
  },
28244
31383
  webUi: Object.fromEntries(
28245
31384
  externalAgents.map((agent) => [agent, false])
@@ -29238,10 +32377,6 @@ ${accounts_default}`;
29238
32377
  void refreshDraftCodexUsage(mounted);
29239
32378
  }
29240
32379
  };
29241
- const openInstallPage = (agent) => {
29242
- const url2 = RENDERER_AGENT_INSTALL_URLS[agent];
29243
- window.open(url2, "_blank", "noopener,noreferrer");
29244
- };
29245
32380
  function resetHarnessAvailabilityRetry(hostId) {
29246
32381
  const state = hostHarnessAvailabilityState(hostId);
29247
32382
  if (state.retryTimer !== null) {
@@ -29506,7 +32641,6 @@ ${accounts_default}`;
29506
32641
  if (!composer.isConnected || !mounted2) return;
29507
32642
  void switchComposerAgent(mounted2, agent);
29508
32643
  },
29509
- openInstallPage,
29510
32644
  () => {
29511
32645
  void loadCodexAccounts();
29512
32646
  },
@@ -30050,6 +33184,7 @@ lucide/dist/esm/icons/search.mjs:
30050
33184
  lucide/dist/esm/icons/circle-question-mark.mjs:
30051
33185
  lucide/dist/esm/icons/users.mjs:
30052
33186
  lucide/dist/esm/icons/x.mjs:
33187
+ lucide/dist/esm/icons/star.mjs:
30053
33188
  lucide/dist/esm/icons/lock.mjs:
30054
33189
  lucide/dist/esm/icons/shield.mjs:
30055
33190
  lucide/dist/esm/icons/shield-alert.mjs: