@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.
@@ -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) closeTab(tab.id);
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
- closeTab(tab.id);
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 && setAttribute(_el$6, "title", _p$.t = _v$2);
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
- function flushResize() {
1824
- if (pendingWidth !== null) {
1825
- window.vessel.ui.resizeSidebar(pendingWidth);
1826
- pendingWidth = null;
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
- if (resizeRafId === null) {
1851
- resizeRafId = requestAnimationFrame(flushResize);
1852
- }
1879
+ void flushResize();
1853
1880
  },
1854
- commitResize: () => {
1855
- if (resizeRafId !== null) {
1856
- cancelAnimationFrame(resizeRafId);
1857
- resizeRafId = null;
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, () => formatTime2(entry.updatedAt));
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 commandBarOpen2();
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$2 = !hasProvider();
2560
- _v$ !== _p$.e && setAttribute(_el$5, "placeholder", _p$.e = _v$);
2561
- _v$2 !== _p$.t && (_el$5.disabled = _p$.t = _v$2);
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>Upgrade to Premium`), _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 &amp; 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>`);
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 &amp; 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 5-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.";
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 onPointerUp = () => {
5789
+ const finishResize = () => {
5790
+ if (finished) return;
5791
+ finished = true;
5723
5792
  setIsDragging(false);
5724
- commitResize();
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
- target.addEventListener("pointermove", onPointerMove);
5732
- target.addEventListener("pointerup", onPointerUp);
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 confirmed = window.confirm("Delete this folder? Its bookmarks will move to Unsorted.");
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$36(), _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;
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
- void handleRemoveFolder(folder.id);
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$134 = _tmpl$34(), _el$135 = _el$134.firstChild, _el$136 = _el$135.firstChild, _el$137 = _el$136.nextSibling, _el$138 = _el$135.nextSibling, _el$139 = _el$138.nextSibling;
6049
- _el$136.$$input = (e) => setEditingFolderName(e.currentTarget.value);
6050
- _el$137.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
6051
- _el$138.$$click = () => void handleRenameFolder(folder.id);
6052
- _el$139.$$click = () => {
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$138.disabled = !editingFolderName().trim());
6058
- createRenderEffect(() => _el$136.value = editingFolderName());
6059
- createRenderEffect(() => _el$137.value = editingFolderSummary());
6060
- return _el$134;
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$37();
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$38();
6186
+ return _tmpl$40();
6077
6187
  },
6078
6188
  get children() {
6079
- var _el$140 = _tmpl$35();
6080
- insert(_el$140, createComponent(For, {
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$143 = _tmpl$40(), _el$144 = _el$143.firstChild, _el$145 = _el$144.firstChild, _el$146 = _el$145.nextSibling, _el$148 = _el$144.nextSibling, _el$149 = _el$148.firstChild, _el$150 = _el$149.nextSibling;
6086
- _el$144.$$click = () => void createTab(bookmark.url);
6087
- insert(_el$145, () => bookmark.title || bookmark.url);
6088
- insert(_el$146, () => bookmark.url);
6089
- insert(_el$143, createComponent(Show, {
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$147 = _tmpl$39();
6095
- insert(_el$147, () => bookmark.note);
6096
- return _el$147;
6204
+ var _el$156 = _tmpl$41();
6205
+ insert(_el$156, () => bookmark.note);
6206
+ return _el$156;
6097
6207
  }
6098
- }), _el$148);
6099
- insert(_el$149, () => formatBookmarkDate(bookmark.savedAt));
6100
- _el$150.$$click = () => void removeBookmark(bookmark.id);
6101
- createRenderEffect(() => setAttribute(_el$143, "data-bookmark-id", bookmark.id));
6102
- return _el$143;
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$140;
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$41();
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$152 = _tmpl$43(), _el$153 = _el$152.firstChild, _el$154 = _el$153.firstChild, _el$156 = _el$153.nextSibling, _el$157 = _el$156.firstChild, _el$158 = _el$157.nextSibling, _el$159 = _el$158.nextSibling;
6163
- insert(_el$153, createComponent(Show, {
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$42();
6278
+ return _tmpl$44();
6169
6279
  }
6170
6280
  }), null);
6171
- insert(_el$157, () => checkpoint.name);
6172
- insert(_el$158, () => new Date(checkpoint.createdAt).toLocaleString());
6173
- _el$159.$$click = () => void restoreCheckpoint(checkpoint.id);
6174
- createRenderEffect(() => _el$154.classList.toggle("latest", !!(i() === 0)));
6175
- return _el$152;
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$160 = _tmpl$44();
6216
- insert(_el$160, createComponent(MarkdownMessage, {
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$160, createComponent(Show, {
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$160, `message message-${msg.role}`));
6235
- return _el$160;
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$45();
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$162 = _tmpl$47(), _el$163 = _el$162.firstChild, _el$164 = _el$163.nextSibling, _el$165 = _el$164.firstChild, _el$166 = _el$165.firstChild, _el$167 = _el$166.nextSibling, _el$169 = _el$165.nextSibling, _el$170 = _el$169.nextSibling, _el$171 = _el$170.firstChild, _el$172 = _el$171.nextSibling;
6297
- insert(_el$167, () => approval.name);
6298
- insert(_el$164, createComponent(Show, {
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$168 = _tmpl$46();
6304
- insert(_el$168, () => approval.argsSummary);
6305
- return _el$168;
6413
+ var _el$177 = _tmpl$48();
6414
+ insert(_el$177, () => approval.argsSummary);
6415
+ return _el$177;
6306
6416
  }
6307
- }), _el$169);
6308
- insert(_el$169, () => approval.reason);
6309
- _el$171.$$click = () => void resolveApproval(approval.id, true);
6310
- _el$172.$$click = () => void resolveApproval(approval.id, false);
6311
- return _el$162;
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$173 = _tmpl$48(), _el$174 = _el$173.firstChild, _el$175 = _el$174.nextSibling;
6415
- setAttribute(_el$174, "title", pendingPrompt);
6416
- insert(_el$174, pendingPrompt);
6417
- _el$175.$$click = () => removePendingQuery(index());
6418
- createRenderEffect(() => setAttribute(_el$175, "aria-label", `Remove queued prompt ${index() + 1}`));
6419
- return _el$173;
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 days</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>&times;</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 5-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 free trial</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:&lt;port&gt;/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>
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>&times;</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:&lt;port&gt;/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> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`);
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> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`);
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 settingsOpen2();
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$9 = !!(issue.severity === "warning"), _v$0 = !!(issue.severity === "error");
7903
- _v$9 !== _p$.e && _el$110.classList.toggle("warning", _p$.e = _v$9);
7904
- _v$0 !== _p$.t && _el$110.classList.toggle("error", _p$.t = _v$0);
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$1 = !!(msg().kind === "success"), _v$10 = !!(msg().kind === "error");
8089
- _v$1 !== _p$.e && _el$124.classList.toggle("success", _p$.e = _v$1);
8090
- _v$10 !== _p$.t && _el$124.classList.toggle("error", _p$.t = _v$10);
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$11 = !!(msg().kind === "success"), _v$12 = !!(msg().kind === "error");
8253
- _v$11 !== _p$.e && _el$132.classList.toggle("success", _p$.e = _v$11);
8254
- _v$12 !== _p$.t && _el$132.classList.toggle("error", _p$.t = _v$12);
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$13 = !!(currentStatus().kind === "success"), _v$14 = !!(currentStatus().kind === "error");
8277
- _v$13 !== _p$.e && _el$133.classList.toggle("success", _p$.e = _v$13);
8278
- _v$14 !== _p$.t && _el$133.classList.toggle("error", _p$.t = _v$14);
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$ = !!autoRestoreSession(), _v$2 = autoRestoreSession(), _v$3 = !!clearBookmarksOnLaunch(), _v$4 = clearBookmarksOnLaunch(), _v$5 = !!chatEnabled(), _v$6 = chatEnabled(), _v$7 = !!telemetryEnabled(), _v$8 = telemetryEnabled();
8289
- _v$ !== _p$.e && _el$36.classList.toggle("on", _p$.e = _v$);
8290
- _v$2 !== _p$.t && setAttribute(_el$36, "aria-checked", _p$.t = _v$2);
8291
- _v$3 !== _p$.a && _el$39.classList.toggle("on", _p$.a = _v$3);
8292
- _v$4 !== _p$.o && setAttribute(_el$39, "aria-checked", _p$.o = _v$4);
8293
- _v$5 !== _p$.i && _el$43.classList.toggle("on", _p$.i = _v$5);
8294
- _v$6 !== _p$.n && setAttribute(_el$43, "aria-checked", _p$.n = _v$6);
8295
- _v$7 !== _p$.s && _el$93.classList.toggle("on", _p$.s = _v$7);
8296
- _v$8 !== _p$.h && setAttribute(_el$93, "aria-checked", _p$.h = _v$8);
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 props.open;
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 captureHighlight = async () => {
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 activeTab()?.isLoading;
8721
+ return loadingPresence.visible();
8613
8722
  },
8614
8723
  get children() {
8615
- return _tmpl$();
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);