@quanta-intellect/vessel-browser 0.1.53 → 0.1.58

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.
@@ -1489,15 +1489,30 @@ delegateEvents(["click"]);
1489
1489
  const [tabs, setTabs] = createSignal([]);
1490
1490
  const [activeTabId, setActiveTabId] = createSignal("");
1491
1491
  let initialized$3 = false;
1492
+ let initPromise$2 = null;
1492
1493
  function init$3() {
1494
+ if (initPromise$2) return initPromise$2;
1493
1495
  if (initialized$3) return;
1494
1496
  initialized$3 = true;
1495
- window.vessel.tabs.onStateUpdate(
1496
- (newTabs, newActiveId) => {
1497
- setTabs(newTabs);
1498
- setActiveTabId(newActiveId);
1497
+ initPromise$2 = (async () => {
1498
+ try {
1499
+ window.vessel.tabs.onStateUpdate(
1500
+ (newTabs, newActiveId) => {
1501
+ setTabs(newTabs);
1502
+ setActiveTabId(newActiveId);
1503
+ }
1504
+ );
1505
+ const initialState = await window.vessel.tabs.getState();
1506
+ setTabs(initialState.tabs);
1507
+ setActiveTabId(initialState.activeId);
1508
+ } catch (error) {
1509
+ initialized$3 = false;
1510
+ console.error("Failed to initialize tabs store", error);
1511
+ } finally {
1512
+ initPromise$2 = null;
1499
1513
  }
1500
- );
1514
+ })();
1515
+ return initPromise$2;
1501
1516
  }
1502
1517
  function useTabs() {
1503
1518
  init$3();
@@ -1697,7 +1712,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
1697
1712
  }
1698
1713
  return "idle";
1699
1714
  }
1700
- 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>`);
1715
+ var _tmpl$$d = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$b = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$9 = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list><button class=tab-new data-tooltip="New Tab">+`), _tmpl$4$9 = /* @__PURE__ */ template(`<div role=tab><span class=tab-title></span><button class=tab-close>×`), _tmpl$5$7 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$6$7 = /* @__PURE__ */ template(`<span class=tab-loading>`);
1701
1716
  const TAB_CLOSE_MS = 200;
1702
1717
  function stringToHue(str) {
1703
1718
  let hash = 0;
@@ -1764,13 +1779,13 @@ const TabBar = () => {
1764
1779
  }, TAB_CLOSE_MS);
1765
1780
  };
