opencode-navigator 0.27.0 → 0.27.1

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.
@@ -39,6 +39,37 @@ function normalizeProviderQuota(snapshot) {
39
39
  } }
40
40
  };
41
41
  }
42
+ // src/entities/provider-limit/model/reset-credit-lifetime.ts
43
+ function remainingLabel(seconds) {
44
+ if (seconds === 0) return "Expired";
45
+ if (seconds < 60) return "Expires in less than a minute";
46
+ for (const [unit, duration] of [
47
+ ["day", 86400],
48
+ ["hour", 3600],
49
+ ["minute", 60]
50
+ ]) {
51
+ if (seconds < duration) continue;
52
+ const count = Math.ceil(seconds / duration);
53
+ return `Expires in ${count} ${unit}${count === 1 ? "" : "s"}`;
54
+ }
55
+ return "Expiry not supplied by the provider";
56
+ }
57
+ function resetCreditLifetime(credit, now) {
58
+ const expiry = credit.expiresAt;
59
+ if (expiry === void 0 || !Number.isFinite(expiry) || expiry <= 0) return {
60
+ label: "Expiry not supplied by the provider",
61
+ remaining: void 0,
62
+ expired: false
63
+ };
64
+ const seconds = Math.max(0, expiry - now / 1e3);
65
+ const lifetime = expiry - credit.grantedAt;
66
+ const remaining = Number.isFinite(credit.grantedAt) && credit.grantedAt >= 0 && lifetime > 0 ? Math.max(0, Math.min(1, seconds / lifetime)) : void 0;
67
+ return {
68
+ label: remainingLabel(seconds),
69
+ remaining,
70
+ expired: seconds === 0
71
+ };
72
+ }
42
73
  // src/entities/provider-limit/model/account-identity.ts
43
74
  var CHATGPT_METHODS = /* @__PURE__ */ new Set(["chatgpt-browser", "chatgpt-headless"]);
