@codexhost/cli-darwin-arm64 0.2.1 → 0.2.3

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.
@@ -16429,30 +16429,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16429
16429
  function formatRendererCreditsPercent(value) {
16430
16430
  return `${decimal(value, 1)}%`;
16431
16431
  }
16432
- function rendererUsageTriggerMaxWidth(hasAccountCredits) {
16433
- return hasAccountCredits ? "min(300px, 44vw)" : "min(180px, 30vw)";
16434
- }
16435
- function formatRendererCreditsReset(value) {
16436
- const date5 = new Date(value);
16437
- if (Number.isNaN(date5.getTime())) return value;
16438
- return date5.toLocaleString(void 0, {
16439
- month: "long",
16440
- day: "numeric",
16441
- hour: "numeric",
16442
- minute: "2-digit"
16443
- });
16444
- }
16445
- function creditsPeriodLabel(periodType) {
16446
- if (periodType === "weekly") return "Weekly limit";
16447
- if (periodType === "monthly") return "Monthly limit";
16448
- return "Account limit";
16449
- }
16450
- function productLabel(product) {
16451
- if (product === "GrokBuild") return "Build";
16452
- if (product === "GrokChat") return "Chat";
16453
- if (product === "GrokImagine") return "Imagine";
16454
- if (product === "GrokVoice") return "Voice";
16455
- return product;
16432
+ function rendererUsageTriggerMaxWidth() {
16433
+ return "min(180px, 30vw)";
16456
16434
  }
16457
16435
  function addDetailRow(parent, label, value) {
16458
16436
  const row = document.createElement("div");
@@ -16470,30 +16448,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16470
16448
  row.append(labelElement, valueElement);
16471
16449
  parent.append(row);
16472
16450
  }
16473
- function renderDetails(popover, usage, accountCredits) {
16451
+ function renderDetails(popover, usage) {
16474
16452
  popover.replaceChildren();
16475
16453
  const heading = document.createElement("div");
16476
16454
  heading.textContent = "Usage";
16477
16455
  heading.style.fontWeight = "600";
16478
16456
  heading.style.marginBottom = "6px";
16479
16457
  popover.append(heading);
16480
- if (accountCredits) {
16481
- addDetailRow(
16482
- popover,
16483
- creditsPeriodLabel(accountCredits.periodType),
16484
- formatRendererCreditsPercent(accountCredits.usedPercent)
16485
- );
16486
- if (accountCredits.resetsAt) {
16487
- addDetailRow(popover, "Resets", formatRendererCreditsReset(accountCredits.resetsAt));
16488
- }
16489
- for (const product of accountCredits.productUsage ?? []) {
16490
- addDetailRow(
16491
- popover,
16492
- productLabel(product.product),
16493
- formatRendererCreditsPercent(product.usagePercent)
16494
- );
16495
- }
16496
- }
16497
16458
  if (usage?.contextUsedTokens !== void 0 && usage.contextWindowTokens !== void 0) {
16498
16459
  const contextPercent = usage.contextWindowTokens > 0 ? usage.contextUsedTokens / usage.contextWindowTokens * 100 : null;
16499
16460
  addDetailRow(
@@ -16586,7 +16547,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16586
16547
  trigger.style.display = "inline-flex";
16587
16548
  trigger.style.alignItems = "center";
16588
16549
  trigger.style.width = "fit-content";
16589
- trigger.style.maxWidth = rendererUsageTriggerMaxWidth(false);
16550
+ trigger.style.maxWidth = rendererUsageTriggerMaxWidth();
16590
16551
  trigger.style.height = "24px";
16591
16552
  trigger.style.padding = "0 4px";
16592
16553
  trigger.style.borderRadius = "9999px";
@@ -16689,33 +16650,281 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16689
16650
  document.body.append(popover);
16690
16651
  return control;
16691
16652
  }
16692
- function renderRendererUsageControl(control, usage, accountCredits = null) {
16653
+ function renderRendererUsageControl(control, usage) {
16693
16654
  const cacheHitRatePercent = usage?.cacheHitRatePercent;
16694
16655
  const outputTokensPerSecond = usage?.outputTokensPerSecond;
16695
16656
  const totalCostUsd = usage?.totalCostUsd;
16696
16657
  const hasCacheHitRate = cacheHitRatePercent !== void 0;
16697
16658
  const hasOutputSpeed = outputTokensPerSecond !== void 0;
16698
16659
  const hasCost = totalCostUsd !== void 0;
16699
- const hasCredits = accountCredits !== null;
16700
- const visible = hasCacheHitRate || hasOutputSpeed || hasCost || hasCredits;
16660
+ const visible = hasCacheHitRate || hasOutputSpeed || hasCost;
16701
16661
  control.root.style.display = visible ? "inline-flex" : "none";
16702
16662
  if (!visible) {
16703
16663
  closePopover(control);
16704
16664
  return false;
16705
16665
  }
16706
16666
  const summary = [
16707
- accountCredits ? `${creditsPeriodLabel(accountCredits.periodType)} ${formatRendererCreditsPercent(accountCredits.usedPercent)}` : null,
16708
16667
  cacheHitRatePercent !== void 0 ? formatRendererCacheHitRate(cacheHitRatePercent) : null,
16709
16668
  outputTokensPerSecond !== void 0 ? formatRendererTokenRate(outputTokensPerSecond) : null,
16710
16669
  totalCostUsd !== void 0 ? formatRendererCost(totalCostUsd) : null
16711
16670
  ].filter((value) => value !== null);
16712
16671
  const compactSummary = summary.join(" \xB7 ");
16713
16672
  const accessibleSummary = `Thread Usage: ${compactSummary}`;
16714
- control.trigger.style.maxWidth = rendererUsageTriggerMaxWidth(hasCredits);
16673
+ control.trigger.style.maxWidth = rendererUsageTriggerMaxWidth();
16715
16674
  control.trigger.setAttribute("aria-label", accessibleSummary);
16716
16675
  control.trigger.title = accessibleSummary;
16717
16676
  control.label.textContent = compactSummary;
16718
- renderDetails(control.popover, usage, accountCredits);
16677
+ renderDetails(control.popover, usage);
16678
+ return true;
16679
+ }
16680
+
16681
+ // src/renderer-credits-control.ts
16682
+ function rendererCreditsTone(usedPercent) {
16683
+ if (usedPercent >= 90) return "hot";
16684
+ if (usedPercent >= 70) return "warn";
16685
+ return "ok";
16686
+ }
16687
+ function formatRendererCreditsReset(value) {
16688
+ const date5 = new Date(value);
16689
+ if (Number.isNaN(date5.getTime())) return value;
16690
+ return date5.toLocaleString(void 0, {
16691
+ month: "long",
16692
+ day: "numeric",
16693
+ hour: "numeric",
16694
+ minute: "2-digit"
16695
+ });
16696
+ }
16697
+ function creditsPeriodLabel(periodType) {
16698
+ if (periodType === "weekly") return "Weekly limit";
16699
+ if (periodType === "monthly") return "Monthly limit";
16700
+ return "Account limit";
16701
+ }
16702
+ function productLabel(product) {
16703
+ if (product === "GrokBuild") return "Build";
16704
+ if (product === "GrokChat") return "Chat";
16705
+ if (product === "GrokImagine") return "Imagine";
16706
+ if (product === "GrokVoice") return "Voice";
16707
+ return product;
16708
+ }
16709
+ function toneColor(tone) {
16710
+ if (tone === "hot") return "#c45c4a";
16711
+ if (tone === "warn") return "#c9a227";
16712
+ return "#3d9a64";
16713
+ }
16714
+ function addDetailRow2(parent, label, value) {
16715
+ const row = document.createElement("div");
16716
+ row.style.display = "grid";
16717
+ row.style.gridTemplateColumns = "minmax(0, 1fr) auto";
16718
+ row.style.gap = "20px";
16719
+ row.style.padding = "4px 0";
16720
+ const labelElement = document.createElement("span");
16721
+ labelElement.textContent = label;
16722
+ labelElement.style.color = "color-mix(in srgb, currentColor 68%, transparent)";
16723
+ const valueElement = document.createElement("span");
16724
+ valueElement.textContent = value;
16725
+ valueElement.style.fontVariantNumeric = "tabular-nums";
16726
+ valueElement.style.textAlign = "right";
16727
+ row.append(labelElement, valueElement);
16728
+ parent.append(row);
16729
+ }
16730
+ function renderDetails2(popover, credits) {
16731
+ popover.replaceChildren();
16732
+ const heading = document.createElement("div");
16733
+ heading.textContent = creditsPeriodLabel(credits.periodType);
16734
+ heading.style.fontWeight = "600";
16735
+ heading.style.marginBottom = "6px";
16736
+ popover.append(heading);
16737
+ addDetailRow2(popover, "Used", formatRendererCreditsPercent(credits.usedPercent));
16738
+ if (credits.resetsAt) {
16739
+ addDetailRow2(popover, "Resets", formatRendererCreditsReset(credits.resetsAt));
16740
+ }
16741
+ for (const product of credits.productUsage ?? []) {
16742
+ addDetailRow2(
16743
+ popover,
16744
+ productLabel(product.product),
16745
+ formatRendererCreditsPercent(product.usagePercent)
16746
+ );
16747
+ }
16748
+ }
16749
+ function popoverIsOpen2(popover) {
16750
+ try {
16751
+ return popover.matches(":popover-open");
16752
+ } catch {
16753
+ return !popover.hidden;
16754
+ }
16755
+ }
16756
+ function positionPopover2(control) {
16757
+ const triggerRect = control.trigger.getBoundingClientRect();
16758
+ const width = Math.min(280, Math.max(220, window.innerWidth - 24));
16759
+ const left = Math.max(12, Math.min(triggerRect.left, window.innerWidth - width - 12));
16760
+ control.popover.style.width = `${width}px`;
16761
+ control.popover.style.left = `${left}px`;
16762
+ control.popover.style.right = "auto";
16763
+ control.popover.style.top = "auto";
16764
+ control.popover.style.bottom = `${Math.max(12, window.innerHeight - triggerRect.top + 8)}px`;
16765
+ }
16766
+ function closePopover2(control) {
16767
+ if (popoverIsOpen2(control.popover) && typeof control.popover.hidePopover === "function") {
16768
+ control.popover.hidePopover();
16769
+ }
16770
+ control.popover.hidden = true;
16771
+ control.trigger.setAttribute("aria-expanded", "false");
16772
+ }
16773
+ function openPopover2(control) {
16774
+ positionPopover2(control);
16775
+ control.popover.hidden = false;
16776
+ if (typeof control.popover.showPopover === "function" && !popoverIsOpen2(control.popover)) {
16777
+ control.popover.showPopover();
16778
+ }
16779
+ control.trigger.setAttribute("aria-expanded", "true");
16780
+ }
16781
+ function togglePopover2(control) {
16782
+ if (control.trigger.getAttribute("aria-expanded") === "true") closePopover2(control);
16783
+ else openPopover2(control);
16784
+ }
16785
+ function mountRendererCreditsControl(composerId, nativeModelClassName) {
16786
+ const root = document.createElement("div");
16787
+ root.dataset.codexhostCreditsControl = composerId;
16788
+ root.className = "relative min-w-0";
16789
+ root.style.display = "none";
16790
+ const trigger = document.createElement("button");
16791
+ const syncNativeModelClassName = (className) => {
16792
+ trigger.className = className?.trim() || RENDERER_MODEL_TRIGGER_FALLBACK_CLASSES;
16793
+ };
16794
+ syncNativeModelClassName(nativeModelClassName);
16795
+ trigger.type = "button";
16796
+ trigger.setAttribute("aria-haspopup", "dialog");
16797
+ trigger.setAttribute("aria-expanded", "false");
16798
+ trigger.setAttribute("aria-label", "Account limit");
16799
+ trigger.title = "Account limit";
16800
+ trigger.style.display = "inline-flex";
16801
+ trigger.style.alignItems = "center";
16802
+ trigger.style.gap = "5px";
16803
+ trigger.style.width = "fit-content";
16804
+ trigger.style.maxWidth = "min(72px, 18vw)";
16805
+ trigger.style.height = "24px";
16806
+ trigger.style.padding = "0 6px";
16807
+ trigger.style.borderRadius = "9999px";
16808
+ trigger.style.fontSize = "12px";
16809
+ trigger.style.lineHeight = "16px";
16810
+ trigger.style.fontVariantNumeric = "tabular-nums";
16811
+ trigger.style.letterSpacing = "0";
16812
+ trigger.style.whiteSpace = "nowrap";
16813
+ trigger.style.cursor = "pointer";
16814
+ const dot = document.createElement("span");
16815
+ dot.dataset.codexhostCreditsDot = "";
16816
+ dot.setAttribute("aria-hidden", "true");
16817
+ dot.style.display = "inline-block";
16818
+ dot.style.width = "7px";
16819
+ dot.style.height = "7px";
16820
+ dot.style.borderRadius = "9999px";
16821
+ dot.style.flex = "0 0 auto";
16822
+ const label = document.createElement("span");
16823
+ label.dataset.codexhostCreditsLabel = "";
16824
+ label.style.display = "inline-block";
16825
+ label.style.maxWidth = "100%";
16826
+ label.style.overflow = "hidden";
16827
+ label.style.textOverflow = "ellipsis";
16828
+ label.style.whiteSpace = "nowrap";
16829
+ trigger.append(dot, label);
16830
+ const popover = document.createElement("div");
16831
+ popover.id = `${composerId}-credits-popover`;
16832
+ popover.setAttribute("role", "dialog");
16833
+ popover.setAttribute("aria-label", "Account limit details");
16834
+ popover.setAttribute("popover", "auto");
16835
+ popover.hidden = typeof popover.showPopover !== "function";
16836
+ popover.style.position = "fixed";
16837
+ popover.style.inset = "auto";
16838
+ popover.style.width = "240px";
16839
+ popover.style.maxWidth = "min(280px, calc(100vw - 24px))";
16840
+ popover.style.padding = "10px 12px";
16841
+ popover.style.border = "1px solid rgba(127, 127, 127, 0.35)";
16842
+ popover.style.borderRadius = "6px";
16843
+ popover.style.background = "Canvas";
16844
+ popover.style.color = "CanvasText";
16845
+ popover.style.boxShadow = "0 8px 24px rgba(0, 0, 0, 0.28)";
16846
+ popover.style.font = "13px/1.35 system-ui, sans-serif";
16847
+ popover.style.letterSpacing = "0";
16848
+ popover.style.zIndex = "2147483647";
16849
+ trigger.setAttribute("aria-controls", popover.id);
16850
+ let placementReference = null;
16851
+ const control = {
16852
+ root,
16853
+ trigger,
16854
+ popover,
16855
+ anchor: null,
16856
+ syncNativeModelClassName,
16857
+ dispose() {
16858
+ closePopover2(control);
16859
+ if (closeTimer !== null) window.clearTimeout(closeTimer);
16860
+ root.remove();
16861
+ popover.remove();
16862
+ placementReference = null;
16863
+ },
16864
+ place(anchor) {
16865
+ if (!anchor?.parentElement) return false;
16866
+ const parent = anchor.parentElement;
16867
+ const next = anchor.nextElementSibling;
16868
+ if (control.anchor === anchor && placementReference === anchor && root.parentElement === parent && root.previousElementSibling === anchor) {
16869
+ return true;
16870
+ }
16871
+ control.anchor = anchor;
16872
+ placementReference = anchor;
16873
+ if (next && next !== root) parent.insertBefore(root, next);
16874
+ else if (next !== root) parent.append(root);
16875
+ return true;
16876
+ }
16877
+ };
16878
+ let closeTimer = null;
16879
+ const cancelClose = () => {
16880
+ if (closeTimer === null) return;
16881
+ window.clearTimeout(closeTimer);
16882
+ closeTimer = null;
16883
+ };
16884
+ const scheduleClose = () => {
16885
+ cancelClose();
16886
+ closeTimer = window.setTimeout(() => {
16887
+ closeTimer = null;
16888
+ if (!trigger.matches(":hover") && !popover.matches(":hover")) closePopover2(control);
16889
+ }, 140);
16890
+ };
16891
+ trigger.addEventListener("click", () => togglePopover2(control));
16892
+ trigger.addEventListener("pointerenter", () => {
16893
+ cancelClose();
16894
+ openPopover2(control);
16895
+ });
16896
+ trigger.addEventListener("pointerleave", scheduleClose);
16897
+ trigger.addEventListener("focus", () => {
16898
+ cancelClose();
16899
+ openPopover2(control);
16900
+ });
16901
+ trigger.addEventListener("blur", scheduleClose);
16902
+ popover.addEventListener("pointerenter", cancelClose);
16903
+ popover.addEventListener("pointerleave", scheduleClose);
16904
+ popover.addEventListener("toggle", () => {
16905
+ trigger.setAttribute("aria-expanded", String(popoverIsOpen2(popover)));
16906
+ });
16907
+ root.append(trigger);
16908
+ document.body.append(popover);
16909
+ return control;
16910
+ }
16911
+ function renderRendererCreditsControl(control, accountCredits) {
16912
+ if (accountCredits === null) {
16913
+ control.root.style.display = "none";
16914
+ closePopover2(control);
16915
+ return false;
16916
+ }
16917
+ const percent = formatRendererCreditsPercent(accountCredits.usedPercent);
16918
+ const title = `${creditsPeriodLabel(accountCredits.periodType)} ${percent}`;
16919
+ const tone = rendererCreditsTone(accountCredits.usedPercent);
16920
+ const dot = control.trigger.querySelector("[data-codexhost-credits-dot]");
16921
+ const label = control.trigger.querySelector("[data-codexhost-credits-label]");
16922
+ if (dot) dot.style.background = toneColor(tone);
16923
+ if (label) label.textContent = percent;
16924
+ control.root.style.display = "inline-flex";
16925
+ control.trigger.setAttribute("aria-label", title);
16926
+ control.trigger.title = title;
16927
+ renderDetails2(control.popover, accountCredits);
16719
16928
  return true;
16720
16929
  }
16721
16930
 
@@ -16830,7 +17039,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16830
17039
  }
16831
17040
  var contextUsageDescriptionPattern = /(context|token|上下文|令牌)/iu;
16832
17041
  function isNativeContextUsageControlCandidate(element) {
16833
- if (element.hasAttribute("data-codexhost-usage-control")) return false;
17042
+ if (element.hasAttribute("data-codexhost-usage-control") || element.hasAttribute("data-codexhost-credits-control")) {
17043
+ return false;
17044
+ }
16834
17045
  const description = [
16835
17046
  element.getAttribute("aria-label"),
16836
17047
  element.getAttribute("title"),
@@ -16863,6 +17074,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16863
17074
  const candidate = nativeModelControlForComposer(control.composer);
16864
17075
  if (!candidate) {
16865
17076
  control.usage.syncNativeModelClassName();
17077
+ control.credits.syncNativeModelClassName();
16866
17078
  return;
16867
17079
  }
16868
17080
  if (candidate !== control.nativeModelControl?.element) {
@@ -16871,6 +17083,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16871
17083
  syncRendererModelTriggerClass(control.modelPicker, candidate.className);
16872
17084
  }
16873
17085
  control.usage.syncNativeModelClassName(candidate.className);
17086
+ control.credits.syncNativeModelClassName(candidate.className);
16874
17087
  }
16875
17088
  function usagePlacementAnchor(control) {
16876
17089
  const context = nativeContextUsageControlForComposer(control.composer);
@@ -16880,14 +17093,44 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16880
17093
  const native = control.nativeModelControl?.element;
16881
17094
  return native?.parentElement ? native : null;
16882
17095
  }
17096
+ function firstMaterialChild(parent) {
17097
+ for (const child of parent.children) {
17098
+ if (typeof child.hasAttribute !== "function") continue;
17099
+ const element = child;
17100
+ if (element.hasAttribute("data-codexhost-credits-control")) continue;
17101
+ return element;
17102
+ }
17103
+ return null;
17104
+ }
17105
+ function creditsPlacementAnchor(composer, usageRoot) {
17106
+ let current = usageRoot;
17107
+ while (current && current !== composer) {
17108
+ const parent = current.parentElement;
17109
+ if (!parent) break;
17110
+ const first = firstMaterialChild(parent);
17111
+ if (first && first !== current && !first.contains(usageRoot)) return first;
17112
+ if (parent === composer) break;
17113
+ current = parent;
17114
+ }
17115
+ return null;
17116
+ }
16883
17117
  function refreshUsagePlacement(control) {
16884
17118
  const anchor = usagePlacementAnchor(control);
16885
17119
  if (!anchor) {
16886
17120
  if (control.usage.anchor) control.usage.root.remove();
16887
17121
  control.usage.anchor = null;
17122
+ if (control.credits.anchor) control.credits.root.remove();
17123
+ control.credits.anchor = null;
16888
17124
  return;
16889
17125
  }
16890
17126
  control.usage.place(anchor);
17127
+ const leading = creditsPlacementAnchor(control.composer, control.usage.root);
17128
+ if (!leading) {
17129
+ if (control.credits.anchor) control.credits.root.remove();
17130
+ control.credits.anchor = null;
17131
+ return;
17132
+ }
17133
+ control.credits.place(leading);
16891
17134
  }
16892
17135
  function refreshNativePermissionModeControl(control) {
16893
17136
  const semanticCandidate = semanticNativePermissionModeControlForComposer(control.composer);
@@ -16942,6 +17185,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16942
17185
  onSelectPermissionMode
16943
17186
  );
16944
17187
  const usage = mountRendererUsageControl(composerId, nativeModelControl?.element.className);
17188
+ const credits = mountRendererCreditsControl(composerId, nativeModelControl?.element.className);
16945
17189
  const permissionParent = nativePermissionModeControl?.element.parentElement;
16946
17190
  if (permissionParent && nativePermissionModeControl && nativePermissionModeControlVerified) {
16947
17191
  permissionParent.insertBefore(permissionModePicker.root, nativePermissionModeControl.element);
@@ -16964,6 +17208,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16964
17208
  nativeModelControl,
16965
17209
  nativePermissionModeControl,
16966
17210
  nativePermissionModeControlVerified,
17211
+ credits,
16967
17212
  usage,
16968
17213
  sendButton,
16969
17214
  sendDisabledBeforeSwitch: null
@@ -17008,7 +17253,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17008
17253
  permissionModeView,
17009
17254
  permissionModeVisible
17010
17255
  );
17011
- renderRendererUsageControl(control.usage, usage, accountCredits);
17256
+ renderRendererUsageControl(control.usage, usage);
17257
+ renderRendererCreditsControl(control.credits, accountCredits);
17012
17258
  }
17013
17259
  function disposeComposerAgentControl(control) {
17014
17260
  if (control.sendDisabledBeforeSwitch !== null) {
@@ -17016,6 +17262,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17016
17262
  }
17017
17263
  restoreNativeControl(control.nativeModelControl);
17018
17264
  restoreNativeControl(control.nativePermissionModeControl);
17265
+ control.credits.dispose();
17019
17266
  control.usage.dispose();
17020
17267
  control.permissionModePicker.dispose();
17021
17268
  control.modelPicker.dispose();
@@ -18610,9 +18857,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18610
18857
 
18611
18858
  // src/settings/release-notes.ts
18612
18859
  var HEADING_PATTERN = /^(#{1,6})[ \t]+(.+?)\s*$/u;
18860
+ var BLOCKQUOTE_PATTERN = /^>[ \t]?(.*?)\s*$/u;
18613
18861
  var UNORDERED_ITEM_PATTERN = /^[-*][ \t]+(.+?)\s*$/u;
18862
+ var CONTINUATION_PATTERN = /^[ \t]+(.+?)\s*$/u;
18614
18863
  var ORDERED_ITEM_PATTERN = /^\d+[.)][ \t]+(.+?)\s*$/u;
18615
18864
  var FENCE_PATTERN = /^```([\w+-]*)\s*$/u;
18865
+ var THEMATIC_BREAK_PATTERN = /^(?:---|___|\*\*\*)[ \t]*$/u;
18616
18866
  var INLINE_PATTERN = /(`+)((?:(?!\1).)+)\1|\*\*(.+?)\*\*|\[([^\]]+)\]\(([^)\s]+)\)/gu;
18617
18867
  function createReleaseNotesElement(document2, markdown) {
18618
18868
  const root = document2.createElement("div");
@@ -18643,6 +18893,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18643
18893
  index += 1;
18644
18894
  continue;
18645
18895
  }
18896
+ if (BLOCKQUOTE_PATTERN.test(line)) {
18897
+ index = appendBlockquote(document2, root, lines, index);
18898
+ continue;
18899
+ }
18900
+ if (THEMATIC_BREAK_PATTERN.test(line)) {
18901
+ root.append(document2.createElement("hr"));
18902
+ index += 1;
18903
+ continue;
18904
+ }
18646
18905
  if (UNORDERED_ITEM_PATTERN.test(line)) {
18647
18906
  index = appendList(document2, root, lines, index, "ul", UNORDERED_ITEM_PATTERN);
18648
18907
  continue;
@@ -18670,6 +18929,22 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18670
18929
  root.append(pre);
18671
18930
  return index;
18672
18931
  }
18932
+ function appendBlockquote(document2, root, lines, start) {
18933
+ const blockquote = document2.createElement("blockquote");
18934
+ const content = [];
18935
+ let index = start;
18936
+ while (index < lines.length) {
18937
+ const match = BLOCKQUOTE_PATTERN.exec(lines[index] ?? "");
18938
+ if (!match) break;
18939
+ content.push(match[1] ?? "");
18940
+ index += 1;
18941
+ }
18942
+ const paragraph = document2.createElement("p");
18943
+ appendInline(document2, paragraph, content.join(" ").trim());
18944
+ blockquote.append(paragraph);
18945
+ root.append(blockquote);
18946
+ return index;
18947
+ }
18673
18948
  function appendList(document2, root, lines, start, tag, pattern) {
18674
18949
  const list = document2.createElement(tag);
18675
18950
  let index = start;
@@ -18678,8 +18953,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18678
18953
  if (!item?.[1]) break;
18679
18954
  const entry = document2.createElement("li");
18680
18955
  appendInline(document2, entry, item[1]);
18681
- list.append(entry);
18682
18956
  index += 1;
18957
+ const continuationLines = [];
18958
+ while (index < lines.length) {
18959
+ const continuation = CONTINUATION_PATTERN.exec(lines[index] ?? "");
18960
+ if (!continuation?.[1]) break;
18961
+ continuationLines.push(continuation[1]);
18962
+ index += 1;
18963
+ }
18964
+ if (continuationLines.length > 0) {
18965
+ const continuation = document2.createElement("span");
18966
+ continuation.className = "release-note-translation";
18967
+ appendInline(document2, continuation, continuationLines.join(" "));
18968
+ entry.append(continuation);
18969
+ }
18970
+ list.append(entry);
18683
18971
  }
18684
18972
  root.append(list);
18685
18973
  return index;
@@ -18689,14 +18977,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18689
18977
  let index = start;
18690
18978
  while (index < lines.length) {
18691
18979
  const current = lines[index] ?? "";
18692
- if (current.trim().length === 0 || FENCE_PATTERN.test(current) || HEADING_PATTERN.test(current) || UNORDERED_ITEM_PATTERN.test(current) || ORDERED_ITEM_PATTERN.test(current)) {
18980
+ if (current.trim().length === 0 || FENCE_PATTERN.test(current) || HEADING_PATTERN.test(current) || BLOCKQUOTE_PATTERN.test(current) || THEMATIC_BREAK_PATTERN.test(current) || UNORDERED_ITEM_PATTERN.test(current) || ORDERED_ITEM_PATTERN.test(current)) {
18693
18981
  break;
18694
18982
  }
18695
18983
  paragraphLines.push(current.trim());
18696
18984
  index += 1;
18697
18985
  }
18698
18986
  const paragraph = document2.createElement("p");
18699
- appendInline(document2, paragraph, paragraphLines.join(" "));
18987
+ paragraphLines.forEach((line, lineIndex) => {
18988
+ appendInline(document2, paragraph, line);
18989
+ if (lineIndex < paragraphLines.length - 1) paragraph.append(document2.createElement("br"));
18990
+ });
18700
18991
  root.append(paragraph);
18701
18992
  return index;
18702
18993
  }
@@ -18714,17 +19005,30 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18714
19005
  strong.textContent = match[3];
18715
19006
  parent.append(strong);
18716
19007
  } else {
18717
- const link = document2.createElement("a");
18718
- link.textContent = match[4] ?? "";
18719
- link.setAttribute("href", match[5] ?? "");
18720
- link.setAttribute("target", "_blank");
18721
- link.setAttribute("rel", "noopener noreferrer");
18722
- parent.append(link);
19008
+ const href = match[5] ?? "";
19009
+ if (!isSafeLink(href)) {
19010
+ parent.append(match[4] ?? "");
19011
+ } else {
19012
+ const link = document2.createElement("a");
19013
+ link.textContent = match[4] ?? "";
19014
+ link.setAttribute("href", href);
19015
+ link.setAttribute("target", "_blank");
19016
+ link.setAttribute("rel", "noopener noreferrer");
19017
+ parent.append(link);
19018
+ }
18723
19019
  }
18724
19020
  lastIndex = index + match[0].length;
18725
19021
  }
