@quanta-intellect/vessel-browser 0.1.18 → 0.1.20
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/README.md +17 -0
- package/out/main/index.js +1112 -427
- package/out/preload/index.js +14 -1
- package/out/renderer/assets/{index-DAaJOss-.js → index-CKOT_IZt.js} +947 -209
- package/out/renderer/assets/{index-DMd-y6tm.css → index-DwRZftNk.css} +110 -0
- package/out/renderer/index.html +2 -2
- package/package.json +1 -1
|
@@ -13,6 +13,7 @@ const UNOWNED = {
|
|
|
13
13
|
context: null,
|
|
14
14
|
owner: null
|
|
15
15
|
};
|
|
16
|
+
const NO_INIT = {};
|
|
16
17
|
var Owner = null;
|
|
17
18
|
let Transition = null;
|
|
18
19
|
let ExternalSourceConfig = null;
|
|
@@ -52,6 +53,10 @@ function createSignal(value, options) {
|
|
|
52
53
|
};
|
|
53
54
|
return [readSignal.bind(s), setter];
|
|
54
55
|
}
|
|
56
|
+
function createComputed(fn, value, options) {
|
|
57
|
+
const c = createComputation(fn, value, true, STALE);
|
|
58
|
+
updateComputation(c);
|
|
59
|
+
}
|
|
55
60
|
function createRenderEffect(fn, value, options) {
|
|
56
61
|
const c = createComputation(fn, value, false, STALE);
|
|
57
62
|
updateComputation(c);
|
|
@@ -71,6 +76,123 @@ function createMemo(fn, value, options) {
|
|
|
71
76
|
updateComputation(c);
|
|
72
77
|
return readSignal.bind(c);
|
|
73
78
|
}
|
|
79
|
+
function isPromise(v) {
|
|
80
|
+
return v && typeof v === "object" && "then" in v;
|
|
81
|
+
}
|
|
82
|
+
function createResource(pSource, pFetcher, pOptions) {
|
|
83
|
+
let source;
|
|
84
|
+
let fetcher;
|
|
85
|
+
let options;
|
|
86
|
+
if (typeof pFetcher === "function") {
|
|
87
|
+
source = pSource;
|
|
88
|
+
fetcher = pFetcher;
|
|
89
|
+
options = {};
|
|
90
|
+
} else {
|
|
91
|
+
source = true;
|
|
92
|
+
fetcher = pSource;
|
|
93
|
+
options = pFetcher || {};
|
|
94
|
+
}
|
|
95
|
+
let pr = null, initP = NO_INIT, scheduled = false, resolved = "initialValue" in options, dynamic = typeof source === "function" && createMemo(source);
|
|
96
|
+
const contexts = /* @__PURE__ */ new Set(), [value, setValue] = (options.storage || createSignal)(options.initialValue), [error, setError] = createSignal(void 0), [track, trigger] = createSignal(void 0, {
|
|
97
|
+
equals: false
|
|
98
|
+
}), [state, setState] = createSignal(resolved ? "ready" : "unresolved");
|
|
99
|
+
function loadEnd(p, v, error2, key) {
|
|
100
|
+
if (pr === p) {
|
|
101
|
+
pr = null;
|
|
102
|
+
key !== void 0 && (resolved = true);
|
|
103
|
+
if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {
|
|
104
|
+
value: v
|
|
105
|
+
}));
|
|
106
|
+
initP = NO_INIT;
|
|
107
|
+
completeLoad(v, error2);
|
|
108
|
+
}
|
|
109
|
+
return v;
|
|
110
|
+
}
|
|
111
|
+
function completeLoad(v, err) {
|
|
112
|
+
runUpdates(() => {
|
|
113
|
+
if (err === void 0) setValue(() => v);
|
|
114
|
+
setState(err !== void 0 ? "errored" : resolved ? "ready" : "unresolved");
|
|
115
|
+
setError(err);
|
|
116
|
+
for (const c of contexts.keys()) c.decrement();
|
|
117
|
+
contexts.clear();
|
|
118
|
+
}, false);
|
|
119
|
+
}
|
|
120
|
+
function read() {
|
|
121
|
+
const c = SuspenseContext, v = value(), err = error();
|
|
122
|
+
if (err !== void 0 && !pr) throw err;
|
|
123
|
+
if (Listener && !Listener.user && c) ;
|
|
124
|
+
return v;
|
|
125
|
+
}
|
|
126
|
+
function load(refetching = true) {
|
|
127
|
+
if (refetching !== false && scheduled) return;
|
|
128
|
+
scheduled = false;
|
|
129
|
+
const lookup = dynamic ? dynamic() : source;
|
|
130
|
+
if (lookup == null || lookup === false) {
|
|
131
|
+
loadEnd(pr, untrack(value));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let error2;
|
|
135
|
+
const p = initP !== NO_INIT ? initP : untrack(() => {
|
|
136
|
+
try {
|
|
137
|
+
return fetcher(lookup, {
|
|
138
|
+
value: value(),
|
|
139
|
+
refetching
|
|
140
|
+
});
|
|
141
|
+
} catch (fetcherError) {
|
|
142
|
+
error2 = fetcherError;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
if (error2 !== void 0) {
|
|
146
|
+
loadEnd(pr, void 0, castError(error2), lookup);
|
|
147
|
+
return;
|
|
148
|
+
} else if (!isPromise(p)) {
|
|
149
|
+
loadEnd(pr, p, void 0, lookup);
|
|
150
|
+
return p;
|
|
151
|
+
}
|
|
152
|
+
pr = p;
|
|
153
|
+
if ("v" in p) {
|
|
154
|
+
if (p.s === 1) loadEnd(pr, p.v, void 0, lookup);
|
|
155
|
+
else loadEnd(pr, void 0, castError(p.v), lookup);
|
|
156
|
+
return p;
|
|
157
|
+
}
|
|
158
|
+
scheduled = true;
|
|
159
|
+
queueMicrotask(() => scheduled = false);
|
|
160
|
+
runUpdates(() => {
|
|
161
|
+
setState(resolved ? "refreshing" : "pending");
|
|
162
|
+
trigger();
|
|
163
|
+
}, false);
|
|
164
|
+
return p.then((v) => loadEnd(p, v, void 0, lookup), (e) => loadEnd(p, void 0, castError(e), lookup));
|
|
165
|
+
}
|
|
166
|
+
Object.defineProperties(read, {
|
|
167
|
+
state: {
|
|
168
|
+
get: () => state()
|
|
169
|
+
},
|
|
170
|
+
error: {
|
|
171
|
+
get: () => error()
|
|
172
|
+
},
|
|
173
|
+
loading: {
|
|
174
|
+
get() {
|
|
175
|
+
const s = state();
|
|
176
|
+
return s === "pending" || s === "refreshing";
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
latest: {
|
|
180
|
+
get() {
|
|
181
|
+
if (!resolved) return read();
|
|
182
|
+
const err = error();
|
|
183
|
+
if (err && !pr) throw err;
|
|
184
|
+
return value();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
let owner = Owner;
|
|
189
|
+
if (dynamic) createComputed(() => (owner = Owner, load(false)));
|
|
190
|
+
else load(false);
|
|
191
|
+
return [read, {
|
|
192
|
+
refetch: (info) => runWithOwner(owner, () => load(info)),
|
|
193
|
+
mutate: setValue
|
|
194
|
+
}];
|
|
195
|
+
}
|
|
74
196
|
function untrack(fn) {
|
|
75
197
|
if (Listener === null) return fn();
|
|
76
198
|
const listener = Listener;
|
|
@@ -91,6 +213,22 @@ function onCleanup(fn) {
|
|
|
91
213
|
else Owner.cleanups.push(fn);
|
|
92
214
|
return fn;
|
|
93
215
|
}
|
|
216
|
+
function runWithOwner(o, fn) {
|
|
217
|
+
const prev = Owner;
|
|
218
|
+
const prevListener = Listener;
|
|
219
|
+
Owner = o;
|
|
220
|
+
Listener = null;
|
|
221
|
+
try {
|
|
222
|
+
return runUpdates(fn, true);
|
|
223
|
+
} catch (err) {
|
|
224
|
+
handleError(err);
|
|
225
|
+
} finally {
|
|
226
|
+
Owner = prev;
|
|
227
|
+
Listener = prevListener;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const [transPending, setTransPending] = /* @__PURE__ */ createSignal(false);
|
|
231
|
+
let SuspenseContext;
|
|
94
232
|
function readSignal() {
|
|
95
233
|
if (this.sources && this.state) {
|
|
96
234
|
if (this.state === STALE) updateComputation(this);
|
|
@@ -703,13 +841,54 @@ function cleanChildren(parent, current, marker, replacement) {
|
|
|
703
841
|
} else parent.insertBefore(node, marker);
|
|
704
842
|
return [node];
|
|
705
843
|
}
|
|
706
|
-
var _tmpl$$
|
|
844
|
+
var _tmpl$$c = /* @__PURE__ */ template(`<div class=title-bar><div class=title-bar-drag></div><div class=mcp-status-area><button class=mcp-status-indicator><span class=mcp-dot></span><span class=mcp-label>MCP</span></button></div><div class=window-controls><button class=window-btn data-tooltip=Minimize><svg width=10 height=10 viewBox="0 0 10 10"><rect x=1 y=5 width=8 height=1 fill=currentColor></rect></svg></button><button class=window-btn data-tooltip=Maximize><svg width=10 height=10 viewBox="0 0 10 10"><rect x=1 y=1 width=8 height=8 fill=none stroke=currentColor stroke-width=1></rect></svg></button><button class="window-btn window-btn-close"data-tooltip=Close><svg width=10 height=10 viewBox="0 0 10 10"><line x1=1 y1=1 x2=9 y2=9 stroke=currentColor stroke-width=1.2></line><line x1=9 y1=1 x2=1 y2=9 stroke=currentColor stroke-width=1.2>`);
|
|
707
845
|
const TitleBar = () => {
|
|
846
|
+
const [mcpStatus, setMcpStatus] = createSignal("starting");
|
|
847
|
+
const [mcpTooltip, setMcpTooltip] = createSignal("MCP: starting...");
|
|
848
|
+
const pollHealth = async () => {
|
|
849
|
+
try {
|
|
850
|
+
const health = await window.vessel.settings.getHealth();
|
|
851
|
+
setMcpStatus(health.mcp.status);
|
|
852
|
+
if (health.mcp.status === "ready") {
|
|
853
|
+
setMcpTooltip(`MCP ready — ${health.mcp.endpoint}`);
|
|
854
|
+
} else if (health.mcp.status === "error") {
|
|
855
|
+
setMcpTooltip(`MCP error: ${health.mcp.message}`);
|
|
856
|
+
} else {
|
|
857
|
+
setMcpTooltip(`MCP: ${health.mcp.status}`);
|
|
858
|
+
}
|
|
859
|
+
} catch {
|
|
860
|
+
setMcpStatus("error");
|
|
861
|
+
setMcpTooltip("MCP: status unavailable");
|
|
862
|
+
}
|
|
863
|
+
};
|
|
864
|
+
let healthInterval;
|
|
865
|
+
onMount(() => {
|
|
866
|
+
void pollHealth();
|
|
867
|
+
healthInterval = setInterval(() => void pollHealth(), 1e4);
|
|
868
|
+
});
|
|
869
|
+
onCleanup(() => clearInterval(healthInterval));
|
|
870
|
+
const handleMcpClick = () => {
|
|
871
|
+
window.vessel.ui.setSettingsVisibility(true);
|
|
872
|
+
};
|
|
708
873
|
return (() => {
|
|
709
|
-
var _el$ = _tmpl$$
|
|
710
|
-
_el$4.$$click =
|
|
711
|
-
_el$
|
|
712
|
-
_el$
|
|
874
|
+
var _el$ = _tmpl$$c(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling;
|
|
875
|
+
_el$4.$$click = handleMcpClick;
|
|
876
|
+
_el$6.$$click = () => window.vessel.window.minimize();
|
|
877
|
+
_el$7.$$click = () => window.vessel.window.maximize();
|
|
878
|
+
_el$8.$$click = () => window.vessel.window.close();
|
|
879
|
+
createRenderEffect((_p$) => {
|
|
880
|
+
var _v$ = !!(mcpStatus() === "ready"), _v$2 = !!(mcpStatus() === "error"), _v$3 = !!(mcpStatus() === "starting" || mcpStatus() === "stopped"), _v$4 = mcpTooltip();
|
|
881
|
+
_v$ !== _p$.e && _el$4.classList.toggle("mcp-ready", _p$.e = _v$);
|
|
882
|
+
_v$2 !== _p$.t && _el$4.classList.toggle("mcp-error", _p$.t = _v$2);
|
|
883
|
+
_v$3 !== _p$.a && _el$4.classList.toggle("mcp-starting", _p$.a = _v$3);
|
|
884
|
+
_v$4 !== _p$.o && setAttribute(_el$4, "title", _p$.o = _v$4);
|
|
885
|
+
return _p$;
|
|
886
|
+
}, {
|
|
887
|
+
e: void 0,
|
|
888
|
+
t: void 0,
|
|
889
|
+
a: void 0,
|
|
890
|
+
o: void 0
|
|
891
|
+
});
|
|
713
892
|
return _el$;
|
|
714
893
|
})();
|
|
715
894
|
};
|
|
@@ -905,7 +1084,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
|
|
|
905
1084
|
}
|
|
906
1085
|
return "idle";
|
|
907
1086
|
}
|
|
908
|
-
var _tmpl$$
|
|
1087
|
+
var _tmpl$$b = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$a = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$7 = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list><button class=tab-new data-tooltip="New Tab">+`), _tmpl$4$7 = /* @__PURE__ */ template(`<div role=tab><span class=tab-title></span><button class=tab-close>×`), _tmpl$5$5 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$6$5 = /* @__PURE__ */ template(`<span class=tab-loading>`);
|
|
909
1088
|
function stringToHue(str) {
|
|
910
1089
|
let hash = 0;
|
|
911
1090
|
for (let i = 0; i < str.length; i++) {
|
|
@@ -931,14 +1110,14 @@ const TabFavicon = (props) => {
|
|
|
931
1110
|
},
|
|
932
1111
|
get fallback() {
|
|
933
1112
|
return (() => {
|
|
934
|
-
var _el$2 = _tmpl$2$
|
|
1113
|
+
var _el$2 = _tmpl$2$a();
|
|
935
1114
|
insert(_el$2, letter);
|
|
936
1115
|
createRenderEffect((_$p) => setStyleProperty(_el$2, "--favicon-hue", `${hue()}`));
|
|
937
1116
|
return _el$2;
|
|
938
1117
|
})();
|
|
939
1118
|
},
|
|
940
1119
|
get children() {
|
|
941
|
-
var _el$ = _tmpl$$
|
|
1120
|
+
var _el$ = _tmpl$$b();
|
|
942
1121
|
_el$.addEventListener("error", () => setFailed(true));
|
|
943
1122
|
createRenderEffect(() => setAttribute(_el$, "src", props.favicon));
|
|
944
1123
|
return _el$;
|
|
@@ -961,13 +1140,13 @@ const TabBar = () => {
|
|
|
961
1140
|
onCleanup(() => clearInterval(ticker));
|
|
962
1141
|
const modelActiveTabIds = createMemo(() => getAgentActiveTabIds(runtimeState2(), now()));
|
|
963
1142
|
return (() => {
|
|
964
|
-
var _el$3 = _tmpl$3$
|
|
1143
|
+
var _el$3 = _tmpl$3$7(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
965
1144
|
insert(_el$4, createComponent(For, {
|
|
966
1145
|
get each() {
|
|
967
1146
|
return tabs2();
|
|
968
1147
|
},
|
|
969
1148
|
children: (tab) => (() => {
|
|
970
|
-
var _el$6 = _tmpl$4$
|
|
1149
|
+
var _el$6 = _tmpl$4$7(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
|
|
971
1150
|
_el$6.addEventListener("auxclick", (e) => {
|
|
972
1151
|
if (e.button === 1) closeTab(tab.id);
|
|
973
1152
|
});
|
|
@@ -985,12 +1164,12 @@ const TabBar = () => {
|
|
|
985
1164
|
}), _el$7);
|
|
986
1165
|
insert(_el$6, (() => {
|
|
987
1166
|
var _c$ = memo(() => !!modelActiveTabIds().has(tab.id));
|
|
988
|
-
return () => _c$() && _tmpl$5$
|
|
1167
|
+
return () => _c$() && _tmpl$5$5();
|
|
989
1168
|
})(), _el$7);
|
|
990
1169
|
insert(_el$7, () => tab.title || "New Tab");
|
|
991
1170
|
insert(_el$6, (() => {
|
|
992
1171
|
var _c$2 = memo(() => !!tab.isLoading);
|
|
993
|
-
return () => _c$2() && _tmpl$6$
|
|
1172
|
+
return () => _c$2() && _tmpl$6$5();
|
|
994
1173
|
})(), _el$8);
|
|
995
1174
|
_el$8.$$click = (e) => {
|
|
996
1175
|
e.stopPropagation();
|
|
@@ -1094,7 +1273,7 @@ function useUI() {
|
|
|
1094
1273
|
}
|
|
1095
1274
|
};
|
|
1096
1275
|
}
|
|
1097
|
-
var _tmpl$$
|
|
1276
|
+
var _tmpl$$a = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=address-bar><div class=nav-controls><button class=nav-btn data-tooltip=Back><svg width=14 height=14 viewBox="0 0 14 14"><path d="M9 2L4 7l5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Forward><svg width=14 height=14 viewBox="0 0 14 14"><path d="M5 2l5 5-5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Reload><svg width=14 height=14 viewBox="0 0 14 14"><path d="M2.5 7a4.5 4.5 0 1 1 1 3"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M2 4v3.5h3.5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button></div><div class=url-shell><form class=url-form><input class=url-input type=text placeholder="Search or enter URL"></form><div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text></span></div></div><div class=toolbar-actions><button class=nav-btn data-tooltip="Reader Mode"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=2 y=1 width=10 height=12 rx=1 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=4 y1=4 x2=10 y2=4 stroke=currentColor stroke-width=1></line><line x1=4 y1=6.5 x2=10 y2=6.5 stroke=currentColor stroke-width=1></line><line x1=4 y1=9 x2=8 y2=9 stroke=currentColor stroke-width=1></line></svg></button><button class=nav-btn data-tooltip="Dev Tools"><svg width=14 height=14 viewBox="0 0 14 14"><polyline points="3,5 1,7 3,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><polyline points="11,5 13,7 11,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><line x1=8.5 y1=2 x2=5.5 y2=12 stroke=currentColor stroke-width=1.2 stroke-linecap=round></line></svg></button><button class="nav-btn nav-btn-sidebar"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=1 y=1 width=12 height=12 rx=1.5 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=9 y1=1 x2=9 y2=13 stroke=currentColor stroke-width=1.2></line></svg></button><button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`);
|
|
1098
1277
|
const AddressBar = () => {
|
|
1099
1278
|
const {
|
|
1100
1279
|
activeTab,
|
|
@@ -1135,7 +1314,7 @@ const AddressBar = () => {
|
|
|
1135
1314
|
}
|
|
1136
1315
|
};
|
|
1137
1316
|
return (() => {
|
|
1138
|
-
var _el$ = _tmpl$2$
|
|
1317
|
+
var _el$ = _tmpl$2$9(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$6.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling;
|
|
1139
1318
|
_el$13.firstChild;
|
|
1140
1319
|
var _el$16 = _el$13.nextSibling;
|
|
1141
1320
|
addEventListener(_el$3, "click", goBack);
|
|
@@ -1156,7 +1335,7 @@ const AddressBar = () => {
|
|
|
1156
1335
|
return pendingApprovalCount() > 0;
|
|
1157
1336
|
},
|
|
1158
1337
|
get children() {
|
|
1159
|
-
var _el$15 = _tmpl$$
|
|
1338
|
+
var _el$15 = _tmpl$$a();
|
|
1160
1339
|
insert(_el$15, pendingApprovalCount);
|
|
1161
1340
|
createRenderEffect(() => setAttribute(_el$15, "aria-label", `${pendingApprovalCount()} pending`));
|
|
1162
1341
|
return _el$15;
|
|
@@ -1189,7 +1368,7 @@ const AddressBar = () => {
|
|
|
1189
1368
|
})();
|
|
1190
1369
|
};
|
|
1191
1370
|
delegateEvents(["click", "input"]);
|
|
1192
|
-
var _tmpl$$
|
|
1371
|
+
var _tmpl$$9 = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
|
|
1193
1372
|
const TOAST_DURATION_MS$1 = 4200;
|
|
1194
1373
|
const TOAST_EXIT_MS$1 = 300;
|
|
1195
1374
|
function isBookmarkToastCandidate(action) {
|
|
@@ -1249,13 +1428,13 @@ const BookmarkNotifications = () => {
|
|
|
1249
1428
|
timeoutIds.clear();
|
|
1250
1429
|
});
|
|
1251
1430
|
return (() => {
|
|
1252
|
-
var _el$ = _tmpl$$
|
|
1431
|
+
var _el$ = _tmpl$$9();
|
|
1253
1432
|
insert(_el$, createComponent(For, {
|
|
1254
1433
|
get each() {
|
|
1255
1434
|
return toasts();
|
|
1256
1435
|
},
|
|
1257
1436
|
children: (toast) => (() => {
|
|
1258
|
-
var _el$2 = _tmpl$2$
|
|
1437
|
+
var _el$2 = _tmpl$2$8(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
1259
1438
|
insert(_el$3, () => toast.title);
|
|
1260
1439
|
insert(_el$4, () => toast.message);
|
|
1261
1440
|
createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!toast.leaving));
|
|
@@ -1265,7 +1444,7 @@ const BookmarkNotifications = () => {
|
|
|
1265
1444
|
return _el$;
|
|
1266
1445
|
})();
|
|
1267
1446
|
};
|
|
1268
|
-
var _tmpl$$
|
|
1447
|
+
var _tmpl$$8 = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite><div class="bookmark-toast highlight-toast"role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
|
|
1269
1448
|
const TOAST_DURATION_MS = 3e3;
|
|
1270
1449
|
const TOAST_EXIT_MS = 300;
|
|
1271
1450
|
const HighlightNotifications = (props) => {
|
|
@@ -1304,7 +1483,7 @@ const HighlightNotifications = (props) => {
|
|
|
1304
1483
|
return memo(() => !!visible())() && current();
|
|
1305
1484
|
},
|
|
1306
1485
|
get children() {
|
|
1307
|
-
var _el$ = _tmpl$$
|
|
1486
|
+
var _el$ = _tmpl$$8(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
1308
1487
|
insert(_el$3, () => current().title);
|
|
1309
1488
|
insert(_el$4, () => current().message);
|
|
1310
1489
|
createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!leaving()));
|
|
@@ -1330,7 +1509,7 @@ function useScrollFade(el) {
|
|
|
1330
1509
|
observer.disconnect();
|
|
1331
1510
|
});
|
|
1332
1511
|
}
|
|
1333
|
-
var _tmpl$$
|
|
1512
|
+
var _tmpl$$7 = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$2$7 = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$3$6 = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$4$6 = /* @__PURE__ */ template(`<article><div class=agent-transcript-meta><span class=agent-transcript-badge></span><span class=agent-transcript-time></span></div><div class=agent-transcript-text>`);
|
|
1334
1513
|
const AgentTranscriptDock = () => {
|
|
1335
1514
|
const {
|
|
1336
1515
|
runtimeState: runtimeState2
|
|
@@ -1365,7 +1544,7 @@ const AgentTranscriptDock = () => {
|
|
|
1365
1544
|
return memo(() => mode() === "full")() && visibleEntries().length > 0;
|
|
1366
1545
|
},
|
|
1367
1546
|
get children() {
|
|
1368
|
-
var _el$ = _tmpl$3$
|
|
1547
|
+
var _el$ = _tmpl$3$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
|
|
1369
1548
|
_el$3.firstChild;
|
|
1370
1549
|
var _el$6 = _el$3.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
|
|
1371
1550
|
insert(_el$3, createComponent(Show, {
|
|
@@ -1373,7 +1552,7 @@ const AgentTranscriptDock = () => {
|
|
|
1373
1552
|
return hasStreamingEntry();
|
|
1374
1553
|
},
|
|
1375
1554
|
get children() {
|
|
1376
|
-
return _tmpl$$
|
|
1555
|
+
return _tmpl$$7();
|
|
1377
1556
|
}
|
|
1378
1557
|
}), null);
|
|
1379
1558
|
_el$7.$$click = () => setCollapsed((value) => !value);
|
|
@@ -1384,14 +1563,14 @@ const AgentTranscriptDock = () => {
|
|
|
1384
1563
|
return !collapsed();
|
|
1385
1564
|
},
|
|
1386
1565
|
get children() {
|
|
1387
|
-
var _el$9 = _tmpl$2$
|
|
1566
|
+
var _el$9 = _tmpl$2$7();
|
|
1388
1567
|
use((el) => useScrollFade(el), _el$9);
|
|
1389
1568
|
insert(_el$9, createComponent(For, {
|
|
1390
1569
|
get each() {
|
|
1391
1570
|
return visibleEntries();
|
|
1392
1571
|
},
|
|
1393
1572
|
children: (entry) => (() => {
|
|
1394
|
-
var _el$0 = _tmpl$4$
|
|
1573
|
+
var _el$0 = _tmpl$4$6(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling;
|
|
1395
1574
|
insert(_el$10, () => entry.title || entry.kind);
|
|
1396
1575
|
insert(_el$11, () => formatTime2(entry.updatedAt));
|
|
1397
1576
|
insert(_el$12, () => entry.text);
|
|
@@ -1486,12 +1665,13 @@ function useAI() {
|
|
|
1486
1665
|
clearHistory: () => setMessages([])
|
|
1487
1666
|
};
|
|
1488
1667
|
}
|
|
1489
|
-
var _tmpl$$
|
|
1668
|
+
var _tmpl$$6 = /* @__PURE__ */ template(`<div class=command-bar-no-provider><p>Configure a chat provider to start using the AI assistant.</p><button class=command-bar-no-provider-btn>Open Settings <kbd>Ctrl+,`), _tmpl$2$6 = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$5 = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$5 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=command-bar><form><div class=command-bar-icon><svg width=16 height=16 viewBox="0 0 16 16"><circle cx=8 cy=8 r=6 fill=none stroke=var(--accent-primary) stroke-width=1.5></circle><circle cx=6 cy=7 r=0.8 fill=var(--accent-primary)></circle><circle cx=10 cy=7 r=0.8 fill=var(--accent-primary)></circle><path d="M6 10c0.5 0.8 3.5 0.8 4 0"fill=none stroke=var(--accent-primary) stroke-width=0.8 stroke-linecap=round></path></svg></div><input class=command-bar-input type=text></form><div class=command-bar-hints><span><kbd>Enter</kbd> to ask</span><span><kbd>Esc</kbd> to close`), _tmpl$5$4 = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$4 = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
|
|
1490
1669
|
const CommandBar = () => {
|
|
1491
1670
|
const {
|
|
1492
1671
|
commandBarOpen: commandBarOpen2,
|
|
1493
1672
|
closeCommandBar,
|
|
1494
|
-
toggleSidebar
|
|
1673
|
+
toggleSidebar,
|
|
1674
|
+
openSettings
|
|
1495
1675
|
} = useUI();
|
|
1496
1676
|
const {
|
|
1497
1677
|
query,
|
|
@@ -1500,6 +1680,8 @@ const CommandBar = () => {
|
|
|
1500
1680
|
cancel
|
|
1501
1681
|
} = useAI();
|
|
1502
1682
|
const [input, setInput] = createSignal("");
|
|
1683
|
+
const [settings] = createResource(() => commandBarOpen2(), async (open) => open ? window.vessel.settings.get() : null);
|
|
1684
|
+
const hasProvider = () => settings()?.chatProvider !== null && settings()?.chatProvider !== void 0;
|
|
1503
1685
|
const handleSubmit = async (e) => {
|
|
1504
1686
|
e.preventDefault();
|
|
1505
1687
|
const val = input().trim();
|
|
@@ -1531,7 +1713,8 @@ const CommandBar = () => {
|
|
|
1531
1713
|
return commandBarOpen2();
|
|
1532
1714
|
},
|
|
1533
1715
|
get children() {
|
|
1534
|
-
var _el$ = _tmpl$
|
|
1716
|
+
var _el$ = _tmpl$4$5(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$10 = _el$3.nextSibling, _el$11 = _el$10.firstChild;
|
|
1717
|
+
_el$11.nextSibling;
|
|
1535
1718
|
addEventListener(_el$, "click", closeCommandBar);
|
|
1536
1719
|
_el$2.$$click = (e) => e.stopPropagation();
|
|
1537
1720
|
_el$3.addEventListener("submit", handleSubmit);
|
|
@@ -1541,24 +1724,57 @@ const CommandBar = () => {
|
|
|
1541
1724
|
setAttribute(_el$5, "spellcheck", false);
|
|
1542
1725
|
insert(_el$2, createComponent(Show, {
|
|
1543
1726
|
get when() {
|
|
1544
|
-
return
|
|
1727
|
+
return !hasProvider();
|
|
1728
|
+
},
|
|
1729
|
+
get children() {
|
|
1730
|
+
var _el$6 = _tmpl$$6(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
|
|
1731
|
+
_el$8.$$click = () => {
|
|
1732
|
+
closeCommandBar();
|
|
1733
|
+
openSettings();
|
|
1734
|
+
};
|
|
1735
|
+
return _el$6;
|
|
1736
|
+
}
|
|
1737
|
+
}), _el$10);
|
|
1738
|
+
insert(_el$2, createComponent(Show, {
|
|
1739
|
+
get when() {
|
|
1740
|
+
return memo(() => !!(hasProvider() && recentQueries2().length > 0))() && !input().trim();
|
|
1545
1741
|
},
|
|
1546
1742
|
get children() {
|
|
1547
|
-
var _el$
|
|
1548
|
-
insert(_el$
|
|
1743
|
+
var _el$9 = _tmpl$2$6(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
|
|
1744
|
+
insert(_el$1, createComponent(For, {
|
|
1549
1745
|
get each() {
|
|
1550
1746
|
return recentQueries2();
|
|
1551
1747
|
},
|
|
1552
1748
|
children: (q) => (() => {
|
|
1553
|
-
var _el$
|
|
1554
|
-
_el$
|
|
1555
|
-
insert(_el$
|
|
1556
|
-
return _el$
|
|
1749
|
+
var _el$14 = _tmpl$5$4();
|
|
1750
|
+
_el$14.$$click = () => void handleRecentClick(q);
|
|
1751
|
+
insert(_el$14, q);
|
|
1752
|
+
return _el$14;
|
|
1557
1753
|
})()
|
|
1558
1754
|
}));
|
|
1559
|
-
return _el$
|
|
1755
|
+
return _el$9;
|
|
1756
|
+
}
|
|
1757
|
+
}), _el$10);
|
|
1758
|
+
insert(_el$10, createComponent(Show, {
|
|
1759
|
+
get when() {
|
|
1760
|
+
return hasProvider();
|
|
1761
|
+
},
|
|
1762
|
+
get fallback() {
|
|
1763
|
+
return _tmpl$6$4();
|
|
1764
|
+
},
|
|
1765
|
+
get children() {
|
|
1766
|
+
return _tmpl$3$5();
|
|
1560
1767
|
}
|
|
1561
|
-
}),
|
|
1768
|
+
}), null);
|
|
1769
|
+
createRenderEffect((_p$) => {
|
|
1770
|
+
var _v$ = hasProvider() ? "Ask about this page, summarize, or search..." : "No chat provider configured", _v$2 = !hasProvider();
|
|
1771
|
+
_v$ !== _p$.e && setAttribute(_el$5, "placeholder", _p$.e = _v$);
|
|
1772
|
+
_v$2 !== _p$.t && (_el$5.disabled = _p$.t = _v$2);
|
|
1773
|
+
return _p$;
|
|
1774
|
+
}, {
|
|
1775
|
+
e: void 0,
|
|
1776
|
+
t: void 0
|
|
1777
|
+
});
|
|
1562
1778
|
createRenderEffect(() => _el$5.value = input());
|
|
1563
1779
|
return _el$;
|
|
1564
1780
|
}
|
|
@@ -3070,7 +3286,7 @@ function getBookmarkSearchMatch(args) {
|
|
|
3070
3286
|
}
|
|
3071
3287
|
return { matchedFields, score };
|
|
3072
3288
|
}
|
|
3073
|
-
var _tmpl$$
|
|
3289
|
+
var _tmpl$$5 = /* @__PURE__ */ template(`<div class=dropdown-select-menu role=listbox>`), _tmpl$2$5 = /* @__PURE__ */ template(`<div><button class=dropdown-select-trigger type=button aria-haspopup=listbox><span class=dropdown-select-value></span><span class=dropdown-select-caret aria-hidden=true>▾`), _tmpl$3$4 = /* @__PURE__ */ template(`<span class=dropdown-select-option-description>`), _tmpl$4$4 = /* @__PURE__ */ template(`<button class=dropdown-select-option type=button role=option><span class=dropdown-select-option-copy><span class=dropdown-select-option-label>`);
|
|
3074
3290
|
const DropdownSelect = (props) => {
|
|
3075
3291
|
const [open, setOpen] = createSignal(false);
|
|
3076
3292
|
let rootRef;
|
|
@@ -3094,7 +3310,7 @@ const DropdownSelect = (props) => {
|
|
|
3094
3310
|
});
|
|
3095
3311
|
});
|
|
3096
3312
|
return (() => {
|
|
3097
|
-
var _el$ = _tmpl$2$
|
|
3313
|
+
var _el$ = _tmpl$2$5(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
3098
3314
|
var _ref$ = rootRef;
|
|
3099
3315
|
typeof _ref$ === "function" ? use(_ref$, _el$) : rootRef = _el$;
|
|
3100
3316
|
_el$2.$$click = () => setOpen((current) => !current);
|
|
@@ -3104,13 +3320,13 @@ const DropdownSelect = (props) => {
|
|
|
3104
3320
|
return open();
|
|
3105
3321
|
},
|
|
3106
3322
|
get children() {
|
|
3107
|
-
var _el$5 = _tmpl$$
|
|
3323
|
+
var _el$5 = _tmpl$$5();
|
|
3108
3324
|
insert(_el$5, createComponent(For, {
|
|
3109
3325
|
get each() {
|
|
3110
3326
|
return props.options;
|
|
3111
3327
|
},
|
|
3112
3328
|
children: (option) => (() => {
|
|
3113
|
-
var _el$6 = _tmpl$4$
|
|
3329
|
+
var _el$6 = _tmpl$4$4(), _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild;
|
|
3114
3330
|
_el$6.$$click = () => {
|
|
3115
3331
|
props.onChange(option.value);
|
|
3116
3332
|
setOpen(false);
|
|
@@ -3121,7 +3337,7 @@ const DropdownSelect = (props) => {
|
|
|
3121
3337
|
return option.description;
|
|
3122
3338
|
},
|
|
3123
3339
|
get children() {
|
|
3124
|
-
var _el$9 = _tmpl$3$
|
|
3340
|
+
var _el$9 = _tmpl$3$4();
|
|
3125
3341
|
insert(_el$9, () => option.description);
|
|
3126
3342
|
return _el$9;
|
|
3127
3343
|
}
|
|
@@ -3159,7 +3375,7 @@ const DropdownSelect = (props) => {
|
|
|
3159
3375
|
};
|
|
3160
3376
|
delegateEvents(["click"]);
|
|
3161
3377
|
const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
|
|
3162
|
-
var _tmpl$$3 = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$3 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$3$2 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$4$2 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$5$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$6$2 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$7$2 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2>`), _tmpl$8$2 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$9$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$0$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$1$2 = /* @__PURE__ */ template(`<span>`), _tmpl$10$2 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$11$2 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$12$2 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$13$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$14$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$17$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2 placeholder="Ask anything..."></textarea><button class=sidebar-send>Send`), _tmpl$18$1 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button></div><div class=sidebar-messages><div>`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$20 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$21 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$22 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$23 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$24 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$25 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$26 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$29 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$30 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$32 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$34 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$35 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$36 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$37 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><button class=agent-control-button type=button>Restore`), _tmpl$39 = /* @__PURE__ */ template(`<div>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$41 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$42 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`);
|
|
3378
|
+
var _tmpl$$4 = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$4 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$3$3 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$4$3 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$5$3 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$6$3 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$7$2 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2>`), _tmpl$8$2 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$9$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$0$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$1$2 = /* @__PURE__ */ template(`<span>`), _tmpl$10$2 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$11$2 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$12$2 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$13$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$14$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$17$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2 placeholder="Ask anything..."></textarea><button class=sidebar-send>Send`), _tmpl$18$1 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button></div><div class=sidebar-messages><div>`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$22$1 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$23$1 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$29 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$30 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$32 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$34 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$35 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$36 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$37 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><button class=agent-control-button type=button>Restore`), _tmpl$39 = /* @__PURE__ */ template(`<div>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$41 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$42 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`);
|
|
3163
3379
|
const UNSORTED_FOLDER = {
|
|
3164
3380
|
id: "unsorted",
|
|
3165
3381
|
name: "Unsorted",
|
|
@@ -3168,7 +3384,7 @@ const UNSORTED_FOLDER = {
|
|
|
3168
3384
|
const MarkdownMessage = (props) => {
|
|
3169
3385
|
const html2 = createMemo(() => renderMarkdown(props.content));
|
|
3170
3386
|
return (() => {
|
|
3171
|
-
var _el$ = _tmpl$$
|
|
3387
|
+
var _el$ = _tmpl$$4();
|
|
3172
3388
|
createRenderEffect(() => _el$.innerHTML = html2());
|
|
3173
3389
|
return _el$;
|
|
3174
3390
|
})();
|
|
@@ -3317,7 +3533,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3317
3533
|
const [editingFolderSummary, setEditingFolderSummary] = createSignal("");
|
|
3318
3534
|
const [expandedFolderIds, setExpandedFolderIds] = createSignal([UNSORTED_FOLDER.id]);
|
|
3319
3535
|
const [actionsExpanded, setActionsExpanded] = createSignal(false);
|
|
3320
|
-
createSignal(false);
|
|
3536
|
+
const [checkpointsExpanded, setCheckpointsExpanded] = createSignal(false);
|
|
3321
3537
|
const [isDragging, setIsDragging] = createSignal(false);
|
|
3322
3538
|
const [elapsedSeconds, setElapsedSeconds] = createSignal(0);
|
|
3323
3539
|
let messagesContainerRef;
|
|
@@ -3511,7 +3727,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3511
3727
|
return runtimeState2().supervisor.pendingApprovals.length > 0;
|
|
3512
3728
|
},
|
|
3513
3729
|
get children() {
|
|
3514
|
-
var _el$11 = _tmpl$2$
|
|
3730
|
+
var _el$11 = _tmpl$2$4();
|
|
3515
3731
|
insert(_el$11, () => runtimeState2().supervisor.pendingApprovals.length);
|
|
3516
3732
|
return _el$11;
|
|
3517
3733
|
}
|
|
@@ -3528,7 +3744,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3528
3744
|
return sidebarTab() === "supervisor";
|
|
3529
3745
|
},
|
|
3530
3746
|
get children() {
|
|
3531
|
-
var _el$16 = _tmpl$5$
|
|
3747
|
+
var _el$16 = _tmpl$5$3(), _el$17 = _el$16.firstChild, _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$17.nextSibling, _el$23 = _el$22.firstChild, _el$24 = _el$23.nextSibling, _el$25 = _el$22.nextSibling, _el$27 = _el$25.nextSibling;
|
|
3532
3748
|
_el$27.firstChild;
|
|
3533
3749
|
insert(_el$20, () => runtimeState2().supervisor.paused ? "Agent is paused" : "Agent is live");
|
|
3534
3750
|
insert(_el$21, () => runtimeState2().supervisor.paused ? "Paused" : "Running");
|
|
@@ -3555,12 +3771,12 @@ ${contextBlock}` : contextBlock);
|
|
|
3555
3771
|
return _tmpl$19$1();
|
|
3556
3772
|
},
|
|
3557
3773
|
get children() {
|
|
3558
|
-
return [_tmpl$3$
|
|
3774
|
+
return [_tmpl$3$3(), createComponent(For, {
|
|
3559
3775
|
get each() {
|
|
3560
3776
|
return runtimeState2().supervisor.pendingApprovals;
|
|
3561
3777
|
},
|
|
3562
3778
|
children: (approval) => (() => {
|
|
3563
|
-
var _el$85 = _tmpl$20(), _el$86 = _el$85.firstChild, _el$87 = _el$86.nextSibling, _el$88 = _el$87.nextSibling, _el$89 = _el$88.nextSibling, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild, _el$92 = _el$91.nextSibling;
|
|
3779
|
+
var _el$85 = _tmpl$20$1(), _el$86 = _el$85.firstChild, _el$87 = _el$86.nextSibling, _el$88 = _el$87.nextSibling, _el$89 = _el$88.nextSibling, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild, _el$92 = _el$91.nextSibling;
|
|
3564
3780
|
insert(_el$87, () => approval.name);
|
|
3565
3781
|
insert(_el$88, () => approval.argsSummary);
|
|
3566
3782
|
insert(_el$89, () => approval.reason);
|
|
@@ -3576,7 +3792,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3576
3792
|
return recentActions().length > 0;
|
|
3577
3793
|
},
|
|
3578
3794
|
get children() {
|
|
3579
|
-
var _el$29 = _tmpl$4$
|
|
3795
|
+
var _el$29 = _tmpl$4$3();
|
|
3580
3796
|
_el$29.$$click = () => setActionsExpanded((current) => !current);
|
|
3581
3797
|
insert(_el$29, (() => {
|
|
3582
3798
|
var _c$ = memo(() => !!actionsExpanded());
|
|
@@ -3590,7 +3806,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3590
3806
|
return recentActions().length > 0;
|
|
3591
3807
|
},
|
|
3592
3808
|
get fallback() {
|
|
3593
|
-
return _tmpl$21();
|
|
3809
|
+
return _tmpl$21$1();
|
|
3594
3810
|
},
|
|
3595
3811
|
get children() {
|
|
3596
3812
|
return createComponent(Show, {
|
|
@@ -3598,7 +3814,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3598
3814
|
return actionsExpanded();
|
|
3599
3815
|
},
|
|
3600
3816
|
get fallback() {
|
|
3601
|
-
return _tmpl$22();
|
|
3817
|
+
return _tmpl$22$1();
|
|
3602
3818
|
},
|
|
3603
3819
|
get children() {
|
|
3604
3820
|
return createComponent(For, {
|
|
@@ -3606,7 +3822,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3606
3822
|
return recentActions();
|
|
3607
3823
|
},
|
|
3608
3824
|
children: (action) => (() => {
|
|
3609
|
-
var _el$95 = _tmpl$25(), _el$96 = _el$95.firstChild, _el$97 = _el$96.firstChild, _el$98 = _el$97.nextSibling, _el$99 = _el$96.nextSibling;
|
|
3825
|
+
var _el$95 = _tmpl$25$1(), _el$96 = _el$95.firstChild, _el$97 = _el$96.firstChild, _el$98 = _el$97.nextSibling, _el$99 = _el$96.nextSibling;
|
|
3610
3826
|
insert(_el$97, () => action.name);
|
|
3611
3827
|
insert(_el$98, () => action.status);
|
|
3612
3828
|
insert(_el$99, () => action.argsSummary);
|
|
@@ -3615,7 +3831,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3615
3831
|
return action.resultSummary;
|
|
3616
3832
|
},
|
|
3617
3833
|
get children() {
|
|
3618
|
-
var _el$100 = _tmpl$23();
|
|
3834
|
+
var _el$100 = _tmpl$23$1();
|
|
3619
3835
|
insert(_el$100, () => action.resultSummary);
|
|
3620
3836
|
return _el$100;
|
|
3621
3837
|
}
|
|
@@ -3625,7 +3841,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3625
3841
|
return action.error;
|
|
3626
3842
|
},
|
|
3627
3843
|
get children() {
|
|
3628
|
-
var _el$101 = _tmpl$24();
|
|
3844
|
+
var _el$101 = _tmpl$24$1();
|
|
3629
3845
|
insert(_el$101, () => action.error);
|
|
3630
3846
|
return _el$101;
|
|
3631
3847
|
}
|
|
@@ -3657,7 +3873,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3657
3873
|
return currentTabSaved();
|
|
3658
3874
|
},
|
|
3659
3875
|
get children() {
|
|
3660
|
-
return _tmpl$6$
|
|
3876
|
+
return _tmpl$6$3();
|
|
3661
3877
|
}
|
|
3662
3878
|
}), null);
|
|
3663
3879
|
_el$36.$$input = (e) => setBookmarkSearchQuery(e.currentTarget.value);
|
|
@@ -3697,7 +3913,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3697
3913
|
},
|
|
3698
3914
|
get fallback() {
|
|
3699
3915
|
return (() => {
|
|
3700
|
-
var _el$102 = _tmpl$26();
|
|
3916
|
+
var _el$102 = _tmpl$26$1();
|
|
3701
3917
|
insert(_el$102, (() => {
|
|
3702
3918
|
var _c$5 = memo(() => !!normalizedBookmarkSearch());
|
|
3703
3919
|
return () => _c$5() ? `No bookmarks matched "${bookmarkSearchQuery().trim()}".` : "No bookmarks saved yet.";
|
|
@@ -3726,7 +3942,7 @@ ${contextBlock}` : contextBlock);
|
|
|
3726
3942
|
return folder.summary;
|
|
3727
3943
|
},
|
|
3728
3944
|
get children() {
|
|
3729
|
-
var _el$111 = _tmpl$27();
|
|
3945
|
+
var _el$111 = _tmpl$27$1();
|
|
3730
3946
|
insert(_el$111, () => folder.summary);
|
|
3731
3947
|
return _el$111;
|
|
3732
3948
|
}
|
|
@@ -4095,7 +4311,7 @@ ${contextBlock}` : contextBlock);
|
|
|
4095
4311
|
});
|
|
4096
4312
|
};
|
|
4097
4313
|
delegateEvents(["pointerdown", "click", "input", "keydown"]);
|
|
4098
|
-
var _tmpl$$
|
|
4314
|
+
var _tmpl$$3 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$2 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$2 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$2 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$2 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$1 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
|
|
4099
4315
|
function formatTime(iso) {
|
|
4100
4316
|
try {
|
|
4101
4317
|
const d = new Date(iso);
|
|
@@ -4168,10 +4384,10 @@ const ConsoleView = (props) => {
|
|
|
4168
4384
|
return props.entries.length > 0;
|
|
4169
4385
|
},
|
|
4170
4386
|
get fallback() {
|
|
4171
|
-
return _tmpl$2$
|
|
4387
|
+
return _tmpl$2$3();
|
|
4172
4388
|
},
|
|
4173
4389
|
get children() {
|
|
4174
|
-
var _el$ = _tmpl$$
|
|
4390
|
+
var _el$ = _tmpl$$3();
|
|
4175
4391
|
_el$.addEventListener("scroll", onScroll);
|
|
4176
4392
|
var _ref$ = scrollRef;
|
|
4177
4393
|
typeof _ref$ === "function" ? use(_ref$, _el$) : scrollRef = _el$;
|
|
@@ -4180,7 +4396,7 @@ const ConsoleView = (props) => {
|
|
|
4180
4396
|
return props.entries;
|
|
4181
4397
|
},
|
|
4182
4398
|
children: (entry) => (() => {
|
|
4183
|
-
var _el$3 = _tmpl$3$
|
|
4399
|
+
var _el$3 = _tmpl$3$2(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
|
|
4184
4400
|
insert(_el$4, () => entry.level);
|
|
4185
4401
|
insert(_el$5, () => formatTime(entry.timestamp));
|
|
4186
4402
|
insert(_el$6, () => entry.text);
|
|
@@ -4222,10 +4438,10 @@ const NetworkView = (props) => {
|
|
|
4222
4438
|
return props.entries.length > 0;
|
|
4223
4439
|
},
|
|
4224
4440
|
get fallback() {
|
|
4225
|
-
return _tmpl$5$
|
|
4441
|
+
return _tmpl$5$2();
|
|
4226
4442
|
},
|
|
4227
4443
|
get children() {
|
|
4228
|
-
var _el$8 = _tmpl$4$
|
|
4444
|
+
var _el$8 = _tmpl$4$2();
|
|
4229
4445
|
_el$8.firstChild;
|
|
4230
4446
|
_el$8.addEventListener("scroll", onScroll);
|
|
4231
4447
|
var _ref$2 = scrollRef;
|
|
@@ -4235,7 +4451,7 @@ const NetworkView = (props) => {
|
|
|
4235
4451
|
return props.entries;
|
|
4236
4452
|
},
|
|
4237
4453
|
children: (entry) => (() => {
|
|
4238
|
-
var _el$1 = _tmpl$6$
|
|
4454
|
+
var _el$1 = _tmpl$6$2(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling;
|
|
4239
4455
|
insert(_el$10, () => entry.method);
|
|
4240
4456
|
insert(_el$11, () => shortenUrl(entry.url));
|
|
4241
4457
|
insert(_el$12, (() => {
|
|
@@ -4542,7 +4758,7 @@ const DevToolsPanel = () => {
|
|
|
4542
4758
|
})();
|
|
4543
4759
|
};
|
|
4544
4760
|
delegateEvents(["click", "input"]);
|
|
4545
|
-
var _tmpl$$
|
|
4761
|
+
var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>×</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — scroll to Chat Assistant below and add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown below</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$2$2 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$3$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$4$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$5$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$6$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$7 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$8 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$9 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$0 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$1 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Store credentials for agent-driven logins. Credentials are encrypted at rest and never sent to AI providers — they are filled directly into login forms with your consent.`), _tmpl$10 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$11 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$12 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Label (e.g. Work GitHub)"><input class=settings-input placeholder="Domain pattern (e.g. github.com, *.aws.amazon.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><input class=settings-input placeholder="TOTP secret (optional, base32)"><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Credential</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$13 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:<port>/mcp</code>. Changing this value restarts the MCP server immediately.</p></div><div class=settings-field><label class=settings-label for=max-tool-iterations>Max Tool Iterations</label><p class=settings-hint></p></div><div class=settings-field><label class=settings-label for=obsidian-vault-path>Obsidian Vault Path</label><input id=obsidian-vault-path class=settings-input placeholder=/home/you/Documents/MyVault><p class=settings-hint>Optional. When set, Vessel memory tools can write markdown notes into this vault for research breadcrumbs and summaries.</p></div><div class=settings-field><label class=settings-label for=agent-transcript-mode>Agent Transcript Monitor</label><select id=agent-transcript-mode class="settings-input settings-select"><option value=off>Off</option><option value=summary>Summary HUD</option><option value=full>Full transcript</option></select><p class=settings-hint>Controls the in-browser transcript monitor when an external harness publishes reasoning or status updates into Vessel via the<code>vessel_publish_transcript</code> MCP tool. Summary HUD shows a compact 2-line status surface; Full transcript shows the recent entry list.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Anonymous Usage Analytics</span></label><p class=settings-hint>Help improve Vessel by sending anonymous usage data (tool popularity, session duration, provider type). No URLs, page content, queries, or personal data is ever collected.</p></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$14 = /* @__PURE__ */ template(`<style>
|
|
4546
4762
|
.settings-panel {
|
|
4547
4763
|
width: min(440px, calc(100vw - 32px));
|
|
4548
4764
|
max-height: calc(100vh - 48px);
|
|
@@ -4877,7 +5093,174 @@ var _tmpl$$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=set
|
|
|
4877
5093
|
color: var(--text-secondary);
|
|
4878
5094
|
background: var(--bg-tertiary);
|
|
4879
5095
|
}
|
|
4880
|
-
|
|
5096
|
+
|
|
5097
|
+
/* Welcome banner */
|
|
5098
|
+
.welcome-banner {
|
|
5099
|
+
margin-bottom: 20px;
|
|
5100
|
+
padding: 16px;
|
|
5101
|
+
border-radius: var(--radius-md);
|
|
5102
|
+
border: 1px solid rgba(196, 160, 90, 0.25);
|
|
5103
|
+
background: rgba(196, 160, 90, 0.08);
|
|
5104
|
+
}
|
|
5105
|
+
.welcome-banner-header {
|
|
5106
|
+
display: flex;
|
|
5107
|
+
justify-content: space-between;
|
|
5108
|
+
align-items: center;
|
|
5109
|
+
margin-bottom: 8px;
|
|
5110
|
+
}
|
|
5111
|
+
.welcome-banner-title {
|
|
5112
|
+
font-size: 13px;
|
|
5113
|
+
font-weight: 600;
|
|
5114
|
+
color: var(--accent-primary);
|
|
5115
|
+
}
|
|
5116
|
+
.welcome-banner-dismiss {
|
|
5117
|
+
width: 22px;
|
|
5118
|
+
height: 22px;
|
|
5119
|
+
border-radius: 4px;
|
|
5120
|
+
background: transparent;
|
|
5121
|
+
border: none;
|
|
5122
|
+
color: var(--text-muted);
|
|
5123
|
+
font-size: 16px;
|
|
5124
|
+
cursor: pointer;
|
|
5125
|
+
display: flex;
|
|
5126
|
+
align-items: center;
|
|
5127
|
+
justify-content: center;
|
|
5128
|
+
}
|
|
5129
|
+
.welcome-banner-dismiss:hover {
|
|
5130
|
+
background: rgba(255, 255, 255, 0.08);
|
|
5131
|
+
color: var(--text-primary);
|
|
5132
|
+
}
|
|
5133
|
+
.welcome-banner-text {
|
|
5134
|
+
font-size: 12px;
|
|
5135
|
+
color: var(--text-secondary);
|
|
5136
|
+
margin: 0 0 8px;
|
|
5137
|
+
}
|
|
5138
|
+
.welcome-banner-steps {
|
|
5139
|
+
margin: 0;
|
|
5140
|
+
padding-left: 20px;
|
|
5141
|
+
font-size: 12px;
|
|
5142
|
+
line-height: 1.7;
|
|
5143
|
+
color: var(--text-secondary);
|
|
5144
|
+
}
|
|
5145
|
+
.welcome-banner-steps li {
|
|
5146
|
+
margin-bottom: 2px;
|
|
5147
|
+
}
|
|
5148
|
+
.welcome-banner-steps li.done {
|
|
5149
|
+
color: var(--text-muted);
|
|
5150
|
+
text-decoration: line-through;
|
|
5151
|
+
opacity: 0.6;
|
|
5152
|
+
}
|
|
5153
|
+
.welcome-banner-steps kbd {
|
|
5154
|
+
display: inline-block;
|
|
5155
|
+
padding: 0 5px;
|
|
5156
|
+
font-size: 11px;
|
|
5157
|
+
font-family: var(--font-mono);
|
|
5158
|
+
background: rgba(255, 255, 255, 0.08);
|
|
5159
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
5160
|
+
border-radius: 3px;
|
|
5161
|
+
color: var(--text-primary);
|
|
5162
|
+
}
|
|
5163
|
+
|
|
5164
|
+
/* Agent Credential Vault */
|
|
5165
|
+
.vault-premium-badge {
|
|
5166
|
+
display: inline-block;
|
|
5167
|
+
font-size: 10px;
|
|
5168
|
+
font-weight: 600;
|
|
5169
|
+
color: #f0c636;
|
|
5170
|
+
background: rgba(240, 198, 54, 0.15);
|
|
5171
|
+
padding: 1px 6px;
|
|
5172
|
+
border-radius: 4px;
|
|
5173
|
+
margin-left: 8px;
|
|
5174
|
+
vertical-align: middle;
|
|
5175
|
+
}
|
|
5176
|
+
.vault-entries {
|
|
5177
|
+
display: flex;
|
|
5178
|
+
flex-direction: column;
|
|
5179
|
+
gap: 6px;
|
|
5180
|
+
margin-bottom: 10px;
|
|
5181
|
+
}
|
|
5182
|
+
.vault-entry {
|
|
5183
|
+
display: flex;
|
|
5184
|
+
align-items: center;
|
|
5185
|
+
justify-content: space-between;
|
|
5186
|
+
padding: 8px 12px;
|
|
5187
|
+
background: var(--bg-tertiary);
|
|
5188
|
+
border: 1px solid var(--border-subtle);
|
|
5189
|
+
border-radius: var(--radius-md);
|
|
5190
|
+
}
|
|
5191
|
+
.vault-entry-info {
|
|
5192
|
+
display: flex;
|
|
5193
|
+
flex-direction: column;
|
|
5194
|
+
gap: 2px;
|
|
5195
|
+
min-width: 0;
|
|
5196
|
+
}
|
|
5197
|
+
.vault-entry-label {
|
|
5198
|
+
font-size: 12px;
|
|
5199
|
+
font-weight: 500;
|
|
5200
|
+
color: var(--text-primary);
|
|
5201
|
+
white-space: nowrap;
|
|
5202
|
+
overflow: hidden;
|
|
5203
|
+
text-overflow: ellipsis;
|
|
5204
|
+
}
|
|
5205
|
+
.vault-entry-detail {
|
|
5206
|
+
font-size: 11px;
|
|
5207
|
+
color: var(--text-muted);
|
|
5208
|
+
white-space: nowrap;
|
|
5209
|
+
overflow: hidden;
|
|
5210
|
+
text-overflow: ellipsis;
|
|
5211
|
+
}
|
|
5212
|
+
.vault-entry-remove {
|
|
5213
|
+
flex-shrink: 0;
|
|
5214
|
+
width: 24px;
|
|
5215
|
+
height: 24px;
|
|
5216
|
+
border-radius: 4px;
|
|
5217
|
+
background: transparent;
|
|
5218
|
+
border: none;
|
|
5219
|
+
color: var(--text-tertiary, #71717a);
|
|
5220
|
+
font-size: 16px;
|
|
5221
|
+
cursor: pointer;
|
|
5222
|
+
display: flex;
|
|
5223
|
+
align-items: center;
|
|
5224
|
+
justify-content: center;
|
|
5225
|
+
transition: background var(--duration-fast), color var(--duration-fast);
|
|
5226
|
+
}
|
|
5227
|
+
.vault-entry-remove:hover {
|
|
5228
|
+
background: rgba(255, 108, 91, 0.12);
|
|
5229
|
+
color: #ff8e8e;
|
|
5230
|
+
}
|
|
5231
|
+
.vault-add-btn {
|
|
5232
|
+
height: 32px;
|
|
5233
|
+
padding: 0 14px;
|
|
5234
|
+
border-radius: var(--radius-md);
|
|
5235
|
+
font-size: 12px;
|
|
5236
|
+
font-weight: 500;
|
|
5237
|
+
background: var(--bg-tertiary);
|
|
5238
|
+
border: 1px dashed var(--border-subtle);
|
|
5239
|
+
color: var(--text-secondary);
|
|
5240
|
+
cursor: pointer;
|
|
5241
|
+
width: 100%;
|
|
5242
|
+
transition: background var(--duration-fast), border-color var(--duration-fast);
|
|
5243
|
+
}
|
|
5244
|
+
.vault-add-btn:hover {
|
|
5245
|
+
background: var(--border-visible);
|
|
5246
|
+
border-color: var(--border-visible);
|
|
5247
|
+
}
|
|
5248
|
+
.vault-add-form {
|
|
5249
|
+
display: flex;
|
|
5250
|
+
flex-direction: column;
|
|
5251
|
+
gap: 8px;
|
|
5252
|
+
padding: 12px;
|
|
5253
|
+
background: rgba(255, 255, 255, 0.02);
|
|
5254
|
+
border: 1px solid var(--border-subtle);
|
|
5255
|
+
border-radius: var(--radius-md);
|
|
5256
|
+
}
|
|
5257
|
+
.vault-add-actions {
|
|
5258
|
+
display: flex;
|
|
5259
|
+
gap: 8px;
|
|
5260
|
+
justify-content: flex-end;
|
|
5261
|
+
margin-top: 4px;
|
|
5262
|
+
}
|
|
5263
|
+
`), _tmpl$15 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$16 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$17 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$19 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$20 = /* @__PURE__ */ template(`<div>`), _tmpl$21 = /* @__PURE__ */ template(`<option>`), _tmpl$22 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$23 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$24 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">Subscribe to Premium — 5-day free trial`), _tmpl$25 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$26 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$27 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> · </span></div><button class=vault-entry-remove title="Remove credential">×`);
|
|
4881
5264
|
const CHAT_PROVIDERS = [{
|
|
4882
5265
|
id: "anthropic",
|
|
4883
5266
|
name: "Anthropic",
|
|
@@ -4959,6 +5342,80 @@ const Settings = () => {
|
|
|
4959
5342
|
const [defaultUrl, setDefaultUrl] = createSignal("https://start.duckduckgo.com");
|
|
4960
5343
|
const [status, setStatus] = createSignal(null);
|
|
4961
5344
|
const [telemetryEnabled, setTelemetryEnabled] = createSignal(true);
|
|
5345
|
+
const [vaultEntries, setVaultEntries] = createSignal([]);
|
|
5346
|
+
const [vaultExpanded, setVaultExpanded] = createSignal(false);
|
|
5347
|
+
const [vaultAdding, setVaultAdding] = createSignal(false);
|
|
5348
|
+
const [vaultNewLabel, setVaultNewLabel] = createSignal("");
|
|
5349
|
+
const [vaultNewDomain, setVaultNewDomain] = createSignal("");
|
|
5350
|
+
const [vaultNewUsername, setVaultNewUsername] = createSignal("");
|
|
5351
|
+
const [vaultNewPassword, setVaultNewPassword] = createSignal("");
|
|
5352
|
+
const [vaultNewTotp, setVaultNewTotp] = createSignal("");
|
|
5353
|
+
const [vaultNewNotes, setVaultNewNotes] = createSignal("");
|
|
5354
|
+
const [vaultMessage, setVaultMessage] = createSignal(null);
|
|
5355
|
+
const FIRST_RUN_KEY = "vessel.onboarding.dismissed";
|
|
5356
|
+
const [showWelcome, setShowWelcome] = createSignal(!localStorage.getItem(FIRST_RUN_KEY));
|
|
5357
|
+
const dismissWelcome = () => {
|
|
5358
|
+
localStorage.setItem(FIRST_RUN_KEY, "1");
|
|
5359
|
+
setShowWelcome(false);
|
|
5360
|
+
};
|
|
5361
|
+
const loadVaultEntries = async () => {
|
|
5362
|
+
try {
|
|
5363
|
+
const entries2 = await window.vessel.vault.list();
|
|
5364
|
+
setVaultEntries(entries2);
|
|
5365
|
+
} catch {
|
|
5366
|
+
}
|
|
5367
|
+
};
|
|
5368
|
+
const handleVaultAdd = async () => {
|
|
5369
|
+
if (!vaultNewLabel().trim() || !vaultNewDomain().trim() || !vaultNewUsername().trim() || !vaultNewPassword().trim()) {
|
|
5370
|
+
setVaultMessage({
|
|
5371
|
+
kind: "error",
|
|
5372
|
+
text: "Label, domain, username, and password are required."
|
|
5373
|
+
});
|
|
5374
|
+
return;
|
|
5375
|
+
}
|
|
5376
|
+
try {
|
|
5377
|
+
await window.vessel.vault.add({
|
|
5378
|
+
label: vaultNewLabel().trim(),
|
|
5379
|
+
domainPattern: vaultNewDomain().trim(),
|
|
5380
|
+
username: vaultNewUsername().trim(),
|
|
5381
|
+
password: vaultNewPassword().trim(),
|
|
5382
|
+
totpSecret: vaultNewTotp().trim() || void 0,
|
|
5383
|
+
notes: vaultNewNotes().trim() || void 0
|
|
5384
|
+
});
|
|
5385
|
+
setVaultNewLabel("");
|
|
5386
|
+
setVaultNewDomain("");
|
|
5387
|
+
setVaultNewUsername("");
|
|
5388
|
+
setVaultNewPassword("");
|
|
5389
|
+
setVaultNewTotp("");
|
|
5390
|
+
setVaultNewNotes("");
|
|
5391
|
+
setVaultAdding(false);
|
|
5392
|
+
setVaultMessage({
|
|
5393
|
+
kind: "success",
|
|
5394
|
+
text: "Credential added."
|
|
5395
|
+
});
|
|
5396
|
+
await loadVaultEntries();
|
|
5397
|
+
} catch (err) {
|
|
5398
|
+
setVaultMessage({
|
|
5399
|
+
kind: "error",
|
|
5400
|
+
text: err instanceof Error ? err.message : "Failed to add credential."
|
|
5401
|
+
});
|
|
5402
|
+
}
|
|
5403
|
+
};
|
|
5404
|
+
const handleVaultRemove = async (id) => {
|
|
5405
|
+
try {
|
|
5406
|
+
await window.vessel.vault.remove(id);
|
|
5407
|
+
await loadVaultEntries();
|
|
5408
|
+
setVaultMessage({
|
|
5409
|
+
kind: "success",
|
|
5410
|
+
text: "Credential removed."
|
|
5411
|
+
});
|
|
5412
|
+
} catch {
|
|
5413
|
+
setVaultMessage({
|
|
5414
|
+
kind: "error",
|
|
5415
|
+
text: "Failed to remove credential."
|
|
5416
|
+
});
|
|
5417
|
+
}
|
|
5418
|
+
};
|
|
4962
5419
|
const [premiumState, setPremiumState] = createSignal({
|
|
4963
5420
|
status: "free",
|
|
4964
5421
|
customerId: "",
|
|
@@ -5052,6 +5509,7 @@ const Settings = () => {
|
|
|
5052
5509
|
if (ps.email) setPremiumEmail(ps.email);
|
|
5053
5510
|
} catch {
|
|
5054
5511
|
}
|
|
5512
|
+
await loadVaultEntries();
|
|
5055
5513
|
};
|
|
5056
5514
|
onMount(() => {
|
|
5057
5515
|
void loadState();
|
|
@@ -5108,31 +5566,44 @@ const Settings = () => {
|
|
|
5108
5566
|
},
|
|
5109
5567
|
get children() {
|
|
5110
5568
|
return [(() => {
|
|
5111
|
-
var _el$ = _tmpl$
|
|
5112
|
-
_el$
|
|
5113
|
-
var _el$
|
|
5569
|
+
var _el$ = _tmpl$13(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$1 = _el$3.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, _el$13 = _el$10.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$13.nextSibling, _el$17 = _el$16.firstChild, _el$19 = _el$17.nextSibling, _el$20 = _el$16.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$21.nextSibling, _el$23 = _el$20.nextSibling, _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling, _el$26 = _el$23.nextSibling, _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$29 = _el$26.nextSibling, _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$29.nextSibling, _el$33 = _el$32.nextSibling, _el$34 = _el$33.firstChild, _el$35 = _el$34.firstChild, _el$51 = _el$33.nextSibling, _el$52 = _el$51.nextSibling;
|
|
5570
|
+
_el$52.firstChild;
|
|
5571
|
+
var _el$61 = _el$52.nextSibling, _el$62 = _el$61.nextSibling, _el$63 = _el$62.firstChild;
|
|
5572
|
+
_el$63.firstChild;
|
|
5573
|
+
var _el$79 = _el$62.nextSibling, _el$80 = _el$79.nextSibling, _el$81 = _el$80.firstChild, _el$82 = _el$81.firstChild, _el$83 = _el$80.nextSibling, _el$84 = _el$83.firstChild, _el$85 = _el$84.nextSibling;
|
|
5114
5574
|
addEventListener(_el$, "click", closeSettings);
|
|
5115
5575
|
_el$2.$$keydown = handleKeyDown;
|
|
5116
5576
|
_el$2.$$click = (e) => e.stopPropagation();
|
|
5117
|
-
_el$
|
|
5118
|
-
|
|
5119
|
-
|
|
5120
|
-
|
|
5121
|
-
|
|
5577
|
+
insert(_el$2, createComponent(Show, {
|
|
5578
|
+
get when() {
|
|
5579
|
+
return showWelcome();
|
|
5580
|
+
},
|
|
5581
|
+
get children() {
|
|
5582
|
+
var _el$4 = _tmpl$$2(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$5.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.firstChild;
|
|
5583
|
+
_el$7.$$click = dismissWelcome;
|
|
5584
|
+
createRenderEffect(() => _el$0.classList.toggle("done", !!chatEnabled()));
|
|
5585
|
+
return _el$4;
|
|
5586
|
+
}
|
|
5587
|
+
}), _el$1);
|
|
5588
|
+
_el$12.$$input = (e) => setDefaultUrl(e.currentTarget.value);
|
|
5589
|
+
setAttribute(_el$12, "spellcheck", false);
|
|
5590
|
+
_el$15.$$input = (e) => setMcpPort(e.currentTarget.value);
|
|
5591
|
+
setAttribute(_el$15, "spellcheck", false);
|
|
5592
|
+
insert(_el$16, createComponent(Show, {
|
|
5122
5593
|
get when() {
|
|
5123
5594
|
return premiumActive();
|
|
5124
5595
|
},
|
|
5125
5596
|
get fallback() {
|
|
5126
|
-
return _tmpl$
|
|
5597
|
+
return _tmpl$15();
|
|
5127
5598
|
},
|
|
5128
5599
|
get children() {
|
|
5129
|
-
var _el$
|
|
5130
|
-
_el$
|
|
5131
|
-
createRenderEffect(() => _el$
|
|
5132
|
-
return _el$
|
|
5600
|
+
var _el$18 = _tmpl$2$2();
|
|
5601
|
+
_el$18.$$input = (e) => setMaxToolIterations(e.currentTarget.value);
|
|
5602
|
+
createRenderEffect(() => _el$18.value = maxToolIterations());
|
|
5603
|
+
return _el$18;
|
|
5133
5604
|
}
|
|
5134
|
-
}), _el$
|
|
5135
|
-
insert(_el$
|
|
5605
|
+
}), _el$19);
|
|
5606
|
+
insert(_el$19, createComponent(Show, {
|
|
5136
5607
|
get when() {
|
|
5137
5608
|
return premiumActive();
|
|
5138
5609
|
},
|
|
@@ -5144,71 +5615,71 @@ const Settings = () => {
|
|
|
5144
5615
|
return health();
|
|
5145
5616
|
},
|
|
5146
5617
|
children: (currentHealth) => (() => {
|
|
5147
|
-
var _el$
|
|
5148
|
-
_el$
|
|
5149
|
-
insert(_el$
|
|
5150
|
-
insert(_el$
|
|
5151
|
-
insert(_el$
|
|
5618
|
+
var _el$88 = _tmpl$17(), _el$89 = _el$88.firstChild, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild, _el$93 = _el$91.nextSibling;
|
|
5619
|
+
_el$93.nextSibling;
|
|
5620
|
+
insert(_el$93, () => currentHealth().mcp.status);
|
|
5621
|
+
insert(_el$90, () => currentHealth().mcp.message, null);
|
|
5622
|
+
insert(_el$88, createComponent(Show, {
|
|
5152
5623
|
get when() {
|
|
5153
5624
|
return currentHealth().mcp.endpoint;
|
|
5154
5625
|
},
|
|
5155
5626
|
children: (endpoint) => (() => {
|
|
5156
|
-
var _el$
|
|
5157
|
-
insert(_el$
|
|
5158
|
-
return _el$
|
|
5627
|
+
var _el$96 = _tmpl$18(), _el$97 = _el$96.firstChild, _el$98 = _el$97.nextSibling;
|
|
5628
|
+
insert(_el$98, endpoint);
|
|
5629
|
+
return _el$96;
|
|
5159
5630
|
})()
|
|
5160
5631
|
}), null);
|
|
5161
|
-
insert(_el$
|
|
5632
|
+
insert(_el$88, createComponent(Show, {
|
|
5162
5633
|
get when() {
|
|
5163
5634
|
return currentHealth().startupIssues.length > 0;
|
|
5164
5635
|
},
|
|
5165
5636
|
get children() {
|
|
5166
|
-
var _el$
|
|
5167
|
-
insert(_el$
|
|
5168
|
-
var _el$
|
|
5169
|
-
insert(_el$
|
|
5170
|
-
insert(_el$
|
|
5171
|
-
insert(_el$
|
|
5637
|
+
var _el$95 = _tmpl$16();
|
|
5638
|
+
insert(_el$95, () => currentHealth().startupIssues.map((issue) => (() => {
|
|
5639
|
+
var _el$99 = _tmpl$19(), _el$100 = _el$99.firstChild, _el$101 = _el$100.nextSibling;
|
|
5640
|
+
insert(_el$100, () => issue.title);
|
|
5641
|
+
insert(_el$101, () => issue.detail);
|
|
5642
|
+
insert(_el$99, createComponent(Show, {
|
|
5172
5643
|
get when() {
|
|
5173
5644
|
return issue.action;
|
|
5174
5645
|
},
|
|
5175
5646
|
children: (action) => (() => {
|
|
5176
|
-
var _el$
|
|
5177
|
-
insert(_el$
|
|
5178
|
-
return _el$
|
|
5647
|
+
var _el$102 = _tmpl$20();
|
|
5648
|
+
insert(_el$102, action);
|
|
5649
|
+
return _el$102;
|
|
5179
5650
|
})()
|
|
5180
5651
|
}), null);
|
|
5181
5652
|
createRenderEffect((_p$) => {
|
|
5182
5653
|
var _v$9 = !!(issue.severity === "warning"), _v$0 = !!(issue.severity === "error");
|
|
5183
|
-
_v$9 !== _p$.e && _el$
|
|
5184
|
-
_v$0 !== _p$.t && _el$
|
|
5654
|
+
_v$9 !== _p$.e && _el$99.classList.toggle("warning", _p$.e = _v$9);
|
|
5655
|
+
_v$0 !== _p$.t && _el$99.classList.toggle("error", _p$.t = _v$0);
|
|
5185
5656
|
return _p$;
|
|
5186
5657
|
}, {
|
|
5187
5658
|
e: void 0,
|
|
5188
5659
|
t: void 0
|
|
5189
5660
|
});
|
|
5190
|
-
return _el$
|
|
5661
|
+
return _el$99;
|
|
5191
5662
|
})()));
|
|
5192
|
-
return _el$
|
|
5663
|
+
return _el$95;
|
|
5193
5664
|
}
|
|
5194
5665
|
}), null);
|
|
5195
|
-
return _el$
|
|
5666
|
+
return _el$88;
|
|
5196
5667
|
})()
|
|
5197
|
-
}), _el$
|
|
5198
|
-
_el$
|
|
5199
|
-
setAttribute(_el$
|
|
5200
|
-
_el$
|
|
5201
|
-
_el$
|
|
5202
|
-
_el$
|
|
5203
|
-
_el$
|
|
5668
|
+
}), _el$20);
|
|
5669
|
+
_el$22.$$input = (e) => setObsidianVaultPath(e.currentTarget.value);
|
|
5670
|
+
setAttribute(_el$22, "spellcheck", false);
|
|
5671
|
+
_el$25.addEventListener("change", (e) => setAgentTranscriptMode(e.currentTarget.value));
|
|
5672
|
+
_el$28.$$click = () => setAutoRestoreSession(!autoRestoreSession());
|
|
5673
|
+
_el$31.$$click = () => setClearBookmarksOnLaunch(!clearBookmarksOnLaunch());
|
|
5674
|
+
_el$35.$$click = () => setChatEnabled(!chatEnabled());
|
|
5204
5675
|
insert(_el$2, createComponent(Show, {
|
|
5205
5676
|
get when() {
|
|
5206
5677
|
return chatEnabled();
|
|
5207
5678
|
},
|
|
5208
5679
|
get children() {
|
|
5209
5680
|
return [(() => {
|
|
5210
|
-
var _el$
|
|
5211
|
-
_el$
|
|
5681
|
+
var _el$36 = _tmpl$3$1(), _el$37 = _el$36.firstChild, _el$38 = _el$37.nextSibling;
|
|
5682
|
+
_el$38.addEventListener("change", (e) => {
|
|
5212
5683
|
const id = e.currentTarget.value;
|
|
5213
5684
|
setChatProviderId(id);
|
|
5214
5685
|
setChatModel("");
|
|
@@ -5217,99 +5688,99 @@ const Settings = () => {
|
|
|
5217
5688
|
setProviderModels([]);
|
|
5218
5689
|
setModelFetchState("idle");
|
|
5219
5690
|
});
|
|
5220
|
-
insert(_el$
|
|
5691
|
+
insert(_el$38, createComponent(For, {
|
|
5221
5692
|
each: CHAT_PROVIDERS,
|
|
5222
5693
|
children: (p) => (() => {
|
|
5223
|
-
var _el$
|
|
5224
|
-
insert(_el$
|
|
5225
|
-
createRenderEffect(() => _el$
|
|
5226
|
-
return _el$
|
|
5694
|
+
var _el$103 = _tmpl$21();
|
|
5695
|
+
insert(_el$103, () => p.name);
|
|
5696
|
+
createRenderEffect(() => _el$103.value = p.id);
|
|
5697
|
+
return _el$103;
|
|
5227
5698
|
})()
|
|
5228
5699
|
}));
|
|
5229
|
-
createRenderEffect(() => _el$
|
|
5230
|
-
return _el$
|
|
5700
|
+
createRenderEffect(() => _el$38.value = chatProviderId());
|
|
5701
|
+
return _el$36;
|
|
5231
5702
|
})(), createComponent(Show, {
|
|
5232
5703
|
get when() {
|
|
5233
5704
|
return chatProviderMeta().requiresKey;
|
|
5234
5705
|
},
|
|
5235
5706
|
get children() {
|
|
5236
|
-
var _el$
|
|
5237
|
-
_el$
|
|
5238
|
-
setAttribute(_el$
|
|
5239
|
-
createRenderEffect(() => setAttribute(_el$
|
|
5240
|
-
createRenderEffect(() => _el$
|
|
5241
|
-
return _el$
|
|
5707
|
+
var _el$39 = _tmpl$4$1(), _el$40 = _el$39.firstChild, _el$41 = _el$40.nextSibling;
|
|
5708
|
+
_el$41.$$input = (e) => setChatApiKey(e.currentTarget.value);
|
|
5709
|
+
setAttribute(_el$41, "spellcheck", false);
|
|
5710
|
+
createRenderEffect(() => setAttribute(_el$41, "placeholder", chatProviderMeta().keyPlaceholder));
|
|
5711
|
+
createRenderEffect(() => _el$41.value = chatApiKey());
|
|
5712
|
+
return _el$39;
|
|
5242
5713
|
}
|
|
5243
5714
|
}), (() => {
|
|
5244
|
-
var _el$
|
|
5245
|
-
insert(_el$
|
|
5715
|
+
var _el$42 = _tmpl$7(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling, _el$46 = _el$44.firstChild;
|
|
5716
|
+
insert(_el$44, createComponent(Show, {
|
|
5246
5717
|
get when() {
|
|
5247
5718
|
return providerModels().length > 0;
|
|
5248
5719
|
},
|
|
5249
5720
|
get fallback() {
|
|
5250
5721
|
return (() => {
|
|
5251
|
-
var _el$
|
|
5252
|
-
_el$
|
|
5253
|
-
setAttribute(_el$
|
|
5254
|
-
createRenderEffect(() => setAttribute(_el$
|
|
5255
|
-
createRenderEffect(() => _el$
|
|
5256
|
-
return _el$
|
|
5722
|
+
var _el$104 = _tmpl$22();
|
|
5723
|
+
_el$104.$$input = (e) => setChatModel(e.currentTarget.value);
|
|
5724
|
+
setAttribute(_el$104, "spellcheck", false);
|
|
5725
|
+
createRenderEffect(() => setAttribute(_el$104, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
|
|
5726
|
+
createRenderEffect(() => _el$104.value = chatModel());
|
|
5727
|
+
return _el$104;
|
|
5257
5728
|
})();
|
|
5258
5729
|
},
|
|
5259
5730
|
get children() {
|
|
5260
|
-
var _el$
|
|
5261
|
-
_el$
|
|
5262
|
-
insert(_el$
|
|
5731
|
+
var _el$45 = _tmpl$5$1();
|
|
5732
|
+
_el$45.addEventListener("change", (e) => setChatModel(e.currentTarget.value));
|
|
5733
|
+
insert(_el$45, createComponent(For, {
|
|
5263
5734
|
get each() {
|
|
5264
5735
|
return providerModels();
|
|
5265
5736
|
},
|
|
5266
5737
|
children: (m) => (() => {
|
|
5267
|
-
var _el$
|
|
5268
|
-
_el$
|
|
5269
|
-
insert(_el$
|
|
5270
|
-
return _el$
|
|
5738
|
+
var _el$105 = _tmpl$21();
|
|
5739
|
+
_el$105.value = m;
|
|
5740
|
+
insert(_el$105, m);
|
|
5741
|
+
return _el$105;
|
|
5271
5742
|
})()
|
|
5272
5743
|
}));
|
|
5273
|
-
createRenderEffect(() => _el$
|
|
5274
|
-
return _el$
|
|
5744
|
+
createRenderEffect(() => _el$45.value = chatModel());
|
|
5745
|
+
return _el$45;
|
|
5275
5746
|
}
|
|
5276
|
-
}), _el$
|
|
5277
|
-
_el$
|
|
5278
|
-
insert(_el$
|
|
5747
|
+
}), _el$46);
|
|
5748
|
+
_el$46.$$click = doFetchModels;
|
|
5749
|
+
insert(_el$42, createComponent(Show, {
|
|
5279
5750
|
get when() {
|
|
5280
5751
|
return modelFetchState() === "error";
|
|
5281
5752
|
},
|
|
5282
5753
|
get children() {
|
|
5283
|
-
return _tmpl$
|
|
5754
|
+
return _tmpl$6$1();
|
|
5284
5755
|
}
|
|
5285
5756
|
}), null);
|
|
5286
|
-
createRenderEffect(() => _el$
|
|
5287
|
-
return _el$
|
|
5757
|
+
createRenderEffect(() => _el$46.disabled = modelFetchState() === "loading");
|
|
5758
|
+
return _el$42;
|
|
5288
5759
|
})(), createComponent(Show, {
|
|
5289
5760
|
get when() {
|
|
5290
5761
|
return chatProviderMeta().needsBaseUrl || chatProviderId() === "custom";
|
|
5291
5762
|
},
|
|
5292
5763
|
get children() {
|
|
5293
|
-
var _el$
|
|
5294
|
-
_el$
|
|
5295
|
-
setAttribute(_el$
|
|
5296
|
-
createRenderEffect(() => setAttribute(_el$
|
|
5297
|
-
createRenderEffect(() => _el$
|
|
5298
|
-
return _el$
|
|
5764
|
+
var _el$48 = _tmpl$8(), _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
|
|
5765
|
+
_el$50.$$input = (e) => setChatBaseUrl(e.currentTarget.value);
|
|
5766
|
+
setAttribute(_el$50, "spellcheck", false);
|
|
5767
|
+
createRenderEffect(() => setAttribute(_el$50, "placeholder", chatProviderMeta().defaultBaseUrl ?? "https://..."));
|
|
5768
|
+
createRenderEffect(() => _el$50.value = chatBaseUrl());
|
|
5769
|
+
return _el$48;
|
|
5299
5770
|
}
|
|
5300
5771
|
})];
|
|
5301
5772
|
}
|
|
5302
|
-
}), _el$
|
|
5303
|
-
insert(_el$
|
|
5773
|
+
}), _el$51);
|
|
5774
|
+
insert(_el$52, createComponent(Show, {
|
|
5304
5775
|
get when() {
|
|
5305
5776
|
return premiumActive();
|
|
5306
5777
|
},
|
|
5307
5778
|
get fallback() {
|
|
5308
5779
|
return (() => {
|
|
5309
|
-
var _el$
|
|
5310
|
-
_el$
|
|
5311
|
-
setAttribute(_el$
|
|
5312
|
-
_el$
|
|
5780
|
+
var _el$106 = _tmpl$24(), _el$107 = _el$106.firstChild, _el$108 = _el$107.nextSibling, _el$109 = _el$108.firstChild, _el$110 = _el$109.nextSibling, _el$111 = _el$108.nextSibling;
|
|
5781
|
+
_el$109.$$input = (e) => setPremiumEmail(e.currentTarget.value);
|
|
5782
|
+
setAttribute(_el$109, "spellcheck", false);
|
|
5783
|
+
_el$110.$$click = async () => {
|
|
5313
5784
|
setPremiumLoading(true);
|
|
5314
5785
|
setPremiumMessage(null);
|
|
5315
5786
|
try {
|
|
@@ -5335,54 +5806,54 @@ const Settings = () => {
|
|
|
5335
5806
|
setPremiumLoading(false);
|
|
5336
5807
|
}
|
|
5337
5808
|
};
|
|
5338
|
-
insert(_el$
|
|
5339
|
-
_el$
|
|
5809
|
+
insert(_el$110, () => premiumLoading() ? "Checking..." : "Activate");
|
|
5810
|
+
_el$111.$$click = () => {
|
|
5340
5811
|
void window.vessel.premium.checkout(premiumEmail().trim() || void 0);
|
|
5341
5812
|
};
|
|
5342
|
-
insert(_el$
|
|
5813
|
+
insert(_el$106, createComponent(Show, {
|
|
5343
5814
|
get when() {
|
|
5344
5815
|
return premiumMessage();
|
|
5345
5816
|
},
|
|
5346
5817
|
children: (msg) => (() => {
|
|
5347
|
-
var _el$
|
|
5348
|
-
insert(_el$
|
|
5818
|
+
var _el$113 = _tmpl$25();
|
|
5819
|
+
insert(_el$113, () => msg().text);
|
|
5349
5820
|
createRenderEffect((_p$) => {
|
|
5350
5821
|
var _v$1 = !!(msg().kind === "success"), _v$10 = !!(msg().kind === "error");
|
|
5351
|
-
_v$1 !== _p$.e && _el$
|
|
5352
|
-
_v$10 !== _p$.t && _el$
|
|
5822
|
+
_v$1 !== _p$.e && _el$113.classList.toggle("success", _p$.e = _v$1);
|
|
5823
|
+
_v$10 !== _p$.t && _el$113.classList.toggle("error", _p$.t = _v$10);
|
|
5353
5824
|
return _p$;
|
|
5354
5825
|
}, {
|
|
5355
5826
|
e: void 0,
|
|
5356
5827
|
t: void 0
|
|
5357
5828
|
});
|
|
5358
|
-
return _el$
|
|
5829
|
+
return _el$113;
|
|
5359
5830
|
})()
|
|
5360
5831
|
}), null);
|
|
5361
|
-
insert(_el$
|
|
5832
|
+
insert(_el$106, createComponent(Show, {
|
|
5362
5833
|
get when() {
|
|
5363
5834
|
return premiumState().email || premiumEmail();
|
|
5364
5835
|
},
|
|
5365
5836
|
get children() {
|
|
5366
|
-
var _el$
|
|
5367
|
-
_el$
|
|
5837
|
+
var _el$112 = _tmpl$23();
|
|
5838
|
+
_el$112.$$click = async () => {
|
|
5368
5839
|
const state = await window.vessel.premium.reset();
|
|
5369
5840
|
setPremiumState(state);
|
|
5370
5841
|
setPremiumEmail("");
|
|
5371
5842
|
setPremiumMessage(null);
|
|
5372
5843
|
};
|
|
5373
|
-
return _el$
|
|
5844
|
+
return _el$112;
|
|
5374
5845
|
}
|
|
5375
5846
|
}), null);
|
|
5376
|
-
createRenderEffect(() => _el$
|
|
5377
|
-
createRenderEffect(() => _el$
|
|
5378
|
-
return _el$
|
|
5847
|
+
createRenderEffect(() => _el$110.disabled = premiumLoading() || !premiumEmail().trim());
|
|
5848
|
+
createRenderEffect(() => _el$109.value = premiumEmail());
|
|
5849
|
+
return _el$106;
|
|
5379
5850
|
})();
|
|
5380
5851
|
},
|
|
5381
5852
|
get children() {
|
|
5382
|
-
var _el$
|
|
5383
|
-
_el$
|
|
5384
|
-
var _el$
|
|
5385
|
-
insert(_el$
|
|
5853
|
+
var _el$54 = _tmpl$9(), _el$55 = _el$54.firstChild;
|
|
5854
|
+
_el$55.firstChild;
|
|
5855
|
+
var _el$57 = _el$55.nextSibling, _el$58 = _el$57.nextSibling, _el$59 = _el$58.firstChild, _el$60 = _el$59.nextSibling;
|
|
5856
|
+
insert(_el$55, createComponent(Show, {
|
|
5386
5857
|
get when() {
|
|
5387
5858
|
return premiumState().status === "trialing";
|
|
5388
5859
|
},
|
|
@@ -5390,8 +5861,8 @@ const Settings = () => {
|
|
|
5390
5861
|
return [" ", "(Trial)"];
|
|
5391
5862
|
}
|
|
5392
5863
|
}), null);
|
|
5393
|
-
insert(_el$
|
|
5394
|
-
insert(_el$
|
|
5864
|
+
insert(_el$57, () => premiumState().email, null);
|
|
5865
|
+
insert(_el$57, createComponent(Show, {
|
|
5395
5866
|
get when() {
|
|
5396
5867
|
return premiumState().expiresAt;
|
|
5397
5868
|
},
|
|
@@ -5399,50 +5870,163 @@ const Settings = () => {
|
|
|
5399
5870
|
return [" ", "· Renews", " ", memo(() => new Date(premiumState().expiresAt).toLocaleDateString())];
|
|
5400
5871
|
}
|
|
5401
5872
|
}), null);
|
|
5402
|
-
_el$
|
|
5873
|
+
_el$59.$$click = () => {
|
|
5403
5874
|
void window.vessel.premium.portal();
|
|
5404
5875
|
};
|
|
5405
|
-
_el$
|
|
5876
|
+
_el$60.$$click = async () => {
|
|
5406
5877
|
const state = await window.vessel.premium.reset();
|
|
5407
5878
|
setPremiumState(state);
|
|
5408
5879
|
setPremiumEmail("");
|
|
5409
5880
|
setPremiumMessage(null);
|
|
5410
5881
|
};
|
|
5411
|
-
return _el$
|
|
5882
|
+
return _el$54;
|
|
5412
5883
|
}
|
|
5413
5884
|
}), null);
|
|
5414
|
-
_el$
|
|
5415
|
-
|
|
5416
|
-
|
|
5885
|
+
insert(_el$63, createComponent(Show, {
|
|
5886
|
+
get when() {
|
|
5887
|
+
return !premiumActive();
|
|
5888
|
+
},
|
|
5889
|
+
get children() {
|
|
5890
|
+
return _tmpl$0();
|
|
5891
|
+
}
|
|
5892
|
+
}), null);
|
|
5893
|
+
insert(_el$62, createComponent(Show, {
|
|
5894
|
+
get when() {
|
|
5895
|
+
return premiumActive();
|
|
5896
|
+
},
|
|
5897
|
+
get fallback() {
|
|
5898
|
+
return _tmpl$26();
|
|
5899
|
+
},
|
|
5900
|
+
get children() {
|
|
5901
|
+
return [_tmpl$1(), createComponent(Show, {
|
|
5902
|
+
get when() {
|
|
5903
|
+
return vaultEntries().length > 0;
|
|
5904
|
+
},
|
|
5905
|
+
get children() {
|
|
5906
|
+
var _el$67 = _tmpl$10();
|
|
5907
|
+
insert(_el$67, createComponent(For, {
|
|
5908
|
+
get each() {
|
|
5909
|
+
return vaultEntries();
|
|
5910
|
+
},
|
|
5911
|
+
children: (entry) => (() => {
|
|
5912
|
+
var _el$115 = _tmpl$27(), _el$116 = _el$115.firstChild, _el$117 = _el$116.firstChild, _el$118 = _el$117.nextSibling, _el$119 = _el$118.firstChild, _el$120 = _el$116.nextSibling;
|
|
5913
|
+
insert(_el$117, () => entry.label);
|
|
5914
|
+
insert(_el$118, () => entry.username, _el$119);
|
|
5915
|
+
insert(_el$118, () => entry.domainPattern, null);
|
|
5916
|
+
insert(_el$118, createComponent(Show, {
|
|
5917
|
+
get when() {
|
|
5918
|
+
return entry.useCount > 0;
|
|
5919
|
+
},
|
|
5920
|
+
get children() {
|
|
5921
|
+
return [" ", "· Used ", memo(() => entry.useCount), "x"];
|
|
5922
|
+
}
|
|
5923
|
+
}), null);
|
|
5924
|
+
_el$120.$$click = () => handleVaultRemove(entry.id);
|
|
5925
|
+
return _el$115;
|
|
5926
|
+
})()
|
|
5927
|
+
}));
|
|
5928
|
+
return _el$67;
|
|
5929
|
+
}
|
|
5930
|
+
}), createComponent(Show, {
|
|
5931
|
+
get when() {
|
|
5932
|
+
return !vaultAdding();
|
|
5933
|
+
},
|
|
5934
|
+
get children() {
|
|
5935
|
+
var _el$68 = _tmpl$11();
|
|
5936
|
+
_el$68.$$click = () => {
|
|
5937
|
+
setVaultAdding(true);
|
|
5938
|
+
setVaultMessage(null);
|
|
5939
|
+
};
|
|
5940
|
+
return _el$68;
|
|
5941
|
+
}
|
|
5942
|
+
}), createComponent(Show, {
|
|
5943
|
+
get when() {
|
|
5944
|
+
return vaultAdding();
|
|
5945
|
+
},
|
|
5946
|
+
get children() {
|
|
5947
|
+
var _el$69 = _tmpl$12(), _el$70 = _el$69.firstChild, _el$71 = _el$70.nextSibling, _el$72 = _el$71.nextSibling, _el$73 = _el$72.nextSibling, _el$74 = _el$73.nextSibling, _el$75 = _el$74.nextSibling, _el$76 = _el$75.nextSibling, _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
|
|
5948
|
+
_el$70.$$input = (e) => setVaultNewLabel(e.currentTarget.value);
|
|
5949
|
+
setAttribute(_el$70, "spellcheck", false);
|
|
5950
|
+
_el$71.$$input = (e) => setVaultNewDomain(e.currentTarget.value);
|
|
5951
|
+
setAttribute(_el$71, "spellcheck", false);
|
|
5952
|
+
_el$72.$$input = (e) => setVaultNewUsername(e.currentTarget.value);
|
|
5953
|
+
setAttribute(_el$72, "spellcheck", false);
|
|
5954
|
+
_el$73.$$input = (e) => setVaultNewPassword(e.currentTarget.value);
|
|
5955
|
+
_el$74.$$input = (e) => setVaultNewTotp(e.currentTarget.value);
|
|
5956
|
+
setAttribute(_el$74, "spellcheck", false);
|
|
5957
|
+
_el$75.$$input = (e) => setVaultNewNotes(e.currentTarget.value);
|
|
5958
|
+
setAttribute(_el$75, "spellcheck", false);
|
|
5959
|
+
_el$77.$$click = handleVaultAdd;
|
|
5960
|
+
_el$78.$$click = () => {
|
|
5961
|
+
setVaultAdding(false);
|
|
5962
|
+
setVaultNewLabel("");
|
|
5963
|
+
setVaultNewDomain("");
|
|
5964
|
+
setVaultNewUsername("");
|
|
5965
|
+
setVaultNewPassword("");
|
|
5966
|
+
setVaultNewTotp("");
|
|
5967
|
+
setVaultNewNotes("");
|
|
5968
|
+
};
|
|
5969
|
+
createRenderEffect(() => _el$70.value = vaultNewLabel());
|
|
5970
|
+
createRenderEffect(() => _el$71.value = vaultNewDomain());
|
|
5971
|
+
createRenderEffect(() => _el$72.value = vaultNewUsername());
|
|
5972
|
+
createRenderEffect(() => _el$73.value = vaultNewPassword());
|
|
5973
|
+
createRenderEffect(() => _el$74.value = vaultNewTotp());
|
|
5974
|
+
createRenderEffect(() => _el$75.value = vaultNewNotes());
|
|
5975
|
+
return _el$69;
|
|
5976
|
+
}
|
|
5977
|
+
}), createComponent(Show, {
|
|
5978
|
+
get when() {
|
|
5979
|
+
return vaultMessage();
|
|
5980
|
+
},
|
|
5981
|
+
children: (msg) => (() => {
|
|
5982
|
+
var _el$121 = _tmpl$25();
|
|
5983
|
+
insert(_el$121, () => msg().text);
|
|
5984
|
+
createRenderEffect((_p$) => {
|
|
5985
|
+
var _v$11 = !!(msg().kind === "success"), _v$12 = !!(msg().kind === "error");
|
|
5986
|
+
_v$11 !== _p$.e && _el$121.classList.toggle("success", _p$.e = _v$11);
|
|
5987
|
+
_v$12 !== _p$.t && _el$121.classList.toggle("error", _p$.t = _v$12);
|
|
5988
|
+
return _p$;
|
|
5989
|
+
}, {
|
|
5990
|
+
e: void 0,
|
|
5991
|
+
t: void 0
|
|
5992
|
+
});
|
|
5993
|
+
return _el$121;
|
|
5994
|
+
})()
|
|
5995
|
+
})];
|
|
5996
|
+
}
|
|
5997
|
+
}), null);
|
|
5998
|
+
_el$82.$$click = () => setTelemetryEnabled(!telemetryEnabled());
|
|
5999
|
+
_el$84.$$click = handleSave;
|
|
6000
|
+
addEventListener(_el$85, "click", closeSettings);
|
|
5417
6001
|
insert(_el$2, createComponent(Show, {
|
|
5418
6002
|
get when() {
|
|
5419
6003
|
return status();
|
|
5420
6004
|
},
|
|
5421
6005
|
children: (currentStatus) => (() => {
|
|
5422
|
-
var _el$
|
|
5423
|
-
insert(_el$
|
|
6006
|
+
var _el$122 = _tmpl$25();
|
|
6007
|
+
insert(_el$122, () => currentStatus().text);
|
|
5424
6008
|
createRenderEffect((_p$) => {
|
|
5425
|
-
var _v$
|
|
5426
|
-
_v$
|
|
5427
|
-
_v$
|
|
6009
|
+
var _v$13 = !!(currentStatus().kind === "success"), _v$14 = !!(currentStatus().kind === "error");
|
|
6010
|
+
_v$13 !== _p$.e && _el$122.classList.toggle("success", _p$.e = _v$13);
|
|
6011
|
+
_v$14 !== _p$.t && _el$122.classList.toggle("error", _p$.t = _v$14);
|
|
5428
6012
|
return _p$;
|
|
5429
6013
|
}, {
|
|
5430
6014
|
e: void 0,
|
|
5431
6015
|
t: void 0
|
|
5432
6016
|
});
|
|
5433
|
-
return _el$
|
|
6017
|
+
return _el$122;
|
|
5434
6018
|
})()
|
|
5435
6019
|
}), null);
|
|
5436
6020
|
createRenderEffect((_p$) => {
|
|
5437
6021
|
var _v$ = !!autoRestoreSession(), _v$2 = autoRestoreSession(), _v$3 = !!clearBookmarksOnLaunch(), _v$4 = clearBookmarksOnLaunch(), _v$5 = !!chatEnabled(), _v$6 = chatEnabled(), _v$7 = !!telemetryEnabled(), _v$8 = telemetryEnabled();
|
|
5438
|
-
_v$ !== _p$.e && _el$
|
|
5439
|
-
_v$2 !== _p$.t && setAttribute(_el$
|
|
5440
|
-
_v$3 !== _p$.a && _el$
|
|
5441
|
-
_v$4 !== _p$.o && setAttribute(_el$
|
|
5442
|
-
_v$5 !== _p$.i && _el$
|
|
5443
|
-
_v$6 !== _p$.n && setAttribute(_el$
|
|
5444
|
-
_v$7 !== _p$.s && _el$
|
|
5445
|
-
_v$8 !== _p$.h && setAttribute(_el$
|
|
6022
|
+
_v$ !== _p$.e && _el$28.classList.toggle("on", _p$.e = _v$);
|
|
6023
|
+
_v$2 !== _p$.t && setAttribute(_el$28, "aria-checked", _p$.t = _v$2);
|
|
6024
|
+
_v$3 !== _p$.a && _el$31.classList.toggle("on", _p$.a = _v$3);
|
|
6025
|
+
_v$4 !== _p$.o && setAttribute(_el$31, "aria-checked", _p$.o = _v$4);
|
|
6026
|
+
_v$5 !== _p$.i && _el$35.classList.toggle("on", _p$.i = _v$5);
|
|
6027
|
+
_v$6 !== _p$.n && setAttribute(_el$35, "aria-checked", _p$.n = _v$6);
|
|
6028
|
+
_v$7 !== _p$.s && _el$82.classList.toggle("on", _p$.s = _v$7);
|
|
6029
|
+
_v$8 !== _p$.h && setAttribute(_el$82, "aria-checked", _p$.h = _v$8);
|
|
5446
6030
|
return _p$;
|
|
5447
6031
|
}, {
|
|
5448
6032
|
e: void 0,
|
|
@@ -5454,16 +6038,154 @@ const Settings = () => {
|
|
|
5454
6038
|
s: void 0,
|
|
5455
6039
|
h: void 0
|
|
5456
6040
|
});
|
|
5457
|
-
createRenderEffect(() => _el$
|
|
5458
|
-
createRenderEffect(() => _el$
|
|
5459
|
-
createRenderEffect(() => _el$
|
|
5460
|
-
createRenderEffect(() => _el$
|
|
6041
|
+
createRenderEffect(() => _el$12.value = defaultUrl());
|
|
6042
|
+
createRenderEffect(() => _el$15.value = mcpPort());
|
|
6043
|
+
createRenderEffect(() => _el$22.value = obsidianVaultPath());
|
|
6044
|
+
createRenderEffect(() => _el$25.value = agentTranscriptMode());
|
|
5461
6045
|
return _el$;
|
|
5462
|
-
})(), _tmpl$
|
|
6046
|
+
})(), _tmpl$14()];
|
|
5463
6047
|
}
|
|
5464
6048
|
});
|
|
5465
6049
|
};
|
|
5466
6050
|
delegateEvents(["click", "keydown", "input"]);
|
|
6051
|
+
var _tmpl$$1 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=keyboard-help><div class=keyboard-help-header><h2 class=keyboard-help-title>Keyboard Shortcuts</h2><button class=keyboard-help-close><kbd>Esc</kbd></button></div><div class=keyboard-help-grid>`), _tmpl$2$1 = /* @__PURE__ */ template(`<style>
|
|
6052
|
+
.keyboard-help {
|
|
6053
|
+
width: min(380px, calc(100vw - 32px));
|
|
6054
|
+
background: var(--bg-elevated);
|
|
6055
|
+
border: 1px solid var(--border-visible);
|
|
6056
|
+
border-radius: 14px;
|
|
6057
|
+
padding: 24px;
|
|
6058
|
+
box-shadow:
|
|
6059
|
+
0 4px 24px rgba(0, 0, 0, 0.2),
|
|
6060
|
+
0 24px 64px rgba(0, 0, 0, 0.3),
|
|
6061
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
6062
|
+
animation: command-bar-enter 350ms var(--ease-out-expo) both;
|
|
6063
|
+
}
|
|
6064
|
+
.keyboard-help-header {
|
|
6065
|
+
display: flex;
|
|
6066
|
+
justify-content: space-between;
|
|
6067
|
+
align-items: center;
|
|
6068
|
+
margin-bottom: 20px;
|
|
6069
|
+
}
|
|
6070
|
+
.keyboard-help-title {
|
|
6071
|
+
font-size: 15px;
|
|
6072
|
+
font-weight: 600;
|
|
6073
|
+
color: var(--text-primary);
|
|
6074
|
+
margin: 0;
|
|
6075
|
+
}
|
|
6076
|
+
.keyboard-help-close {
|
|
6077
|
+
background: transparent;
|
|
6078
|
+
border: none;
|
|
6079
|
+
cursor: pointer;
|
|
6080
|
+
padding: 0;
|
|
6081
|
+
}
|
|
6082
|
+
.keyboard-help-close kbd {
|
|
6083
|
+
background: rgba(255, 255, 255, 0.06);
|
|
6084
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
6085
|
+
padding: 2px 8px;
|
|
6086
|
+
border-radius: 4px;
|
|
6087
|
+
font-size: 11px;
|
|
6088
|
+
color: var(--text-muted);
|
|
6089
|
+
font-family: var(--font-ui);
|
|
6090
|
+
}
|
|
6091
|
+
.keyboard-help-close:hover kbd {
|
|
6092
|
+
background: rgba(255, 255, 255, 0.1);
|
|
6093
|
+
color: var(--text-secondary);
|
|
6094
|
+
}
|
|
6095
|
+
.keyboard-help-grid {
|
|
6096
|
+
display: grid;
|
|
6097
|
+
grid-template-columns: auto 1fr;
|
|
6098
|
+
gap: 10px 20px;
|
|
6099
|
+
align-items: center;
|
|
6100
|
+
}
|
|
6101
|
+
.keyboard-help-keys {
|
|
6102
|
+
display: flex;
|
|
6103
|
+
align-items: center;
|
|
6104
|
+
gap: 2px;
|
|
6105
|
+
justify-self: end;
|
|
6106
|
+
}
|
|
6107
|
+
.keyboard-help-keys kbd {
|
|
6108
|
+
display: inline-block;
|
|
6109
|
+
min-width: 24px;
|
|
6110
|
+
padding: 3px 7px;
|
|
6111
|
+
text-align: center;
|
|
6112
|
+
font-size: 11px;
|
|
6113
|
+
font-family: var(--font-mono);
|
|
6114
|
+
font-weight: 500;
|
|
6115
|
+
background: rgba(255, 255, 255, 0.06);
|
|
6116
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
6117
|
+
border-radius: 4px;
|
|
6118
|
+
color: var(--text-primary);
|
|
6119
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
|
|
6120
|
+
}
|
|
6121
|
+
.keyboard-help-plus {
|
|
6122
|
+
font-size: 10px;
|
|
6123
|
+
color: var(--text-muted);
|
|
6124
|
+
margin: 0 1px;
|
|
6125
|
+
}
|
|
6126
|
+
.keyboard-help-action {
|
|
6127
|
+
font-size: 13px;
|
|
6128
|
+
color: var(--text-secondary);
|
|
6129
|
+
}
|
|
6130
|
+
`), _tmpl$3 = /* @__PURE__ */ template(`<div class=keyboard-help-keys>`), _tmpl$4 = /* @__PURE__ */ template(`<div class=keyboard-help-action>`), _tmpl$5 = /* @__PURE__ */ template(`<kbd>`), _tmpl$6 = /* @__PURE__ */ template(`<span class=keyboard-help-plus>+`);
|
|
6131
|
+
const SHORTCUTS = [{
|
|
6132
|
+
keys: "Ctrl+L",
|
|
6133
|
+
action: "AI Command Bar"
|
|
6134
|
+
}, {
|
|
6135
|
+
keys: "Ctrl+Shift+L",
|
|
6136
|
+
action: "Toggle AI Sidebar"
|
|
6137
|
+
}, {
|
|
6138
|
+
keys: "Ctrl+Shift+F",
|
|
6139
|
+
action: "Toggle Focus Mode"
|
|
6140
|
+
}, {
|
|
6141
|
+
keys: "F12",
|
|
6142
|
+
action: "Toggle Dev Tools Panel"
|
|
6143
|
+
}, {
|
|
6144
|
+
keys: "Ctrl+T",
|
|
6145
|
+
action: "New Tab"
|
|
6146
|
+
}, {
|
|
6147
|
+
keys: "Ctrl+W",
|
|
6148
|
+
action: "Close Tab"
|
|
6149
|
+
}, {
|
|
6150
|
+
keys: "Ctrl+,",
|
|
6151
|
+
action: "Settings"
|
|
6152
|
+
}, {
|
|
6153
|
+
keys: "Ctrl+H",
|
|
6154
|
+
action: "Capture Highlight"
|
|
6155
|
+
}, {
|
|
6156
|
+
keys: "?",
|
|
6157
|
+
action: "This help overlay"
|
|
6158
|
+
}];
|
|
6159
|
+
const KeyboardHelp = (props) => {
|
|
6160
|
+
return createComponent(Show, {
|
|
6161
|
+
get when() {
|
|
6162
|
+
return props.open;
|
|
6163
|
+
},
|
|
6164
|
+
get children() {
|
|
6165
|
+
return [(() => {
|
|
6166
|
+
var _el$ = _tmpl$$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$3.nextSibling;
|
|
6167
|
+
addEventListener(_el$, "click", props.onClose);
|
|
6168
|
+
_el$2.$$click = (e) => e.stopPropagation();
|
|
6169
|
+
addEventListener(_el$5, "click", props.onClose);
|
|
6170
|
+
insert(_el$6, () => SHORTCUTS.map((s) => [(() => {
|
|
6171
|
+
var _el$8 = _tmpl$3();
|
|
6172
|
+
insert(_el$8, () => s.keys.split("+").map((k, i) => [i > 0 && _tmpl$6(), (() => {
|
|
6173
|
+
var _el$0 = _tmpl$5();
|
|
6174
|
+
insert(_el$0, k);
|
|
6175
|
+
return _el$0;
|
|
6176
|
+
})()]));
|
|
6177
|
+
return _el$8;
|
|
6178
|
+
})(), (() => {
|
|
6179
|
+
var _el$9 = _tmpl$4();
|
|
6180
|
+
insert(_el$9, () => s.action);
|
|
6181
|
+
return _el$9;
|
|
6182
|
+
})()]));
|
|
6183
|
+
return _el$;
|
|
6184
|
+
})(), _tmpl$2$1()];
|
|
6185
|
+
}
|
|
6186
|
+
});
|
|
6187
|
+
};
|
|
6188
|
+
delegateEvents(["click"]);
|
|
5467
6189
|
function setupKeybindings(handlers) {
|
|
5468
6190
|
const listener = (e) => {
|
|
5469
6191
|
const ctrl = e.ctrlKey || e.metaKey;
|
|
@@ -5507,6 +6229,14 @@ function setupKeybindings(handlers) {
|
|
|
5507
6229
|
handlers.toggleDevTools?.();
|
|
5508
6230
|
return;
|
|
5509
6231
|
}
|
|
6232
|
+
if (e.key === "?" && !ctrl && !e.altKey) {
|
|
6233
|
+
const tag = e.target?.tagName;
|
|
6234
|
+
if (tag !== "INPUT" && tag !== "TEXTAREA" && !e.target?.isContentEditable) {
|
|
6235
|
+
e.preventDefault();
|
|
6236
|
+
handlers.toggleKeyboardHelp?.();
|
|
6237
|
+
return;
|
|
6238
|
+
}
|
|
6239
|
+
}
|
|
5510
6240
|
};
|
|
5511
6241
|
document.addEventListener("keydown", listener);
|
|
5512
6242
|
return () => document.removeEventListener("keydown", listener);
|
|
@@ -5528,6 +6258,7 @@ const App = () => {
|
|
|
5528
6258
|
activeTab
|
|
5529
6259
|
} = useTabs();
|
|
5530
6260
|
const [highlightToast, setHighlightToast] = createSignal(null);
|
|
6261
|
+
const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
|
|
5531
6262
|
const captureHighlight = async () => {
|
|
5532
6263
|
try {
|
|
5533
6264
|
const result = await window.vessel.highlights.capture();
|
|
@@ -5579,7 +6310,8 @@ const App = () => {
|
|
|
5579
6310
|
captureHighlight,
|
|
5580
6311
|
toggleDevTools: () => {
|
|
5581
6312
|
window.vessel.devtoolsPanel.toggle();
|
|
5582
|
-
}
|
|
6313
|
+
},
|
|
6314
|
+
toggleKeyboardHelp: () => setKeyboardHelpOpen((v) => !v)
|
|
5583
6315
|
});
|
|
5584
6316
|
const cleanupCapture = window.vessel.highlights.onCaptureResult(showHighlightResult);
|
|
5585
6317
|
onCleanup(() => {
|
|
@@ -5618,6 +6350,12 @@ const App = () => {
|
|
|
5618
6350
|
}), null);
|
|
5619
6351
|
insert(_el$, createComponent(CommandBar, {}), null);
|
|
5620
6352
|
insert(_el$, createComponent(Settings, {}), null);
|
|
6353
|
+
insert(_el$, createComponent(KeyboardHelp, {
|
|
6354
|
+
get open() {
|
|
6355
|
+
return keyboardHelpOpen();
|
|
6356
|
+
},
|
|
6357
|
+
onClose: () => setKeyboardHelpOpen(false)
|
|
6358
|
+
}), null);
|
|
5621
6359
|
createRenderEffect(() => _el$.classList.toggle("focus-mode", !!focusMode2()));
|
|
5622
6360
|
return _el$;
|
|
5623
6361
|
})();
|