opencode-navigator 0.27.3 → 0.27.4

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.
@@ -56,11 +56,16 @@ function remainingLabel(seconds) {
56
56
  }
57
57
  function resetCreditLifetime(credit, now) {
58
58
  const expiry = credit.expiresAt;
59
- if (expiry === void 0 || !Number.isFinite(expiry) || expiry <= 0) return {
59
+ if (expiry === void 0) return {
60
60
  label: "Expiry not supplied by the provider",
61
61
  remaining: void 0,
62
62
  expired: false
63
63
  };
64
+ if (!Number.isFinite(expiry) || expiry <= 0 || !Number.isFinite((/* @__PURE__ */ new Date(expiry * 1e3)).getTime())) return {
65
+ label: "Expiry date is invalid",
66
+ remaining: void 0,
67
+ expired: false
68
+ };
64
69
  const seconds = Math.max(0, expiry - now / 1e3);
65
70
  const lifetime = expiry - credit.grantedAt;
66
71
  const remaining = Number.isFinite(credit.grantedAt) && credit.grantedAt >= 0 && lifetime > 0 ? Math.max(0, Math.min(1, seconds / lifetime)) : void 0;
@@ -4713,7 +4718,7 @@ function preferencesIpc(pluginID) {
4713
4718
  var main = (context) => {
4714
4719
  const store = desktopPreferencesStore();
4715
4720
  const readAccount = createMainAccountReader(context);
4716
- const codex = createNodeCodexClient({ version: "0.27.3" });
4721
+ const codex = createNodeCodexClient({ version: "0.27.4" });
4717
4722
  context.onCleanup(codex.dispose);
4718
4723
  context.provide(preferencesIpc(context.id), createMainPreferencesHandlers(store));
4719
4724
  context.provide(localAccountIpc(context.id), { read: readAccount });
@@ -4721,7 +4726,7 @@ var main = (context) => {
4721
4726
  const updateImpl = createMainPluginUpdate(context, () => updateProvider.changed());
4722
4727
  const updateProvider = context.provide(pluginUpdateIpc(context.id), updateImpl);
4723
4728
  context.provide(bugReportIpc(context.id), createMainBugReport(context.signal));
4724
- context.log.write("info", `Navigator 0.27.3 Desktop main ready`);
4729
+ context.log.write("info", `Navigator 0.27.4 Desktop main ready`);
4725
4730
  };
4726
4731
  // src/pages/navigator/ui/gui/context.tsx
4727
4732
  var NavigatorGuiContext = (0, solid_js.createContext)();
@@ -4731,11 +4736,11 @@ function useNavigatorGui() {
4731
4736
  return services;
4732
4737
  }
4733
4738
  // src/pages/navigator/ui/gui/bookmark.tsx
4734
- var _tmpl$$60 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=width:24px;flex-shrink:0><button type=button style=width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:4px;color:inherit><svg width=12 height=16 viewBox="0 0 14 18"aria-hidden=true><path d="M3 2H11V15L7 12L3 15Z"stroke=currentColor stroke-width=1.5>`);
4739
+ var _tmpl$$61 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=width:24px;flex-shrink:0><button type=button style=width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:4px;color:inherit><svg width=12 height=16 viewBox="0 0 14 18"aria-hidden=true><path d="M3 2H11V15L7 12L3 15Z"stroke=currentColor stroke-width=1.5>`);
4735
4740
  function SidebarBookmark(props) {
4736
4741
  const label = () => `${props.selected ? "Unbookmark" : "Bookmark"} ${props.title}`;
4737
4742
  return (() => {
4738
- var _el$ = _tmpl$$60(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild;
4743
+ var _el$ = _tmpl$$61(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild;
4739
4744
  _el$2.$$click = (event) => {
4740
4745
  event.stopPropagation();
4741
4746
  props.toggle();
@@ -4764,10 +4769,11 @@ function SidebarBookmark(props) {
4764
4769
  }
4765
4770
  (0, solid_js_web.delegateEvents)(["click"]);
4766
4771
  // src/pages/navigator/ui/gui/catalog-row.tsx
4767
- var _tmpl$$59 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0"><button type=button style=flex:1;min-width:0;display:flex;gap:6px;align-items:center;text-align:left;padding:4px;color:inherit;border:0;border-radius:6px><span style=min-width:0;flex:1><span style=display:block;overflow-wrap:anywhere></span><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
4772
+ var _tmpl$$60 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0">`);
4773
+ var _tmpl$2$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<button type=button style=flex:1;min-width:0;display:flex;gap:6px;align-items:center;text-align:left;padding:4px;color:inherit;border:0;border-radius:6px><span style=min-width:0;flex:1><span style=display:block;overflow-wrap:anywhere></span><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
4768
4774
  function navigate$1(event) {
4769
4775
  if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
4770
- const buttons = [...event.currentTarget.querySelectorAll("button:not(:disabled)")];
4776
+ const buttons = [...event.currentTarget.querySelectorAll("button:not(:disabled), input[role=\"switch\"]:not(:disabled)")];
4771
4777
  const index = buttons.indexOf(event.target);
4772
4778
  const next = Math.max(0, Math.min(buttons.length - 1, index + (event.key === "ArrowRight" ? 1 : -1)));
4773
4779
  if (index === -1 || next === index) return;
@@ -4779,7 +4785,7 @@ function CatalogRow(props) {
4779
4785
  const [hovered, setHovered] = (0, solid_js.createSignal)(false);
4780
4786
  const [focused, setFocused] = (0, solid_js.createSignal)(false);
4781
4787
  return (() => {
4782
- var _el$ = _tmpl$$59(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
4788
+ var _el$ = _tmpl$$60();
4783
4789
  _el$.$$keydown = navigate$1;
4784
4790
  _el$.$$focusout = (event) => {
4785
4791
  if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
@@ -4803,24 +4809,28 @@ function CatalogRow(props) {
4803
4809
  get toggle() {
4804
4810
  return props.bookmark;
4805
4811
  }
4806
- }), _el$2);
4807
- _el$2.$$click = (event) => {
4808
- event.stopPropagation();
4809
- if (!props.disabled) props.activate();
4810
- };
4811
- (0, solid_js_web.insert)(_el$2, () => props.leading, _el$3);
4812
- (0, solid_js_web.insert)(_el$4, () => props.title);
4813
- (0, solid_js_web.insert)(_el$5, () => props.details);
4812
+ }), null);
4813
+ (0, solid_js_web.insert)(_el$, () => props.content ?? (() => {
4814
+ var _el$2 = _tmpl$2$39(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
4815
+ _el$2.$$click = (event) => {
4816
+ event.stopPropagation();
4817
+ if (!props.disabled) props.activate?.();
4818
+ };
4819
+ (0, solid_js_web.insert)(_el$2, () => props.leading, _el$3);
4820
+ (0, solid_js_web.insert)(_el$4, () => props.title);
4821
+ (0, solid_js_web.insert)(_el$5, () => props.details);
4822
+ (0, solid_js_web.effect)((_p$) => {
4823
+ var _v$ = props.disabled, _v$2 = hovered() || focused() ? "var(--v2-overlay-simple-overlay-hover, transparent)" : "transparent";
4824
+ _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$2, "aria-disabled", _p$.e = _v$);
4825
+ _v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$2, "background", _p$.t = _v$2);
4826
+ return _p$;
4827
+ }, {
4828
+ e: void 0,
4829
+ t: void 0
4830
+ });
4831
+ return _el$2;
4832
+ })(), null);
4814
4833
  (0, solid_js_web.insert)(_el$, () => props.trailing, null);
4815
- (0, solid_js_web.effect)((_p$) => {
4816
- var _v$ = props.disabled, _v$2 = hovered() || focused() ? "var(--v2-overlay-simple-overlay-hover, transparent)" : "transparent";
4817
- _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$2, "aria-disabled", _p$.e = _v$);
4818
- _v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$2, "background", _p$.t = _v$2);
4819
- return _p$;
4820
- }, {
4821
- e: void 0,
4822
- t: void 0
4823
- });
4824
4834
  return _el$;
4825
4835
  })();
4826
4836
  }
@@ -4881,14 +4891,14 @@ function GuiActionRow(props) {
4881
4891
  });
4882
4892
  }
4883
4893
  // src/pages/navigator/ui/gui/section.tsx
4884
- var _tmpl$$58 = /*#__PURE__*/ (0, solid_js_web.template)(`<section style=min-width:0><div style=display:flex;gap:8px;align-items:center;min-width:0><h2 style=flex:1;min-width:0;font-size:13px;font-weight:600;margin:0><button type=button style="display:flex;gap:6px;align-items:center;width:100%;padding:3px 0;color:inherit;background:transparent;border:0;text-align:left"><span aria-hidden=true data-navigator-disclosure style=display:inline-flex;width:16px;height:16px;flex-shrink:0;align-items:center;justify-content:center></span><span style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></span><span style=opacity:0.55;font-weight:400>`);
4894
+ var _tmpl$$59 = /*#__PURE__*/ (0, solid_js_web.template)(`<section style=min-width:0><div style=display:flex;gap:8px;align-items:center;min-width:0><h2 style=flex:1;min-width:0;font-size:13px;font-weight:600;margin:0><button type=button style="display:flex;gap:6px;align-items:center;width:100%;padding:3px 0;color:inherit;background:transparent;border:0;text-align:left"><span aria-hidden=true data-navigator-disclosure style=display:inline-flex;width:16px;height:16px;flex-shrink:0;align-items:center;justify-content:center></span><span style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></span><span style=opacity:0.55;font-weight:400>`);
4885
4895
  function MonitoringSection(props) {
4886
4896
  const services = useNavigatorGui();
4887
4897
  const preferences = () => services.runtime.catalogs?.preferences;
4888
4898
  const expanded = () => preferences()?.expanded()[props.id] ?? true;
4889
4899
  const Icon = services.ui.Icon;
4890
4900
  return (() => {
4891
- var _el$ = _tmpl$$58(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
4901
+ var _el$ = _tmpl$$59(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
4892
4902
  _el$4.$$click = () => preferences()?.toggleSectionExpanded(props.id);
4893
4903
  (0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(Icon, {
4894
4904
  name: "chevron-down",
@@ -4921,11 +4931,11 @@ function MonitoringSection(props) {
4921
4931
  }
4922
4932
  (0, solid_js_web.delegateEvents)(["click"]);
4923
4933
  // src/pages/navigator/ui/gui/section-filter.tsx
4924
- var _tmpl$$57 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
4934
+ var _tmpl$$58 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
4925
4935
  function SectionFilter(props) {
4926
4936
  const TextInput = useNavigatorGui().ui.TextInput;
4927
4937
  return (() => {
4928
- var _el$ = _tmpl$$57();
4938
+ var _el$ = _tmpl$$58();
4929
4939
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
4930
4940
  get label() {
4931
4941
  return props.label;
@@ -4945,9 +4955,9 @@ function SectionFilter(props) {
4945
4955
  })();
4946
4956
  }
4947
4957
  // src/pages/navigator/ui/gui/actions-section.tsx
4948
- var _tmpl$$56 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching actions.`);
4958
+ var _tmpl$$57 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching actions.`);
4949
4959
  var _tmpl$2$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
4950
- var _tmpl$3$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none>`);
4960
+ var _tmpl$3$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none>`);
4951
4961
  function ActionsSection() {
4952
4962
  const services = useNavigatorGui();
4953
4963
  const catalogs = () => services.runtime.catalogs;
@@ -4978,7 +4988,7 @@ function ActionsSection() {
4978
4988
  return [true, false].filter((selected) => view().visibility.visible().some((id) => catalogs().preferences.favoriteQuickActions().has(id) === selected));
4979
4989
  },
4980
4990
  children: (selected) => (() => {
4981
- var _el$3 = _tmpl$3$24();
4991
+ var _el$3 = _tmpl$3$25();
4982
4992
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
4983
4993
  get each() {
4984
4994
  return view().visibility.visible().filter((id) => catalogs().preferences.favoriteQuickActions().has(id) === selected);
@@ -4993,7 +5003,7 @@ function ActionsSection() {
4993
5003
  return view().filtered().length === 0;
4994
5004
  },
4995
5005
  get children() {
4996
- return _tmpl$$56();
5006
+ return _tmpl$$57();
4997
5007
  }
4998
5008
  }), null);
4999
5009
  return _el$;
@@ -5018,9 +5028,9 @@ function ActionsSection() {
5018
5028
  });
5019
5029
  }
5020
5030
  // src/shared/ui/gui/tabs.tsx
5021
- var _tmpl$$55 = /*#__PURE__*/ (0, solid_js_web.template)(`<nav style=display:flex;gap:4px;flex-wrap:wrap>`);
5031
+ var _tmpl$$56 = /*#__PURE__*/ (0, solid_js_web.template)(`<nav style=display:flex;gap:4px;flex-wrap:wrap>`);
5022
5032
  var _tmpl$2$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<span>`);
5023
- var _tmpl$3$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
5033
+ var _tmpl$3$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
5024
5034
  function GuiTabs(props) {
5025
5035
  const Button = props.ui.Button;
5026
5036
  function navigate(event) {
@@ -5029,12 +5039,14 @@ function GuiTabs(props) {
5029
5039
  if (enabled.length === 0) return;
5030
5040
  event.preventDefault();
5031
5041
  event.stopPropagation();
5032
- const next = (enabled.findIndex((option) => option.id === props.selected) + (event.key === "ArrowRight" ? 1 : -1) + enabled.length) % enabled.length;
5042
+ const buttons = [...event.currentTarget.querySelectorAll("button:not(:disabled)")];
5043
+ const focused = buttons.indexOf(event.target);
5044
+ const next = ((focused === -1 ? enabled.findIndex((option) => option.id === props.selected) : focused) + (event.key === "ArrowRight" ? 1 : -1) + enabled.length) % enabled.length;
5033
5045
  props.onSelect(enabled[next].id);
5034
- event.currentTarget.querySelectorAll("button:not(:disabled)")[next]?.focus();
5046
+ buttons[next]?.focus();
5035
5047
  }
5036
5048
  return (() => {
5037
- var _el$ = _tmpl$$55();
5049
+ var _el$ = _tmpl$$56();
5038
5050
  _el$.$$keydown = navigate;
5039
5051
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
5040
5052
  get each() {
@@ -5062,7 +5074,7 @@ function GuiTabs(props) {
5062
5074
  return option().count !== void 0;
5063
5075
  },
5064
5076
  get children() {
5065
- var _el$3 = _tmpl$3$23();
5077
+ var _el$3 = _tmpl$3$24();
5066
5078
  (0, solid_js_web.insert)(_el$3, () => option().count);
5067
5079
  return _el$3;
5068
5080
  }
@@ -5127,9 +5139,9 @@ function iconChoiceLabel(id) {
5127
5139
  return id.replaceAll("-", " ");
5128
5140
  }
5129
5141
  // src/shared/ui/gui/icon.tsx
5130
- var _tmpl$$54 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style=display:inline-flex;width:18px;height:18px;flex-shrink:0;align-items:center;justify-content:center>`);
5142
+ var _tmpl$$55 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style=display:inline-flex;width:18px;height:18px;flex-shrink:0;align-items:center;justify-content:center>`);
5131
5143
  var _tmpl$2$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg width=16 height=16 viewBox="0 0 24 26"fill=none stroke=currentColor stroke-width=1.7 stroke-linecap=round stroke-linejoin=round>`);
5132
- var _tmpl$3$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path></svg>`, false, true, false);
5144
+ var _tmpl$3$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path></svg>`, false, true, false);
5133
5145
  var native = {
5134
5146
  plus: "plus",
5135
5147
  check: "check",
@@ -5195,7 +5207,7 @@ function GuiIcon(props) {
5195
5207
  const Icon = props.ui.Icon;
5196
5208
  const id = () => isIconChoiceId(props.id) ? props.id : "bolt";
5197
5209
  return (() => {
5198
- var _el$ = _tmpl$$54();
5210
+ var _el$ = _tmpl$$55();
5199
5211
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
5200
5212
  get when() {
5201
5213
  return native[id()];
@@ -5208,7 +5220,7 @@ function GuiIcon(props) {
5208
5220
  return paths[id()] ?? paths.bolt;
5209
5221
  },
5210
5222
  children: (path) => (() => {
5211
- var _el$3 = _tmpl$3$22();
5223
+ var _el$3 = _tmpl$3$23();
5212
5224
  (0, solid_js_web.setAttribute)(_el$3, "d", path);
5213
5225
  return _el$3;
5214
5226
  })()
@@ -5227,12 +5239,12 @@ function GuiIcon(props) {
5227
5239
  })();
5228
5240
  }
5229
5241
  // src/shared/ui/gui/multiline-field.tsx
5230
- var _tmpl$$53 = /*#__PURE__*/ (0, solid_js_web.template)(`<label style=display:grid;gap:8px><span></span><textarea style="width:100%;box-sizing:border-box;min-height:160px;max-height:40vh;resize:vertical;color:var(--v2-text-text-base, inherit);background:var(--v2-background-bg-base, transparent);border:0;caret-color:var(--v2-text-text-base, auto);border-radius:6px;padding:8px;font:inherit">`);
5242
+ var _tmpl$$54 = /*#__PURE__*/ (0, solid_js_web.template)(`<label style=display:grid;gap:8px><span></span><textarea style="width:100%;box-sizing:border-box;min-height:160px;max-height:40vh;resize:vertical;color:var(--v2-text-text-base, inherit);background:var(--v2-background-bg-base, transparent);border:0;caret-color:var(--v2-text-text-base, auto);border-radius:6px;padding:8px;font:inherit">`);
5231
5243
  function GuiMultilineField(props) {
5232
5244
  const id = (0, solid_js.createUniqueId)();
5233
5245
  const [focused, setFocused] = (0, solid_js.createSignal)(false);
5234
5246
  return (() => {
5235
- var _el$ = _tmpl$$53(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
5247
+ var _el$ = _tmpl$$54(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
5236
5248
  (0, solid_js_web.setAttribute)(_el$, "for", id);
5237
5249
  (0, solid_js_web.insert)(_el$2, () => props.label);
5238
5250
  _el$3.$$input = (event) => props.onInput(event.currentTarget.value);
@@ -5258,7 +5270,7 @@ function GuiMultilineField(props) {
5258
5270
  }
5259
5271
  (0, solid_js_web.delegateEvents)(["input"]);
5260
5272
  // src/shared/ui/gui/group-control.tsx
5261
- var _tmpl$$52 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
5273
+ var _tmpl$$53 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
5262
5274
  function GuiGroupControl(props) {
5263
5275
  const Select = props.ui.Select;
5264
5276
  const TextInput = props.ui.TextInput;
@@ -5267,7 +5279,7 @@ function GuiGroupControl(props) {
5267
5279
  const [creating, setCreating] = (0, solid_js.createSignal)(false);
5268
5280
  (0, solid_js.createEffect)(() => setDraft(props.value ?? ""));
5269
5281
  return (() => {
5270
- var _el$ = _tmpl$$52();
5282
+ var _el$ = _tmpl$$53();
5271
5283
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Select, {
5272
5284
  get label() {
5273
5285
  return `${props.label} existing group`;
@@ -5357,10 +5369,10 @@ function GuiGroupControl(props) {
5357
5369
  })();
5358
5370
  }
5359
5371
  // src/shared/ui/gui/settings-surface.tsx
5360
- var _tmpl$$51 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-settings><style>\n[data-navigator-settings] \{ display: grid; gap: 32px; min-width: 0; container-type: inline-size; }\n[data-navigator-settings] [data-component="settings-row"] \{ display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; gap: 20px; }\n[data-navigator-settings] [data-slot="settings-row-copy"] \{ min-width: 0; overflow-wrap: anywhere; }\n[data-navigator-settings] :is(button, input, textarea, [role="switch"]) \{ scroll-margin-block: 96px; }\n[data-navigator-settings] [data-slot="settings-row-control"] \{ min-width: 0; max-width: 100%; width: 100%; flex-wrap: wrap; gap: 8px; }\n[data-navigator-settings] [data-slot="settings-row-control"] > * \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-slot="settings-row-control"] > div:not([data-component]) \{ width: 100%; flex-wrap: wrap; }\n[data-navigator-settings] [data-component="button-v2"] \{ white-space: normal; height: auto; min-height: 24px; overflow-wrap: anywhere; }\n[data-navigator-settings] [data-component="text-input-v2"] \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-sortable-item]:not(:last-of-type) > [data-component="settings-row"] \{ border-bottom: 0.5px solid var(--v2-border-border-base); }\n@container (max-width: 640px) \{\n [data-navigator-settings] [data-component="settings-row"] \{ grid-template-columns: minmax(0, 1fr); gap: 12px; }\n [data-navigator-settings] [data-slot="settings-row-control"] \{ justify-content: flex-start; }\n}\n`);
5372
+ var _tmpl$$52 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-settings><style>\n[data-navigator-settings] \{ display: grid; gap: 32px; min-width: 0; container-type: inline-size; }\n[data-navigator-settings] [data-component="settings-row"] \{ display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; gap: 20px; }\n[data-navigator-settings] [data-slot="settings-row-copy"] \{ min-width: 0; overflow-wrap: anywhere; }\n[data-navigator-settings] :is(button, input, textarea, [role="switch"]) \{ scroll-margin-block: 96px; }\n[data-navigator-settings] [data-slot="settings-row-control"] \{ min-width: 0; max-width: 100%; width: 100%; flex-wrap: wrap; gap: 8px; }\n[data-navigator-settings] [data-slot="settings-row-control"] > * \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-slot="settings-row-control"] > div:not([data-component]) \{ width: 100%; flex-wrap: wrap; }\n[data-navigator-settings] [data-component="button-v2"] \{ white-space: normal; height: auto; min-height: 24px; overflow-wrap: anywhere; }\n[data-navigator-settings] [data-component="text-input-v2"] \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-sortable-item]:not(:last-of-type) > [data-component="settings-row"] \{ border-bottom: 0.5px solid var(--v2-border-border-base); }\n@container (max-width: 640px) \{\n [data-navigator-settings] [data-component="settings-row"] \{ grid-template-columns: minmax(0, 1fr); gap: 12px; }\n [data-navigator-settings] [data-slot="settings-row-control"] \{ justify-content: flex-start; }\n}\n`);
5361
5373
  function GuiSettingsSurface(props) {
5362
5374
  return (() => {
5363
- var _el$ = _tmpl$$51();
5375
+ var _el$ = _tmpl$$52();
5364
5376
  _el$.firstChild;
5365
5377
  (0, solid_js_web.insert)(_el$, () => props.children, null);
5366
5378
  return _el$;
@@ -5500,9 +5512,9 @@ function createSortableInteraction(props) {
5500
5512
  };
5501
5513
  }
5502
5514
  // src/shared/ui/gui/sortable-list.tsx
5503
- var _tmpl$$50 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=list><span role=status aria-live=polite style=position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)>Drag a handle, or press Space, use arrow keys, then Space to drop. Escape cancels. `);
5515
+ var _tmpl$$51 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=list><span role=status aria-live=polite style=position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)>Drag a handle, or press Space, use arrow keys, then Space to drop. Escape cancels. `);
5504
5516
  var _tmpl$2$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=listitem>`);
5505
- var _tmpl$3$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<span title="Drag to reorder, or Space, arrow keys, Space. Escape cancels."style=display:inline-flex;touch-action:none;cursor:grab>`);
5517
+ var _tmpl$3$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<span title="Drag to reorder, or Space, arrow keys, Space. Escape cancels."style=display:inline-flex;touch-action:none;cursor:grab>`);
5506
5518
  function GuiSortableList(props) {
5507
5519
  let root;
5508
5520
  const help = (0, solid_js.createUniqueId)();
@@ -5521,7 +5533,7 @@ function GuiSortableList(props) {
5521
5533
  move: (from, to) => props.move(from, to)
5522
5534
  });
5523
5535
  return (() => {
5524
- var _el$ = _tmpl$$50(), _el$2 = _el$.firstChild;
5536
+ var _el$ = _tmpl$$51(), _el$2 = _el$.firstChild;
5525
5537
  _el$2.firstChild;
5526
5538
  (0, solid_js_web.addEventListener)(_el$, "lostpointercapture", interaction.cancel);
5527
5539
  (0, solid_js_web.addEventListener)(_el$, "pointercancel", interaction.cancel);
@@ -5543,7 +5555,7 @@ function GuiSortableList(props) {
5543
5555
  var _el$4 = _tmpl$2$35();
5544
5556
  (0, solid_js_web.setAttribute)(_el$4, "data-sortable-item", key);
5545
5557
  (0, solid_js_web.insert)(_el$4, () => props.children(item, (() => {
5546
- var _el$5 = _tmpl$3$21();
5558
+ var _el$5 = _tmpl$3$22();
5547
5559
  _el$5.$$keydown = (event) => interaction.key(event, key);
5548
5560
  _el$5.$$pointerdown = (event) => interaction.start(event, key);
5549
5561
  (0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(IconButton, {
@@ -5589,11 +5601,11 @@ function GuiSortableList(props) {
5589
5601
  "keydown"
5590
5602
  ]);
5591
5603
  // src/shared/ui/gui/progress.tsx
5592
- var _tmpl$$49 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=progressbar aria-valuemin=0 aria-valuemax=100 style=display:grid;gap:6px;min-width:0><style>@keyframes navigator-install-pulse \{ from \{ transform: translateX(-100%); } to \{ transform: translateX(400%); } }\n@media (prefers-reduced-motion: reduce) \{ [data-navigator-install-pulse] \{ animation: none !important; } }</style><span style=display:flex;gap:6px;align-items:center></span><span style=display:block;height:3px;overflow:hidden;background:var(--v2-border-border-base)><span style=display:block;height:100%;background:var(--v2-text-text-base)>`);
5604
+ var _tmpl$$50 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=progressbar aria-valuemin=0 aria-valuemax=100 style=display:grid;gap:6px;min-width:0><style>@keyframes navigator-install-pulse \{ from \{ transform: translateX(-100%); } to \{ transform: translateX(400%); } }\n@media (prefers-reduced-motion: reduce) \{ [data-navigator-install-pulse] \{ animation: none !important; } }</style><span style=display:flex;gap:6px;align-items:center></span><span style=display:block;height:3px;overflow:hidden;background:var(--v2-border-border-base)><span style=display:block;height:100%;background:var(--v2-text-text-base)>`);
5593
5605
  function GuiProgress(props) {
5594
5606
  const Loader = props.ui.Loader;
5595
5607
  return (() => {
5596
- var _el$ = _tmpl$$49(), _el$3 = _el$.firstChild.nextSibling, _el$5 = _el$3.nextSibling.firstChild;
5608
+ var _el$ = _tmpl$$50(), _el$3 = _el$.firstChild.nextSibling, _el$5 = _el$3.nextSibling.firstChild;
5597
5609
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.Show, {
5598
5610
  get when() {
5599
5611
  return props.value === void 0;
@@ -5657,11 +5669,11 @@ function GuiIconAction(props) {
5657
5669
  });
5658
5670
  }
5659
5671
  // src/pages/navigator/ui/gui/quota-window.tsx
5660
- var _tmpl$$48 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="min-width:0;margin:12px 0"><div role=meter aria-valuemin=0 aria-valuemax=100 style="height:2px;background:color-mix(in srgb, currentColor 10%, transparent)"><div style=height:100%;background:currentColor;opacity:0.5></div></div><div style=display:flex;gap:8px;font-size:12px;margin-top:5px><span style=opacity:0.6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1></span><span style=flex-shrink:0>`);
5672
+ var _tmpl$$49 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="min-width:0;margin:12px 0"><div role=meter aria-valuemin=0 aria-valuemax=100 style="height:2px;background:color-mix(in srgb, currentColor 10%, transparent)"><div style=height:100%;background:currentColor;opacity:0.5></div></div><div style=display:flex;gap:8px;font-size:12px;margin-top:5px><span style=opacity:0.6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1></span><span style=flex-shrink:0>`);
5661
5673
  function GuiQuotaWindow(props) {
5662
5674
  const view = () => quotaPresentation(props.window);
5663
5675
  return (() => {
5664
- var _el$ = _tmpl$$48(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$2.nextSibling.firstChild, _el$6 = _el$5.nextSibling;
5676
+ var _el$ = _tmpl$$49(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$2.nextSibling.firstChild, _el$6 = _el$5.nextSibling;
5665
5677
  (0, solid_js_web.insert)(_el$5, () => view().reset);
5666
5678
  (0, solid_js_web.insert)(_el$6, () => view().value);
5667
5679
  (0, solid_js_web.effect)((_p$) => {
@@ -5683,9 +5695,9 @@ function GuiQuotaWindow(props) {
5683
5695
  })();
5684
5696
  }
5685
5697
  // src/pages/navigator/ui/gui/limits-section.tsx
5686
- var _tmpl$$47 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5698
+ var _tmpl$$48 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5687
5699
  var _tmpl$2$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>`);
5688
- var _tmpl$3$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
5700
+ var _tmpl$3$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
5689
5701
  function LimitsSection() {
5690
5702
  const props = useNavigatorGui();
5691
5703
  const limits = () => props.runtime.limits;
@@ -5752,7 +5764,7 @@ function LimitsSection() {
5752
5764
  return state()?.error;
5753
5765
  },
5754
5766
  get children() {
5755
- var _el$ = _tmpl$$47();
5767
+ var _el$ = _tmpl$$48();
5756
5768
  (0, solid_js_web.insert)(_el$, () => state()?.error?.message);
5757
5769
  return _el$;
5758
5770
  }
@@ -5781,7 +5793,7 @@ function LimitsSection() {
5781
5793
  return value().balances;
5782
5794
  },
5783
5795
  children: (balance) => (() => {
5784
- var _el$3 = _tmpl$3$20(), _el$4 = _el$3.firstChild;
5796
+ var _el$3 = _tmpl$3$21(), _el$4 = _el$3.firstChild;
5785
5797
  (0, solid_js_web.insert)(_el$3, () => balance.label, _el$4);
5786
5798
  (0, solid_js_web.insert)(_el$3, (() => {
5787
5799
  var _c$ = (0, solid_js_web.memo)(() => !!balance.unlimited);
@@ -6249,44 +6261,17 @@ function createMcpModel(options, persist, preferences) {
6249
6261
  }
6250
6262
  };
6251
6263
  }
6252
- // src/pages/navigator/ui/gui/mcp-indicator.tsx
6253
- var _tmpl$$46 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style="display:inline-flex;width:12px;height:12px;flex-shrink:0;border-radius:50%;border:1px solid currentColor">`);
6254
- var _tmpl$2$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=img style=display:inline-flex;width:16px;height:16px;flex-shrink:0;align-items:center;justify-content:center>`);
6255
- function McpIndicator(props) {
6256
- const Loader = useNavigatorGui().ui.Loader;
6257
- return (() => {
6258
- var _el$ = _tmpl$2$33();
6259
- (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
6260
- get when() {
6261
- return props.status !== "pending";
6262
- },
6263
- get fallback() {
6264
- return (0, solid_js_web.createComponent)(Loader, { size: "small" });
6265
- },
6266
- get children() {
6267
- var _el$2 = _tmpl$$46();
6268
- (0, solid_js_web.effect)((_p$) => {
6269
- var _v$ = props.status === "connected" ? "currentColor" : "transparent", _v$2 = props.status === "failed" ? 1 : .65;
6270
- _v$ !== _p$.e && (0, solid_js_web.setStyleProperty)(_el$2, "background", _p$.e = _v$);
6271
- _v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$2, "opacity", _p$.t = _v$2);
6272
- return _p$;
6273
- }, {
6274
- e: void 0,
6275
- t: void 0
6276
- });
6277
- return _el$2;
6278
- }
6279
- }));
6280
- (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$, "aria-label", props.status));
6281
- return _el$;
6282
- })();
6283
- }
6284
6264
  // src/pages/navigator/ui/gui/mcp-row.tsx
6265
+ var _tmpl$$47 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status> Updating connection…`);
6266
+ var _tmpl$2$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=flex:1;min-width:0;overflow-wrap:anywhere>`);
6285
6267
  function GuiMcpRow(props) {
6286
6268
  const services = useNavigatorGui();
6287
6269
  const catalogs = () => services.runtime.catalogs;
6288
6270
  const state = () => catalogs().mcp.serverState(props.item.name);
6289
6271
  const error = () => props.item.error || state().error?.message;
6272
+ const Switch = services.ui.Switch;
6273
+ const Loader = services.ui.Loader;
6274
+ const busy = () => state().status === "loading" || props.item.status === "pending";
6290
6275
  return (0, solid_js_web.createComponent)(CatalogRow, {
6291
6276
  get title() {
6292
6277
  return props.item.name;
@@ -6301,15 +6286,38 @@ function GuiMcpRow(props) {
6301
6286
  return !catalogs().preferences.ready();
6302
6287
  },
6303
6288
  bookmark: () => catalogs().preferences.toggleFavoriteMcpServer(props.item.name),
6304
- get leading() {
6305
- return (0, solid_js_web.createComponent)(McpIndicator, { get status() {
6306
- return (0, solid_js_web.memo)(() => state().status === "loading")() ? "pending" : props.item.status;
6307
- } });
6308
- },
6309
- get disabled() {
6310
- return !mcpToggleAction(props.item.status) || state().status === "loading";
6289
+ get content() {
6290
+ return (() => {
6291
+ var _el$ = _tmpl$2$33();
6292
+ (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Switch, {
6293
+ get label() {
6294
+ return props.item.name;
6295
+ },
6296
+ get description() {
6297
+ return props.item.title;
6298
+ },
6299
+ get checked() {
6300
+ return props.item.status === "connected";
6301
+ },
6302
+ get disabled() {
6303
+ return !mcpToggleAction(props.item.status) || catalogs().mcp.mutating() || busy();
6304
+ },
6305
+ onChange: () => void catalogs().mcp.toggle(props.item.name).catch(() => {})
6306
+ }), null);
6307
+ (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
6308
+ get when() {
6309
+ return busy();
6310
+ },
6311
+ get children() {
6312
+ var _el$2 = _tmpl$$47(), _el$3 = _el$2.firstChild;
6313
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$3);
6314
+ return _el$2;
6315
+ }
6316
+ }), null);
6317
+ (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$, "aria-busy", busy()));
6318
+ return _el$;
6319
+ })();
6311
6320
  },
6312
- activate: () => void catalogs().mcp.toggle(props.item.name).catch(() => {}),
6313
6321
  get trailing() {
6314
6322
  return (0, solid_js_web.createComponent)(solid_js.Show, {
6315
6323
  get when() {
@@ -6335,44 +6343,67 @@ function GuiMcpRow(props) {
6335
6343
  });
6336
6344
  }
6337
6345
  // src/pages/navigator/ui/gui/mcp-group.tsx
6338
- var _tmpl$$45 = /*#__PURE__*/ (0, solid_js_web.template)(`<strong style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap>`);
6346
+ var _tmpl$$46 = /*#__PURE__*/ (0, solid_js_web.template)(`<strong style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap>`);
6339
6347
  var _tmpl$2$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
6340
- var _tmpl$3$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
6348
+ var _tmpl$3$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status>`);
6349
+ var _tmpl$4$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><div style=display:flex;gap:6px;align-items:center;min-width:0></div><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
6341
6350
  function GuiMcpGroup(props) {
6342
6351
  const services = useNavigatorGui();
6343
6352
  const catalogs = () => services.runtime.catalogs;
6344
6353
  const view = () => catalogs().views.mcp;
6345
6354
  const bucket = () => view().bucket(props.group);
6346
6355
  const busy = () => catalogs().mcp.bulkState().group === props.group && catalogs().mcp.bulkState().status === "running";
6356
+ const Switch = services.ui.Switch;
6357
+ const Loader = services.ui.Loader;
6347
6358
  const Button = services.ui.Button;
6359
+ const disabled = () => catalogs().mcp.mutating() || !mcpGroupToggleAction(bucket());
6360
+ const toggle = () => void catalogs().mcp.toggleGroup(props.group, bucket().map((item) => item.name))?.catch(() => {});
6348
6361
  return (() => {
6349
- var _el$ = _tmpl$3$19(), _el$4 = _el$.firstChild;
6350
- (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
6351
- variant: "ghost",
6362
+ var _el$ = _tmpl$4$14(), _el$2 = _el$.firstChild, _el$6 = _el$2.nextSibling;
6363
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Switch, {
6364
+ get label() {
6365
+ return `${props.group} MCP group`;
6366
+ },
6367
+ hideLabel: true,
6368
+ get checked() {
6369
+ return mcpGroupStatus(bucket()) === "connected";
6370
+ },
6371
+ get disabled() {
6372
+ return disabled();
6373
+ },
6374
+ onChange: toggle
6375
+ }), null);
6376
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
6352
6377
  size: "small",
6378
+ variant: "ghost",
6353
6379
  get disabled() {
6354
- return catalogs().mcp.mutating();
6380
+ return disabled();
6355
6381
  },
6356
- onClick: () => void catalogs().mcp.toggleGroup(props.group, bucket().map((item) => item.name))?.catch(() => {}),
6382
+ onClick: toggle,
6357
6383
  get children() {
6358
- return [
6359
- (0, solid_js_web.createComponent)(McpIndicator, { get status() {
6360
- return mcpGroupStatus(bucket(), busy());
6361
- } }),
6362
- (() => {
6363
- var _el$2 = _tmpl$$45();
6364
- (0, solid_js_web.insert)(_el$2, () => props.group);
6365
- return _el$2;
6366
- })(),
6367
- (() => {
6368
- var _el$3 = _tmpl$2$32();
6369
- (0, solid_js_web.insert)(_el$3, () => bucket().length);
6370
- return _el$3;
6371
- })()
6372
- ];
6384
+ return [(() => {
6385
+ var _el$3 = _tmpl$$46();
6386
+ (0, solid_js_web.insert)(_el$3, () => props.group);
6387
+ return _el$3;
6388
+ })(), (() => {
6389
+ var _el$4 = _tmpl$2$32();
6390
+ (0, solid_js_web.insert)(_el$4, () => bucket().length);
6391
+ return _el$4;
6392
+ })()];
6373
6393
  }
6374
- }), _el$4);
6375
- (0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(solid_js.For, {
6394
+ }), null);
6395
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
6396
+ get when() {
6397
+ return busy();
6398
+ },
6399
+ get children() {
6400
+ var _el$5 = _tmpl$3$20();
6401
+ (0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(Loader, { size: "small" }));
6402
+ (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$5, "aria-label", `Updating ${props.group} MCP group`));
6403
+ return _el$5;
6404
+ }
6405
+ }), null);
6406
+ (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(solid_js.For, {
6376
6407
  get each() {
6377
6408
  return view().visibility.visible().filter((item) => item.bucket === props.group).map((item) => item.name);
6378
6409
  },
@@ -6385,14 +6416,15 @@ function GuiMcpGroup(props) {
6385
6416
  } })
6386
6417
  })
6387
6418
  }));
6419
+ (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$2, "aria-busy", busy()));
6388
6420
  return _el$;
6389
6421
  })();
6390
6422
  }
6391
6423
  // src/pages/navigator/ui/gui/mcp-section.tsx
6392
- var _tmpl$$44 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6424
+ var _tmpl$$45 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6393
6425
  var _tmpl$2$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>/<!> servers updated`);
6394
- var _tmpl$3$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
6395
- var _tmpl$4$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching MCP servers.`);
6426
+ var _tmpl$3$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
6427
+ var _tmpl$4$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching MCP servers.`);
6396
6428
  function McpSection() {
6397
6429
  const services = useNavigatorGui();
6398
6430
  const catalogs = () => services.runtime.catalogs;
@@ -6444,7 +6476,7 @@ function McpSection() {
6444
6476
  },
6445
6477
  get children() {
6446
6478
  return [(() => {
6447
- var _el$ = _tmpl$$44();
6479
+ var _el$ = _tmpl$$45();
6448
6480
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
6449
6481
  return _el$;
6450
6482
  })(), (0, solid_js_web.createComponent)(GuiIconAction, {
@@ -6483,13 +6515,13 @@ function McpSection() {
6483
6515
  }
6484
6516
  }),
6485
6517
  (() => {
6486
- var _el$6 = _tmpl$3$18();
6518
+ var _el$6 = _tmpl$3$19();
6487
6519
  (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(solid_js.For, {
6488
6520
  get each() {
6489
6521
  return view().groups();
6490
6522
  },
6491
6523
  get fallback() {
6492
- return _tmpl$4$12();
6524
+ return _tmpl$4$13();
6493
6525
  },
6494
6526
  children: (group) => (0, solid_js_web.createComponent)(GuiMcpGroup, { group })
6495
6527
  }));
@@ -6558,10 +6590,10 @@ function GuiSkillRow(props) {
6558
6590
  });
6559
6591
  }
6560
6592
  // src/pages/navigator/ui/gui/skills-section.tsx
6561
- var _tmpl$$43 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6593
+ var _tmpl$$44 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6562
6594
  var _tmpl$2$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
6563
- var _tmpl$3$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching Skills.`);
6564
- var _tmpl$4$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><h3 style="font-size:12px;opacity:0.65;margin:0 0 4px"></h3><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
6595
+ var _tmpl$3$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching Skills.`);
6596
+ var _tmpl$4$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><h3 style="font-size:12px;opacity:0.65;margin:0 0 4px"></h3><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
6565
6597
  function SkillsSection() {
6566
6598
  const services = useNavigatorGui();
6567
6599
  const catalogs = () => services.runtime.catalogs;
@@ -6591,7 +6623,7 @@ function SkillsSection() {
6591
6623
  },
6592
6624
  get children() {
6593
6625
  return [(() => {
6594
- var _el$ = _tmpl$$43();
6626
+ var _el$ = _tmpl$$44();
6595
6627
  (0, solid_js_web.insert)(_el$, () => catalogs().skills.error());
6596
6628
  return _el$;
6597
6629
  })(), (0, solid_js_web.createComponent)(GuiIconAction, {
@@ -6611,10 +6643,10 @@ function SkillsSection() {
6611
6643
  return view().groups();
6612
6644
  },
6613
6645
  get fallback() {
6614
- return _tmpl$3$17();
6646
+ return _tmpl$3$18();
6615
6647
  },
6616
6648
  children: (group) => (() => {
6617
- var _el$4 = _tmpl$4$11(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
6649
+ var _el$4 = _tmpl$4$12(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
6618
6650
  (0, solid_js_web.insert)(_el$5, group);
6619
6651
  (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(solid_js.For, {
6620
6652
  get each() {
@@ -7069,12 +7101,12 @@ function createSubagentClock(key) {
7069
7101
  return now;
7070
7102
  }
7071
7103
  // src/pages/navigator/ui/gui/subagent-row.tsx
7072
- var _tmpl$$42 = /*#__PURE__*/ (0, solid_js_web.template)(`<li><p style="font-size:12px;opacity:0.65;margin:0 0 8px;overflow-wrap:anywhere">`);
7104
+ var _tmpl$$43 = /*#__PURE__*/ (0, solid_js_web.template)(`<li><p style="font-size:12px;opacity:0.65;margin:0 0 8px;overflow-wrap:anywhere">`);
7073
7105
  var _tmpl$2$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<span> · `);
7074
7106
  function SubagentRow(props) {
7075
7107
  const Button = props.ui.Button;
7076
7108
  return (() => {
7077
- var _el$ = _tmpl$$42(), _el$2 = _el$.firstChild;
7109
+ var _el$ = _tmpl$$43(), _el$2 = _el$.firstChild;
7078
7110
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
7079
7111
  size: "small",
7080
7112
  variant: "ghost",
@@ -7102,9 +7134,9 @@ function SubagentRow(props) {
7102
7134
  })();
7103
7135
  }
7104
7136
  // src/pages/navigator/ui/gui/subagent-section.tsx
7105
- var _tmpl$$41 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7137
+ var _tmpl$$42 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7106
7138
  var _tmpl$2$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="padding:0;margin:8px 0 0;list-style:none">`);
7107
- var _tmpl$3$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching subagents.`);
7139
+ var _tmpl$3$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching subagents.`);
7108
7140
  function SubagentSection() {
7109
7141
  const props = useNavigatorGui();
7110
7142
  const mode = () => props.runtime.view.subagentMode();
@@ -7169,7 +7201,7 @@ function SubagentSection() {
7169
7201
  return state().error;
7170
7202
  },
7171
7203
  get children() {
7172
- var _el$ = _tmpl$$41();
7204
+ var _el$ = _tmpl$$42();
7173
7205
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
7174
7206
  return _el$;
7175
7207
  }
@@ -7179,7 +7211,7 @@ function SubagentSection() {
7179
7211
  return rows().length > 0;
7180
7212
  },
7181
7213
  get fallback() {
7182
- return _tmpl$3$16();
7214
+ return _tmpl$3$17();
7183
7215
  },
7184
7216
  get children() {
7185
7217
  var _el$2 = _tmpl$2$28();
@@ -7371,14 +7403,14 @@ function todoPresentation(status) {
7371
7403
  };
7372
7404
  }
7373
7405
  // src/pages/navigator/ui/gui/todo-status-icon.tsx
7374
- var _tmpl$$40 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M8 4a4 4 0 0 0 0 8V4Z"fill=currentColor></svg>`, false, true, false);
7406
+ var _tmpl$$41 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M8 4a4 4 0 0 0 0 8V4Z"fill=currentColor></svg>`, false, true, false);
7375
7407
  var _tmpl$2$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M5 8 7.5 11 11 5.5"stroke=currentColor stroke-linecap=round stroke-linejoin=round></svg>`, false, true, false);
7376
- var _tmpl$3$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M3.5 12.5 12.5 3.5"stroke=currentColor></svg>`, false, true, false);
7377
- var _tmpl$4$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=img style=display:inline-flex;height:20px;align-items:center;flex-shrink:0><svg width=16 height=16 viewBox="0 0 16 16"fill=none aria-hidden=true><circle cx=8 cy=8 r=6.5 stroke=currentColor>`);
7408
+ var _tmpl$3$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M3.5 12.5 12.5 3.5"stroke=currentColor></svg>`, false, true, false);
7409
+ var _tmpl$4$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=img style=display:inline-flex;height:20px;align-items:center;flex-shrink:0><svg width=16 height=16 viewBox="0 0 16 16"fill=none aria-hidden=true><circle cx=8 cy=8 r=6.5 stroke=currentColor>`);
7378
7410
  function TodoStatusIcon(props) {
7379
7411
  const color = () => todoPresentation(props.status).icon;
7380
7412
  return (() => {
7381
- var _el$ = _tmpl$4$10(), _el$2 = _el$.firstChild;
7413
+ var _el$ = _tmpl$4$11(), _el$2 = _el$.firstChild;
7382
7414
  _el$2.firstChild;
7383
7415
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Switch, { get children() {
7384
7416
  return [
@@ -7387,7 +7419,7 @@ function TodoStatusIcon(props) {
7387
7419
  return props.status === "in_progress";
7388
7420
  },
7389
7421
  get children() {
7390
- return _tmpl$$40();
7422
+ return _tmpl$$41();
7391
7423
  }
7392
7424
  }),
7393
7425
  (0, solid_js_web.createComponent)(solid_js.Match, {
@@ -7403,7 +7435,7 @@ function TodoStatusIcon(props) {
7403
7435
  return props.status === "cancelled";
7404
7436
  },
7405
7437
  get children() {
7406
- return _tmpl$3$15();
7438
+ return _tmpl$3$16();
7407
7439
  }
7408
7440
  })
7409
7441
  ];
@@ -7421,11 +7453,11 @@ function TodoStatusIcon(props) {
7421
7453
  })();
7422
7454
  }
7423
7455
  // src/pages/navigator/ui/gui/todo-row.tsx
7424
- var _tmpl$$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<li data-navigator-todo-row style="display:flex;align-items:flex-start;gap:8px;padding:4px 6px;min-width:0"><span dir=auto data-navigator-todo-text style=flex:1;min-width:0;overflow-wrap:anywhere;font-size:13px;line-height:var(--line-height-base);letter-spacing:-0.04px>`);
7456
+ var _tmpl$$40 = /*#__PURE__*/ (0, solid_js_web.template)(`<li data-navigator-todo-row style="display:flex;align-items:flex-start;gap:8px;padding:4px 6px;min-width:0"><span dir=auto data-navigator-todo-text style=flex:1;min-width:0;overflow-wrap:anywhere;font-size:13px;line-height:var(--line-height-base);letter-spacing:-0.04px>`);
7425
7457
  function TodoRow(props) {
7426
7458
  const appearance = () => todoPresentation(props.item.status);
7427
7459
  return (() => {
7428
- var _el$ = _tmpl$$39(), _el$2 = _el$.firstChild;
7460
+ var _el$ = _tmpl$$40(), _el$2 = _el$.firstChild;
7429
7461
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TodoStatusIcon, { get status() {
7430
7462
  return props.item.status;
7431
7463
  } }), _el$2);
@@ -7445,11 +7477,11 @@ function TodoRow(props) {
7445
7477
  })();
7446
7478
  }
7447
7479
  // src/pages/navigator/ui/gui/todo-section.tsx
7448
- var _tmpl$$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7480
+ var _tmpl$$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7449
7481
  var _tmpl$2$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65;font-size:12px> completed of `);
7450
- var _tmpl$3$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Reading Todo configuration…`);
7451
- var _tmpl$4$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><p>`);
7452
- var _tmpl$5$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching tasks. Manage Todo through chat.`);
7482
+ var _tmpl$3$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Reading Todo configuration…`);
7483
+ var _tmpl$4$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><p>`);
7484
+ var _tmpl$5$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching tasks. Manage Todo through chat.`);
7453
7485
  var _tmpl$6$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><h3 style=font-size:12px;opacity:0.65></h3><ul style=padding:0;margin:0;list-style:none>`);
7454
7486
  function TodoSection() {
7455
7487
  const props = useNavigatorGui();
@@ -7474,7 +7506,7 @@ function TodoSection() {
7474
7506
  return setup()?.status !== "loading" || setup()?.enabled !== void 0;
7475
7507
  },
7476
7508
  get fallback() {
7477
- return _tmpl$3$14();
7509
+ return _tmpl$3$15();
7478
7510
  },
7479
7511
  get children() {
7480
7512
  return (0, solid_js_web.createComponent)(solid_js.Show, {
@@ -7483,7 +7515,7 @@ function TodoSection() {
7483
7515
  },
7484
7516
  get fallback() {
7485
7517
  return (() => {
7486
- var _el$6 = _tmpl$4$9(), _el$7 = _el$6.firstChild;
7518
+ var _el$6 = _tmpl$4$10(), _el$7 = _el$6.firstChild;
7487
7519
  (0, solid_js_web.insert)(_el$7, (() => {
7488
7520
  var _c$ = (0, solid_js_web.memo)(() => setup()?.status === "error");
7489
7521
  return () => _c$() ? setup()?.error : "Native Todo is disabled for this session.";
@@ -7549,7 +7581,7 @@ function TodoSection() {
7549
7581
  return state().error;
7550
7582
  },
7551
7583
  get children() {
7552
- var _el$ = _tmpl$$38();
7584
+ var _el$ = _tmpl$$39();
7553
7585
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
7554
7586
  return _el$;
7555
7587
  }
@@ -7559,7 +7591,7 @@ function TodoSection() {
7559
7591
  return setup()?.status === "error";
7560
7592
  },
7561
7593
  get children() {
7562
- var _el$2 = _tmpl$$38();
7594
+ var _el$2 = _tmpl$$39();
7563
7595
  (0, solid_js_web.insert)(_el$2, () => setup()?.error);
7564
7596
  return _el$2;
7565
7597
  }
@@ -7569,7 +7601,7 @@ function TodoSection() {
7569
7601
  return view().rows.length > 0;
7570
7602
  },
7571
7603
  get fallback() {
7572
- return _tmpl$5$4();
7604
+ return _tmpl$5$5();
7573
7605
  },
7574
7606
  get children() {
7575
7607
  return [(() => {
@@ -7613,7 +7645,7 @@ function TodoSection() {
7613
7645
  });
7614
7646
  }
7615
7647
  // src/pages/navigator/ui/gui/sections.tsx
7616
- var _tmpl$$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<hr style="border:0;border-top:1px solid currentColor;opacity:0.18;margin:14px 0">`);
7648
+ var _tmpl$$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<hr style="border:0;border-top:1px solid currentColor;opacity:0.18;margin:14px 0">`);
7617
7649
  function NavigatorSections() {
7618
7650
  const services = useNavigatorGui();
7619
7651
  const preferences = () => services.runtime.catalogs?.preferences;
@@ -7632,7 +7664,7 @@ function NavigatorSections() {
7632
7664
  return index() > 0;
7633
7665
  },
7634
7666
  get children() {
7635
- return _tmpl$$37();
7667
+ return _tmpl$$38();
7636
7668
  }
7637
7669
  }), (0, solid_js_web.createComponent)(solid_js.Switch, { get children() {
7638
7670
  return [
@@ -7677,7 +7709,7 @@ function NavigatorSections() {
7677
7709
  });
7678
7710
  }
7679
7711
  // src/features/pinned-toolbar/ui/gui/icon-picker.tsx
7680
- var _tmpl$$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(110px, 1fr));gap:4px;margin:8px 0">`);
7712
+ var _tmpl$$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(110px, 1fr));gap:4px;margin:8px 0">`);
7681
7713
  function GuiIconPicker(props) {
7682
7714
  const Dialog = props.ui.Dialog;
7683
7715
  const Button = props.ui.Button;
@@ -7705,7 +7737,7 @@ function GuiIconPicker(props) {
7705
7737
  autofocus: true,
7706
7738
  "class": "w-full"
7707
7739
  }), (() => {
7708
- var _el$ = _tmpl$$36();
7740
+ var _el$ = _tmpl$$37();
7709
7741
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
7710
7742
  get each() {
7711
7743
  return choices();
@@ -7732,7 +7764,7 @@ function GuiIconPicker(props) {
7732
7764
  });
7733
7765
  }
7734
7766
  // src/features/pinned-toolbar/ui/gui/icon-group.tsx
7735
- var _tmpl$$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:flex;gap:4px;margin:4px 0">`);
7767
+ var _tmpl$$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:flex;gap:4px;margin:4px 0">`);
7736
7768
  function GuiIconGroupEditor(props) {
7737
7769
  const Dialog = props.ui.Dialog;
7738
7770
  const Button = props.ui.Button;
@@ -7792,7 +7824,7 @@ function GuiIconGroupEditor(props) {
7792
7824
  scope: "icon-draft",
7793
7825
  move: (from, to) => setSlots((previous) => reorderItems(previous, from, to, (slot) => String(slot.key))),
7794
7826
  children: (slot, handle) => (() => {
7795
- var _el$ = _tmpl$$35();
7827
+ var _el$ = _tmpl$$36();
7796
7828
  (0, solid_js_web.insert)(_el$, handle, null);
7797
7829
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
7798
7830
  variant: "ghost",
@@ -7832,11 +7864,11 @@ function GuiIconGroupEditor(props) {
7832
7864
  });
7833
7865
  }
7834
7866
  // src/features/pinned-toolbar/ui/gui/pin-editor.tsx
7835
- var _tmpl$$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Base appearance`);
7867
+ var _tmpl$$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Base appearance`);
7836
7868
  var _tmpl$2$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center><span>`);
7837
- var _tmpl$3$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>Use a single line of up to 128 characters.`);
7838
- var _tmpl$4$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Saved state icons are retained. Desktop uses the base icons unless the action exposes its state publicly.`);
7839
- var _tmpl$5$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7869
+ var _tmpl$3$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>Use a single line of up to 128 characters.`);
7870
+ var _tmpl$4$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Saved state icons are retained. Desktop uses the base icons unless the action exposes its state publicly.`);
7871
+ var _tmpl$5$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7840
7872
  function GuiPinEditor(props) {
7841
7873
  const initial = toolbarPinAppearance(props.pin);
7842
7874
  const [base, setBase] = (0, solid_js.createSignal)([...initial.base]);
@@ -7923,7 +7955,7 @@ function GuiPinEditor(props) {
7923
7955
  },
7924
7956
  get children() {
7925
7957
  return [
7926
- _tmpl$$34(),
7958
+ _tmpl$$35(),
7927
7959
  (() => {
7928
7960
  var _el$2 = _tmpl$2$25(), _el$3 = _el$2.firstChild;
7929
7961
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
@@ -7963,7 +7995,7 @@ function GuiPinEditor(props) {
7963
7995
  return !validToolbarPinText(text());
7964
7996
  },
7965
7997
  get children() {
7966
- return _tmpl$3$13();
7998
+ return _tmpl$3$14();
7967
7999
  }
7968
8000
  }),
7969
8001
  (0, solid_js_web.createComponent)(solid_js.For, {
@@ -7984,7 +8016,7 @@ function GuiPinEditor(props) {
7984
8016
  return Object.keys(states()).length > 0;
7985
8017
  },
7986
8018
  get children() {
7987
- return _tmpl$4$8();
8019
+ return _tmpl$4$9();
7988
8020
  }
7989
8021
  }),
7990
8022
  (0, solid_js_web.createComponent)(solid_js.Show, {
@@ -7992,7 +8024,7 @@ function GuiPinEditor(props) {
7992
8024
  return error();
7993
8025
  },
7994
8026
  get children() {
7995
- var _el$6 = _tmpl$5$3();
8027
+ var _el$6 = _tmpl$5$4();
7996
8028
  (0, solid_js_web.insert)(_el$6, error);
7997
8029
  return _el$6;
7998
8030
  }
@@ -8002,10 +8034,10 @@ function GuiPinEditor(props) {
8002
8034
  });
8003
8035
  }
8004
8036
  // src/features/pinned-toolbar/ui/gui/manager.tsx
8005
- var _tmpl$$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
8037
+ var _tmpl$$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
8006
8038
  var _tmpl$2$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Pin a Skill or Quick Action from its row menu.`);
8007
- var _tmpl$3$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<small style=display:block;opacity:0.6>`);
8008
- var _tmpl$4$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="padding:8px 0;display:flex;gap:4px;align-items:center;min-width:0"><span style=flex:1;min-width:0;overflow-wrap:anywhere><strong>`);
8039
+ var _tmpl$3$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<small style=display:block;opacity:0.6>`);
8040
+ var _tmpl$4$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="padding:8px 0;display:flex;gap:4px;align-items:center;min-width:0"><span style=flex:1;min-width:0;overflow-wrap:anywhere><strong>`);
8009
8041
  var source = (pin) => pin.kind === "skill" ? pin.location : void 0;
8010
8042
  function GuiToolbarManager(props) {
8011
8043
  const Dialog = props.ui.Dialog;
@@ -8051,7 +8083,7 @@ function GuiToolbarManager(props) {
8051
8083
  return error();
8052
8084
  },
8053
8085
  get children() {
8054
- var _el$ = _tmpl$$33();
8086
+ var _el$ = _tmpl$$34();
8055
8087
  (0, solid_js_web.insert)(_el$, error);
8056
8088
  return _el$;
8057
8089
  }
@@ -8082,14 +8114,14 @@ function GuiToolbarManager(props) {
8082
8114
  },
8083
8115
  move: (from, to) => void run(() => props.move(from, to)),
8084
8116
  children: (pin, handle) => (() => {
8085
- var _el$3 = _tmpl$4$7(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
8117
+ var _el$3 = _tmpl$4$8(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
8086
8118
  (0, solid_js_web.insert)(_el$5, () => props.label(pin()));
8087
8119
  (0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(solid_js.Show, {
8088
8120
  get when() {
8089
8121
  return source(pin());
8090
8122
  },
8091
8123
  get children() {
8092
- var _el$6 = _tmpl$3$12();
8124
+ var _el$6 = _tmpl$3$13();
8093
8125
  (0, solid_js_web.insert)(_el$6, () => source(pin()));
8094
8126
  return _el$6;
8095
8127
  }
@@ -8237,9 +8269,9 @@ function createMeasuredToolbar() {
8237
8269
  };
8238
8270
  }
8239
8271
  // src/features/pinned-toolbar/ui/gui/toolbar-button.tsx
8240
- var _tmpl$$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap>`);
8272
+ var _tmpl$$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap>`);
8241
8273
  var _tmpl$2$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style=display:inline-flex;gap:4px;align-items:center;min-width:0;max-width:100%><span style=white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0>`);
8242
- var _tmpl$3$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:inline-flex;min-width:0;flex-shrink:0>`);
8274
+ var _tmpl$3$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:inline-flex;min-width:0;flex-shrink:0>`);
8243
8275
  function GuiToolbarButton(props) {
8244
8276
  const Button = props.ui.Button;
8245
8277
  const Tooltip = props.ui.Tooltip;
@@ -8260,7 +8292,7 @@ function GuiToolbarButton(props) {
8260
8292
  },
8261
8293
  get children() {
8262
8294
  return [(() => {
8263
- var _el$ = _tmpl$$32();
8295
+ var _el$ = _tmpl$$33();
8264
8296
  (0, solid_js_web.insert)(_el$, label);
8265
8297
  return _el$;
8266
8298
  })(), (() => {
@@ -8282,7 +8314,7 @@ function GuiToolbarButton(props) {
8282
8314
  }
8283
8315
  });
8284
8316
  return (() => {
8285
- var _el$4 = _tmpl$3$11();
8317
+ var _el$4 = _tmpl$3$12();
8286
8318
  _el$4.$$keydown = (event) => {
8287
8319
  if (props.measuring || event.key !== "ContextMenu" && !(event.shiftKey && event.key === "F10")) return;
8288
8320
  event.preventDefault();
@@ -8323,7 +8355,7 @@ function GuiToolbarButton(props) {
8323
8355
  }
8324
8356
  (0, solid_js_web.delegateEvents)(["contextmenu", "keydown"]);
8325
8357
  // src/features/pinned-toolbar/ui/gui/toolbar.tsx
8326
- var _tmpl$$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<span data-toolbar-visible>`);
8358
+ var _tmpl$$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<span data-toolbar-visible>`);
8327
8359
  var _tmpl$2$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-toolbar role=toolbar tabindex=-1 aria-label="Navigator pins"style="position:relative;display:flex;gap:4px;align-items:center;justify-content:center;padding:0 4px;min-height:28px;margin-bottom:8px"><div aria-hidden=true inert style=position:absolute;left:0;top:0;width:0;height:0;overflow:hidden;visibility:hidden;pointer-events:none><div style=display:flex;gap:4px;width:max-content><span>`);
8328
8360
  function navigate(event) {
8329
8361
  if (event.defaultPrevented || event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
@@ -8384,7 +8416,7 @@ function GuiPinnedToolbar(props) {
8384
8416
  return hidden().length > 0;
8385
8417
  },
8386
8418
  get children() {
8387
- var _el$2 = _tmpl$$31();
8419
+ var _el$2 = _tmpl$$32();
8388
8420
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Menu, {
8389
8421
  label: "More toolbar items",
8390
8422
  trigger: "icon",
@@ -8475,7 +8507,7 @@ function NavigatorPinnedToolbar() {
8475
8507
  });
8476
8508
  }
8477
8509
  // src/pages/navigator/ui/gui/monitoring-content.tsx
8478
- var _tmpl$$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-content style=padding:12px;overflow-y:auto;min-height:0;flex:1;font-size:13px>`);
8510
+ var _tmpl$$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-content style=padding:12px;overflow-y:auto;min-height:0;flex:1;font-size:13px>`);
8479
8511
  function MonitoringContent(props) {
8480
8512
  let body;
8481
8513
  (0, solid_js.onMount)(() => {
@@ -8484,7 +8516,7 @@ function MonitoringContent(props) {
8484
8516
  return (0, solid_js_web.createComponent)(NavigatorGuiContext.Provider, {
8485
8517
  value: props,
8486
8518
  get children() {
8487
- var _el$ = _tmpl$$30();
8519
+ var _el$ = _tmpl$$31();
8488
8520
  _el$.addEventListener("scroll", (event) => props.onScroll?.(event.currentTarget.scrollTop));
8489
8521
  (0, solid_js_web.use)((node) => {
8490
8522
  body = node;
@@ -8565,6 +8597,7 @@ function buildSearchCandidates(input) {
8565
8597
  keywords: input.mcpGroups?.[item.name],
8566
8598
  disabled: input.mcpBusy || !mcpToggleAction(item.status) ? "MCP operation in progress" : void 0,
8567
8599
  server: item.name,
8600
+ connected: item.status === "connected",
8568
8601
  ...input.mcpErrorMode === "details" && item.error && { information: {
8569
8602
  title: `MCP · ${item.name}`,
8570
8603
  body: `Status: ${item.status}\n\n${item.error}`
@@ -9139,7 +9172,7 @@ function createMiniWindowInteraction(props) {
9139
9172
  };
9140
9173
  }
9141
9174
  // src/pages/navigator/ui/gui/mini-window.tsx
9142
- var _tmpl$$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<aside data-navigator-floating style="position:fixed;display:flex;flex-direction:column;z-index:40;background:var(--v2-background-bg-layer-01);color:var(--v2-text-text-base);border:1px solid var(--v2-border-border-base, color-mix(in srgb, currentColor 20%, transparent));border-radius:12px;box-shadow:var(--v2-elevation-overlay, 0 8px 32px #0003);overflow:hidden;font-size:13px"><header style=display:grid;gap:6px;padding:8px;cursor:move;touch-action:none;user-select:none><strong data-navigator-session-title style=min-width:0;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:20px></strong><div role=group aria-label="Mini-window actions"style=display:flex;gap:4px;align-items:center><span data-navigator-move title="Drag or use arrow keys; Shift moves ten pixels"></span></div></header><footer style=display:flex;gap:4px;padding:6px;align-items:center><span title="Drag or use arrow keys; Shift resizes ten pixels"style=margin-left:auto;cursor:nwse-resize;touch-action:none>`);
9175
+ var _tmpl$$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<aside data-navigator-floating style="position:fixed;display:flex;flex-direction:column;z-index:40;background:var(--v2-background-bg-layer-01);color:var(--v2-text-text-base);border:1px solid var(--v2-border-border-base, color-mix(in srgb, currentColor 20%, transparent));border-radius:12px;box-shadow:var(--v2-elevation-overlay, 0 8px 32px #0003);overflow:hidden;font-size:13px"><header style=display:grid;gap:6px;padding:8px;cursor:move;touch-action:none;user-select:none><strong data-navigator-session-title style=min-width:0;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:20px></strong><div role=group aria-label="Mini-window actions"style=display:flex;gap:4px;align-items:center><span data-navigator-move title="Drag or use arrow keys; Shift moves ten pixels"></span></div></header><footer style=display:flex;gap:4px;padding:6px;align-items:center><span title="Drag or use arrow keys; Shift resizes ten pixels"style=margin-left:auto;cursor:nwse-resize;touch-action:none>`);
9143
9176
  function NavigatorMiniWindow(props) {
9144
9177
  const interaction = createMiniWindowInteraction(props);
9145
9178
  function dragHeader(event) {
@@ -9148,7 +9181,7 @@ function NavigatorMiniWindow(props) {
9148
9181
  interaction.start(event, "move");
9149
9182
  }
9150
9183
  return (() => {
9151
- var _el$ = _tmpl$$29(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild;
9184
+ var _el$ = _tmpl$$30(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild;
9152
9185
  (0, solid_js_web.addEventListener)(_el$2, "lostpointercapture", interaction.end);
9153
9186
  (0, solid_js_web.addEventListener)(_el$2, "pointercancel", interaction.end);
9154
9187
  (0, solid_js_web.addEventListener)(_el$2, "pointerup", interaction.end, true);
@@ -9252,13 +9285,13 @@ function NavigatorMiniWindow(props) {
9252
9285
  "keydown"
9253
9286
  ]);
9254
9287
  // src/pages/navigator/ui/gui/monitoring-panel.tsx
9255
- var _tmpl$$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-panel style=display:flex;flex-direction:column;height:100%;min-height:0><header data-navigator-panel-header style="padding:8px 12px;display:grid;gap:6px;min-width:0"><strong data-navigator-session-title style=min-width:0;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:20px></strong><div role=group aria-label="Navigator actions"style=display:flex;gap:4px;align-items:center;flex-wrap:wrap>`);
9288
+ var _tmpl$$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-panel style=display:flex;flex-direction:column;height:100%;min-height:0><header data-navigator-panel-header style="padding:8px 12px;display:grid;gap:6px;min-width:0"><strong data-navigator-session-title style=min-width:0;overflow:hidden;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:20px></strong><div role=group aria-label="Navigator actions"style=display:flex;gap:4px;align-items:center;flex-wrap:wrap>`);
9256
9289
  var _tmpl$2$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=padding:12px><p>Navigator is in its mini-window.`);
9257
- var _tmpl$3$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status> Loading Navigator…`);
9290
+ var _tmpl$3$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status> Loading Navigator…`);
9258
9291
  function MonitoringPanel(props) {
9259
9292
  const Loader = props.ui.Loader;
9260
9293
  return (() => {
9261
- var _el$ = _tmpl$$28(), _el$3 = _el$.firstChild.firstChild, _el$4 = _el$3.nextSibling;
9294
+ var _el$ = _tmpl$$29(), _el$3 = _el$.firstChild.firstChild, _el$4 = _el$3.nextSibling;
9262
9295
  (0, solid_js_web.insert)(_el$3, () => props.title);
9263
9296
  (0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(GuiIconAction, {
9264
9297
  get ui() {
@@ -9333,7 +9366,7 @@ function MonitoringPanel(props) {
9333
9366
  },
9334
9367
  get fallback() {
9335
9368
  return (() => {
9336
- var _el$7 = _tmpl$3$10(), _el$8 = _el$7.firstChild;
9369
+ var _el$7 = _tmpl$3$11(), _el$8 = _el$7.firstChild;
9337
9370
  (0, solid_js_web.insert)(_el$7, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$8);
9338
9371
  return _el$7;
9339
9372
  })();
@@ -9398,9 +9431,9 @@ function updateProgressView(progress) {
9398
9431
  };
9399
9432
  }
9400
9433
  // src/features/sidebar-settings/ui/gui/mcp-preset-menu.tsx
9401
- var _tmpl$$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="margin:8px 0;padding:0;list-style:none">`);
9434
+ var _tmpl$$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="margin:8px 0;padding:0;list-style:none">`);
9402
9435
  var _tmpl$2$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching saved presets.`);
9403
- var _tmpl$3$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>`);
9436
+ var _tmpl$3$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>`);
9404
9437
  function GuiMcpPresetMenu(props) {
9405
9438
  const Dialog = props.ui.Dialog;
9406
9439
  const Button = props.ui.Button;
@@ -9432,7 +9465,7 @@ function GuiMcpPresetMenu(props) {
9432
9465
  autofocus: true,
9433
9466
  "class": "w-full"
9434
9467
  }), (() => {
9435
- var _el$ = _tmpl$$27();
9468
+ var _el$ = _tmpl$$28();
9436
9469
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
9437
9470
  get each() {
9438
9471
  return names();
@@ -9441,7 +9474,7 @@ function GuiMcpPresetMenu(props) {
9441
9474
  return _tmpl$2$20();
9442
9475
  },
9443
9476
  children: (name) => (() => {
9444
- var _el$3 = _tmpl$3$9();
9477
+ var _el$3 = _tmpl$3$10();
9445
9478
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(Button, {
9446
9479
  variant: "ghost",
9447
9480
  onClick: () => props.preview(name),
@@ -9456,7 +9489,7 @@ function GuiMcpPresetMenu(props) {
9456
9489
  });
9457
9490
  }
9458
9491
  // src/features/sidebar-settings/ui/gui/mcp-preview-rows.tsx
9459
- var _tmpl$$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3></h3><ul style=padding:0;list-style:none>`);
9492
+ var _tmpl$$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3></h3><ul style=padding:0;list-style:none>`);
9460
9493
  var _tmpl$2$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><strong></strong><p style="margin:2px 0;opacity:0.65"> · `);
9461
9494
  var groups = [
9462
9495
  "Changes",
@@ -9475,7 +9508,7 @@ function GuiMcpPreviewRows(props) {
9475
9508
  return props.model.preview().rows.some((row) => group(row.change) === section);
9476
9509
  },
9477
9510
  get children() {
9478
- var _el$ = _tmpl$$26(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
9511
+ var _el$ = _tmpl$$27(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
9479
9512
  (0, solid_js_web.insert)(_el$2, section);
9480
9513
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
9481
9514
  get each() {
@@ -9502,7 +9535,7 @@ function GuiMcpPreviewRows(props) {
9502
9535
  });
9503
9536
  }
9504
9537
  // src/features/sidebar-settings/ui/gui/mcp-preset-preview.tsx
9505
- var _tmpl$$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
9538
+ var _tmpl$$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
9506
9539
  var _tmpl$2$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
9507
9540
  function GuiMcpPresetPreview(props) {
9508
9541
  const Dialog = props.ui.Dialog;
@@ -9564,7 +9597,7 @@ function GuiMcpPresetPreview(props) {
9564
9597
  get children() {
9565
9598
  return [
9566
9599
  (() => {
9567
- var _el$ = _tmpl$$25();
9600
+ var _el$ = _tmpl$$26();
9568
9601
  (0, solid_js_web.insert)(_el$, () => props.persistent ? "Desired states will be remembered for this scope, including unavailable servers." : "MCP persistence is off; desired states will not be saved.");
9569
9602
  return _el$;
9570
9603
  })(),
@@ -9586,7 +9619,7 @@ function GuiMcpPresetPreview(props) {
9586
9619
  });
9587
9620
  }
9588
9621
  // src/features/sidebar-settings/ui/gui/settings-about.tsx
9589
- var _tmpl$$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9622
+ var _tmpl$$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9590
9623
  function GuiSettingsAbout(props) {
9591
9624
  const Section = props.ui.SettingsSection;
9592
9625
  const Row = props.ui.SettingsRow;
@@ -9604,7 +9637,7 @@ function GuiSettingsAbout(props) {
9604
9637
  title: "About Navigator",
9605
9638
  get footer() {
9606
9639
  return (() => {
9607
- var _el$ = _tmpl$$24();
9640
+ var _el$ = _tmpl$$25();
9608
9641
  (0, solid_js_web.insert)(_el$, () => props.about.status());
9609
9642
  return _el$;
9610
9643
  })();
@@ -9701,7 +9734,7 @@ function GuiSettingsAbout(props) {
9701
9734
  })];
9702
9735
  }
9703
9736
  // src/features/sidebar-settings/ui/gui/settings-behavior.tsx
9704
- var _tmpl$$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;align-items:center>`);
9737
+ var _tmpl$$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;align-items:center>`);
9705
9738
  function GuiSettingsBehavior(props) {
9706
9739
  const Section = props.ui.SettingsSection;
9707
9740
  const Row = props.ui.SettingsRow;
@@ -9785,7 +9818,7 @@ function GuiSettingsBehavior(props) {
9785
9818
  title: "Limits refresh",
9786
9819
  description: "Whole minutes, at least one. Manual refresh and model/account switches remain immediate.",
9787
9820
  get children() {
9788
- var _el$ = _tmpl$$23();
9821
+ var _el$ = _tmpl$$24();
9789
9822
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
9790
9823
  label: "Limits refresh in minutes",
9791
9824
  get value() {
@@ -9868,7 +9901,7 @@ function GuiSettingsBehavior(props) {
9868
9901
  ];
9869
9902
  }
9870
9903
  // src/features/sidebar-settings/ui/gui/settings-catalogs.tsx
9871
- var _tmpl$$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:flex;gap:8px;align-items:center>`);
9904
+ var _tmpl$$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:flex;gap:8px;align-items:center>`);
9872
9905
  function GuiSettingsCatalogs(props) {
9873
9906
  const Section = props.ui.SettingsSection;
9874
9907
  const Row = props.ui.SettingsRow;
@@ -9877,187 +9910,215 @@ function GuiSettingsCatalogs(props) {
9877
9910
  const skillGroups = () => [...new Set(Object.values(props.preferences.skillGroups()))].sort();
9878
9911
  const mcpGroups = () => [...new Set(Object.values(props.preferences.mcpServerGroups()))].sort();
9879
9912
  return [
9880
- (0, solid_js_web.createComponent)(Section, {
9881
- title: "Quick Actions",
9882
- footer: "Visibility and order are scoped. Favorites are private and user-wide; usage never reorders actions.",
9913
+ (0, solid_js_web.createComponent)(solid_js.Show, {
9914
+ get when() {
9915
+ return props.section === "actions";
9916
+ },
9883
9917
  get children() {
9884
- return (0, solid_js_web.createComponent)(GuiSortableList, {
9885
- get ui() {
9886
- return props.ui;
9887
- },
9888
- label: "Quick Action order",
9889
- get items() {
9890
- return props.catalogs.actions();
9891
- },
9892
- itemKey: (action) => action.id,
9893
- itemLabel: (action) => action.label,
9894
- get scope() {
9895
- return props.preferences.selectedScopeKey();
9896
- },
9897
- move: (from, to) => props.preferences.reorderQuickAction(from, to, props.preferences.selectedScopeKey()),
9898
- children: (action, handle) => (0, solid_js_web.createComponent)(Row, {
9899
- get title() {
9900
- return (() => {
9901
- var _el$ = _tmpl$$22();
9902
- (0, solid_js_web.insert)(_el$, handle, null);
9903
- (0, solid_js_web.insert)(_el$, () => action().label, null);
9904
- return _el$;
9905
- })();
9906
- },
9907
- get children() {
9908
- return (0, solid_js_web.createComponent)(Switch, {
9909
- get label() {
9910
- return `Show action ${action().label}`;
9911
- },
9912
- hideLabel: true,
9913
- get checked() {
9914
- return props.preferences.selectedQuickActionVisible(action().id);
9918
+ return (0, solid_js_web.createComponent)(Section, {
9919
+ title: "Quick Actions",
9920
+ footer: "Visibility and order are scoped. Favorites are private and user-wide; usage never reorders actions.",
9921
+ get children() {
9922
+ return (0, solid_js_web.createComponent)(GuiSortableList, {
9923
+ get ui() {
9924
+ return props.ui;
9925
+ },
9926
+ label: "Quick Action order",
9927
+ get items() {
9928
+ return props.catalogs.actions();
9929
+ },
9930
+ itemKey: (action) => action.id,
9931
+ itemLabel: (action) => action.label,
9932
+ get scope() {
9933
+ return props.preferences.selectedScopeKey();
9934
+ },
9935
+ move: (from, to) => props.preferences.reorderQuickAction(from, to, props.preferences.selectedScopeKey()),
9936
+ children: (action, handle) => (0, solid_js_web.createComponent)(Row, {
9937
+ get title() {
9938
+ return (() => {
9939
+ var _el$ = _tmpl$$23();
9940
+ (0, solid_js_web.insert)(_el$, handle, null);
9941
+ (0, solid_js_web.insert)(_el$, () => action().label, null);
9942
+ return _el$;
9943
+ })();
9915
9944
  },
9916
- onChange: () => props.preferences.toggleQuickAction(action().id)
9917
- });
9918
- }
9919
- })
9945
+ get children() {
9946
+ return (0, solid_js_web.createComponent)(Switch, {
9947
+ get label() {
9948
+ return `Show action ${action().label}`;
9949
+ },
9950
+ hideLabel: true,
9951
+ get checked() {
9952
+ return props.preferences.selectedQuickActionVisible(action().id);
9953
+ },
9954
+ onChange: () => props.preferences.toggleQuickAction(action().id)
9955
+ });
9956
+ }
9957
+ })
9958
+ });
9959
+ }
9920
9960
  });
9921
9961
  }
9922
9962
  }),
9923
- (0, solid_js_web.createComponent)(Section, {
9924
- title: "Skill groups",
9925
- footer: "Assignments use exact source locations and remain private across worktrees. Skills without a source cannot be assigned.",
9963
+ (0, solid_js_web.createComponent)(solid_js.Show, {
9964
+ get when() {
9965
+ return props.section === "skills";
9966
+ },
9926
9967
  get children() {
9927
- return [(0, solid_js_web.createComponent)(solid_js.For, {
9928
- get each() {
9929
- return props.catalogs.skills();
9930
- },
9931
- children: (skill) => (0, solid_js_web.createComponent)(Row, {
9932
- get title() {
9933
- return skill.name;
9934
- },
9935
- get description() {
9936
- return skill.location ?? "No exact source location reported by this host.";
9937
- },
9938
- get children() {
9939
- return (0, solid_js_web.createComponent)(GuiGroupControl, {
9940
- get ui() {
9941
- return props.ui;
9942
- },
9943
- get label() {
9944
- return `${skill.name} (${skill.location ?? "source unavailable"})`;
9945
- },
9946
- get disabled() {
9947
- return !skill.location;
9948
- },
9949
- get value() {
9950
- return (0, solid_js_web.memo)(() => !!skill.location)() ? props.preferences.skillGroups()[skill.location] : void 0;
9968
+ return (0, solid_js_web.createComponent)(Section, {
9969
+ title: "Skill groups",
9970
+ footer: "Assignments use exact source locations and remain private across worktrees. Skills without a source cannot be assigned.",
9971
+ get children() {
9972
+ return [(0, solid_js_web.createComponent)(solid_js.For, {
9973
+ get each() {
9974
+ return props.catalogs.skills();
9975
+ },
9976
+ children: (skill) => (0, solid_js_web.createComponent)(Row, {
9977
+ get title() {
9978
+ return skill.name;
9951
9979
  },
9952
- get groups() {
9953
- return skillGroups();
9980
+ get description() {
9981
+ return skill.location ?? "No exact source location reported by this host.";
9954
9982
  },
9955
- save: (group) => {
9956
- if (skill.location) props.preferences.setSkillGroup(skill.location, group);
9983
+ get children() {
9984
+ return (0, solid_js_web.createComponent)(GuiGroupControl, {
9985
+ get ui() {
9986
+ return props.ui;
9987
+ },
9988
+ get label() {
9989
+ return `${skill.name} (${skill.location ?? "source unavailable"})`;
9990
+ },
9991
+ get disabled() {
9992
+ return !skill.location;
9993
+ },
9994
+ get value() {
9995
+ return (0, solid_js_web.memo)(() => !!skill.location)() ? props.preferences.skillGroups()[skill.location] : void 0;
9996
+ },
9997
+ get groups() {
9998
+ return skillGroups();
9999
+ },
10000
+ save: (group) => {
10001
+ if (skill.location) props.preferences.setSkillGroup(skill.location, group);
10002
+ }
10003
+ });
9957
10004
  }
9958
- });
9959
- }
9960
- })
9961
- }), (0, solid_js_web.createComponent)(solid_js.Show, {
9962
- get when() {
9963
- return props.catalogs.skills().length === 0;
9964
- },
9965
- get children() {
9966
- return (0, solid_js_web.createComponent)(Row, {
9967
- title: "No Skills loaded",
9968
- description: "Open a session to load its native Skill source."
9969
- });
10005
+ })
10006
+ }), (0, solid_js_web.createComponent)(solid_js.Show, {
10007
+ get when() {
10008
+ return props.catalogs.skills().length === 0;
10009
+ },
10010
+ get children() {
10011
+ return (0, solid_js_web.createComponent)(Row, {
10012
+ title: "No Skills loaded",
10013
+ description: "Open a session to load its native Skill source."
10014
+ });
10015
+ }
10016
+ })];
9970
10017
  }
9971
- })];
10018
+ });
9972
10019
  }
9973
10020
  }),
9974
- (0, solid_js_web.createComponent)(Section, {
9975
- title: "MCP groups",
9976
- footer: "One named group per exact server name. Absent server assignments are retained.",
10021
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10022
+ get when() {
10023
+ return props.section === "mcp";
10024
+ },
9977
10025
  get children() {
9978
- return [(0, solid_js_web.createComponent)(solid_js.For, {
9979
- get each() {
9980
- return props.catalogs.mcpServers();
9981
- },
9982
- children: (name) => (0, solid_js_web.createComponent)(Row, {
9983
- title: name,
9984
- get children() {
9985
- return (0, solid_js_web.createComponent)(GuiGroupControl, {
9986
- get ui() {
9987
- return props.ui;
9988
- },
9989
- label: name,
9990
- get value() {
9991
- return props.preferences.mcpServerGroups()[name];
9992
- },
9993
- get groups() {
9994
- return mcpGroups();
9995
- },
9996
- save: (group) => props.preferences.setMcpServerGroup(name, group)
9997
- });
9998
- }
9999
- })
10000
- }), (0, solid_js_web.createComponent)(solid_js.Show, {
10001
- get when() {
10002
- return props.catalogs.mcpServers().length === 0;
10003
- },
10026
+ return (0, solid_js_web.createComponent)(Section, {
10027
+ title: "MCP groups",
10028
+ footer: "One named group per exact server name. Absent server assignments are retained.",
10004
10029
  get children() {
10005
- return (0, solid_js_web.createComponent)(Row, {
10006
- title: "No MCP servers loaded",
10007
- description: "Open a session with configured MCP servers."
10008
- });
10030
+ return [(0, solid_js_web.createComponent)(solid_js.For, {
10031
+ get each() {
10032
+ return props.catalogs.mcpServers();
10033
+ },
10034
+ children: (name) => (0, solid_js_web.createComponent)(Row, {
10035
+ title: name,
10036
+ get children() {
10037
+ return (0, solid_js_web.createComponent)(GuiGroupControl, {
10038
+ get ui() {
10039
+ return props.ui;
10040
+ },
10041
+ label: name,
10042
+ get value() {
10043
+ return props.preferences.mcpServerGroups()[name];
10044
+ },
10045
+ get groups() {
10046
+ return mcpGroups();
10047
+ },
10048
+ save: (group) => props.preferences.setMcpServerGroup(name, group)
10049
+ });
10050
+ }
10051
+ })
10052
+ }), (0, solid_js_web.createComponent)(solid_js.Show, {
10053
+ get when() {
10054
+ return props.catalogs.mcpServers().length === 0;
10055
+ },
10056
+ get children() {
10057
+ return (0, solid_js_web.createComponent)(Row, {
10058
+ title: "No MCP servers loaded",
10059
+ description: "Open a session with configured MCP servers."
10060
+ });
10061
+ }
10062
+ })];
10009
10063
  }
10010
- })];
10064
+ });
10011
10065
  }
10012
10066
  }),
10013
- (0, solid_js_web.createComponent)(Section, {
10014
- title: "Trusted Skills",
10015
- footer: "Revoking trust restores confirmation. It never runs or removes a Skill.",
10067
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10068
+ get when() {
10069
+ return props.section === "skills";
10070
+ },
10016
10071
  get children() {
10017
- return [
10018
- (0, solid_js_web.createComponent)(solid_js.For, {
10019
- get each() {
10020
- return props.preferences.trustedSkillLocations();
10021
- },
10022
- children: (location) => (0, solid_js_web.createComponent)(Row, {
10023
- title: "Trusted Skill source",
10024
- description: location,
10025
- get children() {
10026
- return (0, solid_js_web.createComponent)(Button, {
10027
- onClick: () => props.preferences.revokeSkillConfirmation(location),
10028
- children: "Require confirmation"
10029
- });
10030
- }
10031
- })
10032
- }),
10033
- (0, solid_js_web.createComponent)(solid_js.Show, {
10034
- get when() {
10035
- return props.preferences.trustedSkillLocations().length === 0;
10036
- },
10037
- get children() {
10038
- return (0, solid_js_web.createComponent)(Row, { title: "All Skills require confirmation" });
10039
- }
10040
- }),
10041
- (0, solid_js_web.createComponent)(Row, {
10042
- title: "Reset Skill trust",
10043
- get children() {
10044
- return (0, solid_js_web.createComponent)(Button, {
10045
- onClick: () => void props.reset("trust"),
10046
- children: "Require confirmation for every Skill"
10047
- });
10048
- }
10049
- })
10050
- ];
10072
+ return (0, solid_js_web.createComponent)(Section, {
10073
+ title: "Trusted Skills",
10074
+ footer: "Revoking trust restores confirmation. It never runs or removes a Skill.",
10075
+ get children() {
10076
+ return [
10077
+ (0, solid_js_web.createComponent)(solid_js.For, {
10078
+ get each() {
10079
+ return props.preferences.trustedSkillLocations();
10080
+ },
10081
+ children: (location) => (0, solid_js_web.createComponent)(Row, {
10082
+ title: "Trusted Skill source",
10083
+ description: location,
10084
+ get children() {
10085
+ return (0, solid_js_web.createComponent)(Button, {
10086
+ onClick: () => props.preferences.revokeSkillConfirmation(location),
10087
+ children: "Require confirmation"
10088
+ });
10089
+ }
10090
+ })
10091
+ }),
10092
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10093
+ get when() {
10094
+ return props.preferences.trustedSkillLocations().length === 0;
10095
+ },
10096
+ get children() {
10097
+ return (0, solid_js_web.createComponent)(Row, { title: "All Skills require confirmation" });
10098
+ }
10099
+ }),
10100
+ (0, solid_js_web.createComponent)(Row, {
10101
+ title: "Reset Skill trust",
10102
+ get children() {
10103
+ return (0, solid_js_web.createComponent)(Button, {
10104
+ onClick: () => void props.reset("trust"),
10105
+ children: "Require confirmation for every Skill"
10106
+ });
10107
+ }
10108
+ })
10109
+ ];
10110
+ }
10111
+ });
10051
10112
  }
10052
10113
  })
10053
10114
  ];
10054
10115
  }
10055
10116
  // src/features/sidebar-settings/ui/gui/preset-controls.tsx
10056
- var _tmpl$$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
10117
+ var _tmpl$$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
10057
10118
  function GuiPresetControls(props) {
10058
10119
  const Button = props.ui.Button;
10059
10120
  return (() => {
10060
- var _el$ = _tmpl$$21();
10121
+ var _el$ = _tmpl$$22();
10061
10122
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
10062
10123
  size: "small",
10063
10124
  onClick: () => void props.presets.manage(props.kind, props.name, "rename"),
@@ -10078,7 +10139,7 @@ function GuiPresetControls(props) {
10078
10139
  })();
10079
10140
  }
10080
10141
  // src/features/sidebar-settings/ui/gui/settings-presets.tsx
10081
- var _tmpl$$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;flex-wrap:wrap>`);
10142
+ var _tmpl$$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;flex-wrap:wrap>`);
10082
10143
  var _tmpl$2$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
10083
10144
  function GuiSettingsPresets(props) {
10084
10145
  const Section = props.ui.SettingsSection;
@@ -10118,7 +10179,7 @@ function GuiSettingsPresets(props) {
10118
10179
  title: "Save current layout or MCP states",
10119
10180
  description: "Named presets are private and shared across worktrees.",
10120
10181
  get children() {
10121
- var _el$ = _tmpl$$20();
10182
+ var _el$ = _tmpl$$21();
10122
10183
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
10123
10184
  label: "New preset name",
10124
10185
  get value() {
@@ -10260,33 +10321,153 @@ function GuiSettingsResets(props) {
10260
10321
  footer: "Every reset needs confirmation and applies only to its described data. Host themes and client configuration are never changed.",
10261
10322
  get children() {
10262
10323
  return [
10263
- (0, solid_js_web.createComponent)(Row, {
10264
- title: "Layout",
10265
- description: "Restore configured visibility, expansion and order for the selected scope.",
10324
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10325
+ get when() {
10326
+ return props.section === "layout";
10327
+ },
10266
10328
  get children() {
10267
- return (0, solid_js_web.createComponent)(Button, {
10268
- onClick: () => void props.reset("layout"),
10269
- children: "Restore layout"
10329
+ return (0, solid_js_web.createComponent)(Row, {
10330
+ title: "Layout",
10331
+ description: "Restore configured visibility, expansion and order for the selected scope.",
10332
+ get children() {
10333
+ return (0, solid_js_web.createComponent)(Button, {
10334
+ onClick: () => void props.reset("layout"),
10335
+ children: "Restore layout"
10336
+ });
10337
+ }
10338
+ });
10339
+ }
10340
+ }),
10341
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10342
+ get when() {
10343
+ return props.section === "behavior";
10344
+ },
10345
+ get children() {
10346
+ return (0, solid_js_web.createComponent)(Row, {
10347
+ title: "Shared behavior",
10348
+ description: "Restore all Navigator behavior defaults in this scope, including terminal-only settings shared with TUI instances.",
10349
+ get children() {
10350
+ return (0, solid_js_web.createComponent)(Button, {
10351
+ onClick: () => void props.reset("behavior"),
10352
+ children: "Restore shared behavior"
10353
+ });
10354
+ }
10270
10355
  });
10271
10356
  }
10272
10357
  }),
10358
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10359
+ get when() {
10360
+ return props.section === "mcp";
10361
+ },
10362
+ get children() {
10363
+ return (0, solid_js_web.createComponent)(Row, {
10364
+ title: "Remembered MCP states",
10365
+ description: "Forget desired states in this scope without changing the current connections.",
10366
+ get children() {
10367
+ return (0, solid_js_web.createComponent)(Button, {
10368
+ onClick: () => void props.reset("mcp"),
10369
+ children: "Clear remembered MCP states"
10370
+ });
10371
+ }
10372
+ });
10373
+ }
10374
+ })
10375
+ ];
10376
+ }
10377
+ });
10378
+ }
10379
+ // src/features/sidebar-settings/ui/gui/settings-scope.tsx
10380
+ var _tmpl$$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
10381
+ function GuiSettingsScope(props) {
10382
+ const Section = props.ui.SettingsSection;
10383
+ const Row = props.ui.SettingsRow;
10384
+ const Select = props.ui.Select;
10385
+ const Button = props.ui.Button;
10386
+ const [busy, setBusy] = (0, solid_js.createSignal)(false);
10387
+ const [status, setStatus] = (0, solid_js.createSignal)("");
10388
+ async function run(action, message) {
10389
+ if (busy()) return;
10390
+ setBusy(true);
10391
+ setStatus("");
10392
+ try {
10393
+ await action();
10394
+ setStatus(message);
10395
+ } catch (error) {
10396
+ setStatus(error instanceof Error ? error.message : "Settings could not be saved. Try again.");
10397
+ } finally {
10398
+ setBusy(false);
10399
+ }
10400
+ }
10401
+ return (0, solid_js_web.createComponent)(Section, {
10402
+ title: "Preference scope",
10403
+ get footer() {
10404
+ return (0, solid_js_web.createComponent)(solid_js.Show, {
10405
+ get when() {
10406
+ return status();
10407
+ },
10408
+ get children() {
10409
+ var _el$ = _tmpl$$20();
10410
+ (0, solid_js_web.insert)(_el$, status);
10411
+ return _el$;
10412
+ }
10413
+ });
10414
+ },
10415
+ get children() {
10416
+ return [
10273
10417
  (0, solid_js_web.createComponent)(Row, {
10274
- title: "Shared behavior",
10275
- description: "Restore all Navigator behavior defaults in this scope, including terminal-only settings shared with TUI instances.",
10418
+ title: "Scope",
10419
+ description: "Global applies everywhere. Worktree overrides use the currently selected server and location.",
10276
10420
  get children() {
10277
- return (0, solid_js_web.createComponent)(Button, {
10278
- onClick: () => void props.reset("behavior"),
10279
- children: "Restore shared behavior"
10421
+ return (0, solid_js_web.createComponent)(Select, {
10422
+ label: "Navigator preference scope",
10423
+ get value() {
10424
+ return props.preferences.preferenceScope();
10425
+ },
10426
+ get options() {
10427
+ return [{
10428
+ value: "global",
10429
+ label: "Global"
10430
+ }, ...props.preferences.canUseWorktreeScope() ? [{
10431
+ value: "worktree",
10432
+ label: "Worktree"
10433
+ }] : []];
10434
+ },
10435
+ get onChange() {
10436
+ return props.preferences.setPreferenceScope;
10437
+ }
10438
+ });
10439
+ }
10440
+ }),
10441
+ (0, solid_js_web.createComponent)(solid_js.Show, {
10442
+ get when() {
10443
+ return props.layout;
10444
+ },
10445
+ get children() {
10446
+ return (0, solid_js_web.createComponent)(Row, {
10447
+ title: "Layout default",
10448
+ description: "Changing section visibility or order does not implicitly replace the saved default.",
10449
+ get children() {
10450
+ return (0, solid_js_web.createComponent)(Button, {
10451
+ get busy() {
10452
+ return busy();
10453
+ },
10454
+ onClick: () => void run(props.preferences.saveLayoutAsDefault, "Layout default saved for this scope."),
10455
+ children: "Save layout as default"
10456
+ });
10457
+ }
10280
10458
  });
10281
10459
  }
10282
10460
  }),
10283
10461
  (0, solid_js_web.createComponent)(Row, {
10284
- title: "Remembered MCP states",
10285
- description: "Forget desired states in this scope without changing the current connections.",
10462
+ title: "Reload private preferences",
10463
+ description: "Flush local writes, then load changes from other Navigator instances. Temporary layout overrides are cleared.",
10286
10464
  get children() {
10287
10465
  return (0, solid_js_web.createComponent)(Button, {
10288
- onClick: () => void props.reset("mcp"),
10289
- children: "Clear remembered MCP states"
10466
+ get busy() {
10467
+ return busy();
10468
+ },
10469
+ onClick: () => void run(props.preferences.reloadFromFile, "Private preferences reloaded."),
10470
+ children: "Reload preferences"
10290
10471
  });
10291
10472
  }
10292
10473
  })
@@ -10411,28 +10592,48 @@ function GuiSettingsSections(props) {
10411
10592
  }
10412
10593
  // src/features/sidebar-settings/ui/gui/settings-page.tsx
10413
10594
  var _tmpl$$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator preferences…`);
10414
- var _tmpl$2$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
10595
+ var _tmpl$2$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<section style=gap:32px;min-width:0>`);
10596
+ var tabs = [
10597
+ {
10598
+ id: "layout",
10599
+ label: "Layout"
10600
+ },
10601
+ {
10602
+ id: "behavior",
10603
+ label: "Behavior"
10604
+ },
10605
+ {
10606
+ id: "actions",
10607
+ label: "Quick Actions"
10608
+ },
10609
+ {
10610
+ id: "skills",
10611
+ label: "Skills"
10612
+ },
10613
+ {
10614
+ id: "mcp",
10615
+ label: "MCP"
10616
+ },
10617
+ {
10618
+ id: "presets",
10619
+ label: "Presets"
10620
+ },
10621
+ {
10622
+ id: "about",
10623
+ label: "About"
10624
+ }
10625
+ ];
10415
10626
  function GuiNavigatorSettings(props) {
10416
10627
  const Layout = props.ui.SettingsLayout;
10417
- const Section = props.ui.SettingsSection;
10418
- const Row = props.ui.SettingsRow;
10419
- const Select = props.ui.Select;
10420
- const Button = props.ui.Button;
10421
- const [busy, setBusy] = (0, solid_js.createSignal)(false);
10422
- const [status, setStatus] = (0, solid_js.createSignal)("");
10423
- async function run(action, message) {
10424
- if (busy()) return;
10425
- setBusy(true);
10426
- setStatus("");
10427
- try {
10428
- await action();
10429
- setStatus(message);
10430
- } catch (error) {
10431
- setStatus(error instanceof Error ? error.message : "Settings could not be saved. Try again.");
10432
- } finally {
10433
- setBusy(false);
10434
- }
10435
- }
10628
+ const [selected, setSelected] = (0, solid_js.createSignal)("layout");
10629
+ const [visited, setVisited] = (0, solid_js.createSignal)(["layout"]);
10630
+ const select = (id) => {
10631
+ setVisited((current) => current.includes(id) ? current : [...current, id]);
10632
+ setSelected(id);
10633
+ };
10634
+ (0, solid_js.createEffect)(() => {
10635
+ if (props.target === "navigator-overflow" || props.target === "navigator-quota-refresh") select("behavior");
10636
+ });
10436
10637
  return (0, solid_js_web.createComponent)(Layout, {
10437
10638
  title: "Navigator",
10438
10639
  description: "Shared sidebar settings for this Desktop and your local TUI instances.",
@@ -10447,90 +10648,102 @@ function GuiNavigatorSettings(props) {
10447
10648
  },
10448
10649
  get children() {
10449
10650
  return [
10450
- (0, solid_js_web.createComponent)(Section, {
10451
- title: "Preference scope",
10452
- get footer() {
10453
- return (0, solid_js_web.createComponent)(solid_js.Show, {
10454
- get when() {
10455
- return status();
10456
- },
10457
- get children() {
10458
- var _el$2 = _tmpl$2$15();
10459
- (0, solid_js_web.insert)(_el$2, status);
10460
- return _el$2;
10461
- }
10462
- });
10651
+ (0, solid_js_web.createComponent)(GuiTabs, {
10652
+ get ui() {
10653
+ return props.ui;
10463
10654
  },
10464
- get children() {
10465
- return [
10466
- (0, solid_js_web.createComponent)(Row, {
10467
- title: "Scope",
10468
- description: "Global applies everywhere. Worktree overrides use the currently selected server and location.",
10655
+ label: "Navigator settings categories",
10656
+ get selected() {
10657
+ return selected();
10658
+ },
10659
+ options: tabs,
10660
+ onSelect: select
10661
+ }),
10662
+ (0, solid_js_web.createComponent)(GuiSettingsScope, (0, solid_js_web.mergeProps)(props, { get layout() {
10663
+ return selected() === "layout";
10664
+ } })),
10665
+ (0, solid_js_web.createComponent)(solid_js.For, {
10666
+ each: tabs,
10667
+ children: (tab) => (0, solid_js_web.createComponent)(solid_js.Show, {
10668
+ get when() {
10669
+ return visited().includes(tab.id);
10670
+ },
10671
+ get children() {
10672
+ var _el$2 = _tmpl$2$15();
10673
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10674
+ get when() {
10675
+ return tab.id === "layout";
10676
+ },
10469
10677
  get children() {
10470
- return (0, solid_js_web.createComponent)(Select, {
10471
- label: "Navigator preference scope",
10472
- get value() {
10473
- return props.preferences.preferenceScope();
10474
- },
10475
- get options() {
10476
- return [{
10477
- value: "global",
10478
- label: "Global"
10479
- }, ...props.preferences.canUseWorktreeScope() ? [{
10480
- value: "worktree",
10481
- label: "Worktree"
10482
- }] : []];
10483
- },
10484
- get onChange() {
10485
- return props.preferences.setPreferenceScope;
10486
- }
10487
- });
10678
+ return [(0, solid_js_web.createComponent)(GuiSettingsSections, props), (0, solid_js_web.createComponent)(GuiSettingsResets, (0, solid_js_web.mergeProps)(props, { section: "layout" }))];
10488
10679
  }
10489
- }),
10490
- (0, solid_js_web.createComponent)(Row, {
10491
- title: "Layout default",
10492
- description: "Changing section visibility or order does not implicitly replace the saved default.",
10680
+ }), null);
10681
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10682
+ get when() {
10683
+ return tab.id === "behavior";
10684
+ },
10493
10685
  get children() {
10494
- return (0, solid_js_web.createComponent)(Button, {
10495
- get busy() {
10496
- return busy();
10497
- },
10498
- onClick: () => void run(props.preferences.saveLayoutAsDefault, "Layout default saved for this scope."),
10499
- children: "Save layout as default"
10500
- });
10686
+ return [(0, solid_js_web.createComponent)(GuiSettingsBehavior, props), (0, solid_js_web.createComponent)(GuiSettingsResets, (0, solid_js_web.mergeProps)(props, { section: "behavior" }))];
10687
+ }
10688
+ }), null);
10689
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10690
+ get when() {
10691
+ return tab.id === "actions" || tab.id === "skills" || tab.id === "mcp";
10692
+ },
10693
+ get children() {
10694
+ return (0, solid_js_web.createComponent)(GuiSettingsCatalogs, (0, solid_js_web.mergeProps)(props, { get section() {
10695
+ return tab.id;
10696
+ } }));
10501
10697
  }
10502
- }),
10503
- (0, solid_js_web.createComponent)(Row, {
10504
- title: "Reload private preferences",
10505
- description: "Flush local writes, then load changes from other Navigator instances. Temporary layout overrides are cleared.",
10698
+ }), null);
10699
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10700
+ get when() {
10701
+ return tab.id === "mcp";
10702
+ },
10703
+ get children() {
10704
+ return (0, solid_js_web.createComponent)(GuiSettingsResets, (0, solid_js_web.mergeProps)(props, { section: "mcp" }));
10705
+ }
10706
+ }), null);
10707
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10708
+ get when() {
10709
+ return tab.id === "presets";
10710
+ },
10506
10711
  get children() {
10507
- return (0, solid_js_web.createComponent)(Button, {
10508
- get busy() {
10509
- return busy();
10712
+ return (0, solid_js_web.createComponent)(GuiSettingsPresets, props);
10713
+ }
10714
+ }), null);
10715
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
10716
+ get when() {
10717
+ return tab.id === "about";
10718
+ },
10719
+ get children() {
10720
+ return (0, solid_js_web.createComponent)(GuiSettingsAbout, {
10721
+ get ui() {
10722
+ return props.ui;
10723
+ },
10724
+ get about() {
10725
+ return props.about;
10510
10726
  },
10511
- onClick: () => void run(props.preferences.reloadFromFile, "Private preferences reloaded."),
10512
- children: "Reload preferences"
10727
+ get showGuide() {
10728
+ return props.showGuide;
10729
+ }
10513
10730
  });
10514
10731
  }
10515
- })
10516
- ];
10517
- }
10518
- }),
10519
- (0, solid_js_web.createComponent)(GuiSettingsSections, props),
10520
- (0, solid_js_web.createComponent)(GuiSettingsBehavior, props),
10521
- (0, solid_js_web.createComponent)(GuiSettingsPresets, props),
10522
- (0, solid_js_web.createComponent)(GuiSettingsCatalogs, props),
10523
- (0, solid_js_web.createComponent)(GuiSettingsResets, props),
10524
- (0, solid_js_web.createComponent)(GuiSettingsAbout, {
10525
- get ui() {
10526
- return props.ui;
10527
- },
10528
- get about() {
10529
- return props.about;
10530
- },
10531
- get showGuide() {
10532
- return props.showGuide;
10533
- }
10732
+ }), null);
10733
+ (0, solid_js_web.effect)((_p$) => {
10734
+ var _v$ = selected() !== tab.id, _v$2 = `${tab.label} settings`, _v$3 = selected() === tab.id ? "grid" : "none";
10735
+ _v$ !== _p$.e && (_el$2.hidden = _p$.e = _v$);
10736
+ _v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$2, "aria-label", _p$.t = _v$2);
10737
+ _v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$2, "display", _p$.a = _v$3);
10738
+ return _p$;
10739
+ }, {
10740
+ e: void 0,
10741
+ t: void 0,
10742
+ a: void 0
10743
+ });
10744
+ return _el$2;
10745
+ }
10746
+ })
10534
10747
  })
10535
10748
  ];
10536
10749
  }
@@ -10542,8 +10755,8 @@ function GuiNavigatorSettings(props) {
10542
10755
  // src/features/sidebar-settings/ui/gui/onboarding-dialog.tsx
10543
10756
  var _tmpl$$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Navigator guide content"style="max-height:min(52vh, 560px);overflow-y:auto">`);
10544
10757
  var _tmpl$2$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
10545
- var _tmpl$3$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<dl>`);
10546
- var _tmpl$4$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=margin-top:16px><dt><strong></strong></dt><dd style="margin:4px 0 0">`);
10758
+ var _tmpl$3$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<dl>`);
10759
+ var _tmpl$4$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=margin-top:16px><dt><strong></strong></dt><dd style="margin:4px 0 0">`);
10547
10760
  var steps = createOnboardingSteps({
10548
10761
  nativeTodo: true,
10549
10762
  lsp: false,
@@ -10600,13 +10813,13 @@ function GuiOnboardingDialog(props) {
10600
10813
  (0, solid_js_web.insert)(_el$2, () => value().summary);
10601
10814
  return _el$2;
10602
10815
  })(), (() => {
10603
- var _el$3 = _tmpl$3$8();
10816
+ var _el$3 = _tmpl$3$9();
10604
10817
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
10605
10818
  get each() {
10606
10819
  return value().features;
10607
10820
  },
10608
10821
  children: (feature) => (() => {
10609
- var _el$4 = _tmpl$4$6(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$5.nextSibling;
10822
+ var _el$4 = _tmpl$4$7(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$5.nextSibling;
10610
10823
  (0, solid_js_web.insert)(_el$6, () => feature.title);
10611
10824
  (0, solid_js_web.insert)(_el$7, () => feature.description);
10612
10825
  return _el$4;
@@ -10788,8 +11001,8 @@ function GuiBugReportConfirmation(props) {
10788
11001
  // src/features/sidebar-settings/ui/gui/layout-preset-preview.tsx
10789
11002
  var _tmpl$$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10790
11003
  var _tmpl$2$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=max-height:52vh;overflow-y:auto>`);
10791
- var _tmpl$3$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0"><strong></strong><p>Visibility: <!> → <!> · <!> → <!> · position <!> → `);
10792
- var _tmpl$4$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>MCP scope: `);
11004
+ var _tmpl$3$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0"><strong></strong><p>Visibility: <!> → <!> · <!> → <!> · position <!> → `);
11005
+ var _tmpl$4$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>MCP scope: `);
10793
11006
  function GuiLayoutPresetPreview(props) {
10794
11007
  const Dialog = props.ui.Dialog;
10795
11008
  const Button = props.ui.Button;
@@ -10854,7 +11067,7 @@ function GuiLayoutPresetPreview(props) {
10854
11067
  return props.model.layout.preview()?.rows;
10855
11068
  },
10856
11069
  children: (row) => (() => {
10857
- var _el$3 = _tmpl$3$7(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$12 = _el$5.firstChild.nextSibling, _el$13 = _el$12.nextSibling.nextSibling, _el$14 = _el$13.nextSibling.nextSibling, _el$15 = _el$14.nextSibling.nextSibling, _el$16 = _el$15.nextSibling.nextSibling;
11070
+ var _el$3 = _tmpl$3$8(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$12 = _el$5.firstChild.nextSibling, _el$13 = _el$12.nextSibling.nextSibling, _el$14 = _el$13.nextSibling.nextSibling, _el$15 = _el$14.nextSibling.nextSibling, _el$16 = _el$15.nextSibling.nextSibling;
10858
11071
  _el$16.nextSibling;
10859
11072
  (0, solid_js_web.insert)(_el$4, () => row.section);
10860
11073
  (0, solid_js_web.insert)(_el$5, () => row.visibility[0] ? "visible" : "hidden", _el$12);
@@ -10873,7 +11086,7 @@ function GuiLayoutPresetPreview(props) {
10873
11086
  return props.model.mcp;
10874
11087
  },
10875
11088
  children: (model) => [(() => {
10876
- var _el$17 = _tmpl$4$5();
11089
+ var _el$17 = _tmpl$4$6();
10877
11090
  _el$17.firstChild;
10878
11091
  (0, solid_js_web.insert)(_el$17, () => model().scope, null);
10879
11092
  return _el$17;
@@ -10888,7 +11101,7 @@ function GuiLayoutPresetPreview(props) {
10888
11101
  // src/features/sidebar-settings/ui/gui/portable-dialog.tsx
10889
11102
  var _tmpl$$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10890
11103
  var _tmpl$2$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Portable settings changes"style=max-height:52vh;overflow-y:auto><p>Scope: </p><p>Layout: <!> · MCP: <!> · Behavior: </p><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
10891
- var _tmpl$3$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Skipped unsupported field: `);
11104
+ var _tmpl$3$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Skipped unsupported field: `);
10892
11105
  function GuiPortableSettingsDialog(props) {
10893
11106
  const Dialog = props.ui.Dialog;
10894
11107
  const Button = props.ui.Button;
@@ -10999,7 +11212,7 @@ function GuiPortableSettingsDialog(props) {
10999
11212
  return value().unsupported;
11000
11213
  },
11001
11214
  children: (field) => (() => {
11002
- var _el$12 = _tmpl$3$6();
11215
+ var _el$12 = _tmpl$3$7();
11003
11216
  _el$12.firstChild;
11004
11217
  (0, solid_js_web.insert)(_el$12, field, null);
11005
11218
  return _el$12;
@@ -11141,7 +11354,7 @@ function createGuiBugReport(context) {
11141
11354
  let token = "";
11142
11355
  (0, solid_js.onCleanup)(() => abort.abort());
11143
11356
  const model = createBugReportModel({
11144
- navigatorVersion: "0.27.3",
11357
+ navigatorVersion: "0.27.4",
11145
11358
  openCodeVersion: context.app.version,
11146
11359
  platform: context.app.platform,
11147
11360
  runtime: "OpenCode Desktop GUI"
@@ -11193,8 +11406,8 @@ function createGuiBugReport(context) {
11193
11406
  }
11194
11407
  // src/app/gui/release.ts
11195
11408
  var guiRelease = {
11196
- version: "0.27.3",
11197
- changelog: "# Changelog\n\n## [0.27.3] - 2026-11-12\n\n- Keep the Desktop session title on its own full-width row in both the panel and floating mini-window, with readable wrapping instead of squeezing it between action labels.\n- Use native icon buttons with tooltips for familiar sidebar actions such as Search, Refresh, Settings, Float, Dock and information. Keep descriptive labels for account linking, Banked Resets, presets and other less obvious operations.\n- Remove the persistent account/model scope explanation from successful Desktop Limits. Keep the short update time, quota data and actionable warnings without changing account scope or reset-credit safeguards.\n\n## [0.27.2] - 2026-11-11\n\n- Keep Desktop Settings fields and actions inside their rows at narrow widths, with readable labels and compact group creation.\n- Reorder Desktop sections, Quick Actions, toolbar pins and button icons by dragging their handles, or use Space and arrow keys to move them with the keyboard. Escape cancels an unfinished move.\n- Show download and installation progress in place of the running version in TUI and inline in Desktop About. Show real percentages only when byte totals are available; otherwise show the active stage.\n- Bring Desktop section arrows, loading indicators and Todo rows closer to native OpenCode. Completed and cancelled tasks use muted, struck-through text with distinct status icons.\n- Remove duplicate model and reasoning-effort selectors from the Desktop sidebar. Select them below chat instead; Limits continue to follow the active model.\n\n## [0.27.1] - 2026-11-11\n\n- Drag the Desktop mini-window by its header as well as its move handle, while keeping Dock a separate action. Match its surface and controls to OpenCode's light and dark themes.\n- Use native Desktop switches and selectors for Skill trust and Todo configuration, and align multiline fields with the host theme and focus styles.\n- Show a remaining-lifetime scale and time until expiry for banked reset credits with provider-supplied dates. Keep missing expiry explicit and prevent selecting expired credits for review.\n\n## [0.27.0] - 2026-11-11\n\n- Add an experimental OpenCode Desktop interface with a native panel, narrow-screen drawer, and opt-in in-app mini-window. Move, resize, reset and redock it with the mouse or keyboard while keeping the selected session and filters.\n- Bring Search Everything, Skills, MCP groups and presets, Quick Actions, and customizable toolbar pins to Desktop. Share private favorites, trust decisions and preferences with local TUI instances without duplicating monitoring.\n- Add native Desktop settings with scoped section controls, groups, reviewed presets and project profiles, portable import/export, a seven-slide setup guide, About, browsable release history and editable GitHub Bug reports.\n- Keep superseded Desktop configuration reads from showing a false error after a newer refresh, while preserving genuine failures and retry guidance.\n- Show verified provider/account quotas in Desktop with explicit account linking and separately confirmed banked resets. Keep remote sessions isolated from local accounts and preserve unresolved reset attempts across retries.\n- Support OpenCode 1.19.5 and 2.2.6 while preserving both TUI adapters, existing settings, pinned-source updates and read-only legacy Todo archives.\n\n## [0.26.0] - 2026-11-06\n\n- Prevent background retries from accumulating cancellation listeners and preferences loading from waiting indefinitely on recovery markers.\n- Show exact active Subagent durations from OpenCode 2's native execution start time, preserving the observation fallback when timing is unavailable. Keep interrupted executions marked as cancelled in recent history.\n\n## [0.25.0] - 2026-10-31\n\n- Offer Enable Todo when OpenCode 2's native tool is disabled, with an existing server-config picker, exact change preview and separate confirmation. Preserve unrelated JSONC content and refuse stale targets; distinguish disabled Todo from an enabled empty list.\n- Update the seven-slide setup wizard for native Todo enablement, provider/account limits, multi-icon or text-only toolbar pins, About/changelog and Bug reports. Describe each host's real permissions/LSP capabilities and keep navigation visible while short-terminal content scrolls.\n\n## [0.24.0] - 2026-10-31\n\n- Support the latest stable OpenCode 1.19.5 and 2.2.5 releases, preserving both host adapters and existing sidebar behavior.\n- Preserve Limits scales and reset-credit controls across equivalent quota snapshots and unrelated workspace events, while retaining current-account and credential-change guards.\n- Keep rounded selection backgrounds consistent in nested dialogs and highlighted rows.\n- Configure each toolbar button with zero to three icons and optional custom text, including text-only buttons. Keep legacy/state choices, unsaved drafts, rounded clipping, and width-aware More/wrapping.\n- Keep Quick Action rows and their hover/focus state stable while typing in the main prompt on both supported OpenCode hosts.\n- Show toolbar hover/focus hints without moving Limits or other sections, preserving centered, uniformly sized icon controls and empty-toolbar collapse.\n- Add Settings → About with the running versions, explicit update status/checking, confirmed updates, and a versioned changelog that can be reopened independently of first-launch upgrade notes.\n- Prepare editable Bug reports with confirmed sending through authenticated GitHub CLI and an independent Open in browser action. Retain drafts through errors and cancellation, and require manual review before retrying an uncertain submission.\n\n## [0.23.0] - 2026-10-28\n\n- Support only the latest stable OpenCode 1.x and 2.x releases, currently 1.19.5 and 2.2.0, including the newer terminal renderer.\n- Keep Skills, MCP servers, and Subagents current as OpenCode 2 updates, and launch the intended Skill when multiple sources have the same name.\n- Show OpenCode Console workspace budgets and Go allowance through the public host usage API without a Navigator server plugin. Preserve workspace scope, native units, reset times, and explicit failure/retry states.\n- Preserve Navigator shortcuts and nested-dialog navigation with OpenCode 2.2's keyboard handling.\n- Verify a supported runtime before changing a pinned Navigator snapshot, preserving the installed version when no compatible verifier is available.\n\n## [0.22.0] - 2026-10-23\n\n- Pin Quick Actions and Skills to a compact sidebar toolbar independently of bookmarks. Choose icons in a searchable picker, customize supported state icons, reorder buttons, and select a More menu or wrapping rows. Preserve Skill confirmations, unavailable reasons, keyboard navigation, and Text fallback; hide the toolbar entirely when empty.\n- Use OpenCode 2's built-in Todo history for the sidebar, with native completed-write and revert semantics, existing filters/progress, and manual Refresh. Keep edits in ordinary chat, preserve previous Navigator tasks as a read-only archive, and retain the independent provider-quota server integration.\n- Support OpenCode 2.1's plugin and rendering APIs while retaining the OpenCode 1.x adapter; restore custom dialogs and rounded selections on the newer native renderer.\n- Replace the shortcut toast with an icon-led hint featuring highlighted keys, navigation/update groups, a distinct Escape action, and responsive Text/no-corner-font layouts. Keep prompt focus and share its action list with scrollable keyboard help.\n- Update Subagent status immediately from OpenCode 2's execution lifecycle and keep unresolved external credentials separate from verified provider accounts.\n- Keep OpenCode updates on the current major line and preserve pinned-source Navigator updates when a target release needs newer runtime dependencies.\n\n## [0.21.8] - 2026-10-09\n\n- Make the unfilled part of Limits scales substantially quieter, matching the theme-derived sidebar-divider tone. Keep the filled segment, reset text, and remaining values readable in both icon modes and after theme changes.\n\n## [0.21.7] - 2026-10-09\n\n- Remove the vertical guide and its reserved gutter from Limits in both icon modes. Keep full-width quota scales, reset-left/remaining-right details, and one blank row between quota windows.\n\n## [0.21.6] - 2026-10-09\n\n- Refine Limits with a continuous muted guide, full-width thin-line quota scales, and reset-left/remaining-right details. Keep long reset text from overlapping the remaining value and preserve Text fallback, resize clipping, and existing controls.\n\n## [0.21.5] - 2026-10-07\n\n- Make automatic Limits refresh configurable in scoped Behavior settings and portable configuration, with a five-minute default and one-minute minimum. Keep manual Refresh and supported model/account switches immediate.\n- Avoid extra quota polling from unrelated preference changes and unchanged provider-account metadata observations.\n\n## [0.21.4] - 2026-10-07\n\n- Add `c` to Navigator shortcuts for a manual update check and `u` to check then confirm a Navigator update. Report available, current, or unavailable results, preserve the installation method and scope, and require a restart after updating.\n- Ignore cancelled, outdated, and repeated update confirmations, and recover from stalled update checks without blocking later checks.\n\n## [0.21.3] - 2026-10-06\n\n- Replace block quota meters with full-width adaptive thin-line scales and keep quota rows inside the sidebar's padding after resize. Show only reset time below each meter, removing technical account and window-duration suffixes.\n\n## [0.21.2] - 2026-10-06\n\n- Make Limits compact with clickable provider/model and variant controls, remaining-headroom progress rows, and muted reset times. Move Refresh and Banked Resets into the section header, remove the section counter and Provider sources action, and keep reset consumption behind a separate confirmation.\n\n## [0.21.1] - 2026-10-06\n\n- Fix Codex account quota windows being hidden when the provider omits model metadata. Show ordinary usage as shared account quota, retain banked-reset counts, and keep separate model buckets explicitly associated.\n\n## [0.21.0] - 2026-10-06\n\n- Automatically verify Codex account identity from OpenCode 2's ChatGPT connection. When host identity is unavailable, confirm a private binding once per connection or provider and reuse it across models, projects, and sessions; preserve compatible older confirmations and isolate conflicting ones until relinked.\n- Expand OpenCode 2 Limits with documented native subscription allowances, API rate-limit observations, configured capacities, account balances, and key budgets. Keep provider-native units, currencies, model associations, and active-account boundaries explicit.\n- Add Provider sources to explain each provider's supported measurements, required permissions, and unavailable APIs without guessing remaining quota.\n- Keep available account balances visible when a separate subscription read fails, and show exhausted NanoGPT subscription windows instead of hiding them.\n- Keep stale quota guidance visible after failed refreshes, reject late results after credential changes, and recover from stalled provider reads without blocking model response streams.\n\n## [0.20.0] - 2026-10-05\n\n- Add a default-visible Limits section for the selected model's provider-native quota windows, reset times, account identity, and freshness. Codex CLI support requires an explicit private account binding; unsupported providers show calm guidance.\n- Review Codex banked reset credits and use them only after a separate confirmation and fresh eligibility checks. Preserve the same attempt key when reconciling an uncertain result, including after a restart.\n- Save named, commit-safe project layout and MCP profiles to `.opencode/navigator.json` with the `opencode-navigator-profile` command, an explicit preview, and `--apply`; profile application remains manual.\n\n## [0.19.3] - 2026-10-03\n\n- Indent grouped Todo, Subagent, Skill, and MCP rows and align MCP server status indicators with their group headings.\n- Place Skill, MCP, and Quick Action bookmarks before item names. Reveal unselected bookmarks on hover or keyboard focus, keep favorites visible, and keep labels steady.\n\n## [0.19.2] - 2026-10-02\n\n- Show MCP group connection states with the same radio-style indicators as individual servers, without Connect/Disconnect labels on group headings.\n\n## [0.19.1] - 2026-10-02\n\n- Remember the OpenCode 1.x auto-approve mode as a user-wide default for new sessions, including changes made through the host's permission toggle.\n\n## [0.19.0] - 2026-10-02\n\n- Connect or disconnect all eligible MCP servers in a group from its heading, including filtered-out items, with keyboard access and failed-only retry.\n- Organize Skills into user-wide groups by source location, with Favorites first and group names searchable across the full catalog.\n- Reload saved Navigator settings from disk in another running OpenCode session without restarting it.\n\n## [0.18.2] - 2026-10-02\n\n- Open the host Settings dialog from the OpenCode 2.x Permissions Quick Action, where the user can change between `prompt` and `auto accept`; keep the direct auto-approve toggle on OpenCode 1.x.\n\n## [0.18.1] - 2026-10-01\n\n- Show calm Todo setup guidance in OpenCode 2.x when Navigator's server plugin is absent, without a request error or Retry control. Actual server failures still offer Retry.\n- Keep Quick Action names readable in narrow sidebars by placing unavailable reasons below them and showing shortcuts only when they fit.\n\n## [0.18.0] - 2026-10-01\n\n- Add durable per-session Todo lists to OpenCode 2.x through a separately configured Navigator server plugin and an agent Todo tool.\n- Update Todo in the sidebar as tasks change, and offer an off-by-default per-session switch for model-context Todo instructions.\n- Keep Todo visible with setup guidance when the OpenCode 2.x server plugin is missing.\n\n## [0.17.3] - 2026-09-30\n\n## [0.17.2] - 2026-09-30\n\n- Update a pinned local Navigator installation from its version label while keeping its file or directory source unchanged.\n- Hide the session title and creation date independently with Global/Worktree settings in OpenCode 1.x.\n\n## [0.17.1] - 2026-09-29\n\n- Fix the local Navigator installation changing unexpectedly when rebuilding the repository; it now stays on its pinned version.\n\n## [0.17.0] - 2026-09-29\n\n- Add an opt-in Behavior setting to start a new session directly in chat with the sidebar from Home or New session.\n- Remember the previously installed Navigator version and show the intervening release notes once after an update.\n\n## [0.16.1] - 2026-09-25\n\n- Make the entire OpenCode or Navigator version label open its own update confirmation when an update is available. The separator and the other version remain inactive.\n- Replace the small update arrow with a more prominent filled-circle Nerd Font indicator, retaining an ASCII fallback.\n\n## [0.16.0] - 2026-09-25\n\n- Show both OpenCode and Navigator versions in the OpenCode 2.x footer.\n- Confirm updates from the footer or command palette, preserve the original installation method and scope, and report the outcome with a restart reminder.\n\nEarlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).\n\n[0.22.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.8...v0.22.0\n[0.21.8]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.7...v0.21.8\n[0.21.7]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.6...v0.21.7\n[0.21.6]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.5...v0.21.6\n[0.21.5]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.4...v0.21.5\n[0.21.4]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.3...v0.21.4\n[0.21.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.2...v0.21.3\n[0.21.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.1...v0.21.2\n[0.21.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.0...v0.21.1\n[0.21.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.20.0...v0.21.0\n[0.20.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.3...v0.20.0\n[0.19.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.2...v0.19.3\n[0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2\n[0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1\n[0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0\n[0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2\n[0.18.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.0...v0.18.1\n[0.18.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.3...v0.18.0\n[0.17.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.2...v0.17.3\n[0.17.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.1...v0.17.2\n[0.17.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.0...v0.17.1\n[0.17.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.1...v0.17.0\n[0.16.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.0...v0.16.1\n[0.16.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.15.0...v0.16.0\n"
11409
+ version: "0.27.4",
11410
+ changelog: "# Changelog\n\n## [0.27.4] - 2026-11-12\n\n- Show banked-reset expiry progress in the terminal, with readable remaining time and explicit missing or invalid dates. Keep credit use separately confirmed.\n- Use native Desktop switches for individual MCP connections, whole groups and Search Everything results, with pending feedback and separate error information.\n- Split Desktop Settings into Layout, Behavior, Quick Actions, Skills, MCP, Presets and About categories. Keep scoped preferences, existing actions and unsaved drafts when switching categories.\n- Move between Desktop category buttons with Left/Right from the currently focused button, even when it is not the selected category.\n\n## [0.27.3] - 2026-11-12\n\n- Keep the Desktop session title on its own full-width row in both the panel and floating mini-window, with readable wrapping instead of squeezing it between action labels.\n- Use native icon buttons with tooltips for familiar sidebar actions such as Search, Refresh, Settings, Float, Dock and information. Keep descriptive labels for account linking, Banked Resets, presets and other less obvious operations.\n- Remove the persistent account/model scope explanation from successful Desktop Limits. Keep the short update time, quota data and actionable warnings without changing account scope or reset-credit safeguards.\n\n## [0.27.2] - 2026-11-11\n\n- Keep Desktop Settings fields and actions inside their rows at narrow widths, with readable labels and compact group creation.\n- Reorder Desktop sections, Quick Actions, toolbar pins and button icons by dragging their handles, or use Space and arrow keys to move them with the keyboard. Escape cancels an unfinished move.\n- Show download and installation progress in place of the running version in TUI and inline in Desktop About. Show real percentages only when byte totals are available; otherwise show the active stage.\n- Bring Desktop section arrows, loading indicators and Todo rows closer to native OpenCode. Completed and cancelled tasks use muted, struck-through text with distinct status icons.\n- Remove duplicate model and reasoning-effort selectors from the Desktop sidebar. Select them below chat instead; Limits continue to follow the active model.\n\n## [0.27.1] - 2026-11-11\n\n- Drag the Desktop mini-window by its header as well as its move handle, while keeping Dock a separate action. Match its surface and controls to OpenCode's light and dark themes.\n- Use native Desktop switches and selectors for Skill trust and Todo configuration, and align multiline fields with the host theme and focus styles.\n- Show a remaining-lifetime scale and time until expiry for banked reset credits with provider-supplied dates. Keep missing expiry explicit and prevent selecting expired credits for review.\n\n## [0.27.0] - 2026-11-11\n\n- Add an experimental OpenCode Desktop interface with a native panel, narrow-screen drawer, and opt-in in-app mini-window. Move, resize, reset and redock it with the mouse or keyboard while keeping the selected session and filters.\n- Bring Search Everything, Skills, MCP groups and presets, Quick Actions, and customizable toolbar pins to Desktop. Share private favorites, trust decisions and preferences with local TUI instances without duplicating monitoring.\n- Add native Desktop settings with scoped section controls, groups, reviewed presets and project profiles, portable import/export, a seven-slide setup guide, About, browsable release history and editable GitHub Bug reports.\n- Keep superseded Desktop configuration reads from showing a false error after a newer refresh, while preserving genuine failures and retry guidance.\n- Show verified provider/account quotas in Desktop with explicit account linking and separately confirmed banked resets. Keep remote sessions isolated from local accounts and preserve unresolved reset attempts across retries.\n- Support OpenCode 1.19.5 and 2.2.6 while preserving both TUI adapters, existing settings, pinned-source updates and read-only legacy Todo archives.\n\n## [0.26.0] - 2026-11-06\n\n- Prevent background retries from accumulating cancellation listeners and preferences loading from waiting indefinitely on recovery markers.\n- Show exact active Subagent durations from OpenCode 2's native execution start time, preserving the observation fallback when timing is unavailable. Keep interrupted executions marked as cancelled in recent history.\n\n## [0.25.0] - 2026-10-31\n\n- Offer Enable Todo when OpenCode 2's native tool is disabled, with an existing server-config picker, exact change preview and separate confirmation. Preserve unrelated JSONC content and refuse stale targets; distinguish disabled Todo from an enabled empty list.\n- Update the seven-slide setup wizard for native Todo enablement, provider/account limits, multi-icon or text-only toolbar pins, About/changelog and Bug reports. Describe each host's real permissions/LSP capabilities and keep navigation visible while short-terminal content scrolls.\n\n## [0.24.0] - 2026-10-31\n\n- Support the latest stable OpenCode 1.19.5 and 2.2.5 releases, preserving both host adapters and existing sidebar behavior.\n- Preserve Limits scales and reset-credit controls across equivalent quota snapshots and unrelated workspace events, while retaining current-account and credential-change guards.\n- Keep rounded selection backgrounds consistent in nested dialogs and highlighted rows.\n- Configure each toolbar button with zero to three icons and optional custom text, including text-only buttons. Keep legacy/state choices, unsaved drafts, rounded clipping, and width-aware More/wrapping.\n- Keep Quick Action rows and their hover/focus state stable while typing in the main prompt on both supported OpenCode hosts.\n- Show toolbar hover/focus hints without moving Limits or other sections, preserving centered, uniformly sized icon controls and empty-toolbar collapse.\n- Add Settings → About with the running versions, explicit update status/checking, confirmed updates, and a versioned changelog that can be reopened independently of first-launch upgrade notes.\n- Prepare editable Bug reports with confirmed sending through authenticated GitHub CLI and an independent Open in browser action. Retain drafts through errors and cancellation, and require manual review before retrying an uncertain submission.\n\n## [0.23.0] - 2026-10-28\n\n- Support only the latest stable OpenCode 1.x and 2.x releases, currently 1.19.5 and 2.2.0, including the newer terminal renderer.\n- Keep Skills, MCP servers, and Subagents current as OpenCode 2 updates, and launch the intended Skill when multiple sources have the same name.\n- Show OpenCode Console workspace budgets and Go allowance through the public host usage API without a Navigator server plugin. Preserve workspace scope, native units, reset times, and explicit failure/retry states.\n- Preserve Navigator shortcuts and nested-dialog navigation with OpenCode 2.2's keyboard handling.\n- Verify a supported runtime before changing a pinned Navigator snapshot, preserving the installed version when no compatible verifier is available.\n\n## [0.22.0] - 2026-10-23\n\n- Pin Quick Actions and Skills to a compact sidebar toolbar independently of bookmarks. Choose icons in a searchable picker, customize supported state icons, reorder buttons, and select a More menu or wrapping rows. Preserve Skill confirmations, unavailable reasons, keyboard navigation, and Text fallback; hide the toolbar entirely when empty.\n- Use OpenCode 2's built-in Todo history for the sidebar, with native completed-write and revert semantics, existing filters/progress, and manual Refresh. Keep edits in ordinary chat, preserve previous Navigator tasks as a read-only archive, and retain the independent provider-quota server integration.\n- Support OpenCode 2.1's plugin and rendering APIs while retaining the OpenCode 1.x adapter; restore custom dialogs and rounded selections on the newer native renderer.\n- Replace the shortcut toast with an icon-led hint featuring highlighted keys, navigation/update groups, a distinct Escape action, and responsive Text/no-corner-font layouts. Keep prompt focus and share its action list with scrollable keyboard help.\n- Update Subagent status immediately from OpenCode 2's execution lifecycle and keep unresolved external credentials separate from verified provider accounts.\n- Keep OpenCode updates on the current major line and preserve pinned-source Navigator updates when a target release needs newer runtime dependencies.\n\n## [0.21.8] - 2026-10-09\n\n- Make the unfilled part of Limits scales substantially quieter, matching the theme-derived sidebar-divider tone. Keep the filled segment, reset text, and remaining values readable in both icon modes and after theme changes.\n\n## [0.21.7] - 2026-10-09\n\n- Remove the vertical guide and its reserved gutter from Limits in both icon modes. Keep full-width quota scales, reset-left/remaining-right details, and one blank row between quota windows.\n\n## [0.21.6] - 2026-10-09\n\n- Refine Limits with a continuous muted guide, full-width thin-line quota scales, and reset-left/remaining-right details. Keep long reset text from overlapping the remaining value and preserve Text fallback, resize clipping, and existing controls.\n\n## [0.21.5] - 2026-10-07\n\n- Make automatic Limits refresh configurable in scoped Behavior settings and portable configuration, with a five-minute default and one-minute minimum. Keep manual Refresh and supported model/account switches immediate.\n- Avoid extra quota polling from unrelated preference changes and unchanged provider-account metadata observations.\n\n## [0.21.4] - 2026-10-07\n\n- Add `c` to Navigator shortcuts for a manual update check and `u` to check then confirm a Navigator update. Report available, current, or unavailable results, preserve the installation method and scope, and require a restart after updating.\n- Ignore cancelled, outdated, and repeated update confirmations, and recover from stalled update checks without blocking later checks.\n\n## [0.21.3] - 2026-10-06\n\n- Replace block quota meters with full-width adaptive thin-line scales and keep quota rows inside the sidebar's padding after resize. Show only reset time below each meter, removing technical account and window-duration suffixes.\n\n## [0.21.2] - 2026-10-06\n\n- Make Limits compact with clickable provider/model and variant controls, remaining-headroom progress rows, and muted reset times. Move Refresh and Banked Resets into the section header, remove the section counter and Provider sources action, and keep reset consumption behind a separate confirmation.\n\n## [0.21.1] - 2026-10-06\n\n- Fix Codex account quota windows being hidden when the provider omits model metadata. Show ordinary usage as shared account quota, retain banked-reset counts, and keep separate model buckets explicitly associated.\n\n## [0.21.0] - 2026-10-06\n\n- Automatically verify Codex account identity from OpenCode 2's ChatGPT connection. When host identity is unavailable, confirm a private binding once per connection or provider and reuse it across models, projects, and sessions; preserve compatible older confirmations and isolate conflicting ones until relinked.\n- Expand OpenCode 2 Limits with documented native subscription allowances, API rate-limit observations, configured capacities, account balances, and key budgets. Keep provider-native units, currencies, model associations, and active-account boundaries explicit.\n- Add Provider sources to explain each provider's supported measurements, required permissions, and unavailable APIs without guessing remaining quota.\n- Keep available account balances visible when a separate subscription read fails, and show exhausted NanoGPT subscription windows instead of hiding them.\n- Keep stale quota guidance visible after failed refreshes, reject late results after credential changes, and recover from stalled provider reads without blocking model response streams.\n\n## [0.20.0] - 2026-10-05\n\n- Add a default-visible Limits section for the selected model's provider-native quota windows, reset times, account identity, and freshness. Codex CLI support requires an explicit private account binding; unsupported providers show calm guidance.\n- Review Codex banked reset credits and use them only after a separate confirmation and fresh eligibility checks. Preserve the same attempt key when reconciling an uncertain result, including after a restart.\n- Save named, commit-safe project layout and MCP profiles to `.opencode/navigator.json` with the `opencode-navigator-profile` command, an explicit preview, and `--apply`; profile application remains manual.\n\n## [0.19.3] - 2026-10-03\n\n- Indent grouped Todo, Subagent, Skill, and MCP rows and align MCP server status indicators with their group headings.\n- Place Skill, MCP, and Quick Action bookmarks before item names. Reveal unselected bookmarks on hover or keyboard focus, keep favorites visible, and keep labels steady.\n\n## [0.19.2] - 2026-10-02\n\n- Show MCP group connection states with the same radio-style indicators as individual servers, without Connect/Disconnect labels on group headings.\n\n## [0.19.1] - 2026-10-02\n\n- Remember the OpenCode 1.x auto-approve mode as a user-wide default for new sessions, including changes made through the host's permission toggle.\n\n## [0.19.0] - 2026-10-02\n\n- Connect or disconnect all eligible MCP servers in a group from its heading, including filtered-out items, with keyboard access and failed-only retry.\n- Organize Skills into user-wide groups by source location, with Favorites first and group names searchable across the full catalog.\n- Reload saved Navigator settings from disk in another running OpenCode session without restarting it.\n\n## [0.18.2] - 2026-10-02\n\n- Open the host Settings dialog from the OpenCode 2.x Permissions Quick Action, where the user can change between `prompt` and `auto accept`; keep the direct auto-approve toggle on OpenCode 1.x.\n\n## [0.18.1] - 2026-10-01\n\n- Show calm Todo setup guidance in OpenCode 2.x when Navigator's server plugin is absent, without a request error or Retry control. Actual server failures still offer Retry.\n- Keep Quick Action names readable in narrow sidebars by placing unavailable reasons below them and showing shortcuts only when they fit.\n\n## [0.18.0] - 2026-10-01\n\n- Add durable per-session Todo lists to OpenCode 2.x through a separately configured Navigator server plugin and an agent Todo tool.\n- Update Todo in the sidebar as tasks change, and offer an off-by-default per-session switch for model-context Todo instructions.\n- Keep Todo visible with setup guidance when the OpenCode 2.x server plugin is missing.\n\n## [0.17.3] - 2026-09-30\n\n## [0.17.2] - 2026-09-30\n\n- Update a pinned local Navigator installation from its version label while keeping its file or directory source unchanged.\n- Hide the session title and creation date independently with Global/Worktree settings in OpenCode 1.x.\n\n## [0.17.1] - 2026-09-29\n\n- Fix the local Navigator installation changing unexpectedly when rebuilding the repository; it now stays on its pinned version.\n\n## [0.17.0] - 2026-09-29\n\n- Add an opt-in Behavior setting to start a new session directly in chat with the sidebar from Home or New session.\n- Remember the previously installed Navigator version and show the intervening release notes once after an update.\n\n## [0.16.1] - 2026-09-25\n\n- Make the entire OpenCode or Navigator version label open its own update confirmation when an update is available. The separator and the other version remain inactive.\n- Replace the small update arrow with a more prominent filled-circle Nerd Font indicator, retaining an ASCII fallback.\n\n## [0.16.0] - 2026-09-25\n\n- Show both OpenCode and Navigator versions in the OpenCode 2.x footer.\n- Confirm updates from the footer or command palette, preserve the original installation method and scope, and report the outcome with a restart reminder.\n\nEarlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).\n\n[0.22.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.8...v0.22.0\n[0.21.8]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.7...v0.21.8\n[0.21.7]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.6...v0.21.7\n[0.21.6]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.5...v0.21.6\n[0.21.5]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.4...v0.21.5\n[0.21.4]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.3...v0.21.4\n[0.21.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.2...v0.21.3\n[0.21.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.1...v0.21.2\n[0.21.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.0...v0.21.1\n[0.21.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.20.0...v0.21.0\n[0.20.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.3...v0.20.0\n[0.19.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.2...v0.19.3\n[0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2\n[0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1\n[0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0\n[0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2\n[0.18.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.0...v0.18.1\n[0.18.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.3...v0.18.0\n[0.17.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.2...v0.17.3\n[0.17.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.1...v0.17.2\n[0.17.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.0...v0.17.1\n[0.17.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.1...v0.17.0\n[0.16.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.0...v0.16.1\n[0.16.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.15.0...v0.16.0\n"
11198
11411
  };
11199
11412
  // src/app/gui/about.ts
11200
11413
  function createGuiAbout(context) {
@@ -11358,7 +11571,7 @@ function GuiCodexAccountDialog(props) {
11358
11571
  // src/features/provider-limits/ui/gui/reset-credit-expiry.tsx
11359
11572
  var _tmpl$$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=progressbar aria-valuemin=0 aria-valuemax=100 style=height:4px;overflow:hidden;border-radius:2px;background:var(--v2-border-border-base)><div style=width:100%;height:100%;background:var(--v2-text-text-base);transform-origin:left>`);
11360
11573
  var _tmpl$2$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;gap:6px;margin:8px 0"><span>`);
11361
- var _tmpl$3$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<time style=color:var(--v2-text-text-muted)>`);
11574
+ var _tmpl$3$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<time style=color:var(--v2-text-text-muted)>`);
11362
11575
  function GuiResetCreditExpiry(props) {
11363
11576
  const lifetime = () => resetCreditLifetime(props.credit, props.now);
11364
11577
  const expiry = () => {
@@ -11397,7 +11610,7 @@ function GuiResetCreditExpiry(props) {
11397
11610
  return expiry();
11398
11611
  },
11399
11612
  children: (date) => (() => {
11400
- var _el$5 = _tmpl$3$5();
11613
+ var _el$5 = _tmpl$3$6();
11401
11614
  (0, solid_js_web.insert)(_el$5, () => date().toLocaleString());
11402
11615
  (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$5, "datetime", date().toISOString()));
11403
11616
  return _el$5;
@@ -11409,9 +11622,9 @@ function GuiResetCreditExpiry(props) {
11409
11622
  // src/features/provider-limits/ui/gui/reset-dialog.tsx
11410
11623
  var _tmpl$$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
11411
11624
  var _tmpl$2$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>An earlier attempt is unresolved. Reconciliation reuses its original idempotency key and never creates a new attempt.`);
11412
- var _tmpl$3$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=padding:0;list-style:none>`);
11413
- var _tmpl$4$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Some credit details were not supplied by the provider.`);
11414
- var _tmpl$5$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Verifying the selected account and reset attempt…`);
11625
+ var _tmpl$3$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=padding:0;list-style:none>`);
11626
+ var _tmpl$4$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Some credit details were not supplied by the provider.`);
11627
+ var _tmpl$5$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Verifying the selected account and reset attempt…`);
11415
11628
  var _tmpl$6$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:8px 0"><strong></strong><p style=opacity:0.65>`);
11416
11629
  function GuiResetCreditDialog(props) {
11417
11630
  const Dialog = props.ui.Dialog;
@@ -11469,7 +11682,7 @@ function GuiResetCreditDialog(props) {
11469
11682
  }
11470
11683
  }),
11471
11684
  (() => {
11472
- var _el$3 = _tmpl$3$4();
11685
+ var _el$3 = _tmpl$3$5();
11473
11686
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
11474
11687
  get each() {
11475
11688
  return props.credits?.credits;
@@ -11506,7 +11719,7 @@ function GuiResetCreditDialog(props) {
11506
11719
  return (props.credits?.availableCount ?? 0) > (props.credits?.credits?.length ?? 0);
11507
11720
  },
11508
11721
  get children() {
11509
- return [_tmpl$4$4(), (0, solid_js_web.createComponent)(Button, {
11722
+ return [_tmpl$4$5(), (0, solid_js_web.createComponent)(Button, {
11510
11723
  get disabled() {
11511
11724
  return props.busy || Boolean(props.reason || props.pending);
11512
11725
  },
@@ -11520,7 +11733,7 @@ function GuiResetCreditDialog(props) {
11520
11733
  return props.busy;
11521
11734
  },
11522
11735
  get children() {
11523
- return _tmpl$5$2();
11736
+ return _tmpl$5$3();
11524
11737
  }
11525
11738
  })
11526
11739
  ];
@@ -14605,28 +14818,89 @@ function createGuiPresetDialogs(context, preferences, registry, mcp) {
14605
14818
  };
14606
14819
  }
14607
14820
  // src/features/search-everything/ui/gui/result-row.tsx
14608
- var _tmpl$$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status style=display:inline-flex;gap:6px;align-items:center>Working…`);
14609
- var _tmpl$2$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0"><button type=button style=flex:1;min-width:0;text-align:left;padding:8px;color:inherit;border:0;border-radius:6px><strong style=display:block;overflow-wrap:anywhere></strong><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
14821
+ var _tmpl$$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status> Updating connection…`);
14822
+ var _tmpl$2$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=flex:1;min-width:0;overflow-wrap:anywhere>`);
14823
+ var _tmpl$3$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0">`);
14824
+ var _tmpl$4$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status style=display:inline-flex;gap:6px;align-items:center>Working…`);
14825
+ var _tmpl$5$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<button type=button style=flex:1;min-width:0;text-align:left;padding:8px;color:inherit;border:0;border-radius:6px><strong style=display:block;overflow-wrap:anywhere></strong><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
14610
14826
  function GuiSearchResultRow(props) {
14611
14827
  const Button = props.ui.Button;
14612
14828
  const Loader = props.ui.Loader;
14829
+ const Switch = props.ui.Switch;
14613
14830
  return (() => {
14614
- var _el$ = _tmpl$2$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
14615
- _el$2.$$click = (event) => {
14616
- event.stopPropagation();
14617
- props.run();
14618
- };
14619
- (0, solid_js_web.addEventListener)(_el$2, "focus", props.focus);
14620
- (0, solid_js_web.insert)(_el$3, () => props.result.title);
14621
- (0, solid_js_web.insert)(_el$4, () => props.result.disabled || props.result.description);
14622
- (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
14831
+ var _el$ = _tmpl$3$4();
14832
+ (0, solid_js_web.addEventListener)(_el$, "focusin", props.focus, true);
14833
+ (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
14623
14834
  get when() {
14624
- return props.busy;
14835
+ return props.result.group === "MCP";
14836
+ },
14837
+ get fallback() {
14838
+ return (() => {
14839
+ var _el$5 = _tmpl$5$2(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
14840
+ _el$5.$$click = (event) => {
14841
+ event.stopPropagation();
14842
+ props.run();
14843
+ };
14844
+ (0, solid_js_web.addEventListener)(_el$5, "focus", props.focus);
14845
+ (0, solid_js_web.insert)(_el$6, () => props.result.title);
14846
+ (0, solid_js_web.insert)(_el$7, () => props.result.disabled || props.result.description);
14847
+ (0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(solid_js.Show, {
14848
+ get when() {
14849
+ return props.busy;
14850
+ },
14851
+ get children() {
14852
+ var _el$8 = _tmpl$4$4(), _el$9 = _el$8.firstChild;
14853
+ (0, solid_js_web.insert)(_el$8, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$9);
14854
+ return _el$8;
14855
+ }
14856
+ }), null);
14857
+ (0, solid_js_web.effect)((_p$) => {
14858
+ var _v$ = props.selected ? "true" : void 0, _v$2 = Boolean(props.result.disabled || props.busy), _v$3 = props.selected ? "var(--v2-overlay-simple-overlay-hover, color-mix(in srgb, currentColor 8%, transparent))" : "transparent", _v$4 = props.result.disabled ? "not-allowed" : "pointer";
14859
+ _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$5, "aria-current", _p$.e = _v$);
14860
+ _v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$5, "aria-disabled", _p$.t = _v$2);
14861
+ _v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$5, "background", _p$.a = _v$3);
14862
+ _v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$5, "cursor", _p$.o = _v$4);
14863
+ return _p$;
14864
+ }, {
14865
+ e: void 0,
14866
+ t: void 0,
14867
+ a: void 0,
14868
+ o: void 0
14869
+ });
14870
+ return _el$5;
14871
+ })();
14625
14872
  },
14626
14873
  get children() {
14627
- var _el$5 = _tmpl$$7(), _el$6 = _el$5.firstChild;
14628
- (0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$6);
14629
- return _el$5;
14874
+ var _el$2 = _tmpl$2$6();
14875
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Switch, {
14876
+ get label() {
14877
+ return props.result.title;
14878
+ },
14879
+ get description() {
14880
+ return props.result.disabled || props.result.description;
14881
+ },
14882
+ get checked() {
14883
+ return (0, solid_js_web.memo)(() => props.result.group === "MCP")() && props.result.connected === true;
14884
+ },
14885
+ get disabled() {
14886
+ return Boolean(props.result.disabled || props.busy);
14887
+ },
14888
+ get onChange() {
14889
+ return props.run;
14890
+ }
14891
+ }), null);
14892
+ (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Show, {
14893
+ get when() {
14894
+ return props.busy;
14895
+ },
14896
+ get children() {
14897
+ var _el$3 = _tmpl$$7(), _el$4 = _el$3.firstChild;
14898
+ (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$4);
14899
+ return _el$3;
14900
+ }
14901
+ }), null);
14902
+ (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$2, "aria-busy", props.busy));
14903
+ return _el$2;
14630
14904
  }
14631
14905
  }), null);
14632
14906
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
@@ -14661,23 +14935,10 @@ function GuiSearchResultRow(props) {
14661
14935
  });
14662
14936
  }
14663
14937
  }), null);
14664
- (0, solid_js_web.effect)((_p$) => {
14665
- var _v$ = props.selected ? "true" : void 0, _v$2 = Boolean(props.result.disabled || props.busy), _v$3 = props.selected ? "var(--v2-overlay-simple-overlay-hover, color-mix(in srgb, currentColor 8%, transparent))" : "transparent", _v$4 = props.result.disabled ? "not-allowed" : "pointer";
14666
- _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$2, "aria-current", _p$.e = _v$);
14667
- _v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$2, "aria-disabled", _p$.t = _v$2);
14668
- _v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$2, "background", _p$.a = _v$3);
14669
- _v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$2, "cursor", _p$.o = _v$4);
14670
- return _p$;
14671
- }, {
14672
- e: void 0,
14673
- t: void 0,
14674
- a: void 0,
14675
- o: void 0
14676
- });
14677
14938
  return _el$;
14678
14939
  })();
14679
14940
  }
14680
- (0, solid_js_web.delegateEvents)(["click"]);
14941
+ (0, solid_js_web.delegateEvents)(["focusin", "click"]);
14681
14942
  // src/features/search-everything/ui/gui/search-dialog.tsx
14682
14943
  var _tmpl$$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
14683
14944
  var _tmpl$2$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
@@ -15074,7 +15335,12 @@ function registerGuiSettings(context, services) {
15074
15335
  title: "Limits refresh",
15075
15336
  keywords: "quota interval minutes"
15076
15337
  }],
15077
- render: () => (0, solid_js_web.createComponent)(GuiNavigatorSettings, (0, solid_js_web.mergeProps)(services, { showGuide }))
15338
+ render: (input) => (0, solid_js_web.createComponent)(GuiNavigatorSettings, (0, solid_js_web.mergeProps)(services, {
15339
+ get target() {
15340
+ return input.target;
15341
+ },
15342
+ showGuide
15343
+ }))
15078
15344
  });
15079
15345
  context.add(_opencode_plugin_gui.Command, {
15080
15346
  id: "settings",
@@ -16178,7 +16444,7 @@ var setup = (context) => {
16178
16444
  try {
16179
16445
  await preferences.flush();
16180
16446
  context.toast.show({
16181
- title: `Navigator 0.27.3`,
16447
+ title: `Navigator 0.27.4`,
16182
16448
  variant: "default"
16183
16449
  });
16184
16450
  } catch {