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