44
75
  function providerAccountIdentity(provider, credentials) {
@@ -4644,14 +4675,14 @@ function preferencesIpc(pluginID) {
4644
4675
  var main = (context) => {
4645
4676
  const store = desktopPreferencesStore();
4646
4677
  const readAccount = createMainAccountReader(context);
4647
- const codex = createNodeCodexClient({ version: "0.27.0" });
4678
+ const codex = createNodeCodexClient({ version: "0.27.1" });
4648
4679
  context.onCleanup(codex.dispose);
4649
4680
  context.provide(preferencesIpc(context.id), createMainPreferencesHandlers(store));
4650
4681
  context.provide(localAccountIpc(context.id), { read: readAccount });
4651
4682
  context.provide(localCodexIpc(context.id), createMainCodexHandlers(context, store, codex));
4652
4683
  context.provide(pluginUpdateIpc(context.id), createMainPluginUpdate(context));
4653
4684
  context.provide(bugReportIpc(context.id), createMainBugReport(context.signal));
4654
- context.log.write("info", `Navigator 0.27.0 Desktop main ready`);
4685
+ context.log.write("info", `Navigator 0.27.1 Desktop main ready`);
4655
4686
  };
4656
4687
  // src/pages/navigator/ui/gui/context.tsx
4657
4688
  var NavigatorGuiContext = (0, solid_js.createContext)();
@@ -4661,11 +4692,11 @@ function useNavigatorGui() {
4661
4692
  return services;
4662
4693
  }
4663
4694
  // src/pages/navigator/ui/gui/bookmark.tsx
4664
- var _tmpl$$54 = /*#__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>`);
4695
+ var _tmpl$$55 = /*#__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>`);
4665
4696
  function SidebarBookmark(props) {
4666
4697
  const label = () => `${props.selected ? "Unbookmark" : "Bookmark"} ${props.title}`;
4667
4698
  return (() => {
4668
- var _el$ = _tmpl$$54(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild;
4699
+ var _el$ = _tmpl$$55(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild;
4669
4700
  _el$2.$$click = (event) => {
4670
4701
  event.stopPropagation();
4671
4702
  props.toggle();
@@ -4694,7 +4725,7 @@ function SidebarBookmark(props) {
4694
4725
  }
4695
4726
  (0, solid_js_web.delegateEvents)(["click"]);
4696
4727
  // src/pages/navigator/ui/gui/catalog-row.tsx
4697
- var _tmpl$$53 = /*#__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>`);
4728
+ var _tmpl$$54 = /*#__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>`);
4698
4729
  function navigate$1(event) {
4699
4730
  if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
4700
4731
  const buttons = [...event.currentTarget.querySelectorAll("button:not(:disabled)")];
@@ -4709,7 +4740,7 @@ function CatalogRow(props) {
4709
4740
  const [hovered, setHovered] = (0, solid_js.createSignal)(false);
4710
4741
  const [focused, setFocused] = (0, solid_js.createSignal)(false);
4711
4742
  return (() => {
4712
- var _el$ = _tmpl$$53(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
4743
+ var _el$ = _tmpl$$54(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
4713
4744
  _el$.$$keydown = navigate$1;
4714
4745
  _el$.$$focusout = (event) => {
4715
4746
  if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
@@ -4811,13 +4842,13 @@ function GuiActionRow(props) {
4811
4842
  });
4812
4843
  }
4813
4844
  // src/pages/navigator/ui/gui/section.tsx
4814
- var _tmpl$$52 = /*#__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></span><span style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></span><span style=opacity:0.55;font-weight:400>`);
4845
+ var _tmpl$$53 = /*#__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></span><span style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></span><span style=opacity:0.55;font-weight:400>`);
4815
4846
  function MonitoringSection(props) {
4816
4847
  const services = useNavigatorGui();
4817
4848
  const preferences = () => services.runtime.catalogs?.preferences;
4818
4849
  const expanded = () => preferences()?.expanded()[props.id] ?? true;
4819
4850
  return (() => {
4820
- var _el$ = _tmpl$$52(), _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;
4851
+ var _el$ = _tmpl$$53(), _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;
4821
4852
  _el$4.$$click = () => preferences()?.toggleSectionExpanded(props.id);
4822
4853
  (0, solid_js_web.insert)(_el$5, () => expanded() ? "⌄" : "›");
4823
4854
  (0, solid_js_web.insert)(_el$6, () => props.title);
@@ -4845,11 +4876,11 @@ function MonitoringSection(props) {
4845
4876
  }
4846
4877
  (0, solid_js_web.delegateEvents)(["click"]);
4847
4878
  // src/pages/navigator/ui/gui/section-filter.tsx
4848
- var _tmpl$$51 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
4879
+ var _tmpl$$52 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
4849
4880
  function SectionFilter(props) {
4850
4881
  const TextInput = useNavigatorGui().ui.TextInput;
4851
4882
  return (() => {
4852
- var _el$ = _tmpl$$51();
4883
+ var _el$ = _tmpl$$52();
4853
4884
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
4854
4885
  get label() {
4855
4886
  return props.label;
@@ -4869,8 +4900,8 @@ function SectionFilter(props) {
4869
4900
  })();
4870
4901
  }
4871
4902
  // src/pages/navigator/ui/gui/actions-section.tsx
4872
- var _tmpl$$50 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching actions.`);
4873
- var _tmpl$2$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
4903
+ var _tmpl$$51 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching actions.`);
4904
+ var _tmpl$2$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
4874
4905
  var _tmpl$3$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none>`);
4875
4906
  function ActionsSection() {
4876
4907
  const services = useNavigatorGui();
@@ -4896,7 +4927,7 @@ function ActionsSection() {
4896
4927
  }
4897
4928
  }),
4898
4929
  (() => {
4899
- var _el$ = _tmpl$2$33();
4930
+ var _el$ = _tmpl$2$34();
4900
4931
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
4901
4932
  get each() {
4902
4933
  return [true, false].filter((selected) => view().visibility.visible().some((id) => catalogs().preferences.favoriteQuickActions().has(id) === selected));
@@ -4917,7 +4948,7 @@ function ActionsSection() {
4917
4948
  return view().filtered().length === 0;
4918
4949
  },
4919
4950
  get children() {
4920
- return _tmpl$$50();
4951
+ return _tmpl$$51();
4921
4952
  }
4922
4953
  }), null);
4923
4954
  return _el$;
@@ -4942,11 +4973,11 @@ function ActionsSection() {
4942
4973
  });
4943
4974
  }
4944
4975
  // src/pages/navigator/ui/gui/quota-window.tsx
4945
- 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>`);
4976
+ var _tmpl$$50 = /*#__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>`);
4946
4977
  function GuiQuotaWindow(props) {
4947
4978
  const view = () => quotaPresentation(props.window);
4948
4979
  return (() => {
4949
- var _el$ = _tmpl$$49(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$2.nextSibling.firstChild, _el$6 = _el$5.nextSibling;
4980
+ var _el$ = _tmpl$$50(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$2.nextSibling.firstChild, _el$6 = _el$5.nextSibling;
4950
4981
  (0, solid_js_web.insert)(_el$5, () => view().reset);
4951
4982
  (0, solid_js_web.insert)(_el$6, () => view().value);
4952
4983
  (0, solid_js_web.effect)((_p$) => {
@@ -4968,10 +4999,10 @@ function GuiQuotaWindow(props) {
4968
4999
  })();
4969
5000
  }
4970
5001
  // src/pages/navigator/ui/gui/limits-section.tsx
4971
- var _tmpl$$48 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center;min-width:0>`);
4972
- var _tmpl$2$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5002
+ var _tmpl$$49 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center;min-width:0>`);
5003
+ var _tmpl$2$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
4973
5004
  var _tmpl$3$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>`);
4974
- var _tmpl$4$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
5005
+ var _tmpl$4$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
4975
5006
  function LimitsSection() {
4976
5007
  const props = useNavigatorGui();
4977
5008
  const limits = () => props.runtime.limits;
@@ -5017,7 +5048,7 @@ function LimitsSection() {
5017
5048
  get children() {
5018
5049
  return [
5019
5050
  (() => {
5020
- var _el$ = _tmpl$$48();
5051
+ var _el$ = _tmpl$$49();
5021
5052
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
5022
5053
  size: "small",
5023
5054
  variant: "ghost",
@@ -5061,7 +5092,7 @@ function LimitsSection() {
5061
5092
  return state()?.error;
5062
5093
  },
5063
5094
  get children() {
5064
- var _el$2 = _tmpl$2$32();
5095
+ var _el$2 = _tmpl$2$33();
5065
5096
  (0, solid_js_web.insert)(_el$2, () => state()?.error?.message);
5066
5097
  return _el$2;
5067
5098
  }
@@ -5090,7 +5121,7 @@ function LimitsSection() {
5090
5121
  return value().balances;
5091
5122
  },
5092
5123
  children: (balance) => (() => {
5093
- var _el$4 = _tmpl$4$13(), _el$5 = _el$4.firstChild;
5124
+ var _el$4 = _tmpl$4$12(), _el$5 = _el$4.firstChild;
5094
5125
  (0, solid_js_web.insert)(_el$4, () => balance.label, _el$5);
5095
5126
  (0, solid_js_web.insert)(_el$4, (() => {
5096
5127
  var _c$ = (0, solid_js_web.memo)(() => !!balance.unlimited);
@@ -5559,10 +5590,10 @@ function createMcpModel(options, persist, preferences) {
5559
5590
  };
5560
5591
  }
5561
5592
  // src/pages/navigator/ui/gui/mcp-indicator.tsx
5562
- var _tmpl$$47 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style="display:inline-flex;width:12px;height:12px;flex-shrink:0;border-radius:50%;border:1px solid currentColor">`);
5593
+ var _tmpl$$48 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style="display:inline-flex;width:12px;height:12px;flex-shrink:0;border-radius:50%;border:1px solid currentColor">`);
5563
5594
  function McpIndicator(props) {
5564
5595
  return (() => {
5565
- var _el$ = _tmpl$$47();
5596
+ var _el$ = _tmpl$$48();
5566
5597
  (0, solid_js_web.effect)((_p$) => {
5567
5598
  var _v$ = props.status, _v$2 = props.status === "pending" ? "dotted" : "solid", _v$3 = props.status === "connected" ? "currentColor" : "transparent", _v$4 = props.status === "failed" ? 1 : .65;
5568
5599
  _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
@@ -5630,7 +5661,7 @@ function GuiMcpRow(props) {
5630
5661
  });
5631
5662
  }
5632
5663
  // src/pages/navigator/ui/gui/mcp-group.tsx
5633
- var _tmpl$$46 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><button type=button style="display:flex;gap:6px;align-items:center;width:100%;padding:4px 0;border:0;background:transparent;color:inherit;text-align:left"><strong style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></strong><span style=opacity:0.6;font-weight:400></span></button><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
5664
+ var _tmpl$$47 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><button type=button style="display:flex;gap:6px;align-items:center;width:100%;padding:4px 0;border:0;background:transparent;color:inherit;text-align:left"><strong style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></strong><span style=opacity:0.6;font-weight:400></span></button><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
5634
5665
  function GuiMcpGroup(props) {
5635
5666
  const services = useNavigatorGui();
5636
5667
  const catalogs = () => services.runtime.catalogs;
@@ -5638,7 +5669,7 @@ function GuiMcpGroup(props) {
5638
5669
  const bucket = () => view().bucket(props.group);
5639
5670
  const busy = () => catalogs().mcp.bulkState().group === props.group && catalogs().mcp.bulkState().status === "running";
5640
5671
  return (() => {
5641
- var _el$ = _tmpl$$46(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling;
5672
+ var _el$ = _tmpl$$47(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling;
5642
5673
  _el$2.$$click = () => void catalogs().mcp.toggleGroup(props.group, bucket().map((item) => item.name))?.catch(() => {});
5643
5674
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(McpIndicator, { get status() {
5644
5675
  return mcpGroupStatus(bucket(), busy());
@@ -5664,10 +5695,10 @@ function GuiMcpGroup(props) {
5664
5695
  }
5665
5696
  (0, solid_js_web.delegateEvents)(["click"]);
5666
5697
  // src/pages/navigator/ui/gui/mcp-section.tsx
5667
- var _tmpl$$45 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5668
- var _tmpl$2$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>/<!> servers updated`);
5698
+ var _tmpl$$46 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5699
+ var _tmpl$2$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>/<!> servers updated`);
5669
5700
  var _tmpl$3$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
5670
- var _tmpl$4$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching MCP servers.`);
5701
+ var _tmpl$4$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching MCP servers.`);
5671
5702
  function McpSection() {
5672
5703
  const services = useNavigatorGui();
5673
5704
  const catalogs = () => services.runtime.catalogs;
@@ -5719,7 +5750,7 @@ function McpSection() {
5719
5750
  },
5720
5751
  get children() {
5721
5752
  return [(() => {
5722
- var _el$ = _tmpl$$45();
5753
+ var _el$ = _tmpl$$46();
5723
5754
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
5724
5755
  return _el$;
5725
5756
  })(), (0, solid_js_web.createComponent)(Button, {
@@ -5735,7 +5766,7 @@ function McpSection() {
5735
5766
  },
5736
5767
  get children() {
5737
5768
  return [(() => {
5738
- var _el$2 = _tmpl$2$31(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
5769
+ var _el$2 = _tmpl$2$32(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
5739
5770
  _el$5.nextSibling;
5740
5771
  (0, solid_js_web.insert)(_el$2, () => bulk().completed, _el$3);
5741
5772
  (0, solid_js_web.insert)(_el$2, () => bulk().total, _el$5);
@@ -5761,7 +5792,7 @@ function McpSection() {
5761
5792
  return view().groups();
5762
5793
  },
5763
5794
  get fallback() {
5764
- return _tmpl$4$12();
5795
+ return _tmpl$4$11();
5765
5796
  },
5766
5797
  children: (group) => (0, solid_js_web.createComponent)(GuiMcpGroup, { group })
5767
5798
  }));
@@ -5830,10 +5861,10 @@ function GuiSkillRow(props) {
5830
5861
  });
5831
5862
  }
5832
5863
  // src/pages/navigator/ui/gui/skills-section.tsx
5833
- var _tmpl$$44 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5834
- var _tmpl$2$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
5864
+ var _tmpl$$45 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
5865
+ var _tmpl$2$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
5835
5866
  var _tmpl$3$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching Skills.`);
5836
- 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">`);
5867
+ var _tmpl$4$10 = /*#__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">`);
5837
5868
  function SkillsSection() {
5838
5869
  const services = useNavigatorGui();
5839
5870
  const catalogs = () => services.runtime.catalogs;
@@ -5863,7 +5894,7 @@ function SkillsSection() {
5863
5894
  },
5864
5895
  get children() {
5865
5896
  return [(() => {
5866
- var _el$ = _tmpl$$44();
5897
+ var _el$ = _tmpl$$45();
5867
5898
  (0, solid_js_web.insert)(_el$, () => catalogs().skills.error());
5868
5899
  return _el$;
5869
5900
  })(), (0, solid_js_web.createComponent)(Button, {
@@ -5874,7 +5905,7 @@ function SkillsSection() {
5874
5905
  }
5875
5906
  }),
5876
5907
  (() => {
5877
- var _el$2 = _tmpl$2$30();
5908
+ var _el$2 = _tmpl$2$31();
5878
5909
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
5879
5910
  get each() {
5880
5911
  return view().groups();
@@ -5883,7 +5914,7 @@ function SkillsSection() {
5883
5914
  return _tmpl$3$18();
5884
5915
  },
5885
5916
  children: (group) => (() => {
5886
- var _el$4 = _tmpl$4$11(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
5917
+ var _el$4 = _tmpl$4$10(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
5887
5918
  (0, solid_js_web.insert)(_el$5, group);
5888
5919
  (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(solid_js.For, {
5889
5920
  get each() {
@@ -6338,8 +6369,8 @@ function createSubagentClock(key) {
6338
6369
  return now;
6339
6370
  }
6340
6371
  // src/shared/ui/gui/tabs.tsx
6341
- var _tmpl$$43 = /*#__PURE__*/ (0, solid_js_web.template)(`<nav style=display:flex;gap:4px;flex-wrap:wrap>`);
6342
- var _tmpl$2$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<span>`);
6372
+ var _tmpl$$44 = /*#__PURE__*/ (0, solid_js_web.template)(`<nav style=display:flex;gap:4px;flex-wrap:wrap>`);
6373
+ var _tmpl$2$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<span>`);
6343
6374
  var _tmpl$3$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
6344
6375
  function GuiTabs(props) {
6345
6376
  const Button = props.ui.Button;
@@ -6354,7 +6385,7 @@ function GuiTabs(props) {
6354
6385
  event.currentTarget.querySelectorAll("button:not(:disabled)")[next]?.focus();
6355
6386
  }
6356
6387
  return (() => {
6357
- var _el$ = _tmpl$$43();
6388
+ var _el$ = _tmpl$$44();
6358
6389
  _el$.$$keydown = navigate;
6359
6390
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
6360
6391
  get each() {
@@ -6373,7 +6404,7 @@ function GuiTabs(props) {
6373
6404
  onClick: () => props.onSelect(id),
6374
6405
  get children() {
6375
6406
  return [(() => {
6376
- var _el$2 = _tmpl$2$29();
6407
+ var _el$2 = _tmpl$2$30();
6377
6408
  (0, solid_js_web.insert)(_el$2, () => option().label);
6378
6409
  (0, solid_js_web.effect)((_$p) => (0, solid_js_web.setStyleProperty)(_el$2, "font-weight", props.selected === id ? "600" : "400"));
6379
6410
  return _el$2;
@@ -6447,8 +6478,8 @@ function iconChoiceLabel(id) {
6447
6478
  return id.replaceAll("-", " ");
6448
6479
  }
6449
6480
  // src/shared/ui/gui/icon.tsx
6450
- var _tmpl$$42 = /*#__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>`);
6451
- var _tmpl$2$28 = /*#__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>`);
6481
+ var _tmpl$$43 = /*#__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>`);
6482
+ var _tmpl$2$29 = /*#__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>`);
6452
6483
  var _tmpl$3$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path></svg>`, false, true, false);
6453
6484
  var native = {
6454
6485
  plus: "plus",
@@ -6515,14 +6546,14 @@ function GuiIcon(props) {
6515
6546
  const Icon = props.ui.Icon;
6516
6547
  const id = () => isIconChoiceId(props.id) ? props.id : "bolt";
6517
6548
  return (() => {
6518
- var _el$ = _tmpl$$42();
6549
+ var _el$ = _tmpl$$43();
6519
6550
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
6520
6551
  get when() {
6521
6552
  return native[id()];
6522
6553
  },
6523
6554
  get fallback() {
6524
6555
  return (() => {
6525
- var _el$2 = _tmpl$2$28();
6556
+ var _el$2 = _tmpl$2$29();
6526
6557
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
6527
6558
  get each() {
6528
6559
  return paths[id()] ?? paths.bolt;
@@ -6547,23 +6578,38 @@ function GuiIcon(props) {
6547
6578
  })();
6548
6579
  }
6549
6580
  // src/shared/ui/gui/multiline-field.tsx
6550
- var _tmpl$$41 = /*#__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:inherit;background:transparent;border:1px solid currentColor;border-radius:6px;padding:8px;font:inherit">`);
6581
+ var _tmpl$$42 = /*#__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">`);
6551
6582
  function GuiMultilineField(props) {
6552
6583
  const id = (0, solid_js.createUniqueId)();
6584
+ const [focused, setFocused] = (0, solid_js.createSignal)(false);
6553
6585
  return (() => {
6554
- var _el$ = _tmpl$$41(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
6586
+ var _el$ = _tmpl$$42(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
6555
6587
  (0, solid_js_web.setAttribute)(_el$, "for", id);
6556
6588
  (0, solid_js_web.insert)(_el$2, () => props.label);
6557
6589
  _el$3.$$input = (event) => props.onInput(event.currentTarget.value);
6590
+ _el$3.addEventListener("blur", () => setFocused(false));
6591
+ _el$3.addEventListener("focus", () => setFocused(true));
6558
6592
  (0, solid_js_web.setAttribute)(_el$3, "id", id);
6559
- (0, solid_js_web.effect)(() => _el$3.disabled = props.disabled);
6593
+ (0, solid_js_web.effect)((_p$) => {
6594
+ var _v$ = props.disabled, _v$2 = focused() ? "1px solid var(--v2-border-border-focus)" : "1px solid transparent", _v$3 = focused() ? "none" : "var(--v2-elevation-input)", _v$4 = props.disabled ? "0.5" : "1";
6595
+ _v$ !== _p$.e && (_el$3.disabled = _p$.e = _v$);
6596
+ _v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$3, "outline", _p$.t = _v$2);
6597
+ _v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$3, "box-shadow", _p$.a = _v$3);
6598
+ _v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$3, "opacity", _p$.o = _v$4);
6599
+ return _p$;
6600
+ }, {
6601
+ e: void 0,
6602
+ t: void 0,
6603
+ a: void 0,
6604
+ o: void 0
6605
+ });
6560
6606
  (0, solid_js_web.effect)(() => _el$3.value = props.value);
6561
6607
  return _el$;
6562
6608
  })();
6563
6609
  }
6564
6610
  (0, solid_js_web.delegateEvents)(["input"]);
6565
6611
  // src/shared/ui/gui/group-control.tsx
6566
- var _tmpl$$40 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
6612
+ var _tmpl$$41 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
6567
6613
  function GuiGroupControl(props) {
6568
6614
  const Select = props.ui.Select;
6569
6615
  const TextInput = props.ui.TextInput;
@@ -6571,7 +6617,7 @@ function GuiGroupControl(props) {
6571
6617
  const [draft, setDraft] = (0, solid_js.createSignal)("");
6572
6618
  (0, solid_js.createEffect)(() => setDraft(props.value ?? ""));
6573
6619
  return (() => {
6574
- var _el$ = _tmpl$$40();
6620
+ var _el$ = _tmpl$$41();
6575
6621
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Select, {
6576
6622
  get label() {
6577
6623
  return `${props.label} existing group`;
@@ -6621,12 +6667,12 @@ function GuiGroupControl(props) {
6621
6667
  })();
6622
6668
  }
6623
6669
  // src/pages/navigator/ui/gui/subagent-row.tsx
6624
- var _tmpl$$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<li><p style="font-size:12px;opacity:0.65;margin:0 0 8px;overflow-wrap:anywhere">`);
6625
- var _tmpl$2$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<span> · `);
6670
+ var _tmpl$$40 = /*#__PURE__*/ (0, solid_js_web.template)(`<li><p style="font-size:12px;opacity:0.65;margin:0 0 8px;overflow-wrap:anywhere">`);
6671
+ var _tmpl$2$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<span> · `);
6626
6672
  function SubagentRow(props) {
6627
6673
  const Button = props.ui.Button;
6628
6674
  return (() => {
6629
- var _el$ = _tmpl$$39(), _el$2 = _el$.firstChild;
6675
+ var _el$ = _tmpl$$40(), _el$2 = _el$.firstChild;
6630
6676
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
6631
6677
  size: "small",
6632
6678
  variant: "ghost",
@@ -6643,7 +6689,7 @@ function SubagentRow(props) {
6643
6689
  return props.item.run;
6644
6690
  },
6645
6691
  children: (run) => (() => {
6646
- var _el$3 = _tmpl$2$27();
6692
+ var _el$3 = _tmpl$2$28();
6647
6693
  _el$3.firstChild;
6648
6694
  (0, solid_js_web.insert)(_el$3, () => run().startedBeforeObservation ? "Observed after start · " : "", null);
6649
6695
  (0, solid_js_web.insert)(_el$3, () => formatSubagentDuration(run().startedAt, run().finishedAt ?? props.now), null);
@@ -6654,8 +6700,8 @@ function SubagentRow(props) {
6654
6700
  })();
6655
6701
  }
6656
6702
  // src/pages/navigator/ui/gui/subagent-section.tsx
6657
- var _tmpl$$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6658
- var _tmpl$2$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="padding:0;margin:8px 0 0;list-style:none">`);
6703
+ var _tmpl$$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6704
+ var _tmpl$2$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="padding:0;margin:8px 0 0;list-style:none">`);
6659
6705
  var _tmpl$3$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching subagents.`);
6660
6706
  function SubagentSection() {
6661
6707
  const props = useNavigatorGui();
@@ -6721,7 +6767,7 @@ function SubagentSection() {
6721
6767
  return state().error;
6722
6768
  },
6723
6769
  get children() {
6724
- var _el$ = _tmpl$$38();
6770
+ var _el$ = _tmpl$$39();
6725
6771
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
6726
6772
  return _el$;
6727
6773
  }
@@ -6734,7 +6780,7 @@ function SubagentSection() {
6734
6780
  return _tmpl$3$15();
6735
6781
  },
6736
6782
  get children() {
6737
- var _el$2 = _tmpl$2$26();
6783
+ var _el$2 = _tmpl$2$27();
6738
6784
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
6739
6785
  get each() {
6740
6786
  return keys();
@@ -6914,10 +6960,10 @@ function buildTodoView(todos, mode) {
6914
6960
  };
6915
6961
  }
6916
6962
  // src/pages/navigator/ui/gui/todo-row.tsx
6917
- var _tmpl$$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><span role=img style=opacity:0.6>`);
6963
+ var _tmpl$$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><span role=img style=opacity:0.6>`);
6918
6964
  function TodoRow(props) {
6919
6965
  return (() => {
6920
- var _el$ = _tmpl$$37(), _el$2 = _el$.firstChild;
6966
+ var _el$ = _tmpl$$38(), _el$2 = _el$.firstChild;
6921
6967
  (0, solid_js_web.insert)(_el$2, (() => {
6922
6968
  var _c$ = (0, solid_js_web.memo)(() => props.item.status === "completed");
6923
6969
  return () => _c$() ? "✓ " : props.item.status === "in_progress" ? "◉ " : "○ ";
@@ -6928,10 +6974,10 @@ function TodoRow(props) {
6928
6974
  })();
6929
6975
  }
6930
6976
  // src/pages/navigator/ui/gui/todo-section.tsx
6931
- var _tmpl$$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6932
- var _tmpl$2$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65;font-size:12px> completed of `);
6977
+ var _tmpl$$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
6978
+ var _tmpl$2$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65;font-size:12px> completed of `);
6933
6979
  var _tmpl$3$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Reading Todo configuration…`);
6934
- var _tmpl$4$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><p>`);
6980
+ var _tmpl$4$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><p>`);
6935
6981
  var _tmpl$5$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching tasks. Manage Todo through chat.`);
6936
6982
  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>`);
6937
6983
  function TodoSection() {
@@ -6966,7 +7012,7 @@ function TodoSection() {
6966
7012
  },
6967
7013
  get fallback() {
6968
7014
  return (() => {
6969
- var _el$6 = _tmpl$4$10(), _el$7 = _el$6.firstChild;
7015
+ var _el$6 = _tmpl$4$9(), _el$7 = _el$6.firstChild;
6970
7016
  (0, solid_js_web.insert)(_el$7, (() => {
6971
7017
  var _c$ = (0, solid_js_web.memo)(() => setup()?.status === "error");
6972
7018
  return () => _c$() ? setup()?.error : "Native Todo is disabled for this session.";
@@ -7030,7 +7076,7 @@ function TodoSection() {
7030
7076
  return state().error;
7031
7077
  },
7032
7078
  get children() {
7033
- var _el$ = _tmpl$$36();
7079
+ var _el$ = _tmpl$$37();
7034
7080
  (0, solid_js_web.insert)(_el$, () => state().error?.message);
7035
7081
  return _el$;
7036
7082
  }
@@ -7040,7 +7086,7 @@ function TodoSection() {
7040
7086
  return setup()?.status === "error";
7041
7087
  },
7042
7088
  get children() {
7043
- var _el$2 = _tmpl$$36();
7089
+ var _el$2 = _tmpl$$37();
7044
7090
  (0, solid_js_web.insert)(_el$2, () => setup()?.error);
7045
7091
  return _el$2;
7046
7092
  }
@@ -7054,7 +7100,7 @@ function TodoSection() {
7054
7100
  },
7055
7101
  get children() {
7056
7102
  return [(() => {
7057
- var _el$3 = _tmpl$2$25(), _el$4 = _el$3.firstChild;
7103
+ var _el$3 = _tmpl$2$26(), _el$4 = _el$3.firstChild;
7058
7104
  (0, solid_js_web.insert)(_el$3, () => rows().filter((item) => item.status === "completed").length, _el$4);
7059
7105
  (0, solid_js_web.insert)(_el$3, () => view().counts.all, null);
7060
7106
  return _el$3;
@@ -7094,7 +7140,7 @@ function TodoSection() {
7094
7140
  });
7095
7141
  }
7096
7142
  // src/pages/navigator/ui/gui/sections.tsx
7097
- var _tmpl$$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<hr style="border:0;border-top:1px solid currentColor;opacity:0.18;margin:14px 0">`);
7143
+ var _tmpl$$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<hr style="border:0;border-top:1px solid currentColor;opacity:0.18;margin:14px 0">`);
7098
7144
  function NavigatorSections() {
7099
7145
  const services = useNavigatorGui();
7100
7146
  const preferences = () => services.runtime.catalogs?.preferences;
@@ -7113,7 +7159,7 @@ function NavigatorSections() {
7113
7159
  return index() > 0;
7114
7160
  },
7115
7161
  get children() {
7116
- return _tmpl$$35();
7162
+ return _tmpl$$36();
7117
7163
  }
7118
7164
  }), (0, solid_js_web.createComponent)(solid_js.Switch, { get children() {
7119
7165
  return [
@@ -7158,7 +7204,7 @@ function NavigatorSections() {
7158
7204
  });
7159
7205
  }
7160
7206
  // src/features/pinned-toolbar/ui/gui/icon-picker.tsx
7161
- var _tmpl$$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(110px, 1fr));gap:4px;margin:8px 0">`);
7207
+ var _tmpl$$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(110px, 1fr));gap:4px;margin:8px 0">`);
7162
7208
  function GuiIconPicker(props) {
7163
7209
  const Dialog = props.ui.Dialog;
7164
7210
  const Button = props.ui.Button;
@@ -7186,7 +7232,7 @@ function GuiIconPicker(props) {
7186
7232
  autofocus: true,
7187
7233
  "class": "w-full"
7188
7234
  }), (() => {
7189
- var _el$ = _tmpl$$34();
7235
+ var _el$ = _tmpl$$35();
7190
7236
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
7191
7237
  get each() {
7192
7238
  return choices();
@@ -7213,8 +7259,8 @@ function GuiIconPicker(props) {
7213
7259
  });
7214
7260
  }
7215
7261
  // src/features/pinned-toolbar/ui/gui/icon-group.tsx
7216
- var _tmpl$$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<ol style=margin:0;padding:0;list-style:none>`);
7217
- var _tmpl$2$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;margin:4px 0">`);
7262
+ var _tmpl$$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<ol style=margin:0;padding:0;list-style:none>`);
7263
+ var _tmpl$2$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;margin:4px 0">`);
7218
7264
  function GuiIconGroupEditor(props) {
7219
7265
  const Dialog = props.ui.Dialog;
7220
7266
  const Button = props.ui.Button;
@@ -7254,13 +7300,13 @@ function GuiIconGroupEditor(props) {
7254
7300
  },
7255
7301
  get children() {
7256
7302
  return [(() => {
7257
- var _el$ = _tmpl$$33();
7303
+ var _el$ = _tmpl$$34();
7258
7304
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
7259
7305
  get each() {
7260
7306
  return values().map((_value, index) => index);
7261
7307
  },
7262
7308
  children: (index) => (() => {
7263
- var _el$2 = _tmpl$2$24();
7309
+ var _el$2 = _tmpl$2$25();
7264
7310
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
7265
7311
  variant: "ghost",
7266
7312
  onClick: () => choose(index),
@@ -7301,10 +7347,10 @@ function GuiIconGroupEditor(props) {
7301
7347
  });
7302
7348
  }
7303
7349
  // src/features/pinned-toolbar/ui/gui/pin-editor.tsx
7304
- var _tmpl$$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Base appearance`);
7305
- var _tmpl$2$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center><span>`);
7350
+ var _tmpl$$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Base appearance`);
7351
+ var _tmpl$2$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center><span>`);
7306
7352
  var _tmpl$3$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>Use a single line of up to 128 characters.`);
7307
- 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.`);
7353
+ 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.`);
7308
7354
  var _tmpl$5$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7309
7355
  function GuiPinEditor(props) {
7310
7356
  const initial = toolbarPinAppearance(props.pin);
@@ -7392,9 +7438,9 @@ function GuiPinEditor(props) {
7392
7438
  },
7393
7439
  get children() {
7394
7440
  return [
7395
- _tmpl$$32(),
7441
+ _tmpl$$33(),
7396
7442
  (() => {
7397
- var _el$2 = _tmpl$2$23(), _el$3 = _el$2.firstChild;
7443
+ var _el$2 = _tmpl$2$24(), _el$3 = _el$2.firstChild;
7398
7444
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
7399
7445
  get each() {
7400
7446
  return base();
@@ -7453,7 +7499,7 @@ function GuiPinEditor(props) {
7453
7499
  return Object.keys(states()).length > 0;
7454
7500
  },
7455
7501
  get children() {
7456
- return _tmpl$4$9();
7502
+ return _tmpl$4$8();
7457
7503
  }
7458
7504
  }),
7459
7505
  (0, solid_js_web.createComponent)(solid_js.Show, {
@@ -7471,10 +7517,10 @@ function GuiPinEditor(props) {
7471
7517
  });
7472
7518
  }
7473
7519
  // src/features/pinned-toolbar/ui/gui/manager.tsx
7474
- var _tmpl$$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7475
- var _tmpl$2$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<ol style=padding:0;margin:0;list-style:none>`);
7520
+ var _tmpl$$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
7521
+ var _tmpl$2$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<ol style=padding:0;margin:0;list-style:none>`);
7476
7522
  var _tmpl$3$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>Pin a Skill or Quick Action from its row menu.`);
7477
- var _tmpl$4$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<small style=display:block;opacity:0.6>`);
7523
+ var _tmpl$4$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<small style=display:block;opacity:0.6>`);
7478
7524
  var _tmpl$5$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<li 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>`);
7479
7525
  var source = (pin) => pin.kind === "skill" ? pin.location : void 0;
7480
7526
  function GuiToolbarManager(props) {
@@ -7520,12 +7566,12 @@ function GuiToolbarManager(props) {
7520
7566
  return error();
7521
7567
  },
7522
7568
  get children() {
7523
- var _el$ = _tmpl$$31();
7569
+ var _el$ = _tmpl$$32();
7524
7570
  (0, solid_js_web.insert)(_el$, error);
7525
7571
  return _el$;
7526
7572
  }
7527
7573
  }), (() => {
7528
- var _el$2 = _tmpl$2$22();
7574
+ var _el$2 = _tmpl$2$23();
7529
7575
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
7530
7576
  get each() {
7531
7577
  return props.pins.map((pin) => toolbarPinKey(pin));
@@ -7545,7 +7591,7 @@ function GuiToolbarManager(props) {
7545
7591
  return source(pin());
7546
7592
  },
7547
7593
  get children() {
7548
- var _el$7 = _tmpl$4$8();
7594
+ var _el$7 = _tmpl$4$7();
7549
7595
  (0, solid_js_web.insert)(_el$7, () => source(pin()));
7550
7596
  return _el$7;
7551
7597
  }
@@ -7714,8 +7760,8 @@ function createMeasuredToolbar() {
7714
7760
  };
7715
7761
  }
7716
7762
  // src/features/pinned-toolbar/ui/gui/toolbar-button.tsx
7717
- var _tmpl$$30 = /*#__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>`);
7718
- var _tmpl$2$21 = /*#__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>`);
7763
+ var _tmpl$$31 = /*#__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>`);
7764
+ var _tmpl$2$22 = /*#__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>`);
7719
7765
  var _tmpl$3$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:inline-flex;min-width:0;flex-shrink:0>`);
7720
7766
  function GuiToolbarButton(props) {
7721
7767
  const Button = props.ui.Button;
@@ -7737,11 +7783,11 @@ function GuiToolbarButton(props) {
7737
7783
  },
7738
7784
  get children() {
7739
7785
  return [(() => {
7740
- var _el$ = _tmpl$$30();
7786
+ var _el$ = _tmpl$$31();
7741
7787
  (0, solid_js_web.insert)(_el$, label);
7742
7788
  return _el$;
7743
7789
  })(), (() => {
7744
- var _el$2 = _tmpl$2$21(), _el$3 = _el$2.firstChild;
7790
+ var _el$2 = _tmpl$2$22(), _el$3 = _el$2.firstChild;
7745
7791
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
7746
7792
  get each() {
7747
7793
  return view().icons;
@@ -7800,8 +7846,8 @@ function GuiToolbarButton(props) {
7800
7846
  }
7801
7847
  (0, solid_js_web.delegateEvents)(["contextmenu", "keydown"]);
7802
7848
  // src/features/pinned-toolbar/ui/gui/toolbar.tsx
7803
- var _tmpl$$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<span data-toolbar-visible>`);
7804
- var _tmpl$2$20 = /*#__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>`);
7849
+ var _tmpl$$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<span data-toolbar-visible>`);
7850
+ var _tmpl$2$21 = /*#__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>`);
7805
7851
  function navigate(event) {
7806
7852
  if (event.defaultPrevented || event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
7807
7853
  const buttons = [...event.currentTarget.querySelectorAll(":scope [data-toolbar-visible] button")];
@@ -7825,7 +7871,7 @@ function GuiPinnedToolbar(props) {
7825
7871
  return keys().length > 0;
7826
7872
  },
7827
7873
  get children() {
7828
- var _el$ = _tmpl$2$20(), _el$3 = _el$.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
7874
+ var _el$ = _tmpl$2$21(), _el$3 = _el$.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
7829
7875
  _el$.$$keydown = navigate;
7830
7876
  var _ref$ = layout.root;
7831
7877
  typeof _ref$ === "function" ? (0, solid_js_web.use)(_ref$, _el$) : layout.root = _el$;
@@ -7861,7 +7907,7 @@ function GuiPinnedToolbar(props) {
7861
7907
  return hidden().length > 0;
7862
7908
  },
7863
7909
  get children() {
7864
- var _el$2 = _tmpl$$29();
7910
+ var _el$2 = _tmpl$$30();
7865
7911
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Menu, {
7866
7912
  label: "More toolbar items",
7867
7913
  trigger: "icon",
@@ -7952,7 +7998,7 @@ function NavigatorPinnedToolbar() {
7952
7998
  });
7953
7999
  }
7954
8000
  // src/pages/navigator/ui/gui/monitoring-content.tsx
7955
- var _tmpl$$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-content style=padding:12px;overflow-y:auto;min-height:0;flex:1;font-size:13px>`);
8001
+ var _tmpl$$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-content style=padding:12px;overflow-y:auto;min-height:0;flex:1;font-size:13px>`);
7956
8002
  function MonitoringContent(props) {
7957
8003
  let body;
7958
8004
  (0, solid_js.onMount)(() => {
@@ -7961,7 +8007,7 @@ function MonitoringContent(props) {
7961
8007
  return (0, solid_js_web.createComponent)(NavigatorGuiContext.Provider, {
7962
8008
  value: props,
7963
8009
  get children() {
7964
- var _el$ = _tmpl$$28();
8010
+ var _el$ = _tmpl$$29();
7965
8011
  _el$.addEventListener("scroll", (event) => props.onScroll?.(event.currentTarget.scrollTop));
7966
8012
  (0, solid_js_web.use)((node) => {
7967
8013
  body = node;
@@ -8531,9 +8577,15 @@ function createMiniWindowInteraction(props) {
8531
8577
  const update = (rect) => props.setRect(clampMiniWindow(rect, miniWindowViewport()));
8532
8578
  let drag;
8533
8579
  const resize = () => update(props.rect);
8534
- const end = () => {
8580
+ const end = (event) => {
8581
+ if (event && drag?.pointer !== event.pointerId) return;
8582
+ const previous = drag;
8535
8583
  drag = void 0;
8584
+ if (previous?.target.hasPointerCapture(previous.pointer)) previous.target.releasePointerCapture(previous.pointer);
8536
8585
  };
8586
+ (0, solid_js.createEffect)(() => {
8587
+ if (props.modal) end();
8588
+ });
8537
8589
  (0, solid_js.onMount)(() => {
8538
8590
  globalThis.window.addEventListener("resize", resize);
8539
8591
  globalThis.window.visualViewport?.addEventListener("resize", resize);
@@ -8545,19 +8597,22 @@ function createMiniWindowInteraction(props) {
8545
8597
  end();
8546
8598
  });
8547
8599
  function start(event, mode) {
8548
- if (event.button !== 0 || props.modal) return;
8600
+ if (event.button !== 0 || props.modal || drag) return;
8549
8601
  event.preventDefault();
8550
8602
  event.stopPropagation();
8551
- event.currentTarget.setPointerCapture(event.pointerId);
8603
+ const target = event.currentTarget;
8604
+ target.setPointerCapture(event.pointerId);
8552
8605
  drag = {
8553
8606
  mode,
8554
8607
  x: event.clientX,
8555
8608
  y: event.clientY,
8556
- rect: { ...props.rect }
8609
+ rect: { ...props.rect },
8610
+ pointer: event.pointerId,
8611
+ target
8557
8612
  };
8558
8613
  }
8559
8614
  function move(event) {
8560
- if (!drag || props.modal) return;
8615
+ if (!drag || props.modal || drag.pointer !== event.pointerId) return;
8561
8616
  const x = event.clientX - drag.x;
8562
8617
  const y = event.clientY - drag.y;
8563
8618
  update(drag.mode === "move" ? {
@@ -8607,17 +8662,28 @@ function createMiniWindowInteraction(props) {
8607
8662
  };
8608
8663
  }
8609
8664
  // src/pages/navigator/ui/gui/mini-window.tsx
8610
- var _tmpl$$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<aside data-navigator-floating style="position:fixed;display:flex;flex-direction:column;z-index:40;background:Canvas;color:CanvasText;border:1px solid color-mix(in srgb, currentColor 25%, transparent);border-radius:12px;box-shadow:0 8px 32px #0003;overflow:hidden;font-size:13px"><header style=display:flex;align-items:center;gap:4px;padding:8px;flex-wrap:wrap><button type=button aria-label="Move Navigator mini-window"title="Drag or use arrow keys; Shift moves ten pixels"style=cursor:move;touch-action:none>Move</button><strong style=flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap></strong></header><footer style=display:flex;gap:4px;padding:6px;align-items:center><button type=button aria-label="Resize Navigator mini-window"title="Drag or use arrow keys; Shift resizes ten pixels"style=margin-left:auto;cursor:nwse-resize;touch-action:none>Resize`);
8665
+ var _tmpl$$28 = /*#__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:flex;align-items:center;gap:4px;padding:8px;flex-wrap:wrap;cursor:move;touch-action:none;user-select:none><span data-navigator-move title="Drag or use arrow keys; Shift moves ten pixels"></span><strong style=flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap></strong></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>`);
8611
8666
  function NavigatorMiniWindow(props) {
8612
8667
  const Button = props.ui.Button;
8668
+ const IconButton = props.ui.IconButton;
8613
8669
  const interaction = createMiniWindowInteraction(props);
8670
+ function dragHeader(event) {
8671
+ const target = event.target;
8672
+ if (target.closest("button, input, select, textarea, a") && !target.closest("[data-navigator-move]")) return;
8673
+ interaction.start(event, "move");
8674
+ }
8614
8675
  return (() => {
8615
- var _el$ = _tmpl$$27(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling, _el$6 = _el$5.firstChild;
8676
+ var _el$ = _tmpl$$28(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling, _el$6 = _el$5.firstChild;
8677
+ (0, solid_js_web.addEventListener)(_el$2, "lostpointercapture", interaction.end);
8678
+ (0, solid_js_web.addEventListener)(_el$2, "pointercancel", interaction.end);
8679
+ (0, solid_js_web.addEventListener)(_el$2, "pointerup", interaction.end, true);
8680
+ (0, solid_js_web.addEventListener)(_el$2, "pointermove", interaction.move, true);
8681
+ _el$2.$$pointerdown = dragHeader;
8616
8682
  _el$3.$$keydown = (event) => interaction.key(event, "move");
8617
- (0, solid_js_web.addEventListener)(_el$3, "lostpointercapture", interaction.end);
8618
- (0, solid_js_web.addEventListener)(_el$3, "pointerup", interaction.end, true);
8619
- (0, solid_js_web.addEventListener)(_el$3, "pointermove", interaction.move, true);
8620
- _el$3.$$pointerdown = (event) => interaction.start(event, "move");
8683
+ (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(IconButton, {
8684
+ icon: "dot-grid",
8685
+ label: "Move Navigator mini-window"
8686
+ }));
8621
8687
  (0, solid_js_web.insert)(_el$4, () => props.title);
8622
8688
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
8623
8689
  size: "small",
@@ -8654,9 +8720,14 @@ function NavigatorMiniWindow(props) {
8654
8720
  }), _el$6);
8655
8721
  _el$6.$$keydown = (event) => interaction.key(event, "resize");
8656
8722
  (0, solid_js_web.addEventListener)(_el$6, "lostpointercapture", interaction.end);
8723
+ (0, solid_js_web.addEventListener)(_el$6, "pointercancel", interaction.end);
8657
8724
  (0, solid_js_web.addEventListener)(_el$6, "pointerup", interaction.end, true);
8658
8725
  (0, solid_js_web.addEventListener)(_el$6, "pointermove", interaction.move, true);
8659
8726
  _el$6.$$pointerdown = (event) => interaction.start(event, "resize");
8727
+ (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(IconButton, {
8728
+ icon: "outline-expand",
8729
+ label: "Resize Navigator mini-window"
8730
+ }));
8660
8731
  (0, solid_js_web.effect)((_p$) => {
8661
8732
  var _v$ = `Navigator mini-window: ${props.title}`, _v$2 = props.modal, _v$3 = props.modal, _v$4 = `${props.rect.x}px`, _v$5 = `${props.rect.y}px`, _v$6 = `${props.rect.width}px`, _v$7 = `${props.rect.height}px`, _v$8 = props.modal ? "hidden" : "visible", _v$9 = props.mode;
8662
8733
  _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
@@ -8690,13 +8761,13 @@ function NavigatorMiniWindow(props) {
8690
8761
  "keydown"
8691
8762
  ]);
8692
8763
  // src/pages/navigator/ui/gui/monitoring-panel.tsx
8693
- var _tmpl$$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-panel style=display:flex;flex-direction:column;height:100%;min-height:0><header style="padding:8px 12px;display:flex;gap:4px;align-items:center"><strong style=flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap>`);
8694
- var _tmpl$2$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=padding:12px><p>Navigator is in its mini-window.`);
8764
+ var _tmpl$$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-panel style=display:flex;flex-direction:column;height:100%;min-height:0><header style="padding:8px 12px;display:flex;gap:4px;align-items:center"><strong style=flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap>`);
8765
+ var _tmpl$2$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=padding:12px><p>Navigator is in its mini-window.`);
8695
8766
  var _tmpl$3$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator…`);
8696
8767
  function MonitoringPanel(props) {
8697
8768
  const Button = props.ui.Button;
8698
8769
  return (() => {
8699
- var _el$ = _tmpl$$26(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
8770
+ var _el$ = _tmpl$$27(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
8700
8771
  (0, solid_js_web.insert)(_el$3, () => props.title);
8701
8772
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
8702
8773
  size: "small",
@@ -8741,7 +8812,7 @@ function MonitoringPanel(props) {
8741
8812
  },
8742
8813
  get fallback() {
8743
8814
  return (() => {
8744
- var _el$4 = _tmpl$2$19();
8815
+ var _el$4 = _tmpl$2$20();
8745
8816
  _el$4.firstChild;
8746
8817
  (0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(Button, {
8747
8818
  size: "small",
@@ -8807,8 +8878,8 @@ function changesSince(source, previous, current) {
8807
8878
  return parseChangelog(source).filter((entry) => entry.changes.length > 0 && isNewerVersion(entry.version, previous) && !isNewerVersion(entry.version, current));
8808
8879
  }
8809
8880
  // src/features/sidebar-settings/ui/gui/mcp-preset-menu.tsx
8810
- var _tmpl$$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="margin:8px 0;padding:0;list-style:none">`);
8811
- var _tmpl$2$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching saved presets.`);
8881
+ var _tmpl$$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="margin:8px 0;padding:0;list-style:none">`);
8882
+ var _tmpl$2$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching saved presets.`);
8812
8883
  var _tmpl$3$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>`);
8813
8884
  function GuiMcpPresetMenu(props) {
8814
8885
  const Dialog = props.ui.Dialog;
@@ -8841,13 +8912,13 @@ function GuiMcpPresetMenu(props) {
8841
8912
  autofocus: true,
8842
8913
  "class": "w-full"
8843
8914
  }), (() => {
8844
- var _el$ = _tmpl$$25();
8915
+ var _el$ = _tmpl$$26();
8845
8916
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
8846
8917
  get each() {
8847
8918
  return names();
8848
8919
  },
8849
8920
  get fallback() {
8850
- return _tmpl$2$18();
8921
+ return _tmpl$2$19();
8851
8922
  },
8852
8923
  children: (name) => (() => {
8853
8924
  var _el$3 = _tmpl$3$9();
@@ -8865,8 +8936,8 @@ function GuiMcpPresetMenu(props) {
8865
8936
  });
8866
8937
  }
8867
8938
  // src/features/sidebar-settings/ui/gui/mcp-preview-rows.tsx
8868
- var _tmpl$$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3></h3><ul style=padding:0;list-style:none>`);
8869
- var _tmpl$2$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><strong></strong><p style="margin:2px 0;opacity:0.65"> · `);
8939
+ var _tmpl$$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3></h3><ul style=padding:0;list-style:none>`);
8940
+ var _tmpl$2$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><strong></strong><p style="margin:2px 0;opacity:0.65"> · `);
8870
8941
  var groups = [
8871
8942
  "Changes",
8872
8943
  "Skipped",
@@ -8884,7 +8955,7 @@ function GuiMcpPreviewRows(props) {
8884
8955
  return props.model.preview().rows.some((row) => group(row.change) === section);
8885
8956
  },
8886
8957
  get children() {
8887
- var _el$ = _tmpl$$24(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
8958
+ var _el$ = _tmpl$$25(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
8888
8959
  (0, solid_js_web.insert)(_el$2, section);
8889
8960
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
8890
8961
  get each() {
@@ -8893,7 +8964,7 @@ function GuiMcpPreviewRows(props) {
8893
8964
  children: (name) => {
8894
8965
  const row = () => props.model.preview().rows.find((item) => item.name === name);
8895
8966
  return (() => {
8896
- var _el$4 = _tmpl$2$17(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild;
8967
+ var _el$4 = _tmpl$2$18(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild;
8897
8968
  (0, solid_js_web.insert)(_el$5, name);
8898
8969
  (0, solid_js_web.insert)(_el$6, () => row().status ?? "Not available", _el$7);
8899
8970
  (0, solid_js_web.insert)(_el$6, () => row().change, null);
@@ -8911,8 +8982,8 @@ function GuiMcpPreviewRows(props) {
8911
8982
  });
8912
8983
  }
8913
8984
  // src/features/sidebar-settings/ui/gui/mcp-preset-preview.tsx
8914
- var _tmpl$$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
8915
- var _tmpl$2$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
8985
+ var _tmpl$$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
8986
+ var _tmpl$2$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
8916
8987
  function GuiMcpPresetPreview(props) {
8917
8988
  const Dialog = props.ui.Dialog;
8918
8989
  const Button = props.ui.Button;
@@ -8973,7 +9044,7 @@ function GuiMcpPresetPreview(props) {
8973
9044
  get children() {
8974
9045
  return [
8975
9046
  (() => {
8976
- var _el$ = _tmpl$$23();
9047
+ var _el$ = _tmpl$$24();
8977
9048
  (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.");
8978
9049
  return _el$;
8979
9050
  })(),
@@ -8982,7 +9053,7 @@ function GuiMcpPresetPreview(props) {
8982
9053
  return props.model.blocked() || error();
8983
9054
  },
8984
9055
  get children() {
8985
- var _el$2 = _tmpl$2$16();
9056
+ var _el$2 = _tmpl$2$17();
8986
9057
  (0, solid_js_web.insert)(_el$2, () => error() || props.model.blocked());
8987
9058
  return _el$2;
8988
9059
  }
@@ -8995,7 +9066,7 @@ function GuiMcpPresetPreview(props) {
8995
9066
  });
8996
9067
  }
8997
9068
  // src/features/sidebar-settings/ui/gui/settings-about.tsx
8998
- var _tmpl$$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9069
+ var _tmpl$$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
8999
9070
  function GuiSettingsAbout(props) {
9000
9071
  const Section = props.ui.SettingsSection;
9001
9072
  const Row = props.ui.SettingsRow;
@@ -9009,7 +9080,7 @@ function GuiSettingsAbout(props) {
9009
9080
  title: "About Navigator",
9010
9081
  get footer() {
9011
9082
  return (() => {
9012
- var _el$ = _tmpl$$22();
9083
+ var _el$ = _tmpl$$23();
9013
9084
  (0, solid_js_web.insert)(_el$, () => props.about.status());
9014
9085
  return _el$;
9015
9086
  })();
@@ -9096,7 +9167,7 @@ function GuiSettingsAbout(props) {
9096
9167
  })];
9097
9168
  }
9098
9169
  // src/features/sidebar-settings/ui/gui/settings-behavior.tsx
9099
- var _tmpl$$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;align-items:center>`);
9170
+ var _tmpl$$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;align-items:center>`);
9100
9171
  function GuiSettingsBehavior(props) {
9101
9172
  const Section = props.ui.SettingsSection;
9102
9173
  const Row = props.ui.SettingsRow;
@@ -9118,6 +9189,7 @@ function GuiSettingsBehavior(props) {
9118
9189
  get children() {
9119
9190
  return (0, solid_js_web.createComponent)(Switch, {
9120
9191
  label: "Remember MCP states",
9192
+ hideLabel: true,
9121
9193
  get checked() {
9122
9194
  return props.preferences.selectedPersistMcp();
9123
9195
  },
@@ -9179,7 +9251,7 @@ function GuiSettingsBehavior(props) {
9179
9251
  title: "Limits refresh",
9180
9252
  description: "Whole minutes, at least one. Manual refresh and model/account switches remain immediate.",
9181
9253
  get children() {
9182
- var _el$ = _tmpl$$21();
9254
+ var _el$ = _tmpl$$22();
9183
9255
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
9184
9256
  label: "Limits refresh in minutes",
9185
9257
  get value() {
@@ -9448,11 +9520,11 @@ function GuiSettingsCatalogs(props) {
9448
9520
  ];
9449
9521
  }
9450
9522
  // src/features/sidebar-settings/ui/gui/preset-controls.tsx
9451
- var _tmpl$$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
9523
+ var _tmpl$$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
9452
9524
  function GuiPresetControls(props) {
9453
9525
  const Button = props.ui.Button;
9454
9526
  return (() => {
9455
- var _el$ = _tmpl$$20();
9527
+ var _el$ = _tmpl$$21();
9456
9528
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
9457
9529
  size: "small",
9458
9530
  onClick: () => void props.presets.manage(props.kind, props.name, "rename"),
@@ -9473,8 +9545,8 @@ function GuiPresetControls(props) {
9473
9545
  })();
9474
9546
  }
9475
9547
  // src/features/sidebar-settings/ui/gui/settings-presets.tsx
9476
- var _tmpl$$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;flex-wrap:wrap>`);
9477
- var _tmpl$2$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9548
+ var _tmpl$$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;flex-wrap:wrap>`);
9549
+ var _tmpl$2$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9478
9550
  function GuiSettingsPresets(props) {
9479
9551
  const Section = props.ui.SettingsSection;
9480
9552
  const Row = props.ui.SettingsRow;
@@ -9501,7 +9573,7 @@ function GuiSettingsPresets(props) {
9501
9573
  return message();
9502
9574
  },
9503
9575
  get children() {
9504
- var _el$2 = _tmpl$2$15();
9576
+ var _el$2 = _tmpl$2$16();
9505
9577
  (0, solid_js_web.insert)(_el$2, message);
9506
9578
  return _el$2;
9507
9579
  }
@@ -9513,7 +9585,7 @@ function GuiSettingsPresets(props) {
9513
9585
  title: "Save current layout or MCP states",
9514
9586
  description: "Named presets are private and shared across worktrees.",
9515
9587
  get children() {
9516
- var _el$ = _tmpl$$19();
9588
+ var _el$ = _tmpl$$20();
9517
9589
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
9518
9590
  label: "New preset name",
9519
9591
  get value() {
@@ -9690,7 +9762,7 @@ function GuiSettingsResets(props) {
9690
9762
  });
9691
9763
  }
9692
9764
  // src/features/sidebar-settings/ui/gui/section-settings-row.tsx
9693
- var _tmpl$$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;align-items:center;flex-wrap:wrap>`);
9765
+ var _tmpl$$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;align-items:center;flex-wrap:wrap>`);
9694
9766
  function GuiSectionSettingsRow(props) {
9695
9767
  const Row = props.ui.SettingsRow;
9696
9768
  const Switch = props.ui.Switch;
@@ -9711,7 +9783,7 @@ function GuiSectionSettingsRow(props) {
9711
9783
  return props.section === "lsp" ? "LSP is not exposed by this Desktop API. Its saved layout is retained for supported TUI hosts." : void 0;
9712
9784
  },
9713
9785
  get children() {
9714
- var _el$ = _tmpl$$18();
9786
+ var _el$ = _tmpl$$19();
9715
9787
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
9716
9788
  size: "small",
9717
9789
  get disabled() {
@@ -9803,8 +9875,8 @@ function GuiSettingsSections(props) {
9803
9875
  });
9804
9876
  }
9805
9877
  // src/features/sidebar-settings/ui/gui/settings-page.tsx
9806
- var _tmpl$$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator preferences…`);
9807
- var _tmpl$2$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9878
+ var _tmpl$$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator preferences…`);
9879
+ var _tmpl$2$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
9808
9880
  function GuiNavigatorSettings(props) {
9809
9881
  const Layout = props.ui.SettingsLayout;
9810
9882
  const Section = props.ui.SettingsSection;
@@ -9835,7 +9907,7 @@ function GuiNavigatorSettings(props) {
9835
9907
  return props.preferences.ready();
9836
9908
  },
9837
9909
  get fallback() {
9838
- return _tmpl$$17();
9910
+ return _tmpl$$18();
9839
9911
  },
9840
9912
  get children() {
9841
9913
  return [
@@ -9847,7 +9919,7 @@ function GuiNavigatorSettings(props) {
9847
9919
  return status();
9848
9920
  },
9849
9921
  get children() {
9850
- var _el$2 = _tmpl$2$14();
9922
+ var _el$2 = _tmpl$2$15();
9851
9923
  (0, solid_js_web.insert)(_el$2, status);
9852
9924
  return _el$2;
9853
9925
  }
@@ -9931,10 +10003,10 @@ function GuiNavigatorSettings(props) {
9931
10003
  });
9932
10004
  }
9933
10005
  // src/features/sidebar-settings/ui/gui/onboarding-dialog.tsx
9934
- var _tmpl$$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Navigator guide content"style="max-height:min(52vh, 560px);overflow-y:auto">`);
9935
- var _tmpl$2$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
10006
+ 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">`);
10007
+ var _tmpl$2$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
9936
10008
  var _tmpl$3$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<dl>`);
9937
- 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">`);
10009
+ 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">`);
9938
10010
  var steps = createOnboardingSteps({
9939
10011
  nativeTodo: true,
9940
10012
  lsp: false,
@@ -9978,7 +10050,7 @@ function GuiOnboardingDialog(props) {
9978
10050
  ];
9979
10051
  },
9980
10052
  get children() {
9981
- var _el$ = _tmpl$$16();
10053
+ var _el$ = _tmpl$$17();
9982
10054
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
9983
10055
  get when() {
9984
10056
  return step();
@@ -9987,7 +10059,7 @@ function GuiOnboardingDialog(props) {
9987
10059
  return (0, solid_js_web.createComponent)(GuiSettingsSections, props);
9988
10060
  },
9989
10061
  children: (value) => [(() => {
9990
- var _el$2 = _tmpl$2$13();
10062
+ var _el$2 = _tmpl$2$14();
9991
10063
  (0, solid_js_web.insert)(_el$2, () => value().summary);
9992
10064
  return _el$2;
9993
10065
  })(), (() => {
@@ -9997,7 +10069,7 @@ function GuiOnboardingDialog(props) {
9997
10069
  return value().features;
9998
10070
  },
9999
10071
  children: (feature) => (() => {
10000
- var _el$4 = _tmpl$4$7(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$5.nextSibling;
10072
+ var _el$4 = _tmpl$4$6(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$5.nextSibling;
10001
10073
  (0, solid_js_web.insert)(_el$6, () => feature.title);
10002
10074
  (0, solid_js_web.insert)(_el$7, () => feature.description);
10003
10075
  return _el$4;
@@ -10011,8 +10083,8 @@ function GuiOnboardingDialog(props) {
10011
10083
  });
10012
10084
  }
10013
10085
  // src/features/sidebar-settings/ui/gui/bug-report-dialog.tsx
10014
- var _tmpl$$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
10015
- var _tmpl$2$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:grid;gap:16px;max-height:56vh;overflow-y:auto><p role=status>`);
10086
+ var _tmpl$$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
10087
+ var _tmpl$2$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:grid;gap:16px;max-height:56vh;overflow-y:auto><p role=status>`);
10016
10088
  function GuiBugReportDialog(props) {
10017
10089
  const Dialog = props.ui.Dialog;
10018
10090
  const TextInput = props.ui.TextInput;
@@ -10063,7 +10135,7 @@ function GuiBugReportDialog(props) {
10063
10135
  ];
10064
10136
  },
10065
10137
  get children() {
10066
- var _el$ = _tmpl$2$12(), _el$2 = _el$.firstChild;
10138
+ var _el$ = _tmpl$2$13(), _el$2 = _el$.firstChild;
10067
10139
  (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
10068
10140
  label: "Bug report title",
10069
10141
  get value() {
@@ -10095,7 +10167,7 @@ function GuiBugReportDialog(props) {
10095
10167
  return props.model.message() || props.model.result()?.message || error();
10096
10168
  },
10097
10169
  get children() {
10098
- var _el$3 = _tmpl$$15();
10170
+ var _el$3 = _tmpl$$16();
10099
10171
  (0, solid_js_web.insert)(_el$3, () => error() || props.model.result()?.message || props.model.message());
10100
10172
  return _el$3;
10101
10173
  }
@@ -10131,7 +10203,7 @@ function GuiBugReportDialog(props) {
10131
10203
  });
10132
10204
  }
10133
10205
  // src/features/sidebar-settings/ui/gui/bug-report-confirmation.tsx
10134
- var _tmpl$$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Bug report confirmation"style=max-height:52vh;overflow-y:auto;overflow-wrap:anywhere><h3></h3><pre style=white-space:pre-wrap;font:inherit>`);
10206
+ var _tmpl$$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Bug report confirmation"style=max-height:52vh;overflow-y:auto;overflow-wrap:anywhere><h3></h3><pre style=white-space:pre-wrap;font:inherit>`);
10135
10207
  function GuiBugReportConfirmation(props) {
10136
10208
  const Dialog = props.ui.Dialog;
10137
10209
  const Button = props.ui.Button;
@@ -10169,7 +10241,7 @@ function GuiBugReportConfirmation(props) {
10169
10241
  })];
10170
10242
  },
10171
10243
  get children() {
10172
- var _el$ = _tmpl$$14(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
10244
+ var _el$ = _tmpl$$15(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
10173
10245
  (0, solid_js_web.insert)(_el$2, () => props.draft.title);
10174
10246
  (0, solid_js_web.insert)(_el$3, () => props.draft.body);
10175
10247
  return _el$;
@@ -10177,10 +10249,10 @@ function GuiBugReportConfirmation(props) {
10177
10249
  });
10178
10250
  }
10179
10251
  // src/features/sidebar-settings/ui/gui/layout-preset-preview.tsx
10180
- var _tmpl$$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10181
- var _tmpl$2$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=max-height:52vh;overflow-y:auto>`);
10252
+ var _tmpl$$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10253
+ var _tmpl$2$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=max-height:52vh;overflow-y:auto>`);
10182
10254
  var _tmpl$3$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0"><strong></strong><p>Visibility: <!> → <!> · <!> → <!> · position <!> → `);
10183
- var _tmpl$4$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>MCP scope: `);
10255
+ var _tmpl$4$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>MCP scope: `);
10184
10256
  function GuiLayoutPresetPreview(props) {
10185
10257
  const Dialog = props.ui.Dialog;
10186
10258
  const Button = props.ui.Button;
@@ -10233,13 +10305,13 @@ function GuiLayoutPresetPreview(props) {
10233
10305
  return props.model.blocked() || !props.current() || error();
10234
10306
  },
10235
10307
  get children() {
10236
- var _el$ = _tmpl$$13();
10308
+ var _el$ = _tmpl$$14();
10237
10309
  (0, solid_js_web.insert)(_el$, () => error() || props.model.blocked() || "Server or session changed. Reopen the preview.");
10238
10310
  return _el$;
10239
10311
  }
10240
10312
  }),
10241
10313
  (() => {
10242
- var _el$2 = _tmpl$2$11();
10314
+ var _el$2 = _tmpl$2$12();
10243
10315
  (0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
10244
10316
  get each() {
10245
10317
  return props.model.layout.preview()?.rows;
@@ -10264,7 +10336,7 @@ function GuiLayoutPresetPreview(props) {
10264
10336
  return props.model.mcp;
10265
10337
  },
10266
10338
  children: (model) => [(() => {
10267
- var _el$17 = _tmpl$4$6();
10339
+ var _el$17 = _tmpl$4$5();
10268
10340
  _el$17.firstChild;
10269
10341
  (0, solid_js_web.insert)(_el$17, () => model().scope, null);
10270
10342
  return _el$17;
@@ -10277,8 +10349,8 @@ function GuiLayoutPresetPreview(props) {
10277
10349
  });
10278
10350
  }
10279
10351
  // src/features/sidebar-settings/ui/gui/portable-dialog.tsx
10280
- var _tmpl$$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10281
- var _tmpl$2$10 = /*#__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>`);
10352
+ var _tmpl$$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10353
+ 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>`);
10282
10354
  var _tmpl$3$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Skipped unsupported field: `);
10283
10355
  function GuiPortableSettingsDialog(props) {
10284
10356
  const Dialog = props.ui.Dialog;
@@ -10358,7 +10430,7 @@ function GuiPortableSettingsDialog(props) {
10358
10430
  return error() || !props.current();
10359
10431
  },
10360
10432
  get children() {
10361
- var _el$ = _tmpl$$12();
10433
+ var _el$ = _tmpl$$13();
10362
10434
  (0, solid_js_web.insert)(_el$, () => error() || "Server or session changed. Reopen the import.");
10363
10435
  return _el$;
10364
10436
  }
@@ -10376,7 +10448,7 @@ function GuiPortableSettingsDialog(props) {
10376
10448
  });
10377
10449
  },
10378
10450
  children: (value) => (() => {
10379
- var _el$2 = _tmpl$2$10(), _el$3 = _el$2.firstChild;
10451
+ var _el$2 = _tmpl$2$11(), _el$3 = _el$2.firstChild;
10380
10452
  _el$3.firstChild;
10381
10453
  var _el$5 = _el$3.nextSibling, _el$1 = _el$5.firstChild.nextSibling, _el$10 = _el$1.nextSibling.nextSibling;
10382
10454
  _el$10.nextSibling;
@@ -10404,8 +10476,8 @@ function GuiPortableSettingsDialog(props) {
10404
10476
  });
10405
10477
  }
10406
10478
  // src/features/sidebar-settings/ui/gui/project-profile-dialog.tsx
10407
- var _tmpl$$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10408
- var _tmpl$2$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Project profile file changes"style=max-height:52vh;overflow-y:auto><p></p><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
10479
+ var _tmpl$$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10480
+ var _tmpl$2$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<div tabindex=0 aria-label="Project profile file changes"style=max-height:52vh;overflow-y:auto><p></p><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
10409
10481
  function GuiProjectProfileDialog(props) {
10410
10482
  const Dialog = props.ui.Dialog;
10411
10483
  const Button = props.ui.Button;
@@ -10490,7 +10562,7 @@ function GuiProjectProfileDialog(props) {
10490
10562
  return error() || !props.current();
10491
10563
  },
10492
10564
  get children() {
10493
- var _el$ = _tmpl$$11();
10565
+ var _el$ = _tmpl$$12();
10494
10566
  (0, solid_js_web.insert)(_el$, () => error() || "Scope, server or location changed. Reopen this profile.");
10495
10567
  return _el$;
10496
10568
  }
@@ -10514,7 +10586,7 @@ function GuiProjectProfileDialog(props) {
10514
10586
  })];
10515
10587
  },
10516
10588
  children: (value) => (() => {
10517
- var _el$2 = _tmpl$2$9(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
10589
+ var _el$2 = _tmpl$2$10(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
10518
10590
  (0, solid_js_web.insert)(_el$3, () => value().file);
10519
10591
  (0, solid_js_web.insert)(_el$4, () => value().after);
10520
10592
  return _el$2;
@@ -10532,7 +10604,7 @@ function createGuiBugReport(context) {
10532
10604
  let token = "";
10533
10605
  (0, solid_js.onCleanup)(() => abort.abort());
10534
10606
  const model = createBugReportModel({
10535
- navigatorVersion: "0.27.0",
10607
+ navigatorVersion: "0.27.1",
10536
10608
  openCodeVersion: context.app.version,
10537
10609
  platform: context.app.platform,
10538
10610
  runtime: "OpenCode Desktop GUI"
@@ -10584,8 +10656,8 @@ function createGuiBugReport(context) {
10584
10656
  }
10585
10657
  // src/app/gui/release.ts
10586
10658
  var guiRelease = {
10587
- version: "0.27.0",
10588
- changelog: "# Changelog\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"
10659
+ version: "0.27.1",
10660
+ changelog: "# Changelog\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"
10589
10661
  };
10590
10662
  // src/app/gui/about.ts
10591
10663
  function createGuiAbout(context) {
@@ -10640,8 +10712,8 @@ function createGuiAbout(context) {
10640
10712
  };
10641
10713
  }
10642
10714
  // src/features/provider-limits/ui/gui/account-dialog.tsx
10643
- var _tmpl$$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10644
- var _tmpl$2$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Use Codex CLI account <strong></strong> for the selected <strong></strong> connection across models, projects and sessions? Only confirm matching accounts.`);
10715
+ var _tmpl$$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10716
+ var _tmpl$2$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Use Codex CLI account <strong></strong> for the selected <strong></strong> connection across models, projects and sessions? Only confirm matching accounts.`);
10645
10717
  function GuiCodexAccountDialog(props) {
10646
10718
  const Dialog = props.ui.Dialog;
10647
10719
  const Button = props.ui.Button;
@@ -10723,7 +10795,7 @@ function GuiCodexAccountDialog(props) {
10723
10795
  return preview();
10724
10796
  },
10725
10797
  children: (value) => (() => {
10726
- var _el$2 = _tmpl$2$8(), _el$4 = _el$2.firstChild.nextSibling, _el$7 = _el$4.nextSibling.nextSibling;
10798
+ var _el$2 = _tmpl$2$9(), _el$4 = _el$2.firstChild.nextSibling, _el$7 = _el$4.nextSibling.nextSibling;
10727
10799
  (0, solid_js_web.insert)(_el$4, () => value().accountID);
10728
10800
  (0, solid_js_web.insert)(_el$7, () => value().model.providerID);
10729
10801
  return _el$2;
@@ -10733,7 +10805,7 @@ function GuiCodexAccountDialog(props) {
10733
10805
  return error();
10734
10806
  },
10735
10807
  get children() {
10736
- var _el$ = _tmpl$$10();
10808
+ var _el$ = _tmpl$$11();
10737
10809
  (0, solid_js_web.insert)(_el$, error);
10738
10810
  return _el$;
10739
10811
  }
@@ -10741,16 +10813,72 @@ function GuiCodexAccountDialog(props) {
10741
10813
  }
10742
10814
  });
10743
10815
  }
10816
+ // src/features/provider-limits/ui/gui/reset-credit-expiry.tsx
10817
+ 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>`);
10818
+ var _tmpl$2$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;gap:6px;margin:8px 0"><span>`);
10819
+ var _tmpl$3$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<time style=color:var(--v2-text-text-muted)>`);
10820
+ function GuiResetCreditExpiry(props) {
10821
+ const lifetime = () => resetCreditLifetime(props.credit, props.now);
10822
+ const expiry = () => {
10823
+ const timestamp = props.credit.expiresAt;
10824
+ if (timestamp === void 0 || timestamp <= 0) return;
10825
+ const date = /* @__PURE__ */ new Date(timestamp * 1e3);
10826
+ return Number.isFinite(date.getTime()) ? date : void 0;
10827
+ };
10828
+ return (() => {
10829
+ var _el$ = _tmpl$2$8(), _el$4 = _el$.firstChild;
10830
+ (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
10831
+ get when() {
10832
+ return lifetime().remaining !== void 0;
10833
+ },
10834
+ get children() {
10835
+ var _el$2 = _tmpl$$10(), _el$3 = _el$2.firstChild;
10836
+ (0, solid_js_web.effect)((_p$) => {
10837
+ var _v$ = `Time remaining for ${props.credit.title || `Credit ${props.credit.id}`}`, _v$2 = Math.round((lifetime().remaining ?? 0) * 100), _v$3 = lifetime().label, _v$4 = `scaleX(${lifetime().remaining ?? 0})`;
10838
+ _v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$2, "aria-label", _p$.e = _v$);
10839
+ _v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$2, "aria-valuenow", _p$.t = _v$2);
10840
+ _v$3 !== _p$.a && (0, solid_js_web.setAttribute)(_el$2, "aria-valuetext", _p$.a = _v$3);
10841
+ _v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$3, "transform", _p$.o = _v$4);
10842
+ return _p$;
10843
+ }, {
10844
+ e: void 0,
10845
+ t: void 0,
10846
+ a: void 0,
10847
+ o: void 0
10848
+ });
10849
+ return _el$2;
10850
+ }
10851
+ }), _el$4);
10852
+ (0, solid_js_web.insert)(_el$4, () => lifetime().label);
10853
+ (0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
10854
+ get when() {
10855
+ return expiry();
10856
+ },
10857
+ children: (date) => (() => {
10858
+ var _el$5 = _tmpl$3$5();
10859
+ (0, solid_js_web.insert)(_el$5, () => date().toLocaleString());
10860
+ (0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$5, "datetime", date().toISOString()));
10861
+ return _el$5;
10862
+ })()
10863
+ }), null);
10864
+ return _el$;
10865
+ })();
10866
+ }
10744
10867
  // src/features/provider-limits/ui/gui/reset-dialog.tsx
