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