18726
19022
  if (lastIndex < text.length) parent.append(text.slice(lastIndex));
18727
19023
  }
19024
+ function isSafeLink(href) {
19025
+ try {
19026
+ const url2 = new URL(href, "https://codexhost.invalid");
19027
+ return url2.protocol === "http:" || url2.protocol === "https:";
19028
+ } catch {
19029
+ return false;
19030
+ }
19031
+ }
18728
19032
 
18729
19033
  // src/settings/update-request.ts
18730
19034
  var RENDERER_UPDATE_REQUEST_TIMEOUT_MS = 15e3;
@@ -19089,7 +19393,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19089
19393
  }
19090
19394
 
19091
19395
  // src/settings/shell.css
19092
- var shell_default = ':host {\n --settings-bg: #181818;\n --settings-sidebar: #1c1c1c;\n --settings-panel: transparent;\n --settings-text: #f5f5f5;\n --settings-muted: #a1a1a1;\n --settings-border: rgb(255 255 255 / 10%);\n --settings-divider: rgb(255 255 255 / 10%);\n --settings-hover: rgb(255 255 255 / 6%);\n --settings-active: rgb(51 156 255 / 12%);\n --settings-focus: #339cff;\n color: var(--settings-text);\n color-scheme: dark;\n font:\n 14px/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(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: 0 24px 64px rgb(0 0 0 / 38%);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: rgb(0 0 0 / 52%);\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: 240px 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: 28px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 64px;\n flex: none;\n padding: 0 16px;\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-icon-button.settings-star-link {\n width: auto;\n gap: 6px;\n padding-inline: 8px;\n font-size: 12px;\n line-height: 18px;\n text-decoration: none;\n border: 2px dashed #f5c542;\n white-space: nowrap;\n}\n\n.settings-star-link .codexhost-settings-icon {\n color: #f5c542;\n fill: currentColor;\n stroke: currentColor;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-brand__mark {\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-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 32px;\n height: 32px;\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: 14px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 14px;\n padding-left: 14px;\n color: var(--settings-muted);\n font-size: 14px;\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: 4px;\n padding: 0 12px 16px;\n overflow-y: auto;\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: 40px;\n flex: none;\n gap: 12px;\n padding: 8px 12px;\n color: var(--settings-text);\n font-size: 14px;\n line-height: 21px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 18px;\n height: 18px;\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-focus);\n}\n\n.settings-nav-button[aria-current="page"]::before {\n position: absolute;\n left: 0;\n width: 3px;\n height: 22px;\n content: "";\n background: var(--settings-focus);\n border-radius: 0 3px 3px 0;\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: 44px 0 56px;\n}\n\n.settings-section-label {\n min-height: auto;\n padding: 0 0 28px;\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\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: 88px;\n gap: 28px;\n padding: 16px 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: 14px;\n font-size: 15px;\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: 44px;\n height: 44px;\n flex: none;\n color: var(--settings-muted);\n background: rgb(255 255 255 / 7%);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 5px 12px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 500;\n line-height: 18px;\n background: rgb(255 255 255 / 9%);\n border: 1px solid rgb(255 255 255 / 6%);\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-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-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(2, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-update-panel {\n display: grid;\n gap: 16px;\n min-height: 128px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel > strong,\n.settings-update-panel > span,\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-panel > span,\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: #ef4444;\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: #238be8;\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-notes {\n display: grid;\n gap: 10px;\n max-height: 320px;\n overflow: auto;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\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: 16px;\n line-height: 24px;\n}\n\n.settings-update-notes h2 {\n font-size: 15px;\n line-height: 22px;\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: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 20px;\n}\n\n.settings-update-notes li + li {\n margin-top: 4px;\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: #7cb8ff;\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: rgb(255 255 255 / 8%);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n padding: 10px 12px;\n overflow: auto;\n background: rgb(0 0 0 / 28%);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n.settings-update-version-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-height: 32px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-update-version-row strong {\n color: var(--settings-text);\n font-size: 15px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 6px;\n margin-top: 14px;\n padding-inline: 4px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual code {\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.settings-update-actions {\n display: flex;\n min-width: 0;\n margin-top: 16px;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n min-height: 36px;\n gap: 8px;\n padding: 8px 12px;\n color: white;\n font: inherit;\n font-size: 13px;\n text-decoration: none;\n background: #1677d2;\n border: 1px solid #238be8;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover,\n.settings-update-link:hover {\n filter: brightness(1.08);\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-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-icon-button.settings-star-link {\n width: 28px;\n padding: 0;\n }\n\n .settings-star-link span {\n display: none;\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-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-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\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="dark"]) {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n }\n}\n';
19396
+ var shell_default = ':host {\n --settings-bg: #181818;\n --settings-sidebar: #1c1c1c;\n --settings-panel: transparent;\n --settings-text: #f5f5f5;\n --settings-muted: #a1a1a1;\n --settings-border: rgb(255 255 255 / 10%);\n --settings-divider: rgb(255 255 255 / 10%);\n --settings-hover: rgb(255 255 255 / 6%);\n --settings-active: rgb(51 156 255 / 12%);\n --settings-focus: #339cff;\n color: var(--settings-text);\n color-scheme: dark;\n font:\n 14px/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(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n box-shadow: 0 24px 64px rgb(0 0 0 / 38%);\n}\n\n.codexhost-settings-dialog::backdrop {\n background: rgb(0 0 0 / 52%);\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: 240px 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: 28px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 64px;\n flex: none;\n padding: 0 16px;\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-icon-button.settings-star-link {\n width: auto;\n gap: 6px;\n padding-inline: 8px;\n font-size: 12px;\n line-height: 18px;\n text-decoration: none;\n border: 2px dashed #f5c542;\n white-space: nowrap;\n}\n\n.settings-star-link .codexhost-settings-icon {\n color: #f5c542;\n fill: currentColor;\n stroke: currentColor;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-brand__mark {\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-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 32px;\n height: 32px;\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: 14px;\n font-weight: 500;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 14px;\n padding-left: 14px;\n color: var(--settings-muted);\n font-size: 14px;\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: 4px;\n padding: 0 12px 16px;\n overflow-y: auto;\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: 40px;\n flex: none;\n gap: 12px;\n padding: 8px 12px;\n color: var(--settings-text);\n font-size: 14px;\n line-height: 21px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 10px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 18px;\n height: 18px;\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-focus);\n}\n\n.settings-nav-button[aria-current="page"]::before {\n position: absolute;\n left: 0;\n width: 3px;\n height: 22px;\n content: "";\n background: var(--settings-focus);\n border-radius: 0 3px 3px 0;\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: 44px 0 56px;\n}\n\n.settings-section-label {\n min-height: auto;\n padding: 0 0 28px;\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 600;\n line-height: 30px;\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: 88px;\n gap: 28px;\n padding: 16px 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: 14px;\n font-size: 15px;\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: 44px;\n height: 44px;\n flex: none;\n color: var(--settings-muted);\n background: rgb(255 255 255 / 7%);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 5px 12px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 500;\n line-height: 18px;\n background: rgb(255 255 255 / 9%);\n border: 1px solid rgb(255 255 255 / 6%);\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-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-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(2, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-update-panel {\n display: grid;\n gap: 16px;\n min-height: 128px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel > strong,\n.settings-update-panel > span,\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-panel > span,\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: #ef4444;\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: #238be8;\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\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: rgb(255 255 255 / 4%);\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: #7cb8ff;\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: rgb(255 255 255 / 8%);\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: rgb(0 0 0 / 28%);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n.settings-update-version-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-height: 32px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-update-version-row strong {\n color: var(--settings-text);\n font-size: 15px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 6px;\n margin-top: 14px;\n padding-inline: 4px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual code {\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.settings-update-actions {\n display: flex;\n min-width: 0;\n margin-top: 16px;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: fit-content;\n min-height: 36px;\n gap: 8px;\n padding: 8px 12px;\n color: white;\n font: inherit;\n font-size: 13px;\n text-decoration: none;\n background: #1677d2;\n border: 1px solid #238be8;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: transparent;\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover,\n.settings-update-link:hover {\n filter: brightness(1.08);\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-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-icon-button.settings-star-link {\n width: 28px;\n padding: 0;\n }\n\n .settings-star-link span {\n display: none;\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-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-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\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="dark"]) {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n }\n}\n';
19093
19397
 
19094
19398
  // src/settings/shell.ts
19095
19399
  var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
package/bin/codexhost CHANGED
Binary file