10745
10868
  var _tmpl$$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
10746
10869
  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.`);
10747
- var _tmpl$3$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=padding:0;list-style:none>`);
10748
- var _tmpl$4$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Some credit details were not supplied by the provider.`);
10870
+ var _tmpl$3$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=padding:0;list-style:none>`);
10871
+ var _tmpl$4$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Some credit details were not supplied by the provider.`);
10749
10872
  var _tmpl$5$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Verifying the selected account and reset attempt…`);
10750
10873
  var _tmpl$6$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:8px 0"><strong></strong><p style=opacity:0.65>`);
10751
10874
  function GuiResetCreditDialog(props) {
10752
10875
  const Dialog = props.ui.Dialog;
10753
10876
  const Button = props.ui.Button;
10877
+ const [now, setNow] = (0, solid_js.createSignal)(Date.now());
10878
+ (0, solid_js.onMount)(() => {
10879
+ const timer = setInterval(() => setNow(Date.now()), 1e3);
10880
+ (0, solid_js.onCleanup)(() => clearInterval(timer));
10881
+ });
10754
10882
  (0, solid_js.createEffect)(() => {
10755
10883
  if (!props.current() && !props.busy) props.close();
10756
10884
  });
@@ -10799,7 +10927,7 @@ function GuiResetCreditDialog(props) {
10799
10927
  }
10800
10928
  }),
