@quanta-intellect/vessel-browser 0.1.69 → 0.1.71

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.
@@ -1435,6 +1435,7 @@ function Dynamic(props) {
1435
1435
  }
1436
1436
  var _tmpl$$i = /* @__PURE__ */ template(`<div class=title-bar><div class=title-bar-drag></div><div class=mcp-status-area><button class=mcp-status-indicator><span class=mcp-dot></span><span class=mcp-label>MCP</span></button></div><div class=window-controls><button class=window-btn data-tooltip=Minimize><svg width=10 height=10 viewBox="0 0 10 10"><rect x=1 y=5 width=8 height=1 fill=currentColor></rect></svg></button><button class=window-btn data-tooltip=Maximize><svg width=10 height=10 viewBox="0 0 10 10"><rect x=1 y=1 width=8 height=8 fill=none stroke=currentColor stroke-width=1></rect></svg></button><button class="window-btn window-btn-close"data-tooltip=Close><svg width=10 height=10 viewBox="0 0 10 10"><line x1=1 y1=1 x2=9 y2=9 stroke=currentColor stroke-width=1.2></line><line x1=9 y1=1 x2=1 y2=9 stroke=currentColor stroke-width=1.2>`);
1437
1437
  const TitleBar = () => {
1438
+ const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
1438
1439
  const [mcpStatus, setMcpStatus] = createSignal("starting");
1439
1440
  const [mcpTooltip, setMcpTooltip] = createSignal("MCP: starting...");
1440
1441
  const applyHealth = (health) => {
@@ -1461,6 +1462,7 @@ const TitleBar = () => {
1461
1462
  onCleanup(unsubscribe);
1462
1463
  });
1463
1464
  const handleMcpClick = () => {
1465
+ if (isPrivateWindow) return;
1464
1466
  window.vessel.ui.setSettingsVisibility(true);
1465
1467
  };
1466
1468
  return (() => {
@@ -1594,7 +1596,12 @@ function useTabs() {
1594
1596
  patchTab(id, { adBlockingEnabled: newState });
1595
1597
  }
1596
1598
  return newState;
1597
- }
1599
+ },
1600
+ zoomIn: (id) => window.vessel.tabs.zoomIn(id),
1601
+ zoomOut: (id) => window.vessel.tabs.zoomOut(id),
1602
+ zoomReset: (id) => window.vessel.tabs.zoomReset(id),
1603
+ reopenClosed: () => window.vessel.tabs.reopenClosed(),
1604
+ duplicate: (id) => window.vessel.tabs.duplicate(id)
1598
1605
  };
1599
1606
  }
1600
1607
  const [now, setNow] = createSignal(Date.now());
@@ -1773,7 +1780,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
1773
1780
  }
1774
1781
  return "idle";
1775
1782
  }
1776
- var _tmpl$$h = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$c = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list><button class=tab-new data-tooltip="New Tab">+`), _tmpl$4$c = /* @__PURE__ */ template(`<div role=tab><span class=tab-title></span><button class=tab-close>×`), _tmpl$5$b = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$6$a = /* @__PURE__ */ template(`<span class=tab-loading>`);
1783
+ var _tmpl$$h = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$c = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list></div><div class=tab-actions><button class=tab-new data-tooltip="New tab"data-tooltip-pos=left>+</button><button class="tab-new tab-new-private"data-tooltip="Private window"data-tooltip-pos=left><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11z">`), _tmpl$4$c = /* @__PURE__ */ template(`<div role=tab><span class=tab-title></span><button class=tab-close>×`), _tmpl$5$b = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$6$a = /* @__PURE__ */ template(`<span class=tab-loading>`);
1777
1784
  const TAB_CLOSE_MS = 200;
1778
1785
  function stringToHue(str) {
1779
1786
  let hash = 0;
@@ -1840,18 +1847,22 @@ const TabBar = () => {
1840
1847
  }, TAB_CLOSE_MS);
1841
1848
  };
