@quanta-intellect/vessel-browser 0.1.90 → 0.1.94
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.
|
@@ -1466,8 +1466,8 @@ function Dynamic(props) {
|
|
|
1466
1466
|
const [, others] = splitProps(props, ["component"]);
|
|
1467
1467
|
return createDynamic(() => props.component, others);
|
|
1468
1468
|
}
|
|
1469
|
-
var _tmpl$$
|
|
1470
|
-
const TitleBar = () => {
|
|
1469
|
+
var _tmpl$$q = /* @__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=Downloads>↓</button><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>`);
|
|
1470
|
+
const TitleBar = (props) => {
|
|
1471
1471
|
const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
|
|
1472
1472
|
const [mcpStatus, setMcpStatus] = createSignal("starting");
|
|
1473
1473
|
const [mcpTooltip, setMcpTooltip] = createSignal("MCP: starting...");
|
|
@@ -1499,11 +1499,12 @@ const TitleBar = () => {
|
|
|
1499
1499
|
window.vessel.ui.setSettingsVisibility(true);
|
|
1500
1500
|
};
|
|
1501
1501
|
return (() => {
|
|
1502
|
-
var _el$ = _tmpl$$
|
|
1502
|
+
var _el$ = _tmpl$$q(), _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, _el$9 = _el$8.nextSibling;
|
|
1503
1503
|
_el$4.$$click = handleMcpClick;
|
|
1504
|
-
_el$6.$$click = () =>
|
|
1505
|
-
_el$7.$$click = () => window.vessel.window.
|
|
1506
|
-
_el$8.$$click = () => window.vessel.window.
|
|
1504
|
+
_el$6.$$click = () => props.onOpenDownloads?.();
|
|
1505
|
+
_el$7.$$click = () => window.vessel.window.minimize();
|
|
1506
|
+
_el$8.$$click = () => window.vessel.window.maximize();
|
|
1507
|
+
_el$9.$$click = () => window.vessel.window.close();
|
|
1507
1508
|
createRenderEffect((_p$) => {
|
|
1508
1509
|
var _v$ = !!(mcpStatus() === "ready"), _v$2 = !!(mcpStatus() === "error"), _v$3 = !!(mcpStatus() === "starting" || mcpStatus() === "stopped"), _v$4 = mcpTooltip();
|
|
1509
1510
|
_v$ !== _p$.e && _el$4.classList.toggle("mcp-ready", _p$.e = _v$);
|
|
@@ -1540,7 +1541,7 @@ var LucideContext = createContext({
|
|
|
1540
1541
|
absoluteStrokeWidth: false,
|
|
1541
1542
|
class: ""
|
|
1542
1543
|
});
|
|
1543
|
-
var _tmpl$$
|
|
1544
|
+
var _tmpl$$p = /* @__PURE__ */ template(`<svg>`);
|
|
1544
1545
|
var hasA11yProp = (props) => {
|
|
1545
1546
|
for (const prop in props) {
|
|
1546
1547
|
if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
|
|
@@ -1562,7 +1563,7 @@ var Icon = (props) => {
|
|
|
1562
1563
|
const [localProps, rest] = splitProps(props, ["color", "size", "strokeWidth", "children", "class", "name", "iconNode", "absoluteStrokeWidth"]);
|
|
1563
1564
|
const globalProps = useContext(LucideContext);
|
|
1564
1565
|
return (() => {
|
|
1565
|
-
var _el$ = _tmpl$$
|
|
1566
|
+
var _el$ = _tmpl$$p();
|
|
1566
1567
|
spread(_el$, mergeProps(defaultAttributes_default, {
|
|
1567
1568
|
get width() {
|
|
1568
1569
|
return localProps.size ?? globalProps.size ?? defaultAttributes_default.width;
|
|
@@ -2295,7 +2296,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
|
|
|
2295
2296
|
}
|
|
2296
2297
|
return "idle";
|
|
2297
2298
|
}
|
|
2298
|
-
var _tmpl$$
|
|
2299
|
+
var _tmpl$$o = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$n = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$k = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list></div><div class=tab-actions><button class=tab-new data-tooltip="New window"data-tooltip-pos=left></button><button class=tab-new data-tooltip="Add active tab to group"data-tooltip-pos=left></button><button class=tab-new data-tooltip="New tab"data-tooltip-pos=left></button><button class="tab-new tab-new-private"data-tooltip="Private window"data-tooltip-pos=left><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11z">`), _tmpl$4$k = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$h = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$f = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$c = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$9 = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$7 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$6 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$6 = /* @__PURE__ */ template(`<span class=tab-loading>`);
|
|
2299
2300
|
const TAB_CLOSE_MS = 200;
|
|
2300
2301
|
function stringToHue(str) {
|
|
2301
2302
|
let hash = 0;
|
|
@@ -2322,14 +2323,14 @@ const TabFavicon = (props) => {
|
|
|
2322
2323
|
},
|
|
2323
2324
|
get fallback() {
|
|
2324
2325
|
return (() => {
|
|
2325
|
-
var _el$2 = _tmpl$2$
|
|
2326
|
+
var _el$2 = _tmpl$2$n();
|
|
2326
2327
|
insert(_el$2, letter);
|
|
2327
2328
|
createRenderEffect((_$p) => setStyleProperty(_el$2, "--favicon-hue", `${hue()}`));
|
|
2328
2329
|
return _el$2;
|
|
2329
2330
|
})();
|
|
2330
2331
|
},
|
|
2331
2332
|
get children() {
|
|
2332
|
-
var _el$ = _tmpl$$
|
|
2333
|
+
var _el$ = _tmpl$$o();
|
|
2333
2334
|
_el$.addEventListener("error", () => setFailed(true));
|
|
2334
2335
|
createRenderEffect(() => setAttribute(_el$, "src", props.favicon));
|
|
2335
2336
|
return _el$;
|
|
@@ -2389,7 +2390,7 @@ const TabBar = () => {
|
|
|
2389
2390
|
}, TAB_CLOSE_MS);
|
|
2390
2391
|
};
|
|
2391
2392
|
return (() => {
|
|
2392
|
-
var _el$3 = _tmpl$3$
|
|
2393
|
+
var _el$3 = _tmpl$3$k(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling;
|
|
2393
2394
|
insert(_el$4, createComponent(For, {
|
|
2394
2395
|
get each() {
|
|
2395
2396
|
return tabEntries();
|
|
@@ -2400,7 +2401,7 @@ const TabBar = () => {
|
|
|
2400
2401
|
},
|
|
2401
2402
|
get fallback() {
|
|
2402
2403
|
return memo(() => entry.type === "group")() && (() => {
|
|
2403
|
-
var _el$0 = _tmpl$4$
|
|
2404
|
+
var _el$0 = _tmpl$4$k(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
|
|
2404
2405
|
_el$0.$$contextmenu = (e) => {
|
|
2405
2406
|
e.preventDefault();
|
|
2406
2407
|
window.vessel.tabs.showGroupContextMenu(entry.groupId);
|
|
@@ -2426,7 +2427,7 @@ const TabBar = () => {
|
|
|
2426
2427
|
return memo(() => entry.type === "tab")() && (() => {
|
|
2427
2428
|
const tab = entry.tab;
|
|
2428
2429
|
return (() => {
|
|
2429
|
-
var _el$12 = _tmpl$6$
|
|
2430
|
+
var _el$12 = _tmpl$6$f();
|
|
2430
2431
|
_el$12.$$contextmenu = (e) => {
|
|
2431
2432
|
e.preventDefault();
|
|
2432
2433
|
window.vessel.tabs.showContextMenu(tab.id);
|
|
@@ -2451,7 +2452,7 @@ const TabBar = () => {
|
|
|
2451
2452
|
return memo(() => !!tab.isPinned)() && (tab.isAudible || tab.isMuted);
|
|
2452
2453
|
},
|
|
2453
2454
|
get children() {
|
|
2454
|
-
var _el$13 = _tmpl$5$
|
|
2455
|
+
var _el$13 = _tmpl$5$h();
|
|
2455
2456
|
_el$13.$$click = (e) => {
|
|
2456
2457
|
e.stopPropagation();
|
|
2457
2458
|
void toggleMute(tab.id);
|
|
@@ -2555,7 +2556,7 @@ const TabBar = () => {
|
|
|
2555
2556
|
})();
|
|
2556
2557
|
};
|
|
2557
2558
|
delegateEvents(["click", "contextmenu"]);
|
|
2558
|
-
var _tmpl$$m = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More`), _tmpl$
|
|
2559
|
+
var _tmpl$$n = /* @__PURE__ */ template(`<button class=security-popup-link>Reset permissions for this site`), _tmpl$2$m = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More</button><div class=security-popup-section><div class=security-popup-section-title>Site permissions`), _tmpl$3$j = /* @__PURE__ */ template(`<p class=security-popup-muted>No saved permission decisions for this site.`), _tmpl$4$j = /* @__PURE__ */ template(`<div class=security-popup-permission-row><span></span><strong>`), _tmpl$5$g = /* @__PURE__ */ template(`<div class=security-popup-actions><button class=security-popup-action-proceed>Proceed Anyway</button><button class=security-popup-action-back>Go Back to Safety`);
|
|
2559
2560
|
const SecurityPopup = (props) => {
|
|
2560
2561
|
const statusText = () => {
|
|
2561
2562
|
switch (props.state.status) {
|
|
@@ -2569,6 +2570,21 @@ const SecurityPopup = (props) => {
|
|
|
2569
2570
|
return "No security information available.";
|
|
2570
2571
|
}
|
|
2571
2572
|
};
|
|
2573
|
+
const [permissions, setPermissions] = createSignal([]);
|
|
2574
|
+
const origin = createMemo(() => {
|
|
2575
|
+
try {
|
|
2576
|
+
return new URL(props.state.url).origin;
|
|
2577
|
+
} catch {
|
|
2578
|
+
return "";
|
|
2579
|
+
}
|
|
2580
|
+
});
|
|
2581
|
+
const sitePermissions = createMemo(() => permissions().filter((item) => item.origin === origin()));
|
|
2582
|
+
const loadPermissions = async () => {
|
|
2583
|
+
try {
|
|
2584
|
+
setPermissions(await window.vessel.permissions.getAll());
|
|
2585
|
+
} catch {
|
|
2586
|
+
}
|
|
2587
|
+
};
|
|
2572
2588
|
const handleLearnMore = () => {
|
|
2573
2589
|
window.vessel.security.showDetails(props.state);
|
|
2574
2590
|
props.onClose();
|
|
@@ -2582,6 +2598,7 @@ const SecurityPopup = (props) => {
|
|
|
2582
2598
|
props.onClose();
|
|
2583
2599
|
};
|
|
2584
2600
|
onMount(() => {
|
|
2601
|
+
void loadPermissions();
|
|
2585
2602
|
const handleClickOutside = (e) => {
|
|
2586
2603
|
const target = e.target;
|
|
2587
2604
|
if (!target.closest(".security-indicator-wrapper")) {
|
|
@@ -2592,17 +2609,47 @@ const SecurityPopup = (props) => {
|
|
|
2592
2609
|
onCleanup(() => document.removeEventListener("click", handleClickOutside, true));
|
|
2593
2610
|
});
|
|
2594
2611
|
return (() => {
|
|
2595
|
-
var _el$ = _tmpl
|
|
2612
|
+
var _el$ = _tmpl$2$m(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling;
|
|
2613
|
+
_el$5.firstChild;
|
|
2596
2614
|
_el$.$$click = (e) => e.stopPropagation();
|
|
2597
2615
|
insert(_el$3, statusText);
|
|
2598
2616
|
_el$4.$$click = handleLearnMore;
|
|
2617
|
+
insert(_el$5, createComponent(Show, {
|
|
2618
|
+
get when() {
|
|
2619
|
+
return sitePermissions().length > 0;
|
|
2620
|
+
},
|
|
2621
|
+
get fallback() {
|
|
2622
|
+
return _tmpl$3$j();
|
|
2623
|
+
},
|
|
2624
|
+
get children() {
|
|
2625
|
+
return [createComponent(For, {
|
|
2626
|
+
get each() {
|
|
2627
|
+
return sitePermissions();
|
|
2628
|
+
},
|
|
2629
|
+
children: (item) => (() => {
|
|
2630
|
+
var _el$9 = _tmpl$4$j(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
|
|
2631
|
+
insert(_el$0, () => item.permission);
|
|
2632
|
+
insert(_el$1, () => item.decision);
|
|
2633
|
+
createRenderEffect(() => className(_el$1, item.decision));
|
|
2634
|
+
return _el$9;
|
|
2635
|
+
})()
|
|
2636
|
+
}), (() => {
|
|
2637
|
+
var _el$7 = _tmpl$$n();
|
|
2638
|
+
_el$7.$$click = async () => {
|
|
2639
|
+
await window.vessel.permissions.clearOrigin(origin());
|
|
2640
|
+
await loadPermissions();
|
|
2641
|
+
};
|
|
2642
|
+
return _el$7;
|
|
2643
|
+
})()];
|
|
2644
|
+
}
|
|
2645
|
+
}), null);
|
|
2599
2646
|
insert(_el$2, (() => {
|
|
2600
2647
|
var _c$ = memo(() => !!props.state.canProceed);
|
|
2601
2648
|
return () => _c$() && (() => {
|
|
2602
|
-
var _el$
|
|
2603
|
-
_el$
|
|
2604
|
-
_el$
|
|
2605
|
-
return _el$
|
|
2649
|
+
var _el$10 = _tmpl$5$g(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
|
|
2650
|
+
_el$11.$$click = handleProceedAnyway;
|
|
2651
|
+
_el$12.$$click = handleGoBackToSafety;
|
|
2652
|
+
return _el$10;
|
|
2606
2653
|
})();
|
|
2607
2654
|
})(), null);
|
|
2608
2655
|
return _el$;
|
|
@@ -2951,7 +2998,7 @@ const SEARCH_ENGINE_PRESETS = {
|
|
|
2951
2998
|
ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
|
|
2952
2999
|
kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
|
|
2953
3000
|
};
|
|
2954
|
-
var _tmpl$$
|
|
3001
|
+
var _tmpl$$m = /* @__PURE__ */ template(`<div class=private-badge title="Private Browsing - history and cookies are not saved"><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11zM5.5 7a1.5 1.5 0 103 0 1.5 1.5 0 00-3 0zm3.5 3.5c0-1-1.5-2-2.5-2s-2.5 1-2.5 2"></path></svg><span>Private`), _tmpl$2$l = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z">`), _tmpl$3$i = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.5>`), _tmpl$4$i = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$f = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$e = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$b = /* @__PURE__ */ template(`<button class="agent-status-badge recent"title="Open the What Changed timeline"style=cursor:pointer;font-size:11px><span class=agent-status-dot aria-hidden=true style=background:#f59e0b></span><span class=agent-status-text>What Changed?`), _tmpl$8$8 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$6 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$5 = /* @__PURE__ */ template(`<div class=page-diff-popup><div class=page-diff-popup-header><div class=page-diff-popup-header-copy><span>Compared with your last visit</span><span class=page-diff-burst-meta>Previous snapshot from </span></div><div style=display:flex;gap:8px;align-items:center><button class=nav-btn title="Open the full What Changed timeline"style="height:24px;min-width:auto;padding:0 8px">Timeline</button><button class=page-diff-popup-close>×`), _tmpl$1$5 = /* @__PURE__ */ template(`<svg><path d="M3 3 L11 3 L11 9 Q7 13 3 9 Z"fill=none stroke=currentColor stroke-width=1.2 stroke-linejoin=round></svg>`, false, true, false), _tmpl$10$5 = /* @__PURE__ */ template(`<svg><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.4 stroke-linecap=round></svg>`, false, true, false), _tmpl$11$5 = /* @__PURE__ */ template(`<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>`), _tmpl$12$5 = /* @__PURE__ */ template(`<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>`), _tmpl$13$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$4 = /* @__PURE__ */ template(`<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>`), _tmpl$15$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$3 = /* @__PURE__ */ template(`<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>`), _tmpl$17$3 = /* @__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"autocomplete=off aria-autocomplete=list aria-controls=address-autocomplete></form></div><div class=toolbar-actions><button class=nav-btn><svg width=14 height=14 viewBox="0 0 14 14">`), _tmpl$18$3 = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><circle cx=7 cy=8 r=0.8 fill=white>`), _tmpl$19$3 = /* @__PURE__ */ template(`<div role=option><span class=autocomplete-icon></span><span class=autocomplete-text><span class=autocomplete-title></span><span class=autocomplete-url>`), _tmpl$20$3 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$3 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$3 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$25$3 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$26$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$27$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$28$3 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><div class=page-diff-badges><span class=page-diff-kind></span><span class=page-diff-section></span></div><span class=page-diff-summary>`), _tmpl$29$2 = /* @__PURE__ */ template(`<li>`);
|
|
2955
3002
|
const AddressBar = (props) => {
|
|
2956
3003
|
const {
|
|
2957
3004
|
activeTab,
|
|
@@ -3006,6 +3053,21 @@ const AddressBar = (props) => {
|
|
|
3006
3053
|
return engine === "none" ? SEARCH_ENGINE_PRESETS.duckduckgo : SEARCH_ENGINE_PRESETS[engine];
|
|
3007
3054
|
});
|
|
3008
3055
|
const buildSearchUrl = (query) => searchEnginePreset().url + encodeURIComponent(query);
|
|
3056
|
+
const looksLikeUrl = (value) => {
|
|
3057
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(value)) return true;
|
|
3058
|
+
if (/^(about|file|data|javascript):/i.test(value)) return true;
|
|
3059
|
+
if (/^localhost(:\d+)?([/?#]|$)/i.test(value)) return true;
|
|
3060
|
+
if (/^\d{1,3}(\.\d{1,3}){3}(:\d+)?([/?#]|$)/.test(value)) return true;
|
|
3061
|
+
return /^[^\s]+\.[^\s]{2,}([/?#].*)?$/i.test(value);
|
|
3062
|
+
};
|
|
3063
|
+
const resolveAddressInput = (value) => {
|
|
3064
|
+
const trimmed = value.trim();
|
|
3065
|
+
if (!trimmed) return trimmed;
|
|
3066
|
+
if (searchEngine() !== "none" && !looksLikeUrl(trimmed)) {
|
|
3067
|
+
return buildSearchUrl(trimmed);
|
|
3068
|
+
}
|
|
3069
|
+
return trimmed;
|
|
3070
|
+
};
|
|
3009
3071
|
const [pageDiff, setPageDiff] = createSignal(null);
|
|
3010
3072
|
const [diffExpanded, setDiffExpanded] = createSignal(false);
|
|
3011
3073
|
let diffCollapseTimer = null;
|
|
@@ -3202,7 +3264,7 @@ const AddressBar = (props) => {
|
|
|
3202
3264
|
selectSuggestion(items[idx].url);
|
|
3203
3265
|
} else {
|
|
3204
3266
|
const val = inputValue().trim();
|
|
3205
|
-
if (val) commitAddressNavigation(val);
|
|
3267
|
+
if (val) commitAddressNavigation(resolveAddressInput(val));
|
|
3206
3268
|
}
|
|
3207
3269
|
};
|
|
3208
3270
|
const handleInputKeyDown = (e) => {
|
|
@@ -3239,7 +3301,7 @@ const AddressBar = (props) => {
|
|
|
3239
3301
|
insert(_el$, createComponent(Show, {
|
|
3240
3302
|
when: isPrivateWindow,
|
|
3241
3303
|
get children() {
|
|
3242
|
-
return _tmpl$$
|
|
3304
|
+
return _tmpl$$m();
|
|
3243
3305
|
}
|
|
3244
3306
|
}), _el$11);
|
|
3245
3307
|
insert(_el$, createComponent(Show, {
|
|
@@ -3247,7 +3309,7 @@ const AddressBar = (props) => {
|
|
|
3247
3309
|
return memo(() => !!securityState()?.status)() && securityState()?.status !== "none";
|
|
3248
3310
|
},
|
|
3249
3311
|
get children() {
|
|
3250
|
-
var _el$7 = _tmpl$4$
|
|
3312
|
+
var _el$7 = _tmpl$4$i(), _el$8 = _el$7.firstChild;
|
|
3251
3313
|
_el$8.$$click = () => setShowSecurityPopup((prev) => !prev);
|
|
3252
3314
|
insert(_el$8, createComponent(Switch, {
|
|
3253
3315
|
get fallback() {
|
|
@@ -3263,7 +3325,7 @@ const AddressBar = (props) => {
|
|
|
3263
3325
|
return securityState()?.status === "secure";
|
|
3264
3326
|
},
|
|
3265
3327
|
get children() {
|
|
3266
|
-
var _el$9 = _tmpl$2$
|
|
3328
|
+
var _el$9 = _tmpl$2$l();
|
|
3267
3329
|
_el$9.firstChild;
|
|
3268
3330
|
return _el$9;
|
|
3269
3331
|
}
|
|
@@ -3272,7 +3334,7 @@ const AddressBar = (props) => {
|
|
|
3272
3334
|
return securityState()?.status === "insecure";
|
|
3273
3335
|
},
|
|
3274
3336
|
get children() {
|
|
3275
|
-
var _el$1 = _tmpl$3$
|
|
3337
|
+
var _el$1 = _tmpl$3$i();
|
|
3276
3338
|
_el$1.firstChild;
|
|
3277
3339
|
return _el$1;
|
|
3278
3340
|
}
|
|
@@ -3332,7 +3394,7 @@ const AddressBar = (props) => {
|
|
|
3332
3394
|
return memo(() => !!showSuggestions())() && suggestions().length > 0;
|
|
3333
3395
|
},
|
|
3334
3396
|
get children() {
|
|
3335
|
-
var _el$14 = _tmpl$5$
|
|
3397
|
+
var _el$14 = _tmpl$5$f();
|
|
3336
3398
|
insert(_el$14, createComponent(For, {
|
|
3337
3399
|
get each() {
|
|
3338
3400
|
return suggestions();
|
|
@@ -3370,7 +3432,7 @@ const AddressBar = (props) => {
|
|
|
3370
3432
|
insert(_el$11, createComponent(Show, {
|
|
3371
3433
|
when: !isPrivateWindow,
|
|
3372
3434
|
get children() {
|
|
3373
|
-
var _el$15 = _tmpl$6$
|
|
3435
|
+
var _el$15 = _tmpl$6$e(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
|
|
3374
3436
|
insert(_el$17, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
|
|
3375
3437
|
createRenderEffect((_p$) => {
|
|
3376
3438
|
var _v$3 = `agent-status-badge ${agentPresence()}`, _v$4 = agentStatusMessage() || (agentPresence() === "active" ? "Agent is actively using the browser" : agentPresence() === "recent" ? "Agent is connected" : "No agent connection detected");
|
|
@@ -3466,7 +3528,7 @@ const AddressBar = (props) => {
|
|
|
3466
3528
|
return pageDiff().changes;
|
|
3467
3529
|
},
|
|
3468
3530
|
children: (change) => (() => {
|
|
3469
|
-
var _el$61 = _tmpl$28$
|
|
3531
|
+
var _el$61 = _tmpl$28$3(), _el$62 = _el$61.firstChild, _el$63 = _el$62.firstChild, _el$64 = _el$63.firstChild, _el$65 = _el$64.nextSibling, _el$66 = _el$63.nextSibling;
|
|
3470
3532
|
insert(_el$64, () => getChangeKindLabel(change.kind));
|
|
3471
3533
|
insert(_el$65, () => formatSectionLabel(change.section));
|
|
3472
3534
|
insert(_el$66, () => change.summary);
|
|
@@ -3653,7 +3715,7 @@ const AddressBar = (props) => {
|
|
|
3653
3715
|
})();
|
|
3654
3716
|
};
|
|
3655
3717
|
delegateEvents(["click", "input", "keydown", "mousedown"]);
|
|
3656
|
-
var _tmpl$$
|
|
3718
|
+
var _tmpl$$l = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$k = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
|
|
3657
3719
|
const TOAST_DURATION_MS$1 = 4200;
|
|
3658
3720
|
const TOAST_EXIT_MS$2 = 300;
|
|
3659
3721
|
function isBookmarkToastCandidate(action) {
|
|
@@ -3713,13 +3775,13 @@ const BookmarkNotifications = () => {
|
|
|
3713
3775
|
timeoutIds.clear();
|
|
3714
3776
|
});
|
|
3715
3777
|
return (() => {
|
|
3716
|
-
var _el$ = _tmpl$$
|
|
3778
|
+
var _el$ = _tmpl$$l();
|
|
3717
3779
|
insert(_el$, createComponent(For, {
|
|
3718
3780
|
get each() {
|
|
3719
3781
|
return toasts();
|
|
3720
3782
|
},
|
|
3721
3783
|
children: (toast) => (() => {
|
|
3722
|
-
var _el$2 = _tmpl$2$
|
|
3784
|
+
var _el$2 = _tmpl$2$k(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
3723
3785
|
insert(_el$3, () => toast.title);
|
|
3724
3786
|
insert(_el$4, () => toast.message);
|
|
3725
3787
|
createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!toast.leaving));
|
|
@@ -3729,7 +3791,7 @@ const BookmarkNotifications = () => {
|
|
|
3729
3791
|
return _el$;
|
|
3730
3792
|
})();
|
|
3731
3793
|
};
|
|
3732
|
-
var _tmpl$$
|
|
3794
|
+
var _tmpl$$k = /* @__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>`);
|
|
3733
3795
|
const TOAST_DURATION_MS = 3e3;
|
|
3734
3796
|
const TOAST_EXIT_MS$1 = 300;
|
|
3735
3797
|
const HighlightNotifications = (props) => {
|
|
@@ -3768,7 +3830,7 @@ const HighlightNotifications = (props) => {
|
|
|
3768
3830
|
return memo(() => !!visible())() && current();
|
|
3769
3831
|
},
|
|
3770
3832
|
get children() {
|
|
3771
|
-
var _el$ = _tmpl$$
|
|
3833
|
+
var _el$ = _tmpl$$k(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
|
|
3772
3834
|
insert(_el$3, () => current().title);
|
|
3773
3835
|
insert(_el$4, () => current().message);
|
|
3774
3836
|
createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!leaving()));
|
|
@@ -3776,10 +3838,10 @@ const HighlightNotifications = (props) => {
|
|
|
3776
3838
|
}
|
|
3777
3839
|
});
|
|
3778
3840
|
};
|
|
3779
|
-
var _tmpl$$
|
|
3841
|
+
var _tmpl$$j = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$j = /* @__PURE__ */ template(`<span class=download-toast-done>✓`), _tmpl$3$h = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$h = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$e = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$d = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$a = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
|
|
3780
3842
|
const TOAST_DONE_DURATION_MS = 4200;
|
|
3781
3843
|
const TOAST_EXIT_MS = 300;
|
|
3782
|
-
function formatBytes(bytes) {
|
|
3844
|
+
function formatBytes$1(bytes) {
|
|
3783
3845
|
if (bytes <= 0) return "";
|
|
3784
3846
|
const units = ["B", "KB", "MB", "GB"];
|
|
3785
3847
|
let i = 0;
|
|
@@ -3867,7 +3929,7 @@ const DownloadToast = () => {
|
|
|
3867
3929
|
return Math.min(100, Math.round(d.receivedBytes / d.totalBytes * 100));
|
|
3868
3930
|
};
|
|
3869
3931
|
return (() => {
|
|
3870
|
-
var _el$ = _tmpl$$
|
|
3932
|
+
var _el$ = _tmpl$$j();
|
|
3871
3933
|
insert(_el$, createComponent(For, {
|
|
3872
3934
|
get each() {
|
|
3873
3935
|
return downloads();
|
|
@@ -3880,7 +3942,7 @@ const DownloadToast = () => {
|
|
|
3880
3942
|
return dl.state === "completed";
|
|
3881
3943
|
},
|
|
3882
3944
|
get children() {
|
|
3883
|
-
return _tmpl$2$
|
|
3945
|
+
return _tmpl$2$j();
|
|
3884
3946
|
}
|
|
3885
3947
|
}), null);
|
|
3886
3948
|
insert(_el$3, createComponent(Show, {
|
|
@@ -3888,7 +3950,7 @@ const DownloadToast = () => {
|
|
|
3888
3950
|
return dl.state === "cancelled" || dl.state === "interrupted";
|
|
3889
3951
|
},
|
|
3890
3952
|
get children() {
|
|
3891
|
-
return _tmpl$3$
|
|
3953
|
+
return _tmpl$3$h();
|
|
3892
3954
|
}
|
|
3893
3955
|
}), null);
|
|
3894
3956
|
insert(_el$2, createComponent(Show, {
|
|
@@ -3897,18 +3959,18 @@ const DownloadToast = () => {
|
|
|
3897
3959
|
},
|
|
3898
3960
|
get children() {
|
|
3899
3961
|
return [(() => {
|
|
3900
|
-
var _el$7 = _tmpl$4$
|
|
3962
|
+
var _el$7 = _tmpl$4$h(), _el$8 = _el$7.firstChild;
|
|
3901
3963
|
createRenderEffect((_$p) => setStyleProperty(_el$8, "width", `${progressPercent(dl)}%`));
|
|
3902
3964
|
return _el$7;
|
|
3903
3965
|
})(), (() => {
|
|
3904
|
-
var _el$9 = _tmpl$5$
|
|
3905
|
-
insert(_el$9, () => formatBytes(dl.receivedBytes), null);
|
|
3966
|
+
var _el$9 = _tmpl$5$e();
|
|
3967
|
+
insert(_el$9, () => formatBytes$1(dl.receivedBytes), null);
|
|
3906
3968
|
insert(_el$9, createComponent(Show, {
|
|
3907
3969
|
get when() {
|
|
3908
3970
|
return dl.totalBytes > 0;
|
|
3909
3971
|
},
|
|
3910
3972
|
get children() {
|
|
3911
|
-
return [" / ", memo(() => formatBytes(dl.totalBytes))];
|
|
3973
|
+
return [" / ", memo(() => formatBytes$1(dl.totalBytes))];
|
|
3912
3974
|
}
|
|
3913
3975
|
}), null);
|
|
3914
3976
|
return _el$9;
|
|
@@ -3920,8 +3982,8 @@ const DownloadToast = () => {
|
|
|
3920
3982
|
return dl.state === "completed";
|
|
3921
3983
|
},
|
|
3922
3984
|
get children() {
|
|
3923
|
-
var _el$0 = _tmpl$6$
|
|
3924
|
-
insert(_el$0, () => formatBytes(dl.receivedBytes), _el$1);
|
|
3985
|
+
var _el$0 = _tmpl$6$d(), _el$1 = _el$0.firstChild;
|
|
3986
|
+
insert(_el$0, () => formatBytes$1(dl.receivedBytes), _el$1);
|
|
3925
3987
|
return _el$0;
|
|
3926
3988
|
}
|
|
3927
3989
|
}), null);
|
|
@@ -3932,6 +3994,78 @@ const DownloadToast = () => {
|
|
|
3932
3994
|
return _el$;
|
|
3933
3995
|
})();
|
|
3934
3996
|
};
|
|
3997
|
+
var _tmpl$$i = /* @__PURE__ */ template(`<div class=modal-backdrop><div class=downloads-panel><div class=downloads-panel-header><div><h2>Downloads</h2><p>Recent files saved by Vessel</p></div><div class=downloads-panel-actions><button>Clear</button><button>Close</button></div></div><div class=downloads-panel-list>`), _tmpl$2$i = /* @__PURE__ */ template(`<div class=downloads-empty>No downloads yet.`), _tmpl$3$g = /* @__PURE__ */ template(`<div class=downloads-row><div class=downloads-file><strong></strong><span></span><small> · </small></div><div class=downloads-row-actions><button>Open</button><button>Show in folder`), _tmpl$4$g = /* @__PURE__ */ template(`<span>Source: `);
|
|
3998
|
+
const formatBytes = (bytes) => {
|
|
3999
|
+
if (!bytes) return "0 B";
|
|
4000
|
+
const units = ["B", "KB", "MB", "GB"];
|
|
4001
|
+
let size = bytes;
|
|
4002
|
+
let unit = 0;
|
|
4003
|
+
while (size >= 1024 && unit < units.length - 1) {
|
|
4004
|
+
size /= 1024;
|
|
4005
|
+
unit += 1;
|
|
4006
|
+
}
|
|
4007
|
+
return `${size.toFixed(size >= 10 || unit === 0 ? 0 : 1)} ${units[unit]}`;
|
|
4008
|
+
};
|
|
4009
|
+
const DownloadsPanel = (props) => {
|
|
4010
|
+
const [items, setItems] = createSignal([]);
|
|
4011
|
+
const load = async () => setItems(await window.vessel.downloads.getAll());
|
|
4012
|
+
onMount(() => {
|
|
4013
|
+
void load();
|
|
4014
|
+
const off = window.vessel.downloads.onUpdate(setItems);
|
|
4015
|
+
onCleanup(off);
|
|
4016
|
+
});
|
|
4017
|
+
return createComponent(Show, {
|
|
4018
|
+
get when() {
|
|
4019
|
+
return props.open;
|
|
4020
|
+
},
|
|
4021
|
+
get children() {
|
|
4022
|
+
var _el$ = _tmpl$$i(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$3.nextSibling;
|
|
4023
|
+
addEventListener(_el$, "click", props.onClose, true);
|
|
4024
|
+
_el$2.$$click = (e) => e.stopPropagation();
|
|
4025
|
+
_el$6.$$click = async () => {
|
|
4026
|
+
await window.vessel.downloads.clear();
|
|
4027
|
+
await load();
|
|
4028
|
+
};
|
|
4029
|
+
addEventListener(_el$7, "click", props.onClose, true);
|
|
4030
|
+
insert(_el$8, createComponent(For, {
|
|
4031
|
+
get each() {
|
|
4032
|
+
return items();
|
|
4033
|
+
},
|
|
4034
|
+
get fallback() {
|
|
4035
|
+
return _tmpl$2$i();
|
|
4036
|
+
},
|
|
4037
|
+
children: (item) => (() => {
|
|
4038
|
+
var _el$0 = _tmpl$3$g(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$1.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
|
|
4039
|
+
insert(_el$10, () => item.filename);
|
|
4040
|
+
insert(_el$11, () => item.savePath);
|
|
4041
|
+
insert(_el$1, createComponent(Show, {
|
|
4042
|
+
get when() {
|
|
4043
|
+
return item.url;
|
|
4044
|
+
},
|
|
4045
|
+
children: (url) => (() => {
|
|
4046
|
+
var _el$17 = _tmpl$4$g();
|
|
4047
|
+
_el$17.firstChild;
|
|
4048
|
+
insert(_el$17, url, null);
|
|
4049
|
+
return _el$17;
|
|
4050
|
+
})()
|
|
4051
|
+
}), _el$12);
|
|
4052
|
+
insert(_el$12, () => item.state, _el$13);
|
|
4053
|
+
insert(_el$12, () => formatBytes(item.receivedBytes), null);
|
|
4054
|
+
insert(_el$12, (() => {
|
|
4055
|
+
var _c$ = memo(() => !!item.totalBytes);
|
|
4056
|
+
return () => _c$() ? ` / ${formatBytes(item.totalBytes)}` : "";
|
|
4057
|
+
})(), null);
|
|
4058
|
+
_el$15.$$click = () => window.vessel.downloads.open(item.id);
|
|
4059
|
+
_el$16.$$click = () => window.vessel.downloads.showInFolder(item.id);
|
|
4060
|
+
createRenderEffect(() => _el$15.disabled = item.state !== "completed");
|
|
4061
|
+
return _el$0;
|
|
4062
|
+
})()
|
|
4063
|
+
}));
|
|
4064
|
+
return _el$;
|
|
4065
|
+
}
|
|
4066
|
+
});
|
|
4067
|
+
};
|
|
4068
|
+
delegateEvents(["click"]);
|
|
3935
4069
|
var _tmpl$$h = /* @__PURE__ */ template(`<div class=find-bar><input class=find-bar-input type=text placeholder="Find in page..."><button class=find-bar-btn title="Previous (Shift+Enter)">▲</button><button class=find-bar-btn title="Next (Enter)">▼</button><button class="find-bar-btn find-bar-close"title="Close (Escape)">×`), _tmpl$2$h = /* @__PURE__ */ template(`<span class=find-bar-count>`);
|
|
3936
4070
|
const FindBar = () => {
|
|
3937
4071
|
const [open, setOpen] = createSignal(false);
|
|
@@ -4037,7 +4171,7 @@ const FindBar = () => {
|
|
|
4037
4171
|
});
|
|
4038
4172
|
};
|
|
4039
4173
|
delegateEvents(["input", "click"]);
|
|
4040
|
-
var _tmpl$$g = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$g = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$f = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$f = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$
|
|
4174
|
+
var _tmpl$$g = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$g = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$f = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$f = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$d = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
|
|
4041
4175
|
const FlowProgress = () => {
|
|
4042
4176
|
const {
|
|
4043
4177
|
runtimeState: runtimeState2
|
|
@@ -4082,7 +4216,7 @@ const FlowProgress = () => {
|
|
|
4082
4216
|
return t().steps;
|
|
4083
4217
|
},
|
|
4084
4218
|
children: (step) => (() => {
|
|
4085
|
-
var _el$12 = _tmpl$5$
|
|
4219
|
+
var _el$12 = _tmpl$5$d(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
|
|
4086
4220
|
insert(_el$14, () => step.label);
|
|
4087
4221
|
createRenderEffect(() => className(_el$12, `flow-step ${stepStatusClass(step.status)}`));
|
|
4088
4222
|
return _el$12;
|
|
@@ -4127,7 +4261,7 @@ const FlowProgress = () => {
|
|
|
4127
4261
|
return f().steps;
|
|
4128
4262
|
},
|
|
4129
4263
|
children: (step) => (() => {
|
|
4130
|
-
var _el$23 = _tmpl$5$
|
|
4264
|
+
var _el$23 = _tmpl$5$d(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
|
|
4131
4265
|
insert(_el$25, () => step.label);
|
|
4132
4266
|
createRenderEffect(() => className(_el$23, `flow-step ${stepStatusClass(step.status)}`));
|
|
4133
4267
|
return _el$23;
|
|
@@ -4168,7 +4302,7 @@ function formatTime(iso, options) {
|
|
|
4168
4302
|
...options?.includeSeconds && { second: "2-digit" }
|
|
4169
4303
|
});
|
|
4170
4304
|
}
|
|
4171
|
-
var _tmpl$$f = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$e = /* @__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$5$
|
|
4305
|
+
var _tmpl$$f = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$e = /* @__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$5$c = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$c = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$9 = /* @__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>`);
|
|
4172
4306
|
const AgentTranscriptDock = () => {
|
|
4173
4307
|
const {
|
|
4174
4308
|
runtimeState: runtimeState2
|
|
@@ -4215,10 +4349,10 @@ const AgentTranscriptDock = () => {
|
|
|
4215
4349
|
return hasStreamingEntry();
|
|
4216
4350
|
},
|
|
4217
4351
|
get children() {
|
|
4218
|
-
return _tmpl$5$
|
|
4352
|
+
return _tmpl$5$c();
|
|
4219
4353
|
}
|
|
4220
4354
|
}), (() => {
|
|
4221
|
-
var _el$10 = _tmpl$6$
|
|
4355
|
+
var _el$10 = _tmpl$6$c(), _el$11 = _el$10.firstChild;
|
|
4222
4356
|
insert(_el$10, () => entry().title || entry().kind, _el$11);
|
|
4223
4357
|
insert(_el$10, (() => {
|
|
4224
4358
|
var _c$ = memo(() => entry().text.length > 80);
|
|
@@ -4625,7 +4759,7 @@ function useAnimatedPresence(isOpen, exitDurationMs) {
|
|
|
4625
4759
|
});
|
|
4626
4760
|
return { visible, closing };
|
|
4627
4761
|
}
|
|
4628
|
-
var _tmpl$$e = /* @__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$e = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$d = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$d = /* @__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$
|
|
4762
|
+
var _tmpl$$e = /* @__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$e = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$d = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$d = /* @__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$b = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$b = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
|
|
4629
4763
|
const COMMAND_BAR_EXIT_MS = 200;
|
|
4630
4764
|
const CommandBar = () => {
|
|
4631
4765
|
const {
|
|
@@ -4712,7 +4846,7 @@ const CommandBar = () => {
|
|
|
4712
4846
|
return recentQueries2();
|
|
4713
4847
|
},
|
|
4714
4848
|
children: (q) => (() => {
|
|
4715
|
-
var _el$14 = _tmpl$5$
|
|
4849
|
+
var _el$14 = _tmpl$5$b();
|
|
4716
4850
|
_el$14.$$click = () => void handleRecentClick(q);
|
|
4717
4851
|
insert(_el$14, q);
|
|
4718
4852
|
return _el$14;
|
|
@@ -4726,7 +4860,7 @@ const CommandBar = () => {
|
|
|
4726
4860
|
return hasProvider();
|
|
4727
4861
|
},
|
|
4728
4862
|
get fallback() {
|
|
4729
|
-
return _tmpl$6$
|
|
4863
|
+
return _tmpl$6$b();
|
|
4730
4864
|
},
|
|
4731
4865
|
get children() {
|
|
4732
4866
|
return _tmpl$3$d();
|
|
@@ -6539,7 +6673,7 @@ function renderKitPrompt(kit, values) {
|
|
|
6539
6673
|
(_, key) => values[key] ?? ""
|
|
6540
6674
|
);
|
|
6541
6675
|
}
|
|
6542
|
-
var _tmpl$$c = /* @__PURE__ */ template(`<div class=kit-upsell><div class=kit-upsell-icon aria-hidden=true></div><p class=kit-upsell-title>Vessel Premium</p><p class=kit-upsell-body>Automation Kits are a premium feature. Upgrade to unlock pre-built workflows you can launch with one click.</p><button class="agent-primary-button kit-upsell-btn"type=button>Start 7-day free trial — $5.99/mo after`), _tmpl$2$c = /* @__PURE__ */ template(`<div class=kit-list-header><span class=agent-panel-title>Automation Kits <span class=kit-beta-tag>Beta</span></span><div class=kit-list-header-actions><span class=kit-list-count> kits</span><button class=kit-install-btn type=button title="Install a kit from a .kit.json file">+ Install`), _tmpl$3$b = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$
|
|
6676
|
+
var _tmpl$$c = /* @__PURE__ */ template(`<div class=kit-upsell><div class=kit-upsell-icon aria-hidden=true></div><p class=kit-upsell-title>Vessel Premium</p><p class=kit-upsell-body>Automation Kits are a premium feature. Upgrade to unlock pre-built workflows you can launch with one click.</p><button class="agent-primary-button kit-upsell-btn"type=button>Start 7-day free trial — $5.99/mo after`), _tmpl$2$c = /* @__PURE__ */ template(`<div class=kit-list-header><span class=agent-panel-title>Automation Kits <span class=kit-beta-tag>Beta</span></span><div class=kit-list-header-actions><span class=kit-list-count> kits</span><button class=kit-install-btn type=button title="Install a kit from a .kit.json file">+ Install`), _tmpl$3$b = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$a = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$a = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$5 = /* @__PURE__ */ template(`<div class=kit-form-header><button class=kit-back-btn type=button title="Back to kits"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M9 11L5 7l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Back</button><div class=kit-form-title>`), _tmpl$0$4 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$4 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$4 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Date & time</label><input class=kit-form-input type=datetime-local>`), _tmpl$13$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Time of day</label><input class="kit-form-input kit-schedule-time"type=time>`), _tmpl$14$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Time</label><input class="kit-form-input kit-schedule-time"type=time>`), _tmpl$16$2 = /* @__PURE__ */ template(`<p class=kit-schedule-error>`), _tmpl$17$2 = /* @__PURE__ */ template(`<div class=kit-schedule-form><div class=kit-schedule-types></div><p class=kit-schedule-note>Schedules run only while Vessel is open. Missed runs are skipped.</p><button class="agent-primary-button kit-schedule-btn"type=button>`), _tmpl$18$2 = /* @__PURE__ */ template(`<div class=kit-schedule-section><label class=kit-schedule-toggle><input type=checkbox>Schedule for later`), _tmpl$19$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Run at</label><input type=datetime-local class="kit-form-input kit-schedule-time">`), _tmpl$20$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Day</label><select class="kit-form-input kit-schedule-time">`), _tmpl$21$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$2 = /* @__PURE__ */ template(`<div class=sched-edit-backdrop><div class=sched-edit-panel><div class=sched-edit-header><span class=sched-edit-title>Edit schedule</span><span class=sched-edit-job-name></span></div><div class=kit-schedule-types></div><div class=sched-edit-actions><button class=kit-back-btn type=button>Cancel</button><button class=agent-primary-button type=button>Save`), _tmpl$23$2 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$2 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=kit-card role=button tabindex=0><span class=kit-card-icon aria-hidden=true></span><div class=kit-card-body><div class=kit-card-name></div><div class=kit-card-desc>`), _tmpl$27$2 = /* @__PURE__ */ template(`<svg class=kit-card-caret width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M5 3l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=sched-context-menu><button class=sched-ctx-item type=button>Edit task</button><button class=sched-ctx-item type=button>Edit schedule</button><div class=sched-ctx-divider></div><button class=sched-ctx-item type=button></button><button class="sched-ctx-item sched-ctx-danger"type=button>Delete`), _tmpl$30$1 = /* @__PURE__ */ template(`<div class=kit-sched-card><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-sched-body><div class=kit-sched-name></div><div class=kit-sched-meta></div></div><div class=kit-sched-actions><button class=kit-sched-toggle type=button></button><button class=kit-remove-btn type=button title="Delete schedule"aria-label="Delete schedule">×`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=kit-activity-output>`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=kit-activity-card><div class=kit-activity-header><div class=kit-activity-title><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-activity-title-copy><div class=kit-sched-name></div><div class=kit-activity-time></div></div></div><span class=kit-activity-badge>`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$1 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$1 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$1 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$1 = /* @__PURE__ */ template(`<input class=kit-form-input>`), _tmpl$39$1 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$1 = /* @__PURE__ */ template(`<option>`), _tmpl$42$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
|
|
6543
6677
|
const ICON_MAP = {
|
|
6544
6678
|
BookOpen: book_open_default,
|
|
6545
6679
|
Tag: tag_default,
|
|
@@ -6953,14 +7087,14 @@ const AutomationTab = (props) => {
|
|
|
6953
7087
|
},
|
|
6954
7088
|
get children() {
|
|
6955
7089
|
return [(() => {
|
|
6956
|
-
var _el$15 = _tmpl$5$
|
|
7090
|
+
var _el$15 = _tmpl$5$a(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
|
|
6957
7091
|
insert(_el$15, createComponent(clock_default, {
|
|
6958
7092
|
size: 12
|
|
6959
7093
|
}), _el$16);
|
|
6960
7094
|
insert(_el$17, () => scheduledJobs().length);
|
|
6961
7095
|
return _el$15;
|
|
6962
7096
|
})(), (() => {
|
|
6963
|
-
var _el$18 = _tmpl$6$
|
|
7097
|
+
var _el$18 = _tmpl$6$a();
|
|
6964
7098
|
insert(_el$18, createComponent(For, {
|
|
6965
7099
|
get each() {
|
|
6966
7100
|
return scheduledJobs();
|
|
@@ -6985,7 +7119,7 @@ const AutomationTab = (props) => {
|
|
|
6985
7119
|
return job.enabled;
|
|
6986
7120
|
},
|
|
6987
7121
|
get children() {
|
|
6988
|
-
var _el$89 = _tmpl$28$
|
|
7122
|
+
var _el$89 = _tmpl$28$2();
|
|
6989
7123
|
_el$89.firstChild;
|
|
6990
7124
|
insert(_el$89, () => formatNextRun(job.nextRunAt), null);
|
|
6991
7125
|
return _el$89;
|
|
@@ -7378,7 +7512,7 @@ const AutomationTab = (props) => {
|
|
|
7378
7512
|
})();
|
|
7379
7513
|
};
|
|
7380
7514
|
delegateEvents(["click", "input", "keydown", "contextmenu"]);
|
|
7381
|
-
var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$
|
|
7515
|
+
var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=page-diff-history-list>`), _tmpl$6$9 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=page-diff-history-item><div class=page-diff-history-time><span class=page-diff-history-label></span><span></span></div><div class=page-diff-history-card><div class=page-diff-history-summary-list></div><div class=page-diff-history-position>Entry <!> of `), _tmpl$8$6 = /* @__PURE__ */ template(`<span class=page-diff-history-summary-section>`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=page-diff-history-summary-row><span class=page-diff-history-summary>`);
|
|
7382
7516
|
const PageDiffTimeline = () => {
|
|
7383
7517
|
const {
|
|
7384
7518
|
activeTab
|
|
@@ -7430,7 +7564,7 @@ const PageDiffTimeline = () => {
|
|
|
7430
7564
|
unsubscribe2();
|
|
7431
7565
|
});
|
|
7432
7566
|
return (() => {
|
|
7433
|
-
var _el$ = _tmpl$6$
|
|
7567
|
+
var _el$ = _tmpl$6$9();
|
|
7434
7568
|
insert(_el$, createComponent(Show, {
|
|
7435
7569
|
get when() {
|
|
7436
7570
|
return loading();
|
|
@@ -7463,7 +7597,7 @@ const PageDiffTimeline = () => {
|
|
|
7463
7597
|
},
|
|
7464
7598
|
get children() {
|
|
7465
7599
|
return [_tmpl$4$a(), (() => {
|
|
7466
|
-
var _el$6 = _tmpl$5$
|
|
7600
|
+
var _el$6 = _tmpl$5$9();
|
|
7467
7601
|
insert(_el$6, createComponent(For, {
|
|
7468
7602
|
get each() {
|
|
7469
7603
|
return bursts();
|
|
@@ -7509,7 +7643,7 @@ const PageDiffTimeline = () => {
|
|
|
7509
7643
|
})();
|
|
7510
7644
|
};
|
|
7511
7645
|
const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
|
|
7512
|
-
var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$6 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__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$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__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></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__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-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><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$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__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"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20$1 = /* @__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$21$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$22$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$23$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24$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$25$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__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><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$42 = /* @__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$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$53 = /* @__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 type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__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><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__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`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
|
|
7646
|
+
var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$8 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__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$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__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></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__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-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><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$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__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"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20$1 = /* @__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$21$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$22$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$23$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24$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$25$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__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><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$42 = /* @__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$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$53 = /* @__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 type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__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><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__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`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
|
|
7513
7647
|
const UNSORTED_FOLDER = {
|
|
7514
7648
|
id: "unsorted",
|
|
7515
7649
|
name: "Unsorted",
|
|
@@ -8195,7 +8329,7 @@ ${contextBlock}` : contextBlock);
|
|
|
8195
8329
|
return _tmpl$30();
|
|
8196
8330
|
},
|
|
8197
8331
|
get children() {
|
|
8198
|
-
return [_tmpl$5$
|
|
8332
|
+
return [_tmpl$5$8(), createComponent(For, {
|
|
8199
8333
|
get each() {
|
|
8200
8334
|
return runtimeState2().supervisor.pendingApprovals;
|
|
8201
8335
|
},
|
|
@@ -8216,7 +8350,7 @@ ${contextBlock}` : contextBlock);
|
|
|
8216
8350
|
return recentActions().length > 0;
|
|
8217
8351
|
},
|
|
8218
8352
|
get children() {
|
|
8219
|
-
var _el$40 = _tmpl$6$
|
|
8353
|
+
var _el$40 = _tmpl$6$8();
|
|
8220
8354
|
_el$40.$$click = () => setActionsExpanded((current) => !current);
|
|
8221
8355
|
insert(_el$40, (() => {
|
|
8222
8356
|
var _c$ = memo(() => !!actionsExpanded());
|
|
@@ -9029,7 +9163,7 @@ ${contextBlock}` : contextBlock);
|
|
|
9029
9163
|
return _el$133;
|
|
9030
9164
|
}
|
|
9031
9165
|
}), (() => {
|
|
9032
|
-
var _el$138 = _tmpl$28(), _el$139 = _el$138.firstChild, _el$140 = _el$139.nextSibling;
|
|
9166
|
+
var _el$138 = _tmpl$28$1(), _el$139 = _el$138.firstChild, _el$140 = _el$139.nextSibling;
|
|
9033
9167
|
_el$139.$$keydown = (e) => {
|
|
9034
9168
|
if (e.key === "Enter" && !e.shiftKey) {
|
|
9035
9169
|
e.preventDefault();
|
|
@@ -9097,7 +9231,7 @@ ${contextBlock}` : contextBlock);
|
|
|
9097
9231
|
});
|
|
9098
9232
|
};
|
|
9099
9233
|
delegateEvents(["click", "pointerdown", "input", "keydown"]);
|
|
9100
|
-
var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__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$
|
|
9234
|
+
var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__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$7 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$7 = /* @__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$5 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$2 = /* @__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$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$2 = /* @__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$2 = /* @__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$2 = /* @__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>`);
|
|
9101
9235
|
function statusClass(status) {
|
|
9102
9236
|
if (status == null) return "pending";
|
|
9103
9237
|
if (status >= 200 && status < 300) return "ok";
|
|
@@ -9214,7 +9348,7 @@ const NetworkView = (props) => {
|
|
|
9214
9348
|
return props.entries.length > 0;
|
|
9215
9349
|
},
|
|
9216
9350
|
get fallback() {
|
|
9217
|
-
return _tmpl$5$
|
|
9351
|
+
return _tmpl$5$7();
|
|
9218
9352
|
},
|
|
9219
9353
|
get children() {
|
|
9220
9354
|
var _el$8 = _tmpl$4$8();
|
|
@@ -9227,7 +9361,7 @@ const NetworkView = (props) => {
|
|
|
9227
9361
|
return props.entries;
|
|
9228
9362
|
},
|
|
9229
9363
|
children: (entry) => (() => {
|
|
9230
|
-
var _el$1 = _tmpl$6$
|
|
9364
|
+
var _el$1 = _tmpl$6$7(), _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;
|
|
9231
9365
|
insert(_el$10, () => entry.method);
|
|
9232
9366
|
insert(_el$11, () => shortenUrl(entry.url));
|
|
9233
9367
|
insert(_el$12, (() => {
|
|
@@ -9629,10 +9763,20 @@ const PROVIDERS = {
|
|
|
9629
9763
|
apiKeyHint: "Optional — only if your endpoint requires authentication"
|
|
9630
9764
|
}
|
|
9631
9765
|
};
|
|
9632
|
-
var _tmpl$$8 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$8 = /* @__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> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<div class=settings-category-panel><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=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>
|
|
9766
|
+
var _tmpl$$8 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$8 = /* @__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> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<button type=button class=settings-secondary-btn>Open latest release`), _tmpl$4$7 = /* @__PURE__ */ template(`<div class=settings-category-panel><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=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>Used for searches typed directly into the address bar and for agent web-search fallbacks. "None" disables address-bar search, so entries are treated as URLs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label>Updates</label><div class=settings-inline-actions><button type=button class=settings-secondary-btn></button></div><p class=settings-hint>Checks the published npm package and links to GitHub Releases for installers/AppImages.</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.`), _tmpl$5$6 = /* @__PURE__ */ template(`<option>`), _tmpl$6$6 = /* @__PURE__ */ template(`<p class=settings-hint>`);
|
|
9633
9767
|
const SettingsGeneral = (props) => {
|
|
9768
|
+
const [checkingUpdates, setCheckingUpdates] = createSignal(false);
|
|
9769
|
+
const [updateResult, setUpdateResult] = createSignal(null);
|
|
9770
|
+
const checkUpdates = async () => {
|
|
9771
|
+
setCheckingUpdates(true);
|
|
9772
|
+
try {
|
|
9773
|
+
setUpdateResult(await window.vessel.updates.check());
|
|
9774
|
+
} finally {
|
|
9775
|
+
setCheckingUpdates(false);
|
|
9776
|
+
}
|
|
9777
|
+
};
|
|
9634
9778
|
return (() => {
|
|
9635
|
-
var _el$ = _tmpl$
|
|
9779
|
+
var _el$ = _tmpl$4$7(), _el$0 = _el$.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$0.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$23.firstChild, _el$26 = _el$23.nextSibling, _el$27 = _el$21.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild;
|
|
9636
9780
|
insert(_el$, createComponent(Show, {
|
|
9637
9781
|
get when() {
|
|
9638
9782
|
return props.welcomeBanner.show();
|
|
@@ -9662,29 +9806,73 @@ const SettingsGeneral = (props) => {
|
|
|
9662
9806
|
return Object.entries(SEARCH_ENGINE_PRESETS);
|
|
9663
9807
|
},
|
|
9664
9808
|
children: ([id, preset]) => (() => {
|
|
9665
|
-
var _el$
|
|
9666
|
-
_el$
|
|
9667
|
-
insert(_el$
|
|
9668
|
-
return _el$
|
|
9809
|
+
var _el$33 = _tmpl$5$6();
|
|
9810
|
+
_el$33.value = id;
|
|
9811
|
+
insert(_el$33, () => preset.label);
|
|
9812
|
+
return _el$33;
|
|
9669
9813
|
})()
|
|
9670
9814
|
}), _el$14);
|
|
9671
9815
|
_el$17.$$input = (e) => props.setDownloadPath(e.currentTarget.value);
|
|
9672
9816
|
setAttribute(_el$17, "spellcheck", false);
|
|
9673
9817
|
_el$20.addEventListener("change", (e) => props.setTheme(e.currentTarget.value));
|
|
9674
|
-
_el$
|
|
9675
|
-
_el$
|
|
9818
|
+
_el$24.$$click = checkUpdates;
|
|
9819
|
+
insert(_el$24, () => checkingUpdates() ? "Checking…" : "Check for updates");
|
|
9820
|
+
insert(_el$23, createComponent(Show, {
|
|
9821
|
+
get when() {
|
|
9822
|
+
return updateResult()?.updateAvailable;
|
|
9823
|
+
},
|
|
9824
|
+
get children() {
|
|
9825
|
+
var _el$25 = _tmpl$3$7();
|
|
9826
|
+
_el$25.$$click = () => window.vessel.updates.openDownload();
|
|
9827
|
+
return _el$25;
|
|
9828
|
+
}
|
|
9829
|
+
}), null);
|
|
9830
|
+
insert(_el$21, createComponent(Show, {
|
|
9831
|
+
get when() {
|
|
9832
|
+
return updateResult();
|
|
9833
|
+
},
|
|
9834
|
+
children: (result) => (() => {
|
|
9835
|
+
var _el$34 = _tmpl$6$6();
|
|
9836
|
+
insert(_el$34, createComponent(Show, {
|
|
9837
|
+
get when() {
|
|
9838
|
+
return !result().error;
|
|
9839
|
+
},
|
|
9840
|
+
get fallback() {
|
|
9841
|
+
return ["Could not check for updates: ", memo(() => result().error)];
|
|
9842
|
+
},
|
|
9843
|
+
get children() {
|
|
9844
|
+
return createComponent(Show, {
|
|
9845
|
+
get when() {
|
|
9846
|
+
return result().updateAvailable;
|
|
9847
|
+
},
|
|
9848
|
+
get fallback() {
|
|
9849
|
+
return ["Vessel is up to date. Current version: ", memo(() => result().currentVersion), "."];
|
|
9850
|
+
},
|
|
9851
|
+
get children() {
|
|
9852
|
+
return ["Update available: ", memo(() => result().latestVersion), " is available. You have ", memo(() => result().currentVersion), "."];
|
|
9853
|
+
}
|
|
9854
|
+
});
|
|
9855
|
+
}
|
|
9856
|
+
}));
|
|
9857
|
+
return _el$34;
|
|
9858
|
+
})()
|
|
9859
|
+
}), _el$26);
|
|
9860
|
+
_el$29.$$click = () => props.setAutoRestoreSession(!props.autoRestoreSession());
|
|
9861
|
+
_el$32.$$click = () => props.setClearBookmarksOnLaunch(!props.clearBookmarksOnLaunch());
|
|
9676
9862
|
createRenderEffect((_p$) => {
|
|
9677
|
-
var _v$ = !!props.autoRestoreSession(), _v$
|
|
9678
|
-
_v$ !== _p$.e && _el$
|
|
9679
|
-
_v$2 !== _p$.t &&
|
|
9680
|
-
_v$3 !== _p$.a && _el$
|
|
9681
|
-
_v$4 !== _p$.o &&
|
|
9863
|
+
var _v$ = checkingUpdates(), _v$2 = !!props.autoRestoreSession(), _v$3 = props.autoRestoreSession(), _v$4 = !!props.clearBookmarksOnLaunch(), _v$5 = props.clearBookmarksOnLaunch();
|
|
9864
|
+
_v$ !== _p$.e && (_el$24.disabled = _p$.e = _v$);
|
|
9865
|
+
_v$2 !== _p$.t && _el$29.classList.toggle("on", _p$.t = _v$2);
|
|
9866
|
+
_v$3 !== _p$.a && setAttribute(_el$29, "aria-checked", _p$.a = _v$3);
|
|
9867
|
+
_v$4 !== _p$.o && _el$32.classList.toggle("on", _p$.o = _v$4);
|
|
9868
|
+
_v$5 !== _p$.i && setAttribute(_el$32, "aria-checked", _p$.i = _v$5);
|
|
9682
9869
|
return _p$;
|
|
9683
9870
|
}, {
|
|
9684
9871
|
e: void 0,
|
|
9685
9872
|
t: void 0,
|
|
9686
9873
|
a: void 0,
|
|
9687
|
-
o: void 0
|
|
9874
|
+
o: void 0,
|
|
9875
|
+
i: void 0
|
|
9688
9876
|
});
|
|
9689
9877
|
createRenderEffect(() => _el$10.value = props.defaultUrl());
|
|
9690
9878
|
createRenderEffect(() => _el$13.value = props.defaultSearchEngine());
|
|
@@ -9694,7 +9882,7 @@ const SettingsGeneral = (props) => {
|
|
|
9694
9882
|
})();
|
|
9695
9883
|
};
|
|
9696
9884
|
delegateEvents(["click", "input"]);
|
|
9697
|
-
var _tmpl$$7 = /* @__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$2$7 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;gap:8px><span style=width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block></span><span>Connected as `), _tmpl$3$6 = /* @__PURE__ */ template(`<p class=settings-hint><button type=button class=settings-link-btn>Disconnect`), _tmpl$4$6 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label>Account`), _tmpl$5$
|
|
9885
|
+
var _tmpl$$7 = /* @__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$2$7 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;gap:8px><span style=width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block></span><span>Connected as `), _tmpl$3$6 = /* @__PURE__ */ template(`<p class=settings-hint><button type=button class=settings-link-btn>Disconnect`), _tmpl$4$6 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label>Account`), _tmpl$5$5 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$6$5 = /* @__PURE__ */ template(`<p class=settings-hint>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$7$4 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$8$3 = /* @__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$9$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$0$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$1$1 = /* @__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$10$1 = /* @__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$11$1 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured <code>llama-server</code> base URL. For agent loops, run <code>llama-server</code> with <code>--ctx-size 16384</code> minimum and <code>32768</code> recommended.`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-reasoning-effort>Reasoning Level</label><select id=chat-reasoning-effort class="settings-input settings-select"></select><p class=settings-hint>Applies to providers and models that expose reasoning controls. Off requests no reasoning where supported and otherwise leaves the model at its normal behavior; Max requests the strongest supported reasoning tier.`), _tmpl$13$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><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-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-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 class=settings-inline-actions><button type=button class=settings-secondary-btn>Regenerate MCP token</button></div></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=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-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.`), _tmpl$15$1 = /* @__PURE__ */ template(`<option>`), _tmpl$16 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)> <button type=button class=settings-link-btn>Cancel`), _tmpl$17 = /* @__PURE__ */ template(`<div>`), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>`), _tmpl$19 = /* @__PURE__ */ template(`<button type=button class=settings-btn>Try Again`), _tmpl$20 = /* @__PURE__ */ template(`<div><button type=button class=settings-btn>Connect with ChatGPT</button><p class=settings-hint>Sign in with your ChatGPT Plus or Pro subscription. A browser tab will open where you'll authorize Vessel.`), _tmpl$21 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$24 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$26 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$27 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`);
|
|
9698
9886
|
const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
|
|
9699
9887
|
id: p.id,
|
|
9700
9888
|
name: p.name,
|
|
@@ -9722,9 +9910,10 @@ const REASONING_EFFORT_OPTIONS = [{
|
|
|
9722
9910
|
label: "Max"
|
|
9723
9911
|
}];
|
|
9724
9912
|
const SettingsAgent = (props) => {
|
|
9913
|
+
const [mcpTokenMessage, setMcpTokenMessage] = createSignal(null);
|
|
9725
9914
|
const chatMeta = () => CHAT_PROVIDERS$1.find((p) => p.id === props.chat.providerId()) ?? CHAT_PROVIDERS$1[0];
|
|
9726
9915
|
return (() => {
|
|
9727
|
-
var _el$ = _tmpl$14$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$35 = _el$3.nextSibling, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, _el$38 = _el$
|
|
9916
|
+
var _el$ = _tmpl$14$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$35 = _el$3.nextSibling, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, _el$38 = _el$37.nextSibling, _el$39 = _el$38.nextSibling, _el$40 = _el$39.firstChild, _el$41 = _el$35.nextSibling, _el$42 = _el$41.firstChild, _el$44 = _el$42.nextSibling, _el$45 = _el$41.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling, _el$48 = _el$45.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
|
|
9728
9917
|
_el$5.$$click = () => props.chat.setEnabled(!props.chat.enabled());
|
|
9729
9918
|
insert(_el$, createComponent(Show, {
|
|
9730
9919
|
get when() {
|
|
@@ -9745,10 +9934,10 @@ const SettingsAgent = (props) => {
|
|
|
9745
9934
|
insert(_el$8, createComponent(For, {
|
|
9746
9935
|
each: CHAT_PROVIDERS$1,
|
|
9747
9936
|
children: (p) => (() => {
|
|
9748
|
-
var _el$
|
|
9749
|
-
insert(_el$
|
|
9750
|
-
createRenderEffect(() => _el$
|
|
9751
|
-
return _el$
|
|
9937
|
+
var _el$51 = _tmpl$15$1();
|
|
9938
|
+
insert(_el$51, () => p.name);
|
|
9939
|
+
createRenderEffect(() => _el$51.value = p.id);
|
|
9940
|
+
return _el$51;
|
|
9752
9941
|
})()
|
|
9753
9942
|
}));
|
|
9754
9943
|
createRenderEffect(() => _el$8.value = props.chat.providerId());
|
|
@@ -9766,8 +9955,8 @@ const SettingsAgent = (props) => {
|
|
|
9766
9955
|
},
|
|
9767
9956
|
get fallback() {
|
|
9768
9957
|
return (() => {
|
|
9769
|
-
var _el$
|
|
9770
|
-
insert(_el$
|
|
9958
|
+
var _el$52 = _tmpl$17();
|
|
9959
|
+
insert(_el$52, createComponent(Show, {
|
|
9771
9960
|
get when() {
|
|
9772
9961
|
return props.chat.codexAuthStatus() === "waiting" || props.chat.codexAuthStatus() === "exchanging";
|
|
9773
9962
|
},
|
|
@@ -9778,38 +9967,38 @@ const SettingsAgent = (props) => {
|
|
|
9778
9967
|
},
|
|
9779
9968
|
get fallback() {
|
|
9780
9969
|
return (() => {
|
|
9781
|
-
var _el$
|
|
9782
|
-
_el$
|
|
9783
|
-
return _el$
|
|
9970
|
+
var _el$58 = _tmpl$20(), _el$59 = _el$58.firstChild;
|
|
9971
|
+
_el$59.$$click = () => props.chat.startCodexAuth();
|
|
9972
|
+
return _el$58;
|
|
9784
9973
|
})();
|
|
9785
9974
|
},
|
|
9786
9975
|
get children() {
|
|
9787
9976
|
return [(() => {
|
|
9788
|
-
var _el$
|
|
9789
|
-
insert(_el$
|
|
9790
|
-
return _el$
|
|
9977
|
+
var _el$56 = _tmpl$18();
|
|
9978
|
+
insert(_el$56, () => props.chat.codexAuthError());
|
|
9979
|
+
return _el$56;
|
|
9791
9980
|
})(), (() => {
|
|
9792
|
-
var _el$
|
|
9793
|
-
_el$
|
|
9794
|
-
return _el$
|
|
9981
|
+
var _el$57 = _tmpl$19();
|
|
9982
|
+
_el$57.$$click = () => props.chat.startCodexAuth();
|
|
9983
|
+
return _el$57;
|
|
9795
9984
|
})()];
|
|
9796
9985
|
}
|
|
9797
9986
|
});
|
|
9798
9987
|
},
|
|
9799
9988
|
get children() {
|
|
9800
|
-
var _el$
|
|
9801
|
-
insert(_el$
|
|
9989
|
+
var _el$53 = _tmpl$16(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
|
|
9990
|
+
insert(_el$53, createComponent(Show, {
|
|
9802
9991
|
get when() {
|
|
9803
9992
|
return props.chat.codexAuthStatus() === "waiting";
|
|
9804
9993
|
},
|
|
9805
9994
|
fallback: "Exchanging authorization...",
|
|
9806
9995
|
children: "Waiting for browser login..."
|
|
9807
|
-
}), _el$
|
|
9808
|
-
_el$
|
|
9809
|
-
return _el$
|
|
9996
|
+
}), _el$54);
|
|
9997
|
+
_el$55.$$click = () => window.vessel.codex.cancelAuth();
|
|
9998
|
+
return _el$53;
|
|
9810
9999
|
}
|
|
9811
10000
|
}));
|
|
9812
|
-
return _el$
|
|
10001
|
+
return _el$52;
|
|
9813
10002
|
})();
|
|
9814
10003
|
},
|
|
9815
10004
|
get children() {
|
|
@@ -9840,7 +10029,7 @@ const SettingsAgent = (props) => {
|
|
|
9840
10029
|
return !chatMeta().requiresKey;
|
|
9841
10030
|
},
|
|
9842
10031
|
get children() {
|
|
9843
|
-
return _tmpl$5$
|
|
10032
|
+
return _tmpl$5$5();
|
|
9844
10033
|
}
|
|
9845
10034
|
}), null);
|
|
9846
10035
|
_el$19.$$input = (e) => {
|
|
@@ -9855,7 +10044,7 @@ const SettingsAgent = (props) => {
|
|
|
9855
10044
|
return memo(() => !!props.chat.hasStoredApiKey())() && !props.chat.apiKey().trim();
|
|
9856
10045
|
},
|
|
9857
10046
|
get children() {
|
|
9858
|
-
return _tmpl$6$
|
|
10047
|
+
return _tmpl$6$5();
|
|
9859
10048
|
}
|
|
9860
10049
|
}), null);
|
|
9861
10050
|
insert(_el$15, createComponent(Show, {
|
|
@@ -9878,12 +10067,12 @@ const SettingsAgent = (props) => {
|
|
|
9878
10067
|
},
|
|
9879
10068
|
get fallback() {
|
|
9880
10069
|
return (() => {
|
|
9881
|
-
var _el$
|
|
9882
|
-
_el$
|
|
9883
|
-
setAttribute(_el$
|
|
9884
|
-
createRenderEffect(() => setAttribute(_el$
|
|
9885
|
-
createRenderEffect(() => _el$
|
|
9886
|
-
return _el$
|
|
10070
|
+
var _el$60 = _tmpl$21();
|
|
10071
|
+
_el$60.$$input = (e) => props.chat.setModel(e.currentTarget.value);
|
|
10072
|
+
setAttribute(_el$60, "spellcheck", false);
|
|
10073
|
+
createRenderEffect(() => setAttribute(_el$60, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
|
|
10074
|
+
createRenderEffect(() => _el$60.value = props.chat.model());
|
|
10075
|
+
return _el$60;
|
|
9887
10076
|
})();
|
|
9888
10077
|
},
|
|
9889
10078
|
get children() {
|
|
@@ -9894,10 +10083,10 @@ const SettingsAgent = (props) => {
|
|
|
9894
10083
|
return props.chat.providerModels();
|
|
9895
10084
|
},
|
|
9896
10085
|
children: (m) => (() => {
|
|
9897
|
-
var _el$
|
|
9898
|
-
_el$
|
|
9899
|
-
insert(_el$
|
|
9900
|
-
return _el$
|
|
10086
|
+
var _el$61 = _tmpl$15$1();
|
|
10087
|
+
_el$61.value = m;
|
|
10088
|
+
insert(_el$61, m);
|
|
10089
|
+
return _el$61;
|
|
9901
10090
|
})()
|
|
9902
10091
|
}));
|
|
9903
10092
|
createRenderEffect(() => _el$25.value = props.chat.model());
|
|
@@ -9918,9 +10107,9 @@ const SettingsAgent = (props) => {
|
|
|
9918
10107
|
return props.chat.modelFetchWarning();
|
|
9919
10108
|
},
|
|
9920
10109
|
children: (warning) => (() => {
|
|
9921
|
-
var _el$
|
|
9922
|
-
insert(_el$
|
|
9923
|
-
return _el$
|
|
10110
|
+
var _el$62 = _tmpl$22();
|
|
10111
|
+
insert(_el$62, warning);
|
|
10112
|
+
return _el$62;
|
|
9924
10113
|
})()
|
|
9925
10114
|
}), null);
|
|
9926
10115
|
createRenderEffect(() => _el$26.disabled = props.chat.modelFetchState() === "loading");
|
|
@@ -9950,10 +10139,10 @@ const SettingsAgent = (props) => {
|
|
|
9950
10139
|
insert(_el$34, createComponent(For, {
|
|
9951
10140
|
each: REASONING_EFFORT_OPTIONS,
|
|
9952
10141
|
children: (option) => (() => {
|
|
9953
|
-
var _el$
|
|
9954
|
-
insert(_el$
|
|
9955
|
-
createRenderEffect(() => _el$
|
|
9956
|
-
return _el$
|
|
10142
|
+
var _el$63 = _tmpl$15$1();
|
|
10143
|
+
insert(_el$63, () => option.label);
|
|
10144
|
+
createRenderEffect(() => _el$63.value = option.value);
|
|
10145
|
+
return _el$63;
|
|
9957
10146
|
})()
|
|
9958
10147
|
}));
|
|
9959
10148
|
createRenderEffect(() => _el$34.value = props.chat.reasoningEffort());
|
|
@@ -9963,86 +10152,100 @@ const SettingsAgent = (props) => {
|
|
|
9963
10152
|
}), _el$35);
|
|
9964
10153
|
_el$37.$$input = (e) => props.setMcpPort(e.currentTarget.value);
|
|
9965
10154
|
setAttribute(_el$37, "spellcheck", false);
|
|
9966
|
-
|
|
10155
|
+
_el$40.$$click = async () => {
|
|
10156
|
+
const result = await window.vessel.settings.regenerateMcpToken();
|
|
10157
|
+
setMcpTokenMessage(result ? "MCP token regenerated. Update any external client config using Vessel's auth file." : "MCP server is not running, so no token was regenerated.");
|
|
10158
|
+
};
|
|
10159
|
+
insert(_el$35, createComponent(Show, {
|
|
10160
|
+
get when() {
|
|
10161
|
+
return mcpTokenMessage();
|
|
10162
|
+
},
|
|
10163
|
+
children: (message) => (() => {
|
|
10164
|
+
var _el$64 = _tmpl$23();
|
|
10165
|
+
insert(_el$64, message);
|
|
10166
|
+
return _el$64;
|
|
10167
|
+
})()
|
|
10168
|
+
}), null);
|
|
10169
|
+
insert(_el$41, createComponent(Show, {
|
|
9967
10170
|
get when() {
|
|
9968
10171
|
return props.premiumActive();
|
|
9969
10172
|
},
|
|
9970
10173
|
get fallback() {
|
|
9971
|
-
return _tmpl$
|
|
10174
|
+
return _tmpl$24();
|
|
9972
10175
|
},
|
|
9973
10176
|
get children() {
|
|
9974
|
-
var _el$
|
|
9975
|
-
_el$
|
|
9976
|
-
createRenderEffect(() => _el$
|
|
9977
|
-
return _el$
|
|
10177
|
+
var _el$43 = _tmpl$13$1();
|
|
10178
|
+
_el$43.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
|
|
10179
|
+
createRenderEffect(() => _el$43.value = props.maxToolIterations());
|
|
10180
|
+
return _el$43;
|
|
9978
10181
|
}
|
|
9979
|
-
}), _el$
|
|
9980
|
-
insert(_el$
|
|
10182
|
+
}), _el$44);
|
|
10183
|
+
insert(_el$44, createComponent(Show, {
|
|
9981
10184
|
get when() {
|
|
9982
10185
|
return props.premiumActive();
|
|
9983
10186
|
},
|
|
9984
10187
|
fallback: "Free tier: 50 tool calls per conversation turn. Upgrade to Vessel Premium to customize this limit (up to 1,000).",
|
|
9985
10188
|
children: "Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000."
|
|
9986
10189
|
}));
|
|
9987
|
-
_el$
|
|
10190
|
+
_el$47.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
|
|
9988
10191
|
insert(_el$, createComponent(Show, {
|
|
9989
10192
|
get when() {
|
|
9990
10193
|
return props.health();
|
|
9991
10194
|
},
|
|
9992
10195
|
children: (currentHealth) => (() => {
|
|
9993
|
-
var _el$
|
|
9994
|
-
_el$
|
|
9995
|
-
insert(_el$
|
|
9996
|
-
insert(_el$
|
|
9997
|
-
insert(_el$
|
|
10196
|
+
var _el$66 = _tmpl$26(), _el$67 = _el$66.firstChild, _el$68 = _el$67.nextSibling, _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
|
|
10197
|
+
_el$70.nextSibling;
|
|
10198
|
+
insert(_el$70, () => currentHealth().mcp.status);
|
|
10199
|
+
insert(_el$68, () => currentHealth().mcp.message, null);
|
|
10200
|
+
insert(_el$66, createComponent(Show, {
|
|
9998
10201
|
get when() {
|
|
9999
10202
|
return currentHealth().mcp.endpoint;
|
|
10000
10203
|
},
|
|
10001
10204
|
children: (endpoint) => (() => {
|
|
10002
|
-
var _el$
|
|
10003
|
-
insert(_el$
|
|
10004
|
-
return _el$
|
|
10205
|
+
var _el$73 = _tmpl$27(), _el$74 = _el$73.firstChild, _el$75 = _el$74.nextSibling;
|
|
10206
|
+
insert(_el$75, endpoint);
|
|
10207
|
+
return _el$73;
|
|
10005
10208
|
})()
|
|
10006
10209
|
}), null);
|
|
10007
|
-
insert(_el$
|
|
10210
|
+
insert(_el$66, createComponent(Show, {
|
|
10008
10211
|
get when() {
|
|
10009
10212
|
return currentHealth().startupIssues.length > 0;
|
|
10010
10213
|
},
|
|
10011
10214
|
get children() {
|
|
10012
|
-
var _el$
|
|
10013
|
-
insert(_el$
|
|
10014
|
-
var _el$
|
|
10015
|
-
insert(_el$
|
|
10016
|
-
insert(_el$
|
|
10017
|
-
insert(_el$
|
|
10215
|
+
var _el$72 = _tmpl$25();
|
|
10216
|
+
insert(_el$72, () => currentHealth().startupIssues.map((issue) => (() => {
|
|
10217
|
+
var _el$76 = _tmpl$28(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
|
|
10218
|
+
insert(_el$77, () => issue.title);
|
|
10219
|
+
insert(_el$78, () => issue.detail);
|
|
10220
|
+
insert(_el$76, createComponent(Show, {
|
|
10018
10221
|
get when() {
|
|
10019
10222
|
return issue.action;
|
|
10020
10223
|
},
|
|
10021
10224
|
children: (action) => (() => {
|
|
10022
|
-
var _el$
|
|
10023
|
-
insert(_el$
|
|
10024
|
-
return _el$
|
|
10225
|
+
var _el$79 = _tmpl$17();
|
|
10226
|
+
insert(_el$79, action);
|
|
10227
|
+
return _el$79;
|
|
10025
10228
|
})()
|
|
10026
10229
|
}), null);
|
|
10027
10230
|
createRenderEffect((_p$) => {
|
|
10028
10231
|
var _v$3 = !!(issue.severity === "warning"), _v$4 = !!(issue.severity === "error");
|
|
10029
|
-
_v$3 !== _p$.e && _el$
|
|
10030
|
-
_v$4 !== _p$.t && _el$
|
|
10232
|
+
_v$3 !== _p$.e && _el$76.classList.toggle("warning", _p$.e = _v$3);
|
|
10233
|
+
_v$4 !== _p$.t && _el$76.classList.toggle("error", _p$.t = _v$4);
|
|
10031
10234
|
return _p$;
|
|
10032
10235
|
}, {
|
|
10033
10236
|
e: void 0,
|
|
10034
10237
|
t: void 0
|
|
10035
10238
|
});
|
|
10036
|
-
return _el$
|
|
10239
|
+
return _el$76;
|
|
10037
10240
|
})()));
|
|
10038
|
-
return _el$
|
|
10241
|
+
return _el$72;
|
|
10039
10242
|
}
|
|
10040
10243
|
}), null);
|
|
10041
|
-
return _el$
|
|
10244
|
+
return _el$66;
|
|
10042
10245
|
})()
|
|
10043
|
-
}), _el$
|
|
10044
|
-
_el$
|
|
10045
|
-
setAttribute(_el$
|
|
10246
|
+
}), _el$48);
|
|
10247
|
+
_el$50.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
|
|
10248
|
+
setAttribute(_el$50, "spellcheck", false);
|
|
10046
10249
|
createRenderEffect((_p$) => {
|
|
10047
10250
|
var _v$ = !!props.chat.enabled(), _v$2 = props.chat.enabled();
|
|
10048
10251
|
_v$ !== _p$.e && _el$5.classList.toggle("on", _p$.e = _v$);
|
|
@@ -10053,13 +10256,13 @@ const SettingsAgent = (props) => {
|
|
|
10053
10256
|
t: void 0
|
|
10054
10257
|
});
|
|
10055
10258
|
createRenderEffect(() => _el$37.value = props.mcpPort());
|
|
10056
|
-
createRenderEffect(() => _el$
|
|
10057
|
-
createRenderEffect(() => _el$
|
|
10259
|
+
createRenderEffect(() => _el$47.value = props.agentTranscriptMode());
|
|
10260
|
+
createRenderEffect(() => _el$50.value = props.obsidianVaultPath());
|
|
10058
10261
|
return _el$;
|
|
10059
10262
|
})();
|
|
10060
10263
|
};
|
|
10061
10264
|
delegateEvents(["click", "input"]);
|
|
10062
|
-
var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__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$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$
|
|
10265
|
+
var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__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$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$4 = /* @__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$6$4 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Save login credentials for any website. Passwords are encrypted locally and filled directly into login forms. The agent can list and fill them with your consent, but passwords are never sent to AI providers.`), _tmpl$7$3 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Password`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Title (e.g. GitHub Personal)"><input class=settings-input placeholder="URL (e.g. https://github.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><select class=settings-input><option value=login>Login</option><option value=credit_card>Credit Card</option><option value=identity>Identity</option><option value=secure_note>Secure Note</option></select><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Password</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$9 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$0 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-field><label class=settings-label>Passwords</label></div><div class=settings-field><label class=settings-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$11 = /* @__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">×`), _tmpl$12 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Your personal password manager. Save, organize, and autofill login credentials. Upgrade to Premium to unlock Passwords.`), _tmpl$14 = /* @__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 password">×`), _tmpl$15 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">×`);
|
|
10063
10266
|
const SettingsVaults = (props) => {
|
|
10064
10267
|
const v = props.vault;
|
|
10065
10268
|
const h = props.humanVault;
|
|
@@ -10133,7 +10336,7 @@ const SettingsVaults = (props) => {
|
|
|
10133
10336
|
return v.adding();
|
|
10134
10337
|
},
|
|
10135
10338
|
get children() {
|
|
10136
|
-
var _el$9 = _tmpl$5$
|
|
10339
|
+
var _el$9 = _tmpl$5$4(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
|
|
10137
10340
|
_el$0.$$input = (e) => v.setNewLabel(e.currentTarget.value);
|
|
10138
10341
|
setAttribute(_el$0, "spellcheck", false);
|
|
10139
10342
|
_el$1.$$input = (e) => v.setNewDomain(e.currentTarget.value);
|
|
@@ -10200,7 +10403,7 @@ const SettingsVaults = (props) => {
|
|
|
10200
10403
|
return _tmpl$13();
|
|
10201
10404
|
},
|
|
10202
10405
|
get children() {
|
|
10203
|
-
return [_tmpl$6$
|
|
10406
|
+
return [_tmpl$6$4(), createComponent(Show, {
|
|
10204
10407
|
get when() {
|
|
10205
10408
|
return h.entries().length > 0;
|
|
10206
10409
|
},
|
|
@@ -10419,10 +10622,15 @@ const SettingsVaults = (props) => {
|
|
|
10419
10622
|
})();
|
|
10420
10623
|
};
|
|
10421
10624
|
delegateEvents(["click", "input"]);
|
|
10422
|
-
var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></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.`);
|
|
10625
|
+
var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-field><label class=settings-label>Site Permissions</label><p class=settings-hint>Camera, microphone, location, notifications, and other site capability choices remembered by Vessel.</p><div class=settings-list></div><button type=button class=settings-secondary-btn>Clear saved permissions</button></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.`), _tmpl$5$3 = /* @__PURE__ */ template(`<p class=settings-hint>No saved permission decisions yet.`), _tmpl$6$3 = /* @__PURE__ */ template(`<div class=settings-list-row><span></span><span>: `);
|
|
10423
10626
|
const SettingsPrivacy = (props) => {
|
|
10627
|
+
const [permissions, setPermissions] = createSignal([]);
|
|
10628
|
+
const loadPermissions = async () => setPermissions(await window.vessel.permissions.getAll());
|
|
10629
|
+
onMount(() => {
|
|
10630
|
+
void loadPermissions();
|
|
10631
|
+
});
|
|
10424
10632
|
return (() => {
|
|
10425
|
-
var _el$ = _tmpl$4$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild;
|
|
10633
|
+
var _el$ = _tmpl$4$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$8.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild;
|
|
10426
10634
|
_el$4.addEventListener("change", (e) => props.setDomainMode(e.currentTarget.value));
|
|
10427
10635
|
insert(_el$2, createComponent(Show, {
|
|
10428
10636
|
get when() {
|
|
@@ -10451,11 +10659,30 @@ const SettingsPrivacy = (props) => {
|
|
|
10451
10659
|
return _tmpl$3$4();
|
|
10452
10660
|
}
|
|
10453
10661
|
}), null);
|
|
10454
|
-
_el$
|
|
10662
|
+
insert(_el$1, createComponent(For, {
|
|
10663
|
+
get each() {
|
|
10664
|
+
return permissions();
|
|
10665
|
+
},
|
|
10666
|
+
get fallback() {
|
|
10667
|
+
return _tmpl$5$3();
|
|
10668
|
+
},
|
|
10669
|
+
children: (item) => (() => {
|
|
10670
|
+
var _el$15 = _tmpl$6$3(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$17.firstChild;
|
|
10671
|
+
insert(_el$16, () => item.origin);
|
|
10672
|
+
insert(_el$17, () => item.permission, _el$18);
|
|
10673
|
+
insert(_el$17, () => item.decision, null);
|
|
10674
|
+
return _el$15;
|
|
10675
|
+
})()
|
|
10676
|
+
}));
|
|
10677
|
+
_el$10.$$click = async () => {
|
|
10678
|
+
await window.vessel.permissions.clear();
|
|
10679
|
+
await loadPermissions();
|
|
10680
|
+
};
|
|
10681
|
+
_el$13.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
|
|
10455
10682
|
createRenderEffect((_p$) => {
|
|
10456
10683
|
var _v$ = !!props.telemetryEnabled(), _v$2 = props.telemetryEnabled();
|
|
10457
|
-
_v$ !== _p$.e && _el$
|
|
10458
|
-
_v$2 !== _p$.t && setAttribute(_el$
|
|
10684
|
+
_v$ !== _p$.e && _el$13.classList.toggle("on", _p$.e = _v$);
|
|
10685
|
+
_v$2 !== _p$.t && setAttribute(_el$13, "aria-checked", _p$.t = _v$2);
|
|
10459
10686
|
return _p$;
|
|
10460
10687
|
}, {
|
|
10461
10688
|
e: void 0,
|
|
@@ -10953,6 +11180,29 @@ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><spa
|
|
|
10953
11180
|
border-color: color-mix(in srgb, var(--status-error) 32%, transparent);
|
|
10954
11181
|
background: color-mix(in srgb, var(--status-error) 6%, transparent);
|
|
10955
11182
|
}
|
|
11183
|
+
.settings-inline-actions {
|
|
11184
|
+
display: flex;
|
|
11185
|
+
flex-wrap: wrap;
|
|
11186
|
+
gap: 8px;
|
|
11187
|
+
margin-bottom: 8px;
|
|
11188
|
+
}
|
|
11189
|
+
.settings-secondary-btn {
|
|
11190
|
+
height: 32px;
|
|
11191
|
+
padding: 0 12px;
|
|
11192
|
+
border-radius: var(--radius-md);
|
|
11193
|
+
border: 1px solid var(--border-visible);
|
|
11194
|
+
background: var(--surface-glass);
|
|
11195
|
+
color: var(--text-primary);
|
|
11196
|
+
font-size: 12px;
|
|
11197
|
+
cursor: pointer;
|
|
11198
|
+
}
|
|
11199
|
+
.settings-secondary-btn:hover:not(:disabled) {
|
|
11200
|
+
background: var(--bg-tertiary);
|
|
11201
|
+
}
|
|
11202
|
+
.settings-secondary-btn:disabled {
|
|
11203
|
+
opacity: 0.55;
|
|
11204
|
+
cursor: not-allowed;
|
|
11205
|
+
}
|
|
10956
11206
|
.settings-label {
|
|
10957
11207
|
display: block;
|
|
10958
11208
|
font-size: 12px;
|
|
@@ -12781,6 +13031,7 @@ const App = () => {
|
|
|
12781
13031
|
const [highlightToast, setHighlightToast] = createSignal(null);
|
|
12782
13032
|
const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
|
|
12783
13033
|
const [clearDataOpen, setClearDataOpen] = createSignal(false);
|
|
13034
|
+
const [downloadsOpen, setDownloadsOpen] = createSignal(false);
|
|
12784
13035
|
const loadingPresence = useAnimatedPresence(() => !!activeTab()?.isLoading, 300);
|
|
12785
13036
|
const showHighlightResult = (result) => {
|
|
12786
13037
|
if (result.success && result.text) {
|
|
@@ -12911,7 +13162,9 @@ const App = () => {
|
|
|
12911
13162
|
return [createComponent(FlowProgress, {}), createComponent(AgentTranscriptDock, {})];
|
|
12912
13163
|
}
|
|
12913
13164
|
}), _el$2);
|
|
12914
|
-
insert(_el$2, createComponent(TitleBar, {
|
|
13165
|
+
insert(_el$2, createComponent(TitleBar, {
|
|
13166
|
+
onOpenDownloads: () => setDownloadsOpen(true)
|
|
13167
|
+
}), null);
|
|
12915
13168
|
insert(_el$2, createComponent(TabBar, {}), null);
|
|
12916
13169
|
insert(_el$2, createComponent(AddressBar, {
|
|
12917
13170
|
onClearData: () => setClearDataOpen(true)
|
|
@@ -12932,6 +13185,12 @@ const App = () => {
|
|
|
12932
13185
|
return [createComponent(CommandBar, {}), createComponent(Settings, {})];
|
|
12933
13186
|
}
|
|
12934
13187
|
}), null);
|
|
13188
|
+
insert(_el$, createComponent(DownloadsPanel, {
|
|
13189
|
+
get open() {
|
|
13190
|
+
return downloadsOpen();
|
|
13191
|
+
},
|
|
13192
|
+
onClose: () => setDownloadsOpen(false)
|
|
13193
|
+
}), null);
|
|
12935
13194
|
insert(_el$, createComponent(ClearBrowsingData, {
|
|
12936
13195
|
get open() {
|
|
12937
13196
|
return clearDataOpen();
|