10801
10929
  (() => {
10802
- var _el$3 = _tmpl$3$5();
10930
+ var _el$3 = _tmpl$3$4();
10803
10931
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
10804
10932
  get each() {
10805
10933
  return props.credits?.credits;
@@ -10812,14 +10940,16 @@ function GuiResetCreditDialog(props) {
10812
10940
  var _c$ = (0, solid_js_web.memo)(() => !!credit.description);
10813
10941
  return () => _c$() ? ` · ${credit.description}` : "";
10814
10942
  })(), null);
10815
- (0, solid_js_web.insert)(_el$8, (() => {
10816
- var _c$2 = (0, solid_js_web.memo)(() => credit.expiresAt === void 0);
10817
- return () => _c$2() ? "" : ` · expires ${(/* @__PURE__ */ new Date(credit.expiresAt * 1e3)).toLocaleString()}`;
10818
- })(), null);
10943
+ (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(GuiResetCreditExpiry, {
10944
+ credit,
10945
+ get now() {
10946
+ return now();
10947
+ }
10948
+ }), null);
10819
10949
  (0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(Button, {
10820
10950
  size: "small",
10821
10951
  get disabled() {
10822
- return props.busy || Boolean(props.reason || props.pending) || credit.status !== "available" || credit.type !== "codexRateLimits";
10952
+ return props.busy || Boolean(props.reason || props.pending) || credit.status !== "available" || resetCreditLifetime(credit, now()).expired || credit.type !== "codexRateLimits";
10823
10953
  },
10824
10954
  onClick: () => props.review(credit.id),
10825
10955
  children: "Review credit"
@@ -10834,7 +10964,7 @@ function GuiResetCreditDialog(props) {
10834
10964
  return (props.credits?.availableCount ?? 0) > (props.credits?.credits?.length ?? 0);
10835
10965
  },
10836
10966
  get children() {
10837
- return [_tmpl$4$5(), (0, solid_js_web.createComponent)(Button, {
10967
+ return [_tmpl$4$4(), (0, solid_js_web.createComponent)(Button, {
10838
10968
  get disabled() {
10839
10969
  return props.busy || Boolean(props.reason || props.pending);
10840
10970
  },
@@ -14006,8 +14136,8 @@ function GuiSearchResultRow(props) {
14006
14136
  // src/features/search-everything/ui/gui/search-dialog.tsx
14007
14137
  var _tmpl$$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
14008
14138
  var _tmpl$2$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14009
- var _tmpl$3$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=alert>`);
14010
- var _tmpl$4$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none;max-height:45vh;overflow-y:auto>`);
14139
+ var _tmpl$3$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=alert>`);
14140
+ var _tmpl$4$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none;max-height:45vh;overflow-y:auto>`);
14011
14141
  var _tmpl$5$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
14012
14142
  var _tmpl$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching results.`);
14013
14143
  function GuiSearchDialog(props) {
@@ -14108,7 +14238,7 @@ function GuiSearchDialog(props) {
14108
14238
  return props.errors.length > 0;
14109
14239
  },
14110
14240
  get children() {
14111
- var _el$3 = _tmpl$3$4();
14241
+ var _el$3 = _tmpl$3$3();
14112
14242
  (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
14113
14243
  get each() {
14114
14244
  return props.errors;
@@ -14130,7 +14260,7 @@ function GuiSearchDialog(props) {
14130
14260
  }
14131
14261
  }),
14132
14262
  (() => {
14133
- var _el$4 = _tmpl$4$4();
14263
+ var _el$4 = _tmpl$4$3();
14134
14264
  _el$4.addEventListener("scroll", (event) => props.onScroll(event.currentTarget.scrollTop));
14135
14265
  (0, solid_js_web.use)((node) => {
14136
14266
  body = node;
@@ -14485,8 +14615,8 @@ function createGuiSettingsActions(context, preferences, registry) {
14485
14615
  // src/entities/skill/ui/gui/skill-dialog.tsx
14486
14616
  var _tmpl$$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Description</h3><p>`);
14487
14617
  var _tmpl$2$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Source</h3><p style=overflow-wrap:anywhere></p><details><summary>Instructions</summary><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
14488
- var _tmpl$3$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14489
- var _tmpl$4$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Confirmation</h3><label><input type=checkbox>Trust this exact source for future use`);
14618
+ var _tmpl$3$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14619
+ var _tmpl$4$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Confirmation`);
14490
14620
  function GuiSkillDialog(props) {
14491
14621
  const Dialog = props.ui.Dialog;
14492
14622
  const Button = props.ui.Button;
@@ -14550,8 +14680,18 @@ function GuiSkillDialog(props) {
14550
14680
  return _el$4;
14551
14681
  })(),
14552
14682
  (() => {
14553
- var _el$0 = _tmpl$4$3(), _el$11 = _el$0.firstChild.nextSibling.firstChild;
14554
- _el$11.addEventListener("change", (event) => setTrust(event.currentTarget.checked));
14683
+ var _el$0 = _tmpl$4$2();
14684
+ _el$0.firstChild;
14685
+ (0, solid_js_web.insert)(_el$0, (0, solid_js_web.createComponent)(props.ui.Switch, {
14686
+ label: "Trust this exact source for future use",
14687
+ get checked() {
14688
+ return trust();
14689
+ },
14690
+ get disabled() {
14691
+ return !props.ready || !props.skill.location;
14692
+ },
14693
+ onChange: setTrust
14694
+ }), null);
14555
14695
  (0, solid_js_web.insert)(_el$0, (0, solid_js_web.createComponent)(Button, {
14556
14696
  size: "small",
14557
14697
  variant: "ghost",
@@ -14570,13 +14710,11 @@ function GuiSkillDialog(props) {
14570
14710
  return props.reason || error();
14571
14711
  },
14572
14712
  get children() {
14573
- var _el$12 = _tmpl$3$3();
14574
- (0, solid_js_web.insert)(_el$12, () => props.reason || error());
14575
- return _el$12;
14713
+ var _el$10 = _tmpl$3$2();
14714
+ (0, solid_js_web.insert)(_el$10, () => props.reason || error());
14715
+ return _el$10;
14576
14716
  }
14577
14717
  }), null);
14578
- (0, solid_js_web.effect)(() => _el$11.disabled = !props.ready || !props.skill.location);
14579
- (0, solid_js_web.effect)(() => _el$11.checked = trust());
14580
14718
  return _el$0;
14581
14719
  })()
14582
14720
  ];
@@ -14646,8 +14784,8 @@ function createGuiSkillDialogs(context, runtime, preferences) {
14646
14784
  // src/entities/todo/ui/gui/archive-dialog.tsx
14647
14785
  var _tmpl$$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14648
14786
  var _tmpl$2$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul>`);
14649
- var _tmpl$3$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
14650
- var _tmpl$4$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="overflow-wrap:anywhere;padding:4px 0"><small style=opacity:0.6> — `);
14787
+ var _tmpl$3$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
14788
+ var _tmpl$4$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="overflow-wrap:anywhere;padding:4px 0"><small style=opacity:0.6> — `);
14651
14789
  function TodoArchiveDialog(props) {
14652
14790
  const [items, setItems] = (0, solid_js.createSignal)([]);
14653
14791
  const [busy, setBusy] = (0, solid_js.createSignal)(false);
@@ -14703,7 +14841,7 @@ function TodoArchiveDialog(props) {
14703
14841
  },
14704
14842
  get fallback() {
14705
14843
  return (() => {
14706
- var _el$3 = _tmpl$3$2();
14844
+ var _el$3 = _tmpl$3$1();
14707
14845
  (0, solid_js_web.insert)(_el$3, () => busy() ? "Reading archive…" : "No archived Navigator tasks.");
14708
14846
  return _el$3;
14709
14847
  })();
@@ -14715,7 +14853,7 @@ function TodoArchiveDialog(props) {
14715
14853
  return items();
14716
14854
  },
14717
14855
  children: (item) => (() => {
14718
- var _el$4 = _tmpl$4$2(), _el$5 = _el$4.firstChild;
14856
+ var _el$4 = _tmpl$4$1(), _el$5 = _el$4.firstChild;
14719
14857
  _el$5.firstChild;
14720
14858
  (0, solid_js_web.insert)(_el$4, () => item.content, _el$5);
14721
14859
  (0, solid_js_web.insert)(_el$5, () => item.status, null);
@@ -14836,8 +14974,8 @@ var LegacyTodoArchiveRpc = {
14836
14974
  // src/features/native-todo-setup/ui/gui/confirmation.tsx
14837
14975
  var _tmpl$$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=overflow-wrap:anywhere>`);
14838
14976
  var _tmpl$2$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<pre style=white-space:pre-wrap>experimental.todo = true`);
14839
- var _tmpl$3$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<details><summary>Review exact file change</summary><h3>Before</h3><pre style=white-space:pre-wrap;overflow-wrap:anywhere></pre><h3>After</h3><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
14840
- var _tmpl$4$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Other settings and comments are preserved. Tasks are managed through chat and the built-in tool.`);
14977
+ var _tmpl$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<details><summary>Review exact file change</summary><h3>Before</h3><pre style=white-space:pre-wrap;overflow-wrap:anywhere></pre><h3>After</h3><pre style=white-space:pre-wrap;overflow-wrap:anywhere>`);
14978
+ var _tmpl$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Other settings and comments are preserved. Tasks are managed through chat and the built-in tool.`);
14841
14979
  var _tmpl$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14842
14980
  function TodoEnableConfirmation(props) {
14843
14981
  const [busy, setBusy] = (0, solid_js.createSignal)(false);
@@ -14896,12 +15034,12 @@ function TodoEnableConfirmation(props) {
14896
15034
  })(),
14897
15035
  _tmpl$2$1(),
14898
15036
  (() => {
14899
- var _el$3 = _tmpl$3$1(), _el$6 = _el$3.firstChild.nextSibling.nextSibling, _el$8 = _el$6.nextSibling.nextSibling;
15037
+ var _el$3 = _tmpl$3(), _el$6 = _el$3.firstChild.nextSibling.nextSibling, _el$8 = _el$6.nextSibling.nextSibling;
14900
15038
  (0, solid_js_web.insert)(_el$6, () => props.preview.original);
14901
15039
  (0, solid_js_web.insert)(_el$8, () => props.preview.updated);
14902
15040
  return _el$3;
14903
15041
  })(),
14904
- _tmpl$4$1(),
15042
+ _tmpl$4(),
14905
15043
  (0, solid_js_web.createComponent)(solid_js.Show, {
14906
15044
  get when() {
14907
15045
  return error();
@@ -14917,10 +15055,8 @@ function TodoEnableConfirmation(props) {
14917
15055
  });
14918
15056
  }
14919
15057
  // src/features/native-todo-setup/ui/gui/setup-dialog.tsx
14920
- var _tmpl$ = /*#__PURE__*/ (0, solid_js_web.template)(`<label>Configuration file<select aria-label="Todo configuration file"style=display:block;width:100%;padding:8px;color:inherit;background:transparent>`);
14921
- var _tmpl$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>No editable configuration source is currently available.`);
14922
- var _tmpl$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14923
- var _tmpl$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<option>`);
15058
+ var _tmpl$ = /*#__PURE__*/ (0, solid_js_web.template)(`<p>No editable configuration source is currently available.`);
15059
+ var _tmpl$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
14924
15060
  function TodoSetupDialog(props) {
14925
15061
  const [path, setPath] = (0, solid_js.createSignal)("");
14926
15062
  const [busy, setBusy] = (0, solid_js.createSignal)(false);
@@ -14991,29 +15127,26 @@ function TodoSetupDialog(props) {
14991
15127
  },
14992
15128
  get children() {
14993
15129
  return [
14994
- (() => {
14995
- var _el$ = _tmpl$(), _el$3 = _el$.firstChild.nextSibling;
14996
- _el$3.addEventListener("change", (event) => setPath(event.currentTarget.value));
14997
- (0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
14998
- get each() {
14999
- return files();
15000
- },
15001
- children: (file) => (() => {
15002
- var _el$6 = _tmpl$4();
15003
- _el$6.value = file;
15004
- (0, solid_js_web.insert)(_el$6, file);
15005
- return _el$6;
15006
- })()
15007
- }));
15008
- (0, solid_js_web.effect)(() => _el$3.value = selected());
15009
- return _el$;
15010
- })(),
15130
+ (0, solid_js_web.createComponent)(props.ui.Select, {
15131
+ label: "Todo configuration file",
15132
+ get value() {
15133
+ return selected();
15134
+ },
15135
+ get options() {
15136
+ return files().map((file) => ({
15137
+ value: file,
15138
+ label: file
15139
+ }));
15140
+ },
15141
+ onChange: setPath,
15142
+ placeholder: "Choose a configuration file"
15143
+ }),
15011
15144
  (0, solid_js_web.createComponent)(solid_js.Show, {
15012
15145
  get when() {
15013
15146
  return files().length === 0;
15014
15147
  },
15015
15148
  get children() {
15016
- return _tmpl$2();
15149
+ return _tmpl$();
15017
15150
  }
15018
15151
  }),
15019
15152
  (0, solid_js_web.createComponent)(solid_js.Show, {
@@ -15021,9 +15154,9 @@ function TodoSetupDialog(props) {
15021
15154
  return error();
15022
15155
  },
15023
15156
  get children() {
15024
- var _el$5 = _tmpl$3();
15025
- (0, solid_js_web.insert)(_el$5, error);
15026
- return _el$5;
15157
+ var _el$2 = _tmpl$2();
15158
+ (0, solid_js_web.insert)(_el$2, error);
15159
+ return _el$2;
15027
15160
  }
15028
15161
  }),
15029
15162
  (0, solid_js_web.createComponent)(Button, {
@@ -15500,7 +15633,7 @@ var setup = (context) => {
15500
15633
  try {
15501
15634
  await preferences.flush();
15502
15635
  context.toast.show({
15503
- title: `Navigator 0.27.0`,
15636
+ title: `Navigator 0.27.1`,
15504
15637
  variant: "default"
15505
15638
  });
15506
15639
  } catch {