opencode-navigator 0.27.0 → 0.27.2
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 +14 -0
- package/HOST_API.md +29 -3
- package/README.md +24 -3
- package/dist/gui-experimental.cjs +1212 -608
- package/dist/navigator-updates.js +85 -29
- package/dist/tui.js +155 -76
- package/package.json +1 -1
- package/scripts/update-local-snapshot.mjs +13 -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) {
|
|
@@ -2687,6 +2718,16 @@ function targetForLegacyScope(scope) {
|
|
|
2687
2718
|
key: scope
|
|
2688
2719
|
};
|
|
2689
2720
|
}
|
|
2721
|
+
// src/shared/lib/reorder.ts
|
|
2722
|
+
function reorderItems(items, from, to, key) {
|
|
2723
|
+
const source = items.findIndex((item) => key(item) === from);
|
|
2724
|
+
const target = items.findIndex((item) => key(item) === to);
|
|
2725
|
+
const next = [...items];
|
|
2726
|
+
if (source === -1 || target === -1 || source === target) return next;
|
|
2727
|
+
const [item] = next.splice(source, 1);
|
|
2728
|
+
next.splice(target, 0, item);
|
|
2729
|
+
return next;
|
|
2730
|
+
}
|
|
2690
2731
|
// src/entities/preferences/model/built-ins.ts
|
|
2691
2732
|
function builtInPreferences(defaults) {
|
|
2692
2733
|
return {
|
|
@@ -3323,6 +3364,14 @@ function createPreferencesModel(ports, defaults, store, configuredInput = {}) {
|
|
|
3323
3364
|
behavior: { quickActionOrder: order }
|
|
3324
3365
|
});
|
|
3325
3366
|
},
|
|
3367
|
+
reorderQuickAction(from, to, scope) {
|
|
3368
|
+
if (scope !== targetKey(selectedTarget())) return;
|
|
3369
|
+
const order = reorderItems(selectedResolved().behavior.quickActionOrder, from, to, (id) => id);
|
|
3370
|
+
update({
|
|
3371
|
+
target: selectedTarget(),
|
|
3372
|
+
behavior: { quickActionOrder: order }
|
|
3373
|
+
});
|
|
3374
|
+
},
|
|
3326
3375
|
sectionItemLimit: (section) => resolved().behavior.sectionItemLimits[section] ?? 0,
|
|
3327
3376
|
selectedSectionItemLimit: (section) => selectedResolved().behavior.sectionItemLimits[section] ?? 0,
|
|
3328
3377
|
setSectionItemLimit(section, value) {
|
|
@@ -3548,6 +3597,11 @@ function createPreferencesModel(ports, defaults, store, configuredInput = {}) {
|
|
|
3548
3597
|
swap(order, index, destination);
|
|
3549
3598
|
setSelectedSessionLayout({ order });
|
|
3550
3599
|
},
|
|
3600
|
+
reorderSelectedSection(from, to, scope) {
|
|
3601
|
+
if (scope !== targetKey(selectedTarget())) return;
|
|
3602
|
+
const layout = resolveTarget(selectedTarget()).layout;
|
|
3603
|
+
setSelectedSessionLayout({ order: reorderItems(layout.order, from, to, (id) => id) });
|
|
3604
|
+
},
|
|
3551
3605
|
previewLayoutPreset(preset) {
|
|
3552
3606
|
return layoutPresetPreview(selectedLayoutResolved().layout, preset);
|
|
3553
3607
|
},
|
|
@@ -3845,10 +3899,16 @@ function sourceIdentity(item) {
|
|
|
3845
3899
|
version: item.source.version
|
|
3846
3900
|
} : item?.source);
|
|
3847
3901
|
}
|
|
3848
|
-
function createMainPluginUpdate(context) {
|
|
3902
|
+
function createMainPluginUpdate(context, changed = () => {}) {
|
|
3849
3903
|
let prepared;
|
|
3850
3904
|
let busy = false;
|
|
3905
|
+
let phase = "idle";
|
|
3906
|
+
const report = (next) => {
|
|
3907
|
+
phase = next;
|
|
3908
|
+
changed();
|
|
3909
|
+
};
|
|
3851
3910
|
return {
|
|
3911
|
+
state: () => ({ phase }),
|
|
3852
3912
|
async check(_input, caller) {
|
|
3853
3913
|
if (busy) throw new Error("Navigator installation is already in progress");
|
|
3854
3914
|
prepared = void 0;
|
|
@@ -3890,6 +3950,7 @@ function createMainPluginUpdate(context) {
|
|
|
3890
3950
|
async install(input, caller) {
|
|
3891
3951
|
if (busy || !prepared || input.token !== prepared.token) throw new Error("Update confirmation expired. Check again.");
|
|
3892
3952
|
busy = true;
|
|
3953
|
+
report("preparing");
|
|
3893
3954
|
const expected = prepared;
|
|
3894
3955
|
prepared = void 0;
|
|
3895
3956
|
try {
|
|
@@ -3902,12 +3963,14 @@ function createMainPluginUpdate(context) {
|
|
|
3902
3963
|
const response = await client.plugin.list({}, { signal });
|
|
3903
3964
|
const item = response.data.find((entry) => entry.id === context.id);
|
|
3904
3965
|
if (context.client !== client || sourceIdentity(item) !== expected.source || packageTarget(item) !== expected.target) throw new Error("Navigator installation changed. Check again before installing.");
|
|
3966
|
+
report("installing");
|
|
3905
3967
|
await client.plugin.update({
|
|
3906
3968
|
location: response.location,
|
|
3907
3969
|
targets: [expected.target]
|
|
3908
3970
|
}, { signal });
|
|
3909
3971
|
} finally {
|
|
3910
3972
|
busy = false;
|
|
3973
|
+
report("idle");
|
|
3911
3974
|
}
|
|
3912
3975
|
}
|
|
3913
3976
|
};
|
|
@@ -4615,6 +4678,13 @@ function localCodexIpc(pluginID) {
|
|
|
4615
4678
|
function pluginUpdateIpc(pluginID) {
|
|
4616
4679
|
return _opencode_plugin_gui.Ipc.define({
|
|
4617
4680
|
id: `${pluginID}.package-update`,
|
|
4681
|
+
state: effect.Schema.Struct({ phase: effect.Schema.Literals([
|
|
4682
|
+
"idle",
|
|
4683
|
+
"preparing",
|
|
4684
|
+
"downloading",
|
|
4685
|
+
"installing",
|
|
4686
|
+
"verifying"
|
|
4687
|
+
]) }),
|
|
4618
4688
|
methods: {
|
|
4619
4689
|
check: { output: effect.Schema.Struct({
|
|
4620
4690
|
status: effect.Schema.Literals([
|
|
@@ -4644,14 +4714,15 @@ function preferencesIpc(pluginID) {
|
|
|
4644
4714
|
var main = (context) => {
|
|
4645
4715
|
const store = desktopPreferencesStore();
|
|
4646
4716
|
const readAccount = createMainAccountReader(context);
|
|
4647
|
-
const codex = createNodeCodexClient({ version: "0.27.
|
|
4717
|
+
const codex = createNodeCodexClient({ version: "0.27.2" });
|
|
4648
4718
|
context.onCleanup(codex.dispose);
|
|
4649
4719
|
context.provide(preferencesIpc(context.id), createMainPreferencesHandlers(store));
|
|
4650
4720
|
context.provide(localAccountIpc(context.id), { read: readAccount });
|
|
4651
4721
|
context.provide(localCodexIpc(context.id), createMainCodexHandlers(context, store, codex));
|
|
4652
|
-
|
|
4722
|
+
const updateImpl = createMainPluginUpdate(context, () => updateProvider.changed());
|
|
4723
|
+
const updateProvider = context.provide(pluginUpdateIpc(context.id), updateImpl);
|
|
4653
4724
|
context.provide(bugReportIpc(context.id), createMainBugReport(context.signal));
|
|
4654
|
-
context.log.write("info", `Navigator 0.27.
|
|
4725
|
+
context.log.write("info", `Navigator 0.27.2 Desktop main ready`);
|
|
4655
4726
|
};
|
|
4656
4727
|
// src/pages/navigator/ui/gui/context.tsx
|
|
4657
4728
|
var NavigatorGuiContext = (0, solid_js.createContext)();
|
|
@@ -4661,11 +4732,11 @@ function useNavigatorGui() {
|
|
|
4661
4732
|
return services;
|
|
4662
4733
|
}
|
|
4663
4734
|
// src/pages/navigator/ui/gui/bookmark.tsx
|
|
4664
|
-
var _tmpl$$
|
|
4735
|
+
var _tmpl$$60 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=width:24px;flex-shrink:0><button type=button style=width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:4px;color:inherit><svg width=12 height=16 viewBox="0 0 14 18"aria-hidden=true><path d="M3 2H11V15L7 12L3 15Z"stroke=currentColor stroke-width=1.5>`);
|
|
4665
4736
|
function SidebarBookmark(props) {
|
|
4666
4737
|
const label = () => `${props.selected ? "Unbookmark" : "Bookmark"} ${props.title}`;
|
|
4667
4738
|
return (() => {
|
|
4668
|
-
var _el$ = _tmpl$$
|
|
4739
|
+
var _el$ = _tmpl$$60(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild;
|
|
4669
4740
|
_el$2.$$click = (event) => {
|
|
4670
4741
|
event.stopPropagation();
|
|
4671
4742
|
props.toggle();
|
|
@@ -4694,7 +4765,7 @@ function SidebarBookmark(props) {
|
|
|
4694
4765
|
}
|
|
4695
4766
|
(0, solid_js_web.delegateEvents)(["click"]);
|
|
4696
4767
|
// src/pages/navigator/ui/gui/catalog-row.tsx
|
|
4697
|
-
var _tmpl$$
|
|
4768
|
+
var _tmpl$$59 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0"><button type=button style=flex:1;min-width:0;display:flex;gap:6px;align-items:center;text-align:left;padding:4px;color:inherit;border:0;border-radius:6px><span style=min-width:0;flex:1><span style=display:block;overflow-wrap:anywhere></span><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
|
|
4698
4769
|
function navigate$1(event) {
|
|
4699
4770
|
if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
|
|
4700
4771
|
const buttons = [...event.currentTarget.querySelectorAll("button:not(:disabled)")];
|
|
@@ -4709,7 +4780,7 @@ function CatalogRow(props) {
|
|
|
4709
4780
|
const [hovered, setHovered] = (0, solid_js.createSignal)(false);
|
|
4710
4781
|
const [focused, setFocused] = (0, solid_js.createSignal)(false);
|
|
4711
4782
|
return (() => {
|
|
4712
|
-
var _el$ = _tmpl$$
|
|
4783
|
+
var _el$ = _tmpl$$59(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
|
|
4713
4784
|
_el$.$$keydown = navigate$1;
|
|
4714
4785
|
_el$.$$focusout = (event) => {
|
|
4715
4786
|
if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
|
|
@@ -4811,15 +4882,19 @@ function GuiActionRow(props) {
|
|
|
4811
4882
|
});
|
|
4812
4883
|
}
|
|
4813
4884
|
// src/pages/navigator/ui/gui/section.tsx
|
|
4814
|
-
var _tmpl$$
|
|
4885
|
+
var _tmpl$$58 = /*#__PURE__*/ (0, solid_js_web.template)(`<section style=min-width:0><div style=display:flex;gap:8px;align-items:center;min-width:0><h2 style=flex:1;min-width:0;font-size:13px;font-weight:600;margin:0><button type=button style="display:flex;gap:6px;align-items:center;width:100%;padding:3px 0;color:inherit;background:transparent;border:0;text-align:left"><span aria-hidden=true data-navigator-disclosure style=display:inline-flex;width:16px;height:16px;flex-shrink:0;align-items:center;justify-content:center></span><span style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap></span><span style=opacity:0.55;font-weight:400>`);
|
|
4815
4886
|
function MonitoringSection(props) {
|
|
4816
4887
|
const services = useNavigatorGui();
|
|
4817
4888
|
const preferences = () => services.runtime.catalogs?.preferences;
|
|
4818
4889
|
const expanded = () => preferences()?.expanded()[props.id] ?? true;
|
|
4890
|
+
const Icon = services.ui.Icon;
|
|
4819
4891
|
return (() => {
|
|
4820
|
-
var _el$ = _tmpl$$
|
|
4892
|
+
var _el$ = _tmpl$$58(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
|
|
4821
4893
|
_el$4.$$click = () => preferences()?.toggleSectionExpanded(props.id);
|
|
4822
|
-
(0, solid_js_web.insert)(_el$5, ()
|
|
4894
|
+
(0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(Icon, {
|
|
4895
|
+
name: "chevron-down",
|
|
4896
|
+
size: "small"
|
|
4897
|
+
}));
|
|
4823
4898
|
(0, solid_js_web.insert)(_el$6, () => props.title);
|
|
4824
4899
|
(0, solid_js_web.insert)(_el$7, () => props.count);
|
|
4825
4900
|
(0, solid_js_web.insert)(_el$2, () => props.actions, null);
|
|
@@ -4832,24 +4907,26 @@ function MonitoringSection(props) {
|
|
|
4832
4907
|
}
|
|
4833
4908
|
}), null);
|
|
4834
4909
|
(0, solid_js_web.effect)((_p$) => {
|
|
4835
|
-
var _v$ = props.title, _v$2 = expanded();
|
|
4910
|
+
var _v$ = props.title, _v$2 = expanded(), _v$3 = expanded() ? "rotate(0deg)" : "rotate(-90deg)";
|
|
4836
4911
|
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
|
|
4837
4912
|
_v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$4, "aria-expanded", _p$.t = _v$2);
|
|
4913
|
+
_v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$5, "transform", _p$.a = _v$3);
|
|
4838
4914
|
return _p$;
|
|
4839
4915
|
}, {
|
|
4840
4916
|
e: void 0,
|
|
4841
|
-
t: void 0
|
|
4917
|
+
t: void 0,
|
|
4918
|
+
a: void 0
|
|
4842
4919
|
});
|
|
4843
4920
|
return _el$;
|
|
4844
4921
|
})();
|
|
4845
4922
|
}
|
|
4846
4923
|
(0, solid_js_web.delegateEvents)(["click"]);
|
|
4847
4924
|
// src/pages/navigator/ui/gui/section-filter.tsx
|
|
4848
|
-
var _tmpl$$
|
|
4925
|
+
var _tmpl$$57 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
|
|
4849
4926
|
function SectionFilter(props) {
|
|
4850
4927
|
const TextInput = useNavigatorGui().ui.TextInput;
|
|
4851
4928
|
return (() => {
|
|
4852
|
-
var _el$ = _tmpl$$
|
|
4929
|
+
var _el$ = _tmpl$$57();
|
|
4853
4930
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
|
|
4854
4931
|
get label() {
|
|
4855
4932
|
return props.label;
|
|
@@ -4869,9 +4946,9 @@ function SectionFilter(props) {
|
|
|
4869
4946
|
})();
|
|
4870
4947
|
}
|
|
4871
4948
|
// src/pages/navigator/ui/gui/actions-section.tsx
|
|
4872
|
-
var _tmpl$$
|
|
4873
|
-
var _tmpl$2$
|
|
4874
|
-
var _tmpl$3$
|
|
4949
|
+
var _tmpl$$56 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching actions.`);
|
|
4950
|
+
var _tmpl$2$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
|
|
4951
|
+
var _tmpl$3$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=margin:0;padding:0;list-style:none>`);
|
|
4875
4952
|
function ActionsSection() {
|
|
4876
4953
|
const services = useNavigatorGui();
|
|
4877
4954
|
const catalogs = () => services.runtime.catalogs;
|
|
@@ -4896,13 +4973,13 @@ function ActionsSection() {
|
|
|
4896
4973
|
}
|
|
4897
4974
|
}),
|
|
4898
4975
|
(() => {
|
|
4899
|
-
var _el$ = _tmpl$2$
|
|
4976
|
+
var _el$ = _tmpl$2$38();
|
|
4900
4977
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
4901
4978
|
get each() {
|
|
4902
4979
|
return [true, false].filter((selected) => view().visibility.visible().some((id) => catalogs().preferences.favoriteQuickActions().has(id) === selected));
|
|
4903
4980
|
},
|
|
4904
4981
|
children: (selected) => (() => {
|
|
4905
|
-
var _el$3 = _tmpl$3$
|
|
4982
|
+
var _el$3 = _tmpl$3$24();
|
|
4906
4983
|
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
4907
4984
|
get each() {
|
|
4908
4985
|
return view().visibility.visible().filter((id) => catalogs().preferences.favoriteQuickActions().has(id) === selected);
|
|
@@ -4917,7 +4994,7 @@ function ActionsSection() {
|
|
|
4917
4994
|
return view().filtered().length === 0;
|
|
4918
4995
|
},
|
|
4919
4996
|
get children() {
|
|
4920
|
-
return _tmpl$$
|
|
4997
|
+
return _tmpl$$56();
|
|
4921
4998
|
}
|
|
4922
4999
|
}), null);
|
|
4923
5000
|
return _el$;
|
|
@@ -4942,11 +5019,11 @@ function ActionsSection() {
|
|
|
4942
5019
|
});
|
|
4943
5020
|
}
|
|
4944
5021
|
// src/pages/navigator/ui/gui/quota-window.tsx
|
|
4945
|
-
var _tmpl$$
|
|
5022
|
+
var _tmpl$$55 = /*#__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
5023
|
function GuiQuotaWindow(props) {
|
|
4947
5024
|
const view = () => quotaPresentation(props.window);
|
|
4948
5025
|
return (() => {
|
|
4949
|
-
var _el$ = _tmpl$$
|
|
5026
|
+
var _el$ = _tmpl$$55(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$2.nextSibling.firstChild, _el$6 = _el$5.nextSibling;
|
|
4950
5027
|
(0, solid_js_web.insert)(_el$5, () => view().reset);
|
|
4951
5028
|
(0, solid_js_web.insert)(_el$6, () => view().value);
|
|
4952
5029
|
(0, solid_js_web.effect)((_p$) => {
|
|
@@ -4968,10 +5045,9 @@ function GuiQuotaWindow(props) {
|
|
|
4968
5045
|
})();
|
|
4969
5046
|
}
|
|
4970
5047
|
// src/pages/navigator/ui/gui/limits-section.tsx
|
|
4971
|
-
var _tmpl$$
|
|
4972
|
-
var _tmpl$2$
|
|
4973
|
-
var _tmpl$3$
|
|
4974
|
-
var _tmpl$4$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
|
|
5048
|
+
var _tmpl$$54 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
5049
|
+
var _tmpl$2$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>`);
|
|
5050
|
+
var _tmpl$3$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>: `);
|
|
4975
5051
|
function LimitsSection() {
|
|
4976
5052
|
const props = useNavigatorGui();
|
|
4977
5053
|
const limits = () => props.runtime.limits;
|
|
@@ -5016,31 +5092,6 @@ function LimitsSection() {
|
|
|
5016
5092
|
},
|
|
5017
5093
|
get children() {
|
|
5018
5094
|
return [
|
|
5019
|
-
(() => {
|
|
5020
|
-
var _el$ = _tmpl$$48();
|
|
5021
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
5022
|
-
size: "small",
|
|
5023
|
-
variant: "ghost",
|
|
5024
|
-
onClick: () => limits()?.chooseModel(),
|
|
5025
|
-
get children() {
|
|
5026
|
-
return limits()?.label() ?? "Select model";
|
|
5027
|
-
}
|
|
5028
|
-
}), null);
|
|
5029
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
5030
|
-
get when() {
|
|
5031
|
-
return limits()?.selected()?.variant;
|
|
5032
|
-
},
|
|
5033
|
-
children: (variant) => (0, solid_js_web.createComponent)(Button, {
|
|
5034
|
-
size: "small",
|
|
5035
|
-
variant: "ghost-muted",
|
|
5036
|
-
onClick: () => limits()?.chooseVariant(),
|
|
5037
|
-
get children() {
|
|
5038
|
-
return variant();
|
|
5039
|
-
}
|
|
5040
|
-
})
|
|
5041
|
-
}), null);
|
|
5042
|
-
return _el$;
|
|
5043
|
-
})(),
|
|
5044
5095
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
5045
5096
|
get when() {
|
|
5046
5097
|
return canLink();
|
|
@@ -5061,9 +5112,9 @@ function LimitsSection() {
|
|
|
5061
5112
|
return state()?.error;
|
|
5062
5113
|
},
|
|
5063
5114
|
get children() {
|
|
5064
|
-
var _el$
|
|
5065
|
-
(0, solid_js_web.insert)(_el
|
|
5066
|
-
return _el
|
|
5115
|
+
var _el$ = _tmpl$$54();
|
|
5116
|
+
(0, solid_js_web.insert)(_el$, () => state()?.error?.message);
|
|
5117
|
+
return _el$;
|
|
5067
5118
|
}
|
|
5068
5119
|
}),
|
|
5069
5120
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
@@ -5071,9 +5122,9 @@ function LimitsSection() {
|
|
|
5071
5122
|
return message();
|
|
5072
5123
|
},
|
|
5073
5124
|
get children() {
|
|
5074
|
-
var _el$
|
|
5075
|
-
(0, solid_js_web.insert)(_el$
|
|
5076
|
-
return _el$
|
|
5125
|
+
var _el$2 = _tmpl$2$37();
|
|
5126
|
+
(0, solid_js_web.insert)(_el$2, message);
|
|
5127
|
+
return _el$2;
|
|
5077
5128
|
}
|
|
5078
5129
|
}),
|
|
5079
5130
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
@@ -5090,13 +5141,13 @@ function LimitsSection() {
|
|
|
5090
5141
|
return value().balances;
|
|
5091
5142
|
},
|
|
5092
5143
|
children: (balance) => (() => {
|
|
5093
|
-
var _el$
|
|
5094
|
-
(0, solid_js_web.insert)(_el$
|
|
5095
|
-
(0, solid_js_web.insert)(_el$
|
|
5144
|
+
var _el$3 = _tmpl$3$23(), _el$4 = _el$3.firstChild;
|
|
5145
|
+
(0, solid_js_web.insert)(_el$3, () => balance.label, _el$4);
|
|
5146
|
+
(0, solid_js_web.insert)(_el$3, (() => {
|
|
5096
5147
|
var _c$ = (0, solid_js_web.memo)(() => !!balance.unlimited);
|
|
5097
5148
|
return () => _c$() ? "Unlimited" : `${balance.amount} ${balance.unit ?? ""}`;
|
|
5098
5149
|
})(), null);
|
|
5099
|
-
return _el$
|
|
5150
|
+
return _el$3;
|
|
5100
5151
|
})()
|
|
5101
5152
|
})]
|
|
5102
5153
|
})
|
|
@@ -5559,23 +5610,34 @@ function createMcpModel(options, persist, preferences) {
|
|
|
5559
5610
|
};
|
|
5560
5611
|
}
|
|
5561
5612
|
// src/pages/navigator/ui/gui/mcp-indicator.tsx
|
|
5562
|
-
var _tmpl$$
|
|
5613
|
+
var _tmpl$$53 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style="display:inline-flex;width:12px;height:12px;flex-shrink:0;border-radius:50%;border:1px solid currentColor">`);
|
|
5614
|
+
var _tmpl$2$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=img style=display:inline-flex;width:16px;height:16px;flex-shrink:0;align-items:center;justify-content:center>`);
|
|
5563
5615
|
function McpIndicator(props) {
|
|
5616
|
+
const Loader = useNavigatorGui().ui.Loader;
|
|
5564
5617
|
return (() => {
|
|
5565
|
-
var _el$ = _tmpl
|
|
5566
|
-
(0, solid_js_web.
|
|
5567
|
-
|
|
5568
|
-
|
|
5569
|
-
|
|
5570
|
-
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5618
|
+
var _el$ = _tmpl$2$36();
|
|
5619
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
5620
|
+
get when() {
|
|
5621
|
+
return props.status !== "pending";
|
|
5622
|
+
},
|
|
5623
|
+
get fallback() {
|
|
5624
|
+
return (0, solid_js_web.createComponent)(Loader, { size: "small" });
|
|
5625
|
+
},
|
|
5626
|
+
get children() {
|
|
5627
|
+
var _el$2 = _tmpl$$53();
|
|
5628
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
5629
|
+
var _v$ = props.status === "connected" ? "currentColor" : "transparent", _v$2 = props.status === "failed" ? 1 : .65;
|
|
5630
|
+
_v$ !== _p$.e && (0, solid_js_web.setStyleProperty)(_el$2, "background", _p$.e = _v$);
|
|
5631
|
+
_v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$2, "opacity", _p$.t = _v$2);
|
|
5632
|
+
return _p$;
|
|
5633
|
+
}, {
|
|
5634
|
+
e: void 0,
|
|
5635
|
+
t: void 0
|
|
5636
|
+
});
|
|
5637
|
+
return _el$2;
|
|
5638
|
+
}
|
|
5639
|
+
}));
|
|
5640
|
+
(0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$, "aria-label", props.status));
|
|
5579
5641
|
return _el$;
|
|
5580
5642
|
})();
|
|
5581
5643
|
}
|
|
@@ -5630,22 +5692,44 @@ function GuiMcpRow(props) {
|
|
|
5630
5692
|
});
|
|
5631
5693
|
}
|
|
5632
5694
|
// src/pages/navigator/ui/gui/mcp-group.tsx
|
|
5633
|
-
var _tmpl$$
|
|
5695
|
+
var _tmpl$$52 = /*#__PURE__*/ (0, solid_js_web.template)(`<strong style=overflow:hidden;text-overflow:ellipsis;white-space:nowrap>`);
|
|
5696
|
+
var _tmpl$2$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
|
|
5697
|
+
var _tmpl$3$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
|
|
5634
5698
|
function GuiMcpGroup(props) {
|
|
5635
5699
|
const services = useNavigatorGui();
|
|
5636
5700
|
const catalogs = () => services.runtime.catalogs;
|
|
5637
5701
|
const view = () => catalogs().views.mcp;
|
|
5638
5702
|
const bucket = () => view().bucket(props.group);
|
|
5639
5703
|
const busy = () => catalogs().mcp.bulkState().group === props.group && catalogs().mcp.bulkState().status === "running";
|
|
5704
|
+
const Button = services.ui.Button;
|
|
5640
5705
|
return (() => {
|
|
5641
|
-
var _el$ = _tmpl
|
|
5642
|
-
|
|
5643
|
-
|
|
5644
|
-
|
|
5645
|
-
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
5706
|
+
var _el$ = _tmpl$3$22(), _el$4 = _el$.firstChild;
|
|
5707
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
5708
|
+
variant: "ghost",
|
|
5709
|
+
size: "small",
|
|
5710
|
+
get disabled() {
|
|
5711
|
+
return catalogs().mcp.mutating();
|
|
5712
|
+
},
|
|
5713
|
+
onClick: () => void catalogs().mcp.toggleGroup(props.group, bucket().map((item) => item.name))?.catch(() => {}),
|
|
5714
|
+
get children() {
|
|
5715
|
+
return [
|
|
5716
|
+
(0, solid_js_web.createComponent)(McpIndicator, { get status() {
|
|
5717
|
+
return mcpGroupStatus(bucket(), busy());
|
|
5718
|
+
} }),
|
|
5719
|
+
(() => {
|
|
5720
|
+
var _el$2 = _tmpl$$52();
|
|
5721
|
+
(0, solid_js_web.insert)(_el$2, () => props.group);
|
|
5722
|
+
return _el$2;
|
|
5723
|
+
})(),
|
|
5724
|
+
(() => {
|
|
5725
|
+
var _el$3 = _tmpl$2$35();
|
|
5726
|
+
(0, solid_js_web.insert)(_el$3, () => bucket().length);
|
|
5727
|
+
return _el$3;
|
|
5728
|
+
})()
|
|
5729
|
+
];
|
|
5730
|
+
}
|
|
5731
|
+
}), _el$4);
|
|
5732
|
+
(0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
5649
5733
|
get each() {
|
|
5650
5734
|
return view().visibility.visible().filter((item) => item.bucket === props.group).map((item) => item.name);
|
|
5651
5735
|
},
|
|
@@ -5658,15 +5742,13 @@ function GuiMcpGroup(props) {
|
|
|
5658
5742
|
} })
|
|
5659
5743
|
})
|
|
5660
5744
|
}));
|
|
5661
|
-
(0, solid_js_web.effect)(() => _el$2.disabled = catalogs().mcp.mutating());
|
|
5662
5745
|
return _el$;
|
|
5663
5746
|
})();
|
|
5664
5747
|
}
|
|
5665
|
-
(0, solid_js_web.delegateEvents)(["click"]);
|
|
5666
5748
|
// src/pages/navigator/ui/gui/mcp-section.tsx
|
|
5667
|
-
var _tmpl$$
|
|
5668
|
-
var _tmpl$2$
|
|
5669
|
-
var _tmpl$3$
|
|
5749
|
+
var _tmpl$$51 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
5750
|
+
var _tmpl$2$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>/<!> servers updated`);
|
|
5751
|
+
var _tmpl$3$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
|
|
5670
5752
|
var _tmpl$4$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching MCP servers.`);
|
|
5671
5753
|
function McpSection() {
|
|
5672
5754
|
const services = useNavigatorGui();
|
|
@@ -5719,7 +5801,7 @@ function McpSection() {
|
|
|
5719
5801
|
},
|
|
5720
5802
|
get children() {
|
|
5721
5803
|
return [(() => {
|
|
5722
|
-
var _el$ = _tmpl$$
|
|
5804
|
+
var _el$ = _tmpl$$51();
|
|
5723
5805
|
(0, solid_js_web.insert)(_el$, () => state().error?.message);
|
|
5724
5806
|
return _el$;
|
|
5725
5807
|
})(), (0, solid_js_web.createComponent)(Button, {
|
|
@@ -5735,7 +5817,7 @@ function McpSection() {
|
|
|
5735
5817
|
},
|
|
5736
5818
|
get children() {
|
|
5737
5819
|
return [(() => {
|
|
5738
|
-
var _el$2 = _tmpl$2$
|
|
5820
|
+
var _el$2 = _tmpl$2$34(), _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling;
|
|
5739
5821
|
_el$5.nextSibling;
|
|
5740
5822
|
(0, solid_js_web.insert)(_el$2, () => bulk().completed, _el$3);
|
|
5741
5823
|
(0, solid_js_web.insert)(_el$2, () => bulk().total, _el$5);
|
|
@@ -5755,7 +5837,7 @@ function McpSection() {
|
|
|
5755
5837
|
}
|
|
5756
5838
|
}),
|
|
5757
5839
|
(() => {
|
|
5758
|
-
var _el$6 = _tmpl$3$
|
|
5840
|
+
var _el$6 = _tmpl$3$21();
|
|
5759
5841
|
(0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
5760
5842
|
get each() {
|
|
5761
5843
|
return view().groups();
|
|
@@ -5830,9 +5912,9 @@ function GuiSkillRow(props) {
|
|
|
5830
5912
|
});
|
|
5831
5913
|
}
|
|
5832
5914
|
// src/pages/navigator/ui/gui/skills-section.tsx
|
|
5833
|
-
var _tmpl$$
|
|
5834
|
-
var _tmpl$2$
|
|
5835
|
-
var _tmpl$3$
|
|
5915
|
+
var _tmpl$$50 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
5916
|
+
var _tmpl$2$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;flex-direction:column;gap:12px>`);
|
|
5917
|
+
var _tmpl$3$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching Skills.`);
|
|
5836
5918
|
var _tmpl$4$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><h3 style="font-size:12px;opacity:0.65;margin:0 0 4px"></h3><ul style="margin:0;padding:0 0 0 10px;list-style:none">`);
|
|
5837
5919
|
function SkillsSection() {
|
|
5838
5920
|
const services = useNavigatorGui();
|
|
@@ -5863,7 +5945,7 @@ function SkillsSection() {
|
|
|
5863
5945
|
},
|
|
5864
5946
|
get children() {
|
|
5865
5947
|
return [(() => {
|
|
5866
|
-
var _el$ = _tmpl$$
|
|
5948
|
+
var _el$ = _tmpl$$50();
|
|
5867
5949
|
(0, solid_js_web.insert)(_el$, () => catalogs().skills.error());
|
|
5868
5950
|
return _el$;
|
|
5869
5951
|
})(), (0, solid_js_web.createComponent)(Button, {
|
|
@@ -5874,13 +5956,13 @@ function SkillsSection() {
|
|
|
5874
5956
|
}
|
|
5875
5957
|
}),
|
|
5876
5958
|
(() => {
|
|
5877
|
-
var _el$2 = _tmpl$2$
|
|
5959
|
+
var _el$2 = _tmpl$2$33();
|
|
5878
5960
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
5879
5961
|
get each() {
|
|
5880
5962
|
return view().groups();
|
|
5881
5963
|
},
|
|
5882
5964
|
get fallback() {
|
|
5883
|
-
return _tmpl$3$
|
|
5965
|
+
return _tmpl$3$20();
|
|
5884
5966
|
},
|
|
5885
5967
|
children: (group) => (() => {
|
|
5886
5968
|
var _el$4 = _tmpl$4$11(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
|
|
@@ -6338,9 +6420,9 @@ function createSubagentClock(key) {
|
|
|
6338
6420
|
return now;
|
|
6339
6421
|
}
|
|
6340
6422
|
// src/shared/ui/gui/tabs.tsx
|
|
6341
|
-
var _tmpl$$
|
|
6342
|
-
var _tmpl$2$
|
|
6343
|
-
var _tmpl$3$
|
|
6423
|
+
var _tmpl$$49 = /*#__PURE__*/ (0, solid_js_web.template)(`<nav style=display:flex;gap:4px;flex-wrap:wrap>`);
|
|
6424
|
+
var _tmpl$2$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<span>`);
|
|
6425
|
+
var _tmpl$3$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=opacity:0.6;font-weight:400>`);
|
|
6344
6426
|
function GuiTabs(props) {
|
|
6345
6427
|
const Button = props.ui.Button;
|
|
6346
6428
|
function navigate(event) {
|
|
@@ -6354,7 +6436,7 @@ function GuiTabs(props) {
|
|
|
6354
6436
|
event.currentTarget.querySelectorAll("button:not(:disabled)")[next]?.focus();
|
|
6355
6437
|
}
|
|
6356
6438
|
return (() => {
|
|
6357
|
-
var _el$ = _tmpl$$
|
|
6439
|
+
var _el$ = _tmpl$$49();
|
|
6358
6440
|
_el$.$$keydown = navigate;
|
|
6359
6441
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
6360
6442
|
get each() {
|
|
@@ -6373,7 +6455,7 @@ function GuiTabs(props) {
|
|
|
6373
6455
|
onClick: () => props.onSelect(id),
|
|
6374
6456
|
get children() {
|
|
6375
6457
|
return [(() => {
|
|
6376
|
-
var _el$2 = _tmpl$2$
|
|
6458
|
+
var _el$2 = _tmpl$2$32();
|
|
6377
6459
|
(0, solid_js_web.insert)(_el$2, () => option().label);
|
|
6378
6460
|
(0, solid_js_web.effect)((_$p) => (0, solid_js_web.setStyleProperty)(_el$2, "font-weight", props.selected === id ? "600" : "400"));
|
|
6379
6461
|
return _el$2;
|
|
@@ -6382,7 +6464,7 @@ function GuiTabs(props) {
|
|
|
6382
6464
|
return option().count !== void 0;
|
|
6383
6465
|
},
|
|
6384
6466
|
get children() {
|
|
6385
|
-
var _el$3 = _tmpl$3$
|
|
6467
|
+
var _el$3 = _tmpl$3$19();
|
|
6386
6468
|
(0, solid_js_web.insert)(_el$3, () => option().count);
|
|
6387
6469
|
return _el$3;
|
|
6388
6470
|
}
|
|
@@ -6447,9 +6529,9 @@ function iconChoiceLabel(id) {
|
|
|
6447
6529
|
return id.replaceAll("-", " ");
|
|
6448
6530
|
}
|
|
6449
6531
|
// src/shared/ui/gui/icon.tsx
|
|
6450
|
-
var _tmpl$$
|
|
6451
|
-
var _tmpl$2$
|
|
6452
|
-
var _tmpl$3$
|
|
6532
|
+
var _tmpl$$48 = /*#__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>`);
|
|
6533
|
+
var _tmpl$2$31 = /*#__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>`);
|
|
6534
|
+
var _tmpl$3$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path></svg>`, false, true, false);
|
|
6453
6535
|
var native = {
|
|
6454
6536
|
plus: "plus",
|
|
6455
6537
|
check: "check",
|
|
@@ -6515,20 +6597,20 @@ function GuiIcon(props) {
|
|
|
6515
6597
|
const Icon = props.ui.Icon;
|
|
6516
6598
|
const id = () => isIconChoiceId(props.id) ? props.id : "bolt";
|
|
6517
6599
|
return (() => {
|
|
6518
|
-
var _el$ = _tmpl$$
|
|
6600
|
+
var _el$ = _tmpl$$48();
|
|
6519
6601
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
6520
6602
|
get when() {
|
|
6521
6603
|
return native[id()];
|
|
6522
6604
|
},
|
|
6523
6605
|
get fallback() {
|
|
6524
6606
|
return (() => {
|
|
6525
|
-
var _el$2 = _tmpl$2$
|
|
6607
|
+
var _el$2 = _tmpl$2$31();
|
|
6526
6608
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
6527
6609
|
get each() {
|
|
6528
6610
|
return paths[id()] ?? paths.bolt;
|
|
6529
6611
|
},
|
|
6530
6612
|
children: (path) => (() => {
|
|
6531
|
-
var _el$3 = _tmpl$3$
|
|
6613
|
+
var _el$3 = _tmpl$3$18();
|
|
6532
6614
|
(0, solid_js_web.setAttribute)(_el$3, "d", path);
|
|
6533
6615
|
return _el$3;
|
|
6534
6616
|
})()
|
|
@@ -6547,31 +6629,47 @@ function GuiIcon(props) {
|
|
|
6547
6629
|
})();
|
|
6548
6630
|
}
|
|
6549
6631
|
// src/shared/ui/gui/multiline-field.tsx
|
|
6550
|
-
var _tmpl$$
|
|
6632
|
+
var _tmpl$$47 = /*#__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
6633
|
function GuiMultilineField(props) {
|
|
6552
6634
|
const id = (0, solid_js.createUniqueId)();
|
|
6635
|
+
const [focused, setFocused] = (0, solid_js.createSignal)(false);
|
|
6553
6636
|
return (() => {
|
|
6554
|
-
var _el$ = _tmpl$$
|
|
6637
|
+
var _el$ = _tmpl$$47(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
|
|
6555
6638
|
(0, solid_js_web.setAttribute)(_el$, "for", id);
|
|
6556
6639
|
(0, solid_js_web.insert)(_el$2, () => props.label);
|
|
6557
6640
|
_el$3.$$input = (event) => props.onInput(event.currentTarget.value);
|
|
6641
|
+
_el$3.addEventListener("blur", () => setFocused(false));
|
|
6642
|
+
_el$3.addEventListener("focus", () => setFocused(true));
|
|
6558
6643
|
(0, solid_js_web.setAttribute)(_el$3, "id", id);
|
|
6559
|
-
(0, solid_js_web.effect)(() =>
|
|
6644
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
6645
|
+
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";
|
|
6646
|
+
_v$ !== _p$.e && (_el$3.disabled = _p$.e = _v$);
|
|
6647
|
+
_v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$3, "outline", _p$.t = _v$2);
|
|
6648
|
+
_v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$3, "box-shadow", _p$.a = _v$3);
|
|
6649
|
+
_v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$3, "opacity", _p$.o = _v$4);
|
|
6650
|
+
return _p$;
|
|
6651
|
+
}, {
|
|
6652
|
+
e: void 0,
|
|
6653
|
+
t: void 0,
|
|
6654
|
+
a: void 0,
|
|
6655
|
+
o: void 0
|
|
6656
|
+
});
|
|
6560
6657
|
(0, solid_js_web.effect)(() => _el$3.value = props.value);
|
|
6561
6658
|
return _el$;
|
|
6562
6659
|
})();
|
|
6563
6660
|
}
|
|
6564
6661
|
(0, solid_js_web.delegateEvents)(["input"]);
|
|
6565
6662
|
// src/shared/ui/gui/group-control.tsx
|
|
6566
|
-
var _tmpl$$
|
|
6663
|
+
var _tmpl$$46 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
|
|
6567
6664
|
function GuiGroupControl(props) {
|
|
6568
6665
|
const Select = props.ui.Select;
|
|
6569
6666
|
const TextInput = props.ui.TextInput;
|
|
6570
6667
|
const Button = props.ui.Button;
|
|
6571
6668
|
const [draft, setDraft] = (0, solid_js.createSignal)("");
|
|
6669
|
+
const [creating, setCreating] = (0, solid_js.createSignal)(false);
|
|
6572
6670
|
(0, solid_js.createEffect)(() => setDraft(props.value ?? ""));
|
|
6573
6671
|
return (() => {
|
|
6574
|
-
var _el$ = _tmpl$$
|
|
6672
|
+
var _el$ = _tmpl$$46();
|
|
6575
6673
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Select, {
|
|
6576
6674
|
get label() {
|
|
6577
6675
|
return `${props.label} existing group`;
|
|
@@ -6588,45 +6686,352 @@ function GuiGroupControl(props) {
|
|
|
6588
6686
|
label: value
|
|
6589
6687
|
}))];
|
|
6590
6688
|
},
|
|
6591
|
-
onChange:
|
|
6689
|
+
onChange: (value) => {
|
|
6690
|
+
setDraft(value);
|
|
6691
|
+
setCreating(false);
|
|
6692
|
+
},
|
|
6592
6693
|
get disabled() {
|
|
6593
6694
|
return props.disabled;
|
|
6594
6695
|
}
|
|
6595
6696
|
}), null);
|
|
6596
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
},
|
|
6600
|
-
get value() {
|
|
6601
|
-
return draft();
|
|
6602
|
-
},
|
|
6603
|
-
onInput: setDraft,
|
|
6697
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
6698
|
+
size: "small",
|
|
6699
|
+
variant: "ghost",
|
|
6604
6700
|
get disabled() {
|
|
6605
6701
|
return props.disabled;
|
|
6606
6702
|
},
|
|
6607
|
-
|
|
6608
|
-
|
|
6703
|
+
onClick: () => {
|
|
6704
|
+
setCreating(true);
|
|
6705
|
+
setDraft("");
|
|
6706
|
+
},
|
|
6707
|
+
children: "New group"
|
|
6708
|
+
}), null);
|
|
6709
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
6710
|
+
get when() {
|
|
6711
|
+
return creating();
|
|
6712
|
+
},
|
|
6713
|
+
get children() {
|
|
6714
|
+
return (0, solid_js_web.createComponent)(TextInput, {
|
|
6715
|
+
get label() {
|
|
6716
|
+
return `${props.label} new group`;
|
|
6717
|
+
},
|
|
6718
|
+
get value() {
|
|
6719
|
+
return draft();
|
|
6720
|
+
},
|
|
6721
|
+
onInput: setDraft,
|
|
6722
|
+
get disabled() {
|
|
6723
|
+
return props.disabled;
|
|
6724
|
+
},
|
|
6725
|
+
get invalid() {
|
|
6726
|
+
return draft().length > 64;
|
|
6727
|
+
}
|
|
6728
|
+
});
|
|
6609
6729
|
}
|
|
6610
6730
|
}), null);
|
|
6611
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(
|
|
6612
|
-
|
|
6613
|
-
|
|
6614
|
-
return props.disabled || draft().length > 64;
|
|
6731
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
6732
|
+
get when() {
|
|
6733
|
+
return creating() || draft() !== (props.value ?? "");
|
|
6615
6734
|
},
|
|
6616
|
-
|
|
6617
|
-
|
|
6735
|
+
get children() {
|
|
6736
|
+
return [(0, solid_js_web.createComponent)(Button, {
|
|
6737
|
+
size: "small",
|
|
6738
|
+
get disabled() {
|
|
6739
|
+
return props.disabled || draft().length > 64 || creating() && !draft().trim();
|
|
6740
|
+
},
|
|
6741
|
+
onClick: () => {
|
|
6742
|
+
props.save(draft().trim() || void 0);
|
|
6743
|
+
setCreating(false);
|
|
6744
|
+
},
|
|
6745
|
+
children: "Save group"
|
|
6746
|
+
}), (0, solid_js_web.createComponent)(Button, {
|
|
6747
|
+
size: "small",
|
|
6748
|
+
variant: "ghost",
|
|
6749
|
+
onClick: () => {
|
|
6750
|
+
setDraft(props.value ?? "");
|
|
6751
|
+
setCreating(false);
|
|
6752
|
+
},
|
|
6753
|
+
children: "Cancel"
|
|
6754
|
+
})];
|
|
6755
|
+
}
|
|
6618
6756
|
}), null);
|
|
6619
6757
|
(0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$, "aria-label", `${props.label} grouping`));
|
|
6620
6758
|
return _el$;
|
|
6621
6759
|
})();
|
|
6622
6760
|
}
|
|
6761
|
+
// src/shared/ui/gui/settings-surface.tsx
|
|
6762
|
+
var _tmpl$$45 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-settings><style>\n[data-navigator-settings] \{ display: grid; gap: 32px; min-width: 0; container-type: inline-size; }\n[data-navigator-settings] [data-component="settings-row"] \{ display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; gap: 20px; }\n[data-navigator-settings] [data-slot="settings-row-copy"] \{ min-width: 0; overflow-wrap: anywhere; }\n[data-navigator-settings] :is(button, input, textarea, [role="switch"]) \{ scroll-margin-block: 96px; }\n[data-navigator-settings] [data-slot="settings-row-control"] \{ min-width: 0; max-width: 100%; width: 100%; flex-wrap: wrap; gap: 8px; }\n[data-navigator-settings] [data-slot="settings-row-control"] > * \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-slot="settings-row-control"] > div:not([data-component]) \{ width: 100%; flex-wrap: wrap; }\n[data-navigator-settings] [data-component="button-v2"] \{ white-space: normal; height: auto; min-height: 24px; overflow-wrap: anywhere; }\n[data-navigator-settings] [data-component="text-input-v2"] \{ min-width: 0; max-width: 100%; }\n[data-navigator-settings] [data-sortable-item]:not(:last-of-type) > [data-component="settings-row"] \{ border-bottom: 0.5px solid var(--v2-border-border-base); }\n@container (max-width: 640px) \{\n [data-navigator-settings] [data-component="settings-row"] \{ grid-template-columns: minmax(0, 1fr); gap: 12px; }\n [data-navigator-settings] [data-slot="settings-row-control"] \{ justify-content: flex-start; }\n}\n`);
|
|
6763
|
+
function GuiSettingsSurface(props) {
|
|
6764
|
+
return (() => {
|
|
6765
|
+
var _el$ = _tmpl$$45();
|
|
6766
|
+
_el$.firstChild;
|
|
6767
|
+
(0, solid_js_web.insert)(_el$, () => props.children, null);
|
|
6768
|
+
return _el$;
|
|
6769
|
+
})();
|
|
6770
|
+
}
|
|
6771
|
+
// src/shared/ui/gui/sortable-focus.ts
|
|
6772
|
+
function createSortableFocus(props) {
|
|
6773
|
+
let focused;
|
|
6774
|
+
(0, solid_js.createEffect)(() => {
|
|
6775
|
+
const keys = props.keys();
|
|
6776
|
+
const disabled = props.disabled();
|
|
6777
|
+
const key = focused;
|
|
6778
|
+
if (!key || disabled || !keys.includes(key)) return;
|
|
6779
|
+
queueMicrotask(() => {
|
|
6780
|
+
if (focused !== key || props.disabled() || document.activeElement !== document.body) return;
|
|
6781
|
+
[...props.root().querySelectorAll("[data-sortable-item]")].find((node) => node.dataset.sortableItem === key)?.querySelector("button")?.focus({ preventScroll: true });
|
|
6782
|
+
});
|
|
6783
|
+
});
|
|
6784
|
+
return {
|
|
6785
|
+
enter(event) {
|
|
6786
|
+
const target = event.target;
|
|
6787
|
+
focused = target.getAttribute("aria-label")?.startsWith("Reorder ") ? target.closest("[data-sortable-item]")?.dataset.sortableItem : void 0;
|
|
6788
|
+
},
|
|
6789
|
+
leave(event) {
|
|
6790
|
+
if (event.relatedTarget && !props.root().contains(event.relatedTarget)) focused = void 0;
|
|
6791
|
+
}
|
|
6792
|
+
};
|
|
6793
|
+
}
|
|
6794
|
+
// src/shared/ui/gui/sortable-interaction.ts
|
|
6795
|
+
function createSortableInteraction(props) {
|
|
6796
|
+
const [source, setSource] = (0, solid_js.createSignal)();
|
|
6797
|
+
const [target, setTarget] = (0, solid_js.createSignal)();
|
|
6798
|
+
const [announcement, setAnnouncement] = (0, solid_js.createSignal)("");
|
|
6799
|
+
let drag;
|
|
6800
|
+
const signature = () => JSON.stringify(props.keys());
|
|
6801
|
+
function cancel() {
|
|
6802
|
+
const previous = drag;
|
|
6803
|
+
drag = void 0;
|
|
6804
|
+
setSource(void 0);
|
|
6805
|
+
setTarget(void 0);
|
|
6806
|
+
if (previous && previous.pointer >= 0 && props.root().hasPointerCapture(previous.pointer)) props.root().releasePointerCapture(previous.pointer);
|
|
6807
|
+
}
|
|
6808
|
+
(0, solid_js.createEffect)(() => {
|
|
6809
|
+
source();
|
|
6810
|
+
if (drag && (props.disabled() || props.scope() !== drag.scope || signature() !== drag.keys)) cancel();
|
|
6811
|
+
});
|
|
6812
|
+
function escape(event) {
|
|
6813
|
+
if (event.key !== "Escape") return;
|
|
6814
|
+
event.preventDefault();
|
|
6815
|
+
event.stopPropagation();
|
|
6816
|
+
cancel();
|
|
6817
|
+
}
|
|
6818
|
+
(0, solid_js.createEffect)(() => {
|
|
6819
|
+
if (!source()) return;
|
|
6820
|
+
globalThis.window.addEventListener("keydown", escape, { capture: true });
|
|
6821
|
+
(0, solid_js.onCleanup)(() => globalThis.window.removeEventListener("keydown", escape, true));
|
|
6822
|
+
});
|
|
6823
|
+
(0, solid_js.onCleanup)(cancel);
|
|
6824
|
+
function hover(event) {
|
|
6825
|
+
if (!drag || event.pointerId !== drag.pointer) return;
|
|
6826
|
+
const node = document.elementFromPoint(event.clientX, event.clientY)?.closest("[data-sortable-item]");
|
|
6827
|
+
setTarget(node && props.root().contains(node) ? node.dataset.sortableItem : void 0);
|
|
6828
|
+
}
|
|
6829
|
+
function start(event, id) {
|
|
6830
|
+
if (event.button !== 0 || props.disabled() || drag) return;
|
|
6831
|
+
event.preventDefault();
|
|
6832
|
+
event.stopPropagation();
|
|
6833
|
+
drag = {
|
|
6834
|
+
id,
|
|
6835
|
+
pointer: event.pointerId,
|
|
6836
|
+
scope: props.scope(),
|
|
6837
|
+
keys: signature()
|
|
6838
|
+
};
|
|
6839
|
+
props.root().setPointerCapture(event.pointerId);
|
|
6840
|
+
setSource(id);
|
|
6841
|
+
setTarget(id);
|
|
6842
|
+
}
|
|
6843
|
+
function end(event) {
|
|
6844
|
+
if (!drag || event.pointerId !== drag.pointer) return;
|
|
6845
|
+
hover(event);
|
|
6846
|
+
const current = drag;
|
|
6847
|
+
const destination = target();
|
|
6848
|
+
const valid = !props.disabled() && props.scope() === current.scope && signature() === current.keys;
|
|
6849
|
+
cancel();
|
|
6850
|
+
if (valid && destination && current.id !== destination) props.move(current.id, destination);
|
|
6851
|
+
}
|
|
6852
|
+
function key(event, id) {
|
|
6853
|
+
if (event.key === "Escape") {
|
|
6854
|
+
if (drag) {
|
|
6855
|
+
event.preventDefault();
|
|
6856
|
+
event.stopPropagation();
|
|
6857
|
+
cancel();
|
|
6858
|
+
}
|
|
6859
|
+
return;
|
|
6860
|
+
}
|
|
6861
|
+
if (props.disabled()) return;
|
|
6862
|
+
if ([" ", "Enter"].includes(event.key) && !event.repeat) {
|
|
6863
|
+
event.preventDefault();
|
|
6864
|
+
event.stopPropagation();
|
|
6865
|
+
if (!drag) {
|
|
6866
|
+
drag = {
|
|
6867
|
+
id,
|
|
6868
|
+
pointer: -1,
|
|
6869
|
+
scope: props.scope(),
|
|
6870
|
+
keys: signature()
|
|
6871
|
+
};
|
|
6872
|
+
setSource(id);
|
|
6873
|
+
setTarget(id);
|
|
6874
|
+
setAnnouncement("Picked up. Use arrow keys, Space to drop, or Escape to cancel.");
|
|
6875
|
+
} else if (drag.pointer === -1 && drag.id === id) {
|
|
6876
|
+
const destination = target();
|
|
6877
|
+
const valid = props.scope() === drag.scope && signature() === drag.keys;
|
|
6878
|
+
cancel();
|
|
6879
|
+
if (valid && destination && destination !== id) props.move(id, destination);
|
|
6880
|
+
}
|
|
6881
|
+
return;
|
|
6882
|
+
}
|
|
6883
|
+
if (drag?.pointer !== -1 || drag.id !== id || !["ArrowUp", "ArrowDown"].includes(event.key)) return;
|
|
6884
|
+
const keys = props.keys();
|
|
6885
|
+
const index = keys.indexOf(target() ?? id);
|
|
6886
|
+
const destination = keys[index + (event.key === "ArrowUp" ? -1 : 1)];
|
|
6887
|
+
if (!destination || index === -1) return;
|
|
6888
|
+
event.preventDefault();
|
|
6889
|
+
event.stopPropagation();
|
|
6890
|
+
setTarget(destination);
|
|
6891
|
+
setAnnouncement(`Drop at position ${keys.indexOf(destination) + 1} of ${keys.length}`);
|
|
6892
|
+
}
|
|
6893
|
+
return {
|
|
6894
|
+
source,
|
|
6895
|
+
target,
|
|
6896
|
+
announcement,
|
|
6897
|
+
start,
|
|
6898
|
+
hover,
|
|
6899
|
+
end,
|
|
6900
|
+
key,
|
|
6901
|
+
cancel
|
|
6902
|
+
};
|
|
6903
|
+
}
|
|
6904
|
+
// src/shared/ui/gui/sortable-list.tsx
|
|
6905
|
+
var _tmpl$$44 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=list><span role=status aria-live=polite style=position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)>Drag a handle, or press Space, use arrow keys, then Space to drop. Escape cancels. `);
|
|
6906
|
+
var _tmpl$2$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=listitem>`);
|
|
6907
|
+
var _tmpl$3$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<span title="Drag to reorder, or Space, arrow keys, Space. Escape cancels."style=display:inline-flex;touch-action:none;cursor:grab>`);
|
|
6908
|
+
function GuiSortableList(props) {
|
|
6909
|
+
let root;
|
|
6910
|
+
const help = (0, solid_js.createUniqueId)();
|
|
6911
|
+
const IconButton = props.ui.IconButton;
|
|
6912
|
+
const keys = () => props.items.map((item) => props.itemKey(item));
|
|
6913
|
+
const focus = createSortableFocus({
|
|
6914
|
+
root: () => root,
|
|
6915
|
+
keys,
|
|
6916
|
+
disabled: () => Boolean(props.disabled)
|
|
6917
|
+
});
|
|
6918
|
+
const interaction = createSortableInteraction({
|
|
6919
|
+
keys,
|
|
6920
|
+
scope: () => props.scope,
|
|
6921
|
+
disabled: () => Boolean(props.disabled),
|
|
6922
|
+
root: () => root,
|
|
6923
|
+
move: (from, to) => props.move(from, to)
|
|
6924
|
+
});
|
|
6925
|
+
return (() => {
|
|
6926
|
+
var _el$ = _tmpl$$44(), _el$2 = _el$.firstChild;
|
|
6927
|
+
_el$2.firstChild;
|
|
6928
|
+
(0, solid_js_web.addEventListener)(_el$, "lostpointercapture", interaction.cancel);
|
|
6929
|
+
(0, solid_js_web.addEventListener)(_el$, "pointercancel", interaction.cancel);
|
|
6930
|
+
(0, solid_js_web.addEventListener)(_el$, "pointerup", interaction.end, true);
|
|
6931
|
+
(0, solid_js_web.addEventListener)(_el$, "pointermove", interaction.hover, true);
|
|
6932
|
+
(0, solid_js_web.addEventListener)(_el$, "focusout", focus.leave, true);
|
|
6933
|
+
(0, solid_js_web.addEventListener)(_el$, "focusin", focus.enter, true);
|
|
6934
|
+
(0, solid_js_web.use)((node) => {
|
|
6935
|
+
root = node;
|
|
6936
|
+
}, _el$);
|
|
6937
|
+
(0, solid_js_web.setAttribute)(_el$, "aria-describedby", help);
|
|
6938
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
6939
|
+
get each() {
|
|
6940
|
+
return keys();
|
|
6941
|
+
},
|
|
6942
|
+
children: (key) => {
|
|
6943
|
+
const item = () => props.items.find((value) => props.itemKey(value) === key);
|
|
6944
|
+
return (() => {
|
|
6945
|
+
var _el$4 = _tmpl$2$30();
|
|
6946
|
+
(0, solid_js_web.setAttribute)(_el$4, "data-sortable-item", key);
|
|
6947
|
+
(0, solid_js_web.insert)(_el$4, () => props.children(item, (() => {
|
|
6948
|
+
var _el$5 = _tmpl$3$17();
|
|
6949
|
+
_el$5.$$keydown = (event) => interaction.key(event, key);
|
|
6950
|
+
_el$5.$$pointerdown = (event) => interaction.start(event, key);
|
|
6951
|
+
(0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(IconButton, {
|
|
6952
|
+
icon: "dot-grid",
|
|
6953
|
+
get label() {
|
|
6954
|
+
return `Reorder ${props.itemLabel(item())}`;
|
|
6955
|
+
},
|
|
6956
|
+
get disabled() {
|
|
6957
|
+
return props.disabled || keys().length < 2;
|
|
6958
|
+
}
|
|
6959
|
+
}));
|
|
6960
|
+
return _el$5;
|
|
6961
|
+
})()));
|
|
6962
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
6963
|
+
var _v$ = keys().indexOf(key) + 1, _v$2 = keys().length, _v$3 = interaction.source() === key ? "0.65" : "1", _v$4 = interaction.target() === key && interaction.source() !== key ? "1px dashed var(--v2-border-border-focus)" : void 0;
|
|
6964
|
+
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$4, "aria-posinset", _p$.e = _v$);
|
|
6965
|
+
_v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$4, "aria-setsize", _p$.t = _v$2);
|
|
6966
|
+
_v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$4, "opacity", _p$.a = _v$3);
|
|
6967
|
+
_v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$4, "outline", _p$.o = _v$4);
|
|
6968
|
+
return _p$;
|
|
6969
|
+
}, {
|
|
6970
|
+
e: void 0,
|
|
6971
|
+
t: void 0,
|
|
6972
|
+
a: void 0,
|
|
6973
|
+
o: void 0
|
|
6974
|
+
});
|
|
6975
|
+
return _el$4;
|
|
6976
|
+
})();
|
|
6977
|
+
}
|
|
6978
|
+
}), _el$2);
|
|
6979
|
+
(0, solid_js_web.setAttribute)(_el$2, "id", help);
|
|
6980
|
+
(0, solid_js_web.insert)(_el$2, () => interaction.announcement(), null);
|
|
6981
|
+
(0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$, "aria-label", props.label));
|
|
6982
|
+
return _el$;
|
|
6983
|
+
})();
|
|
6984
|
+
}
|
|
6985
|
+
(0, solid_js_web.delegateEvents)([
|
|
6986
|
+
"focusin",
|
|
6987
|
+
"focusout",
|
|
6988
|
+
"pointermove",
|
|
6989
|
+
"pointerup",
|
|
6990
|
+
"pointerdown",
|
|
6991
|
+
"keydown"
|
|
6992
|
+
]);
|
|
6993
|
+
// src/shared/ui/gui/progress.tsx
|
|
6994
|
+
var _tmpl$$43 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=progressbar aria-valuemin=0 aria-valuemax=100 style=display:grid;gap:6px;min-width:0><style>@keyframes navigator-install-pulse \{ from \{ transform: translateX(-100%); } to \{ transform: translateX(400%); } }\n@media (prefers-reduced-motion: reduce) \{ [data-navigator-install-pulse] \{ animation: none !important; } }</style><span style=display:flex;gap:6px;align-items:center></span><span style=display:block;height:3px;overflow:hidden;background:var(--v2-border-border-base)><span style=display:block;height:100%;background:var(--v2-text-text-base)>`);
|
|
6995
|
+
function GuiProgress(props) {
|
|
6996
|
+
const Loader = props.ui.Loader;
|
|
6997
|
+
return (() => {
|
|
6998
|
+
var _el$ = _tmpl$$43(), _el$3 = _el$.firstChild.nextSibling, _el$5 = _el$3.nextSibling.firstChild;
|
|
6999
|
+
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
7000
|
+
get when() {
|
|
7001
|
+
return props.value === void 0;
|
|
7002
|
+
},
|
|
7003
|
+
get children() {
|
|
7004
|
+
return (0, solid_js_web.createComponent)(Loader, { size: "small" });
|
|
7005
|
+
}
|
|
7006
|
+
}), null);
|
|
7007
|
+
(0, solid_js_web.insert)(_el$3, () => props.label, null);
|
|
7008
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
7009
|
+
var _v$ = props.label, _v$2 = props.value === void 0 ? void 0 : Math.floor(props.value * 100), _v$3 = props.label, _v$4 = props.value === void 0 ? "" : void 0, _v$5 = props.value === void 0 ? "25%" : `${Math.min(1, Math.max(0, props.value)) * 100}%`, _v$6 = props.value === void 0 ? "navigator-install-pulse 1.2s linear infinite" : void 0;
|
|
7010
|
+
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
|
|
7011
|
+
_v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$, "aria-valuenow", _p$.t = _v$2);
|
|
7012
|
+
_v$3 !== _p$.a && (0, solid_js_web.setAttribute)(_el$, "aria-valuetext", _p$.a = _v$3);
|
|
7013
|
+
_v$4 !== _p$.o && (0, solid_js_web.setAttribute)(_el$5, "data-navigator-install-pulse", _p$.o = _v$4);
|
|
7014
|
+
_v$5 !== _p$.i && (0, solid_js_web.setStyleProperty)(_el$5, "width", _p$.i = _v$5);
|
|
7015
|
+
_v$6 !== _p$.n && (0, solid_js_web.setStyleProperty)(_el$5, "animation", _p$.n = _v$6);
|
|
7016
|
+
return _p$;
|
|
7017
|
+
}, {
|
|
7018
|
+
e: void 0,
|
|
7019
|
+
t: void 0,
|
|
7020
|
+
a: void 0,
|
|
7021
|
+
o: void 0,
|
|
7022
|
+
i: void 0,
|
|
7023
|
+
n: void 0
|
|
7024
|
+
});
|
|
7025
|
+
return _el$;
|
|
7026
|
+
})();
|
|
7027
|
+
}
|
|
6623
7028
|
// src/pages/navigator/ui/gui/subagent-row.tsx
|
|
6624
|
-
var _tmpl$$
|
|
6625
|
-
var _tmpl$2$
|
|
7029
|
+
var _tmpl$$42 = /*#__PURE__*/ (0, solid_js_web.template)(`<li><p style="font-size:12px;opacity:0.65;margin:0 0 8px;overflow-wrap:anywhere">`);
|
|
7030
|
+
var _tmpl$2$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<span> · `);
|
|
6626
7031
|
function SubagentRow(props) {
|
|
6627
7032
|
const Button = props.ui.Button;
|
|
6628
7033
|
return (() => {
|
|
6629
|
-
var _el$ = _tmpl$$
|
|
7034
|
+
var _el$ = _tmpl$$42(), _el$2 = _el$.firstChild;
|
|
6630
7035
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
6631
7036
|
size: "small",
|
|
6632
7037
|
variant: "ghost",
|
|
@@ -6643,7 +7048,7 @@ function SubagentRow(props) {
|
|
|
6643
7048
|
return props.item.run;
|
|
6644
7049
|
},
|
|
6645
7050
|
children: (run) => (() => {
|
|
6646
|
-
var _el$3 = _tmpl$2$
|
|
7051
|
+
var _el$3 = _tmpl$2$29();
|
|
6647
7052
|
_el$3.firstChild;
|
|
6648
7053
|
(0, solid_js_web.insert)(_el$3, () => run().startedBeforeObservation ? "Observed after start · " : "", null);
|
|
6649
7054
|
(0, solid_js_web.insert)(_el$3, () => formatSubagentDuration(run().startedAt, run().finishedAt ?? props.now), null);
|
|
@@ -6654,9 +7059,9 @@ function SubagentRow(props) {
|
|
|
6654
7059
|
})();
|
|
6655
7060
|
}
|
|
6656
7061
|
// src/pages/navigator/ui/gui/subagent-section.tsx
|
|
6657
|
-
var _tmpl$$
|
|
6658
|
-
var _tmpl$2$
|
|
6659
|
-
var _tmpl$3$
|
|
7062
|
+
var _tmpl$$41 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
7063
|
+
var _tmpl$2$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="padding:0;margin:8px 0 0;list-style:none">`);
|
|
7064
|
+
var _tmpl$3$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching subagents.`);
|
|
6660
7065
|
function SubagentSection() {
|
|
6661
7066
|
const props = useNavigatorGui();
|
|
6662
7067
|
const mode = () => props.runtime.view.subagentMode();
|
|
@@ -6721,7 +7126,7 @@ function SubagentSection() {
|
|
|
6721
7126
|
return state().error;
|
|
6722
7127
|
},
|
|
6723
7128
|
get children() {
|
|
6724
|
-
var _el$ = _tmpl$$
|
|
7129
|
+
var _el$ = _tmpl$$41();
|
|
6725
7130
|
(0, solid_js_web.insert)(_el$, () => state().error?.message);
|
|
6726
7131
|
return _el$;
|
|
6727
7132
|
}
|
|
@@ -6731,10 +7136,10 @@ function SubagentSection() {
|
|
|
6731
7136
|
return rows().length > 0;
|
|
6732
7137
|
},
|
|
6733
7138
|
get fallback() {
|
|
6734
|
-
return _tmpl$3$
|
|
7139
|
+
return _tmpl$3$16();
|
|
6735
7140
|
},
|
|
6736
7141
|
get children() {
|
|
6737
|
-
var _el$2 = _tmpl$2$
|
|
7142
|
+
var _el$2 = _tmpl$2$28();
|
|
6738
7143
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
6739
7144
|
get each() {
|
|
6740
7145
|
return keys();
|
|
@@ -6913,26 +7318,95 @@ function buildTodoView(todos, mode) {
|
|
|
6913
7318
|
}
|
|
6914
7319
|
};
|
|
6915
7320
|
}
|
|
7321
|
+
// src/pages/navigator/ui/gui/todo-presentation.ts
|
|
7322
|
+
function todoPresentation(status) {
|
|
7323
|
+
const finished = status === "completed" || status === "cancelled";
|
|
7324
|
+
return {
|
|
7325
|
+
decoration: finished ? "line-through" : "none",
|
|
7326
|
+
text: finished ? "var(--v2-text-text-faint)" : status === "in_progress" ? "var(--v2-text-text-base)" : "var(--v2-text-text-muted)",
|
|
7327
|
+
icon: status === "in_progress" ? "var(--v2-state-fg-warning)" : status === "completed" ? "var(--v2-icon-icon-muted)" : "var(--v2-icon-icon-faint)"
|
|
7328
|
+
};
|
|
7329
|
+
}
|
|
7330
|
+
// src/pages/navigator/ui/gui/todo-status-icon.tsx
|
|
7331
|
+
var _tmpl$$40 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M8 4a4 4 0 0 0 0 8V4Z"fill=currentColor></svg>`, false, true, false);
|
|
7332
|
+
var _tmpl$2$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M5 8 7.5 11 11 5.5"stroke=currentColor stroke-linecap=round stroke-linejoin=round></svg>`, false, true, false);
|
|
7333
|
+
var _tmpl$3$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<svg><path d="M3.5 12.5 12.5 3.5"stroke=currentColor></svg>`, false, true, false);
|
|
7334
|
+
var _tmpl$4$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=img style=display:inline-flex;height:20px;align-items:center;flex-shrink:0><svg width=16 height=16 viewBox="0 0 16 16"fill=none aria-hidden=true><circle cx=8 cy=8 r=6.5 stroke=currentColor>`);
|
|
7335
|
+
function TodoStatusIcon(props) {
|
|
7336
|
+
const color = () => todoPresentation(props.status).icon;
|
|
7337
|
+
return (() => {
|
|
7338
|
+
var _el$ = _tmpl$4$10(), _el$2 = _el$.firstChild;
|
|
7339
|
+
_el$2.firstChild;
|
|
7340
|
+
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.Switch, { get children() {
|
|
7341
|
+
return [
|
|
7342
|
+
(0, solid_js_web.createComponent)(solid_js.Match, {
|
|
7343
|
+
get when() {
|
|
7344
|
+
return props.status === "in_progress";
|
|
7345
|
+
},
|
|
7346
|
+
get children() {
|
|
7347
|
+
return _tmpl$$40();
|
|
7348
|
+
}
|
|
7349
|
+
}),
|
|
7350
|
+
(0, solid_js_web.createComponent)(solid_js.Match, {
|
|
7351
|
+
get when() {
|
|
7352
|
+
return props.status === "completed";
|
|
7353
|
+
},
|
|
7354
|
+
get children() {
|
|
7355
|
+
return _tmpl$2$27();
|
|
7356
|
+
}
|
|
7357
|
+
}),
|
|
7358
|
+
(0, solid_js_web.createComponent)(solid_js.Match, {
|
|
7359
|
+
get when() {
|
|
7360
|
+
return props.status === "cancelled";
|
|
7361
|
+
},
|
|
7362
|
+
get children() {
|
|
7363
|
+
return _tmpl$3$15();
|
|
7364
|
+
}
|
|
7365
|
+
})
|
|
7366
|
+
];
|
|
7367
|
+
} }), null);
|
|
7368
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
7369
|
+
var _v$ = props.status, _v$2 = color();
|
|
7370
|
+
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
|
|
7371
|
+
_v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$, "color", _p$.t = _v$2);
|
|
7372
|
+
return _p$;
|
|
7373
|
+
}, {
|
|
7374
|
+
e: void 0,
|
|
7375
|
+
t: void 0
|
|
7376
|
+
});
|
|
7377
|
+
return _el$;
|
|
7378
|
+
})();
|
|
7379
|
+
}
|
|
6916
7380
|
// src/pages/navigator/ui/gui/todo-row.tsx
|
|
6917
|
-
var _tmpl$$
|
|
7381
|
+
var _tmpl$$39 = /*#__PURE__*/ (0, solid_js_web.template)(`<li data-navigator-todo-row style="display:flex;align-items:flex-start;gap:8px;padding:4px 6px;min-width:0"><span dir=auto data-navigator-todo-text style=flex:1;min-width:0;overflow-wrap:anywhere;font-size:13px;line-height:var(--line-height-base);letter-spacing:-0.04px>`);
|
|
6918
7382
|
function TodoRow(props) {
|
|
7383
|
+
const appearance = () => todoPresentation(props.item.status);
|
|
6919
7384
|
return (() => {
|
|
6920
|
-
var _el$ = _tmpl$$
|
|
6921
|
-
(0, solid_js_web.insert)(_el
|
|
6922
|
-
|
|
6923
|
-
|
|
6924
|
-
|
|
6925
|
-
(0, solid_js_web.
|
|
6926
|
-
|
|
7385
|
+
var _el$ = _tmpl$$39(), _el$2 = _el$.firstChild;
|
|
7386
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TodoStatusIcon, { get status() {
|
|
7387
|
+
return props.item.status;
|
|
7388
|
+
} }), _el$2);
|
|
7389
|
+
(0, solid_js_web.insert)(_el$2, () => props.item.content);
|
|
7390
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
7391
|
+
var _v$ = props.item.status, _v$2 = appearance().text, _v$3 = appearance().decoration;
|
|
7392
|
+
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "data-status", _p$.e = _v$);
|
|
7393
|
+
_v$2 !== _p$.t && (0, solid_js_web.setStyleProperty)(_el$2, "color", _p$.t = _v$2);
|
|
7394
|
+
_v$3 !== _p$.a && (0, solid_js_web.setStyleProperty)(_el$2, "text-decoration", _p$.a = _v$3);
|
|
7395
|
+
return _p$;
|
|
7396
|
+
}, {
|
|
7397
|
+
e: void 0,
|
|
7398
|
+
t: void 0,
|
|
7399
|
+
a: void 0
|
|
7400
|
+
});
|
|
6927
7401
|
return _el$;
|
|
6928
7402
|
})();
|
|
6929
7403
|
}
|
|
6930
7404
|
// src/pages/navigator/ui/gui/todo-section.tsx
|
|
6931
|
-
var _tmpl$$
|
|
6932
|
-
var _tmpl$2$
|
|
7405
|
+
var _tmpl$$38 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
7406
|
+
var _tmpl$2$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65;font-size:12px> completed of `);
|
|
6933
7407
|
var _tmpl$3$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Reading Todo configuration…`);
|
|
6934
|
-
var _tmpl$4$
|
|
6935
|
-
var _tmpl$5$
|
|
7408
|
+
var _tmpl$4$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<div><p>`);
|
|
7409
|
+
var _tmpl$5$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=opacity:0.65>No matching tasks. Manage Todo through chat.`);
|
|
6936
7410
|
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
7411
|
function TodoSection() {
|
|
6938
7412
|
const props = useNavigatorGui();
|
|
@@ -6966,7 +7440,7 @@ function TodoSection() {
|
|
|
6966
7440
|
},
|
|
6967
7441
|
get fallback() {
|
|
6968
7442
|
return (() => {
|
|
6969
|
-
var _el$6 = _tmpl$4$
|
|
7443
|
+
var _el$6 = _tmpl$4$9(), _el$7 = _el$6.firstChild;
|
|
6970
7444
|
(0, solid_js_web.insert)(_el$7, (() => {
|
|
6971
7445
|
var _c$ = (0, solid_js_web.memo)(() => setup()?.status === "error");
|
|
6972
7446
|
return () => _c$() ? setup()?.error : "Native Todo is disabled for this session.";
|
|
@@ -7030,7 +7504,7 @@ function TodoSection() {
|
|
|
7030
7504
|
return state().error;
|
|
7031
7505
|
},
|
|
7032
7506
|
get children() {
|
|
7033
|
-
var _el$ = _tmpl$$
|
|
7507
|
+
var _el$ = _tmpl$$38();
|
|
7034
7508
|
(0, solid_js_web.insert)(_el$, () => state().error?.message);
|
|
7035
7509
|
return _el$;
|
|
7036
7510
|
}
|
|
@@ -7040,7 +7514,7 @@ function TodoSection() {
|
|
|
7040
7514
|
return setup()?.status === "error";
|
|
7041
7515
|
},
|
|
7042
7516
|
get children() {
|
|
7043
|
-
var _el$2 = _tmpl$$
|
|
7517
|
+
var _el$2 = _tmpl$$38();
|
|
7044
7518
|
(0, solid_js_web.insert)(_el$2, () => setup()?.error);
|
|
7045
7519
|
return _el$2;
|
|
7046
7520
|
}
|
|
@@ -7050,11 +7524,11 @@ function TodoSection() {
|
|
|
7050
7524
|
return view().rows.length > 0;
|
|
7051
7525
|
},
|
|
7052
7526
|
get fallback() {
|
|
7053
|
-
return _tmpl$5$
|
|
7527
|
+
return _tmpl$5$4();
|
|
7054
7528
|
},
|
|
7055
7529
|
get children() {
|
|
7056
7530
|
return [(() => {
|
|
7057
|
-
var _el$3 = _tmpl$2$
|
|
7531
|
+
var _el$3 = _tmpl$2$26(), _el$4 = _el$3.firstChild;
|
|
7058
7532
|
(0, solid_js_web.insert)(_el$3, () => rows().filter((item) => item.status === "completed").length, _el$4);
|
|
7059
7533
|
(0, solid_js_web.insert)(_el$3, () => view().counts.all, null);
|
|
7060
7534
|
return _el$3;
|
|
@@ -7094,7 +7568,7 @@ function TodoSection() {
|
|
|
7094
7568
|
});
|
|
7095
7569
|
}
|
|
7096
7570
|
// src/pages/navigator/ui/gui/sections.tsx
|
|
7097
|
-
var _tmpl$$
|
|
7571
|
+
var _tmpl$$37 = /*#__PURE__*/ (0, solid_js_web.template)(`<hr style="border:0;border-top:1px solid currentColor;opacity:0.18;margin:14px 0">`);
|
|
7098
7572
|
function NavigatorSections() {
|
|
7099
7573
|
const services = useNavigatorGui();
|
|
7100
7574
|
const preferences = () => services.runtime.catalogs?.preferences;
|
|
@@ -7113,7 +7587,7 @@ function NavigatorSections() {
|
|
|
7113
7587
|
return index() > 0;
|
|
7114
7588
|
},
|
|
7115
7589
|
get children() {
|
|
7116
|
-
return _tmpl$$
|
|
7590
|
+
return _tmpl$$37();
|
|
7117
7591
|
}
|
|
7118
7592
|
}), (0, solid_js_web.createComponent)(solid_js.Switch, { get children() {
|
|
7119
7593
|
return [
|
|
@@ -7158,7 +7632,7 @@ function NavigatorSections() {
|
|
|
7158
7632
|
});
|
|
7159
7633
|
}
|
|
7160
7634
|
// src/features/pinned-toolbar/ui/gui/icon-picker.tsx
|
|
7161
|
-
var _tmpl$$
|
|
7635
|
+
var _tmpl$$36 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(110px, 1fr));gap:4px;margin:8px 0">`);
|
|
7162
7636
|
function GuiIconPicker(props) {
|
|
7163
7637
|
const Dialog = props.ui.Dialog;
|
|
7164
7638
|
const Button = props.ui.Button;
|
|
@@ -7186,7 +7660,7 @@ function GuiIconPicker(props) {
|
|
|
7186
7660
|
autofocus: true,
|
|
7187
7661
|
"class": "w-full"
|
|
7188
7662
|
}), (() => {
|
|
7189
|
-
var _el$ = _tmpl$$
|
|
7663
|
+
var _el$ = _tmpl$$36();
|
|
7190
7664
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
7191
7665
|
get each() {
|
|
7192
7666
|
return choices();
|
|
@@ -7213,13 +7687,24 @@ function GuiIconPicker(props) {
|
|
|
7213
7687
|
});
|
|
7214
7688
|
}
|
|
7215
7689
|
// src/features/pinned-toolbar/ui/gui/icon-group.tsx
|
|
7216
|
-
var _tmpl$$
|
|
7217
|
-
var _tmpl$2$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;margin:4px 0">`);
|
|
7690
|
+
var _tmpl$$35 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:flex;gap:4px;margin:4px 0">`);
|
|
7218
7691
|
function GuiIconGroupEditor(props) {
|
|
7219
7692
|
const Dialog = props.ui.Dialog;
|
|
7220
7693
|
const Button = props.ui.Button;
|
|
7221
|
-
|
|
7222
|
-
|
|
7694
|
+
let nextKey = props.initial.length;
|
|
7695
|
+
const [slots, setSlots] = (0, solid_js.createSignal)(props.initial.map((id, key) => ({
|
|
7696
|
+
id,
|
|
7697
|
+
key
|
|
7698
|
+
})));
|
|
7699
|
+
const values = () => slots().map((slot) => slot.id);
|
|
7700
|
+
function choose(key) {
|
|
7701
|
+
const select = (id) => setSlots((previous) => key === void 0 ? [...previous, {
|
|
7702
|
+
id,
|
|
7703
|
+
key: nextKey++
|
|
7704
|
+
}].slice(0, 3) : previous.map((slot) => slot.key === key ? {
|
|
7705
|
+
...slot,
|
|
7706
|
+
id
|
|
7707
|
+
} : slot));
|
|
7223
7708
|
props.dialogs.open((dialog) => (0, solid_js_web.createComponent)(GuiIconPicker, {
|
|
7224
7709
|
get ui() {
|
|
7225
7710
|
return props.ui;
|
|
@@ -7227,11 +7712,7 @@ function GuiIconGroupEditor(props) {
|
|
|
7227
7712
|
get close() {
|
|
7228
7713
|
return dialog.close;
|
|
7229
7714
|
},
|
|
7230
|
-
choose:
|
|
7231
|
-
const next = [...previous];
|
|
7232
|
-
next[index] = id;
|
|
7233
|
-
return next;
|
|
7234
|
-
})
|
|
7715
|
+
choose: select
|
|
7235
7716
|
}));
|
|
7236
7717
|
}
|
|
7237
7718
|
return (0, solid_js_web.createComponent)(Dialog, {
|
|
@@ -7253,59 +7734,64 @@ function GuiIconGroupEditor(props) {
|
|
|
7253
7734
|
})];
|
|
7254
7735
|
},
|
|
7255
7736
|
get children() {
|
|
7256
|
-
return [((
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7260
|
-
|
|
7261
|
-
|
|
7262
|
-
|
|
7263
|
-
|
|
7264
|
-
|
|
7265
|
-
|
|
7266
|
-
|
|
7267
|
-
|
|
7268
|
-
|
|
7269
|
-
|
|
7270
|
-
|
|
7271
|
-
|
|
7272
|
-
|
|
7273
|
-
|
|
7274
|
-
|
|
7275
|
-
|
|
7276
|
-
|
|
7277
|
-
|
|
7278
|
-
|
|
7279
|
-
|
|
7280
|
-
|
|
7281
|
-
|
|
7282
|
-
|
|
7283
|
-
|
|
7284
|
-
|
|
7285
|
-
|
|
7286
|
-
|
|
7287
|
-
|
|
7288
|
-
|
|
7289
|
-
|
|
7290
|
-
})
|
|
7291
|
-
|
|
7292
|
-
|
|
7293
|
-
|
|
7737
|
+
return [(0, solid_js_web.createComponent)(GuiSortableList, {
|
|
7738
|
+
get ui() {
|
|
7739
|
+
return props.ui;
|
|
7740
|
+
},
|
|
7741
|
+
label: "Button icon order",
|
|
7742
|
+
get items() {
|
|
7743
|
+
return slots();
|
|
7744
|
+
},
|
|
7745
|
+
itemKey: (slot) => String(slot.key),
|
|
7746
|
+
itemLabel: (slot) => `Icon ${slots().findIndex((value) => value.key === slot.key) + 1}: ${iconChoiceLabel(slot.id)}`,
|
|
7747
|
+
scope: "icon-draft",
|
|
7748
|
+
move: (from, to) => setSlots((previous) => reorderItems(previous, from, to, (slot) => String(slot.key))),
|
|
7749
|
+
children: (slot, handle) => (() => {
|
|
7750
|
+
var _el$ = _tmpl$$35();
|
|
7751
|
+
(0, solid_js_web.insert)(_el$, handle, null);
|
|
7752
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
7753
|
+
variant: "ghost",
|
|
7754
|
+
onClick: () => choose(slot().key),
|
|
7755
|
+
get children() {
|
|
7756
|
+
return [
|
|
7757
|
+
(0, solid_js_web.createComponent)(GuiIcon, {
|
|
7758
|
+
get ui() {
|
|
7759
|
+
return props.ui;
|
|
7760
|
+
},
|
|
7761
|
+
get id() {
|
|
7762
|
+
return slot().id;
|
|
7763
|
+
}
|
|
7764
|
+
}),
|
|
7765
|
+
"Icon ",
|
|
7766
|
+
(0, solid_js_web.memo)(() => slots().findIndex((value) => value.key === slot().key) + 1),
|
|
7767
|
+
": ",
|
|
7768
|
+
(0, solid_js_web.memo)(() => iconChoiceLabel(slot().id))
|
|
7769
|
+
];
|
|
7770
|
+
}
|
|
7771
|
+
}), null);
|
|
7772
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
7773
|
+
variant: "ghost-muted",
|
|
7774
|
+
onClick: () => setSlots((previous) => previous.filter((value) => value.key !== slot().key)),
|
|
7775
|
+
children: "Remove"
|
|
7776
|
+
}), null);
|
|
7777
|
+
return _el$;
|
|
7778
|
+
})()
|
|
7779
|
+
}), (0, solid_js_web.createComponent)(Button, {
|
|
7294
7780
|
get disabled() {
|
|
7295
7781
|
return values().length >= 3;
|
|
7296
7782
|
},
|
|
7297
|
-
onClick: () => choose(
|
|
7783
|
+
onClick: () => choose(),
|
|
7298
7784
|
children: "Add icon"
|
|
7299
7785
|
})];
|
|
7300
7786
|
}
|
|
7301
7787
|
});
|
|
7302
7788
|
}
|
|
7303
7789
|
// src/features/pinned-toolbar/ui/gui/pin-editor.tsx
|
|
7304
|
-
var _tmpl$$
|
|
7305
|
-
var _tmpl$2$
|
|
7790
|
+
var _tmpl$$34 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Base appearance`);
|
|
7791
|
+
var _tmpl$2$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:4px;align-items:center><span>`);
|
|
7306
7792
|
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$
|
|
7308
|
-
var _tmpl$5$
|
|
7793
|
+
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.`);
|
|
7794
|
+
var _tmpl$5$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
7309
7795
|
function GuiPinEditor(props) {
|
|
7310
7796
|
const initial = toolbarPinAppearance(props.pin);
|
|
7311
7797
|
const [base, setBase] = (0, solid_js.createSignal)([...initial.base]);
|
|
@@ -7392,9 +7878,9 @@ function GuiPinEditor(props) {
|
|
|
7392
7878
|
},
|
|
7393
7879
|
get children() {
|
|
7394
7880
|
return [
|
|
7395
|
-
_tmpl$$
|
|
7881
|
+
_tmpl$$34(),
|
|
7396
7882
|
(() => {
|
|
7397
|
-
var _el$2 = _tmpl$2$
|
|
7883
|
+
var _el$2 = _tmpl$2$25(), _el$3 = _el$2.firstChild;
|
|
7398
7884
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
7399
7885
|
get each() {
|
|
7400
7886
|
return base();
|
|
@@ -7453,7 +7939,7 @@ function GuiPinEditor(props) {
|
|
|
7453
7939
|
return Object.keys(states()).length > 0;
|
|
7454
7940
|
},
|
|
7455
7941
|
get children() {
|
|
7456
|
-
return _tmpl$4$
|
|
7942
|
+
return _tmpl$4$8();
|
|
7457
7943
|
}
|
|
7458
7944
|
}),
|
|
7459
7945
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
@@ -7461,7 +7947,7 @@ function GuiPinEditor(props) {
|
|
|
7461
7947
|
return error();
|
|
7462
7948
|
},
|
|
7463
7949
|
get children() {
|
|
7464
|
-
var _el$6 = _tmpl$5$
|
|
7950
|
+
var _el$6 = _tmpl$5$3();
|
|
7465
7951
|
(0, solid_js_web.insert)(_el$6, error);
|
|
7466
7952
|
return _el$6;
|
|
7467
7953
|
}
|
|
@@ -7471,11 +7957,10 @@ function GuiPinEditor(props) {
|
|
|
7471
7957
|
});
|
|
7472
7958
|
}
|
|
7473
7959
|
// src/features/pinned-toolbar/ui/gui/manager.tsx
|
|
7474
|
-
var _tmpl$$
|
|
7475
|
-
var _tmpl$2$
|
|
7476
|
-
var _tmpl$3$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<
|
|
7477
|
-
var _tmpl$4$
|
|
7478
|
-
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>`);
|
|
7960
|
+
var _tmpl$$33 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
7961
|
+
var _tmpl$2$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Pin a Skill or Quick Action from its row menu.`);
|
|
7962
|
+
var _tmpl$3$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<small style=display:block;opacity:0.6>`);
|
|
7963
|
+
var _tmpl$4$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="padding:8px 0;display:flex;gap:4px;align-items:center;min-width:0"><span style=flex:1;min-width:0;overflow-wrap:anywhere><strong>`);
|
|
7479
7964
|
var source = (pin) => pin.kind === "skill" ? pin.location : void 0;
|
|
7480
7965
|
function GuiToolbarManager(props) {
|
|
7481
7966
|
const Dialog = props.ui.Dialog;
|
|
@@ -7512,88 +7997,81 @@ function GuiToolbarManager(props) {
|
|
|
7512
7997
|
return props.close;
|
|
7513
7998
|
},
|
|
7514
7999
|
children: "Close"
|
|
7515
|
-
});
|
|
7516
|
-
},
|
|
7517
|
-
get children() {
|
|
7518
|
-
return [
|
|
7519
|
-
|
|
7520
|
-
|
|
7521
|
-
|
|
7522
|
-
get children() {
|
|
7523
|
-
var _el$ = _tmpl$$31();
|
|
7524
|
-
(0, solid_js_web.insert)(_el$, error);
|
|
7525
|
-
return _el$;
|
|
7526
|
-
}
|
|
7527
|
-
}), (() => {
|
|
7528
|
-
var _el$2 = _tmpl$2$22();
|
|
7529
|
-
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
7530
|
-
get each() {
|
|
7531
|
-
return props.pins.map((pin) => toolbarPinKey(pin));
|
|
8000
|
+
});
|
|
8001
|
+
},
|
|
8002
|
+
get children() {
|
|
8003
|
+
return [
|
|
8004
|
+
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
8005
|
+
get when() {
|
|
8006
|
+
return error();
|
|
7532
8007
|
},
|
|
7533
|
-
get
|
|
7534
|
-
|
|
8008
|
+
get children() {
|
|
8009
|
+
var _el$ = _tmpl$$33();
|
|
8010
|
+
(0, solid_js_web.insert)(_el$, error);
|
|
8011
|
+
return _el$;
|
|
8012
|
+
}
|
|
8013
|
+
}),
|
|
8014
|
+
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
8015
|
+
get when() {
|
|
8016
|
+
return props.pins.length === 0;
|
|
7535
8017
|
},
|
|
7536
|
-
children
|
|
7537
|
-
|
|
7538
|
-
|
|
7539
|
-
|
|
7540
|
-
|
|
7541
|
-
|
|
7542
|
-
|
|
7543
|
-
|
|
7544
|
-
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7548
|
-
|
|
7549
|
-
|
|
7550
|
-
|
|
7551
|
-
|
|
7552
|
-
|
|
7553
|
-
|
|
7554
|
-
|
|
7555
|
-
|
|
7556
|
-
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
|
|
7560
|
-
|
|
7561
|
-
|
|
7562
|
-
|
|
7563
|
-
|
|
7564
|
-
|
|
7565
|
-
|
|
7566
|
-
|
|
7567
|
-
|
|
7568
|
-
|
|
7569
|
-
|
|
7570
|
-
|
|
7571
|
-
|
|
7572
|
-
|
|
7573
|
-
|
|
7574
|
-
|
|
7575
|
-
|
|
7576
|
-
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
|
|
7592
|
-
|
|
7593
|
-
})
|
|
7594
|
-
}));
|
|
7595
|
-
return _el$2;
|
|
7596
|
-
})()];
|
|
8018
|
+
get children() {
|
|
8019
|
+
return _tmpl$2$24();
|
|
8020
|
+
}
|
|
8021
|
+
}),
|
|
8022
|
+
(0, solid_js_web.createComponent)(GuiSortableList, {
|
|
8023
|
+
get ui() {
|
|
8024
|
+
return props.ui;
|
|
8025
|
+
},
|
|
8026
|
+
label: "Toolbar pin order",
|
|
8027
|
+
get items() {
|
|
8028
|
+
return props.pins;
|
|
8029
|
+
},
|
|
8030
|
+
itemKey: toolbarPinKey,
|
|
8031
|
+
get itemLabel() {
|
|
8032
|
+
return props.label;
|
|
8033
|
+
},
|
|
8034
|
+
scope: "toolbar",
|
|
8035
|
+
get disabled() {
|
|
8036
|
+
return busy() || !props.current();
|
|
8037
|
+
},
|
|
8038
|
+
move: (from, to) => void run(() => props.move(from, to)),
|
|
8039
|
+
children: (pin, handle) => (() => {
|
|
8040
|
+
var _el$3 = _tmpl$4$7(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
8041
|
+
(0, solid_js_web.insert)(_el$5, () => props.label(pin()));
|
|
8042
|
+
(0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
8043
|
+
get when() {
|
|
8044
|
+
return source(pin());
|
|
8045
|
+
},
|
|
8046
|
+
get children() {
|
|
8047
|
+
var _el$6 = _tmpl$3$12();
|
|
8048
|
+
(0, solid_js_web.insert)(_el$6, () => source(pin()));
|
|
8049
|
+
return _el$6;
|
|
8050
|
+
}
|
|
8051
|
+
}), null);
|
|
8052
|
+
(0, solid_js_web.insert)(_el$3, handle, null);
|
|
8053
|
+
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(Button, {
|
|
8054
|
+
size: "small",
|
|
8055
|
+
get disabled() {
|
|
8056
|
+
return busy();
|
|
8057
|
+
},
|
|
8058
|
+
onClick: () => props.configure(toolbarPinKey(pin())),
|
|
8059
|
+
children: "Configure"
|
|
8060
|
+
}), null);
|
|
8061
|
+
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(IconButton, {
|
|
8062
|
+
icon: "close",
|
|
8063
|
+
get label() {
|
|
8064
|
+
return `Unpin ${props.label(pin())}`;
|
|
8065
|
+
},
|
|
8066
|
+
get disabled() {
|
|
8067
|
+
return busy();
|
|
8068
|
+
},
|
|
8069
|
+
onClick: () => void run(() => props.remove(toolbarPinKey(pin())))
|
|
8070
|
+
}), null);
|
|
8071
|
+
return _el$3;
|
|
8072
|
+
})()
|
|
8073
|
+
})
|
|
8074
|
+
];
|
|
7597
8075
|
}
|
|
7598
8076
|
});
|
|
7599
8077
|
}
|
|
@@ -7714,8 +8192,8 @@ function createMeasuredToolbar() {
|
|
|
7714
8192
|
};
|
|
7715
8193
|
}
|
|
7716
8194
|
// src/features/pinned-toolbar/ui/gui/toolbar-button.tsx
|
|
7717
|
-
var _tmpl$$
|
|
7718
|
-
var _tmpl$2$
|
|
8195
|
+
var _tmpl$$32 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap>`);
|
|
8196
|
+
var _tmpl$2$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<span aria-hidden=true style=display:inline-flex;gap:4px;align-items:center;min-width:0;max-width:100%><span style=white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0>`);
|
|
7719
8197
|
var _tmpl$3$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:inline-flex;min-width:0;flex-shrink:0>`);
|
|
7720
8198
|
function GuiToolbarButton(props) {
|
|
7721
8199
|
const Button = props.ui.Button;
|
|
@@ -7737,11 +8215,11 @@ function GuiToolbarButton(props) {
|
|
|
7737
8215
|
},
|
|
7738
8216
|
get children() {
|
|
7739
8217
|
return [(() => {
|
|
7740
|
-
var _el$ = _tmpl$$
|
|
8218
|
+
var _el$ = _tmpl$$32();
|
|
7741
8219
|
(0, solid_js_web.insert)(_el$, label);
|
|
7742
8220
|
return _el$;
|
|
7743
8221
|
})(), (() => {
|
|
7744
|
-
var _el$2 = _tmpl$2$
|
|
8222
|
+
var _el$2 = _tmpl$2$23(), _el$3 = _el$2.firstChild;
|
|
7745
8223
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
7746
8224
|
get each() {
|
|
7747
8225
|
return view().icons;
|
|
@@ -7800,8 +8278,8 @@ function GuiToolbarButton(props) {
|
|
|
7800
8278
|
}
|
|
7801
8279
|
(0, solid_js_web.delegateEvents)(["contextmenu", "keydown"]);
|
|
7802
8280
|
// src/features/pinned-toolbar/ui/gui/toolbar.tsx
|
|
7803
|
-
var _tmpl$$
|
|
7804
|
-
var _tmpl$2$
|
|
8281
|
+
var _tmpl$$31 = /*#__PURE__*/ (0, solid_js_web.template)(`<span data-toolbar-visible>`);
|
|
8282
|
+
var _tmpl$2$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-toolbar role=toolbar tabindex=-1 aria-label="Navigator pins"style="position:relative;display:flex;gap:4px;align-items:center;justify-content:center;padding:0 4px;min-height:28px;margin-bottom:8px"><div aria-hidden=true inert style=position:absolute;left:0;top:0;width:0;height:0;overflow:hidden;visibility:hidden;pointer-events:none><div style=display:flex;gap:4px;width:max-content><span>`);
|
|
7805
8283
|
function navigate(event) {
|
|
7806
8284
|
if (event.defaultPrevented || event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
|
|
7807
8285
|
const buttons = [...event.currentTarget.querySelectorAll(":scope [data-toolbar-visible] button")];
|
|
@@ -7825,7 +8303,7 @@ function GuiPinnedToolbar(props) {
|
|
|
7825
8303
|
return keys().length > 0;
|
|
7826
8304
|
},
|
|
7827
8305
|
get children() {
|
|
7828
|
-
var _el$ = _tmpl$2$
|
|
8306
|
+
var _el$ = _tmpl$2$22(), _el$3 = _el$.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
7829
8307
|
_el$.$$keydown = navigate;
|
|
7830
8308
|
var _ref$ = layout.root;
|
|
7831
8309
|
typeof _ref$ === "function" ? (0, solid_js_web.use)(_ref$, _el$) : layout.root = _el$;
|
|
@@ -7861,7 +8339,7 @@ function GuiPinnedToolbar(props) {
|
|
|
7861
8339
|
return hidden().length > 0;
|
|
7862
8340
|
},
|
|
7863
8341
|
get children() {
|
|
7864
|
-
var _el$2 = _tmpl$$
|
|
8342
|
+
var _el$2 = _tmpl$$31();
|
|
7865
8343
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Menu, {
|
|
7866
8344
|
label: "More toolbar items",
|
|
7867
8345
|
trigger: "icon",
|
|
@@ -7952,7 +8430,7 @@ function NavigatorPinnedToolbar() {
|
|
|
7952
8430
|
});
|
|
7953
8431
|
}
|
|
7954
8432
|
// src/pages/navigator/ui/gui/monitoring-content.tsx
|
|
7955
|
-
var _tmpl$$
|
|
8433
|
+
var _tmpl$$30 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-content style=padding:12px;overflow-y:auto;min-height:0;flex:1;font-size:13px>`);
|
|
7956
8434
|
function MonitoringContent(props) {
|
|
7957
8435
|
let body;
|
|
7958
8436
|
(0, solid_js.onMount)(() => {
|
|
@@ -7961,7 +8439,7 @@ function MonitoringContent(props) {
|
|
|
7961
8439
|
return (0, solid_js_web.createComponent)(NavigatorGuiContext.Provider, {
|
|
7962
8440
|
value: props,
|
|
7963
8441
|
get children() {
|
|
7964
|
-
var _el$ = _tmpl$$
|
|
8442
|
+
var _el$ = _tmpl$$30();
|
|
7965
8443
|
_el$.addEventListener("scroll", (event) => props.onScroll?.(event.currentTarget.scrollTop));
|
|
7966
8444
|
(0, solid_js_web.use)((node) => {
|
|
7967
8445
|
body = node;
|
|
@@ -8531,9 +9009,15 @@ function createMiniWindowInteraction(props) {
|
|
|
8531
9009
|
const update = (rect) => props.setRect(clampMiniWindow(rect, miniWindowViewport()));
|
|
8532
9010
|
let drag;
|
|
8533
9011
|
const resize = () => update(props.rect);
|
|
8534
|
-
const end = () => {
|
|
9012
|
+
const end = (event) => {
|
|
9013
|
+
if (event && drag?.pointer !== event.pointerId) return;
|
|
9014
|
+
const previous = drag;
|
|
8535
9015
|
drag = void 0;
|
|
9016
|
+
if (previous?.target.hasPointerCapture(previous.pointer)) previous.target.releasePointerCapture(previous.pointer);
|
|
8536
9017
|
};
|
|
9018
|
+
(0, solid_js.createEffect)(() => {
|
|
9019
|
+
if (props.modal) end();
|
|
9020
|
+
});
|
|
8537
9021
|
(0, solid_js.onMount)(() => {
|
|
8538
9022
|
globalThis.window.addEventListener("resize", resize);
|
|
8539
9023
|
globalThis.window.visualViewport?.addEventListener("resize", resize);
|
|
@@ -8545,19 +9029,22 @@ function createMiniWindowInteraction(props) {
|
|
|
8545
9029
|
end();
|
|
8546
9030
|
});
|
|
8547
9031
|
function start(event, mode) {
|
|
8548
|
-
if (event.button !== 0 || props.modal) return;
|
|
9032
|
+
if (event.button !== 0 || props.modal || drag) return;
|
|
8549
9033
|
event.preventDefault();
|
|
8550
9034
|
event.stopPropagation();
|
|
8551
|
-
event.currentTarget
|
|
9035
|
+
const target = event.currentTarget;
|
|
9036
|
+
target.setPointerCapture(event.pointerId);
|
|
8552
9037
|
drag = {
|
|
8553
9038
|
mode,
|
|
8554
9039
|
x: event.clientX,
|
|
8555
9040
|
y: event.clientY,
|
|
8556
|
-
rect: { ...props.rect }
|
|
9041
|
+
rect: { ...props.rect },
|
|
9042
|
+
pointer: event.pointerId,
|
|
9043
|
+
target
|
|
8557
9044
|
};
|
|
8558
9045
|
}
|
|
8559
9046
|
function move(event) {
|
|
8560
|
-
if (!drag || props.modal) return;
|
|
9047
|
+
if (!drag || props.modal || drag.pointer !== event.pointerId) return;
|
|
8561
9048
|
const x = event.clientX - drag.x;
|
|
8562
9049
|
const y = event.clientY - drag.y;
|
|
8563
9050
|
update(drag.mode === "move" ? {
|
|
@@ -8607,17 +9094,28 @@ function createMiniWindowInteraction(props) {
|
|
|
8607
9094
|
};
|
|
8608
9095
|
}
|
|
8609
9096
|
// src/pages/navigator/ui/gui/mini-window.tsx
|
|
8610
|
-
var _tmpl$$
|
|
9097
|
+
var _tmpl$$29 = /*#__PURE__*/ (0, solid_js_web.template)(`<aside data-navigator-floating style="position:fixed;display:flex;flex-direction:column;z-index:40;background:var(--v2-background-bg-layer-01);color:var(--v2-text-text-base);border:1px solid var(--v2-border-border-base, color-mix(in srgb, currentColor 20%, transparent));border-radius:12px;box-shadow:var(--v2-elevation-overlay, 0 8px 32px #0003);overflow:hidden;font-size:13px"><header style=display: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
9098
|
function NavigatorMiniWindow(props) {
|
|
8612
9099
|
const Button = props.ui.Button;
|
|
9100
|
+
const IconButton = props.ui.IconButton;
|
|
8613
9101
|
const interaction = createMiniWindowInteraction(props);
|
|
9102
|
+
function dragHeader(event) {
|
|
9103
|
+
const target = event.target;
|
|
9104
|
+
if (target.closest("button, input, select, textarea, a") && !target.closest("[data-navigator-move]")) return;
|
|
9105
|
+
interaction.start(event, "move");
|
|
9106
|
+
}
|
|
8614
9107
|
return (() => {
|
|
8615
|
-
var _el$ = _tmpl$$
|
|
9108
|
+
var _el$ = _tmpl$$29(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling, _el$6 = _el$5.firstChild;
|
|
9109
|
+
(0, solid_js_web.addEventListener)(_el$2, "lostpointercapture", interaction.end);
|
|
9110
|
+
(0, solid_js_web.addEventListener)(_el$2, "pointercancel", interaction.end);
|
|
9111
|
+
(0, solid_js_web.addEventListener)(_el$2, "pointerup", interaction.end, true);
|
|
9112
|
+
(0, solid_js_web.addEventListener)(_el$2, "pointermove", interaction.move, true);
|
|
9113
|
+
_el$2.$$pointerdown = dragHeader;
|
|
8616
9114
|
_el$3.$$keydown = (event) => interaction.key(event, "move");
|
|
8617
|
-
(0, solid_js_web.
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
9115
|
+
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(IconButton, {
|
|
9116
|
+
icon: "dot-grid",
|
|
9117
|
+
label: "Move Navigator mini-window"
|
|
9118
|
+
}));
|
|
8621
9119
|
(0, solid_js_web.insert)(_el$4, () => props.title);
|
|
8622
9120
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
|
|
8623
9121
|
size: "small",
|
|
@@ -8654,9 +9152,14 @@ function NavigatorMiniWindow(props) {
|
|
|
8654
9152
|
}), _el$6);
|
|
8655
9153
|
_el$6.$$keydown = (event) => interaction.key(event, "resize");
|
|
8656
9154
|
(0, solid_js_web.addEventListener)(_el$6, "lostpointercapture", interaction.end);
|
|
9155
|
+
(0, solid_js_web.addEventListener)(_el$6, "pointercancel", interaction.end);
|
|
8657
9156
|
(0, solid_js_web.addEventListener)(_el$6, "pointerup", interaction.end, true);
|
|
8658
9157
|
(0, solid_js_web.addEventListener)(_el$6, "pointermove", interaction.move, true);
|
|
8659
9158
|
_el$6.$$pointerdown = (event) => interaction.start(event, "resize");
|
|
9159
|
+
(0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(IconButton, {
|
|
9160
|
+
icon: "outline-expand",
|
|
9161
|
+
label: "Resize Navigator mini-window"
|
|
9162
|
+
}));
|
|
8660
9163
|
(0, solid_js_web.effect)((_p$) => {
|
|
8661
9164
|
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
9165
|
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$, "aria-label", _p$.e = _v$);
|
|
@@ -8690,13 +9193,13 @@ function NavigatorMiniWindow(props) {
|
|
|
8690
9193
|
"keydown"
|
|
8691
9194
|
]);
|
|
8692
9195
|
// src/pages/navigator/ui/gui/monitoring-panel.tsx
|
|
8693
|
-
var _tmpl$$
|
|
8694
|
-
var _tmpl$2$
|
|
9196
|
+
var _tmpl$$28 = /*#__PURE__*/ (0, solid_js_web.template)(`<div data-navigator-panel style=display:flex;flex-direction:column;height:100%;min-height:0><header 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>`);
|
|
9197
|
+
var _tmpl$2$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=padding:12px><p>Navigator is in its mini-window.`);
|
|
8695
9198
|
var _tmpl$3$10 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator…`);
|
|
8696
9199
|
function MonitoringPanel(props) {
|
|
8697
9200
|
const Button = props.ui.Button;
|
|
8698
9201
|
return (() => {
|
|
8699
|
-
var _el$ = _tmpl$$
|
|
9202
|
+
var _el$ = _tmpl$$28(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
|
|
8700
9203
|
(0, solid_js_web.insert)(_el$3, () => props.title);
|
|
8701
9204
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Button, {
|
|
8702
9205
|
size: "small",
|
|
@@ -8741,7 +9244,7 @@ function MonitoringPanel(props) {
|
|
|
8741
9244
|
},
|
|
8742
9245
|
get fallback() {
|
|
8743
9246
|
return (() => {
|
|
8744
|
-
var _el$4 = _tmpl$2$
|
|
9247
|
+
var _el$4 = _tmpl$2$21();
|
|
8745
9248
|
_el$4.firstChild;
|
|
8746
9249
|
(0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(Button, {
|
|
8747
9250
|
size: "small",
|
|
@@ -8806,9 +9309,23 @@ function parseChangelog(source) {
|
|
|
8806
9309
|
function changesSince(source, previous, current) {
|
|
8807
9310
|
return parseChangelog(source).filter((entry) => entry.changes.length > 0 && isNewerVersion(entry.version, previous) && !isNewerVersion(entry.version, current));
|
|
8808
9311
|
}
|
|
9312
|
+
// src/entities/navigator-release/model/update-progress.ts
|
|
9313
|
+
function updateProgressView(progress) {
|
|
9314
|
+
const labels = {
|
|
9315
|
+
preparing: "Preparing",
|
|
9316
|
+
downloading: "Downloading",
|
|
9317
|
+
installing: "Downloading / installing",
|
|
9318
|
+
verifying: "Verifying"
|
|
9319
|
+
};
|
|
9320
|
+
const fraction = progress.total !== void 0 && Number.isFinite(progress.total) && progress.total > 0 && progress.received !== void 0 && Number.isFinite(progress.received) && progress.received >= 0 ? Math.min(1, progress.received / progress.total) : void 0;
|
|
9321
|
+
return {
|
|
9322
|
+
label: fraction === void 0 ? labels[progress.phase] : `${labels[progress.phase]} ${Math.floor(fraction * 100)}%`,
|
|
9323
|
+
fraction
|
|
9324
|
+
};
|
|
9325
|
+
}
|
|
8809
9326
|
// src/features/sidebar-settings/ui/gui/mcp-preset-menu.tsx
|
|
8810
|
-
var _tmpl$$
|
|
8811
|
-
var _tmpl$2$
|
|
9327
|
+
var _tmpl$$27 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style="margin:8px 0;padding:0;list-style:none">`);
|
|
9328
|
+
var _tmpl$2$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching saved presets.`);
|
|
8812
9329
|
var _tmpl$3$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>`);
|
|
8813
9330
|
function GuiMcpPresetMenu(props) {
|
|
8814
9331
|
const Dialog = props.ui.Dialog;
|
|
@@ -8841,13 +9358,13 @@ function GuiMcpPresetMenu(props) {
|
|
|
8841
9358
|
autofocus: true,
|
|
8842
9359
|
"class": "w-full"
|
|
8843
9360
|
}), (() => {
|
|
8844
|
-
var _el$ = _tmpl$$
|
|
9361
|
+
var _el$ = _tmpl$$27();
|
|
8845
9362
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
8846
9363
|
get each() {
|
|
8847
9364
|
return names();
|
|
8848
9365
|
},
|
|
8849
9366
|
get fallback() {
|
|
8850
|
-
return _tmpl$2$
|
|
9367
|
+
return _tmpl$2$20();
|
|
8851
9368
|
},
|
|
8852
9369
|
children: (name) => (() => {
|
|
8853
9370
|
var _el$3 = _tmpl$3$9();
|
|
@@ -8865,8 +9382,8 @@ function GuiMcpPresetMenu(props) {
|
|
|
8865
9382
|
});
|
|
8866
9383
|
}
|
|
8867
9384
|
// src/features/sidebar-settings/ui/gui/mcp-preview-rows.tsx
|
|
8868
|
-
var _tmpl$$
|
|
8869
|
-
var _tmpl$2$
|
|
9385
|
+
var _tmpl$$26 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3></h3><ul style=padding:0;list-style:none>`);
|
|
9386
|
+
var _tmpl$2$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0;overflow-wrap:anywhere"><strong></strong><p style="margin:2px 0;opacity:0.65"> · `);
|
|
8870
9387
|
var groups = [
|
|
8871
9388
|
"Changes",
|
|
8872
9389
|
"Skipped",
|
|
@@ -8884,7 +9401,7 @@ function GuiMcpPreviewRows(props) {
|
|
|
8884
9401
|
return props.model.preview().rows.some((row) => group(row.change) === section);
|
|
8885
9402
|
},
|
|
8886
9403
|
get children() {
|
|
8887
|
-
var _el$ = _tmpl$$
|
|
9404
|
+
var _el$ = _tmpl$$26(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
|
|
8888
9405
|
(0, solid_js_web.insert)(_el$2, section);
|
|
8889
9406
|
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
8890
9407
|
get each() {
|
|
@@ -8893,7 +9410,7 @@ function GuiMcpPreviewRows(props) {
|
|
|
8893
9410
|
children: (name) => {
|
|
8894
9411
|
const row = () => props.model.preview().rows.find((item) => item.name === name);
|
|
8895
9412
|
return (() => {
|
|
8896
|
-
var _el$4 = _tmpl$2$
|
|
9413
|
+
var _el$4 = _tmpl$2$19(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild;
|
|
8897
9414
|
(0, solid_js_web.insert)(_el$5, name);
|
|
8898
9415
|
(0, solid_js_web.insert)(_el$6, () => row().status ?? "Not available", _el$7);
|
|
8899
9416
|
(0, solid_js_web.insert)(_el$6, () => row().change, null);
|
|
@@ -8911,8 +9428,8 @@ function GuiMcpPreviewRows(props) {
|
|
|
8911
9428
|
});
|
|
8912
9429
|
}
|
|
8913
9430
|
// src/features/sidebar-settings/ui/gui/mcp-preset-preview.tsx
|
|
8914
|
-
var _tmpl$$
|
|
8915
|
-
var _tmpl$2$
|
|
9431
|
+
var _tmpl$$25 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
|
|
9432
|
+
var _tmpl$2$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
8916
9433
|
function GuiMcpPresetPreview(props) {
|
|
8917
9434
|
const Dialog = props.ui.Dialog;
|
|
8918
9435
|
const Button = props.ui.Button;
|
|
@@ -8973,7 +9490,7 @@ function GuiMcpPresetPreview(props) {
|
|
|
8973
9490
|
get children() {
|
|
8974
9491
|
return [
|
|
8975
9492
|
(() => {
|
|
8976
|
-
var _el$ = _tmpl$$
|
|
9493
|
+
var _el$ = _tmpl$$25();
|
|
8977
9494
|
(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
9495
|
return _el$;
|
|
8979
9496
|
})(),
|
|
@@ -8982,7 +9499,7 @@ function GuiMcpPresetPreview(props) {
|
|
|
8982
9499
|
return props.model.blocked() || error();
|
|
8983
9500
|
},
|
|
8984
9501
|
get children() {
|
|
8985
|
-
var _el$2 = _tmpl$2$
|
|
9502
|
+
var _el$2 = _tmpl$2$18();
|
|
8986
9503
|
(0, solid_js_web.insert)(_el$2, () => error() || props.model.blocked());
|
|
8987
9504
|
return _el$2;
|
|
8988
9505
|
}
|
|
@@ -8995,7 +9512,7 @@ function GuiMcpPresetPreview(props) {
|
|
|
8995
9512
|
});
|
|
8996
9513
|
}
|
|
8997
9514
|
// src/features/sidebar-settings/ui/gui/settings-about.tsx
|
|
8998
|
-
var _tmpl$$
|
|
9515
|
+
var _tmpl$$24 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
|
|
8999
9516
|
function GuiSettingsAbout(props) {
|
|
9000
9517
|
const Section = props.ui.SettingsSection;
|
|
9001
9518
|
const Row = props.ui.SettingsRow;
|
|
@@ -9005,11 +9522,15 @@ function GuiSettingsAbout(props) {
|
|
|
9005
9522
|
const versions = () => props.about.changelog.filter((entry) => entry.changes.length > 0);
|
|
9006
9523
|
const [version, setVersion] = (0, solid_js.createSignal)(versions()[0]?.version);
|
|
9007
9524
|
const changes = () => versions().find((entry) => entry.version === version())?.changes.map((change) => `- ${change}`).join("\n") ?? "No user-facing release notes are bundled.";
|
|
9525
|
+
const progress = () => {
|
|
9526
|
+
const current = props.about.progress?.();
|
|
9527
|
+
return current && updateProgressView(current);
|
|
9528
|
+
};
|
|
9008
9529
|
return [(0, solid_js_web.createComponent)(Section, {
|
|
9009
9530
|
title: "About Navigator",
|
|
9010
9531
|
get footer() {
|
|
9011
9532
|
return (() => {
|
|
9012
|
-
var _el$ = _tmpl$$
|
|
9533
|
+
var _el$ = _tmpl$$24();
|
|
9013
9534
|
(0, solid_js_web.insert)(_el$, () => props.about.status());
|
|
9014
9535
|
return _el$;
|
|
9015
9536
|
})();
|
|
@@ -9018,7 +9539,17 @@ function GuiSettingsAbout(props) {
|
|
|
9018
9539
|
return [
|
|
9019
9540
|
(0, solid_js_web.createComponent)(Row, {
|
|
9020
9541
|
get title() {
|
|
9021
|
-
return
|
|
9542
|
+
return (0, solid_js_web.memo)(() => !!progress())() ? (0, solid_js_web.createComponent)(GuiProgress, {
|
|
9543
|
+
get ui() {
|
|
9544
|
+
return props.ui;
|
|
9545
|
+
},
|
|
9546
|
+
get label() {
|
|
9547
|
+
return `Navigator · ${progress().label}`;
|
|
9548
|
+
},
|
|
9549
|
+
get value() {
|
|
9550
|
+
return progress().fraction;
|
|
9551
|
+
}
|
|
9552
|
+
}) : `Navigator ${props.about.version}`;
|
|
9022
9553
|
},
|
|
9023
9554
|
get description() {
|
|
9024
9555
|
return `OpenCode Desktop ${props.about.hostVersion}. Experimental Desktop GUI.`;
|
|
@@ -9096,7 +9627,7 @@ function GuiSettingsAbout(props) {
|
|
|
9096
9627
|
})];
|
|
9097
9628
|
}
|
|
9098
9629
|
// src/features/sidebar-settings/ui/gui/settings-behavior.tsx
|
|
9099
|
-
var _tmpl$$
|
|
9630
|
+
var _tmpl$$23 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;align-items:center>`);
|
|
9100
9631
|
function GuiSettingsBehavior(props) {
|
|
9101
9632
|
const Section = props.ui.SettingsSection;
|
|
9102
9633
|
const Row = props.ui.SettingsRow;
|
|
@@ -9118,6 +9649,7 @@ function GuiSettingsBehavior(props) {
|
|
|
9118
9649
|
get children() {
|
|
9119
9650
|
return (0, solid_js_web.createComponent)(Switch, {
|
|
9120
9651
|
label: "Remember MCP states",
|
|
9652
|
+
hideLabel: true,
|
|
9121
9653
|
get checked() {
|
|
9122
9654
|
return props.preferences.selectedPersistMcp();
|
|
9123
9655
|
},
|
|
@@ -9179,7 +9711,7 @@ function GuiSettingsBehavior(props) {
|
|
|
9179
9711
|
title: "Limits refresh",
|
|
9180
9712
|
description: "Whole minutes, at least one. Manual refresh and model/account switches remain immediate.",
|
|
9181
9713
|
get children() {
|
|
9182
|
-
var _el$ = _tmpl$$
|
|
9714
|
+
var _el$ = _tmpl$$23();
|
|
9183
9715
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
|
|
9184
9716
|
label: "Limits refresh in minutes",
|
|
9185
9717
|
get value() {
|
|
@@ -9262,6 +9794,7 @@ function GuiSettingsBehavior(props) {
|
|
|
9262
9794
|
];
|
|
9263
9795
|
}
|
|
9264
9796
|
// src/features/sidebar-settings/ui/gui/settings-catalogs.tsx
|
|
9797
|
+
var _tmpl$$22 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:flex;gap:8px;align-items:center>`);
|
|
9265
9798
|
function GuiSettingsCatalogs(props) {
|
|
9266
9799
|
const Section = props.ui.SettingsSection;
|
|
9267
9800
|
const Row = props.ui.SettingsRow;
|
|
@@ -9274,42 +9807,40 @@ function GuiSettingsCatalogs(props) {
|
|
|
9274
9807
|
title: "Quick Actions",
|
|
9275
9808
|
footer: "Visibility and order are scoped. Favorites are private and user-wide; usage never reorders actions.",
|
|
9276
9809
|
get children() {
|
|
9277
|
-
return (0, solid_js_web.createComponent)(
|
|
9278
|
-
get
|
|
9810
|
+
return (0, solid_js_web.createComponent)(GuiSortableList, {
|
|
9811
|
+
get ui() {
|
|
9812
|
+
return props.ui;
|
|
9813
|
+
},
|
|
9814
|
+
label: "Quick Action order",
|
|
9815
|
+
get items() {
|
|
9279
9816
|
return props.catalogs.actions();
|
|
9280
9817
|
},
|
|
9281
|
-
|
|
9818
|
+
itemKey: (action) => action.id,
|
|
9819
|
+
itemLabel: (action) => action.label,
|
|
9820
|
+
get scope() {
|
|
9821
|
+
return props.preferences.selectedScopeKey();
|
|
9822
|
+
},
|
|
9823
|
+
move: (from, to) => props.preferences.reorderQuickAction(from, to, props.preferences.selectedScopeKey()),
|
|
9824
|
+
children: (action, handle) => (0, solid_js_web.createComponent)(Row, {
|
|
9282
9825
|
get title() {
|
|
9283
|
-
return
|
|
9826
|
+
return (() => {
|
|
9827
|
+
var _el$ = _tmpl$$22();
|
|
9828
|
+
(0, solid_js_web.insert)(_el$, handle, null);
|
|
9829
|
+
(0, solid_js_web.insert)(_el$, () => action().label, null);
|
|
9830
|
+
return _el$;
|
|
9831
|
+
})();
|
|
9284
9832
|
},
|
|
9285
9833
|
get children() {
|
|
9286
|
-
return
|
|
9287
|
-
(
|
|
9288
|
-
|
|
9289
|
-
|
|
9290
|
-
|
|
9291
|
-
|
|
9292
|
-
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9296
|
-
size: "small",
|
|
9297
|
-
get disabled() {
|
|
9298
|
-
return index() === props.catalogs.actions().length - 1;
|
|
9299
|
-
},
|
|
9300
|
-
onClick: () => props.preferences.moveQuickAction(action.id, 1),
|
|
9301
|
-
children: "Move down"
|
|
9302
|
-
}),
|
|
9303
|
-
(0, solid_js_web.createComponent)(Switch, {
|
|
9304
|
-
get label() {
|
|
9305
|
-
return `Show action ${action.label}`;
|
|
9306
|
-
},
|
|
9307
|
-
get checked() {
|
|
9308
|
-
return props.preferences.selectedQuickActionVisible(action.id);
|
|
9309
|
-
},
|
|
9310
|
-
onChange: () => props.preferences.toggleQuickAction(action.id)
|
|
9311
|
-
})
|
|
9312
|
-
];
|
|
9834
|
+
return (0, solid_js_web.createComponent)(Switch, {
|
|
9835
|
+
get label() {
|
|
9836
|
+
return `Show action ${action().label}`;
|
|
9837
|
+
},
|
|
9838
|
+
hideLabel: true,
|
|
9839
|
+
get checked() {
|
|
9840
|
+
return props.preferences.selectedQuickActionVisible(action().id);
|
|
9841
|
+
},
|
|
9842
|
+
onChange: () => props.preferences.toggleQuickAction(action().id)
|
|
9843
|
+
});
|
|
9313
9844
|
}
|
|
9314
9845
|
})
|
|
9315
9846
|
});
|
|
@@ -9448,11 +9979,11 @@ function GuiSettingsCatalogs(props) {
|
|
|
9448
9979
|
];
|
|
9449
9980
|
}
|
|
9450
9981
|
// src/features/sidebar-settings/ui/gui/preset-controls.tsx
|
|
9451
|
-
var _tmpl$$
|
|
9982
|
+
var _tmpl$$21 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;flex-wrap:wrap>`);
|
|
9452
9983
|
function GuiPresetControls(props) {
|
|
9453
9984
|
const Button = props.ui.Button;
|
|
9454
9985
|
return (() => {
|
|
9455
|
-
var _el$ = _tmpl$$
|
|
9986
|
+
var _el$ = _tmpl$$21();
|
|
9456
9987
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
9457
9988
|
size: "small",
|
|
9458
9989
|
onClick: () => void props.presets.manage(props.kind, props.name, "rename"),
|
|
@@ -9473,8 +10004,8 @@ function GuiPresetControls(props) {
|
|
|
9473
10004
|
})();
|
|
9474
10005
|
}
|
|
9475
10006
|
// src/features/sidebar-settings/ui/gui/settings-presets.tsx
|
|
9476
|
-
var _tmpl$$
|
|
9477
|
-
var _tmpl$2$
|
|
10007
|
+
var _tmpl$$20 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style=display:flex;gap:8px;flex-wrap:wrap>`);
|
|
10008
|
+
var _tmpl$2$17 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
|
|
9478
10009
|
function GuiSettingsPresets(props) {
|
|
9479
10010
|
const Section = props.ui.SettingsSection;
|
|
9480
10011
|
const Row = props.ui.SettingsRow;
|
|
@@ -9501,7 +10032,7 @@ function GuiSettingsPresets(props) {
|
|
|
9501
10032
|
return message();
|
|
9502
10033
|
},
|
|
9503
10034
|
get children() {
|
|
9504
|
-
var _el$2 = _tmpl$2$
|
|
10035
|
+
var _el$2 = _tmpl$2$17();
|
|
9505
10036
|
(0, solid_js_web.insert)(_el$2, message);
|
|
9506
10037
|
return _el$2;
|
|
9507
10038
|
}
|
|
@@ -9513,7 +10044,7 @@ function GuiSettingsPresets(props) {
|
|
|
9513
10044
|
title: "Save current layout or MCP states",
|
|
9514
10045
|
description: "Named presets are private and shared across worktrees.",
|
|
9515
10046
|
get children() {
|
|
9516
|
-
var _el$ = _tmpl$$
|
|
10047
|
+
var _el$ = _tmpl$$20();
|
|
9517
10048
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
|
|
9518
10049
|
label: "New preset name",
|
|
9519
10050
|
get value() {
|
|
@@ -9690,7 +10221,8 @@ function GuiSettingsResets(props) {
|
|
|
9690
10221
|
});
|
|
9691
10222
|
}
|
|
9692
10223
|
// src/features/sidebar-settings/ui/gui/section-settings-row.tsx
|
|
9693
|
-
var _tmpl$$
|
|
10224
|
+
var _tmpl$$19 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=group style=display:flex;gap:8px;align-items:center;flex-wrap:wrap><span style=display:flex;gap:6px;align-items:center><span>Visible</span></span><span style=display:flex;gap:6px;align-items:center><span>Expanded`);
|
|
10225
|
+
var _tmpl$2$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<span style=display:flex;gap:8px;align-items:center>`);
|
|
9694
10226
|
function GuiSectionSettingsRow(props) {
|
|
9695
10227
|
const Row = props.ui.SettingsRow;
|
|
9696
10228
|
const Switch = props.ui.Switch;
|
|
@@ -9702,7 +10234,12 @@ function GuiSectionSettingsRow(props) {
|
|
|
9702
10234
|
(0, solid_js.createEffect)(() => setLimit(String(props.preferences.selectedSectionItemLimit(props.section))));
|
|
9703
10235
|
return (0, solid_js_web.createComponent)(Row, {
|
|
9704
10236
|
get title() {
|
|
9705
|
-
return
|
|
10237
|
+
return (() => {
|
|
10238
|
+
var _el$6 = _tmpl$2$16();
|
|
10239
|
+
(0, solid_js_web.insert)(_el$6, () => props.handle, null);
|
|
10240
|
+
(0, solid_js_web.insert)(_el$6, label, null);
|
|
10241
|
+
return _el$6;
|
|
10242
|
+
})();
|
|
9706
10243
|
},
|
|
9707
10244
|
get id() {
|
|
9708
10245
|
return `navigator-section-${props.section}`;
|
|
@@ -9711,24 +10248,12 @@ function GuiSectionSettingsRow(props) {
|
|
|
9711
10248
|
return props.section === "lsp" ? "LSP is not exposed by this Desktop API. Its saved layout is retained for supported TUI hosts." : void 0;
|
|
9712
10249
|
},
|
|
9713
10250
|
get children() {
|
|
9714
|
-
var _el$ = _tmpl$$
|
|
9715
|
-
|
|
9716
|
-
|
|
9717
|
-
|
|
9718
|
-
|
|
9719
|
-
|
|
9720
|
-
onClick: () => props.preferences.moveSelectedSection(props.section, -1),
|
|
9721
|
-
children: "Move up"
|
|
9722
|
-
}), null);
|
|
9723
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Button, {
|
|
9724
|
-
size: "small",
|
|
9725
|
-
get disabled() {
|
|
9726
|
-
return props.index === props.count - 1;
|
|
9727
|
-
},
|
|
9728
|
-
onClick: () => props.preferences.moveSelectedSection(props.section, 1),
|
|
9729
|
-
children: "Move down"
|
|
9730
|
-
}), null);
|
|
9731
|
-
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(Switch, {
|
|
10251
|
+
var _el$ = _tmpl$$19(), _el$2 = _el$.firstChild;
|
|
10252
|
+
_el$2.firstChild;
|
|
10253
|
+
var _el$4 = _el$2.nextSibling;
|
|
10254
|
+
_el$4.firstChild;
|
|
10255
|
+
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(Switch, {
|
|
10256
|
+
hideLabel: true,
|
|
9732
10257
|
get label() {
|
|
9733
10258
|
return `Show ${label()}`;
|
|
9734
10259
|
},
|
|
@@ -9737,7 +10262,8 @@ function GuiSectionSettingsRow(props) {
|
|
|
9737
10262
|
},
|
|
9738
10263
|
onChange: () => props.preferences.toggleSelectedSection(props.section)
|
|
9739
10264
|
}), null);
|
|
9740
|
-
(0, solid_js_web.insert)(_el
|
|
10265
|
+
(0, solid_js_web.insert)(_el$4, (0, solid_js_web.createComponent)(Switch, {
|
|
10266
|
+
hideLabel: true,
|
|
9741
10267
|
get label() {
|
|
9742
10268
|
return `Expand ${label()}`;
|
|
9743
10269
|
},
|
|
@@ -9785,26 +10311,33 @@ function GuiSettingsSections(props) {
|
|
|
9785
10311
|
title: "Sections",
|
|
9786
10312
|
footer: "Visibility changes apply immediately. Save this layout as the scoped default to use it in future sessions.",
|
|
9787
10313
|
get children() {
|
|
9788
|
-
return (0, solid_js_web.createComponent)(
|
|
9789
|
-
get
|
|
10314
|
+
return (0, solid_js_web.createComponent)(GuiSortableList, {
|
|
10315
|
+
get ui() {
|
|
10316
|
+
return props.ui;
|
|
10317
|
+
},
|
|
10318
|
+
label: "Section order",
|
|
10319
|
+
get items() {
|
|
9790
10320
|
return preferences.selectedSectionOrder();
|
|
9791
10321
|
},
|
|
9792
|
-
|
|
9793
|
-
|
|
9794
|
-
|
|
9795
|
-
|
|
10322
|
+
itemKey: (section) => section,
|
|
10323
|
+
itemLabel: (section) => SECTION_DEFINITIONS.find((value) => value.name === section)?.label ?? section,
|
|
10324
|
+
get scope() {
|
|
10325
|
+
return preferences.selectedScopeKey();
|
|
10326
|
+
},
|
|
10327
|
+
move: (from, to) => preferences.reorderSelectedSection(from, to, preferences.selectedScopeKey()),
|
|
10328
|
+
children: (section, handle) => (0, solid_js_web.createComponent)(GuiSectionSettingsRow, (0, solid_js_web.mergeProps)(props, {
|
|
10329
|
+
get section() {
|
|
10330
|
+
return section();
|
|
9796
10331
|
},
|
|
9797
|
-
|
|
9798
|
-
return preferences.selectedSectionOrder().length;
|
|
9799
|
-
}
|
|
10332
|
+
handle
|
|
9800
10333
|
}))
|
|
9801
10334
|
});
|
|
9802
10335
|
}
|
|
9803
10336
|
});
|
|
9804
10337
|
}
|
|
9805
10338
|
// src/features/sidebar-settings/ui/gui/settings-page.tsx
|
|
9806
|
-
var _tmpl$$
|
|
9807
|
-
var _tmpl$2$
|
|
10339
|
+
var _tmpl$$18 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Loading Navigator preferences…`);
|
|
10340
|
+
var _tmpl$2$15 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
|
|
9808
10341
|
function GuiNavigatorSettings(props) {
|
|
9809
10342
|
const Layout = props.ui.SettingsLayout;
|
|
9810
10343
|
const Section = props.ui.SettingsSection;
|
|
@@ -9830,111 +10363,113 @@ function GuiNavigatorSettings(props) {
|
|
|
9830
10363
|
title: "Navigator",
|
|
9831
10364
|
description: "Shared sidebar settings for this Desktop and your local TUI instances.",
|
|
9832
10365
|
get children() {
|
|
9833
|
-
return (0, solid_js_web.createComponent)(
|
|
9834
|
-
|
|
9835
|
-
|
|
9836
|
-
|
|
9837
|
-
|
|
9838
|
-
|
|
9839
|
-
|
|
9840
|
-
|
|
9841
|
-
|
|
9842
|
-
|
|
9843
|
-
|
|
9844
|
-
|
|
9845
|
-
|
|
9846
|
-
|
|
9847
|
-
|
|
9848
|
-
|
|
9849
|
-
|
|
9850
|
-
var _el$2 = _tmpl$2$14();
|
|
9851
|
-
(0, solid_js_web.insert)(_el$2, status);
|
|
9852
|
-
return _el$2;
|
|
9853
|
-
}
|
|
9854
|
-
});
|
|
9855
|
-
},
|
|
9856
|
-
get children() {
|
|
9857
|
-
return [
|
|
9858
|
-
(0, solid_js_web.createComponent)(Row, {
|
|
9859
|
-
title: "Scope",
|
|
9860
|
-
description: "Global applies everywhere. Worktree overrides use the currently selected server and location.",
|
|
9861
|
-
get children() {
|
|
9862
|
-
return (0, solid_js_web.createComponent)(Select, {
|
|
9863
|
-
label: "Navigator preference scope",
|
|
9864
|
-
get value() {
|
|
9865
|
-
return props.preferences.preferenceScope();
|
|
9866
|
-
},
|
|
9867
|
-
get options() {
|
|
9868
|
-
return [{
|
|
9869
|
-
value: "global",
|
|
9870
|
-
label: "Global"
|
|
9871
|
-
}, ...props.preferences.canUseWorktreeScope() ? [{
|
|
9872
|
-
value: "worktree",
|
|
9873
|
-
label: "Worktree"
|
|
9874
|
-
}] : []];
|
|
9875
|
-
},
|
|
9876
|
-
get onChange() {
|
|
9877
|
-
return props.preferences.setPreferenceScope;
|
|
9878
|
-
}
|
|
9879
|
-
});
|
|
9880
|
-
}
|
|
9881
|
-
}),
|
|
9882
|
-
(0, solid_js_web.createComponent)(Row, {
|
|
9883
|
-
title: "Layout default",
|
|
9884
|
-
description: "Changing section visibility or order does not implicitly replace the saved default.",
|
|
9885
|
-
get children() {
|
|
9886
|
-
return (0, solid_js_web.createComponent)(Button, {
|
|
9887
|
-
get busy() {
|
|
9888
|
-
return busy();
|
|
9889
|
-
},
|
|
9890
|
-
onClick: () => void run(props.preferences.saveLayoutAsDefault, "Layout default saved for this scope."),
|
|
9891
|
-
children: "Save layout as default"
|
|
9892
|
-
});
|
|
9893
|
-
}
|
|
9894
|
-
}),
|
|
9895
|
-
(0, solid_js_web.createComponent)(Row, {
|
|
9896
|
-
title: "Reload private preferences",
|
|
9897
|
-
description: "Flush local writes, then load changes from other Navigator instances. Temporary layout overrides are cleared.",
|
|
10366
|
+
return (0, solid_js_web.createComponent)(GuiSettingsSurface, { get children() {
|
|
10367
|
+
return (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
10368
|
+
get when() {
|
|
10369
|
+
return props.preferences.ready();
|
|
10370
|
+
},
|
|
10371
|
+
get fallback() {
|
|
10372
|
+
return _tmpl$$18();
|
|
10373
|
+
},
|
|
10374
|
+
get children() {
|
|
10375
|
+
return [
|
|
10376
|
+
(0, solid_js_web.createComponent)(Section, {
|
|
10377
|
+
title: "Preference scope",
|
|
10378
|
+
get footer() {
|
|
10379
|
+
return (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
10380
|
+
get when() {
|
|
10381
|
+
return status();
|
|
10382
|
+
},
|
|
9898
10383
|
get children() {
|
|
9899
|
-
|
|
9900
|
-
|
|
9901
|
-
|
|
9902
|
-
},
|
|
9903
|
-
onClick: () => void run(props.preferences.reloadFromFile, "Private preferences reloaded."),
|
|
9904
|
-
children: "Reload preferences"
|
|
9905
|
-
});
|
|
10384
|
+
var _el$2 = _tmpl$2$15();
|
|
10385
|
+
(0, solid_js_web.insert)(_el$2, status);
|
|
10386
|
+
return _el$2;
|
|
9906
10387
|
}
|
|
9907
|
-
})
|
|
9908
|
-
|
|
9909
|
-
|
|
9910
|
-
|
|
9911
|
-
|
|
9912
|
-
|
|
9913
|
-
|
|
9914
|
-
|
|
9915
|
-
|
|
9916
|
-
|
|
9917
|
-
|
|
9918
|
-
|
|
9919
|
-
|
|
9920
|
-
|
|
9921
|
-
|
|
9922
|
-
|
|
9923
|
-
|
|
9924
|
-
|
|
9925
|
-
|
|
9926
|
-
|
|
9927
|
-
|
|
9928
|
-
|
|
9929
|
-
|
|
10388
|
+
});
|
|
10389
|
+
},
|
|
10390
|
+
get children() {
|
|
10391
|
+
return [
|
|
10392
|
+
(0, solid_js_web.createComponent)(Row, {
|
|
10393
|
+
title: "Scope",
|
|
10394
|
+
description: "Global applies everywhere. Worktree overrides use the currently selected server and location.",
|
|
10395
|
+
get children() {
|
|
10396
|
+
return (0, solid_js_web.createComponent)(Select, {
|
|
10397
|
+
label: "Navigator preference scope",
|
|
10398
|
+
get value() {
|
|
10399
|
+
return props.preferences.preferenceScope();
|
|
10400
|
+
},
|
|
10401
|
+
get options() {
|
|
10402
|
+
return [{
|
|
10403
|
+
value: "global",
|
|
10404
|
+
label: "Global"
|
|
10405
|
+
}, ...props.preferences.canUseWorktreeScope() ? [{
|
|
10406
|
+
value: "worktree",
|
|
10407
|
+
label: "Worktree"
|
|
10408
|
+
}] : []];
|
|
10409
|
+
},
|
|
10410
|
+
get onChange() {
|
|
10411
|
+
return props.preferences.setPreferenceScope;
|
|
10412
|
+
}
|
|
10413
|
+
});
|
|
10414
|
+
}
|
|
10415
|
+
}),
|
|
10416
|
+
(0, solid_js_web.createComponent)(Row, {
|
|
10417
|
+
title: "Layout default",
|
|
10418
|
+
description: "Changing section visibility or order does not implicitly replace the saved default.",
|
|
10419
|
+
get children() {
|
|
10420
|
+
return (0, solid_js_web.createComponent)(Button, {
|
|
10421
|
+
get busy() {
|
|
10422
|
+
return busy();
|
|
10423
|
+
},
|
|
10424
|
+
onClick: () => void run(props.preferences.saveLayoutAsDefault, "Layout default saved for this scope."),
|
|
10425
|
+
children: "Save layout as default"
|
|
10426
|
+
});
|
|
10427
|
+
}
|
|
10428
|
+
}),
|
|
10429
|
+
(0, solid_js_web.createComponent)(Row, {
|
|
10430
|
+
title: "Reload private preferences",
|
|
10431
|
+
description: "Flush local writes, then load changes from other Navigator instances. Temporary layout overrides are cleared.",
|
|
10432
|
+
get children() {
|
|
10433
|
+
return (0, solid_js_web.createComponent)(Button, {
|
|
10434
|
+
get busy() {
|
|
10435
|
+
return busy();
|
|
10436
|
+
},
|
|
10437
|
+
onClick: () => void run(props.preferences.reloadFromFile, "Private preferences reloaded."),
|
|
10438
|
+
children: "Reload preferences"
|
|
10439
|
+
});
|
|
10440
|
+
}
|
|
10441
|
+
})
|
|
10442
|
+
];
|
|
10443
|
+
}
|
|
10444
|
+
}),
|
|
10445
|
+
(0, solid_js_web.createComponent)(GuiSettingsSections, props),
|
|
10446
|
+
(0, solid_js_web.createComponent)(GuiSettingsBehavior, props),
|
|
10447
|
+
(0, solid_js_web.createComponent)(GuiSettingsPresets, props),
|
|
10448
|
+
(0, solid_js_web.createComponent)(GuiSettingsCatalogs, props),
|
|
10449
|
+
(0, solid_js_web.createComponent)(GuiSettingsResets, props),
|
|
10450
|
+
(0, solid_js_web.createComponent)(GuiSettingsAbout, {
|
|
10451
|
+
get ui() {
|
|
10452
|
+
return props.ui;
|
|
10453
|
+
},
|
|
10454
|
+
get about() {
|
|
10455
|
+
return props.about;
|
|
10456
|
+
},
|
|
10457
|
+
get showGuide() {
|
|
10458
|
+
return props.showGuide;
|
|
10459
|
+
}
|
|
10460
|
+
})
|
|
10461
|
+
];
|
|
10462
|
+
}
|
|
10463
|
+
});
|
|
10464
|
+
} });
|
|
9930
10465
|
}
|
|
9931
10466
|
});
|
|
9932
10467
|
}
|
|
9933
10468
|
// src/features/sidebar-settings/ui/gui/onboarding-dialog.tsx
|
|
9934
|
-
var _tmpl$$
|
|
9935
|
-
var _tmpl$2$
|
|
10469
|
+
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">`);
|
|
10470
|
+
var _tmpl$2$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
|
|
9936
10471
|
var _tmpl$3$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<dl>`);
|
|
9937
|
-
var _tmpl$4$
|
|
10472
|
+
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
10473
|
var steps = createOnboardingSteps({
|
|
9939
10474
|
nativeTodo: true,
|
|
9940
10475
|
lsp: false,
|
|
@@ -9978,7 +10513,7 @@ function GuiOnboardingDialog(props) {
|
|
|
9978
10513
|
];
|
|
9979
10514
|
},
|
|
9980
10515
|
get children() {
|
|
9981
|
-
var _el$ = _tmpl$$
|
|
10516
|
+
var _el$ = _tmpl$$17();
|
|
9982
10517
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
9983
10518
|
get when() {
|
|
9984
10519
|
return step();
|
|
@@ -9987,7 +10522,7 @@ function GuiOnboardingDialog(props) {
|
|
|
9987
10522
|
return (0, solid_js_web.createComponent)(GuiSettingsSections, props);
|
|
9988
10523
|
},
|
|
9989
10524
|
children: (value) => [(() => {
|
|
9990
|
-
var _el$2 = _tmpl$2$
|
|
10525
|
+
var _el$2 = _tmpl$2$14();
|
|
9991
10526
|
(0, solid_js_web.insert)(_el$2, () => value().summary);
|
|
9992
10527
|
return _el$2;
|
|
9993
10528
|
})(), (() => {
|
|
@@ -9997,7 +10532,7 @@ function GuiOnboardingDialog(props) {
|
|
|
9997
10532
|
return value().features;
|
|
9998
10533
|
},
|
|
9999
10534
|
children: (feature) => (() => {
|
|
10000
|
-
var _el$4 = _tmpl$4$
|
|
10535
|
+
var _el$4 = _tmpl$4$6(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$5.nextSibling;
|
|
10001
10536
|
(0, solid_js_web.insert)(_el$6, () => feature.title);
|
|
10002
10537
|
(0, solid_js_web.insert)(_el$7, () => feature.description);
|
|
10003
10538
|
return _el$4;
|
|
@@ -10011,8 +10546,8 @@ function GuiOnboardingDialog(props) {
|
|
|
10011
10546
|
});
|
|
10012
10547
|
}
|
|
10013
10548
|
// src/features/sidebar-settings/ui/gui/bug-report-dialog.tsx
|
|
10014
|
-
var _tmpl$$
|
|
10015
|
-
var _tmpl$2$
|
|
10549
|
+
var _tmpl$$16 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>`);
|
|
10550
|
+
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
10551
|
function GuiBugReportDialog(props) {
|
|
10017
10552
|
const Dialog = props.ui.Dialog;
|
|
10018
10553
|
const TextInput = props.ui.TextInput;
|
|
@@ -10063,7 +10598,7 @@ function GuiBugReportDialog(props) {
|
|
|
10063
10598
|
];
|
|
10064
10599
|
},
|
|
10065
10600
|
get children() {
|
|
10066
|
-
var _el$ = _tmpl$2$
|
|
10601
|
+
var _el$ = _tmpl$2$13(), _el$2 = _el$.firstChild;
|
|
10067
10602
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(TextInput, {
|
|
10068
10603
|
label: "Bug report title",
|
|
10069
10604
|
get value() {
|
|
@@ -10095,7 +10630,7 @@ function GuiBugReportDialog(props) {
|
|
|
10095
10630
|
return props.model.message() || props.model.result()?.message || error();
|
|
10096
10631
|
},
|
|
10097
10632
|
get children() {
|
|
10098
|
-
var _el$3 = _tmpl$$
|
|
10633
|
+
var _el$3 = _tmpl$$16();
|
|
10099
10634
|
(0, solid_js_web.insert)(_el$3, () => error() || props.model.result()?.message || props.model.message());
|
|
10100
10635
|
return _el$3;
|
|
10101
10636
|
}
|
|
@@ -10131,7 +10666,7 @@ function GuiBugReportDialog(props) {
|
|
|
10131
10666
|
});
|
|
10132
10667
|
}
|
|
10133
10668
|
// src/features/sidebar-settings/ui/gui/bug-report-confirmation.tsx
|
|
10134
|
-
var _tmpl$$
|
|
10669
|
+
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
10670
|
function GuiBugReportConfirmation(props) {
|
|
10136
10671
|
const Dialog = props.ui.Dialog;
|
|
10137
10672
|
const Button = props.ui.Button;
|
|
@@ -10169,7 +10704,7 @@ function GuiBugReportConfirmation(props) {
|
|
|
10169
10704
|
})];
|
|
10170
10705
|
},
|
|
10171
10706
|
get children() {
|
|
10172
|
-
var _el$ = _tmpl$$
|
|
10707
|
+
var _el$ = _tmpl$$15(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
|
|
10173
10708
|
(0, solid_js_web.insert)(_el$2, () => props.draft.title);
|
|
10174
10709
|
(0, solid_js_web.insert)(_el$3, () => props.draft.body);
|
|
10175
10710
|
return _el$;
|
|
@@ -10177,10 +10712,10 @@ function GuiBugReportConfirmation(props) {
|
|
|
10177
10712
|
});
|
|
10178
10713
|
}
|
|
10179
10714
|
// src/features/sidebar-settings/ui/gui/layout-preset-preview.tsx
|
|
10180
|
-
var _tmpl$$
|
|
10181
|
-
var _tmpl$2$
|
|
10715
|
+
var _tmpl$$14 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
10716
|
+
var _tmpl$2$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=max-height:52vh;overflow-y:auto>`);
|
|
10182
10717
|
var _tmpl$3$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:6px 0"><strong></strong><p>Visibility: <!> → <!> · <!> → <!> · position <!> → `);
|
|
10183
|
-
var _tmpl$4$
|
|
10718
|
+
var _tmpl$4$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>MCP scope: `);
|
|
10184
10719
|
function GuiLayoutPresetPreview(props) {
|
|
10185
10720
|
const Dialog = props.ui.Dialog;
|
|
10186
10721
|
const Button = props.ui.Button;
|
|
@@ -10233,13 +10768,13 @@ function GuiLayoutPresetPreview(props) {
|
|
|
10233
10768
|
return props.model.blocked() || !props.current() || error();
|
|
10234
10769
|
},
|
|
10235
10770
|
get children() {
|
|
10236
|
-
var _el$ = _tmpl$$
|
|
10771
|
+
var _el$ = _tmpl$$14();
|
|
10237
10772
|
(0, solid_js_web.insert)(_el$, () => error() || props.model.blocked() || "Server or session changed. Reopen the preview.");
|
|
10238
10773
|
return _el$;
|
|
10239
10774
|
}
|
|
10240
10775
|
}),
|
|
10241
10776
|
(() => {
|
|
10242
|
-
var _el$2 = _tmpl$2$
|
|
10777
|
+
var _el$2 = _tmpl$2$12();
|
|
10243
10778
|
(0, solid_js_web.insert)(_el$2, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
10244
10779
|
get each() {
|
|
10245
10780
|
return props.model.layout.preview()?.rows;
|
|
@@ -10264,7 +10799,7 @@ function GuiLayoutPresetPreview(props) {
|
|
|
10264
10799
|
return props.model.mcp;
|
|
10265
10800
|
},
|
|
10266
10801
|
children: (model) => [(() => {
|
|
10267
|
-
var _el$17 = _tmpl$4$
|
|
10802
|
+
var _el$17 = _tmpl$4$5();
|
|
10268
10803
|
_el$17.firstChild;
|
|
10269
10804
|
(0, solid_js_web.insert)(_el$17, () => model().scope, null);
|
|
10270
10805
|
return _el$17;
|
|
@@ -10277,8 +10812,8 @@ function GuiLayoutPresetPreview(props) {
|
|
|
10277
10812
|
});
|
|
10278
10813
|
}
|
|
10279
10814
|
// src/features/sidebar-settings/ui/gui/portable-dialog.tsx
|
|
10280
|
-
var _tmpl$$
|
|
10281
|
-
var _tmpl$2$
|
|
10815
|
+
var _tmpl$$13 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
10816
|
+
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
10817
|
var _tmpl$3$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Skipped unsupported field: `);
|
|
10283
10818
|
function GuiPortableSettingsDialog(props) {
|
|
10284
10819
|
const Dialog = props.ui.Dialog;
|
|
@@ -10358,7 +10893,7 @@ function GuiPortableSettingsDialog(props) {
|
|
|
10358
10893
|
return error() || !props.current();
|
|
10359
10894
|
},
|
|
10360
10895
|
get children() {
|
|
10361
|
-
var _el$ = _tmpl$$
|
|
10896
|
+
var _el$ = _tmpl$$13();
|
|
10362
10897
|
(0, solid_js_web.insert)(_el$, () => error() || "Server or session changed. Reopen the import.");
|
|
10363
10898
|
return _el$;
|
|
10364
10899
|
}
|
|
@@ -10376,7 +10911,7 @@ function GuiPortableSettingsDialog(props) {
|
|
|
10376
10911
|
});
|
|
10377
10912
|
},
|
|
10378
10913
|
children: (value) => (() => {
|
|
10379
|
-
var _el$2 = _tmpl$2$
|
|
10914
|
+
var _el$2 = _tmpl$2$11(), _el$3 = _el$2.firstChild;
|
|
10380
10915
|
_el$3.firstChild;
|
|
10381
10916
|
var _el$5 = _el$3.nextSibling, _el$1 = _el$5.firstChild.nextSibling, _el$10 = _el$1.nextSibling.nextSibling;
|
|
10382
10917
|
_el$10.nextSibling;
|
|
@@ -10404,8 +10939,8 @@ function GuiPortableSettingsDialog(props) {
|
|
|
10404
10939
|
});
|
|
10405
10940
|
}
|
|
10406
10941
|
// src/features/sidebar-settings/ui/gui/project-profile-dialog.tsx
|
|
10407
|
-
var _tmpl$$
|
|
10408
|
-
var _tmpl$2$
|
|
10942
|
+
var _tmpl$$12 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
10943
|
+
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
10944
|
function GuiProjectProfileDialog(props) {
|
|
10410
10945
|
const Dialog = props.ui.Dialog;
|
|
10411
10946
|
const Button = props.ui.Button;
|
|
@@ -10490,7 +11025,7 @@ function GuiProjectProfileDialog(props) {
|
|
|
10490
11025
|
return error() || !props.current();
|
|
10491
11026
|
},
|
|
10492
11027
|
get children() {
|
|
10493
|
-
var _el$ = _tmpl$$
|
|
11028
|
+
var _el$ = _tmpl$$12();
|
|
10494
11029
|
(0, solid_js_web.insert)(_el$, () => error() || "Scope, server or location changed. Reopen this profile.");
|
|
10495
11030
|
return _el$;
|
|
10496
11031
|
}
|
|
@@ -10514,7 +11049,7 @@ function GuiProjectProfileDialog(props) {
|
|
|
10514
11049
|
})];
|
|
10515
11050
|
},
|
|
10516
11051
|
children: (value) => (() => {
|
|
10517
|
-
var _el$2 = _tmpl$2$
|
|
11052
|
+
var _el$2 = _tmpl$2$10(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
10518
11053
|
(0, solid_js_web.insert)(_el$3, () => value().file);
|
|
10519
11054
|
(0, solid_js_web.insert)(_el$4, () => value().after);
|
|
10520
11055
|
return _el$2;
|
|
@@ -10532,7 +11067,7 @@ function createGuiBugReport(context) {
|
|
|
10532
11067
|
let token = "";
|
|
10533
11068
|
(0, solid_js.onCleanup)(() => abort.abort());
|
|
10534
11069
|
const model = createBugReportModel({
|
|
10535
|
-
navigatorVersion: "0.27.
|
|
11070
|
+
navigatorVersion: "0.27.2",
|
|
10536
11071
|
openCodeVersion: context.app.version,
|
|
10537
11072
|
platform: context.app.platform,
|
|
10538
11073
|
runtime: "OpenCode Desktop GUI"
|
|
@@ -10584,8 +11119,8 @@ function createGuiBugReport(context) {
|
|
|
10584
11119
|
}
|
|
10585
11120
|
// src/app/gui/release.ts
|
|
10586
11121
|
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"
|
|
11122
|
+
version: "0.27.2",
|
|
11123
|
+
changelog: "# Changelog\n\n## [0.27.2] - 2026-11-11\n\n- Keep Desktop Settings fields and actions inside their rows at narrow widths, with readable labels and compact group creation.\n- Reorder Desktop sections, Quick Actions, toolbar pins and button icons by dragging their handles, or use Space and arrow keys to move them with the keyboard. Escape cancels an unfinished move.\n- Show download and installation progress in place of the running version in TUI and inline in Desktop About. Show real percentages only when byte totals are available; otherwise show the active stage.\n- Bring Desktop section arrows, loading indicators and Todo rows closer to native OpenCode. Completed and cancelled tasks use muted, struck-through text with distinct status icons.\n- Remove duplicate model and reasoning-effort selectors from the Desktop sidebar. Select them below chat instead; Limits continue to follow the active model.\n\n## [0.27.1] - 2026-11-11\n\n- Drag the Desktop mini-window by its header as well as its move handle, while keeping Dock a separate action. Match its surface and controls to OpenCode's light and dark themes.\n- Use native Desktop switches and selectors for Skill trust and Todo configuration, and align multiline fields with the host theme and focus styles.\n- Show a remaining-lifetime scale and time until expiry for banked reset credits with provider-supplied dates. Keep missing expiry explicit and prevent selecting expired credits for review.\n\n## [0.27.0] - 2026-11-11\n\n- Add an experimental OpenCode Desktop interface with a native panel, narrow-screen drawer, and opt-in in-app mini-window. Move, resize, reset and redock it with the mouse or keyboard while keeping the selected session and filters.\n- Bring Search Everything, Skills, MCP groups and presets, Quick Actions, and customizable toolbar pins to Desktop. Share private favorites, trust decisions and preferences with local TUI instances without duplicating monitoring.\n- Add native Desktop settings with scoped section controls, groups, reviewed presets and project profiles, portable import/export, a seven-slide setup guide, About, browsable release history and editable GitHub Bug reports.\n- Keep superseded Desktop configuration reads from showing a false error after a newer refresh, while preserving genuine failures and retry guidance.\n- Show verified provider/account quotas in Desktop with explicit account linking and separately confirmed banked resets. Keep remote sessions isolated from local accounts and preserve unresolved reset attempts across retries.\n- Support OpenCode 1.19.5 and 2.2.6 while preserving both TUI adapters, existing settings, pinned-source updates and read-only legacy Todo archives.\n\n## [0.26.0] - 2026-11-06\n\n- Prevent background retries from accumulating cancellation listeners and preferences loading from waiting indefinitely on recovery markers.\n- Show exact active Subagent durations from OpenCode 2's native execution start time, preserving the observation fallback when timing is unavailable. Keep interrupted executions marked as cancelled in recent history.\n\n## [0.25.0] - 2026-10-31\n\n- Offer Enable Todo when OpenCode 2's native tool is disabled, with an existing server-config picker, exact change preview and separate confirmation. Preserve unrelated JSONC content and refuse stale targets; distinguish disabled Todo from an enabled empty list.\n- Update the seven-slide setup wizard for native Todo enablement, provider/account limits, multi-icon or text-only toolbar pins, About/changelog and Bug reports. Describe each host's real permissions/LSP capabilities and keep navigation visible while short-terminal content scrolls.\n\n## [0.24.0] - 2026-10-31\n\n- Support the latest stable OpenCode 1.19.5 and 2.2.5 releases, preserving both host adapters and existing sidebar behavior.\n- Preserve Limits scales and reset-credit controls across equivalent quota snapshots and unrelated workspace events, while retaining current-account and credential-change guards.\n- Keep rounded selection backgrounds consistent in nested dialogs and highlighted rows.\n- Configure each toolbar button with zero to three icons and optional custom text, including text-only buttons. Keep legacy/state choices, unsaved drafts, rounded clipping, and width-aware More/wrapping.\n- Keep Quick Action rows and their hover/focus state stable while typing in the main prompt on both supported OpenCode hosts.\n- Show toolbar hover/focus hints without moving Limits or other sections, preserving centered, uniformly sized icon controls and empty-toolbar collapse.\n- Add Settings → About with the running versions, explicit update status/checking, confirmed updates, and a versioned changelog that can be reopened independently of first-launch upgrade notes.\n- Prepare editable Bug reports with confirmed sending through authenticated GitHub CLI and an independent Open in browser action. Retain drafts through errors and cancellation, and require manual review before retrying an uncertain submission.\n\n## [0.23.0] - 2026-10-28\n\n- Support only the latest stable OpenCode 1.x and 2.x releases, currently 1.19.5 and 2.2.0, including the newer terminal renderer.\n- Keep Skills, MCP servers, and Subagents current as OpenCode 2 updates, and launch the intended Skill when multiple sources have the same name.\n- Show OpenCode Console workspace budgets and Go allowance through the public host usage API without a Navigator server plugin. Preserve workspace scope, native units, reset times, and explicit failure/retry states.\n- Preserve Navigator shortcuts and nested-dialog navigation with OpenCode 2.2's keyboard handling.\n- Verify a supported runtime before changing a pinned Navigator snapshot, preserving the installed version when no compatible verifier is available.\n\n## [0.22.0] - 2026-10-23\n\n- Pin Quick Actions and Skills to a compact sidebar toolbar independently of bookmarks. Choose icons in a searchable picker, customize supported state icons, reorder buttons, and select a More menu or wrapping rows. Preserve Skill confirmations, unavailable reasons, keyboard navigation, and Text fallback; hide the toolbar entirely when empty.\n- Use OpenCode 2's built-in Todo history for the sidebar, with native completed-write and revert semantics, existing filters/progress, and manual Refresh. Keep edits in ordinary chat, preserve previous Navigator tasks as a read-only archive, and retain the independent provider-quota server integration.\n- Support OpenCode 2.1's plugin and rendering APIs while retaining the OpenCode 1.x adapter; restore custom dialogs and rounded selections on the newer native renderer.\n- Replace the shortcut toast with an icon-led hint featuring highlighted keys, navigation/update groups, a distinct Escape action, and responsive Text/no-corner-font layouts. Keep prompt focus and share its action list with scrollable keyboard help.\n- Update Subagent status immediately from OpenCode 2's execution lifecycle and keep unresolved external credentials separate from verified provider accounts.\n- Keep OpenCode updates on the current major line and preserve pinned-source Navigator updates when a target release needs newer runtime dependencies.\n\n## [0.21.8] - 2026-10-09\n\n- Make the unfilled part of Limits scales substantially quieter, matching the theme-derived sidebar-divider tone. Keep the filled segment, reset text, and remaining values readable in both icon modes and after theme changes.\n\n## [0.21.7] - 2026-10-09\n\n- Remove the vertical guide and its reserved gutter from Limits in both icon modes. Keep full-width quota scales, reset-left/remaining-right details, and one blank row between quota windows.\n\n## [0.21.6] - 2026-10-09\n\n- Refine Limits with a continuous muted guide, full-width thin-line quota scales, and reset-left/remaining-right details. Keep long reset text from overlapping the remaining value and preserve Text fallback, resize clipping, and existing controls.\n\n## [0.21.5] - 2026-10-07\n\n- Make automatic Limits refresh configurable in scoped Behavior settings and portable configuration, with a five-minute default and one-minute minimum. Keep manual Refresh and supported model/account switches immediate.\n- Avoid extra quota polling from unrelated preference changes and unchanged provider-account metadata observations.\n\n## [0.21.4] - 2026-10-07\n\n- Add `c` to Navigator shortcuts for a manual update check and `u` to check then confirm a Navigator update. Report available, current, or unavailable results, preserve the installation method and scope, and require a restart after updating.\n- Ignore cancelled, outdated, and repeated update confirmations, and recover from stalled update checks without blocking later checks.\n\n## [0.21.3] - 2026-10-06\n\n- Replace block quota meters with full-width adaptive thin-line scales and keep quota rows inside the sidebar's padding after resize. Show only reset time below each meter, removing technical account and window-duration suffixes.\n\n## [0.21.2] - 2026-10-06\n\n- Make Limits compact with clickable provider/model and variant controls, remaining-headroom progress rows, and muted reset times. Move Refresh and Banked Resets into the section header, remove the section counter and Provider sources action, and keep reset consumption behind a separate confirmation.\n\n## [0.21.1] - 2026-10-06\n\n- Fix Codex account quota windows being hidden when the provider omits model metadata. Show ordinary usage as shared account quota, retain banked-reset counts, and keep separate model buckets explicitly associated.\n\n## [0.21.0] - 2026-10-06\n\n- Automatically verify Codex account identity from OpenCode 2's ChatGPT connection. When host identity is unavailable, confirm a private binding once per connection or provider and reuse it across models, projects, and sessions; preserve compatible older confirmations and isolate conflicting ones until relinked.\n- Expand OpenCode 2 Limits with documented native subscription allowances, API rate-limit observations, configured capacities, account balances, and key budgets. Keep provider-native units, currencies, model associations, and active-account boundaries explicit.\n- Add Provider sources to explain each provider's supported measurements, required permissions, and unavailable APIs without guessing remaining quota.\n- Keep available account balances visible when a separate subscription read fails, and show exhausted NanoGPT subscription windows instead of hiding them.\n- Keep stale quota guidance visible after failed refreshes, reject late results after credential changes, and recover from stalled provider reads without blocking model response streams.\n\n## [0.20.0] - 2026-10-05\n\n- Add a default-visible Limits section for the selected model's provider-native quota windows, reset times, account identity, and freshness. Codex CLI support requires an explicit private account binding; unsupported providers show calm guidance.\n- Review Codex banked reset credits and use them only after a separate confirmation and fresh eligibility checks. Preserve the same attempt key when reconciling an uncertain result, including after a restart.\n- Save named, commit-safe project layout and MCP profiles to `.opencode/navigator.json` with the `opencode-navigator-profile` command, an explicit preview, and `--apply`; profile application remains manual.\n\n## [0.19.3] - 2026-10-03\n\n- Indent grouped Todo, Subagent, Skill, and MCP rows and align MCP server status indicators with their group headings.\n- Place Skill, MCP, and Quick Action bookmarks before item names. Reveal unselected bookmarks on hover or keyboard focus, keep favorites visible, and keep labels steady.\n\n## [0.19.2] - 2026-10-02\n\n- Show MCP group connection states with the same radio-style indicators as individual servers, without Connect/Disconnect labels on group headings.\n\n## [0.19.1] - 2026-10-02\n\n- Remember the OpenCode 1.x auto-approve mode as a user-wide default for new sessions, including changes made through the host's permission toggle.\n\n## [0.19.0] - 2026-10-02\n\n- Connect or disconnect all eligible MCP servers in a group from its heading, including filtered-out items, with keyboard access and failed-only retry.\n- Organize Skills into user-wide groups by source location, with Favorites first and group names searchable across the full catalog.\n- Reload saved Navigator settings from disk in another running OpenCode session without restarting it.\n\n## [0.18.2] - 2026-10-02\n\n- Open the host Settings dialog from the OpenCode 2.x Permissions Quick Action, where the user can change between `prompt` and `auto accept`; keep the direct auto-approve toggle on OpenCode 1.x.\n\n## [0.18.1] - 2026-10-01\n\n- Show calm Todo setup guidance in OpenCode 2.x when Navigator's server plugin is absent, without a request error or Retry control. Actual server failures still offer Retry.\n- Keep Quick Action names readable in narrow sidebars by placing unavailable reasons below them and showing shortcuts only when they fit.\n\n## [0.18.0] - 2026-10-01\n\n- Add durable per-session Todo lists to OpenCode 2.x through a separately configured Navigator server plugin and an agent Todo tool.\n- Update Todo in the sidebar as tasks change, and offer an off-by-default per-session switch for model-context Todo instructions.\n- Keep Todo visible with setup guidance when the OpenCode 2.x server plugin is missing.\n\n## [0.17.3] - 2026-09-30\n\n## [0.17.2] - 2026-09-30\n\n- Update a pinned local Navigator installation from its version label while keeping its file or directory source unchanged.\n- Hide the session title and creation date independently with Global/Worktree settings in OpenCode 1.x.\n\n## [0.17.1] - 2026-09-29\n\n- Fix the local Navigator installation changing unexpectedly when rebuilding the repository; it now stays on its pinned version.\n\n## [0.17.0] - 2026-09-29\n\n- Add an opt-in Behavior setting to start a new session directly in chat with the sidebar from Home or New session.\n- Remember the previously installed Navigator version and show the intervening release notes once after an update.\n\n## [0.16.1] - 2026-09-25\n\n- Make the entire OpenCode or Navigator version label open its own update confirmation when an update is available. The separator and the other version remain inactive.\n- Replace the small update arrow with a more prominent filled-circle Nerd Font indicator, retaining an ASCII fallback.\n\n## [0.16.0] - 2026-09-25\n\n- Show both OpenCode and Navigator versions in the OpenCode 2.x footer.\n- Confirm updates from the footer or command palette, preserve the original installation method and scope, and report the outcome with a restart reminder.\n\nEarlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).\n\n[0.22.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.8...v0.22.0\n[0.21.8]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.7...v0.21.8\n[0.21.7]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.6...v0.21.7\n[0.21.6]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.5...v0.21.6\n[0.21.5]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.4...v0.21.5\n[0.21.4]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.3...v0.21.4\n[0.21.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.2...v0.21.3\n[0.21.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.1...v0.21.2\n[0.21.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.0...v0.21.1\n[0.21.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.20.0...v0.21.0\n[0.20.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.3...v0.20.0\n[0.19.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.2...v0.19.3\n[0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2\n[0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1\n[0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0\n[0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2\n[0.18.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.0...v0.18.1\n[0.18.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.3...v0.18.0\n[0.17.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.2...v0.17.3\n[0.17.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.1...v0.17.2\n[0.17.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.0...v0.17.1\n[0.17.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.1...v0.17.0\n[0.16.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.16.0...v0.16.1\n[0.16.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.15.0...v0.16.0\n"
|
|
10589
11124
|
};
|
|
10590
11125
|
// src/app/gui/about.ts
|
|
10591
11126
|
function createGuiAbout(context) {
|
|
@@ -10593,13 +11128,18 @@ function createGuiAbout(context) {
|
|
|
10593
11128
|
const [busy, setBusy] = (0, solid_js.createSignal)(false);
|
|
10594
11129
|
const [status, setStatus] = (0, solid_js.createSignal)("Updates have not been checked.");
|
|
10595
11130
|
const [token, setToken] = (0, solid_js.createSignal)();
|
|
11131
|
+
const progress = () => {
|
|
11132
|
+
const current = ipc.state();
|
|
11133
|
+
return current && current.phase !== "idle" ? { phase: current.phase } : void 0;
|
|
11134
|
+
};
|
|
10596
11135
|
return {
|
|
10597
11136
|
report: createGuiBugReport(context),
|
|
10598
11137
|
version: guiRelease.version,
|
|
10599
11138
|
hostVersion: context.app?.version ?? "unknown",
|
|
10600
11139
|
changelog: parseChangelog(guiRelease.changelog),
|
|
10601
11140
|
status,
|
|
10602
|
-
busy,
|
|
11141
|
+
busy: () => busy() || Boolean(progress()),
|
|
11142
|
+
progress,
|
|
10603
11143
|
available: () => Boolean(token()),
|
|
10604
11144
|
async check() {
|
|
10605
11145
|
if (busy()) return;
|
|
@@ -10640,8 +11180,8 @@ function createGuiAbout(context) {
|
|
|
10640
11180
|
};
|
|
10641
11181
|
}
|
|
10642
11182
|
// src/features/provider-limits/ui/gui/account-dialog.tsx
|
|
10643
|
-
var _tmpl$$
|
|
10644
|
-
var _tmpl$2$
|
|
11183
|
+
var _tmpl$$11 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
11184
|
+
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
11185
|
function GuiCodexAccountDialog(props) {
|
|
10646
11186
|
const Dialog = props.ui.Dialog;
|
|
10647
11187
|
const Button = props.ui.Button;
|
|
@@ -10723,7 +11263,7 @@ function GuiCodexAccountDialog(props) {
|
|
|
10723
11263
|
return preview();
|
|
10724
11264
|
},
|
|
10725
11265
|
children: (value) => (() => {
|
|
10726
|
-
var _el$2 = _tmpl$2$
|
|
11266
|
+
var _el$2 = _tmpl$2$9(), _el$4 = _el$2.firstChild.nextSibling, _el$7 = _el$4.nextSibling.nextSibling;
|
|
10727
11267
|
(0, solid_js_web.insert)(_el$4, () => value().accountID);
|
|
10728
11268
|
(0, solid_js_web.insert)(_el$7, () => value().model.providerID);
|
|
10729
11269
|
return _el$2;
|
|
@@ -10733,7 +11273,7 @@ function GuiCodexAccountDialog(props) {
|
|
|
10733
11273
|
return error();
|
|
10734
11274
|
},
|
|
10735
11275
|
get children() {
|
|
10736
|
-
var _el$ = _tmpl$$
|
|
11276
|
+
var _el$ = _tmpl$$11();
|
|
10737
11277
|
(0, solid_js_web.insert)(_el$, error);
|
|
10738
11278
|
return _el$;
|
|
10739
11279
|
}
|
|
@@ -10741,16 +11281,72 @@ function GuiCodexAccountDialog(props) {
|
|
|
10741
11281
|
}
|
|
10742
11282
|
});
|
|
10743
11283
|
}
|
|
11284
|
+
// src/features/provider-limits/ui/gui/reset-credit-expiry.tsx
|
|
11285
|
+
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>`);
|
|
11286
|
+
var _tmpl$2$8 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="display:grid;gap:6px;margin:8px 0"><span>`);
|
|
11287
|
+
var _tmpl$3$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<time style=color:var(--v2-text-text-muted)>`);
|
|
11288
|
+
function GuiResetCreditExpiry(props) {
|
|
11289
|
+
const lifetime = () => resetCreditLifetime(props.credit, props.now);
|
|
11290
|
+
const expiry = () => {
|
|
11291
|
+
const timestamp = props.credit.expiresAt;
|
|
11292
|
+
if (timestamp === void 0 || timestamp <= 0) return;
|
|
11293
|
+
const date = /* @__PURE__ */ new Date(timestamp * 1e3);
|
|
11294
|
+
return Number.isFinite(date.getTime()) ? date : void 0;
|
|
11295
|
+
};
|
|
11296
|
+
return (() => {
|
|
11297
|
+
var _el$ = _tmpl$2$8(), _el$4 = _el$.firstChild;
|
|
11298
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
11299
|
+
get when() {
|
|
11300
|
+
return lifetime().remaining !== void 0;
|
|
11301
|
+
},
|
|
11302
|
+
get children() {
|
|
11303
|
+
var _el$2 = _tmpl$$10(), _el$3 = _el$2.firstChild;
|
|
11304
|
+
(0, solid_js_web.effect)((_p$) => {
|
|
11305
|
+
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})`;
|
|
11306
|
+
_v$ !== _p$.e && (0, solid_js_web.setAttribute)(_el$2, "aria-label", _p$.e = _v$);
|
|
11307
|
+
_v$2 !== _p$.t && (0, solid_js_web.setAttribute)(_el$2, "aria-valuenow", _p$.t = _v$2);
|
|
11308
|
+
_v$3 !== _p$.a && (0, solid_js_web.setAttribute)(_el$2, "aria-valuetext", _p$.a = _v$3);
|
|
11309
|
+
_v$4 !== _p$.o && (0, solid_js_web.setStyleProperty)(_el$3, "transform", _p$.o = _v$4);
|
|
11310
|
+
return _p$;
|
|
11311
|
+
}, {
|
|
11312
|
+
e: void 0,
|
|
11313
|
+
t: void 0,
|
|
11314
|
+
a: void 0,
|
|
11315
|
+
o: void 0
|
|
11316
|
+
});
|
|
11317
|
+
return _el$2;
|
|
11318
|
+
}
|
|
11319
|
+
}), _el$4);
|
|
11320
|
+
(0, solid_js_web.insert)(_el$4, () => lifetime().label);
|
|
11321
|
+
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
11322
|
+
get when() {
|
|
11323
|
+
return expiry();
|
|
11324
|
+
},
|
|
11325
|
+
children: (date) => (() => {
|
|
11326
|
+
var _el$5 = _tmpl$3$5();
|
|
11327
|
+
(0, solid_js_web.insert)(_el$5, () => date().toLocaleString());
|
|
11328
|
+
(0, solid_js_web.effect)(() => (0, solid_js_web.setAttribute)(_el$5, "datetime", date().toISOString()));
|
|
11329
|
+
return _el$5;
|
|
11330
|
+
})()
|
|
11331
|
+
}), null);
|
|
11332
|
+
return _el$;
|
|
11333
|
+
})();
|
|
11334
|
+
}
|
|
10744
11335
|
// src/features/provider-limits/ui/gui/reset-dialog.tsx
|
|
10745
11336
|
var _tmpl$$9 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
10746
11337
|
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$
|
|
11338
|
+
var _tmpl$3$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul style=padding:0;list-style:none>`);
|
|
11339
|
+
var _tmpl$4$4 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>Some credit details were not supplied by the provider.`);
|
|
10749
11340
|
var _tmpl$5$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=status>Verifying the selected account and reset attempt…`);
|
|
10750
11341
|
var _tmpl$6$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="padding:8px 0"><strong></strong><p style=opacity:0.65>`);
|
|
10751
11342
|
function GuiResetCreditDialog(props) {
|
|
10752
11343
|
const Dialog = props.ui.Dialog;
|
|
10753
11344
|
const Button = props.ui.Button;
|
|
11345
|
+
const [now, setNow] = (0, solid_js.createSignal)(Date.now());
|
|
11346
|
+
(0, solid_js.onMount)(() => {
|
|
11347
|
+
const timer = setInterval(() => setNow(Date.now()), 1e3);
|
|
11348
|
+
(0, solid_js.onCleanup)(() => clearInterval(timer));
|
|
11349
|
+
});
|
|
10754
11350
|
(0, solid_js.createEffect)(() => {
|
|
10755
11351
|
if (!props.current() && !props.busy) props.close();
|
|
10756
11352
|
});
|
|
@@ -10799,7 +11395,7 @@ function GuiResetCreditDialog(props) {
|
|
|
10799
11395
|
}
|
|
10800
11396
|
}),
|
|
10801
11397
|
(() => {
|
|
10802
|
-
var _el$3 = _tmpl$3$
|
|
11398
|
+
var _el$3 = _tmpl$3$4();
|
|
10803
11399
|
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
10804
11400
|
get each() {
|
|
10805
11401
|
return props.credits?.credits;
|
|
@@ -10812,14 +11408,16 @@ function GuiResetCreditDialog(props) {
|
|
|
10812
11408
|
var _c$ = (0, solid_js_web.memo)(() => !!credit.description);
|
|
10813
11409
|
return () => _c$() ? ` · ${credit.description}` : "";
|
|
10814
11410
|
})(), null);
|
|
10815
|
-
(0, solid_js_web.insert)(_el$
|
|
10816
|
-
|
|
10817
|
-
|
|
10818
|
-
|
|
11411
|
+
(0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(GuiResetCreditExpiry, {
|
|
11412
|
+
credit,
|
|
11413
|
+
get now() {
|
|
11414
|
+
return now();
|
|
11415
|
+
}
|
|
11416
|
+
}), null);
|
|
10819
11417
|
(0, solid_js_web.insert)(_el$6, (0, solid_js_web.createComponent)(Button, {
|
|
10820
11418
|
size: "small",
|
|
10821
11419
|
get disabled() {
|
|
10822
|
-
return props.busy || Boolean(props.reason || props.pending) || credit.status !== "available" || credit.type !== "codexRateLimits";
|
|
11420
|
+
return props.busy || Boolean(props.reason || props.pending) || credit.status !== "available" || resetCreditLifetime(credit, now()).expired || credit.type !== "codexRateLimits";
|
|
10823
11421
|
},
|
|
10824
11422
|
onClick: () => props.review(credit.id),
|
|
10825
11423
|
children: "Review credit"
|
|
@@ -10834,7 +11432,7 @@ function GuiResetCreditDialog(props) {
|
|
|
10834
11432
|
return (props.credits?.availableCount ?? 0) > (props.credits?.credits?.length ?? 0);
|
|
10835
11433
|
},
|
|
10836
11434
|
get children() {
|
|
10837
|
-
return [_tmpl$4$
|
|
11435
|
+
return [_tmpl$4$4(), (0, solid_js_web.createComponent)(Button, {
|
|
10838
11436
|
get disabled() {
|
|
10839
11437
|
return props.busy || Boolean(props.reason || props.pending);
|
|
10840
11438
|
},
|
|
@@ -13933,10 +14531,11 @@ function createGuiPresetDialogs(context, preferences, registry, mcp) {
|
|
|
13933
14531
|
};
|
|
13934
14532
|
}
|
|
13935
14533
|
// src/features/search-everything/ui/gui/result-row.tsx
|
|
13936
|
-
var _tmpl$$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status>Working…`);
|
|
14534
|
+
var _tmpl$$7 = /*#__PURE__*/ (0, solid_js_web.template)(`<span role=status style=display:inline-flex;gap:6px;align-items:center>Working…`);
|
|
13937
14535
|
var _tmpl$2$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="display:flex;gap:4px;align-items:center;min-width:0;padding:3px 0"><button type=button style=flex:1;min-width:0;text-align:left;padding:8px;color:inherit;border:0;border-radius:6px><strong style=display:block;overflow-wrap:anywhere></strong><span style=display:block;opacity:0.65;font-size:12px;overflow-wrap:anywhere>`);
|
|
13938
14536
|
function GuiSearchResultRow(props) {
|
|
13939
14537
|
const Button = props.ui.Button;
|
|
14538
|
+
const Loader = props.ui.Loader;
|
|
13940
14539
|
return (() => {
|
|
13941
14540
|
var _el$ = _tmpl$2$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
13942
14541
|
_el$2.$$click = (event) => {
|
|
@@ -13951,7 +14550,9 @@ function GuiSearchResultRow(props) {
|
|
|
13951
14550
|
return props.busy;
|
|
13952
14551
|
},
|
|
13953
14552
|
get children() {
|
|
13954
|
-
|
|
14553
|
+
var _el$5 = _tmpl$$7(), _el$6 = _el$5.firstChild;
|
|
14554
|
+
(0, solid_js_web.insert)(_el$5, (0, solid_js_web.createComponent)(Loader, { size: "small" }), _el$6);
|
|
14555
|
+
return _el$5;
|
|
13955
14556
|
}
|
|
13956
14557
|
}), null);
|
|
13957
14558
|
(0, solid_js_web.insert)(_el$, (0, solid_js_web.createComponent)(solid_js.Show, {
|
|
@@ -14006,8 +14607,8 @@ function GuiSearchResultRow(props) {
|
|
|
14006
14607
|
// src/features/search-everything/ui/gui/search-dialog.tsx
|
|
14007
14608
|
var _tmpl$$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<div style="margin:8px 0">`);
|
|
14008
14609
|
var _tmpl$2$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
14009
|
-
var _tmpl$3$
|
|
14010
|
-
var _tmpl$4$
|
|
14610
|
+
var _tmpl$3$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<div role=alert>`);
|
|
14611
|
+
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
14612
|
var _tmpl$5$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
|
|
14012
14613
|
var _tmpl$6 = /*#__PURE__*/ (0, solid_js_web.template)(`<li>No matching results.`);
|
|
14013
14614
|
function GuiSearchDialog(props) {
|
|
@@ -14108,7 +14709,7 @@ function GuiSearchDialog(props) {
|
|
|
14108
14709
|
return props.errors.length > 0;
|
|
14109
14710
|
},
|
|
14110
14711
|
get children() {
|
|
14111
|
-
var _el$3 = _tmpl$3$
|
|
14712
|
+
var _el$3 = _tmpl$3$3();
|
|
14112
14713
|
(0, solid_js_web.insert)(_el$3, (0, solid_js_web.createComponent)(solid_js.For, {
|
|
14113
14714
|
get each() {
|
|
14114
14715
|
return props.errors;
|
|
@@ -14130,7 +14731,7 @@ function GuiSearchDialog(props) {
|
|
|
14130
14731
|
}
|
|
14131
14732
|
}),
|
|
14132
14733
|
(() => {
|
|
14133
|
-
var _el$4 = _tmpl$4$
|
|
14734
|
+
var _el$4 = _tmpl$4$3();
|
|
14134
14735
|
_el$4.addEventListener("scroll", (event) => props.onScroll(event.currentTarget.scrollTop));
|
|
14135
14736
|
(0, solid_js_web.use)((node) => {
|
|
14136
14737
|
body = node;
|
|
@@ -14485,8 +15086,8 @@ function createGuiSettingsActions(context, preferences, registry) {
|
|
|
14485
15086
|
// src/entities/skill/ui/gui/skill-dialog.tsx
|
|
14486
15087
|
var _tmpl$$3 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Description</h3><p>`);
|
|
14487
15088
|
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$
|
|
15089
|
+
var _tmpl$3$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
15090
|
+
var _tmpl$4$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<section><h3>Confirmation`);
|
|
14490
15091
|
function GuiSkillDialog(props) {
|
|
14491
15092
|
const Dialog = props.ui.Dialog;
|
|
14492
15093
|
const Button = props.ui.Button;
|
|
@@ -14550,8 +15151,18 @@ function GuiSkillDialog(props) {
|
|
|
14550
15151
|
return _el$4;
|
|
14551
15152
|
})(),
|
|
14552
15153
|
(() => {
|
|
14553
|
-
var _el$0 = _tmpl$4$
|
|
14554
|
-
_el$
|
|
15154
|
+
var _el$0 = _tmpl$4$2();
|
|
15155
|
+
_el$0.firstChild;
|
|
15156
|
+
(0, solid_js_web.insert)(_el$0, (0, solid_js_web.createComponent)(props.ui.Switch, {
|
|
15157
|
+
label: "Trust this exact source for future use",
|
|
15158
|
+
get checked() {
|
|
15159
|
+
return trust();
|
|
15160
|
+
},
|
|
15161
|
+
get disabled() {
|
|
15162
|
+
return !props.ready || !props.skill.location;
|
|
15163
|
+
},
|
|
15164
|
+
onChange: setTrust
|
|
15165
|
+
}), null);
|
|
14555
15166
|
(0, solid_js_web.insert)(_el$0, (0, solid_js_web.createComponent)(Button, {
|
|
14556
15167
|
size: "small",
|
|
14557
15168
|
variant: "ghost",
|
|
@@ -14570,13 +15181,11 @@ function GuiSkillDialog(props) {
|
|
|
14570
15181
|
return props.reason || error();
|
|
14571
15182
|
},
|
|
14572
15183
|
get children() {
|
|
14573
|
-
var _el$
|
|
14574
|
-
(0, solid_js_web.insert)(_el$
|
|
14575
|
-
return _el$
|
|
15184
|
+
var _el$10 = _tmpl$3$2();
|
|
15185
|
+
(0, solid_js_web.insert)(_el$10, () => props.reason || error());
|
|
15186
|
+
return _el$10;
|
|
14576
15187
|
}
|
|
14577
15188
|
}), 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
15189
|
return _el$0;
|
|
14581
15190
|
})()
|
|
14582
15191
|
];
|
|
@@ -14646,8 +15255,8 @@ function createGuiSkillDialogs(context, runtime, preferences) {
|
|
|
14646
15255
|
// src/entities/todo/ui/gui/archive-dialog.tsx
|
|
14647
15256
|
var _tmpl$$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
14648
15257
|
var _tmpl$2$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<ul>`);
|
|
14649
|
-
var _tmpl$3$
|
|
14650
|
-
var _tmpl$4$
|
|
15258
|
+
var _tmpl$3$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p>`);
|
|
15259
|
+
var _tmpl$4$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<li style="overflow-wrap:anywhere;padding:4px 0"><small style=opacity:0.6> — `);
|
|
14651
15260
|
function TodoArchiveDialog(props) {
|
|
14652
15261
|
const [items, setItems] = (0, solid_js.createSignal)([]);
|
|
14653
15262
|
const [busy, setBusy] = (0, solid_js.createSignal)(false);
|
|
@@ -14703,7 +15312,7 @@ function TodoArchiveDialog(props) {
|
|
|
14703
15312
|
},
|
|
14704
15313
|
get fallback() {
|
|
14705
15314
|
return (() => {
|
|
14706
|
-
var _el$3 = _tmpl$3$
|
|
15315
|
+
var _el$3 = _tmpl$3$1();
|
|
14707
15316
|
(0, solid_js_web.insert)(_el$3, () => busy() ? "Reading archive…" : "No archived Navigator tasks.");
|
|
14708
15317
|
return _el$3;
|
|
14709
15318
|
})();
|
|
@@ -14715,7 +15324,7 @@ function TodoArchiveDialog(props) {
|
|
|
14715
15324
|
return items();
|
|
14716
15325
|
},
|
|
14717
15326
|
children: (item) => (() => {
|
|
14718
|
-
var _el$4 = _tmpl$4$
|
|
15327
|
+
var _el$4 = _tmpl$4$1(), _el$5 = _el$4.firstChild;
|
|
14719
15328
|
_el$5.firstChild;
|
|
14720
15329
|
(0, solid_js_web.insert)(_el$4, () => item.content, _el$5);
|
|
14721
15330
|
(0, solid_js_web.insert)(_el$5, () => item.status, null);
|
|
@@ -14836,8 +15445,8 @@ var LegacyTodoArchiveRpc = {
|
|
|
14836
15445
|
// src/features/native-todo-setup/ui/gui/confirmation.tsx
|
|
14837
15446
|
var _tmpl$$1 = /*#__PURE__*/ (0, solid_js_web.template)(`<p style=overflow-wrap:anywhere>`);
|
|
14838
15447
|
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
|
|
15448
|
+
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>`);
|
|
15449
|
+
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
15450
|
var _tmpl$5 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
14842
15451
|
function TodoEnableConfirmation(props) {
|
|
14843
15452
|
const [busy, setBusy] = (0, solid_js.createSignal)(false);
|
|
@@ -14896,12 +15505,12 @@ function TodoEnableConfirmation(props) {
|
|
|
14896
15505
|
})(),
|
|
14897
15506
|
_tmpl$2$1(),
|
|
14898
15507
|
(() => {
|
|
14899
|
-
var _el$3 = _tmpl$3
|
|
15508
|
+
var _el$3 = _tmpl$3(), _el$6 = _el$3.firstChild.nextSibling.nextSibling, _el$8 = _el$6.nextSibling.nextSibling;
|
|
14900
15509
|
(0, solid_js_web.insert)(_el$6, () => props.preview.original);
|
|
14901
15510
|
(0, solid_js_web.insert)(_el$8, () => props.preview.updated);
|
|
14902
15511
|
return _el$3;
|
|
14903
15512
|
})(),
|
|
14904
|
-
_tmpl$4
|
|
15513
|
+
_tmpl$4(),
|
|
14905
15514
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
14906
15515
|
get when() {
|
|
14907
15516
|
return error();
|
|
@@ -14917,10 +15526,8 @@ function TodoEnableConfirmation(props) {
|
|
|
14917
15526
|
});
|
|
14918
15527
|
}
|
|
14919
15528
|
// 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>`);
|
|
15529
|
+
var _tmpl$ = /*#__PURE__*/ (0, solid_js_web.template)(`<p>No editable configuration source is currently available.`);
|
|
15530
|
+
var _tmpl$2 = /*#__PURE__*/ (0, solid_js_web.template)(`<p role=alert>`);
|
|
14924
15531
|
function TodoSetupDialog(props) {
|
|
14925
15532
|
const [path, setPath] = (0, solid_js.createSignal)("");
|
|
14926
15533
|
const [busy, setBusy] = (0, solid_js.createSignal)(false);
|
|
@@ -14991,29 +15598,26 @@ function TodoSetupDialog(props) {
|
|
|
14991
15598
|
},
|
|
14992
15599
|
get children() {
|
|
14993
15600
|
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
|
-
})(),
|
|
15601
|
+
(0, solid_js_web.createComponent)(props.ui.Select, {
|
|
15602
|
+
label: "Todo configuration file",
|
|
15603
|
+
get value() {
|
|
15604
|
+
return selected();
|
|
15605
|
+
},
|
|
15606
|
+
get options() {
|
|
15607
|
+
return files().map((file) => ({
|
|
15608
|
+
value: file,
|
|
15609
|
+
label: file
|
|
15610
|
+
}));
|
|
15611
|
+
},
|
|
15612
|
+
onChange: setPath,
|
|
15613
|
+
placeholder: "Choose a configuration file"
|
|
15614
|
+
}),
|
|
15011
15615
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
15012
15616
|
get when() {
|
|
15013
15617
|
return files().length === 0;
|
|
15014
15618
|
},
|
|
15015
15619
|
get children() {
|
|
15016
|
-
return _tmpl$
|
|
15620
|
+
return _tmpl$();
|
|
15017
15621
|
}
|
|
15018
15622
|
}),
|
|
15019
15623
|
(0, solid_js_web.createComponent)(solid_js.Show, {
|
|
@@ -15021,9 +15625,9 @@ function TodoSetupDialog(props) {
|
|
|
15021
15625
|
return error();
|
|
15022
15626
|
},
|
|
15023
15627
|
get children() {
|
|
15024
|
-
var _el$
|
|
15025
|
-
(0, solid_js_web.insert)(_el$
|
|
15026
|
-
return _el$
|
|
15628
|
+
var _el$2 = _tmpl$2();
|
|
15629
|
+
(0, solid_js_web.insert)(_el$2, error);
|
|
15630
|
+
return _el$2;
|
|
15027
15631
|
}
|
|
15028
15632
|
}),
|
|
15029
15633
|
(0, solid_js_web.createComponent)(Button, {
|
|
@@ -15154,12 +15758,12 @@ function createGuiToolbarDialogs(context, registry, preferences) {
|
|
|
15154
15758
|
if (!current()) throw new DOMException("Toolbar target changed", "AbortError");
|
|
15155
15759
|
await save(update);
|
|
15156
15760
|
}
|
|
15157
|
-
async function move(key,
|
|
15761
|
+
async function move(key, target) {
|
|
15158
15762
|
const pins = preferences.toolbarPins();
|
|
15159
15763
|
const index = pins.findIndex((pin) => toolbarPinKey(pin) === key);
|
|
15160
|
-
const destination =
|
|
15161
|
-
if (index === -1 || destination
|
|
15162
|
-
const before = pins[destination + (
|
|
15764
|
+
const destination = pins.findIndex((pin) => toolbarPinKey(pin) === target);
|
|
15765
|
+
if (index === -1 || destination === -1 || destination >= pins.length) return;
|
|
15766
|
+
const before = pins[destination + (destination > index ? 1 : 0)];
|
|
15163
15767
|
await change({
|
|
15164
15768
|
operation: "move",
|
|
15165
15769
|
key,
|
|
@@ -15500,7 +16104,7 @@ var setup = (context) => {
|
|
|
15500
16104
|
try {
|
|
15501
16105
|
await preferences.flush();
|
|
15502
16106
|
context.toast.show({
|
|
15503
|
-
title: `Navigator 0.27.
|
|
16107
|
+
title: `Navigator 0.27.2`,
|
|
15504
16108
|
variant: "default"
|
|
15505
16109
|
});
|
|
15506
16110
|
} catch {
|