@quanta-intellect/vessel-browser 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -7
- package/out/main/index.js +198 -84
- package/out/preload/content-script.js +19 -0
- package/out/preload/index.js +1 -1
- package/out/renderer/assets/{index-D38a5Gkn.js → index-DVD9XuhC.js} +298 -187
- package/out/renderer/assets/{index-DP2yMHwF.css → index-eS3ccAls.css} +79 -22
- package/out/renderer/index.html +2 -2
- package/package.json +2 -1
|
@@ -1696,6 +1696,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
|
|
|
1696
1696
|
return "idle";
|
|
1697
1697
|
}
|
|
1698
1698
|
var _tmpl$$d = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$b = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$8 = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list><button class=tab-new data-tooltip="New Tab">+`), _tmpl$4$8 = /* @__PURE__ */ template(`<div role=tab><span class=tab-title></span><button class=tab-close>×`), _tmpl$5$6 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$6$6 = /* @__PURE__ */ template(`<span class=tab-loading>`);
|
|
1699
|
+
const TAB_CLOSE_MS = 200;
|
|
1699
1700
|
function stringToHue(str) {
|
|
1700
1701
|
let hash = 0;
|
|
1701
1702
|
for (let i = 0; i < str.length; i++) {
|
|
@@ -1747,7 +1748,19 @@ const TabBar = () => {
|
|
|
1747
1748
|
runtimeState: runtimeState2
|
|
1748
1749
|
} = useRuntime();
|
|
1749
1750
|
const now2 = useNow();
|
|
1751
|
+
const [closingTabIds, setClosingTabIds] = createSignal(/* @__PURE__ */ new Set());
|
|
1750
1752
|
const modelActiveTabIds = createMemo(() => getAgentActiveTabIds(runtimeState2(), now2()));
|
|
1753
|
+
const handleClose = (id) => {
|
|
1754
|
+
setClosingTabIds((prev) => new Set(prev).add(id));
|
|
1755
|
+
setTimeout(() => {
|
|
1756
|
+
closeTab(id);
|
|
1757
|
+
setClosingTabIds((prev) => {
|
|
1758
|
+
const next = new Set(prev);
|
|
1759
|
+
next.delete(id);
|
|
1760
|
+
return next;
|
|
1761
|
+
});
|
|
1762
|
+
}, TAB_CLOSE_MS);
|
|
1763
|
+
};
|
|
1751
1764
|
return (() => {
|
|
1752
1765
|
var _el$3 = _tmpl$3$8(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
|
|
1753
1766
|
insert(_el$4, createComponent(For, {
|
|
@@ -1757,7 +1770,7 @@ const TabBar = () => {
|
|
|
1757
1770
|
children: (tab) => (() => {
|
|
1758
1771
|
var _el$6 = _tmpl$4$8(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
|
|
1759
1772
|
_el$6.addEventListener("auxclick", (e) => {
|
|
1760
|
-
if (e.button === 1)
|
|
1773
|
+
if (e.button === 1) handleClose(tab.id);
|
|
1761
1774
|
});
|
|
1762
1775
|
_el$6.$$click = () => switchTab(tab.id);
|
|
1763
1776
|
insert(_el$6, createComponent(TabFavicon, {
|
|
@@ -1782,16 +1795,18 @@ const TabBar = () => {
|
|
|
1782
1795
|
})(), _el$8);
|
|
1783
1796
|
_el$8.$$click = (e) => {
|
|
1784
1797
|
e.stopPropagation();
|
|
1785
|
-
|
|
1798
|
+
handleClose(tab.id);
|
|
1786
1799
|
};
|
|
1787
1800
|
createRenderEffect((_p$) => {
|
|
1788
|
-
var _v$ = `tab-item ${tab.id === activeTabId2() ? "active" : ""} ${modelActiveTabIds().has(tab.id) ? "model-active" : ""}`, _v$2 = modelActiveTabIds().has(tab.id) ? `${tab.title || "New Tab"} • Agent active` : tab.title;
|
|
1801
|
+
var _v$ = `tab-item ${tab.id === activeTabId2() ? "active" : ""} ${modelActiveTabIds().has(tab.id) ? "model-active" : ""}`, _v$2 = !!closingTabIds().has(tab.id), _v$3 = modelActiveTabIds().has(tab.id) ? `${tab.title || "New Tab"} • Agent active` : tab.title;
|
|
1789
1802
|
_v$ !== _p$.e && className(_el$6, _p$.e = _v$);
|
|
1790
|
-
_v$2 !== _p$.t &&
|
|
1803
|
+
_v$2 !== _p$.t && _el$6.classList.toggle("closing", _p$.t = _v$2);
|
|
1804
|
+
_v$3 !== _p$.a && setAttribute(_el$6, "title", _p$.a = _v$3);
|
|
1791
1805
|
return _p$;
|
|
1792
1806
|
}, {
|
|
1793
1807
|
e: void 0,
|
|
1794
|
-
t: void 0
|
|
1808
|
+
t: void 0,
|
|
1809
|
+
a: void 0
|
|
1795
1810
|
});
|
|
1796
1811
|
return _el$6;
|
|
1797
1812
|
})()
|
|
@@ -1818,14 +1833,28 @@ const [focusMode, setFocusMode] = createSignal(false);
|
|
|
1818
1833
|
const [commandBarOpen, setCommandBarOpen] = createSignal(false);
|
|
1819
1834
|
const [settingsOpen, setSettingsOpen] = createSignal(false);
|
|
1820
1835
|
const [devtoolsPanelOpen, setDevtoolsPanelOpen] = createSignal(false);
|
|
1821
|
-
let resizeRafId = null;
|
|
1822
1836
|
let pendingWidth = null;
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1837
|
+
let resizeInFlight = null;
|
|
1838
|
+
async function flushResize() {
|
|
1839
|
+
if (resizeInFlight) {
|
|
1840
|
+
await resizeInFlight;
|
|
1841
|
+
if (pendingWidth !== null) {
|
|
1842
|
+
return flushResize();
|
|
1843
|
+
}
|
|
1844
|
+
return;
|
|
1845
|
+
}
|
|
1846
|
+
resizeInFlight = (async () => {
|
|
1847
|
+
while (pendingWidth !== null) {
|
|
1848
|
+
const nextWidth = pendingWidth;
|
|
1849
|
+
pendingWidth = null;
|
|
1850
|
+
await window.vessel.ui.resizeSidebar(nextWidth);
|
|
1851
|
+
}
|
|
1852
|
+
})();
|
|
1853
|
+
try {
|
|
1854
|
+
await resizeInFlight;
|
|
1855
|
+
} finally {
|
|
1856
|
+
resizeInFlight = null;
|
|
1827
1857
|
}
|
|
1828
|
-
resizeRafId = null;
|
|
1829
1858
|
}
|
|
1830
1859
|
function useUI() {
|
|
1831
1860
|
return {
|
|
@@ -1847,20 +1876,12 @@ function useUI() {
|
|
|
1847
1876
|
);
|
|
1848
1877
|
setSidebarWidth(clamped);
|
|
1849
1878
|
pendingWidth = clamped;
|
|
1850
|
-
|
|
1851
|
-
resizeRafId = requestAnimationFrame(flushResize);
|
|
1852
|
-
}
|
|
1879
|
+
void flushResize();
|
|
1853
1880
|
},
|
|
1854
|
-
commitResize: () => {
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
}
|
|
1859
|
-
if (pendingWidth !== null) {
|
|
1860
|
-
window.vessel.ui.resizeSidebar(pendingWidth);
|
|
1861
|
-
pendingWidth = null;
|
|
1862
|
-
}
|
|
1863
|
-
window.vessel.ui.commitSidebarResize();
|
|
1881
|
+
commitResize: async () => {
|
|
1882
|
+
pendingWidth = sidebarWidth();
|
|
1883
|
+
await flushResize();
|
|
1884
|
+
await window.vessel.ui.commitSidebarResize();
|
|
1864
1885
|
},
|
|
1865
1886
|
toggleFocusMode: async () => {
|
|
1866
1887
|
const result = await window.vessel.ui.toggleFocusMode();
|
|
@@ -2116,6 +2137,15 @@ function useScrollFade(el) {
|
|
|
2116
2137
|
observer.disconnect();
|
|
2117
2138
|
});
|
|
2118
2139
|
}
|
|
2140
|
+
function formatTime(iso, options) {
|
|
2141
|
+
const d = new Date(iso);
|
|
2142
|
+
if (Number.isNaN(d.getTime())) return "";
|
|
2143
|
+
return d.toLocaleTimeString([], {
|
|
2144
|
+
hour: options?.includeSeconds ? "2-digit" : "numeric",
|
|
2145
|
+
minute: "2-digit",
|
|
2146
|
+
...options?.includeSeconds && { second: "2-digit" }
|
|
2147
|
+
});
|
|
2148
|
+
}
|
|
2119
2149
|
var _tmpl$$9 = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$3$7 = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$4$7 = /* @__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>`);
|
|
2120
2150
|
const AgentTranscriptDock = () => {
|
|
2121
2151
|
const {
|
|
@@ -2134,14 +2164,6 @@ const AgentTranscriptDock = () => {
|
|
|
2134
2164
|
});
|
|
2135
2165
|
const visibleEntries = createMemo(() => runtimeState2().transcript.slice(-6).reverse());
|
|
2136
2166
|
const hasStreamingEntry = createMemo(() => visibleEntries().some((entry) => entry.status === "streaming"));
|
|
2137
|
-
const formatTime2 = (value) => {
|
|
2138
|
-
const date = new Date(value);
|
|
2139
|
-
if (Number.isNaN(date.getTime())) return "";
|
|
2140
|
-
return date.toLocaleTimeString([], {
|
|
2141
|
-
hour: "numeric",
|
|
2142
|
-
minute: "2-digit"
|
|
2143
|
-
});
|
|
2144
|
-
};
|
|
2145
2167
|
const hideDock = async () => {
|
|
2146
2168
|
setMode("off");
|
|
2147
2169
|
await window.vessel.settings.set("agentTranscriptMode", "off");
|
|
@@ -2179,7 +2201,7 @@ const AgentTranscriptDock = () => {
|
|
|
2179
2201
|
children: (entry) => (() => {
|
|
2180
2202
|
var _el$0 = _tmpl$4$7(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling;
|
|
2181
2203
|
insert(_el$10, () => entry.title || entry.kind);
|
|
2182
|
-
insert(_el$11, () =>
|
|
2204
|
+
insert(_el$11, () => formatTime(entry.updatedAt));
|
|
2183
2205
|
insert(_el$12, () => entry.text);
|
|
2184
2206
|
createRenderEffect((_p$) => {
|
|
2185
2207
|
var _v$3 = `agent-transcript-entry ${entry.kind}`, _v$4 = !!(entry.status === "streaming");
|
|
@@ -2453,7 +2475,35 @@ function useAI() {
|
|
|
2453
2475
|
}
|
|
2454
2476
|
};
|
|
2455
2477
|
}
|
|
2478
|
+
function useAnimatedPresence(isOpen, exitDurationMs) {
|
|
2479
|
+
const [visible, setVisible] = createSignal(false);
|
|
2480
|
+
const [closing, setClosing] = createSignal(false);
|
|
2481
|
+
let exitTimer;
|
|
2482
|
+
createEffect(() => {
|
|
2483
|
+
const open = isOpen();
|
|
2484
|
+
if (open) {
|
|
2485
|
+
if (exitTimer) {
|
|
2486
|
+
clearTimeout(exitTimer);
|
|
2487
|
+
exitTimer = void 0;
|
|
2488
|
+
}
|
|
2489
|
+
setClosing(false);
|
|
2490
|
+
setVisible(true);
|
|
2491
|
+
} else if (visible()) {
|
|
2492
|
+
setClosing(true);
|
|
2493
|
+
exitTimer = window.setTimeout(() => {
|
|
2494
|
+
setVisible(false);
|
|
2495
|
+
setClosing(false);
|
|
2496
|
+
exitTimer = void 0;
|
|
2497
|
+
}, exitDurationMs);
|
|
2498
|
+
}
|
|
2499
|
+
});
|
|
2500
|
+
onCleanup(() => {
|
|
2501
|
+
if (exitTimer) clearTimeout(exitTimer);
|
|
2502
|
+
});
|
|
2503
|
+
return { visible, closing };
|
|
2504
|
+
}
|
|
2456
2505
|
var _tmpl$$8 = /* @__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$7 = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$6 = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$6 = /* @__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$5 = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$5 = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
|
|
2506
|
+
const COMMAND_BAR_EXIT_MS = 200;
|
|
2457
2507
|
const CommandBar = () => {
|
|
2458
2508
|
const {
|
|
2459
2509
|
commandBarOpen: commandBarOpen2,
|
|
@@ -2461,6 +2511,10 @@ const CommandBar = () => {
|
|
|
2461
2511
|
toggleSidebar,
|
|
2462
2512
|
openSettings
|
|
2463
2513
|
} = useUI();
|
|
2514
|
+
const {
|
|
2515
|
+
visible,
|
|
2516
|
+
closing
|
|
2517
|
+
} = useAnimatedPresence(commandBarOpen2, COMMAND_BAR_EXIT_MS);
|
|
2464
2518
|
const {
|
|
2465
2519
|
query,
|
|
2466
2520
|
recentQueries: recentQueries2,
|
|
@@ -2499,7 +2553,7 @@ const CommandBar = () => {
|
|
|
2499
2553
|
};
|
|
2500
2554
|
return createComponent(Show, {
|
|
2501
2555
|
get when() {
|
|
2502
|
-
return
|
|
2556
|
+
return visible();
|
|
2503
2557
|
},
|
|
2504
2558
|
get children() {
|
|
2505
2559
|
var _el$ = _tmpl$4$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$10 = _el$3.nextSibling, _el$11 = _el$10.firstChild;
|
|
@@ -2556,13 +2610,15 @@ const CommandBar = () => {
|
|
|
2556
2610
|
}
|
|
2557
2611
|
}), null);
|
|
2558
2612
|
createRenderEffect((_p$) => {
|
|
2559
|
-
var _v$ = hasProvider() ? "Ask about this page, summarize, or search..." : "No chat provider configured", _v$
|
|
2560
|
-
_v$ !== _p$.e &&
|
|
2561
|
-
_v$2 !== _p$.t && (_el$5
|
|
2613
|
+
var _v$ = !!closing(), _v$2 = hasProvider() ? "Ask about this page, summarize, or search..." : "No chat provider configured", _v$3 = !hasProvider();
|
|
2614
|
+
_v$ !== _p$.e && _el$.classList.toggle("closing", _p$.e = _v$);
|
|
2615
|
+
_v$2 !== _p$.t && setAttribute(_el$5, "placeholder", _p$.t = _v$2);
|
|
2616
|
+
_v$3 !== _p$.a && (_el$5.disabled = _p$.a = _v$3);
|
|
2562
2617
|
return _p$;
|
|
2563
2618
|
}, {
|
|
2564
2619
|
e: void 0,
|
|
2565
|
-
t: void 0
|
|
2620
|
+
t: void 0,
|
|
2621
|
+
a: void 0
|
|
2566
2622
|
});
|
|
2567
2623
|
createRenderEffect(() => _el$5.value = input());
|
|
2568
2624
|
return _el$;
|
|
@@ -2600,7 +2656,7 @@ function useBookmarks() {
|
|
|
2600
2656
|
removeBookmark: (id) => window.vessel.bookmarks.removeBookmark(id),
|
|
2601
2657
|
createFolder: (name) => window.vessel.bookmarks.createFolder(name),
|
|
2602
2658
|
createFolderWithSummary: (name, summary) => window.vessel.bookmarks.createFolderWithSummary(name, summary),
|
|
2603
|
-
removeFolder: (id) => window.vessel.bookmarks.removeFolder(id),
|
|
2659
|
+
removeFolder: (id, deleteContents) => window.vessel.bookmarks.removeFolder(id, deleteContents),
|
|
2604
2660
|
renameFolder: (id, newName, summary) => window.vessel.bookmarks.renameFolder(id, newName, summary)
|
|
2605
2661
|
};
|
|
2606
2662
|
}
|
|
@@ -4028,6 +4084,9 @@ ${token}
|
|
|
4028
4084
|
ALLOWED_ATTR: ["href", "target", "rel", "data-language", "style", "class"]
|
|
4029
4085
|
});
|
|
4030
4086
|
}
|
|
4087
|
+
function isPremiumStatus(status) {
|
|
4088
|
+
return status === "active" || status === "trialing";
|
|
4089
|
+
}
|
|
4031
4090
|
const WORD_NORMALIZATIONS = [
|
|
4032
4091
|
[/\bminutes?\b/g, "min"],
|
|
4033
4092
|
[/\bmins?\b/g, "min"],
|
|
@@ -4517,7 +4576,7 @@ function renderKitPrompt(kit, values) {
|
|
|
4517
4576
|
(_, key) => values[key] ?? ""
|
|
4518
4577
|
);
|
|
4519
4578
|
}
|
|
4520
|
-
var _tmpl$$5 = /* @__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>
|
|
4579
|
+
var _tmpl$$5 = /* @__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$5 = /* @__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$4 = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$4 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$4 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$3 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$3 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$3 = /* @__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$3 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$3 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$3 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$3 = /* @__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$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$2 = /* @__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$2 = /* @__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$2 = /* @__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$2 = /* @__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>`);
|
|
4521
4580
|
const ICON_MAP = {
|
|
4522
4581
|
BookOpen: book_open_default,
|
|
4523
4582
|
Tag: tag_default,
|
|
@@ -4637,10 +4696,7 @@ const AutomationTab = (props) => {
|
|
|
4637
4696
|
const [premiumData] = createResource(() => window.vessel.premium.getState().catch(() => ({
|
|
4638
4697
|
status: "free"
|
|
4639
4698
|
})));
|
|
4640
|
-
const isPremium = () =>
|
|
4641
|
-
const s = premiumData()?.status;
|
|
4642
|
-
return s === "active" || s === "trialing";
|
|
4643
|
-
};
|
|
4699
|
+
const isPremium = () => isPremiumStatus(premiumData()?.status);
|
|
4644
4700
|
const [installedKits, {
|
|
4645
4701
|
refetch: refetchInstalled
|
|
4646
4702
|
}] = createResource(() => isPremium(), (active) => active ? window.vessel.automation.getInstalled().catch(() => []) : Promise.resolve([]));
|
|
@@ -5355,7 +5411,7 @@ const AutomationTab = (props) => {
|
|
|
5355
5411
|
};
|
|
5356
5412
|
delegateEvents(["click", "input", "keydown", "contextmenu"]);
|
|
5357
5413
|
const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
|
|
5358
|
-
var _tmpl$$4 = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$4 = /* @__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 free trial</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$3 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$3 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$5$3 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$6$3 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$7$2 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2>`), _tmpl$9$2 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$0$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$1$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$10$2 = /* @__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 free trial</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$11$2 = /* @__PURE__ */ template(`<span>`), _tmpl$12$2 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$13$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$14$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$15$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$16$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$17$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$18$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$19$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$22$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$23$1 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button></div><div class=sidebar-messages><div>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$30$1 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$32 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$33 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$34 = /* @__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$35 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$41 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$42 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$43 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><button class=agent-control-button type=button>Restore`), _tmpl$44 = /* @__PURE__ */ template(`<div>`), _tmpl$45 = /* @__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$46 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$47 = /* @__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$48 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
|
|
5414
|
+
var _tmpl$$4 = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$4 = /* @__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$3 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$3 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$5$3 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$6$3 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$7$2 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2>`), _tmpl$9$2 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$0$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$1$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$10$2 = /* @__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$11$2 = /* @__PURE__ */ template(`<span>`), _tmpl$12$2 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$13$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$14$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$15$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$16$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$17$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$18$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$19$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$22$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$23$1 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button></div><div class=sidebar-messages><div>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$30$1 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$32 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$33 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$34 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$35 = /* @__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$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$38 = /* @__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$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$40 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$43 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$44 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$45 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><button class=agent-control-button type=button>Restore`), _tmpl$46 = /* @__PURE__ */ template(`<div>`), _tmpl$47 = /* @__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$48 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$49 = /* @__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$50 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
|
|
5359
5415
|
const UNSORTED_FOLDER = {
|
|
5360
5416
|
id: "unsorted",
|
|
5361
5417
|
name: "Unsorted",
|
|
@@ -5380,7 +5436,7 @@ function getPremiumPromptKind(content) {
|
|
|
5380
5436
|
}
|
|
5381
5437
|
const PremiumPromptCard = (props) => {
|
|
5382
5438
|
const title = props.kind === "premium_gate" ? "This workflow needs Premium" : "Need a longer autonomous run?";
|
|
5383
|
-
const body = props.kind === "premium_gate" ? "Unlock screenshots, saved sessions, workflow tracking, table extraction, and the credential vault with a
|
|
5439
|
+
const body = props.kind === "premium_gate" ? "Unlock screenshots, saved sessions, workflow tracking, table extraction, and the credential vault with a 7-day free trial." : "Free chats pause after 50 tool calls in a turn. Vessel Premium raises the ceiling so the agent can finish longer workflows without stopping.";
|
|
5384
5440
|
return (() => {
|
|
5385
5441
|
var _el$2 = _tmpl$2$4(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
|
|
5386
5442
|
insert(_el$4, title);
|
|
@@ -5450,10 +5506,7 @@ const Sidebar = (props) => {
|
|
|
5450
5506
|
expiresAt: ""
|
|
5451
5507
|
});
|
|
5452
5508
|
const trackedPremiumContexts = /* @__PURE__ */ new Set();
|
|
5453
|
-
const isPremium = () =>
|
|
5454
|
-
const status = premiumState().status;
|
|
5455
|
-
return status === "active" || status === "trialing";
|
|
5456
|
-
};
|
|
5509
|
+
const isPremium = () => isPremiumStatus(premiumState().status);
|
|
5457
5510
|
const trackPremiumContext = (step) => {
|
|
5458
5511
|
if (trackedPremiumContexts.has(step)) return;
|
|
5459
5512
|
trackedPremiumContexts.add(step);
|
|
@@ -5613,6 +5666,7 @@ ${contextBlock}` : contextBlock);
|
|
|
5613
5666
|
const [editingFolderId, setEditingFolderId] = createSignal(null);
|
|
5614
5667
|
const [editingFolderName, setEditingFolderName] = createSignal("");
|
|
5615
5668
|
const [editingFolderSummary, setEditingFolderSummary] = createSignal("");
|
|
5669
|
+
const [deletingFolderId, setDeletingFolderId] = createSignal(null);
|
|
5616
5670
|
const [expandedFolderIds, setExpandedFolderIds] = createSignal([UNSORTED_FOLDER.id]);
|
|
5617
5671
|
const [actionsExpanded, setActionsExpanded] = createSignal(false);
|
|
5618
5672
|
const [checkpointsExpanded, setCheckpointsExpanded] = createSignal(false);
|
|
@@ -5712,24 +5766,52 @@ ${contextBlock}` : contextBlock);
|
|
|
5712
5766
|
setIsDragging(true);
|
|
5713
5767
|
document.body.style.cursor = "col-resize";
|
|
5714
5768
|
document.body.style.userSelect = "none";
|
|
5715
|
-
window.vessel.ui.startSidebarResize()
|
|
5769
|
+
void window.vessel.ui.startSidebarResize().catch(() => {
|
|
5770
|
+
});
|
|
5716
5771
|
const startX = e.screenX;
|
|
5717
5772
|
const startWidth = sidebarWidth2();
|
|
5773
|
+
let finished = false;
|
|
5774
|
+
const clearPointerTracking = () => {
|
|
5775
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
5776
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
5777
|
+
window.removeEventListener("pointercancel", onPointerUp);
|
|
5778
|
+
window.removeEventListener("blur", onWindowBlur);
|
|
5779
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
5780
|
+
target.removeEventListener("lostpointercapture", onPointerUp);
|
|
5781
|
+
if (target.hasPointerCapture?.(e.pointerId)) {
|
|
5782
|
+
target.releasePointerCapture(e.pointerId);
|
|
5783
|
+
}
|
|
5784
|
+
};
|
|
5718
5785
|
const onPointerMove = (ev) => {
|
|
5719
5786
|
const delta = startX - ev.screenX;
|
|
5720
5787
|
resizeSidebar(startWidth + delta);
|
|
5721
5788
|
};
|
|
5722
|
-
const
|
|
5789
|
+
const finishResize = () => {
|
|
5790
|
+
if (finished) return;
|
|
5791
|
+
finished = true;
|
|
5723
5792
|
setIsDragging(false);
|
|
5724
|
-
|
|
5725
|
-
target.removeEventListener("pointermove", onPointerMove);
|
|
5726
|
-
target.removeEventListener("pointerup", onPointerUp);
|
|
5727
|
-
target.removeEventListener("lostpointercapture", onPointerUp);
|
|
5793
|
+
clearPointerTracking();
|
|
5728
5794
|
document.body.style.cursor = "";
|
|
5729
5795
|
document.body.style.userSelect = "";
|
|
5796
|
+
void commitResize().catch(() => {
|
|
5797
|
+
});
|
|
5730
5798
|
};
|
|
5731
|
-
|
|
5732
|
-
|
|
5799
|
+
const onPointerUp = () => {
|
|
5800
|
+
finishResize();
|
|
5801
|
+
};
|
|
5802
|
+
const onWindowBlur = () => {
|
|
5803
|
+
finishResize();
|
|
5804
|
+
};
|
|
5805
|
+
const onVisibilityChange = () => {
|
|
5806
|
+
if (document.hidden) {
|
|
5807
|
+
finishResize();
|
|
5808
|
+
}
|
|
5809
|
+
};
|
|
5810
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
5811
|
+
window.addEventListener("pointerup", onPointerUp);
|
|
5812
|
+
window.addEventListener("pointercancel", onPointerUp);
|
|
5813
|
+
window.addEventListener("blur", onWindowBlur);
|
|
5814
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
5733
5815
|
target.addEventListener("lostpointercapture", onPointerUp);
|
|
5734
5816
|
};
|
|
5735
5817
|
const formatBookmarkDate = (savedAt) => new Date(savedAt).toLocaleDateString(void 0, {
|
|
@@ -5763,11 +5845,10 @@ ${contextBlock}` : contextBlock);
|
|
|
5763
5845
|
setEditingFolderName("");
|
|
5764
5846
|
setEditingFolderSummary("");
|
|
5765
5847
|
};
|
|
5766
|
-
const handleRemoveFolder = async (folderId) => {
|
|
5767
|
-
const
|
|
5768
|
-
if (!confirmed) return;
|
|
5769
|
-
const removed = await removeFolder(folderId);
|
|
5848
|
+
const handleRemoveFolder = async (folderId, deleteContents) => {
|
|
5849
|
+
const removed = await removeFolder(folderId, deleteContents);
|
|
5770
5850
|
if (!removed) return;
|
|
5851
|
+
setDeletingFolderId(null);
|
|
5771
5852
|
if (selectedFolderId() === folderId) {
|
|
5772
5853
|
setSelectedFolderId(UNSORTED_FOLDER.id);
|
|
5773
5854
|
}
|
|
@@ -6001,7 +6082,7 @@ ${contextBlock}` : contextBlock);
|
|
|
6001
6082
|
return filteredGroupedBookmarks();
|
|
6002
6083
|
},
|
|
6003
6084
|
children: (folder) => (() => {
|
|
6004
|
-
var _el$122 = _tmpl$
|
|
6085
|
+
var _el$122 = _tmpl$38(), _el$123 = _el$122.firstChild, _el$124 = _el$123.firstChild, _el$125 = _el$124.firstChild, _el$126 = _el$125.nextSibling, _el$127 = _el$126.firstChild, _el$128 = _el$127.nextSibling, _el$129 = _el$128.firstChild;
|
|
6005
6086
|
_el$123.$$keydown = (e) => {
|
|
6006
6087
|
if (e.key === "Enter" || e.key === " ") {
|
|
6007
6088
|
e.preventDefault();
|
|
@@ -6035,29 +6116,58 @@ ${contextBlock}` : contextBlock);
|
|
|
6035
6116
|
};
|
|
6036
6117
|
_el$133.$$click = (e) => {
|
|
6037
6118
|
e.stopPropagation();
|
|
6038
|
-
|
|
6119
|
+
setDeletingFolderId(folder.id);
|
|
6039
6120
|
};
|
|
6040
6121
|
return _el$131;
|
|
6041
6122
|
}
|
|
6042
6123
|
}), null);
|
|
6124
|
+
insert(_el$122, createComponent(Show, {
|
|
6125
|
+
get when() {
|
|
6126
|
+
return deletingFolderId() === folder.id;
|
|
6127
|
+
},
|
|
6128
|
+
get children() {
|
|
6129
|
+
var _el$134 = _tmpl$35(), _el$135 = _el$134.firstChild, _el$136 = _el$135.firstChild, _el$138 = _el$136.nextSibling;
|
|
6130
|
+
_el$138.nextSibling;
|
|
6131
|
+
var _el$139 = _el$135.nextSibling, _el$141 = _el$139.firstChild, _el$142 = _el$141.nextSibling;
|
|
6132
|
+
insert(_el$135, () => folder.name, _el$138);
|
|
6133
|
+
insert(_el$135, (() => {
|
|
6134
|
+
var _c$6 = memo(() => folder.items.length > 0);
|
|
6135
|
+
return () => _c$6() ? ` This folder has ${folder.items.length} bookmark${folder.items.length === 1 ? "" : "s"}.` : "";
|
|
6136
|
+
})(), null);
|
|
6137
|
+
insert(_el$139, createComponent(Show, {
|
|
6138
|
+
get when() {
|
|
6139
|
+
return folder.items.length > 0;
|
|
6140
|
+
},
|
|
6141
|
+
get children() {
|
|
6142
|
+
var _el$140 = _tmpl$34();
|
|
6143
|
+
_el$140.$$click = () => void handleRemoveFolder(folder.id, false);
|
|
6144
|
+
return _el$140;
|
|
6145
|
+
}
|
|
6146
|
+
}), _el$141);
|
|
6147
|
+
_el$141.$$click = () => void handleRemoveFolder(folder.id, true);
|
|
6148
|
+
insert(_el$141, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
|
|
6149
|
+
_el$142.$$click = () => setDeletingFolderId(null);
|
|
6150
|
+
return _el$134;
|
|
6151
|
+
}
|
|
6152
|
+
}), null);
|
|
6043
6153
|
insert(_el$122, createComponent(Show, {
|
|
6044
6154
|
get when() {
|
|
6045
6155
|
return editingFolderId() === folder.id;
|
|
6046
6156
|
},
|
|
6047
6157
|
get children() {
|
|
6048
|
-
var _el$
|
|
6049
|
-
_el$
|
|
6050
|
-
_el$
|
|
6051
|
-
_el$
|
|
6052
|
-
_el$
|
|
6158
|
+
var _el$143 = _tmpl$36(), _el$144 = _el$143.firstChild, _el$145 = _el$144.firstChild, _el$146 = _el$145.nextSibling, _el$147 = _el$144.nextSibling, _el$148 = _el$147.nextSibling;
|
|
6159
|
+
_el$145.$$input = (e) => setEditingFolderName(e.currentTarget.value);
|
|
6160
|
+
_el$146.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
|
|
6161
|
+
_el$147.$$click = () => void handleRenameFolder(folder.id);
|
|
6162
|
+
_el$148.$$click = () => {
|
|
6053
6163
|
setEditingFolderId(null);
|
|
6054
6164
|
setEditingFolderName("");
|
|
6055
6165
|
setEditingFolderSummary("");
|
|
6056
6166
|
};
|
|
6057
|
-
createRenderEffect(() => _el$
|
|
6058
|
-
createRenderEffect(() => _el$
|
|
6059
|
-
createRenderEffect(() => _el$
|
|
6060
|
-
return _el$
|
|
6167
|
+
createRenderEffect(() => _el$147.disabled = !editingFolderName().trim());
|
|
6168
|
+
createRenderEffect(() => _el$145.value = editingFolderName());
|
|
6169
|
+
createRenderEffect(() => _el$146.value = editingFolderSummary());
|
|
6170
|
+
return _el$143;
|
|
6061
6171
|
}
|
|
6062
6172
|
}), null);
|
|
6063
6173
|
insert(_el$122, createComponent(Show, {
|
|
@@ -6065,7 +6175,7 @@ ${contextBlock}` : contextBlock);
|
|
|
6065
6175
|
return isFolderExpanded(folder.id);
|
|
6066
6176
|
},
|
|
6067
6177
|
get fallback() {
|
|
6068
|
-
return _tmpl$
|
|
6178
|
+
return _tmpl$39();
|
|
6069
6179
|
},
|
|
6070
6180
|
get children() {
|
|
6071
6181
|
return createComponent(Show, {
|
|
@@ -6073,36 +6183,36 @@ ${contextBlock}` : contextBlock);
|
|
|
6073
6183
|
return folder.items.length > 0;
|
|
6074
6184
|
},
|
|
6075
6185
|
get fallback() {
|
|
6076
|
-
return _tmpl$
|
|
6186
|
+
return _tmpl$40();
|
|
6077
6187
|
},
|
|
6078
6188
|
get children() {
|
|
6079
|
-
var _el$
|
|
6080
|
-
insert(_el$
|
|
6189
|
+
var _el$149 = _tmpl$37();
|
|
6190
|
+
insert(_el$149, createComponent(For, {
|
|
6081
6191
|
get each() {
|
|
6082
6192
|
return folder.items;
|
|
6083
6193
|
},
|
|
6084
6194
|
children: (bookmark) => (() => {
|
|
6085
|
-
var _el$
|
|
6086
|
-
_el$
|
|
6087
|
-
insert(_el$
|
|
6088
|
-
insert(_el$
|
|
6089
|
-
insert(_el$
|
|
6195
|
+
var _el$152 = _tmpl$42(), _el$153 = _el$152.firstChild, _el$154 = _el$153.firstChild, _el$155 = _el$154.nextSibling, _el$157 = _el$153.nextSibling, _el$158 = _el$157.firstChild, _el$159 = _el$158.nextSibling;
|
|
6196
|
+
_el$153.$$click = () => void createTab(bookmark.url);
|
|
6197
|
+
insert(_el$154, () => bookmark.title || bookmark.url);
|
|
6198
|
+
insert(_el$155, () => bookmark.url);
|
|
6199
|
+
insert(_el$152, createComponent(Show, {
|
|
6090
6200
|
get when() {
|
|
6091
6201
|
return bookmark.note;
|
|
6092
6202
|
},
|
|
6093
6203
|
get children() {
|
|
6094
|
-
var _el$
|
|
6095
|
-
insert(_el$
|
|
6096
|
-
return _el$
|
|
6204
|
+
var _el$156 = _tmpl$41();
|
|
6205
|
+
insert(_el$156, () => bookmark.note);
|
|
6206
|
+
return _el$156;
|
|
6097
6207
|
}
|
|
6098
|
-
}), _el$
|
|
6099
|
-
insert(_el$
|
|
6100
|
-
_el$
|
|
6101
|
-
createRenderEffect(() => setAttribute(_el$
|
|
6102
|
-
return _el$
|
|
6208
|
+
}), _el$157);
|
|
6209
|
+
insert(_el$158, () => formatBookmarkDate(bookmark.savedAt));
|
|
6210
|
+
_el$159.$$click = () => void removeBookmark(bookmark.id);
|
|
6211
|
+
createRenderEffect(() => setAttribute(_el$152, "data-bookmark-id", bookmark.id));
|
|
6212
|
+
return _el$152;
|
|
6103
6213
|
})()
|
|
6104
6214
|
}));
|
|
6105
|
-
return _el$
|
|
6215
|
+
return _el$149;
|
|
6106
6216
|
}
|
|
6107
6217
|
});
|
|
6108
6218
|
}
|
|
@@ -6150,7 +6260,7 @@ ${contextBlock}` : contextBlock);
|
|
|
6150
6260
|
return recentCheckpoints().length > 0;
|
|
6151
6261
|
},
|
|
6152
6262
|
get fallback() {
|
|
6153
|
-
return _tmpl$
|
|
6263
|
+
return _tmpl$43();
|
|
6154
6264
|
},
|
|
6155
6265
|
get children() {
|
|
6156
6266
|
var _el$71 = _tmpl$0$2();
|
|
@@ -6159,20 +6269,20 @@ ${contextBlock}` : contextBlock);
|
|
|
6159
6269
|
return recentCheckpoints();
|
|
6160
6270
|
},
|
|
6161
6271
|
children: (checkpoint, i) => (() => {
|
|
6162
|
-
var _el$
|
|
6163
|
-
insert(_el$
|
|
6272
|
+
var _el$161 = _tmpl$45(), _el$162 = _el$161.firstChild, _el$163 = _el$162.firstChild, _el$165 = _el$162.nextSibling, _el$166 = _el$165.firstChild, _el$167 = _el$166.nextSibling, _el$168 = _el$167.nextSibling;
|
|
6273
|
+
insert(_el$162, createComponent(Show, {
|
|
6164
6274
|
get when() {
|
|
6165
6275
|
return i() < recentCheckpoints().length - 1;
|
|
6166
6276
|
},
|
|
6167
6277
|
get children() {
|
|
6168
|
-
return _tmpl$
|
|
6278
|
+
return _tmpl$44();
|
|
6169
6279
|
}
|
|
6170
6280
|
}), null);
|
|
6171
|
-
insert(_el$
|
|
6172
|
-
insert(_el$
|
|
6173
|
-
_el$
|
|
6174
|
-
createRenderEffect(() => _el$
|
|
6175
|
-
return _el$
|
|
6281
|
+
insert(_el$166, () => checkpoint.name);
|
|
6282
|
+
insert(_el$167, () => new Date(checkpoint.createdAt).toLocaleString());
|
|
6283
|
+
_el$168.$$click = () => void restoreCheckpoint(checkpoint.id);
|
|
6284
|
+
createRenderEffect(() => _el$163.classList.toggle("latest", !!(i() === 0)));
|
|
6285
|
+
return _el$161;
|
|
6176
6286
|
})()
|
|
6177
6287
|
}));
|
|
6178
6288
|
return _el$71;
|
|
@@ -6212,13 +6322,13 @@ ${contextBlock}` : contextBlock);
|
|
|
6212
6322
|
return messages2();
|
|
6213
6323
|
},
|
|
6214
6324
|
children: (msg) => (() => {
|
|
6215
|
-
var _el$
|
|
6216
|
-
insert(_el$
|
|
6325
|
+
var _el$169 = _tmpl$46();
|
|
6326
|
+
insert(_el$169, createComponent(MarkdownMessage, {
|
|
6217
6327
|
get content() {
|
|
6218
6328
|
return msg.content;
|
|
6219
6329
|
}
|
|
6220
6330
|
}), null);
|
|
6221
|
-
insert(_el$
|
|
6331
|
+
insert(_el$169, createComponent(Show, {
|
|
6222
6332
|
get when() {
|
|
6223
6333
|
return memo(() => msg.role === "assistant")() ? getPremiumPromptKind(msg.content) : null;
|
|
6224
6334
|
},
|
|
@@ -6231,8 +6341,8 @@ ${contextBlock}` : contextBlock);
|
|
|
6231
6341
|
onOpenSettings: openPremiumDetails
|
|
6232
6342
|
})
|
|
6233
6343
|
}), null);
|
|
6234
|
-
createRenderEffect(() => className(_el$
|
|
6235
|
-
return _el$
|
|
6344
|
+
createRenderEffect(() => className(_el$169, `message message-${msg.role}`));
|
|
6345
|
+
return _el$169;
|
|
6236
6346
|
})()
|
|
6237
6347
|
}), createComponent(Show, {
|
|
6238
6348
|
get when() {
|
|
@@ -6245,7 +6355,7 @@ ${contextBlock}` : contextBlock);
|
|
|
6245
6355
|
return hasFirstChunk2();
|
|
6246
6356
|
},
|
|
6247
6357
|
get fallback() {
|
|
6248
|
-
return _tmpl$
|
|
6358
|
+
return _tmpl$47();
|
|
6249
6359
|
},
|
|
6250
6360
|
get children() {
|
|
6251
6361
|
var _el$80 = _tmpl$12$2(), _el$81 = _el$80.firstChild, _el$82 = _el$81.firstChild;
|
|
@@ -6293,22 +6403,22 @@ ${contextBlock}` : contextBlock);
|
|
|
6293
6403
|
return runtimeState2().supervisor.pendingApprovals;
|
|
6294
6404
|
},
|
|
6295
6405
|
children: (approval) => (() => {
|
|
6296
|
-
var _el$
|
|
6297
|
-
insert(_el$
|
|
6298
|
-
insert(_el$
|
|
6406
|
+
var _el$171 = _tmpl$49(), _el$172 = _el$171.firstChild, _el$173 = _el$172.nextSibling, _el$174 = _el$173.firstChild, _el$175 = _el$174.firstChild, _el$176 = _el$175.nextSibling, _el$178 = _el$174.nextSibling, _el$179 = _el$178.nextSibling, _el$180 = _el$179.firstChild, _el$181 = _el$180.nextSibling;
|
|
6407
|
+
insert(_el$176, () => approval.name);
|
|
6408
|
+
insert(_el$173, createComponent(Show, {
|
|
6299
6409
|
get when() {
|
|
6300
6410
|
return approval.argsSummary;
|
|
6301
6411
|
},
|
|
6302
6412
|
get children() {
|
|
6303
|
-
var _el$
|
|
6304
|
-
insert(_el$
|
|
6305
|
-
return _el$
|
|
6413
|
+
var _el$177 = _tmpl$48();
|
|
6414
|
+
insert(_el$177, () => approval.argsSummary);
|
|
6415
|
+
return _el$177;
|
|
6306
6416
|
}
|
|
6307
|
-
}), _el$
|
|
6308
|
-
insert(_el$
|
|
6309
|
-
_el$
|
|
6310
|
-
_el$
|
|
6311
|
-
return _el$
|
|
6417
|
+
}), _el$178);
|
|
6418
|
+
insert(_el$178, () => approval.reason);
|
|
6419
|
+
_el$180.$$click = () => void resolveApproval(approval.id, true);
|
|
6420
|
+
_el$181.$$click = () => void resolveApproval(approval.id, false);
|
|
6421
|
+
return _el$171;
|
|
6312
6422
|
})()
|
|
6313
6423
|
});
|
|
6314
6424
|
}
|
|
@@ -6411,12 +6521,12 @@ ${contextBlock}` : contextBlock);
|
|
|
6411
6521
|
return pendingQueries2();
|
|
6412
6522
|
},
|
|
6413
6523
|
children: (pendingPrompt, index) => (() => {
|
|
6414
|
-
var _el$
|
|
6415
|
-
setAttribute(_el$
|
|
6416
|
-
insert(_el$
|
|
6417
|
-
_el$
|
|
6418
|
-
createRenderEffect(() => setAttribute(_el$
|
|
6419
|
-
return _el$
|
|
6524
|
+
var _el$182 = _tmpl$50(), _el$183 = _el$182.firstChild, _el$184 = _el$183.nextSibling;
|
|
6525
|
+
setAttribute(_el$183, "title", pendingPrompt);
|
|
6526
|
+
insert(_el$183, pendingPrompt);
|
|
6527
|
+
_el$184.$$click = () => removePendingQuery(index());
|
|
6528
|
+
createRenderEffect(() => setAttribute(_el$184, "aria-label", `Remove queued prompt ${index() + 1}`));
|
|
6529
|
+
return _el$182;
|
|
6420
6530
|
})()
|
|
6421
6531
|
}));
|
|
6422
6532
|
return _el$99;
|
|
@@ -6486,18 +6596,6 @@ ${contextBlock}` : contextBlock);
|
|
|
6486
6596
|
};
|
|
6487
6597
|
delegateEvents(["click", "pointerdown", "input", "keydown"]);
|
|
6488
6598
|
var _tmpl$$3 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$2 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$2 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$2 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$2 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$1 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
|
|
6489
|
-
function formatTime(iso) {
|
|
6490
|
-
try {
|
|
6491
|
-
const d = new Date(iso);
|
|
6492
|
-
return d.toLocaleTimeString([], {
|
|
6493
|
-
hour: "2-digit",
|
|
6494
|
-
minute: "2-digit",
|
|
6495
|
-
second: "2-digit"
|
|
6496
|
-
});
|
|
6497
|
-
} catch {
|
|
6498
|
-
return "";
|
|
6499
|
-
}
|
|
6500
|
-
}
|
|
6501
6599
|
function statusClass(status) {
|
|
6502
6600
|
if (status == null) return "pending";
|
|
6503
6601
|
if (status >= 200 && status < 300) return "ok";
|
|
@@ -6572,7 +6670,9 @@ const ConsoleView = (props) => {
|
|
|
6572
6670
|
children: (entry) => (() => {
|
|
6573
6671
|
var _el$3 = _tmpl$3$2(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
|
|
6574
6672
|
insert(_el$4, () => entry.level);
|
|
6575
|
-
insert(_el$5, () => formatTime(entry.timestamp
|
|
6673
|
+
insert(_el$5, () => formatTime(entry.timestamp, {
|
|
6674
|
+
includeSeconds: true
|
|
6675
|
+
}));
|
|
6576
6676
|
insert(_el$6, () => entry.text);
|
|
6577
6677
|
insert(_el$7, () => shortenSource(entry.url, entry.line));
|
|
6578
6678
|
createRenderEffect((_p$) => {
|
|
@@ -6671,7 +6771,9 @@ const ActivityView = (props) => {
|
|
|
6671
6771
|
},
|
|
6672
6772
|
children: (entry) => (() => {
|
|
6673
6773
|
var _el$17 = _tmpl$9$1(), _el$18 = _el$17.firstChild, _el$19 = _el$18.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
|
|
6674
|
-
insert(_el$18, () => formatTime(entry.timestamp
|
|
6774
|
+
insert(_el$18, () => formatTime(entry.timestamp, {
|
|
6775
|
+
includeSeconds: true
|
|
6776
|
+
}));
|
|
6675
6777
|
insert(_el$19, () => entry.tool.replace("devtools_", ""));
|
|
6676
6778
|
insert(_el$20, () => entry.args);
|
|
6677
6779
|
insert(_el$21, (() => {
|
|
@@ -6914,7 +7016,7 @@ const DevToolsPanel = () => {
|
|
|
6914
7016
|
})();
|
|
6915
7017
|
};
|
|
6916
7018
|
delegateEvents(["click", "input"]);
|
|
6917
|
-
var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 5
|
|
7019
|
+
var _tmpl$$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>×</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — scroll to Chat Assistant below and add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown below</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$1 = /* @__PURE__ */ template(`<div class="settings-callout settings-premium-callout"><div class=settings-callout-title>Start Vessel Premium with a 7-day free trial</div><p class=settings-callout-copy>Unlock screenshots, saved sessions, workflow tracking, table extraction, the credential vault, and longer autonomous runs without leaving the app.</p><div class=settings-premium-callout-actions><button class="premium-btn premium-btn-upgrade">Start 7-day free trial — $5.99/mo after</button><button class="premium-btn premium-btn-activate">See activation steps`), _tmpl$4$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$5$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$6$1 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$7 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$8 = /* @__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 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$0 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$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 = /* @__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 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$12 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$13 = /* @__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$14 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$15 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$16 = /* @__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$17 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:<port>/mcp</code>. Changing this value restarts the MCP server immediately.</p></div><div class=settings-field><label class=settings-label for=max-tool-iterations>Max Tool Iterations</label><p class=settings-hint></p></div><div class=settings-field><label class=settings-label for=obsidian-vault-path>Obsidian Vault Path</label><input id=obsidian-vault-path class=settings-input placeholder=/home/you/Documents/MyVault><p class=settings-hint>Optional. When set, Vessel memory tools can write markdown notes into this vault for research breadcrumbs and summaries.</p></div><div class=settings-field><label class=settings-label for=agent-transcript-mode>Agent Transcript Monitor</label><select id=agent-transcript-mode class="settings-input settings-select"><option value=off>Off</option><option value=summary>Summary HUD</option><option value=full>Full transcript</option></select><p class=settings-hint>Controls the in-browser transcript monitor when an external harness publishes reasoning or status updates into Vessel via the<code>vessel_publish_transcript</code> MCP tool. Summary HUD shows a compact 2-line status surface; Full transcript shows the recent entry list.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Anonymous Usage Analytics</span></label><p class=settings-hint>Help improve Vessel by sending anonymous usage data (tool popularity, session duration, provider type). No URLs, page content, queries, or personal data is ever collected.</p></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$18 = /* @__PURE__ */ template(`<style>
|
|
6918
7020
|
.settings-panel {
|
|
6919
7021
|
width: min(440px, calc(100vw - 32px));
|
|
6920
7022
|
max-height: calc(100vh - 48px);
|
|
@@ -6931,6 +7033,9 @@ var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><butt
|
|
|
6931
7033
|
inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
6932
7034
|
animation: command-bar-enter 350ms var(--ease-out-expo) both;
|
|
6933
7035
|
}
|
|
7036
|
+
.command-bar-overlay.closing .settings-panel {
|
|
7037
|
+
animation: command-bar-exit 200ms var(--ease-in-out) both;
|
|
7038
|
+
}
|
|
6934
7039
|
.settings-title {
|
|
6935
7040
|
font-size: 16px;
|
|
6936
7041
|
font-weight: 600;
|
|
@@ -7445,7 +7550,7 @@ var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><butt
|
|
|
7445
7550
|
justify-content: flex-end;
|
|
7446
7551
|
margin-top: 4px;
|
|
7447
7552
|
}
|
|
7448
|
-
`), _tmpl$19 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$20 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$21 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$23 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$24 = /* @__PURE__ */ template(`<div>`), _tmpl$25 = /* @__PURE__ */ template(`<option>`), _tmpl$26 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$27 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$28 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">Subscribe to Premium — 5-day free trial`), _tmpl$29 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$30 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$31 = /* @__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">×`);
|
|
7553
|
+
`), _tmpl$19 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$20 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$21 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$23 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$24 = /* @__PURE__ */ template(`<div>`), _tmpl$25 = /* @__PURE__ */ template(`<option>`), _tmpl$26 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$27 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$28 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">Subscribe to Premium — $5.99/mo after 7-day free trial`), _tmpl$29 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$30 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$31 = /* @__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">×`);
|
|
7449
7554
|
const CHAT_PROVIDERS = [{
|
|
7450
7555
|
id: "anthropic",
|
|
7451
7556
|
name: "Anthropic",
|
|
@@ -7517,6 +7622,10 @@ const Settings = () => {
|
|
|
7517
7622
|
settingsOpen: settingsOpen2,
|
|
7518
7623
|
closeSettings
|
|
7519
7624
|
} = useUI();
|
|
7625
|
+
const {
|
|
7626
|
+
visible: settingsVisible,
|
|
7627
|
+
closing: settingsClosing
|
|
7628
|
+
} = useAnimatedPresence(settingsOpen2, 200);
|
|
7520
7629
|
const [autoRestoreSession, setAutoRestoreSession] = createSignal(true);
|
|
7521
7630
|
const [clearBookmarksOnLaunch, setClearBookmarksOnLaunch] = createSignal(false);
|
|
7522
7631
|
const [obsidianVaultPath, setObsidianVaultPath] = createSignal("");
|
|
@@ -7778,7 +7887,7 @@ const Settings = () => {
|
|
|
7778
7887
|
};
|
|
7779
7888
|
return createComponent(Show, {
|
|
7780
7889
|
get when() {
|
|
7781
|
-
return
|
|
7890
|
+
return settingsVisible();
|
|
7782
7891
|
},
|
|
7783
7892
|
get children() {
|
|
7784
7893
|
return [(() => {
|
|
@@ -7899,9 +8008,9 @@ const Settings = () => {
|
|
|
7899
8008
|
})()
|
|
7900
8009
|
}), null);
|
|
7901
8010
|
createRenderEffect((_p$) => {
|
|
7902
|
-
var _v$
|
|
7903
|
-
_v$
|
|
7904
|
-
_v$
|
|
8011
|
+
var _v$0 = !!(issue.severity === "warning"), _v$1 = !!(issue.severity === "error");
|
|
8012
|
+
_v$0 !== _p$.e && _el$110.classList.toggle("warning", _p$.e = _v$0);
|
|
8013
|
+
_v$1 !== _p$.t && _el$110.classList.toggle("error", _p$.t = _v$1);
|
|
7905
8014
|
return _p$;
|
|
7906
8015
|
}, {
|
|
7907
8016
|
e: void 0,
|
|
@@ -8085,9 +8194,9 @@ const Settings = () => {
|
|
|
8085
8194
|
var _el$124 = _tmpl$29();
|
|
8086
8195
|
insert(_el$124, () => msg().text);
|
|
8087
8196
|
createRenderEffect((_p$) => {
|
|
8088
|
-
var _v$
|
|
8089
|
-
_v$
|
|
8090
|
-
_v$
|
|
8197
|
+
var _v$10 = !!(msg().kind === "success"), _v$11 = !!(msg().kind === "error");
|
|
8198
|
+
_v$10 !== _p$.e && _el$124.classList.toggle("success", _p$.e = _v$10);
|
|
8199
|
+
_v$11 !== _p$.t && _el$124.classList.toggle("error", _p$.t = _v$11);
|
|
8091
8200
|
return _p$;
|
|
8092
8201
|
}, {
|
|
8093
8202
|
e: void 0,
|
|
@@ -8249,9 +8358,9 @@ const Settings = () => {
|
|
|
8249
8358
|
var _el$132 = _tmpl$29();
|
|
8250
8359
|
insert(_el$132, () => msg().text);
|
|
8251
8360
|
createRenderEffect((_p$) => {
|
|
8252
|
-
var _v$
|
|
8253
|
-
_v$
|
|
8254
|
-
_v$
|
|
8361
|
+
var _v$12 = !!(msg().kind === "success"), _v$13 = !!(msg().kind === "error");
|
|
8362
|
+
_v$12 !== _p$.e && _el$132.classList.toggle("success", _p$.e = _v$12);
|
|
8363
|
+
_v$13 !== _p$.t && _el$132.classList.toggle("error", _p$.t = _v$13);
|
|
8255
8364
|
return _p$;
|
|
8256
8365
|
}, {
|
|
8257
8366
|
e: void 0,
|
|
@@ -8273,9 +8382,9 @@ const Settings = () => {
|
|
|
8273
8382
|
var _el$133 = _tmpl$29();
|
|
8274
8383
|
insert(_el$133, () => currentStatus().text);
|
|
8275
8384
|
createRenderEffect((_p$) => {
|
|
8276
|
-
var _v$
|
|
8277
|
-
_v$
|
|
8278
|
-
_v$
|
|
8385
|
+
var _v$14 = !!(currentStatus().kind === "success"), _v$15 = !!(currentStatus().kind === "error");
|
|
8386
|
+
_v$14 !== _p$.e && _el$133.classList.toggle("success", _p$.e = _v$14);
|
|
8387
|
+
_v$15 !== _p$.t && _el$133.classList.toggle("error", _p$.t = _v$15);
|
|
8279
8388
|
return _p$;
|
|
8280
8389
|
}, {
|
|
8281
8390
|
e: void 0,
|
|
@@ -8285,15 +8394,16 @@ const Settings = () => {
|
|
|
8285
8394
|
})()
|
|
8286
8395
|
}), null);
|
|
8287
8396
|
createRenderEffect((_p$) => {
|
|
8288
|
-
var _v$ = !!
|
|
8289
|
-
_v$ !== _p$.e && _el
|
|
8290
|
-
_v$2 !== _p$.t &&
|
|
8291
|
-
_v$3 !== _p$.a && _el$
|
|
8292
|
-
_v$4 !== _p$.o &&
|
|
8293
|
-
_v$5 !== _p$.i && _el$
|
|
8294
|
-
_v$6 !== _p$.n &&
|
|
8295
|
-
_v$7 !== _p$.s && _el$
|
|
8296
|
-
_v$8 !== _p$.h &&
|
|
8397
|
+
var _v$ = !!settingsClosing(), _v$2 = !!autoRestoreSession(), _v$3 = autoRestoreSession(), _v$4 = !!clearBookmarksOnLaunch(), _v$5 = clearBookmarksOnLaunch(), _v$6 = !!chatEnabled(), _v$7 = chatEnabled(), _v$8 = !!telemetryEnabled(), _v$9 = telemetryEnabled();
|
|
8398
|
+
_v$ !== _p$.e && _el$.classList.toggle("closing", _p$.e = _v$);
|
|
8399
|
+
_v$2 !== _p$.t && _el$36.classList.toggle("on", _p$.t = _v$2);
|
|
8400
|
+
_v$3 !== _p$.a && setAttribute(_el$36, "aria-checked", _p$.a = _v$3);
|
|
8401
|
+
_v$4 !== _p$.o && _el$39.classList.toggle("on", _p$.o = _v$4);
|
|
8402
|
+
_v$5 !== _p$.i && setAttribute(_el$39, "aria-checked", _p$.i = _v$5);
|
|
8403
|
+
_v$6 !== _p$.n && _el$43.classList.toggle("on", _p$.n = _v$6);
|
|
8404
|
+
_v$7 !== _p$.s && setAttribute(_el$43, "aria-checked", _p$.s = _v$7);
|
|
8405
|
+
_v$8 !== _p$.h && _el$93.classList.toggle("on", _p$.h = _v$8);
|
|
8406
|
+
_v$9 !== _p$.r && setAttribute(_el$93, "aria-checked", _p$.r = _v$9);
|
|
8297
8407
|
return _p$;
|
|
8298
8408
|
}, {
|
|
8299
8409
|
e: void 0,
|
|
@@ -8303,7 +8413,8 @@ const Settings = () => {
|
|
|
8303
8413
|
i: void 0,
|
|
8304
8414
|
n: void 0,
|
|
8305
8415
|
s: void 0,
|
|
8306
|
-
h: void 0
|
|
8416
|
+
h: void 0,
|
|
8417
|
+
r: void 0
|
|
8307
8418
|
});
|
|
8308
8419
|
createRenderEffect(() => _el$20.value = defaultUrl());
|
|
8309
8420
|
createRenderEffect(() => _el$23.value = mcpPort());
|
|
@@ -8328,6 +8439,9 @@ var _tmpl$$1 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div cla
|
|
|
8328
8439
|
inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
|
8329
8440
|
animation: command-bar-enter 350ms var(--ease-out-expo) both;
|
|
8330
8441
|
}
|
|
8442
|
+
.command-bar-overlay.closing .keyboard-help {
|
|
8443
|
+
animation: command-bar-exit 200ms var(--ease-in-out) both;
|
|
8444
|
+
}
|
|
8331
8445
|
.keyboard-help-header {
|
|
8332
8446
|
display: flex;
|
|
8333
8447
|
justify-content: space-between;
|
|
@@ -8424,9 +8538,13 @@ const SHORTCUTS = [{
|
|
|
8424
8538
|
action: "This help overlay"
|
|
8425
8539
|
}];
|
|
8426
8540
|
const KeyboardHelp = (props) => {
|
|
8541
|
+
const {
|
|
8542
|
+
visible,
|
|
8543
|
+
closing
|
|
8544
|
+
} = useAnimatedPresence(() => props.open, 200);
|
|
8427
8545
|
return createComponent(Show, {
|
|
8428
8546
|
get when() {
|
|
8429
|
-
return
|
|
8547
|
+
return visible();
|
|
8430
8548
|
},
|
|
8431
8549
|
get children() {
|
|
8432
8550
|
return [(() => {
|
|
@@ -8447,6 +8565,7 @@ const KeyboardHelp = (props) => {
|
|
|
8447
8565
|
insert(_el$9, () => s.action);
|
|
8448
8566
|
return _el$9;
|
|
8449
8567
|
})()]));
|
|
8568
|
+
createRenderEffect(() => _el$.classList.toggle("closing", !!closing()));
|
|
8450
8569
|
return _el$;
|
|
8451
8570
|
})(), _tmpl$2$1()];
|
|
8452
8571
|
}
|
|
@@ -8526,28 +8645,7 @@ const App = () => {
|
|
|
8526
8645
|
} = useTabs();
|
|
8527
8646
|
const [highlightToast, setHighlightToast] = createSignal(null);
|
|
8528
8647
|
const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
|
|
8529
|
-
const
|
|
8530
|
-
try {
|
|
8531
|
-
const result = await window.vessel.highlights.capture();
|
|
8532
|
-
if (result.success && result.text) {
|
|
8533
|
-
const preview = result.text.length > 60 ? result.text.slice(0, 57) + "..." : result.text;
|
|
8534
|
-
setHighlightToast({
|
|
8535
|
-
title: "Highlight saved",
|
|
8536
|
-
message: preview
|
|
8537
|
-
});
|
|
8538
|
-
} else {
|
|
8539
|
-
setHighlightToast({
|
|
8540
|
-
title: "No selection",
|
|
8541
|
-
message: result.message || "Select text on the page first, then press Ctrl+H"
|
|
8542
|
-
});
|
|
8543
|
-
}
|
|
8544
|
-
} catch {
|
|
8545
|
-
setHighlightToast({
|
|
8546
|
-
title: "Highlight failed",
|
|
8547
|
-
message: "Could not capture selection"
|
|
8548
|
-
});
|
|
8549
|
-
}
|
|
8550
|
-
};
|
|
8648
|
+
const loadingPresence = useAnimatedPresence(() => !!activeTab()?.isLoading, 300);
|
|
8551
8649
|
const showHighlightResult = (result) => {
|
|
8552
8650
|
if (result.success && result.text) {
|
|
8553
8651
|
const preview = result.text.length > 60 ? result.text.slice(0, 57) + "..." : result.text;
|
|
@@ -8562,6 +8660,17 @@ const App = () => {
|
|
|
8562
8660
|
});
|
|
8563
8661
|
}
|
|
8564
8662
|
};
|
|
8663
|
+
const captureHighlight = async () => {
|
|
8664
|
+
try {
|
|
8665
|
+
const result = await window.vessel.highlights.capture();
|
|
8666
|
+
showHighlightResult(result);
|
|
8667
|
+
} catch {
|
|
8668
|
+
setHighlightToast({
|
|
8669
|
+
title: "Highlight failed",
|
|
8670
|
+
message: "Could not capture selection"
|
|
8671
|
+
});
|
|
8672
|
+
}
|
|
8673
|
+
};
|
|
8565
8674
|
onMount(() => {
|
|
8566
8675
|
if (view !== "chrome") return;
|
|
8567
8676
|
const cleanupKeys = setupKeybindings({
|
|
@@ -8609,10 +8718,12 @@ const App = () => {
|
|
|
8609
8718
|
insert(_el$2, createComponent(AddressBar, {}), null);
|
|
8610
8719
|
insert(_el$2, createComponent(Show, {
|
|
8611
8720
|
get when() {
|
|
8612
|
-
return
|
|
8721
|
+
return loadingPresence.visible();
|
|
8613
8722
|
},
|
|
8614
8723
|
get children() {
|
|
8615
|
-
|
|
8724
|
+
var _el$3 = _tmpl$();
|
|
8725
|
+
createRenderEffect(() => _el$3.classList.toggle("closing", !!loadingPresence.closing()));
|
|
8726
|
+
return _el$3;
|
|
8616
8727
|
}
|
|
8617
8728
|
}), null);
|
|
8618
8729
|
insert(_el$, createComponent(CommandBar, {}), null);
|