1766
1781
  return (() => {
1767
- var _el$3 = _tmpl$3$8(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
1782
+ var _el$3 = _tmpl$3$9(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
1768
1783
  insert(_el$4, createComponent(For, {
1769
1784
  get each() {
1770
1785
  return tabs2();
1771
1786
  },
1772
1787
  children: (tab) => (() => {
1773
- var _el$6 = _tmpl$4$8(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
1788
+ var _el$6 = _tmpl$4$9(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
1774
1789
  _el$6.addEventListener("auxclick", (e) => {
1775
1790
  if (e.button === 1) handleClose(tab.id);
1776
1791
  });
@@ -1788,12 +1803,12 @@ const TabBar = () => {
1788
1803
  }), _el$7);
1789
1804
  insert(_el$6, (() => {
1790
1805
  var _c$ = memo(() => !!modelActiveTabIds().has(tab.id));
1791
- return () => _c$() && _tmpl$5$6();
1806
+ return () => _c$() && _tmpl$5$7();
1792
1807
  })(), _el$7);
1793
1808
  insert(_el$7, () => tab.title || "New Tab");
1794
1809
  insert(_el$6, (() => {
1795
1810
  var _c$2 = memo(() => !!tab.isLoading);
1796
- return () => _c$2() && _tmpl$6$6();
1811
+ return () => _c$2() && _tmpl$6$7();
1797
1812
  })(), _el$8);
1798
1813
  _el$8.$$click = (e) => {
1799
1814
  e.stopPropagation();
@@ -1905,7 +1920,121 @@ function useUI() {
1905
1920
  }
1906
1921
  };
1907
1922
  }
1908
- var _tmpl$$c = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=address-bar><div class=nav-controls><button class=nav-btn data-tooltip=Back><svg width=14 height=14 viewBox="0 0 14 14"><path d="M9 2L4 7l5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Forward><svg width=14 height=14 viewBox="0 0 14 14"><path d="M5 2l5 5-5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Reload><svg width=14 height=14 viewBox="0 0 14 14"><path d="M2.5 7a4.5 4.5 0 1 1 1 3"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M2 4v3.5h3.5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button></div><div class=url-shell><form class=url-form><input class=url-input type=text placeholder="Search or enter URL"></form><div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text></span></div></div><div class=toolbar-actions><button class=nav-btn data-tooltip="Reader Mode"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=2 y=1 width=10 height=12 rx=1 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=4 y1=4 x2=10 y2=4 stroke=currentColor stroke-width=1></line><line x1=4 y1=6.5 x2=10 y2=6.5 stroke=currentColor stroke-width=1></line><line x1=4 y1=9 x2=8 y2=9 stroke=currentColor stroke-width=1></line></svg></button><button class=nav-btn data-tooltip="Dev Tools"><svg width=14 height=14 viewBox="0 0 14 14"><polyline points="3,5 1,7 3,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><polyline points="11,5 13,7 11,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><line x1=8.5 y1=2 x2=5.5 y2=12 stroke=currentColor stroke-width=1.2 stroke-linecap=round></line></svg></button><button class="nav-btn nav-btn-sidebar"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=1 y=1 width=12 height=12 rx=1.5 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=9 y1=1 x2=9 y2=13 stroke=currentColor stroke-width=1.2></line></svg></button><button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`);
1923
+ function normalizePageUrl(rawUrl) {
1924
+ try {
1925
+ const url = new URL(rawUrl);
1926
+ const pathname = url.pathname.replace(/\/+$/, "") || "/";
1927
+ return `${url.origin}${pathname}`.toLowerCase();
1928
+ } catch {
1929
+ return rawUrl.trim().replace(/\/+$/, "").toLowerCase();
1930
+ }
1931
+ }
1932
+ const SNAPSHOT_QUERY_KEYS = /* @__PURE__ */ new Set([
1933
+ "q",
1934
+ "query",
1935
+ "search",
1936
+ "s",
1937
+ "term",
1938
+ "keyword",
1939
+ "keywords",
1940
+ "page",
1941
+ "p",
1942
+ "offset",
1943
+ "cursor",
1944
+ "sort",
1945
+ "order",
1946
+ "filter",
1947
+ "filters",
1948
+ "category",
1949
+ "categories",
1950
+ "tag",
1951
+ "tags",
1952
+ "tab",
1953
+ "view"
1954
+ ]);
1955
+ const TRACKING_QUERY_KEYS = /* @__PURE__ */ new Set([
1956
+ "fbclid",
1957
+ "gclid",
1958
+ "mc_cid",
1959
+ "mc_eid",
1960
+ "ref",
1961
+ "source",
1962
+ "si"
1963
+ ]);
1964
+ function normalizeQueryValue(value) {
1965
+ return value.replace(/\s+/g, " ").trim().toLowerCase();
1966
+ }
1967
+ function serializeSnapshotParams(params) {
1968
+ return params.map(
1969
+ ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
1970
+ ).join("&");
1971
+ }
1972
+ function normalizeSnapshotParams(entries2, pathname) {
1973
+ return Array.from(entries2).filter(
1974
+ ([key, value]) => shouldKeepSnapshotQueryParam(pathname, key, value)
1975
+ ).map(([key, value]) => [
1976
+ key.trim().toLowerCase(),
1977
+ normalizeQueryValue(value)
1978
+ ]).sort(
1979
+ ([keyA, valueA], [keyB, valueB]) => keyA === keyB ? valueA.localeCompare(valueB) : keyA.localeCompare(keyB)
1980
+ );
1981
+ }
1982
+ function shouldKeepSnapshotQueryParam(pathname, rawKey, value) {
1983
+ const key = rawKey.trim().toLowerCase();
1984
+ if (!key || !value.trim()) return false;
1985
+ if (key.startsWith("utm_")) return false;
1986
+ if (TRACKING_QUERY_KEYS.has(key)) return false;
1987
+ if (SNAPSHOT_QUERY_KEYS.has(key)) return true;
1988
+ return /\/(search|results|browse|discover|find|category|tag|topics?|collections?|list)(\/|$)/i.test(
1989
+ pathname
1990
+ );
1991
+ }
1992
+ function buildSnapshotHashKey(hash, pathname) {
1993
+ let raw = hash.replace(/^#/, "").trim();
1994
+ if (!raw) return null;
1995
+ let bang = false;
1996
+ if (raw.startsWith("!")) {
1997
+ bang = true;
1998
+ raw = raw.slice(1).trim();
1999
+ }
2000
+ if (raw.startsWith("/")) {
2001
+ const [routePart, queryPart = ""] = raw.split("?");
2002
+ const route = routePart.replace(/\/+$/, "") || "/";
2003
+ const params = normalizeSnapshotParams(
2004
+ new URLSearchParams(queryPart).entries(),
2005
+ pathname
2006
+ );
2007
+ const query = serializeSnapshotParams(params);
2008
+ return `#${bang ? "!" : ""}${route.toLowerCase()}${query ? `?${query}` : ""}`;
2009
+ }
2010
+ const queryLike = raw.startsWith("?") ? raw.slice(1) : raw;
2011
+ if (queryLike.includes("=")) {
2012
+ const params = normalizeSnapshotParams(
2013
+ new URLSearchParams(queryLike).entries(),
2014
+ pathname
2015
+ );
2016
+ if (params.length === 0) return null;
2017
+ const query = serializeSnapshotParams(params);
2018
+ return `#${bang ? "!" : ""}?${query}`;
2019
+ }
2020
+ return null;
2021
+ }
2022
+ function buildPageSnapshotKey(rawUrl) {
2023
+ try {
2024
+ const url = new URL(rawUrl);
2025
+ const pathname = url.pathname.replace(/\/+$/, "") || "/";
2026
+ const params = normalizeSnapshotParams(url.searchParams.entries(), pathname);
2027
+ const query = serializeSnapshotParams(params);
2028
+ const hash = buildSnapshotHashKey(url.hash, pathname);
2029
+ return `${url.origin.toLowerCase()}${pathname.toLowerCase()}${query ? `?${query}` : ""}${hash || ""}`;
2030
+ } catch {
2031
+ return normalizePageUrl(rawUrl);
2032
+ }
2033
+ }
2034
+ function matchesPageSnapshotUrl(left, right) {
2035
+ return buildPageSnapshotKey(left) === buildPageSnapshotKey(right);
2036
+ }
2037
+ var _tmpl$$c = /* @__PURE__ */ template(`<button class="agent-status-badge recent"title="Page content has changed since your last visit"style=cursor:pointer;font-size:11px><span class=agent-status-dot aria-hidden=true style=background:#f59e0b></span><span class=agent-status-text>Changed`), _tmpl$2$a = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$3$8 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Changed recently`), _tmpl$4$8 = /* @__PURE__ */ template(`<div class=page-diff-popup><div class=page-diff-popup-header><div class=page-diff-popup-header-copy><span>What changed since </span></div><button class=page-diff-popup-close>&times;`), _tmpl$5$6 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$6$6 = /* @__PURE__ */ template(`<div class=address-bar><div class=nav-controls><button class=nav-btn data-tooltip=Back><svg width=14 height=14 viewBox="0 0 14 14"><path d="M9 2L4 7l5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Forward><svg width=14 height=14 viewBox="0 0 14 14"><path d="M5 2l5 5-5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Reload><svg width=14 height=14 viewBox="0 0 14 14"><path d="M2.5 7a4.5 4.5 0 1 1 1 3"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M2 4v3.5h3.5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button></div><div class=url-shell><form class=url-form><input class=url-input type=text placeholder="Search or enter URL"></form><div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text></span></div></div><div class=toolbar-actions><button class=nav-btn data-tooltip="Reader Mode"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=2 y=1 width=10 height=12 rx=1 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=4 y1=4 x2=10 y2=4 stroke=currentColor stroke-width=1></line><line x1=4 y1=6.5 x2=10 y2=6.5 stroke=currentColor stroke-width=1></line><line x1=4 y1=9 x2=8 y2=9 stroke=currentColor stroke-width=1></line></svg></button><button class=nav-btn data-tooltip="Dev Tools"><svg width=14 height=14 viewBox="0 0 14 14"><polyline points="3,5 1,7 3,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><polyline points="11,5 13,7 11,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><line x1=8.5 y1=2 x2=5.5 y2=12 stroke=currentColor stroke-width=1.2 stroke-linecap=round></line></svg></button><button class="nav-btn nav-btn-sidebar"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=1 y=1 width=12 height=12 rx=1.5 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=9 y1=1 x2=9 y2=13 stroke=currentColor stroke-width=1.2></line></svg></button><button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`), _tmpl$7$4 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$0$4 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$10$4 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$11$4 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><span class=page-diff-section></span><span class=page-diff-summary>`), _tmpl$12$4 = /* @__PURE__ */ template(`<li>`);
1909
2038
  const AddressBar = () => {
1910
2039
  const {
1911
2040
  activeTab,
@@ -1929,12 +2058,84 @@ const AddressBar = () => {
1929
2058
  const agentPresence = createMemo(() => getAgentPresence(runtimeState2(), now2()));
1930
2059
  const agentStatusMessage = createMemo(() => getLatestAgentStatusMessage(runtimeState2(), now2()));
1931
2060
  const pendingApprovalCount = createMemo(() => runtimeState2().supervisor.pendingApprovals.length);
2061
+ const [pageDiff, setPageDiff] = createSignal(null);
2062
+ const [diffExpanded, setDiffExpanded] = createSignal(false);
2063
+ let diffCollapseTimer = null;
2064
+ const showIncomingDiff = (diff) => {
2065
+ setPageDiff(diff);
2066
+ setDiffExpanded(true);
2067
+ if (diffCollapseTimer) clearTimeout(diffCollapseTimer);
2068
+ diffCollapseTimer = setTimeout(() => {
2069
+ setDiffExpanded(false);
2070
+ diffCollapseTimer = null;
2071
+ }, 8e3);
2072
+ };
2073
+ const formatRelativeTime = (isoDate) => {
2074
+ const diff = Date.now() - new Date(isoDate).getTime();
2075
+ const mins = Math.floor(diff / 6e4);
2076
+ if (mins < 1) return "just now";
2077
+ if (mins < 60) return `${mins}m ago`;
2078
+ const hours = Math.floor(mins / 60);
2079
+ if (hours < 24) return `${hours}h ago`;
2080
+ const days = Math.floor(hours / 24);
2081
+ if (days < 7) return `${days}d ago`;
2082
+ return new Date(isoDate).toLocaleDateString();
2083
+ };
2084
+ const formatElapsed = (startIso, endIso) => {
2085
+ const elapsedMs = Math.max(0, new Date(endIso).getTime() - new Date(startIso).getTime());
2086
+ const secs = Math.round(elapsedMs / 1e3);
2087
+ if (secs < 60) return `${secs}s`;
2088
+ const mins = Math.round(secs / 60);
2089
+ if (mins < 60) return `${mins}m`;
2090
+ const hours = Math.round(mins / 60);
2091
+ return `${hours}h`;
2092
+ };
2093
+ createEffect(() => {
2094
+ const unsubscribe = window.vessel.pageDiff.onChanged((diff) => {
2095
+ const tab = activeTab();
2096
+ if (!tab) return;
2097
+ if (!matchesPageSnapshotUrl(tab.url, diff.url)) return;
2098
+ showIncomingDiff(diff);
2099
+ });
2100
+ onCleanup(() => {
2101
+ unsubscribe();
2102
+ if (diffCollapseTimer) {
2103
+ clearTimeout(diffCollapseTimer);
2104
+ diffCollapseTimer = null;
2105
+ }
2106
+ });
2107
+ });
1932
2108
  createEffect(() => {
1933
2109
  const tab = activeTab();
1934
2110
  if (tab && !inputRef?.matches(":focus")) {
1935
2111
  setInputValue(tab.url === "about:blank" ? "" : tab.url);
1936
2112
  }
1937
2113
  });
2114
+ createEffect(() => {
2115
+ const tab = activeTab();
2116
+ if (!tab) {
2117
+ setPageDiff(null);
2118
+ setDiffExpanded(false);
2119
+ return;
2120
+ }
2121
+ let cancelled = false;
2122
+ void window.vessel.pageDiff.get().then((diff) => {
2123
+ if (cancelled) return;
2124
+ if (!diff || !matchesPageSnapshotUrl(tab.url, diff.url)) {
2125
+ setPageDiff(null);
2126
+ setDiffExpanded(false);
2127
+ return;
2128
+ }
2129
+ setPageDiff(diff);
2130
+ }).catch(() => {
2131
+ if (cancelled) return;
2132
+ setPageDiff(null);
2133
+ setDiffExpanded(false);
2134
+ });
2135
+ onCleanup(() => {
2136
+ cancelled = true;
2137
+ });
2138
+ });
1938
2139
  const handleSubmit = (e) => {
1939
2140
  e.preventDefault();
1940
2141
  const val = inputValue().trim();
@@ -1943,10 +2144,11 @@ const AddressBar = () => {
1943
2144
  inputRef?.blur();
1944
2145
  }
1945
2146
  };
2147
+ const formatSectionLabel = (section) => section === "title" ? "Title" : section === "headings" ? "Headings" : "Content";
1946
2148
  return (() => {
1947
- var _el$ = _tmpl$2$a(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$6.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling;
1948
- _el$13.firstChild;
1949
- var _el$16 = _el$13.nextSibling;
2149
+ var _el$ = _tmpl$6$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$24 = _el$6.nextSibling, _el$25 = _el$24.firstChild, _el$26 = _el$25.nextSibling, _el$27 = _el$26.nextSibling;
2150
+ _el$27.firstChild;
2151
+ var _el$30 = _el$27.nextSibling;
1950
2152
  addEventListener(_el$3, "click", goBack, true);
1951
2153
  addEventListener(_el$4, "click", goForward, true);
1952
2154
  addEventListener(_el$5, "click", reload, true);
@@ -1957,31 +2159,166 @@ const AddressBar = () => {
1957
2159
  typeof _ref$ === "function" ? use(_ref$, _el$8) : inputRef = _el$8;
1958
2160
  setAttribute(_el$8, "spellcheck", false);
1959
2161
  insert(_el$1, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
1960
- _el$11.$$click = () => window.vessel.content.toggleReader();
1961
- addEventListener(_el$12, "click", toggleDevTools, true);
1962
- addEventListener(_el$13, "click", toggleSidebar, true);
1963
- insert(_el$13, createComponent(Show, {
2162
+ insert(_el$6, createComponent(Show, {
2163
+ get when() {
2164
+ return pageDiff();
2165
+ },
2166
+ get children() {
2167
+ var _el$10 = _tmpl$$c();
2168
+ _el$10.$$click = () => setDiffExpanded(!diffExpanded());
2169
+ return _el$10;
2170
+ }
2171
+ }), null);
2172
+ insert(_el$, createComponent(Show, {
2173
+ get when() {
2174
+ return memo(() => !!pageDiff())() && diffExpanded();
2175
+ },
2176
+ get children() {
2177
+ var _el$11 = _tmpl$4$8(), _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild;
2178
+ _el$14.firstChild;
2179
+ var _el$21 = _el$13.nextSibling;
2180
+ insert(_el$14, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
2181
+ insert(_el$13, createComponent(Show, {
2182
+ get when() {
2183
+ return memo(() => !!((pageDiff().burstCount || 0) > 1 && pageDiff().firstDetectedAt))() && pageDiff().lastDetectedAt;
2184
+ },
2185
+ get children() {
2186
+ var _el$16 = _tmpl$2$a(), _el$17 = _el$16.firstChild, _el$20 = _el$17.nextSibling;
2187
+ _el$20.nextSibling;
2188
+ insert(_el$16, () => pageDiff().burstCount, _el$20);
2189
+ insert(_el$16, () => formatElapsed(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
2190
+ return _el$16;
2191
+ }
2192
+ }), null);
2193
+ _el$21.$$click = () => setDiffExpanded(false);
2194
+ insert(_el$11, createComponent(Show, {
2195
+ get when() {
2196
+ return memo(() => !!pageDiff().recentBursts?.length)() && (pageDiff().recentBursts?.length || 0) > 1;
2197
+ },
2198
+ get children() {
2199
+ var _el$22 = _tmpl$3$8();
2200
+ _el$22.firstChild;
2201
+ insert(_el$22, createComponent(For, {
2202
+ get each() {
2203
+ return pageDiff().recentBursts;
2204
+ },
2205
+ children: (burst) => (() => {
2206
+ var _el$31 = _tmpl$7$4(), _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling;
2207
+ insert(_el$32, () => formatRelativeTime(burst.detectedAt));
2208
+ insert(_el$33, () => burst.summary);
2209
+ return _el$31;
2210
+ })()
2211
+ }), null);
2212
+ return _el$22;
2213
+ }
2214
+ }), null);
2215
+ insert(_el$11, createComponent(For, {
2216
+ get each() {
2217
+ return pageDiff().changes;
2218
+ },
2219
+ children: (change) => (() => {
2220
+ var _el$34 = _tmpl$11$4(), _el$35 = _el$34.firstChild, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling;
2221
+ insert(_el$36, () => formatSectionLabel(change.section));
2222
+ insert(_el$37, () => change.summary);
2223
+ insert(_el$34, createComponent(Show, {
2224
+ get when() {
2225
+ return change.before || change.after;
2226
+ },
2227
+ get children() {
2228
+ var _el$38 = _tmpl$0$4();
2229
+ insert(_el$38, createComponent(Show, {
2230
+ get when() {
2231
+ return change.before;
2232
+ },
2233
+ get children() {
2234
+ var _el$39 = _tmpl$8$4(), _el$40 = _el$39.firstChild, _el$41 = _el$40.nextSibling;
2235
+ insert(_el$41, () => change.before);
2236
+ return _el$39;
2237
+ }
2238
+ }), null);
2239
+ insert(_el$38, createComponent(Show, {
2240
+ get when() {
2241
+ return change.after;
2242
+ },
2243
+ get children() {
2244
+ var _el$42 = _tmpl$9$4(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
2245
+ insert(_el$44, () => change.after);
2246
+ return _el$42;
2247
+ }
2248
+ }), null);
2249
+ return _el$38;
2250
+ }
2251
+ }), null);
2252
+ insert(_el$34, createComponent(Show, {
2253
+ get when() {
2254
+ return change.addedItems?.length;
2255
+ },
2256
+ get children() {
2257
+ var _el$45 = _tmpl$1$4(), _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling;
2258
+ insert(_el$47, createComponent(For, {
2259
+ get each() {
2260
+ return change.addedItems;
2261
+ },
2262
+ children: (item) => (() => {
2263
+ var _el$51 = _tmpl$12$4();
2264
+ insert(_el$51, item);
2265
+ return _el$51;
2266
+ })()
2267
+ }));
2268
+ return _el$45;
2269
+ }
2270
+ }), null);
2271
+ insert(_el$34, createComponent(Show, {
2272
+ get when() {
2273
+ return change.removedItems?.length;
2274
+ },
2275
+ get children() {
2276
+ var _el$48 = _tmpl$10$4(), _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
2277
+ insert(_el$50, createComponent(For, {
2278
+ get each() {
2279
+ return change.removedItems;
2280
+ },
2281
+ children: (item) => (() => {
2282
+ var _el$52 = _tmpl$12$4();
2283
+ insert(_el$52, item);
2284
+ return _el$52;
2285
+ })()
2286
+ }));
2287
+ return _el$48;
2288
+ }
2289
+ }), null);
2290
+ createRenderEffect(() => className(_el$34, `page-diff-item page-diff-${change.kind}`));
2291
+ return _el$34;
2292
+ })()
2293
+ }), null);
2294
+ return _el$11;
2295
+ }
2296
+ }), _el$24);
2297
+ _el$25.$$click = () => window.vessel.content.toggleReader();
2298
+ addEventListener(_el$26, "click", toggleDevTools, true);
2299
+ addEventListener(_el$27, "click", toggleSidebar, true);
2300
+ insert(_el$27, createComponent(Show, {
1964
2301
  get when() {
1965
2302
  return pendingApprovalCount() > 0;
1966
2303
  },
1967
2304
  get children() {
1968
- var _el$15 = _tmpl$$c();
1969
- insert(_el$15, pendingApprovalCount);
1970
- createRenderEffect(() => setAttribute(_el$15, "aria-label", `${pendingApprovalCount()} pending`));
1971
- return _el$15;
2305
+ var _el$29 = _tmpl$5$6();
2306
+ insert(_el$29, pendingApprovalCount);
2307
+ createRenderEffect(() => setAttribute(_el$29, "aria-label", `${pendingApprovalCount()} pending`));
2308
+ return _el$29;
1972
2309
  }
1973
2310
  }), null);
1974
- addEventListener(_el$16, "click", openSettings, true);
2311
+ addEventListener(_el$30, "click", openSettings, true);
1975
2312
  createRenderEffect((_p$) => {
1976
2313
  var _v$ = !activeTab()?.canGoBack, _v$2 = !activeTab()?.canGoForward, _v$3 = `agent-status-badge ${agentPresence()}`, _v$4 = agentStatusMessage() || (agentPresence() === "active" ? "Agent is actively using the browser" : agentPresence() === "recent" ? "Agent is connected" : "No agent connection detected"), _v$5 = !!activeTab()?.isReaderMode, _v$6 = !!devtoolsPanelOpen2(), _v$7 = !!(pendingApprovalCount() > 0), _v$8 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
1977
2314
  _v$ !== _p$.e && (_el$3.disabled = _p$.e = _v$);
1978
2315
  _v$2 !== _p$.t && (_el$4.disabled = _p$.t = _v$2);
1979
2316
  _v$3 !== _p$.a && className(_el$9, _p$.a = _v$3);
1980
2317
  _v$4 !== _p$.o && setAttribute(_el$9, "title", _p$.o = _v$4);
1981
- _v$5 !== _p$.i && _el$11.classList.toggle("active", _p$.i = _v$5);
1982
- _v$6 !== _p$.n && _el$12.classList.toggle("active", _p$.n = _v$6);
1983
- _v$7 !== _p$.s && _el$13.classList.toggle("has-approvals", _p$.s = _v$7);
1984
- _v$8 !== _p$.h && setAttribute(_el$13, "title", _p$.h = _v$8);
2318
+ _v$5 !== _p$.i && _el$25.classList.toggle("active", _p$.i = _v$5);
2319
+ _v$6 !== _p$.n && _el$26.classList.toggle("active", _p$.n = _v$6);
2320
+ _v$7 !== _p$.s && _el$27.classList.toggle("has-approvals", _p$.s = _v$7);
2321
+ _v$8 !== _p$.h && setAttribute(_el$27, "title", _p$.h = _v$8);
1985
2322
  return _p$;
1986
2323
  }, {
1987
2324
  e: void 0,
@@ -4650,7 +4987,7 @@ function renderKitPrompt(kit, values) {
4650
4987
  (_, key) => values[key] ?? ""
4651
4988
  );
4652
4989
  }
4653
- 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$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$2 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$2 = /* @__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>`);
4990
+ 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$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$2 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$2 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$2 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$2 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$2 = /* @__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>`);
4654
4991
  const ICON_MAP = {
4655
4992
  BookOpen: book_open_default,
4656
4993
  Tag: tag_default,
@@ -5237,7 +5574,7 @@ const AutomationTab = (props) => {
5237
5574
  return selectedKit().inputs;
5238
5575
  },
5239
5576
  children: (input) => (() => {
5240
- var _el$110 = _tmpl$37$1(), _el$111 = _el$110.firstChild;
5577
+ var _el$110 = _tmpl$37$2(), _el$111 = _el$110.firstChild;
5241
5578
  insert(_el$111, () => input.label, null);
5242
5579
  insert(_el$111, createComponent(Show, {
5243
5580
  get when() {
@@ -5253,7 +5590,7 @@ const AutomationTab = (props) => {
5253
5590
  },
5254
5591
  get fallback() {
5255
5592
  return (() => {
5256
- var _el$115 = _tmpl$38$1();
5593
+ var _el$115 = _tmpl$38$2();
5257
5594
  _el$115.$$input = (e) => setField(input.key, e.currentTarget.value);
5258
5595
  createRenderEffect((_p$) => {
5259
5596
  var _v$8 = input.type === "url" ? "url" : input.type === "number" ? "number" : "text", _v$9 = input.placeholder ?? "";
@@ -5281,7 +5618,7 @@ const AutomationTab = (props) => {
5281
5618
  return input.hint;
5282
5619
  },
5283
5620
  get children() {
5284
- var _el$114 = _tmpl$36$1();
5621
+ var _el$114 = _tmpl$36$2();
5285
5622
  insert(_el$114, () => input.hint);
5286
5623
  return _el$114;
5287
5624
  }
@@ -5490,7 +5827,7 @@ const AutomationTab = (props) => {
5490
5827
  };
5491
5828
  delegateEvents(["click", "input", "keydown", "contextmenu"]);
5492
5829
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
5493
- 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$1 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$33$1 = /* @__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$1 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$35$1 = /* @__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>×`);
5830
+ 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$1 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$33$1 = /* @__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$1 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$35$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$38$1 = /* @__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>×`);
5494
5831
  const UNSORTED_FOLDER = {
5495
5832
  id: "unsorted",
5496
5833
  name: "Unsorted",
@@ -6162,7 +6499,7 @@ ${contextBlock}` : contextBlock);
6162
6499
  return filteredGroupedBookmarks();
6163
6500
  },
6164
6501
  children: (folder) => (() => {
6165
- 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;
6502
+ var _el$122 = _tmpl$38$1(), _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;
6166
6503
  _el$123.$$keydown = (e) => {
6167
6504
  if (e.key === "Enter" || e.key === " ") {
6168
6505
  e.preventDefault();
@@ -6235,7 +6572,7 @@ ${contextBlock}` : contextBlock);
6235
6572
  return editingFolderId() === folder.id;
6236
6573
  },
6237
6574
  get children() {
6238
- 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;
6575
+ var _el$143 = _tmpl$36$1(), _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;
6239
6576
  _el$145.$$input = (e) => setEditingFolderName(e.currentTarget.value);
6240
6577
  _el$146.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
6241
6578
  _el$147.$$click = () => void handleRenameFolder(folder.id);
@@ -6266,7 +6603,7 @@ ${contextBlock}` : contextBlock);
6266
6603
  return _tmpl$40();
6267
6604
  },
6268
6605
  get children() {
6269
- var _el$149 = _tmpl$37();
6606
+ var _el$149 = _tmpl$37$1();
6270
6607
  insert(_el$149, createComponent(For, {
6271
6608
  get each() {
6272
6609
  return folder.items;
@@ -7196,7 +7533,7 @@ const PROVIDERS = {
7196
7533
  apiKeyHint: "Optional — only if your endpoint requires authentication"
7197
7534
  }
7198
7535
  };
7199
- 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>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$8 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$9 = /* @__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$0 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$10 = /* @__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$11 = /* @__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$12 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured \`llama-server\` base URL. For agent loops, run \`llama-server\` with \`--ctx-size 16384\` minimum and \`32768\` recommended.`), _tmpl$13 = /* @__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$14 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$15 = /* @__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$16 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$17 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$18 = /* @__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$19 = /* @__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$20 = /* @__PURE__ */ template(`<style>
7536
+ 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>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$8 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$9 = /* @__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$0 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$10 = /* @__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$11 = /* @__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$12 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured \`llama-server\` base URL. For agent loops, run \`llama-server\` with \`--ctx-size 16384\` minimum and \`32768\` recommended.`), _tmpl$13 = /* @__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$14 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$15 = /* @__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$16 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$17 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$18 = /* @__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$19 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$20 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$21 = /* @__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-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.</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>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$22 = /* @__PURE__ */ template(`<style>
7200
7537
  .settings-panel {
7201
7538
  width: min(440px, calc(100vw - 32px));
7202
7539
  max-height: calc(100vh - 48px);
@@ -7730,7 +8067,7 @@ var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><butt
7730
8067
  justify-content: flex-end;
7731
8068
  margin-top: 4px;
7732
8069
  }
7733
- `), _tmpl$21 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$22 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$23 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$24 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$26 = /* @__PURE__ */ template(`<div>`), _tmpl$27 = /* @__PURE__ */ template(`<option>`), _tmpl$28 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$29 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=premium-activate-row><input class="settings-input premium-email-input"inputmode=numeric maxlength=6 placeholder="Enter 6-digit code"><button class="premium-btn premium-btn-activate">`), _tmpl$31 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$32 = /* @__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$33 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$34 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$35 = /* @__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;`);
8070
+ `), _tmpl$23 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$24 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$26 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$28 = /* @__PURE__ */ template(`<div>`), _tmpl$29 = /* @__PURE__ */ template(`<option>`), _tmpl$30 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$31 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$32 = /* @__PURE__ */ template(`<div class=premium-activate-row><input class="settings-input premium-email-input"inputmode=numeric maxlength=6 placeholder="Enter 6-digit code"><button class="premium-btn premium-btn-activate">`), _tmpl$33 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$34 = /* @__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$35 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$36 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$37 = /* @__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;`), _tmpl$38 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">&times;`);
7734
8071
  const CHAT_PROVIDERS = Object.values(PROVIDERS).map((p) => ({
7735
8072
  id: p.id,
7736
8073
  name: p.name,
@@ -7770,6 +8107,103 @@ const Settings = () => {
7770
8107
  const [vaultNewTotp, setVaultNewTotp] = createSignal("");
7771
8108
  const [vaultNewNotes, setVaultNewNotes] = createSignal("");
7772
8109
  const [vaultMessage, setVaultMessage] = createSignal(null);
8110
+ const [autofillProfiles, setAutofillProfiles] = createSignal([]);
8111
+ const [autofillAdding, setAutofillAdding] = createSignal(false);
8112
+ const [autofillLabel, setAutofillLabel] = createSignal("");
8113
+ const [autofillFirstName, setAutofillFirstName] = createSignal("");
8114
+ const [autofillLastName, setAutofillLastName] = createSignal("");
8115
+ const [autofillEmail, setAutofillEmail] = createSignal("");
8116
+ const [autofillPhone, setAutofillPhone] = createSignal("");
8117
+ const [autofillOrg, setAutofillOrg] = createSignal("");
8118
+ const [autofillAddr1, setAutofillAddr1] = createSignal("");
8119
+ const [autofillAddr2, setAutofillAddr2] = createSignal("");
8120
+ const [autofillCity, setAutofillCity] = createSignal("");
8121
+ const [autofillState, setAutofillState] = createSignal("");
8122
+ const [autofillZip, setAutofillZip] = createSignal("");
8123
+ const [autofillCountry, setAutofillCountry] = createSignal("");
8124
+ const [autofillMessage, setAutofillMessage] = createSignal(null);
8125
+ const loadAutofillProfiles = async () => {
8126
+ try {
8127
+ const profiles = await window.vessel.autofill.list();
8128
+ setAutofillProfiles(profiles);
8129
+ } catch {
8130
+ }
8131
+ };
8132
+ const handleAutofillAdd = async () => {
8133
+ if (!autofillLabel().trim()) {
8134
+ setAutofillMessage({
8135
+ kind: "error",
8136
+ text: "Profile name is required."
8137
+ });
8138
+ return;
8139
+ }
8140
+ try {
8141
+ await window.vessel.autofill.add({
8142
+ label: autofillLabel().trim(),
8143
+ firstName: autofillFirstName().trim(),
8144
+ lastName: autofillLastName().trim(),
8145
+ email: autofillEmail().trim(),
8146
+ phone: autofillPhone().trim(),
8147
+ organization: autofillOrg().trim(),
8148
+ addressLine1: autofillAddr1().trim(),
8149
+ addressLine2: autofillAddr2().trim(),
8150
+ city: autofillCity().trim(),
8151
+ state: autofillState().trim(),
8152
+ postalCode: autofillZip().trim(),
8153
+ country: autofillCountry().trim()
8154
+ });
8155
+ setAutofillLabel("");
8156
+ setAutofillFirstName("");
8157
+ setAutofillLastName("");
8158
+ setAutofillEmail("");
8159
+ setAutofillPhone("");
8160
+ setAutofillOrg("");
8161
+ setAutofillAddr1("");
8162
+ setAutofillAddr2("");
8163
+ setAutofillCity("");
8164
+ setAutofillState("");
8165
+ setAutofillZip("");
8166
+ setAutofillCountry("");
8167
+ setAutofillAdding(false);
8168
+ setAutofillMessage({
8169
+ kind: "success",
8170
+ text: "Profile saved."
8171
+ });
8172
+ setTimeout(() => setAutofillMessage(null), 3e3);
8173
+ await loadAutofillProfiles();
8174
+ } catch (err) {
8175
+ setAutofillMessage({
8176
+ kind: "error",
8177
+ text: String(err)
8178
+ });
8179
+ }
8180
+ };
8181
+ const handleAutofillRemove = async (id) => {
8182
+ await window.vessel.autofill.delete(id);
8183
+ await loadAutofillProfiles();
8184
+ };
8185
+ const handleAutofillFill = async (id) => {
8186
+ try {
8187
+ const result = await window.vessel.autofill.fill(id);
8188
+ if (result.filled > 0) {
8189
+ setAutofillMessage({
8190
+ kind: "success",
8191
+ text: `Filled ${result.filled} field${result.filled > 1 ? "s" : ""}.`
8192
+ });
8193
+ } else {
8194
+ setAutofillMessage({
8195
+ kind: "error",
8196
+ text: "No matching fields found on this page."
8197
+ });
8198
+ }
8199
+ setTimeout(() => setAutofillMessage(null), 3e3);
8200
+ } catch (err) {
8201
+ setAutofillMessage({
8202
+ kind: "error",
8203
+ text: String(err)
8204
+ });
8205
+ }
8206
+ };
7773
8207
  const FIRST_RUN_KEY = "vessel.onboarding.dismissed";
7774
8208
  const [showWelcome, setShowWelcome] = createSignal(!localStorage.getItem(FIRST_RUN_KEY));
7775
8209
  const dismissWelcome = () => {
@@ -7960,6 +8394,7 @@ const Settings = () => {
7960
8394
  };
7961
8395
  onMount(() => {
7962
8396
  void loadState();
8397
+ void loadAutofillProfiles();
7963
8398
  const unsubscribe = window.vessel.settings.onHealthUpdate((nextHealth) => {
7964
8399
  setHealth(nextHealth);
7965
8400
  });
@@ -8040,11 +8475,13 @@ const Settings = () => {
8040
8475
  },
8041
8476
  get children() {
8042
8477
  return [(() => {
8043
- var _el$ = _tmpl$19(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$11 = _el$3.nextSibling, _el$18 = _el$11.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$21.nextSibling, _el$25 = _el$24.firstChild, _el$27 = _el$25.nextSibling, _el$28 = _el$24.nextSibling, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$31 = _el$28.nextSibling, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$31.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.firstChild, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.firstChild, _el$40 = _el$37.nextSibling, _el$41 = _el$40.nextSibling, _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$64 = _el$41.nextSibling, _el$65 = _el$64.nextSibling;
8478
+ var _el$ = _tmpl$21(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$11 = _el$3.nextSibling, _el$18 = _el$11.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$21.nextSibling, _el$25 = _el$24.firstChild, _el$27 = _el$25.nextSibling, _el$28 = _el$24.nextSibling, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$31 = _el$28.nextSibling, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$31.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.firstChild, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.firstChild, _el$40 = _el$37.nextSibling, _el$41 = _el$40.nextSibling, _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$64 = _el$41.nextSibling, _el$65 = _el$64.nextSibling;
8044
8479
  _el$65.firstChild;
8045
8480
  var _el$74 = _el$65.nextSibling, _el$75 = _el$74.nextSibling, _el$76 = _el$75.firstChild;
8046
8481
  _el$76.firstChild;
8047
- var _el$92 = _el$75.nextSibling, _el$93 = _el$92.nextSibling, _el$94 = _el$93.firstChild, _el$95 = _el$94.firstChild, _el$96 = _el$93.nextSibling, _el$97 = _el$96.firstChild, _el$98 = _el$97.nextSibling;
8482
+ var _el$92 = _el$75.nextSibling, _el$93 = _el$92.nextSibling, _el$94 = _el$93.firstChild;
8483
+ _el$94.nextSibling;
8484
+ var _el$117 = _el$93.nextSibling, _el$118 = _el$117.nextSibling, _el$119 = _el$118.firstChild, _el$120 = _el$119.firstChild, _el$121 = _el$118.nextSibling, _el$122 = _el$121.firstChild, _el$123 = _el$122.nextSibling;
8048
8485
  addEventListener(_el$, "click", closeSettings, true);
8049
8486
  _el$2.$$keydown = handleKeyDown;
8050
8487
  _el$2.$$click = (e) => e.stopPropagation();
@@ -8101,7 +8538,7 @@ const Settings = () => {
8101
8538
  return premiumActive();
8102
8539
  },
8103
8540
  get fallback() {
8104
- return _tmpl$21();
8541
+ return _tmpl$23();
8105
8542
  },
8106
8543
  get children() {
8107
8544
  var _el$26 = _tmpl$4$1();
@@ -8122,55 +8559,55 @@ const Settings = () => {
8122
8559
  return health();
8123
8560
  },
8124
8561
  children: (currentHealth) => (() => {
8125
- var _el$101 = _tmpl$23(), _el$102 = _el$101.firstChild, _el$103 = _el$102.nextSibling, _el$104 = _el$103.firstChild, _el$106 = _el$104.nextSibling;
8126
- _el$106.nextSibling;
8127
- insert(_el$106, () => currentHealth().mcp.status);
8128
- insert(_el$103, () => currentHealth().mcp.message, null);
8129
- insert(_el$101, createComponent(Show, {
8562
+ var _el$126 = _tmpl$25(), _el$127 = _el$126.firstChild, _el$128 = _el$127.nextSibling, _el$129 = _el$128.firstChild, _el$131 = _el$129.nextSibling;
8563
+ _el$131.nextSibling;
8564
+ insert(_el$131, () => currentHealth().mcp.status);
8565
+ insert(_el$128, () => currentHealth().mcp.message, null);
8566
+ insert(_el$126, createComponent(Show, {
8130
8567
  get when() {
8131
8568
  return currentHealth().mcp.endpoint;
8132
8569
  },
8133
8570
  children: (endpoint) => (() => {
8134
- var _el$109 = _tmpl$24(), _el$110 = _el$109.firstChild, _el$111 = _el$110.nextSibling;
8135
- insert(_el$111, endpoint);
8136
- return _el$109;
8571
+ var _el$134 = _tmpl$26(), _el$135 = _el$134.firstChild, _el$136 = _el$135.nextSibling;
8572
+ insert(_el$136, endpoint);
8573
+ return _el$134;
8137
8574
  })()
8138
8575
  }), null);
8139
- insert(_el$101, createComponent(Show, {
8576
+ insert(_el$126, createComponent(Show, {
8140
8577
  get when() {
8141
8578
  return currentHealth().startupIssues.length > 0;
8142
8579
  },
8143
8580
  get children() {
8144
- var _el$108 = _tmpl$22();
8145
- insert(_el$108, () => currentHealth().startupIssues.map((issue) => (() => {
8146
- var _el$112 = _tmpl$25(), _el$113 = _el$112.firstChild, _el$114 = _el$113.nextSibling;
8147
- insert(_el$113, () => issue.title);
8148
- insert(_el$114, () => issue.detail);
8149
- insert(_el$112, createComponent(Show, {
8581
+ var _el$133 = _tmpl$24();
8582
+ insert(_el$133, () => currentHealth().startupIssues.map((issue) => (() => {
8583
+ var _el$137 = _tmpl$27(), _el$138 = _el$137.firstChild, _el$139 = _el$138.nextSibling;
8584
+ insert(_el$138, () => issue.title);
8585
+ insert(_el$139, () => issue.detail);
8586
+ insert(_el$137, createComponent(Show, {
8150
8587
  get when() {
8151
8588
  return issue.action;
8152
8589
  },
8153
8590
  children: (action) => (() => {
8154
- var _el$115 = _tmpl$26();
8155
- insert(_el$115, action);
8156
- return _el$115;
8591
+ var _el$140 = _tmpl$28();
8592
+ insert(_el$140, action);
8593
+ return _el$140;
8157
8594
  })()
8158
8595
  }), null);
8159
8596
  createRenderEffect((_p$) => {
8160
8597
  var _v$0 = !!(issue.severity === "warning"), _v$1 = !!(issue.severity === "error");
8161
- _v$0 !== _p$.e && _el$112.classList.toggle("warning", _p$.e = _v$0);
8162
- _v$1 !== _p$.t && _el$112.classList.toggle("error", _p$.t = _v$1);
8598
+ _v$0 !== _p$.e && _el$137.classList.toggle("warning", _p$.e = _v$0);
8599
+ _v$1 !== _p$.t && _el$137.classList.toggle("error", _p$.t = _v$1);
8163
8600
  return _p$;
8164
8601
  }, {
8165
8602
  e: void 0,
8166
8603
  t: void 0
8167
8604
  });
8168
- return _el$112;
8605
+ return _el$137;
8169
8606
  })()));
8170
- return _el$108;
8607
+ return _el$133;
8171
8608
  }
8172
8609
  }), null);
8173
- return _el$101;
8610
+ return _el$126;
8174
8611
  })()
8175
8612
  }), _el$28);
8176
8613
  _el$30.$$input = (e) => setObsidianVaultPath(e.currentTarget.value);
@@ -8199,10 +8636,10 @@ const Settings = () => {
8199
8636
  insert(_el$46, createComponent(For, {
8200
8637
  each: CHAT_PROVIDERS,
8201
8638
  children: (p) => (() => {
8202
- var _el$116 = _tmpl$27();
8203
- insert(_el$116, () => p.name);
8204
- createRenderEffect(() => _el$116.value = p.id);
8205
- return _el$116;
8639
+ var _el$141 = _tmpl$29();
8640
+ insert(_el$141, () => p.name);
8641
+ createRenderEffect(() => _el$141.value = p.id);
8642
+ return _el$141;
8206
8643
  })()
8207
8644
  }));
8208
8645
  createRenderEffect(() => _el$46.value = chatProviderId());
@@ -8258,12 +8695,12 @@ const Settings = () => {
8258
8695
  },
8259
8696
  get fallback() {
8260
8697
  return (() => {
8261
- var _el$117 = _tmpl$28();
8262
- _el$117.$$input = (e) => setChatModel(e.currentTarget.value);
8263
- setAttribute(_el$117, "spellcheck", false);
8264
- createRenderEffect(() => setAttribute(_el$117, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() && !chatHasStoredApiKey() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
8265
- createRenderEffect(() => _el$117.value = chatModel());
8266
- return _el$117;
8698
+ var _el$142 = _tmpl$30();
8699
+ _el$142.$$input = (e) => setChatModel(e.currentTarget.value);
8700
+ setAttribute(_el$142, "spellcheck", false);
8701
+ createRenderEffect(() => setAttribute(_el$142, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() && !chatHasStoredApiKey() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
8702
+ createRenderEffect(() => _el$142.value = chatModel());
8703
+ return _el$142;
8267
8704
  })();
8268
8705
  },
8269
8706
  get children() {
@@ -8274,10 +8711,10 @@ const Settings = () => {
8274
8711
  return providerModels();
8275
8712
  },
8276
8713
  children: (m) => (() => {
8277
- var _el$118 = _tmpl$27();
8278
- _el$118.value = m;
8279
- insert(_el$118, m);
8280
- return _el$118;
8714
+ var _el$143 = _tmpl$29();
8715
+ _el$143.value = m;
8716
+ insert(_el$143, m);
8717
+ return _el$143;
8281
8718
  })()
8282
8719
  }));
8283
8720
  createRenderEffect(() => _el$57.value = chatModel());
@@ -8298,9 +8735,9 @@ const Settings = () => {
8298
8735
  return modelFetchWarning();
8299
8736
  },
8300
8737
  children: (warning) => (() => {
8301
- var _el$119 = _tmpl$29();
8302
- insert(_el$119, warning);
8303
- return _el$119;
8738
+ var _el$144 = _tmpl$31();
8739
+ insert(_el$144, warning);
8740
+ return _el$144;
8304
8741
  })()
8305
8742
  }), null);
8306
8743
  createRenderEffect(() => _el$58.disabled = modelFetchState() === "loading");
@@ -8333,8 +8770,8 @@ const Settings = () => {
8333
8770
  },
8334
8771
  get fallback() {
8335
8772
  return (() => {
8336
- var _el$120 = _tmpl$32(), _el$121 = _el$120.firstChild, _el$122 = _el$121.nextSibling, _el$123 = _el$122.firstChild, _el$124 = _el$123.nextSibling, _el$128 = _el$122.nextSibling;
8337
- _el$123.$$input = (e) => {
8773
+ var _el$145 = _tmpl$34(), _el$146 = _el$145.firstChild, _el$147 = _el$146.nextSibling, _el$148 = _el$147.firstChild, _el$149 = _el$148.nextSibling, _el$153 = _el$147.nextSibling;
8774
+ _el$148.$$input = (e) => {
8338
8775
  const nextEmail = e.currentTarget.value;
8339
8776
  if (nextEmail.trim().toLowerCase() !== premiumEmail().trim().toLowerCase()) {
8340
8777
  resetPremiumActivationFlow();
@@ -8342,8 +8779,8 @@ const Settings = () => {
8342
8779
  }
8343
8780
  setPremiumEmail(nextEmail);
8344
8781
  };
8345
- setAttribute(_el$123, "spellcheck", false);
8346
- _el$124.$$click = async () => {
8782
+ setAttribute(_el$148, "spellcheck", false);
8783
+ _el$149.$$click = async () => {
8347
8784
  setPremiumLoading(true);
8348
8785
  setPremiumMessage(null);
8349
8786
  try {
@@ -8372,23 +8809,23 @@ const Settings = () => {
8372
8809
  setPremiumLoading(false);
8373
8810
  }
8374
8811
  };
8375
- insert(_el$124, (() => {
8812
+ insert(_el$149, (() => {
8376
8813
  var _c$ = memo(() => !!premiumLoading());
8377
8814
  return () => _c$() ? "Sending..." : premiumCodeSent() ? "Resend Code" : "Send Code";
8378
8815
  })());
8379
- insert(_el$120, createComponent(Show, {
8816
+ insert(_el$145, createComponent(Show, {
8380
8817
  get when() {
8381
8818
  return premiumCodeSent();
8382
8819
  },
8383
8820
  get children() {
8384
- var _el$125 = _tmpl$30(), _el$126 = _el$125.firstChild, _el$127 = _el$126.nextSibling;
8385
- _el$126.$$input = (e) => {
8821
+ var _el$150 = _tmpl$32(), _el$151 = _el$150.firstChild, _el$152 = _el$151.nextSibling;
8822
+ _el$151.$$input = (e) => {
8386
8823
  const nextCode = e.currentTarget.value.replace(/\D+/g, "").slice(0, 6);
8387
8824
  setPremiumCode(nextCode);
8388
8825
  setPremiumMessage(null);
8389
8826
  };
8390
- setAttribute(_el$126, "spellcheck", false);
8391
- _el$127.$$click = async () => {
8827
+ setAttribute(_el$151, "spellcheck", false);
8828
+ _el$152.$$click = async () => {
8392
8829
  setPremiumLoading(true);
8393
8830
  setPremiumMessage(null);
8394
8831
  try {
@@ -8415,53 +8852,53 @@ const Settings = () => {
8415
8852
  setPremiumLoading(false);
8416
8853
  }
8417
8854
  };
8418
- insert(_el$127, () => premiumLoading() ? "Verifying..." : "Verify Code");
8419
- createRenderEffect(() => _el$127.disabled = premiumLoading() || !premiumEmail().trim() || premiumCode().trim().length !== 6 || !premiumChallengeToken());
8420
- createRenderEffect(() => _el$126.value = premiumCode());
8421
- return _el$125;
8855
+ insert(_el$152, () => premiumLoading() ? "Verifying..." : "Verify Code");
8856
+ createRenderEffect(() => _el$152.disabled = premiumLoading() || !premiumEmail().trim() || premiumCode().trim().length !== 6 || !premiumChallengeToken());
8857
+ createRenderEffect(() => _el$151.value = premiumCode());
8858
+ return _el$150;
8422
8859
  }
8423
- }), _el$128);
8424
- _el$128.$$click = () => {
8860
+ }), _el$153);
8861
+ _el$153.$$click = () => {
8425
8862
  startPremiumCheckout();
8426
8863
  };
8427
- insert(_el$120, createComponent(Show, {
8864
+ insert(_el$145, createComponent(Show, {
8428
8865
  get when() {
8429
8866
  return premiumMessage();
8430
8867
  },
8431
8868
  children: (msg) => (() => {
8432
- var _el$130 = _tmpl$33();
8433
- insert(_el$130, () => msg().text);
8869
+ var _el$155 = _tmpl$35();
8870
+ insert(_el$155, () => msg().text);
8434
8871
  createRenderEffect((_p$) => {
8435
8872
  var _v$10 = !!(msg().kind === "success"), _v$11 = !!(msg().kind === "error");
8436
- _v$10 !== _p$.e && _el$130.classList.toggle("success", _p$.e = _v$10);
8437
- _v$11 !== _p$.t && _el$130.classList.toggle("error", _p$.t = _v$11);
8873
+ _v$10 !== _p$.e && _el$155.classList.toggle("success", _p$.e = _v$10);
8874
+ _v$11 !== _p$.t && _el$155.classList.toggle("error", _p$.t = _v$11);
8438
8875
  return _p$;
8439
8876
  }, {
8440
8877
  e: void 0,
8441
8878
  t: void 0
8442
8879
  });
8443
- return _el$130;
8880
+ return _el$155;
8444
8881
  })()
8445
8882
  }), null);
8446
- insert(_el$120, createComponent(Show, {
8883
+ insert(_el$145, createComponent(Show, {
8447
8884
  get when() {
8448
8885
  return premiumState().email || premiumEmail();
8449
8886
  },
8450
8887
  get children() {
8451
- var _el$129 = _tmpl$31();
8452
- _el$129.$$click = async () => {
8888
+ var _el$154 = _tmpl$33();
8889
+ _el$154.$$click = async () => {
8453
8890
  const state = await window.vessel.premium.reset();
8454
8891
  setPremiumState(state);
8455
8892
  setPremiumEmail("");
8456
8893
  resetPremiumActivationFlow();
8457
8894
  setPremiumMessage(null);
8458
8895
  };
8459
- return _el$129;
8896
+ return _el$154;
8460
8897
  }
8461
8898
  }), null);
8462
- createRenderEffect(() => _el$124.disabled = premiumLoading() || !premiumEmail().trim());
8463
- createRenderEffect(() => _el$123.value = premiumEmail());
8464
- return _el$120;
8899
+ createRenderEffect(() => _el$149.disabled = premiumLoading() || !premiumEmail().trim());
8900
+ createRenderEffect(() => _el$148.value = premiumEmail());
8901
+ return _el$145;
8465
8902
  })();
8466
8903
  },
8467
8904
  get children() {
@@ -8511,7 +8948,7 @@ const Settings = () => {
8511
8948
  return premiumActive();
8512
8949
  },
8513
8950
  get fallback() {
8514
- return _tmpl$34();
8951
+ return _tmpl$36();
8515
8952
  },
8516
8953
  get children() {
8517
8954
  return [_tmpl$15(), createComponent(Show, {
@@ -8525,11 +8962,11 @@ const Settings = () => {
8525
8962
  return vaultEntries();
8526
8963
  },
8527
8964
  children: (entry) => (() => {
8528
- var _el$132 = _tmpl$35(), _el$133 = _el$132.firstChild, _el$134 = _el$133.firstChild, _el$135 = _el$134.nextSibling, _el$136 = _el$135.firstChild, _el$137 = _el$133.nextSibling;
8529
- insert(_el$134, () => entry.label);
8530
- insert(_el$135, () => entry.username, _el$136);
8531
- insert(_el$135, () => entry.domainPattern, null);
8532
- insert(_el$135, createComponent(Show, {
8965
+ var _el$157 = _tmpl$37(), _el$158 = _el$157.firstChild, _el$159 = _el$158.firstChild, _el$160 = _el$159.nextSibling, _el$161 = _el$160.firstChild, _el$162 = _el$158.nextSibling;
8966
+ insert(_el$159, () => entry.label);
8967
+ insert(_el$160, () => entry.username, _el$161);
8968
+ insert(_el$160, () => entry.domainPattern, null);
8969
+ insert(_el$160, createComponent(Show, {
8533
8970
  get when() {
8534
8971
  return entry.useCount > 0;
8535
8972
  },
@@ -8537,8 +8974,8 @@ const Settings = () => {
8537
8974
  return [" ", "· Used ", memo(() => entry.useCount), "x"];
8538
8975
  }
8539
8976
  }), null);
8540
- _el$137.$$click = () => handleVaultRemove(entry.id);
8541
- return _el$132;
8977
+ _el$162.$$click = () => handleVaultRemove(entry.id);
8978
+ return _el$157;
8542
8979
  })()
8543
8980
  }));
8544
8981
  return _el$80;
@@ -8595,42 +9032,155 @@ const Settings = () => {
8595
9032
  return vaultMessage();
8596
9033
  },
8597
9034
  children: (msg) => (() => {
8598
- var _el$138 = _tmpl$33();
8599
- insert(_el$138, () => msg().text);
9035
+ var _el$163 = _tmpl$35();
9036
+ insert(_el$163, () => msg().text);
8600
9037
  createRenderEffect((_p$) => {
8601
9038
  var _v$12 = !!(msg().kind === "success"), _v$13 = !!(msg().kind === "error");
8602
- _v$12 !== _p$.e && _el$138.classList.toggle("success", _p$.e = _v$12);
8603
- _v$13 !== _p$.t && _el$138.classList.toggle("error", _p$.t = _v$13);
9039
+ _v$12 !== _p$.e && _el$163.classList.toggle("success", _p$.e = _v$12);
9040
+ _v$13 !== _p$.t && _el$163.classList.toggle("error", _p$.t = _v$13);
8604
9041
  return _p$;
8605
9042
  }, {
8606
9043
  e: void 0,
8607
9044
  t: void 0
8608
9045
  });
8609
- return _el$138;
9046
+ return _el$163;
8610
9047
  })()
8611
9048
  })];
8612
9049
  }
8613
9050
  }), null);
8614
- _el$95.$$click = () => setTelemetryEnabled(!telemetryEnabled());
8615
- _el$97.$$click = handleSave;
8616
- addEventListener(_el$98, "click", closeSettings, true);
9051
+ insert(_el$93, createComponent(Show, {
9052
+ get when() {
9053
+ return autofillProfiles().length > 0;
9054
+ },
9055
+ get children() {
9056
+ var _el$96 = _tmpl$16();
9057
+ insert(_el$96, createComponent(For, {
9058
+ get each() {
9059
+ return autofillProfiles();
9060
+ },
9061
+ children: (profile) => (() => {
9062
+ var _el$164 = _tmpl$38(), _el$165 = _el$164.firstChild, _el$166 = _el$165.firstChild, _el$167 = _el$166.nextSibling, _el$168 = _el$165.nextSibling, _el$169 = _el$168.firstChild, _el$170 = _el$169.nextSibling;
9063
+ insert(_el$166, () => profile.label);
9064
+ insert(_el$167, () => profile.firstName, null);
9065
+ insert(_el$167, (() => {
9066
+ var _c$2 = memo(() => !!profile.lastName);
9067
+ return () => _c$2() ? ` ${profile.lastName}` : "";
9068
+ })(), null);
9069
+ insert(_el$167, (() => {
9070
+ var _c$3 = memo(() => !!profile.email);
9071
+ return () => _c$3() ? ` · ${profile.email}` : "";
9072
+ })(), null);
9073
+ _el$169.$$click = () => handleAutofillFill(profile.id);
9074
+ _el$170.$$click = () => handleAutofillRemove(profile.id);
9075
+ return _el$164;
9076
+ })()
9077
+ }));
9078
+ return _el$96;
9079
+ }
9080
+ }), null);
9081
+ insert(_el$93, createComponent(Show, {
9082
+ get when() {
9083
+ return !autofillAdding();
9084
+ },
9085
+ get children() {
9086
+ var _el$97 = _tmpl$19();
9087
+ _el$97.$$click = () => {
9088
+ setAutofillAdding(true);
9089
+ setAutofillMessage(null);
9090
+ };
9091
+ return _el$97;
9092
+ }
9093
+ }), null);
9094
+ insert(_el$93, createComponent(Show, {
9095
+ get when() {
9096
+ return autofillAdding();
9097
+ },
9098
+ get children() {
9099
+ var _el$98 = _tmpl$20(), _el$99 = _el$98.firstChild, _el$100 = _el$99.nextSibling, _el$101 = _el$100.firstChild, _el$102 = _el$101.nextSibling, _el$103 = _el$100.nextSibling, _el$104 = _el$103.firstChild, _el$105 = _el$104.nextSibling, _el$106 = _el$103.nextSibling, _el$107 = _el$106.nextSibling, _el$108 = _el$107.nextSibling, _el$109 = _el$108.nextSibling, _el$110 = _el$109.firstChild, _el$111 = _el$110.nextSibling, _el$112 = _el$111.nextSibling, _el$113 = _el$109.nextSibling, _el$114 = _el$113.nextSibling, _el$115 = _el$114.firstChild, _el$116 = _el$115.nextSibling;
9100
+ _el$99.$$input = (e) => setAutofillLabel(e.currentTarget.value);
9101
+ setAttribute(_el$99, "spellcheck", false);
9102
+ _el$101.$$input = (e) => setAutofillFirstName(e.currentTarget.value);
9103
+ _el$102.$$input = (e) => setAutofillLastName(e.currentTarget.value);
9104
+ _el$104.$$input = (e) => setAutofillEmail(e.currentTarget.value);
9105
+ setAttribute(_el$104, "spellcheck", false);
9106
+ _el$105.$$input = (e) => setAutofillPhone(e.currentTarget.value);
9107
+ _el$106.$$input = (e) => setAutofillOrg(e.currentTarget.value);
9108
+ _el$107.$$input = (e) => setAutofillAddr1(e.currentTarget.value);
9109
+ _el$108.$$input = (e) => setAutofillAddr2(e.currentTarget.value);
9110
+ _el$110.$$input = (e) => setAutofillCity(e.currentTarget.value);
9111
+ _el$111.$$input = (e) => setAutofillState(e.currentTarget.value);
9112
+ _el$112.$$input = (e) => setAutofillZip(e.currentTarget.value);
9113
+ _el$113.$$input = (e) => setAutofillCountry(e.currentTarget.value);
9114
+ _el$115.$$click = handleAutofillAdd;
9115
+ _el$116.$$click = () => {
9116
+ setAutofillAdding(false);
9117
+ setAutofillLabel("");
9118
+ setAutofillFirstName("");
9119
+ setAutofillLastName("");
9120
+ setAutofillEmail("");
9121
+ setAutofillPhone("");
9122
+ setAutofillOrg("");
9123
+ setAutofillAddr1("");
9124
+ setAutofillAddr2("");
9125
+ setAutofillCity("");
9126
+ setAutofillState("");
9127
+ setAutofillZip("");
9128
+ setAutofillCountry("");
9129
+ };
9130
+ createRenderEffect(() => _el$99.value = autofillLabel());
9131
+ createRenderEffect(() => _el$101.value = autofillFirstName());
9132
+ createRenderEffect(() => _el$102.value = autofillLastName());
9133
+ createRenderEffect(() => _el$104.value = autofillEmail());
9134
+ createRenderEffect(() => _el$105.value = autofillPhone());
9135
+ createRenderEffect(() => _el$106.value = autofillOrg());
9136
+ createRenderEffect(() => _el$107.value = autofillAddr1());
9137
+ createRenderEffect(() => _el$108.value = autofillAddr2());
9138
+ createRenderEffect(() => _el$110.value = autofillCity());
9139
+ createRenderEffect(() => _el$111.value = autofillState());
9140
+ createRenderEffect(() => _el$112.value = autofillZip());
9141
+ createRenderEffect(() => _el$113.value = autofillCountry());
9142
+ return _el$98;
9143
+ }
9144
+ }), null);
9145
+ insert(_el$93, createComponent(Show, {
9146
+ get when() {
9147
+ return autofillMessage();
9148
+ },
9149
+ children: (msg) => (() => {
9150
+ var _el$171 = _tmpl$35();
9151
+ insert(_el$171, () => msg().text);
9152
+ createRenderEffect((_p$) => {
9153
+ var _v$14 = !!(msg().kind === "success"), _v$15 = !!(msg().kind === "error");
9154
+ _v$14 !== _p$.e && _el$171.classList.toggle("success", _p$.e = _v$14);
9155
+ _v$15 !== _p$.t && _el$171.classList.toggle("error", _p$.t = _v$15);
9156
+ return _p$;
9157
+ }, {
9158
+ e: void 0,
9159
+ t: void 0
9160
+ });
9161
+ return _el$171;
9162
+ })()
9163
+ }), null);
9164
+ _el$120.$$click = () => setTelemetryEnabled(!telemetryEnabled());
9165
+ _el$122.$$click = handleSave;
9166
+ addEventListener(_el$123, "click", closeSettings, true);
8617
9167
  insert(_el$2, createComponent(Show, {
8618
9168
  get when() {
8619
9169
  return status();
8620
9170
  },
8621
9171
  children: (currentStatus) => (() => {
8622
- var _el$139 = _tmpl$33();
8623
- insert(_el$139, () => currentStatus().text);
9172
+ var _el$172 = _tmpl$35();
9173
+ insert(_el$172, () => currentStatus().text);
8624
9174
  createRenderEffect((_p$) => {
8625
- var _v$14 = !!(currentStatus().kind === "success"), _v$15 = !!(currentStatus().kind === "error");
8626
- _v$14 !== _p$.e && _el$139.classList.toggle("success", _p$.e = _v$14);
8627
- _v$15 !== _p$.t && _el$139.classList.toggle("error", _p$.t = _v$15);
9175
+ var _v$16 = !!(currentStatus().kind === "success"), _v$17 = !!(currentStatus().kind === "error");
9176
+ _v$16 !== _p$.e && _el$172.classList.toggle("success", _p$.e = _v$16);
9177
+ _v$17 !== _p$.t && _el$172.classList.toggle("error", _p$.t = _v$17);
8628
9178
  return _p$;
8629
9179
  }, {
8630
9180
  e: void 0,
8631
9181
  t: void 0
8632
9182
  });
8633
- return _el$139;
9183
+ return _el$172;
8634
9184
  })()
8635
9185
  }), null);
8636
9186
  createRenderEffect((_p$) => {
@@ -8642,8 +9192,8 @@ const Settings = () => {
8642
9192
  _v$5 !== _p$.i && setAttribute(_el$39, "aria-checked", _p$.i = _v$5);
8643
9193
  _v$6 !== _p$.n && _el$43.classList.toggle("on", _p$.n = _v$6);
8644
9194
  _v$7 !== _p$.s && setAttribute(_el$43, "aria-checked", _p$.s = _v$7);
8645
- _v$8 !== _p$.h && _el$95.classList.toggle("on", _p$.h = _v$8);
8646
- _v$9 !== _p$.r && setAttribute(_el$95, "aria-checked", _p$.r = _v$9);
9195
+ _v$8 !== _p$.h && _el$120.classList.toggle("on", _p$.h = _v$8);
9196
+ _v$9 !== _p$.r && setAttribute(_el$120, "aria-checked", _p$.r = _v$9);
8647
9197
  return _p$;
8648
9198
  }, {
8649
9199
  e: void 0,
@@ -8661,7 +9211,7 @@ const Settings = () => {
8661
9211
  createRenderEffect(() => _el$30.value = obsidianVaultPath());
8662
9212
  createRenderEffect(() => _el$33.value = agentTranscriptMode());
8663
9213
  return _el$;
8664
- })(), _tmpl$20()];
9214
+ })(), _tmpl$22()];
8665
9215
  }
8666
9216
  });
8667
9217
  };
@@ -8912,6 +9462,7 @@ const App = () => {
8912
9462
  }
8913
9463
  };
8914
9464
  onMount(() => {
9465
+ window.vessel.ui.rendererReady(view);
8915
9466
  if (view !== "chrome") return;
8916
9467
  const cleanupKeys = setupKeybindings({
8917
9468
  openCommandBar,