1842
1849
  return (() => {
1843
- var _el$3 = _tmpl$3$c(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
1850
+ var _el$3 = _tmpl$3$c(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
1844
1851
  insert(_el$4, createComponent(For, {
1845
1852
  get each() {
1846
1853
  return tabs2();
1847
1854
  },
1848
1855
  children: (tab) => (() => {
1849
- var _el$6 = _tmpl$4$c(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
1850
- _el$6.addEventListener("auxclick", (e) => {
1856
+ var _el$8 = _tmpl$4$c(), _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling;
1857
+ _el$8.$$contextmenu = (e) => {
1858
+ e.preventDefault();
1859
+ window.vessel.tabs.showContextMenu(tab.id);
1860
+ };
1861
+ _el$8.addEventListener("auxclick", (e) => {
1851
1862
  if (e.button === 1) handleClose(tab.id);
1852
1863
  });
1853
- _el$6.$$click = () => switchTab(tab.id);
1854
- insert(_el$6, createComponent(TabFavicon, {
1864
+ _el$8.$$click = () => switchTab(tab.id);
1865
+ insert(_el$8, createComponent(TabFavicon, {
1855
1866
  get favicon() {
1856
1867
  return tab.favicon;
1857
1868
  },
@@ -1861,39 +1872,40 @@ const TabBar = () => {
1861
1872
  get url() {
1862
1873
  return tab.url;
1863
1874
  }
1864
- }), _el$7);
1865
- insert(_el$6, (() => {
1875
+ }), _el$9);
1876
+ insert(_el$8, (() => {
1866
1877
  var _c$ = memo(() => !!modelActiveTabIds().has(tab.id));
1867
1878
  return () => _c$() && _tmpl$5$b();
1868
- })(), _el$7);
1869
- insert(_el$7, () => tab.title || "New Tab");
1870
- insert(_el$6, (() => {
1879
+ })(), _el$9);
1880
+ insert(_el$9, () => tab.title || "New Tab");
1881
+ insert(_el$8, (() => {
1871
1882
  var _c$2 = memo(() => !!tab.isLoading);
1872
1883
  return () => _c$2() && _tmpl$6$a();
1873
- })(), _el$8);
1874
- _el$8.$$click = (e) => {
1884
+ })(), _el$0);
1885
+ _el$0.$$click = (e) => {
1875
1886
  e.stopPropagation();
1876
1887
  handleClose(tab.id);
1877
1888
  };
1878
1889
  createRenderEffect((_p$) => {
1879
1890
  var _v$ = `tab-item ${tab.id === activeTabId2() ? "active" : ""} ${modelActiveTabIds().has(tab.id) ? "model-active" : ""}`, _v$2 = !!closingTabIds().has(tab.id), _v$3 = modelActiveTabIds().has(tab.id) ? `${tab.title || "New Tab"} • Agent active` : tab.title;
1880
- _v$ !== _p$.e && className(_el$6, _p$.e = _v$);
1881
- _v$2 !== _p$.t && _el$6.classList.toggle("closing", _p$.t = _v$2);
1882
- _v$3 !== _p$.a && setAttribute(_el$6, "title", _p$.a = _v$3);
1891
+ _v$ !== _p$.e && className(_el$8, _p$.e = _v$);
1892
+ _v$2 !== _p$.t && _el$8.classList.toggle("closing", _p$.t = _v$2);
1893
+ _v$3 !== _p$.a && setAttribute(_el$8, "title", _p$.a = _v$3);
1883
1894
  return _p$;
1884
1895
  }, {
1885
1896
  e: void 0,
1886
1897
  t: void 0,
1887
1898
  a: void 0
1888
1899
  });
1889
- return _el$6;
1900
+ return _el$8;
1890
1901
  })()
1891
- }), _el$5);
1892
- _el$5.$$click = () => createTab();
1902
+ }));
1903
+ _el$6.$$click = () => createTab();
1904
+ _el$7.$$click = () => window.vessel.tabs.openPrivateWindow();
1893
1905
  return _el$3;
1894
1906
  })();
1895
1907
  };
1896
- delegateEvents(["click"]);
1908
+ delegateEvents(["click", "contextmenu"]);
1897
1909
  const DEFAULT_SIDEBAR_WIDTH = 400;
1898
1910
  const MIN_SIDEBAR = 240;
1899
1911
  const MAX_SIDEBAR = 800;
@@ -1964,6 +1976,82 @@ function useUI() {
1964
1976
  }
1965
1977
  };
1966
1978
  }
1979
+ const logger$3 = createLogger("HistoryStore");
1980
+ const INITIAL$1 = { entries: [] };
1981
+ const [historyState, setHistoryState] = createSignal(INITIAL$1);
1982
+ let initialized$2 = false;
1983
+ let initPromise$1 = null;
1984
+ async function init$2() {
1985
+ if (initPromise$1) return initPromise$1;
1986
+ if (initialized$2) return;
1987
+ initialized$2 = true;
1988
+ initPromise$1 = (async () => {
1989
+ try {
1990
+ const state = await window.vessel.history.get();
1991
+ setHistoryState(state);
1992
+ window.vessel.history.onUpdate((s) => setHistoryState(s));
1993
+ } catch (error) {
1994
+ initialized$2 = false;
1995
+ logger$3.error("Failed to initialize history store:", error);
1996
+ } finally {
1997
+ initPromise$1 = null;
1998
+ }
1999
+ })();
2000
+ return initPromise$1;
2001
+ }
2002
+ function useHistory() {
2003
+ void init$2();
2004
+ return {
2005
+ historyState,
2006
+ search: (query) => window.vessel.history.search(query),
2007
+ clear: () => window.vessel.history.clear()
2008
+ };
2009
+ }
2010
+ const logger$2 = createLogger("BookmarksStore");
2011
+ const INITIAL = { folders: [], bookmarks: [] };
2012
+ const [bookmarksState, setBookmarksState] = createSignal(INITIAL);
2013
+ let initialized$1 = false;
2014
+ let initPromise = null;
2015
+ async function init$1() {
2016
+ if (initPromise) return initPromise;
2017
+ if (initialized$1) return;
2018
+ initialized$1 = true;
2019
+ initPromise = (async () => {
2020
+ try {
2021
+ const state = await window.vessel.bookmarks.get();
2022
+ setBookmarksState(state);
2023
+ window.vessel.bookmarks.onUpdate((s) => setBookmarksState(s));
2024
+ } catch (error) {
2025
+ initialized$1 = false;
2026
+ logger$2.error("Failed to initialize bookmarks store:", error);
2027
+ } finally {
2028
+ initPromise = null;
2029
+ }
2030
+ })();
2031
+ return initPromise;
2032
+ }
2033
+ function useBookmarks() {
2034
+ void init$1();
2035
+ return {
2036
+ bookmarksState,
2037
+ saveBookmark: (url, title, folderId, note, intent, expectedContent, keyFields, agentHints) => window.vessel.bookmarks.saveBookmark(
2038
+ url,
2039
+ title,
2040
+ folderId,
2041
+ note,
2042
+ intent,
2043
+ expectedContent,
2044
+ keyFields,
2045
+ agentHints
2046
+ ),
2047
+ updateBookmark: (id, updates) => window.vessel.bookmarks.updateBookmark(id, updates),
2048
+ removeBookmark: (id) => window.vessel.bookmarks.removeBookmark(id),
2049
+ createFolder: (name) => window.vessel.bookmarks.createFolder(name),
2050
+ createFolderWithSummary: (name, summary) => window.vessel.bookmarks.createFolderWithSummary(name, summary),
2051
+ removeFolder: (id, deleteContents) => window.vessel.bookmarks.removeFolder(id, deleteContents),
2052
+ renameFolder: (id, newName, summary) => window.vessel.bookmarks.renameFolder(id, newName, summary)
2053
+ };
2054
+ }
1967
2055
  function normalizePageUrl(rawUrl) {
1968
2056
  try {
1969
2057
  const url = new URL(rawUrl);
@@ -2078,7 +2166,15 @@ function buildPageSnapshotKey(rawUrl) {
2078
2166
  function matchesPageSnapshotUrl(left, right) {
2079
2167
  return buildPageSnapshotKey(left) === buildPageSnapshotKey(right);
2080
2168
  }
2081
- var _tmpl$$g = /* @__PURE__ */ template(`<button class="agent-status-badge recent"title="Open the What Changed timeline"style=cursor:pointer;font-size:11px><span class=agent-status-dot aria-hidden=true style=background:#f59e0b></span><span class=agent-status-text>What Changed?`), _tmpl$2$e = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$3$b = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Changed recently`), _tmpl$4$b = /* @__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><div style=display:flex;gap:8px;align-items:center><button class=nav-btn title="Open the full What Changed timeline"style="height:24px;min-width:auto;padding:0 8px">Timeline</button><button class=page-diff-popup-close>&times;`), _tmpl$5$a = /* @__PURE__ */ template(`<svg><path d="M3 3 L11 3 L11 9 Q7 13 3 9 Z"fill=none stroke=currentColor stroke-width=1.2 stroke-linejoin=round></svg>`, false, true, false), _tmpl$6$9 = /* @__PURE__ */ template(`<svg><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.4 stroke-linecap=round></svg>`, false, true, false), _tmpl$7$7 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$8$5 = /* @__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><svg width=14 height=14 viewBox="0 0 14 14"></svg></button><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$9$4 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$0$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$10$4 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$11$4 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$12$4 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$13$3 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><span class=page-diff-section></span><span class=page-diff-summary>`), _tmpl$14$3 = /* @__PURE__ */ template(`<li>`);
2169
+ const SEARCH_ENGINE_PRESETS = {
2170
+ duckduckgo: { label: "DuckDuckGo", url: "https://duckduckgo.com/?q=" },
2171
+ google: { label: "Google", url: "https://www.google.com/search?q=" },
2172
+ bing: { label: "Bing", url: "https://www.bing.com/search?q=" },
2173
+ brave: { label: "Brave Search", url: "https://search.brave.com/search?q=" },
2174
+ ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
2175
+ kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
2176
+ };
2177
+ var _tmpl$$g = /* @__PURE__ */ template(`<div class=private-badge title="Private Browsing - history and cookies are not saved"><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11zM5.5 7a1.5 1.5 0 103 0 1.5 1.5 0 00-3 0zm3.5 3.5c0-1-1.5-2-2.5-2s-2.5 1-2.5 2"></path></svg><span>Private`), _tmpl$2$e = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$3$b = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$4$b = /* @__PURE__ */ template(`<button class="agent-status-badge recent"title="Open the What Changed timeline"style=cursor:pointer;font-size:11px><span class=agent-status-dot aria-hidden=true style=background:#f59e0b></span><span class=agent-status-text>What Changed?`), _tmpl$5$a = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$6$9 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Changed recently`), _tmpl$7$7 = /* @__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><div style=display:flex;gap:8px;align-items:center><button class=nav-btn title="Open the full What Changed timeline"style="height:24px;min-width:auto;padding:0 8px">Timeline</button><button class=page-diff-popup-close>&times;`), _tmpl$8$5 = /* @__PURE__ */ template(`<svg><path d="M3 3 L11 3 L11 9 Q7 13 3 9 Z"fill=none stroke=currentColor stroke-width=1.2 stroke-linejoin=round></svg>`, false, true, false), _tmpl$9$4 = /* @__PURE__ */ template(`<svg><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.4 stroke-linecap=round></svg>`, false, true, false), _tmpl$0$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Reader Mode"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=2 y=1 width=10 height=12 rx=1 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=4 y1=4 x2=10 y2=4 stroke=currentColor stroke-width=1></line><line x1=4 y1=6.5 x2=10 y2=6.5 stroke=currentColor stroke-width=1></line><line x1=4 y1=9 x2=8 y2=9 stroke=currentColor stroke-width=1>`), _tmpl$1$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Dev Tools"><svg width=14 height=14 viewBox="0 0 14 14"><polyline points="3,5 1,7 3,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><polyline points="11,5 13,7 11,9"fill=none stroke=currentColor stroke-width=1.2 stroke-linecap=round stroke-linejoin=round></polyline><line x1=8.5 y1=2 x2=5.5 y2=12 stroke=currentColor stroke-width=1.2 stroke-linecap=round>`), _tmpl$10$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="nav-btn nav-btn-sidebar"><svg width=14 height=14 viewBox="0 0 14 14"><rect x=1 y=1 width=12 height=12 rx=1.5 fill=none stroke=currentColor stroke-width=1.2></rect><line x1=9 y1=1 x2=9 y2=13 stroke=currentColor stroke-width=1.2>`), _tmpl$12$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`), _tmpl$13$3 = /* @__PURE__ */ template(`<div class=address-bar><div class=nav-controls><button class=nav-btn data-tooltip=Back><svg width=14 height=14 viewBox="0 0 14 14"><path d="M9 2L4 7l5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Forward><svg width=14 height=14 viewBox="0 0 14 14"><path d="M5 2l5 5-5 5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=nav-btn data-tooltip=Reload><svg width=14 height=14 viewBox="0 0 14 14"><path d="M2.5 7a4.5 4.5 0 1 1 1 3"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M2 4v3.5h3.5"fill=none stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button></div><div class=url-shell><form class=url-form><input class=url-input type=text placeholder="Search or enter URL"autocomplete=off aria-autocomplete=list aria-controls=address-autocomplete></form></div><div class=toolbar-actions><button class=nav-btn><svg width=14 height=14 viewBox="0 0 14 14">`), _tmpl$14$3 = /* @__PURE__ */ template(`<div role=option><span class=autocomplete-icon></span><span class=autocomplete-text><span class=autocomplete-title></span><span class=autocomplete-url>`), _tmpl$15$3 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$16$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$17$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$18$3 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$19$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$20$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$21$3 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><span class=page-diff-section></span><span class=page-diff-summary>`), _tmpl$22$3 = /* @__PURE__ */ template(`<li>`);
2082
2178
  const AddressBar = () => {
2083
2179
  const {
2084
2180
  activeTab,
@@ -2098,16 +2194,48 @@ const AddressBar = () => {
2098
2194
  toggleDevTools,
2099
2195
  devtoolsPanelOpen: devtoolsPanelOpen2
2100
2196
  } = useUI();
2197
+ const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
2198
+ const {
2199
+ historyState: historyState2
2200
+ } = useHistory();
2201
+ const {
2202
+ bookmarksState: bookmarksState2
2203
+ } = useBookmarks();
2101
2204
  const [inputValue, setInputValue] = createSignal("");
2205
+ const [showSuggestions, setShowSuggestions] = createSignal(false);
2206
+ const [selectedIndex, setSelectedIndex] = createSignal(-1);
2207
+ const [searchEngine, setSearchEngine] = createSignal("duckduckgo");
2102
2208
  const now2 = useNow();
2103
2209
  let inputRef;
2104
2210
  const agentPresence = createMemo(() => getAgentPresence(runtimeState2(), now2()));
2105
2211
  const agentStatusMessage = createMemo(() => getLatestAgentStatusMessage(runtimeState2(), now2()));
2106
2212
  const pendingApprovalCount = createMemo(() => runtimeState2().supervisor.pendingApprovals.length);
2213
+ const searchEnginePreset = createMemo(() => {
2214
+ const engine = searchEngine();
2215
+ return engine === "none" ? SEARCH_ENGINE_PRESETS.duckduckgo : SEARCH_ENGINE_PRESETS[engine];
2216
+ });
2217
+ const buildSearchUrl = (query) => searchEnginePreset().url + encodeURIComponent(query);
2107
2218
  const [pageDiff, setPageDiff] = createSignal(null);
2108
2219
  const [diffExpanded, setDiffExpanded] = createSignal(false);
2109
2220
  let diffCollapseTimer = null;
2221
+ onMount(() => {
2222
+ let disposed = false;
2223
+ void window.vessel.settings.get().then((settings) => {
2224
+ if (!disposed) {
2225
+ setSearchEngine(settings.defaultSearchEngine ?? "duckduckgo");
2226
+ }
2227
+ }).catch(() => {
2228
+ });
2229
+ const unsubscribe = window.vessel.settings.onUpdate((settings) => {
2230
+ setSearchEngine(settings.defaultSearchEngine ?? "duckduckgo");
2231
+ });
2232
+ onCleanup(() => {
2233
+ disposed = true;
2234
+ unsubscribe();
2235
+ });
2236
+ });
2110
2237
  const showIncomingDiff = (diff) => {
2238
+ if (isPrivateWindow) return;
2111
2239
  setPageDiff(diff);
2112
2240
  setDiffExpanded(true);
2113
2241
  if (diffCollapseTimer) clearTimeout(diffCollapseTimer);
@@ -2117,6 +2245,7 @@ const AddressBar = () => {
2117
2245
  }, 8e3);
2118
2246
  };
2119
2247
  const openDiffTimeline = async () => {
2248
+ if (isPrivateWindow) return;
2120
2249
  setDiffExpanded(false);
2121
2250
  if (diffCollapseTimer) {
2122
2251
  clearTimeout(diffCollapseTimer);
@@ -2145,6 +2274,7 @@ const AddressBar = () => {
2145
2274
  return `${hours}h`;
2146
2275
  };
2147
2276
  createEffect(() => {
2277
+ if (isPrivateWindow) return;
2148
2278
  const unsubscribe = window.vessel.pageDiff.onChanged((diff) => {
2149
2279
  const tab = activeTab();
2150
2280
  if (!tab) return;
@@ -2163,10 +2293,65 @@ const AddressBar = () => {
2163
2293
  const tab = activeTab();
2164
2294
  if (tab && !inputRef?.matches(":focus")) {
2165
2295
  setInputValue(tab.url === "about:blank" ? "" : tab.url);
2296
+ setShowSuggestions(false);
2297
+ setSelectedIndex(-1);
2298
+ }
2299
+ });
2300
+ const MAX_SUGGESTIONS = 8;
2301
+ const suggestions = createMemo(() => {
2302
+ const rawQuery = inputValue().trim();
2303
+ const query = rawQuery.toLowerCase();
2304
+ if (!query || query.length < 2) return [];
2305
+ const results = [];
2306
+ const seen = /* @__PURE__ */ new Set();
2307
+ const matchLimit = MAX_SUGGESTIONS - 1;
2308
+ for (const b of bookmarksState2().bookmarks) {
2309
+ if (seen.has(b.url)) continue;
2310
+ const urlMatch = b.url.toLowerCase().includes(query);
2311
+ const titleMatch = b.title.toLowerCase().includes(query);
2312
+ if (urlMatch || titleMatch) {
2313
+ seen.add(b.url);
2314
+ results.push({
2315
+ url: b.url,
2316
+ title: b.title,
2317
+ source: "bookmark"
2318
+ });
2319
+ }
2320
+ if (results.length >= matchLimit) break;
2321
+ }
2322
+ if (results.length < matchLimit) {
2323
+ for (const h of historyState2().entries) {
2324
+ if (seen.has(h.url)) continue;
2325
+ const urlMatch = h.url.toLowerCase().includes(query);
2326
+ const titleMatch = h.title.toLowerCase().includes(query);
2327
+ if (urlMatch || titleMatch) {
2328
+ seen.add(h.url);
2329
+ results.push({
2330
+ url: h.url,
2331
+ title: h.title,
2332
+ source: "history"
2333
+ });
2334
+ }
2335
+ if (results.length >= matchLimit) break;
2336
+ }
2337
+ }
2338
+ if (results.length < MAX_SUGGESTIONS) {
2339
+ results.push({
2340
+ url: buildSearchUrl(rawQuery),
2341
+ title: `Search for "${rawQuery}"`,
2342
+ subtitle: searchEnginePreset().label,
2343
+ source: "search"
2344
+ });
2166
2345
  }
2346
+ return results;
2167
2347
  });
2168
2348
  createEffect(() => {
2169
2349
  const tab = activeTab();
2350
+ if (isPrivateWindow) {
2351
+ setPageDiff(null);
2352
+ setDiffExpanded(false);
2353
+ return;
2354
+ }
2170
2355
  if (!tab) {
2171
2356
  setPageDiff(null);
2172
2357
  setDiffExpanded(false);
@@ -2190,37 +2375,150 @@ const AddressBar = () => {
2190
2375
  cancelled = true;
2191
2376
  });
2192
2377
  });
2378
+ const selectSuggestion = (url) => {
2379
+ setInputValue(url);
2380
+ setShowSuggestions(false);
2381
+ setSelectedIndex(-1);
2382
+ navigate(url);
2383
+ inputRef?.blur();
2384
+ };
2193
2385
  const handleSubmit = (e) => {
2194
2386
  e.preventDefault();
2195
- const val = inputValue().trim();
2196
- if (val) {
2197
- navigate(val);
2198
- inputRef?.blur();
2387
+ const idx = selectedIndex();
2388
+ const items = suggestions();
2389
+ if (idx >= 0 && idx < items.length) {
2390
+ selectSuggestion(items[idx].url);
2391
+ } else {
2392
+ const val = inputValue().trim();
2393
+ if (val) {
2394
+ navigate(val);
2395
+ inputRef?.blur();
2396
+ setShowSuggestions(false);
2397
+ }
2398
+ }
2399
+ };
2400
+ const handleInputKeyDown = (e) => {
2401
+ const items = suggestions();
2402
+ const idx = selectedIndex();
2403
+ if (e.key === "ArrowDown") {
2404
+ e.preventDefault();
2405
+ if (items.length > 0) {
2406
+ setShowSuggestions(true);
2407
+ setSelectedIndex(idx < items.length - 1 ? idx + 1 : 0);
2408
+ }
2409
+ } else if (e.key === "ArrowUp") {
2410
+ e.preventDefault();
2411
+ if (items.length > 0) {
2412
+ setShowSuggestions(true);
2413
+ setSelectedIndex(idx > 0 ? idx - 1 : items.length - 1);
2414
+ }
2415
+ } else if (e.key === "Escape") {
2416
+ if (showSuggestions()) {
2417
+ setShowSuggestions(false);
2418
+ setSelectedIndex(-1);
2419
+ } else {
2420
+ inputRef?.blur();
2421
+ }
2199
2422
  }
2200
2423
  };
2201
2424
  const formatSectionLabel = (section) => section === "title" ? "Title" : section === "headings" ? "Headings" : "Content";
2202
2425
  return (() => {
2203
- var _el$ = _tmpl$8$5(), _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$26 = _el$6.nextSibling, _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$32 = _el$27.nextSibling, _el$33 = _el$32.nextSibling, _el$34 = _el$33.nextSibling;
2204
- _el$34.firstChild;
2205
- var _el$37 = _el$34.nextSibling;
2426
+ var _el$ = _tmpl$13$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$7 = _el$2.nextSibling, _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$28 = _el$7.nextSibling, _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild;
2206
2427
  addEventListener(_el$3, "click", goBack, true);
2207
2428
  addEventListener(_el$4, "click", goForward, true);
2208
2429
  addEventListener(_el$5, "click", reload, true);
2209
- _el$7.addEventListener("submit", handleSubmit);
2210
- _el$8.addEventListener("focus", (e) => e.currentTarget.select());
2211
- _el$8.$$input = (e) => setInputValue(e.currentTarget.value);
2430
+ insert(_el$, createComponent(Show, {
2431
+ when: isPrivateWindow,
2432
+ get children() {
2433
+ return _tmpl$$g();
2434
+ }
2435
+ }), _el$7);
2436
+ _el$8.addEventListener("submit", handleSubmit);
2437
+ _el$9.addEventListener("blur", () => {
2438
+ setTimeout(() => {
2439
+ setShowSuggestions(false);
2440
+ setSelectedIndex(-1);
2441
+ }, 150);
2442
+ });
2443
+ _el$9.$$keydown = handleInputKeyDown;
2444
+ _el$9.addEventListener("focus", (e) => {
2445
+ e.currentTarget.select();
2446
+ const query = inputValue().trim();
2447
+ if (query.length >= 2) setShowSuggestions(true);
2448
+ });
2449
+ _el$9.$$input = (e) => {
2450
+ setInputValue(e.currentTarget.value);
2451
+ setShowSuggestions(true);
2452
+ setSelectedIndex(-1);
2453
+ };
2212
2454
  var _ref$ = inputRef;
2213
- typeof _ref$ === "function" ? use(_ref$, _el$8) : inputRef = _el$8;
2214
- setAttribute(_el$8, "spellcheck", false);
2215
- insert(_el$1, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
2216
- insert(_el$6, createComponent(Show, {
2455
+ typeof _ref$ === "function" ? use(_ref$, _el$9) : inputRef = _el$9;
2456
+ setAttribute(_el$9, "spellcheck", false);
2457
+ insert(_el$7, createComponent(Show, {
2458
+ get when() {
2459
+ return memo(() => !!showSuggestions())() && suggestions().length > 0;
2460
+ },
2461
+ get children() {
2462
+ var _el$0 = _tmpl$2$e();
2463
+ insert(_el$0, createComponent(For, {
2464
+ get each() {
2465
+ return suggestions();
2466
+ },
2467
+ children: (item, i) => (() => {
2468
+ var _el$40 = _tmpl$14$3(), _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling, _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
2469
+ _el$40.addEventListener("mouseenter", () => setSelectedIndex(i()));
2470
+ _el$40.$$mousedown = (e) => {
2471
+ e.preventDefault();
2472
+ selectSuggestion(item.url);
2473
+ };
2474
+ insert(_el$41, (() => {
2475
+ var _c$ = memo(() => item.source === "bookmark");
2476
+ return () => _c$() ? "★" : item.source === "search" ? "⌕" : "◌";
2477
+ })());
2478
+ insert(_el$43, () => item.title || item.url);
2479
+ insert(_el$44, () => item.subtitle || item.url);
2480
+ createRenderEffect((_p$) => {
2481
+ var _v$10 = `address-autocomplete-${i()}`, _v$11 = `autocomplete-item ${selectedIndex() === i() ? "selected" : ""}`, _v$12 = selectedIndex() === i();
2482
+ _v$10 !== _p$.e && setAttribute(_el$40, "id", _p$.e = _v$10);
2483
+ _v$11 !== _p$.t && className(_el$40, _p$.t = _v$11);
2484
+ _v$12 !== _p$.a && setAttribute(_el$40, "aria-selected", _p$.a = _v$12);
2485
+ return _p$;
2486
+ }, {
2487
+ e: void 0,
2488
+ t: void 0,
2489
+ a: void 0
2490
+ });
2491
+ return _el$40;
2492
+ })()
2493
+ }));
2494
+ return _el$0;
2495
+ }
2496
+ }), null);
2497
+ insert(_el$7, createComponent(Show, {
2498
+ when: !isPrivateWindow,
2499
+ get children() {
2500
+ var _el$1 = _tmpl$3$b(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
2501
+ insert(_el$11, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
2502
+ createRenderEffect((_p$) => {
2503
+ var _v$ = `agent-status-badge ${agentPresence()}`, _v$2 = agentStatusMessage() || (agentPresence() === "active" ? "Agent is actively using the browser" : agentPresence() === "recent" ? "Agent is connected" : "No agent connection detected");
2504
+ _v$ !== _p$.e && className(_el$1, _p$.e = _v$);
2505
+ _v$2 !== _p$.t && setAttribute(_el$1, "title", _p$.t = _v$2);
2506
+ return _p$;
2507
+ }, {
2508
+ e: void 0,
2509
+ t: void 0
2510
+ });
2511
+ return _el$1;
2512
+ }
2513
+ }), null);
2514
+ insert(_el$7, createComponent(Show, {
2217
2515
  get when() {
2218
2516
  return pageDiff();
2219
2517
  },
2220
2518
  get children() {
2221
- var _el$10 = _tmpl$$g();
2222
- _el$10.$$click = () => void openDiffTimeline();
2223
- return _el$10;
2519
+ var _el$12 = _tmpl$4$b();
2520
+ _el$12.$$click = () => void openDiffTimeline();
2521
+ return _el$12;
2224
2522
  }
2225
2523
  }), null);
2226
2524
  insert(_el$, createComponent(Show, {
@@ -2228,176 +2526,212 @@ const AddressBar = () => {
2228
2526
  return memo(() => !!pageDiff())() && diffExpanded();
2229
2527
  },
2230
2528
  get children() {
2231
- var _el$11 = _tmpl$4$b(), _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild;
2232
- _el$14.firstChild;
2233
- var _el$21 = _el$13.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling;
2234
- insert(_el$14, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
2235
- insert(_el$13, createComponent(Show, {
2529
+ var _el$13 = _tmpl$7$7(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
2530
+ _el$16.firstChild;
2531
+ var _el$23 = _el$15.nextSibling, _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
2532
+ insert(_el$16, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
2533
+ insert(_el$15, createComponent(Show, {
2236
2534
  get when() {
2237
2535
  return memo(() => !!((pageDiff().burstCount || 0) > 1 && pageDiff().firstDetectedAt))() && pageDiff().lastDetectedAt;
2238
2536
  },
2239
2537
  get children() {
2240
- var _el$16 = _tmpl$2$e(), _el$17 = _el$16.firstChild, _el$20 = _el$17.nextSibling;
2241
- _el$20.nextSibling;
2242
- insert(_el$16, () => pageDiff().burstCount, _el$20);
2243
- insert(_el$16, () => formatElapsed(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
2244
- return _el$16;
2538
+ var _el$18 = _tmpl$5$a(), _el$19 = _el$18.firstChild, _el$22 = _el$19.nextSibling;
2539
+ _el$22.nextSibling;
2540
+ insert(_el$18, () => pageDiff().burstCount, _el$22);
2541
+ insert(_el$18, () => formatElapsed(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
2542
+ return _el$18;
2245
2543
  }
2246
2544
  }), null);
2247
- _el$22.$$click = () => void openDiffTimeline();
2248
- _el$23.$$click = () => setDiffExpanded(false);
2249
- insert(_el$11, createComponent(Show, {
2545
+ _el$24.$$click = () => void openDiffTimeline();
2546
+ _el$25.$$click = () => setDiffExpanded(false);
2547
+ insert(_el$13, createComponent(Show, {
2250
2548
  get when() {
2251
2549
  return memo(() => !!pageDiff().recentBursts?.length)() && (pageDiff().recentBursts?.length || 0) > 1;
2252
2550
  },
2253
2551
  get children() {
2254
- var _el$24 = _tmpl$3$b();
2255
- _el$24.firstChild;
2256
- insert(_el$24, createComponent(For, {
2552
+ var _el$26 = _tmpl$6$9();
2553
+ _el$26.firstChild;
2554
+ insert(_el$26, createComponent(For, {
2257
2555
  get each() {
2258
2556
  return pageDiff().recentBursts;
2259
2557
  },
2260
2558
  children: (burst) => (() => {
2261
- var _el$38 = _tmpl$9$4(), _el$39 = _el$38.firstChild, _el$40 = _el$39.nextSibling;
2262
- insert(_el$39, () => formatRelativeTime(burst.detectedAt));
2263
- insert(_el$40, () => burst.summary);
2264
- return _el$38;
2559
+ var _el$45 = _tmpl$15$3(), _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling;
2560
+ insert(_el$46, () => formatRelativeTime(burst.detectedAt));
2561
+ insert(_el$47, () => burst.summary);
2562
+ return _el$45;
2265
2563
  })()
2266
2564
  }), null);
2267
- return _el$24;
2565
+ return _el$26;
2268
2566
  }
2269
2567
  }), null);
2270
- insert(_el$11, createComponent(For, {
2568
+ insert(_el$13, createComponent(For, {
2271
2569
  get each() {
2272
2570
  return pageDiff().changes;
2273
2571
  },
2274
2572
  children: (change) => (() => {
2275
- var _el$41 = _tmpl$13$3(), _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
2276
- insert(_el$43, () => formatSectionLabel(change.section));
2277
- insert(_el$44, () => change.summary);
2278
- insert(_el$41, createComponent(Show, {
2573
+ var _el$48 = _tmpl$21$3(), _el$49 = _el$48.firstChild, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling;
2574
+ insert(_el$50, () => formatSectionLabel(change.section));
2575
+ insert(_el$51, () => change.summary);
2576
+ insert(_el$48, createComponent(Show, {
2279
2577
  get when() {
2280
2578
  return change.before || change.after;
2281
2579
  },
2282
2580
  get children() {
2283
- var _el$45 = _tmpl$10$4();
2284
- insert(_el$45, createComponent(Show, {
2581
+ var _el$52 = _tmpl$18$3();
2582
+ insert(_el$52, createComponent(Show, {
2285
2583
  get when() {
2286
2584
  return change.before;
2287
2585
  },
2288
2586
  get children() {
2289
- var _el$46 = _tmpl$0$4(), _el$47 = _el$46.firstChild, _el$48 = _el$47.nextSibling;
2290
- insert(_el$48, () => change.before);
2291
- return _el$46;
2587
+ var _el$53 = _tmpl$16$3(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
2588
+ insert(_el$55, () => change.before);
2589
+ return _el$53;
2292
2590
  }
2293
2591
  }), null);
2294
- insert(_el$45, createComponent(Show, {
2592
+ insert(_el$52, createComponent(Show, {
2295
2593
  get when() {
2296
2594
  return change.after;
2297
2595
  },
2298
2596
  get children() {
2299
- var _el$49 = _tmpl$1$4(), _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling;
2300
- insert(_el$51, () => change.after);
2301
- return _el$49;
2597
+ var _el$56 = _tmpl$17$3(), _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling;
2598
+ insert(_el$58, () => change.after);
2599
+ return _el$56;
2302
2600
  }
2303
2601
  }), null);
2304
- return _el$45;
2602
+ return _el$52;
2305
2603
  }
2306
2604
  }), null);
2307
- insert(_el$41, createComponent(Show, {
2605
+ insert(_el$48, createComponent(Show, {
2308
2606
  get when() {
2309
2607
  return change.addedItems?.length;
2310
2608
  },
2311
2609
  get children() {
2312
- var _el$52 = _tmpl$11$4(), _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling;
2313
- insert(_el$54, createComponent(For, {
2610
+ var _el$59 = _tmpl$19$3(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling;
2611
+ insert(_el$61, createComponent(For, {
2314
2612
  get each() {
2315
2613
  return change.addedItems;
2316
2614
  },
2317
2615
  children: (item) => (() => {
2318
- var _el$58 = _tmpl$14$3();
2319
- insert(_el$58, item);
2320
- return _el$58;
2616
+ var _el$65 = _tmpl$22$3();
2617
+ insert(_el$65, item);
2618
+ return _el$65;
2321
2619
  })()
2322
2620
  }));
2323
- return _el$52;
2621
+ return _el$59;
2324
2622
  }
2325
2623
  }), null);
2326
- insert(_el$41, createComponent(Show, {
2624
+ insert(_el$48, createComponent(Show, {
2327
2625
  get when() {
2328
2626
  return change.removedItems?.length;
2329
2627
  },
2330
2628
  get children() {
2331
- var _el$55 = _tmpl$12$4(), _el$56 = _el$55.firstChild, _el$57 = _el$56.nextSibling;
2332
- insert(_el$57, createComponent(For, {
2629
+ var _el$62 = _tmpl$20$3(), _el$63 = _el$62.firstChild, _el$64 = _el$63.nextSibling;
2630
+ insert(_el$64, createComponent(For, {
2333
2631
  get each() {
2334
2632
  return change.removedItems;
2335
2633
  },
2336
2634
  children: (item) => (() => {
2337
- var _el$59 = _tmpl$14$3();
2338
- insert(_el$59, item);
2339
- return _el$59;
2635
+ var _el$66 = _tmpl$22$3();
2636
+ insert(_el$66, item);
2637
+ return _el$66;
2340
2638
  })()
2341
2639
  }));
2342
- return _el$55;
2640
+ return _el$62;
2343
2641
  }
2344
2642
  }), null);
2345
- createRenderEffect(() => className(_el$41, `page-diff-item page-diff-${change.kind}`));
2346
- return _el$41;
2643
+ createRenderEffect(() => className(_el$48, `page-diff-item page-diff-${change.kind}`));
2644
+ return _el$48;
2347
2645
  })()
2348
2646
  }), null);
2349
- return _el$11;
2647
+ return _el$13;
2350
2648
  }
2351
- }), _el$26);
2352
- _el$27.$$click = async () => {
2649
+ }), _el$28);
2650
+ _el$29.$$click = async () => {
2353
2651
  const id = activeTabId2();
2354
2652
  if (!id) return;
2355
2653
  await toggleAdBlock(id);
2356
2654
  };
2357
- insert(_el$28, createComponent(Show, {
2655
+ insert(_el$30, createComponent(Show, {
2358
2656
  get when() {
2359
2657
  return activeTab()?.adBlockingEnabled;
2360
2658
  },
2361
2659
  get children() {
2362
- return _tmpl$5$a();
2660
+ return _tmpl$8$5();
2363
2661
  }
2364
2662
  }), null);
2365
- insert(_el$28, createComponent(Show, {
2663
+ insert(_el$30, createComponent(Show, {
2366
2664
  get when() {
2367
2665
  return !activeTab()?.adBlockingEnabled;
2368
2666
  },
2369
2667
  get children() {
2370
- return [_tmpl$5$a(), _tmpl$6$9()];
2668
+ return [_tmpl$8$5(), _tmpl$9$4()];
2371
2669
  }
2372
2670
  }), null);
2373
- _el$32.$$click = () => window.vessel.content.toggleReader();
2374
- addEventListener(_el$33, "click", toggleDevTools, true);
2375
- addEventListener(_el$34, "click", toggleSidebar, true);
2376
- insert(_el$34, createComponent(Show, {
2377
- get when() {
2378
- return pendingApprovalCount() > 0;
2379
- },
2671
+ insert(_el$28, createComponent(Show, {
2672
+ when: !isPrivateWindow,
2673
+ get children() {
2674
+ var _el$34 = _tmpl$0$4();
2675
+ _el$34.$$click = () => window.vessel.content.toggleReader();
2676
+ createRenderEffect(() => _el$34.classList.toggle("active", !!activeTab()?.isReaderMode));
2677
+ return _el$34;
2678
+ }
2679
+ }), null);
2680
+ insert(_el$28, createComponent(Show, {
2681
+ when: !isPrivateWindow,
2380
2682
  get children() {
2381
- var _el$36 = _tmpl$7$7();
2382
- insert(_el$36, pendingApprovalCount);
2383
- createRenderEffect(() => setAttribute(_el$36, "aria-label", `${pendingApprovalCount()} pending`));
2683
+ var _el$35 = _tmpl$1$4();
2684
+ addEventListener(_el$35, "click", toggleDevTools, true);
2685
+ createRenderEffect(() => _el$35.classList.toggle("active", !!devtoolsPanelOpen2()));
2686
+ return _el$35;
2687
+ }
2688
+ }), null);
2689
+ insert(_el$28, createComponent(Show, {
2690
+ when: !isPrivateWindow,
2691
+ get children() {
2692
+ var _el$36 = _tmpl$11$4();
2693
+ _el$36.firstChild;
2694
+ addEventListener(_el$36, "click", toggleSidebar, true);
2695
+ insert(_el$36, createComponent(Show, {
2696
+ get when() {
2697
+ return pendingApprovalCount() > 0;
2698
+ },
2699
+ get children() {
2700
+ var _el$38 = _tmpl$10$4();
2701
+ insert(_el$38, pendingApprovalCount);
2702
+ createRenderEffect(() => setAttribute(_el$38, "aria-label", `${pendingApprovalCount()} pending`));
2703
+ return _el$38;
2704
+ }
2705
+ }), null);
2706
+ createRenderEffect((_p$) => {
2707
+ var _v$3 = !!(pendingApprovalCount() > 0), _v$4 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
2708
+ _v$3 !== _p$.e && _el$36.classList.toggle("has-approvals", _p$.e = _v$3);
2709
+ _v$4 !== _p$.t && setAttribute(_el$36, "title", _p$.t = _v$4);
2710
+ return _p$;
2711
+ }, {
2712
+ e: void 0,
2713
+ t: void 0
2714
+ });
2384
2715
  return _el$36;
2385
2716
  }
2386
2717
  }), null);
2387
- addEventListener(_el$37, "click", openSettings, true);
2718
+ insert(_el$28, createComponent(Show, {
2719
+ when: !isPrivateWindow,
2720
+ get children() {
2721
+ var _el$39 = _tmpl$12$4();
2722
+ addEventListener(_el$39, "click", openSettings, true);
2723
+ return _el$39;
2724
+ }
2725
+ }), null);
2388
2726
  createRenderEffect((_p$) => {
2389
- 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()?.adBlockingEnabled, _v$6 = !activeTab()?.adBlockingEnabled, _v$7 = activeTab()?.adBlockingEnabled ? "Ad Block: On (click to disable)" : "Ad Block: Off (click to enable)", _v$8 = !!activeTab()?.isReaderMode, _v$9 = !!devtoolsPanelOpen2(), _v$0 = !!(pendingApprovalCount() > 0), _v$1 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
2390
- _v$ !== _p$.e && (_el$3.disabled = _p$.e = _v$);
2391
- _v$2 !== _p$.t && (_el$4.disabled = _p$.t = _v$2);
2392
- _v$3 !== _p$.a && className(_el$9, _p$.a = _v$3);
2393
- _v$4 !== _p$.o && setAttribute(_el$9, "title", _p$.o = _v$4);
2394
- _v$5 !== _p$.i && _el$27.classList.toggle("active", _p$.i = _v$5);
2395
- _v$6 !== _p$.n && _el$27.classList.toggle("nav-btn-muted", _p$.n = _v$6);
2396
- _v$7 !== _p$.s && setAttribute(_el$27, "title", _p$.s = _v$7);
2397
- _v$8 !== _p$.h && _el$32.classList.toggle("active", _p$.h = _v$8);
2398
- _v$9 !== _p$.r && _el$33.classList.toggle("active", _p$.r = _v$9);
2399
- _v$0 !== _p$.d && _el$34.classList.toggle("has-approvals", _p$.d = _v$0);
2400
- _v$1 !== _p$.l && setAttribute(_el$34, "title", _p$.l = _v$1);
2727
+ var _v$5 = !activeTab()?.canGoBack, _v$6 = !activeTab()?.canGoForward, _v$7 = showSuggestions() && suggestions().length > 0, _v$8 = selectedIndex() >= 0 ? `address-autocomplete-${selectedIndex()}` : void 0, _v$9 = !!activeTab()?.adBlockingEnabled, _v$0 = !activeTab()?.adBlockingEnabled, _v$1 = activeTab()?.adBlockingEnabled ? "Ad Block: On (click to disable)" : "Ad Block: Off (click to enable)";
2728
+ _v$5 !== _p$.e && (_el$3.disabled = _p$.e = _v$5);
2729
+ _v$6 !== _p$.t && (_el$4.disabled = _p$.t = _v$6);
2730
+ _v$7 !== _p$.a && setAttribute(_el$9, "aria-expanded", _p$.a = _v$7);
2731
+ _v$8 !== _p$.o && setAttribute(_el$9, "aria-activedescendant", _p$.o = _v$8);
2732
+ _v$9 !== _p$.i && _el$29.classList.toggle("active", _p$.i = _v$9);
2733
+ _v$0 !== _p$.n && _el$29.classList.toggle("nav-btn-muted", _p$.n = _v$0);
2734
+ _v$1 !== _p$.s && setAttribute(_el$29, "title", _p$.s = _v$1);
2401
2735
  return _p$;
2402
2736
  }, {
2403
2737
  e: void 0,
@@ -2406,17 +2740,13 @@ const AddressBar = () => {
2406
2740
  o: void 0,
2407
2741
  i: void 0,
2408
2742
  n: void 0,
2409
- s: void 0,
2410
- h: void 0,
2411
- r: void 0,
2412
- d: void 0,
2413
- l: void 0
2743
+ s: void 0
2414
2744
  });
2415
- createRenderEffect(() => _el$8.value = inputValue());
2745
+ createRenderEffect(() => _el$9.value = inputValue());
2416
2746
  return _el$;
2417
2747
  })();
2418
2748
  };
2419
- delegateEvents(["click", "input"]);
2749
+ delegateEvents(["click", "input", "keydown", "mousedown"]);
2420
2750
  var _tmpl$$f = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$d = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
2421
2751
  const TOAST_DURATION_MS$1 = 4200;
2422
2752
  const TOAST_EXIT_MS$2 = 300;
@@ -3154,7 +3484,7 @@ const [pendingQueries, setPendingQueries] = createSignal([]);
3154
3484
  const [pendingQueryActivities, setPendingQueryActivities] = createSignal([]);
3155
3485
  const [queueNotice, setQueueNotice] = createSignal(null);
3156
3486
  const [automationActivities, setAutomationActivities] = createSignal([]);
3157
- let initialized$2 = false;
3487
+ let initialized = false;
3158
3488
  let pendingDrainScheduled = false;
3159
3489
  let listenerCleanups = [];
3160
3490
  let pendingAutomationActivity = null;
@@ -3212,9 +3542,9 @@ function schedulePendingDrain() {
3212
3542
  }
3213
3543
  });
3214
3544
  }
3215
- function init$2() {
3216
- if (initialized$2) return;
3217
- initialized$2 = true;
3545
+ function init() {
3546
+ if (initialized) return;
3547
+ initialized = true;
3218
3548
  listenerCleanups.push(window.vessel.ai.onStreamStart((prompt) => {
3219
3549
  setMessages((prev) => {
3220
3550
  const next = [...prev, { role: "user", content: prompt }];
@@ -3297,7 +3627,7 @@ function init$2() {
3297
3627
  }));
3298
3628
  }
3299
3629
  function useAI() {
3300
- init$2();
3630
+ init();
3301
3631
  const query = async (prompt, activity = null) => {
3302
3632
  recordRecentQuery(prompt);
3303
3633
  if (isStreaming()) {
@@ -3513,82 +3843,6 @@ const CommandBar = () => {
3513
3843
  });
3514
3844
  };
3515
3845
  delegateEvents(["click", "input", "keydown"]);
3516
- const logger$3 = createLogger("HistoryStore");
3517
- const INITIAL$1 = { entries: [] };
3518
- const [historyState, setHistoryState] = createSignal(INITIAL$1);
3519
- let initialized$1 = false;
3520
- let initPromise$1 = null;
3521
- async function init$1() {
3522
- if (initPromise$1) return initPromise$1;
3523
- if (initialized$1) return;
3524
- initialized$1 = true;
3525
- initPromise$1 = (async () => {
3526
- try {
3527
- const state = await window.vessel.history.get();
3528
- setHistoryState(state);
3529
- window.vessel.history.onUpdate((s) => setHistoryState(s));
3530
- } catch (error) {
3531
- initialized$1 = false;
3532
- logger$3.error("Failed to initialize history store:", error);
3533
- } finally {
3534
- initPromise$1 = null;
3535
- }
3536
- })();
3537
- return initPromise$1;
3538
- }
3539
- function useHistory() {
3540
- void init$1();
3541
- return {
3542
- historyState,
3543
- search: (query) => window.vessel.history.search(query),
3544
- clear: () => window.vessel.history.clear()
3545
- };
3546
- }
3547
- const logger$2 = createLogger("BookmarksStore");
3548
- const INITIAL = { folders: [], bookmarks: [] };
3549
- const [bookmarksState, setBookmarksState] = createSignal(INITIAL);
3550
- let initialized = false;
3551
- let initPromise = null;
3552
- async function init() {
3553
- if (initPromise) return initPromise;
3554
- if (initialized) return;
3555
- initialized = true;
3556
- initPromise = (async () => {
3557
- try {
3558
- const state = await window.vessel.bookmarks.get();
3559
- setBookmarksState(state);
3560
- window.vessel.bookmarks.onUpdate((s) => setBookmarksState(s));
3561
- } catch (error) {
3562
- initialized = false;
3563
- logger$2.error("Failed to initialize bookmarks store:", error);
3564
- } finally {
3565
- initPromise = null;
3566
- }
3567
- })();
3568
- return initPromise;
3569
- }
3570
- function useBookmarks() {
3571
- void init();
3572
- return {
3573
- bookmarksState,
3574
- saveBookmark: (url, title, folderId, note, intent, expectedContent, keyFields, agentHints) => window.vessel.bookmarks.saveBookmark(
3575
- url,
3576
- title,
3577
- folderId,
3578
- note,
3579
- intent,
3580
- expectedContent,
3581
- keyFields,
3582
- agentHints
3583
- ),
3584
- updateBookmark: (id, updates) => window.vessel.bookmarks.updateBookmark(id, updates),
3585
- removeBookmark: (id) => window.vessel.bookmarks.removeBookmark(id),
3586
- createFolder: (name) => window.vessel.bookmarks.createFolder(name),
3587
- createFolderWithSummary: (name, summary) => window.vessel.bookmarks.createFolderWithSummary(name, summary),
3588
- removeFolder: (id, deleteContents) => window.vessel.bookmarks.removeFolder(id, deleteContents),
3589
- renameFolder: (id, newName, summary) => window.vessel.bookmarks.renameFolder(id, newName, summary)
3590
- };
3591
- }
3592
3846
  const MEMORY_STORAGE_KEY = "vessel.bookmark-context.memories";
3593
3847
  const MAX_MEMORY_LINES = 4;
3594
3848
  const MAX_MEMORY_CHARS = 420;
@@ -8361,14 +8615,6 @@ const DevToolsPanel = () => {
8361
8615
  })();
8362
8616
  };
8363
8617
  delegateEvents(["click", "input"]);
8364
- const SEARCH_ENGINE_PRESETS = {
8365
- duckduckgo: { label: "DuckDuckGo", url: "https://duckduckgo.com/?q=" },
8366
- google: { label: "Google", url: "https://www.google.com/search?q=" },
8367
- bing: { label: "Bing", url: "https://www.bing.com/search?q=" },
8368
- brave: { label: "Brave Search", url: "https://search.brave.com/search?q=" },
8369
- ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
8370
- kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
8371
- };
8372
8618
  const PROVIDERS = {
8373
8619
  anthropic: {
8374
8620
  id: "anthropic",
@@ -10438,28 +10684,52 @@ var _tmpl$$1 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div cla
10438
10684
  `), _tmpl$3 = /* @__PURE__ */ template(`<div class=keyboard-help-keys>`), _tmpl$4 = /* @__PURE__ */ template(`<div class=keyboard-help-action>`), _tmpl$5 = /* @__PURE__ */ template(`<kbd>`), _tmpl$6 = /* @__PURE__ */ template(`<span class=keyboard-help-plus>+`);
10439
10685
  const SHORTCUTS = [{
10440
10686
  keys: "Ctrl+L",
10441
- action: "AI Command Bar"
10687
+ action: "AI Command Bar",
10688
+ privateMode: false
10442
10689
  }, {
10443
10690
  keys: "Ctrl+Shift+L",
10444
- action: "Toggle AI Sidebar"
10691
+ action: "Toggle AI Sidebar",
10692
+ privateMode: false
10445
10693
  }, {
10446
10694
  keys: "Ctrl+Shift+F",
10447
- action: "Toggle Focus Mode"
10695
+ action: "Toggle Focus Mode",
10696
+ privateMode: false
10448
10697
  }, {
10449
10698
  keys: "F12",
10450
- action: "Toggle Dev Tools Panel"
10699
+ action: "Toggle Dev Tools Panel",
10700
+ privateMode: false
10451
10701
  }, {
10452
10702
  keys: "Ctrl+T",
10453
10703
  action: "New Tab"
10454
10704
  }, {
10455
10705
  keys: "Ctrl+W",
10456
10706
  action: "Close Tab"
10707
+ }, {
10708
+ keys: "Ctrl+Shift+T",
10709
+ action: "Reopen Closed Tab"
10710
+ }, {
10711
+ keys: "Ctrl+F",
10712
+ action: "Find in Page"
10713
+ }, {
10714
+ keys: "Ctrl++ / Ctrl+=",
10715
+ action: "Zoom In"
10716
+ }, {
10717
+ keys: "Ctrl+-",
10718
+ action: "Zoom Out"
10719
+ }, {
10720
+ keys: "Ctrl+0",
10721
+ action: "Reset Zoom"
10722
+ }, {
10723
+ keys: "Ctrl+Shift+N",
10724
+ action: "New Private Window"
10457
10725
  }, {
10458
10726
  keys: "Ctrl+,",
10459
- action: "Settings"
10727
+ action: "Settings",
10728
+ privateMode: false
10460
10729
  }, {
10461
10730
  keys: "Ctrl+H",
10462
- action: "Capture Highlight"
10731
+ action: "Capture Highlight",
10732
+ privateMode: false
10463
10733
  }, {
10464
10734
  keys: "?",
10465
10735
  action: "This help overlay"
@@ -10469,6 +10739,7 @@ const KeyboardHelp = (props) => {
10469
10739
  visible,
10470
10740
  closing
10471
10741
  } = useAnimatedPresence(() => props.open, 200);
10742
+ const shortcuts = () => props.privateMode ? SHORTCUTS.filter((shortcut) => shortcut.privateMode !== false) : SHORTCUTS;
10472
10743
  return createComponent(Show, {
10473
10744
  get when() {
10474
10745
  return visible();
@@ -10479,7 +10750,7 @@ const KeyboardHelp = (props) => {
10479
10750
  addEventListener(_el$, "click", props.onClose, true);
10480
10751
  _el$2.$$click = (e) => e.stopPropagation();
10481
10752
  addEventListener(_el$5, "click", props.onClose, true);
10482
- insert(_el$6, () => SHORTCUTS.map((s) => [(() => {
10753
+ insert(_el$6, () => shortcuts().map((s) => [(() => {
10483
10754
  var _el$8 = _tmpl$3();
10484
10755
  insert(_el$8, () => s.keys.split("+").map((k, i) => [i > 0 && _tmpl$6(), (() => {
10485
10756
  var _el$0 = _tmpl$5();
@@ -10502,27 +10773,38 @@ delegateEvents(["click"]);
10502
10773
  function setupKeybindings(handlers) {
10503
10774
  const listener = (e) => {
10504
10775
  const ctrl = e.ctrlKey || e.metaKey;
10505
- if (ctrl && e.key === "l" && !e.shiftKey) {
10776
+ const key = e.key.toLowerCase();
10777
+ if (ctrl && key === "l" && !e.shiftKey) {
10506
10778
  e.preventDefault();
10507
10779
  handlers.openCommandBar();
10508
10780
  return;
10509
10781
  }
10510
- if (ctrl && e.key === "L" && e.shiftKey) {
10782
+ if (ctrl && key === "l" && e.shiftKey) {
10511
10783
  e.preventDefault();
10512
10784
  handlers.toggleSidebar();
10513
10785
  return;
10514
10786
  }
10515
- if (ctrl && e.key === "F" && e.shiftKey) {
10787
+ if (ctrl && key === "f" && e.shiftKey) {
10516
10788
  e.preventDefault();
10517
10789
  handlers.toggleFocusMode();
10518
10790
  return;
10519
10791
  }
10520
- if (ctrl && e.key === "t") {
10792
+ if (ctrl && key === "t" && e.shiftKey) {
10793
+ e.preventDefault();
10794
+ handlers.reopenClosedTab?.();
10795
+ return;
10796
+ }
10797
+ if (ctrl && key === "n" && e.shiftKey) {
10798
+ e.preventDefault();
10799
+ handlers.openPrivateWindow?.();
10800
+ return;
10801
+ }
10802
+ if (ctrl && key === "t" && !e.shiftKey) {
10521
10803
  e.preventDefault();
10522
10804
  handlers.newTab();
10523
10805
  return;
10524
10806
  }
10525
- if (ctrl && e.key === "w") {
10807
+ if (ctrl && key === "w") {
10526
10808
  e.preventDefault();
10527
10809
  handlers.closeTab();
10528
10810
  return;
@@ -10532,7 +10814,7 @@ function setupKeybindings(handlers) {
10532
10814
  handlers.openSettings();
10533
10815
  return;
10534
10816
  }
10535
- if (ctrl && e.key === "h" && !e.shiftKey) {
10817
+ if (ctrl && key === "h" && !e.shiftKey) {
10536
10818
  e.preventDefault();
10537
10819
  handlers.captureHighlight();
10538
10820
  return;
@@ -10542,6 +10824,21 @@ function setupKeybindings(handlers) {
10542
10824
  handlers.toggleDevTools?.();
10543
10825
  return;
10544
10826
  }
10827
+ if (ctrl && (e.key === "+" || e.key === "=")) {
10828
+ e.preventDefault();
10829
+ handlers.zoomIn?.();
10830
+ return;
10831
+ }
10832
+ if (ctrl && e.key === "-") {
10833
+ e.preventDefault();
10834
+ handlers.zoomOut?.();
10835
+ return;
10836
+ }
10837
+ if (ctrl && e.key === "0") {
10838
+ e.preventDefault();
10839
+ handlers.zoomReset?.();
10840
+ return;
10841
+ }
10545
10842
  if (e.key === "?" && !ctrl && !e.altKey) {
10546
10843
  const tag = e.target?.tagName;
10547
10844
  if (tag !== "INPUT" && tag !== "TEXTAREA" && !e.target?.isContentEditable) {
@@ -10564,6 +10861,7 @@ try {
10564
10861
  }
10565
10862
  const App = () => {
10566
10863
  const view = new URLSearchParams(window.location.search).get("view") || "chrome";
10864
+ const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
10567
10865
  const {
10568
10866
  openCommandBar,
10569
10867
  toggleSidebar,
@@ -10575,7 +10873,11 @@ const App = () => {
10575
10873
  createTab,
10576
10874
  closeTab,
10577
10875
  activeTabId: activeTabId2,
10578
- activeTab
10876
+ activeTab,
10877
+ zoomIn,
10878
+ zoomOut,
10879
+ zoomReset,
10880
+ reopenClosed
10579
10881
  } = useTabs();
10580
10882
  const [highlightToast, setHighlightToast] = createSignal(null);
10581
10883
  const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
@@ -10627,17 +10929,31 @@ const App = () => {
10627
10929
  });
10628
10930
  if (view !== "chrome") return;
10629
10931
  const cleanupKeys = setupKeybindings({
10630
- openCommandBar,
10631
- toggleSidebar,
10632
- toggleFocusMode,
10932
+ openCommandBar: isPrivateWindow ? void 0 : openCommandBar,
10933
+ toggleSidebar: isPrivateWindow ? void 0 : toggleSidebar,
10934
+ toggleFocusMode: isPrivateWindow ? void 0 : toggleFocusMode,
10633
10935
  newTab: () => createTab(),
10634
10936
  closeTab: () => {
10635
10937
  const id = activeTabId2();
10636
10938
  if (id) closeTab(id);
10637
10939
  },
10638
- openSettings,
10639
- captureHighlight,
10640
- toggleDevTools: () => {
10940
+ openSettings: isPrivateWindow ? void 0 : openSettings,
10941
+ captureHighlight: isPrivateWindow ? void 0 : captureHighlight,
10942
+ zoomIn: () => {
10943
+ const id = activeTabId2();
10944
+ if (id) zoomIn(id);
10945
+ },
10946
+ zoomOut: () => {
10947
+ const id = activeTabId2();
10948
+ if (id) zoomOut(id);
10949
+ },
10950
+ zoomReset: () => {
10951
+ const id = activeTabId2();
10952
+ if (id) zoomReset(id);
10953
+ },
10954
+ reopenClosedTab: () => reopenClosed(),
10955
+ openPrivateWindow: () => window.vessel.tabs.openPrivateWindow(),
10956
+ toggleDevTools: isPrivateWindow ? void 0 : () => {
10641
10957
  window.vessel.devtoolsPanel.toggle();
10642
10958
  },
10643
10959
  toggleKeyboardHelp: () => setKeyboardHelpOpen((v) => !v)
@@ -10658,17 +10974,25 @@ const App = () => {
10658
10974
  }
10659
10975
  return (() => {
10660
10976
  var _el$ = _tmpl$2(), _el$2 = _el$.firstChild;
10661
- insert(_el$, createComponent(BookmarkNotifications, {}), _el$2);
10662
- insert(_el$, createComponent(HighlightNotifications, {
10663
- get toast() {
10664
- return highlightToast();
10665
- },
10666
- onDismiss: () => setHighlightToast(null)
10977
+ insert(_el$, createComponent(Show, {
10978
+ when: !isPrivateWindow,
10979
+ get children() {
10980
+ return [createComponent(BookmarkNotifications, {}), createComponent(HighlightNotifications, {
10981
+ get toast() {
10982
+ return highlightToast();
10983
+ },
10984
+ onDismiss: () => setHighlightToast(null)
10985
+ })];
10986
+ }
10667
10987
  }), _el$2);
10668
10988
  insert(_el$, createComponent(DownloadToast, {}), _el$2);
10669
10989
  insert(_el$, createComponent(FindBar, {}), _el$2);
10670
- insert(_el$, createComponent(FlowProgress, {}), _el$2);
10671
- insert(_el$, createComponent(AgentTranscriptDock, {}), _el$2);
10990
+ insert(_el$, createComponent(Show, {
10991
+ when: !isPrivateWindow,
10992
+ get children() {
10993
+ return [createComponent(FlowProgress, {}), createComponent(AgentTranscriptDock, {})];
10994
+ }
10995
+ }), _el$2);
10672
10996
  insert(_el$2, createComponent(TitleBar, {}), null);
10673
10997
  insert(_el$2, createComponent(TabBar, {}), null);
10674
10998
  insert(_el$2, createComponent(AddressBar, {}), null);
@@ -10682,13 +11006,18 @@ const App = () => {
10682
11006
  return _el$3;
10683
11007
  }
10684
11008
  }), null);
10685
- insert(_el$, createComponent(CommandBar, {}), null);
10686
- insert(_el$, createComponent(Settings, {}), null);
11009
+ insert(_el$, createComponent(Show, {
11010
+ when: !isPrivateWindow,
11011
+ get children() {
11012
+ return [createComponent(CommandBar, {}), createComponent(Settings, {})];
11013
+ }
11014
+ }), null);
10687
11015
  insert(_el$, createComponent(KeyboardHelp, {
10688
11016
  get open() {
10689
11017
  return keyboardHelpOpen();
10690
11018
  },
10691
- onClose: () => setKeyboardHelpOpen(false)
11019
+ onClose: () => setKeyboardHelpOpen(false),
11020
+ privateMode: isPrivateWindow
10692
11021
  }), null);
10693
11022
  createRenderEffect(() => _el$.classList.toggle("focus-mode", !!focusMode2()));
10694
11023
  return _el$;