@quanta-intellect/vessel-browser 0.1.69 → 0.1.73

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 (() => {
@@ -1486,6 +1488,301 @@ const TitleBar = () => {
1486
1488
  })();
1487
1489
  };
1488
1490
  delegateEvents(["click"]);
1491
+ var defaultAttributes = {
1492
+ xmlns: "http://www.w3.org/2000/svg",
1493
+ width: 24,
1494
+ height: 24,
1495
+ viewBox: "0 0 24 24",
1496
+ fill: "none",
1497
+ stroke: "currentColor",
1498
+ "stroke-width": 2,
1499
+ "stroke-linecap": "round",
1500
+ "stroke-linejoin": "round"
1501
+ };
1502
+ var defaultAttributes_default = defaultAttributes;
1503
+ var LucideContext = createContext({
1504
+ size: 24,
1505
+ color: "currentColor",
1506
+ strokeWidth: 2,
1507
+ absoluteStrokeWidth: false,
1508
+ class: ""
1509
+ });
1510
+ var _tmpl$$h = /* @__PURE__ */ template(`<svg>`);
1511
+ var hasA11yProp = (props) => {
1512
+ for (const prop in props) {
1513
+ if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
1514
+ return true;
1515
+ }
1516
+ }
1517
+ return false;
1518
+ };
1519
+ var mergeClasses = (...classes) => classes.filter((className2, index, array) => {
1520
+ return Boolean(className2) && className2.trim() !== "" && array.indexOf(className2) === index;
1521
+ }).join(" ").trim();
1522
+ var toCamelCase = (string) => string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase());
1523
+ var toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
1524
+ var toPascalCase = (string) => {
1525
+ const camelCase = toCamelCase(string);
1526
+ return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
1527
+ };
1528
+ var Icon = (props) => {
1529
+ const [localProps, rest] = splitProps(props, ["color", "size", "strokeWidth", "children", "class", "name", "iconNode", "absoluteStrokeWidth"]);
1530
+ const globalProps = useContext(LucideContext);
1531
+ return (() => {
1532
+ var _el$ = _tmpl$$h();
1533
+ spread(_el$, mergeProps(defaultAttributes_default, {
1534
+ get width() {
1535
+ return localProps.size ?? globalProps.size ?? defaultAttributes_default.width;
1536
+ },
1537
+ get height() {
1538
+ return localProps.size ?? globalProps.size ?? defaultAttributes_default.height;
1539
+ },
1540
+ get stroke() {
1541
+ return localProps.color ?? globalProps.color ?? defaultAttributes_default.stroke;
1542
+ },
1543
+ get ["stroke-width"]() {
1544
+ return memo(() => (localProps.absoluteStrokeWidth ?? globalProps.absoluteStrokeWidth) === true)() ? Number(localProps.strokeWidth ?? globalProps.strokeWidth ?? defaultAttributes_default["stroke-width"]) * 24 / Number(localProps.size ?? globalProps.size) : Number(localProps.strokeWidth ?? globalProps.strokeWidth ?? defaultAttributes_default["stroke-width"]);
1545
+ },
1546
+ get ["class"]() {
1547
+ return mergeClasses("lucide", "lucide-icon", globalProps.class, ...localProps.name != null ? [`lucide-${toKebabCase(toPascalCase(localProps.name))}`, `lucide-${toKebabCase(localProps.name)}`] : [], localProps.class);
1548
+ },
1549
+ get ["aria-hidden"]() {
1550
+ return !localProps.children && !hasA11yProp(rest) ? "true" : void 0;
1551
+ }
1552
+ }, rest), true, true);
1553
+ insert(_el$, createComponent(For, {
1554
+ get each() {
1555
+ return localProps.iconNode;
1556
+ },
1557
+ children: ([elementName, attrs]) => {
1558
+ return createComponent(Dynamic, mergeProps({
1559
+ component: elementName
1560
+ }, attrs));
1561
+ }
1562
+ }));
1563
+ return _el$;
1564
+ })();
1565
+ };
1566
+ var Icon_default = Icon;
1567
+ var iconNode$d = [["path", {
1568
+ d: "M12 7v14",
1569
+ key: "1akyts"
1570
+ }], ["path", {
1571
+ d: "M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",
1572
+ key: "ruj8y"
1573
+ }]];
1574
+ var BookOpen = (props) => createComponent(Icon_default, mergeProps(props, {
1575
+ iconNode: iconNode$d,
1576
+ name: "book-open"
1577
+ }));
1578
+ var book_open_default = BookOpen;
1579
+ var iconNode$c = [["rect", {
1580
+ width: "8",
1581
+ height: "4",
1582
+ x: "8",
1583
+ y: "2",
1584
+ rx: "1",
1585
+ ry: "1",
1586
+ key: "tgr4d6"
1587
+ }], ["path", {
1588
+ d: "M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",
1589
+ key: "116196"
1590
+ }], ["path", {
1591
+ d: "M12 11h4",
1592
+ key: "1jrz19"
1593
+ }], ["path", {
1594
+ d: "M12 16h4",
1595
+ key: "n85exb"
1596
+ }], ["path", {
1597
+ d: "M8 11h.01",
1598
+ key: "1dfujw"
1599
+ }], ["path", {
1600
+ d: "M8 16h.01",
1601
+ key: "18s6g9"
1602
+ }]];
1603
+ var ClipboardList = (props) => createComponent(Icon_default, mergeProps(props, {
1604
+ iconNode: iconNode$c,
1605
+ name: "clipboard-list"
1606
+ }));
1607
+ var clipboard_list_default = ClipboardList;
1608
+ var iconNode$b = [["circle", {
1609
+ cx: "12",
1610
+ cy: "12",
1611
+ r: "10",
1612
+ key: "1mglay"
1613
+ }], ["path", {
1614
+ d: "M12 6v6l4 2",
1615
+ key: "mmk7yg"
1616
+ }]];
1617
+ var Clock = (props) => createComponent(Icon_default, mergeProps(props, {
1618
+ iconNode: iconNode$b,
1619
+ name: "clock"
1620
+ }));
1621
+ var clock_default = Clock;
1622
+ var iconNode$a = [["path", {
1623
+ d: "M12 15V3",
1624
+ key: "m9g1x1"
1625
+ }], ["path", {
1626
+ d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",
1627
+ key: "ih7n3h"
1628
+ }], ["path", {
1629
+ d: "m7 10 5 5 5-5",
1630
+ key: "brsn70"
1631
+ }]];
1632
+ var Download = (props) => createComponent(Icon_default, mergeProps(props, {
1633
+ iconNode: iconNode$a,
1634
+ name: "download"
1635
+ }));
1636
+ var download_default = Download;
1637
+ var iconNode$9 = [["circle", {
1638
+ cx: "12",
1639
+ cy: "12",
1640
+ r: "10",
1641
+ key: "1mglay"
1642
+ }], ["path", {
1643
+ d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",
1644
+ key: "13o1zl"
1645
+ }], ["path", {
1646
+ d: "M2 12h20",
1647
+ key: "9i4pu4"
1648
+ }]];
1649
+ var Globe = (props) => createComponent(Icon_default, mergeProps(props, {
1650
+ iconNode: iconNode$9,
1651
+ name: "globe"
1652
+ }));
1653
+ var globe_default = Globe;
1654
+ var iconNode$8 = [["path", {
1655
+ d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 .83.18 2 2 0 0 0 .83-.18l8.58-3.9a1 1 0 0 0 0-1.831z",
1656
+ key: "zzgyd3"
1657
+ }], ["path", {
1658
+ d: "M16 17h6",
1659
+ key: "1ook5g"
1660
+ }], ["path", {
1661
+ d: "M19 14v6",
1662
+ key: "1ckrd5"
1663
+ }], ["path", {
1664
+ d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 .825.178",
1665
+ key: "1ia9y3"
1666
+ }], ["path", {
1667
+ d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l2.116-.962",
1668
+ key: "jksky3"
1669
+ }]];
1670
+ var LayersPlus = (props) => createComponent(Icon_default, mergeProps(props, {
1671
+ iconNode: iconNode$8,
1672
+ name: "layers-plus"
1673
+ }));
1674
+ var layers_plus_default = LayersPlus;
1675
+ var iconNode$7 = [["rect", {
1676
+ width: "18",
1677
+ height: "18",
1678
+ x: "3",
1679
+ y: "3",
1680
+ rx: "2",
1681
+ key: "afitv7"
1682
+ }], ["path", {
1683
+ d: "M3 9h18",
1684
+ key: "1pudct"
1685
+ }]];
1686
+ var PanelTop = (props) => createComponent(Icon_default, mergeProps(props, {
1687
+ iconNode: iconNode$7,
1688
+ name: "panel-top"
1689
+ }));
1690
+ var panel_top_default = PanelTop;
1691
+ var iconNode$6 = [["path", {
1692
+ d: "M5 12h14",
1693
+ key: "1ays0h"
1694
+ }], ["path", {
1695
+ d: "M12 5v14",
1696
+ key: "s699le"
1697
+ }]];
1698
+ var Plus = (props) => createComponent(Icon_default, mergeProps(props, {
1699
+ iconNode: iconNode$6,
1700
+ name: "plus"
1701
+ }));
1702
+ var plus_default = Plus;
1703
+ var iconNode$5 = [["path", {
1704
+ d: "m21 21-4.34-4.34",
1705
+ key: "14j7rj"
1706
+ }], ["circle", {
1707
+ cx: "11",
1708
+ cy: "11",
1709
+ r: "8",
1710
+ key: "4ej97u"
1711
+ }]];
1712
+ var Search = (props) => createComponent(Icon_default, mergeProps(props, {
1713
+ iconNode: iconNode$5,
1714
+ name: "search"
1715
+ }));
1716
+ var search_default = Search;
1717
+ var iconNode$4 = [["path", {
1718
+ d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
1719
+ key: "r04s7s"
1720
+ }]];
1721
+ var Star = (props) => createComponent(Icon_default, mergeProps(props, {
1722
+ iconNode: iconNode$4,
1723
+ name: "star"
1724
+ }));
1725
+ var star_default = Star;
1726
+ var iconNode$3 = [["path", {
1727
+ d: "M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",
1728
+ key: "vktsd0"
1729
+ }], ["circle", {
1730
+ cx: "7.5",
1731
+ cy: "7.5",
1732
+ r: ".5",
1733
+ fill: "currentColor",
1734
+ key: "kqv944"
1735
+ }]];
1736
+ var Tag = (props) => createComponent(Icon_default, mergeProps(props, {
1737
+ iconNode: iconNode$3,
1738
+ name: "tag"
1739
+ }));
1740
+ var tag_default = Tag;
1741
+ var iconNode$2 = [["path", {
1742
+ d: "M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",
1743
+ key: "uqj9uw"
1744
+ }], ["path", {
1745
+ d: "M16 9a5 5 0 0 1 0 6",
1746
+ key: "1q6k2b"
1747
+ }], ["path", {
1748
+ d: "M19.364 18.364a9 9 0 0 0 0-12.728",
1749
+ key: "ijwkga"
1750
+ }]];
1751
+ var Volume2 = (props) => createComponent(Icon_default, mergeProps(props, {
1752
+ iconNode: iconNode$2,
1753
+ name: "volume-2"
1754
+ }));
1755
+ var volume_2_default = Volume2;
1756
+ var iconNode$1 = [["path", {
1757
+ d: "M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",
1758
+ key: "uqj9uw"
1759
+ }], ["line", {
1760
+ x1: "22",
1761
+ x2: "16",
1762
+ y1: "9",
1763
+ y2: "15",
1764
+ key: "1ewh16"
1765
+ }], ["line", {
1766
+ x1: "16",
1767
+ x2: "22",
1768
+ y1: "9",
1769
+ y2: "15",
1770
+ key: "5ykzw1"
1771
+ }]];
1772
+ var VolumeX = (props) => createComponent(Icon_default, mergeProps(props, {
1773
+ iconNode: iconNode$1,
1774
+ name: "volume-x"
1775
+ }));
1776
+ var volume_x_default = VolumeX;
1777
+ var iconNode = [["path", {
1778
+ d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",
1779
+ key: "1xq2db"
1780
+ }]];
1781
+ var Zap = (props) => createComponent(Icon_default, mergeProps(props, {
1782
+ iconNode,
1783
+ name: "zap"
1784
+ }));
1785
+ var zap_default = Zap;
1489
1786
  function getEnvFlag(name) {
1490
1787
  const globalProcess = typeof globalThis === "object" && "process" in globalThis ? globalThis.process : void 0;
1491
1788
  return globalProcess?.env?.[name];
@@ -1594,7 +1891,22 @@ function useTabs() {
1594
1891
  patchTab(id, { adBlockingEnabled: newState });
1595
1892
  }
1596
1893
  return newState;
1597
- }
1894
+ },
1895
+ zoomIn: (id) => window.vessel.tabs.zoomIn(id),
1896
+ zoomOut: (id) => window.vessel.tabs.zoomOut(id),
1897
+ zoomReset: (id) => window.vessel.tabs.zoomReset(id),
1898
+ reopenClosed: () => window.vessel.tabs.reopenClosed(),
1899
+ duplicate: (id) => window.vessel.tabs.duplicate(id),
1900
+ pin: (id) => window.vessel.tabs.pin(id),
1901
+ unpin: (id) => window.vessel.tabs.unpin(id),
1902
+ createGroup: (id) => window.vessel.tabs.createGroup(id),
1903
+ addToGroup: (id, groupId) => window.vessel.tabs.addToGroup(id, groupId),
1904
+ removeFromGroup: (id) => window.vessel.tabs.removeFromGroup(id),
1905
+ toggleGroupCollapsed: (groupId) => window.vessel.tabs.toggleGroupCollapsed(groupId),
1906
+ setGroupColor: (groupId, color) => window.vessel.tabs.setGroupColor(groupId, color),
1907
+ toggleMute: (id) => window.vessel.tabs.toggleMute(id),
1908
+ print: (id) => window.vessel.tabs.print(id),
1909
+ printToPdf: (id) => window.vessel.tabs.printToPdf(id)
1598
1910
  };
1599
1911
  }
1600
1912
  const [now, setNow] = createSignal(Date.now());
@@ -1773,7 +2085,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
1773
2085
  }
1774
2086
  return "idle";
1775
2087
  }
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>`);
2088
+ var _tmpl$$g = /* @__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 window"data-tooltip-pos=left></button><button class=tab-new data-tooltip="Add active tab to group"data-tooltip-pos=left></button><button class=tab-new data-tooltip="New tab"data-tooltip-pos=left></button><button class="tab-new tab-new-private"data-tooltip="Private window"data-tooltip-pos=left><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11z">`), _tmpl$4$c = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$b = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$a = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$9 = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$6 = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$5 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$5 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$5 = /* @__PURE__ */ template(`<span class=tab-loading>`);
1777
2089
  const TAB_CLOSE_MS = 200;
1778
2090
  function stringToHue(str) {
1779
2091
  let hash = 0;
@@ -1807,7 +2119,7 @@ const TabFavicon = (props) => {
1807
2119
  })();
1808
2120
  },
1809
2121
  get children() {
1810
- var _el$ = _tmpl$$h();
2122
+ var _el$ = _tmpl$$g();
1811
2123
  _el$.addEventListener("error", () => setFailed(true));
1812
2124
  createRenderEffect(() => setAttribute(_el$, "src", props.favicon));
1813
2125
  return _el$;
@@ -1820,7 +2132,10 @@ const TabBar = () => {
1820
2132
  activeTabId: activeTabId2,
1821
2133
  switchTab,
1822
2134
  closeTab,
1823
- createTab
2135
+ createTab,
2136
+ createGroup,
2137
+ toggleGroupCollapsed,
2138
+ toggleMute
1824
2139
  } = useTabs();
1825
2140
  const {
1826
2141
  runtimeState: runtimeState2
@@ -1828,6 +2143,30 @@ const TabBar = () => {
1828
2143
  const now2 = useNow();
1829
2144
  const [closingTabIds, setClosingTabIds] = createSignal(/* @__PURE__ */ new Set());
1830
2145
  const modelActiveTabIds = createMemo(() => getAgentActiveTabIds(runtimeState2(), now2()));
2146
+ const tabEntries = createMemo(() => {
2147
+ const seenGroups = /* @__PURE__ */ new Set();
2148
+ return tabs2().flatMap((tab) => {
2149
+ const entries2 = [];
2150
+ if (tab.groupId && !seenGroups.has(tab.groupId)) {
2151
+ seenGroups.add(tab.groupId);
2152
+ entries2.push({
2153
+ type: "group",
2154
+ groupId: tab.groupId,
2155
+ name: tab.groupName || "Group",
2156
+ color: tab.groupColor || "blue",
2157
+ collapsed: !!tab.groupCollapsed,
2158
+ count: tabs2().filter((candidate) => candidate.groupId === tab.groupId).length
2159
+ });
2160
+ }
2161
+ if (!tab.groupCollapsed || tab.id === activeTabId2()) {
2162
+ entries2.push({
2163
+ type: "tab",
2164
+ tab
2165
+ });
2166
+ }
2167
+ return entries2;
2168
+ });
2169
+ });
1831
2170
  const handleClose = (id) => {
1832
2171
  setClosingTabIds((prev) => new Set(prev).add(id));
1833
2172
  setTimeout(() => {
@@ -1840,60 +2179,172 @@ const TabBar = () => {
1840
2179
  }, TAB_CLOSE_MS);
1841
2180
  };
1842
2181
  return (() => {
1843
- var _el$3 = _tmpl$3$c(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild;
2182
+ 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, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling;
1844
2183
  insert(_el$4, createComponent(For, {
1845
2184
  get each() {
1846
- return tabs2();
2185
+ return tabEntries();
1847
2186
  },
1848
- 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) => {
1851
- if (e.button === 1) handleClose(tab.id);
1852
- });
1853
- _el$6.$$click = () => switchTab(tab.id);
1854
- insert(_el$6, createComponent(TabFavicon, {
1855
- get favicon() {
1856
- return tab.favicon;
1857
- },
1858
- get title() {
1859
- return tab.title || "New Tab";
1860
- },
1861
- get url() {
1862
- return tab.url;
1863
- }
1864
- }), _el$7);
1865
- insert(_el$6, (() => {
1866
- var _c$ = memo(() => !!modelActiveTabIds().has(tab.id));
1867
- return () => _c$() && _tmpl$5$b();
1868
- })(), _el$7);
1869
- insert(_el$7, () => tab.title || "New Tab");
1870
- insert(_el$6, (() => {
1871
- var _c$2 = memo(() => !!tab.isLoading);
1872
- return () => _c$2() && _tmpl$6$a();
1873
- })(), _el$8);
1874
- _el$8.$$click = (e) => {
1875
- e.stopPropagation();
1876
- handleClose(tab.id);
1877
- };
1878
- createRenderEffect((_p$) => {
1879
- 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);
1883
- return _p$;
1884
- }, {
1885
- e: void 0,
1886
- t: void 0,
1887
- a: void 0
1888
- });
1889
- return _el$6;
1890
- })()
1891
- }), _el$5);
1892
- _el$5.$$click = () => createTab();
2187
+ children: (entry) => createComponent(Show, {
2188
+ get when() {
2189
+ return entry.type === "tab";
2190
+ },
2191
+ get fallback() {
2192
+ return memo(() => entry.type === "group")() && (() => {
2193
+ var _el$0 = _tmpl$4$c(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
2194
+ _el$0.$$contextmenu = (e) => {
2195
+ e.preventDefault();
2196
+ window.vessel.tabs.showGroupContextMenu(entry.groupId);
2197
+ };
2198
+ _el$0.$$click = () => void toggleGroupCollapsed(entry.groupId);
2199
+ insert(_el$10, () => entry.name);
2200
+ insert(_el$11, () => entry.count);
2201
+ createRenderEffect((_p$) => {
2202
+ var _v$ = `tab-group-chip group-${entry.color}`, _v$2 = !!entry.collapsed, _v$3 = `${entry.name} (${entry.count} tabs)`;
2203
+ _v$ !== _p$.e && className(_el$0, _p$.e = _v$);
2204
+ _v$2 !== _p$.t && _el$0.classList.toggle("collapsed", _p$.t = _v$2);
2205
+ _v$3 !== _p$.a && setAttribute(_el$0, "title", _p$.a = _v$3);
2206
+ return _p$;
2207
+ }, {
2208
+ e: void 0,
2209
+ t: void 0,
2210
+ a: void 0
2211
+ });
2212
+ return _el$0;
2213
+ })();
2214
+ },
2215
+ get children() {
2216
+ return memo(() => entry.type === "tab")() && (() => {
2217
+ const tab = entry.tab;
2218
+ return (() => {
2219
+ var _el$12 = _tmpl$6$a();
2220
+ _el$12.$$contextmenu = (e) => {
2221
+ e.preventDefault();
2222
+ window.vessel.tabs.showContextMenu(tab.id);
2223
+ };
2224
+ _el$12.addEventListener("auxclick", (e) => {
2225
+ if (e.button === 1 && !tab.isPinned) handleClose(tab.id);
2226
+ });
2227
+ _el$12.$$click = () => switchTab(tab.id);
2228
+ insert(_el$12, createComponent(TabFavicon, {
2229
+ get favicon() {
2230
+ return tab.favicon;
2231
+ },
2232
+ get title() {
2233
+ return tab.title || "New Tab";
2234
+ },
2235
+ get url() {
2236
+ return tab.url;
2237
+ }
2238
+ }), null);
2239
+ insert(_el$12, createComponent(Show, {
2240
+ get when() {
2241
+ return memo(() => !!tab.isPinned)() && (tab.isAudible || tab.isMuted);
2242
+ },
2243
+ get children() {
2244
+ var _el$13 = _tmpl$5$b();
2245
+ _el$13.$$click = (e) => {
2246
+ e.stopPropagation();
2247
+ void toggleMute(tab.id);
2248
+ };
2249
+ insert(_el$13, createComponent(Show, {
2250
+ get when() {
2251
+ return tab.isMuted;
2252
+ },
2253
+ get fallback() {
2254
+ return createComponent(volume_2_default, {
2255
+ size: 11
2256
+ });
2257
+ },
2258
+ get children() {
2259
+ return createComponent(volume_x_default, {
2260
+ size: 11
2261
+ });
2262
+ }
2263
+ }));
2264
+ createRenderEffect(() => setAttribute(_el$13, "title", tab.isMuted ? "Unmute tab" : "Mute tab"));
2265
+ return _el$13;
2266
+ }
2267
+ }), null);
2268
+ insert(_el$12, (() => {
2269
+ var _c$ = memo(() => !!!tab.isPinned);
2270
+ return () => _c$() && [memo(() => memo(() => !!modelActiveTabIds().has(tab.id))() && _tmpl$0$5()), (() => {
2271
+ var _el$14 = _tmpl$7$9();
2272
+ insert(_el$14, () => tab.title || "New Tab");
2273
+ return _el$14;
2274
+ })(), createComponent(Show, {
2275
+ get when() {
2276
+ return tab.isAudible || tab.isMuted;
2277
+ },
2278
+ get children() {
2279
+ var _el$15 = _tmpl$8$6();
2280
+ _el$15.$$click = (e) => {
2281
+ e.stopPropagation();
2282
+ void toggleMute(tab.id);
2283
+ };
2284
+ insert(_el$15, createComponent(Show, {
2285
+ get when() {
2286
+ return tab.isMuted;
2287
+ },
2288
+ get fallback() {
2289
+ return createComponent(volume_2_default, {
2290
+ size: 12
2291
+ });
2292
+ },
2293
+ get children() {
2294
+ return createComponent(volume_x_default, {
2295
+ size: 12
2296
+ });
2297
+ }
2298
+ }));
2299
+ createRenderEffect(() => setAttribute(_el$15, "title", tab.isMuted ? "Unmute tab" : "Mute tab"));
2300
+ return _el$15;
2301
+ }
2302
+ }), memo(() => memo(() => !!tab.isLoading)() && _tmpl$1$5()), (() => {
2303
+ var _el$16 = _tmpl$9$5();
2304
+ _el$16.$$click = (e) => {
2305
+ e.stopPropagation();
2306
+ handleClose(tab.id);
2307
+ };
2308
+ return _el$16;
2309
+ })()];
2310
+ })(), null);
2311
+ createRenderEffect((_p$) => {
2312
+ var _v$4 = `tab-item ${tab.isPinned ? "pinned" : ""} ${tab.id === activeTabId2() ? "active" : ""} ${modelActiveTabIds().has(tab.id) ? "model-active" : ""} ${tab.groupId ? `group-${tab.groupColor || "blue"}` : ""}`, _v$5 = !!closingTabIds().has(tab.id), _v$6 = tab.isPinned ? tab.title || tab.url : modelActiveTabIds().has(tab.id) ? `${tab.title || "New Tab"} • Agent active` : tab.title;
2313
+ _v$4 !== _p$.e && className(_el$12, _p$.e = _v$4);
2314
+ _v$5 !== _p$.t && _el$12.classList.toggle("closing", _p$.t = _v$5);
2315
+ _v$6 !== _p$.a && setAttribute(_el$12, "title", _p$.a = _v$6);
2316
+ return _p$;
2317
+ }, {
2318
+ e: void 0,
2319
+ t: void 0,
2320
+ a: void 0
2321
+ });
2322
+ return _el$12;
2323
+ })();
2324
+ })();
2325
+ }
2326
+ })
2327
+ }));
2328
+ _el$6.$$click = () => window.vessel.tabs.openNewWindow();
2329
+ insert(_el$6, createComponent(panel_top_default, {
2330
+ size: 14
2331
+ }));
2332
+ _el$7.$$click = () => {
2333
+ const id = activeTabId2();
2334
+ if (id) void createGroup(id);
2335
+ };
2336
+ insert(_el$7, createComponent(layers_plus_default, {
2337
+ size: 14
2338
+ }));
2339
+ _el$8.$$click = () => createTab();
2340
+ insert(_el$8, createComponent(plus_default, {
2341
+ size: 15
2342
+ }));
2343
+ _el$9.$$click = () => window.vessel.tabs.openPrivateWindow();
1893
2344
  return _el$3;
1894
2345
  })();
1895
2346
  };
1896
- delegateEvents(["click"]);
2347
+ delegateEvents(["click", "contextmenu"]);
1897
2348
  const DEFAULT_SIDEBAR_WIDTH = 400;
1898
2349
  const MIN_SIDEBAR = 240;
1899
2350
  const MAX_SIDEBAR = 800;
@@ -1964,6 +2415,84 @@ function useUI() {
1964
2415
  }
1965
2416
  };
1966
2417
  }
2418
+ const logger$3 = createLogger("HistoryStore");
2419
+ const INITIAL$1 = { entries: [] };
2420
+ const [historyState, setHistoryState] = createSignal(INITIAL$1);
2421
+ let initialized$2 = false;
2422
+ let initPromise$1 = null;
2423
+ async function init$2() {
2424
+ if (initPromise$1) return initPromise$1;
2425
+ if (initialized$2) return;
2426
+ initialized$2 = true;
2427
+ initPromise$1 = (async () => {
2428
+ try {
2429
+ const state = await window.vessel.history.get();
2430
+ setHistoryState(state);
2431
+ window.vessel.history.onUpdate((s) => setHistoryState(s));
2432
+ } catch (error) {
2433
+ initialized$2 = false;
2434
+ logger$3.error("Failed to initialize history store:", error);
2435
+ } finally {
2436
+ initPromise$1 = null;
2437
+ }
2438
+ })();
2439
+ return initPromise$1;
2440
+ }
2441
+ function useHistory() {
2442
+ void init$2();
2443
+ return {
2444
+ historyState,
2445
+ search: (query) => window.vessel.history.search(query),
2446
+ clear: () => window.vessel.history.clear()
2447
+ };
2448
+ }
2449
+ const logger$2 = createLogger("BookmarksStore");
2450
+ const INITIAL = { folders: [], bookmarks: [] };
2451
+ const [bookmarksState, setBookmarksState] = createSignal(INITIAL);
2452
+ let initialized$1 = false;
2453
+ let initPromise = null;
2454
+ async function init$1() {
2455
+ if (initPromise) return initPromise;
2456
+ if (initialized$1) return;
2457
+ initialized$1 = true;
2458
+ initPromise = (async () => {
2459
+ try {
2460
+ const state = await window.vessel.bookmarks.get();
2461
+ setBookmarksState(state);
2462
+ window.vessel.bookmarks.onUpdate((s) => setBookmarksState(s));
2463
+ } catch (error) {
2464
+ initialized$1 = false;
2465
+ logger$2.error("Failed to initialize bookmarks store:", error);
2466
+ } finally {
2467
+ initPromise = null;
2468
+ }
2469
+ })();
2470
+ return initPromise;
2471
+ }
2472
+ function useBookmarks() {
2473
+ void init$1();
2474
+ return {
2475
+ bookmarksState,
2476
+ saveBookmark: (url, title, folderId, note, intent, expectedContent, keyFields, agentHints) => window.vessel.bookmarks.saveBookmark(
2477
+ url,
2478
+ title,
2479
+ folderId,
2480
+ note,
2481
+ intent,
2482
+ expectedContent,
2483
+ keyFields,
2484
+ agentHints
2485
+ ),
2486
+ updateBookmark: (id, updates) => window.vessel.bookmarks.updateBookmark(id, updates),
2487
+ removeBookmark: (id) => window.vessel.bookmarks.removeBookmark(id),
2488
+ exportHtml: (options) => window.vessel.bookmarks.exportHtml(options),
2489
+ exportJson: () => window.vessel.bookmarks.exportJson(),
2490
+ createFolder: (name) => window.vessel.bookmarks.createFolder(name),
2491
+ createFolderWithSummary: (name, summary) => window.vessel.bookmarks.createFolderWithSummary(name, summary),
2492
+ removeFolder: (id, deleteContents) => window.vessel.bookmarks.removeFolder(id, deleteContents),
2493
+ renameFolder: (id, newName, summary) => window.vessel.bookmarks.renameFolder(id, newName, summary)
2494
+ };
2495
+ }
1967
2496
  function normalizePageUrl(rawUrl) {
1968
2497
  try {
1969
2498
  const url = new URL(rawUrl);
@@ -2078,7 +2607,15 @@ function buildPageSnapshotKey(rawUrl) {
2078
2607
  function matchesPageSnapshotUrl(left, right) {
2079
2608
  return buildPageSnapshotKey(left) === buildPageSnapshotKey(right);
2080
2609
  }
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>`);
2610
+ const SEARCH_ENGINE_PRESETS = {
2611
+ duckduckgo: { label: "DuckDuckGo", url: "https://duckduckgo.com/?q=" },
2612
+ google: { label: "Google", url: "https://www.google.com/search?q=" },
2613
+ bing: { label: "Bing", url: "https://www.bing.com/search?q=" },
2614
+ brave: { label: "Brave Search", url: "https://search.brave.com/search?q=" },
2615
+ ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
2616
+ kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
2617
+ };
2618
+ var _tmpl$$f = /* @__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$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><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
2619
  const AddressBar = () => {
2083
2620
  const {
2084
2621
  activeTab,
@@ -2098,16 +2635,48 @@ const AddressBar = () => {
2098
2635
  toggleDevTools,
2099
2636
  devtoolsPanelOpen: devtoolsPanelOpen2
2100
2637
  } = useUI();
2638
+ const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
2639
+ const {
2640
+ historyState: historyState2
2641
+ } = useHistory();
2642
+ const {
2643
+ bookmarksState: bookmarksState2
2644
+ } = useBookmarks();
2101
2645
  const [inputValue, setInputValue] = createSignal("");
2646
+ const [showSuggestions, setShowSuggestions] = createSignal(false);
2647
+ const [selectedIndex, setSelectedIndex] = createSignal(-1);
2648
+ const [searchEngine, setSearchEngine] = createSignal("duckduckgo");
2102
2649
  const now2 = useNow();
2103
2650
  let inputRef;
2104
2651
  const agentPresence = createMemo(() => getAgentPresence(runtimeState2(), now2()));
2105
2652
  const agentStatusMessage = createMemo(() => getLatestAgentStatusMessage(runtimeState2(), now2()));
2106
2653
  const pendingApprovalCount = createMemo(() => runtimeState2().supervisor.pendingApprovals.length);
2654
+ const searchEnginePreset = createMemo(() => {
2655
+ const engine = searchEngine();
2656
+ return engine === "none" ? SEARCH_ENGINE_PRESETS.duckduckgo : SEARCH_ENGINE_PRESETS[engine];
2657
+ });
2658
+ const buildSearchUrl = (query) => searchEnginePreset().url + encodeURIComponent(query);
2107
2659
  const [pageDiff, setPageDiff] = createSignal(null);
2108
2660
  const [diffExpanded, setDiffExpanded] = createSignal(false);
2109
2661
  let diffCollapseTimer = null;
2662
+ onMount(() => {
2663
+ let disposed = false;
2664
+ void window.vessel.settings.get().then((settings) => {
2665
+ if (!disposed) {
2666
+ setSearchEngine(settings.defaultSearchEngine ?? "duckduckgo");
2667
+ }
2668
+ }).catch(() => {
2669
+ });
2670
+ const unsubscribe = window.vessel.settings.onUpdate((settings) => {
2671
+ setSearchEngine(settings.defaultSearchEngine ?? "duckduckgo");
2672
+ });
2673
+ onCleanup(() => {
2674
+ disposed = true;
2675
+ unsubscribe();
2676
+ });
2677
+ });
2110
2678
  const showIncomingDiff = (diff) => {
2679
+ if (isPrivateWindow) return;
2111
2680
  setPageDiff(diff);
2112
2681
  setDiffExpanded(true);
2113
2682
  if (diffCollapseTimer) clearTimeout(diffCollapseTimer);
@@ -2117,6 +2686,7 @@ const AddressBar = () => {
2117
2686
  }, 8e3);
2118
2687
  };
2119
2688
  const openDiffTimeline = async () => {
2689
+ if (isPrivateWindow) return;
2120
2690
  setDiffExpanded(false);
2121
2691
  if (diffCollapseTimer) {
2122
2692
  clearTimeout(diffCollapseTimer);
@@ -2145,6 +2715,7 @@ const AddressBar = () => {
2145
2715
  return `${hours}h`;
2146
2716
  };
2147
2717
  createEffect(() => {
2718
+ if (isPrivateWindow) return;
2148
2719
  const unsubscribe = window.vessel.pageDiff.onChanged((diff) => {
2149
2720
  const tab = activeTab();
2150
2721
  if (!tab) return;
@@ -2163,10 +2734,65 @@ const AddressBar = () => {
2163
2734
  const tab = activeTab();
2164
2735
  if (tab && !inputRef?.matches(":focus")) {
2165
2736
  setInputValue(tab.url === "about:blank" ? "" : tab.url);
2737
+ setShowSuggestions(false);
2738
+ setSelectedIndex(-1);
2739
+ }
2740
+ });
2741
+ const MAX_SUGGESTIONS = 8;
2742
+ const suggestions = createMemo(() => {
2743
+ const rawQuery = inputValue().trim();
2744
+ const query = rawQuery.toLowerCase();
2745
+ if (!query || query.length < 2) return [];
2746
+ const results = [];
2747
+ const seen = /* @__PURE__ */ new Set();
2748
+ const matchLimit = MAX_SUGGESTIONS - 1;
2749
+ for (const b of bookmarksState2().bookmarks) {
2750
+ if (seen.has(b.url)) continue;
2751
+ const urlMatch = b.url.toLowerCase().includes(query);
2752
+ const titleMatch = b.title.toLowerCase().includes(query);
2753
+ if (urlMatch || titleMatch) {
2754
+ seen.add(b.url);
2755
+ results.push({
2756
+ url: b.url,
2757
+ title: b.title,
2758
+ source: "bookmark"
2759
+ });
2760
+ }
2761
+ if (results.length >= matchLimit) break;
2762
+ }
2763
+ if (results.length < matchLimit) {
2764
+ for (const h of historyState2().entries) {
2765
+ if (seen.has(h.url)) continue;
2766
+ const urlMatch = h.url.toLowerCase().includes(query);
2767
+ const titleMatch = h.title.toLowerCase().includes(query);
2768
+ if (urlMatch || titleMatch) {
2769
+ seen.add(h.url);
2770
+ results.push({
2771
+ url: h.url,
2772
+ title: h.title,
2773
+ source: "history"
2774
+ });
2775
+ }
2776
+ if (results.length >= matchLimit) break;
2777
+ }
2166
2778
  }
2779
+ if (results.length < MAX_SUGGESTIONS) {
2780
+ results.push({
2781
+ url: buildSearchUrl(rawQuery),
2782
+ title: `Search for "${rawQuery}"`,
2783
+ subtitle: searchEnginePreset().label,
2784
+ source: "search"
2785
+ });
2786
+ }
2787
+ return results;
2167
2788
  });
2168
2789
  createEffect(() => {
2169
2790
  const tab = activeTab();
2791
+ if (isPrivateWindow) {
2792
+ setPageDiff(null);
2793
+ setDiffExpanded(false);
2794
+ return;
2795
+ }
2170
2796
  if (!tab) {
2171
2797
  setPageDiff(null);
2172
2798
  setDiffExpanded(false);
@@ -2190,37 +2816,150 @@ const AddressBar = () => {
2190
2816
  cancelled = true;
2191
2817
  });
2192
2818
  });
2819
+ const selectSuggestion = (url) => {
2820
+ setInputValue(url);
2821
+ setShowSuggestions(false);
2822
+ setSelectedIndex(-1);
2823
+ navigate(url);
2824
+ inputRef?.blur();
2825
+ };
2193
2826
  const handleSubmit = (e) => {
2194
2827
  e.preventDefault();
2195
- const val = inputValue().trim();
2196
- if (val) {
2197
- navigate(val);
2198
- inputRef?.blur();
2828
+ const idx = selectedIndex();
2829
+ const items = suggestions();
2830
+ if (idx >= 0 && idx < items.length) {
2831
+ selectSuggestion(items[idx].url);
2832
+ } else {
2833
+ const val = inputValue().trim();
2834
+ if (val) {
2835
+ navigate(val);
2836
+ inputRef?.blur();
2837
+ setShowSuggestions(false);
2838
+ }
2839
+ }
2840
+ };
2841
+ const handleInputKeyDown = (e) => {
2842
+ const items = suggestions();
2843
+ const idx = selectedIndex();
2844
+ if (e.key === "ArrowDown") {
2845
+ e.preventDefault();
2846
+ if (items.length > 0) {
2847
+ setShowSuggestions(true);
2848
+ setSelectedIndex(idx < items.length - 1 ? idx + 1 : 0);
2849
+ }
2850
+ } else if (e.key === "ArrowUp") {
2851
+ e.preventDefault();
2852
+ if (items.length > 0) {
2853
+ setShowSuggestions(true);
2854
+ setSelectedIndex(idx > 0 ? idx - 1 : items.length - 1);
2855
+ }
2856
+ } else if (e.key === "Escape") {
2857
+ if (showSuggestions()) {
2858
+ setShowSuggestions(false);
2859
+ setSelectedIndex(-1);
2860
+ } else {
2861
+ inputRef?.blur();
2862
+ }
2199
2863
  }
2200
2864
  };
2201
2865
  const formatSectionLabel = (section) => section === "title" ? "Title" : section === "headings" ? "Headings" : "Content";
2202
2866
  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;
2867
+ 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
2868
  addEventListener(_el$3, "click", goBack, true);
2207
2869
  addEventListener(_el$4, "click", goForward, true);
2208
2870
  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);
2871
+ insert(_el$, createComponent(Show, {
2872
+ when: isPrivateWindow,
2873
+ get children() {
2874
+ return _tmpl$$f();
2875
+ }
2876
+ }), _el$7);
2877
+ _el$8.addEventListener("submit", handleSubmit);
2878
+ _el$9.addEventListener("blur", () => {
2879
+ setTimeout(() => {
2880
+ setShowSuggestions(false);
2881
+ setSelectedIndex(-1);
2882
+ }, 150);
2883
+ });
2884
+ _el$9.$$keydown = handleInputKeyDown;
2885
+ _el$9.addEventListener("focus", (e) => {
2886
+ e.currentTarget.select();
2887
+ const query = inputValue().trim();
2888
+ if (query.length >= 2) setShowSuggestions(true);
2889
+ });
2890
+ _el$9.$$input = (e) => {
2891
+ setInputValue(e.currentTarget.value);
2892
+ setShowSuggestions(true);
2893
+ setSelectedIndex(-1);
2894
+ };
2212
2895
  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, {
2896
+ typeof _ref$ === "function" ? use(_ref$, _el$9) : inputRef = _el$9;
2897
+ setAttribute(_el$9, "spellcheck", false);
2898
+ insert(_el$7, createComponent(Show, {
2899
+ get when() {
2900
+ return memo(() => !!showSuggestions())() && suggestions().length > 0;
2901
+ },
2902
+ get children() {
2903
+ var _el$0 = _tmpl$2$e();
2904
+ insert(_el$0, createComponent(For, {
2905
+ get each() {
2906
+ return suggestions();
2907
+ },
2908
+ children: (item, i) => (() => {
2909
+ 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;
2910
+ _el$40.addEventListener("mouseenter", () => setSelectedIndex(i()));
2911
+ _el$40.$$mousedown = (e) => {
2912
+ e.preventDefault();
2913
+ selectSuggestion(item.url);
2914
+ };
2915
+ insert(_el$41, (() => {
2916
+ var _c$ = memo(() => item.source === "bookmark");
2917
+ return () => _c$() ? "★" : item.source === "search" ? "⌕" : "◌";
2918
+ })());
2919
+ insert(_el$43, () => item.title || item.url);
2920
+ insert(_el$44, () => item.subtitle || item.url);
2921
+ createRenderEffect((_p$) => {
2922
+ var _v$10 = `address-autocomplete-${i()}`, _v$11 = `autocomplete-item ${selectedIndex() === i() ? "selected" : ""}`, _v$12 = selectedIndex() === i();
2923
+ _v$10 !== _p$.e && setAttribute(_el$40, "id", _p$.e = _v$10);
2924
+ _v$11 !== _p$.t && className(_el$40, _p$.t = _v$11);
2925
+ _v$12 !== _p$.a && setAttribute(_el$40, "aria-selected", _p$.a = _v$12);
2926
+ return _p$;
2927
+ }, {
2928
+ e: void 0,
2929
+ t: void 0,
2930
+ a: void 0
2931
+ });
2932
+ return _el$40;
2933
+ })()
2934
+ }));
2935
+ return _el$0;
2936
+ }
2937
+ }), null);
2938
+ insert(_el$7, createComponent(Show, {
2939
+ when: !isPrivateWindow,
2940
+ get children() {
2941
+ var _el$1 = _tmpl$3$b(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
2942
+ insert(_el$11, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
2943
+ createRenderEffect((_p$) => {
2944
+ 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");
2945
+ _v$ !== _p$.e && className(_el$1, _p$.e = _v$);
2946
+ _v$2 !== _p$.t && setAttribute(_el$1, "title", _p$.t = _v$2);
2947
+ return _p$;
2948
+ }, {
2949
+ e: void 0,
2950
+ t: void 0
2951
+ });
2952
+ return _el$1;
2953
+ }
2954
+ }), null);
2955
+ insert(_el$7, createComponent(Show, {
2217
2956
  get when() {
2218
2957
  return pageDiff();
2219
2958
  },
2220
2959
  get children() {
2221
- var _el$10 = _tmpl$$g();
2222
- _el$10.$$click = () => void openDiffTimeline();
2223
- return _el$10;
2960
+ var _el$12 = _tmpl$4$b();
2961
+ _el$12.$$click = () => void openDiffTimeline();
2962
+ return _el$12;
2224
2963
  }
2225
2964
  }), null);
2226
2965
  insert(_el$, createComponent(Show, {
@@ -2228,176 +2967,212 @@ const AddressBar = () => {
2228
2967
  return memo(() => !!pageDiff())() && diffExpanded();
2229
2968
  },
2230
2969
  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, {
2970
+ var _el$13 = _tmpl$7$8(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
2971
+ _el$16.firstChild;
2972
+ var _el$23 = _el$15.nextSibling, _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
2973
+ insert(_el$16, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
2974
+ insert(_el$15, createComponent(Show, {
2236
2975
  get when() {
2237
2976
  return memo(() => !!((pageDiff().burstCount || 0) > 1 && pageDiff().firstDetectedAt))() && pageDiff().lastDetectedAt;
2238
2977
  },
2239
2978
  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;
2979
+ var _el$18 = _tmpl$5$a(), _el$19 = _el$18.firstChild, _el$22 = _el$19.nextSibling;
2980
+ _el$22.nextSibling;
2981
+ insert(_el$18, () => pageDiff().burstCount, _el$22);
2982
+ insert(_el$18, () => formatElapsed(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
2983
+ return _el$18;
2245
2984
  }
2246
2985
  }), null);
2247
- _el$22.$$click = () => void openDiffTimeline();
2248
- _el$23.$$click = () => setDiffExpanded(false);
2249
- insert(_el$11, createComponent(Show, {
2986
+ _el$24.$$click = () => void openDiffTimeline();
2987
+ _el$25.$$click = () => setDiffExpanded(false);
2988
+ insert(_el$13, createComponent(Show, {
2250
2989
  get when() {
2251
2990
  return memo(() => !!pageDiff().recentBursts?.length)() && (pageDiff().recentBursts?.length || 0) > 1;
2252
2991
  },
2253
2992
  get children() {
2254
- var _el$24 = _tmpl$3$b();
2255
- _el$24.firstChild;
2256
- insert(_el$24, createComponent(For, {
2993
+ var _el$26 = _tmpl$6$9();
2994
+ _el$26.firstChild;
2995
+ insert(_el$26, createComponent(For, {
2257
2996
  get each() {
2258
2997
  return pageDiff().recentBursts;
2259
2998
  },
2260
2999
  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;
3000
+ var _el$45 = _tmpl$15$3(), _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling;
3001
+ insert(_el$46, () => formatRelativeTime(burst.detectedAt));
3002
+ insert(_el$47, () => burst.summary);
3003
+ return _el$45;
2265
3004
  })()
2266
3005
  }), null);
2267
- return _el$24;
3006
+ return _el$26;
2268
3007
  }
2269
3008
  }), null);
2270
- insert(_el$11, createComponent(For, {
3009
+ insert(_el$13, createComponent(For, {
2271
3010
  get each() {
2272
3011
  return pageDiff().changes;
2273
3012
  },
2274
3013
  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, {
3014
+ var _el$48 = _tmpl$21$3(), _el$49 = _el$48.firstChild, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling;
3015
+ insert(_el$50, () => formatSectionLabel(change.section));
3016
+ insert(_el$51, () => change.summary);
3017
+ insert(_el$48, createComponent(Show, {
2279
3018
  get when() {
2280
3019
  return change.before || change.after;
2281
3020
  },
2282
3021
  get children() {
2283
- var _el$45 = _tmpl$10$4();
2284
- insert(_el$45, createComponent(Show, {
3022
+ var _el$52 = _tmpl$18$3();
3023
+ insert(_el$52, createComponent(Show, {
2285
3024
  get when() {
2286
3025
  return change.before;
2287
3026
  },
2288
3027
  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;
3028
+ var _el$53 = _tmpl$16$3(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
3029
+ insert(_el$55, () => change.before);
3030
+ return _el$53;
2292
3031
  }
2293
3032
  }), null);
2294
- insert(_el$45, createComponent(Show, {
3033
+ insert(_el$52, createComponent(Show, {
2295
3034
  get when() {
2296
3035
  return change.after;
2297
3036
  },
2298
3037
  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;
3038
+ var _el$56 = _tmpl$17$3(), _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling;
3039
+ insert(_el$58, () => change.after);
3040
+ return _el$56;
2302
3041
  }
2303
3042
  }), null);
2304
- return _el$45;
3043
+ return _el$52;
2305
3044
  }
2306
3045
  }), null);
2307
- insert(_el$41, createComponent(Show, {
3046
+ insert(_el$48, createComponent(Show, {
2308
3047
  get when() {
2309
3048
  return change.addedItems?.length;
2310
3049
  },
2311
3050
  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, {
3051
+ var _el$59 = _tmpl$19$3(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling;
3052
+ insert(_el$61, createComponent(For, {
2314
3053
  get each() {
2315
3054
  return change.addedItems;
2316
3055
  },
2317
3056
  children: (item) => (() => {
2318
- var _el$58 = _tmpl$14$3();
2319
- insert(_el$58, item);
2320
- return _el$58;
3057
+ var _el$65 = _tmpl$22$3();
3058
+ insert(_el$65, item);
3059
+ return _el$65;
2321
3060
  })()
2322
3061
  }));
2323
- return _el$52;
3062
+ return _el$59;
2324
3063
  }
2325
3064
  }), null);
2326
- insert(_el$41, createComponent(Show, {
3065
+ insert(_el$48, createComponent(Show, {
2327
3066
  get when() {
2328
3067
  return change.removedItems?.length;
2329
3068
  },
2330
3069
  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, {
3070
+ var _el$62 = _tmpl$20$3(), _el$63 = _el$62.firstChild, _el$64 = _el$63.nextSibling;
3071
+ insert(_el$64, createComponent(For, {
2333
3072
  get each() {
2334
3073
  return change.removedItems;
2335
3074
  },
2336
3075
  children: (item) => (() => {
2337
- var _el$59 = _tmpl$14$3();
2338
- insert(_el$59, item);
2339
- return _el$59;
3076
+ var _el$66 = _tmpl$22$3();
3077
+ insert(_el$66, item);
3078
+ return _el$66;
2340
3079
  })()
2341
3080
  }));
2342
- return _el$55;
3081
+ return _el$62;
2343
3082
  }
2344
3083
  }), null);
2345
- createRenderEffect(() => className(_el$41, `page-diff-item page-diff-${change.kind}`));
2346
- return _el$41;
3084
+ createRenderEffect(() => className(_el$48, `page-diff-item page-diff-${change.kind}`));
3085
+ return _el$48;
2347
3086
  })()
2348
3087
  }), null);
2349
- return _el$11;
3088
+ return _el$13;
2350
3089
  }
2351
- }), _el$26);
2352
- _el$27.$$click = async () => {
3090
+ }), _el$28);
3091
+ _el$29.$$click = async () => {
2353
3092
  const id = activeTabId2();
2354
3093
  if (!id) return;
2355
3094
  await toggleAdBlock(id);
2356
3095
  };
2357
- insert(_el$28, createComponent(Show, {
3096
+ insert(_el$30, createComponent(Show, {
2358
3097
  get when() {
2359
3098
  return activeTab()?.adBlockingEnabled;
2360
3099
  },
2361
3100
  get children() {
2362
- return _tmpl$5$a();
3101
+ return _tmpl$8$5();
2363
3102
  }
2364
3103
  }), null);
2365
- insert(_el$28, createComponent(Show, {
3104
+ insert(_el$30, createComponent(Show, {
2366
3105
  get when() {
2367
3106
  return !activeTab()?.adBlockingEnabled;
2368
3107
  },
2369
3108
  get children() {
2370
- return [_tmpl$5$a(), _tmpl$6$9()];
3109
+ return [_tmpl$8$5(), _tmpl$9$4()];
2371
3110
  }
2372
3111
  }), 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
- },
3112
+ insert(_el$28, createComponent(Show, {
3113
+ when: !isPrivateWindow,
2380
3114
  get children() {
2381
- var _el$36 = _tmpl$7$7();
2382
- insert(_el$36, pendingApprovalCount);
2383
- createRenderEffect(() => setAttribute(_el$36, "aria-label", `${pendingApprovalCount()} pending`));
3115
+ var _el$34 = _tmpl$0$4();
3116
+ _el$34.$$click = () => window.vessel.content.toggleReader();
3117
+ createRenderEffect(() => _el$34.classList.toggle("active", !!activeTab()?.isReaderMode));
3118
+ return _el$34;
3119
+ }
3120
+ }), null);
3121
+ insert(_el$28, createComponent(Show, {
3122
+ when: !isPrivateWindow,
3123
+ get children() {
3124
+ var _el$35 = _tmpl$1$4();
3125
+ addEventListener(_el$35, "click", toggleDevTools, true);
3126
+ createRenderEffect(() => _el$35.classList.toggle("active", !!devtoolsPanelOpen2()));
3127
+ return _el$35;
3128
+ }
3129
+ }), null);
3130
+ insert(_el$28, createComponent(Show, {
3131
+ when: !isPrivateWindow,
3132
+ get children() {
3133
+ var _el$36 = _tmpl$11$4();
3134
+ _el$36.firstChild;
3135
+ addEventListener(_el$36, "click", toggleSidebar, true);
3136
+ insert(_el$36, createComponent(Show, {
3137
+ get when() {
3138
+ return pendingApprovalCount() > 0;
3139
+ },
3140
+ get children() {
3141
+ var _el$38 = _tmpl$10$4();
3142
+ insert(_el$38, pendingApprovalCount);
3143
+ createRenderEffect(() => setAttribute(_el$38, "aria-label", `${pendingApprovalCount()} pending`));
3144
+ return _el$38;
3145
+ }
3146
+ }), null);
3147
+ createRenderEffect((_p$) => {
3148
+ var _v$3 = !!(pendingApprovalCount() > 0), _v$4 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
3149
+ _v$3 !== _p$.e && _el$36.classList.toggle("has-approvals", _p$.e = _v$3);
3150
+ _v$4 !== _p$.t && setAttribute(_el$36, "title", _p$.t = _v$4);
3151
+ return _p$;
3152
+ }, {
3153
+ e: void 0,
3154
+ t: void 0
3155
+ });
2384
3156
  return _el$36;
2385
3157
  }
2386
3158
  }), null);
2387
- addEventListener(_el$37, "click", openSettings, true);
3159
+ insert(_el$28, createComponent(Show, {
3160
+ when: !isPrivateWindow,
3161
+ get children() {
3162
+ var _el$39 = _tmpl$12$4();
3163
+ addEventListener(_el$39, "click", openSettings, true);
3164
+ return _el$39;
3165
+ }
3166
+ }), null);
2388
3167
  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);
3168
+ 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)";
3169
+ _v$5 !== _p$.e && (_el$3.disabled = _p$.e = _v$5);
3170
+ _v$6 !== _p$.t && (_el$4.disabled = _p$.t = _v$6);
3171
+ _v$7 !== _p$.a && setAttribute(_el$9, "aria-expanded", _p$.a = _v$7);
3172
+ _v$8 !== _p$.o && setAttribute(_el$9, "aria-activedescendant", _p$.o = _v$8);
3173
+ _v$9 !== _p$.i && _el$29.classList.toggle("active", _p$.i = _v$9);
3174
+ _v$0 !== _p$.n && _el$29.classList.toggle("nav-btn-muted", _p$.n = _v$0);
3175
+ _v$1 !== _p$.s && setAttribute(_el$29, "title", _p$.s = _v$1);
2401
3176
  return _p$;
2402
3177
  }, {
2403
3178
  e: void 0,
@@ -2406,18 +3181,14 @@ const AddressBar = () => {
2406
3181
  o: void 0,
2407
3182
  i: void 0,
2408
3183
  n: void 0,
2409
- s: void 0,
2410
- h: void 0,
2411
- r: void 0,
2412
- d: void 0,
2413
- l: void 0
3184
+ s: void 0
2414
3185
  });
2415
- createRenderEffect(() => _el$8.value = inputValue());
3186
+ createRenderEffect(() => _el$9.value = inputValue());
2416
3187
  return _el$;
2417
3188
  })();
2418
3189
  };
2419
- delegateEvents(["click", "input"]);
2420
- 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>`);
3190
+ delegateEvents(["click", "input", "keydown", "mousedown"]);
3191
+ var _tmpl$$e = /* @__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
3192
  const TOAST_DURATION_MS$1 = 4200;
2422
3193
  const TOAST_EXIT_MS$2 = 300;
2423
3194
  function isBookmarkToastCandidate(action) {
@@ -2477,7 +3248,7 @@ const BookmarkNotifications = () => {
2477
3248
  timeoutIds.clear();
2478
3249
  });
2479
3250
  return (() => {
2480
- var _el$ = _tmpl$$f();
3251
+ var _el$ = _tmpl$$e();
2481
3252
  insert(_el$, createComponent(For, {
2482
3253
  get each() {
2483
3254
  return toasts();
@@ -2493,7 +3264,7 @@ const BookmarkNotifications = () => {
2493
3264
  return _el$;
2494
3265
  })();
2495
3266
  };
2496
- var _tmpl$$e = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite><div class="bookmark-toast highlight-toast"role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
3267
+ var _tmpl$$d = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite><div class="bookmark-toast highlight-toast"role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
2497
3268
  const TOAST_DURATION_MS = 3e3;
2498
3269
  const TOAST_EXIT_MS$1 = 300;
2499
3270
  const HighlightNotifications = (props) => {
@@ -2532,7 +3303,7 @@ const HighlightNotifications = (props) => {
2532
3303
  return memo(() => !!visible())() && current();
2533
3304
  },
2534
3305
  get children() {
2535
- var _el$ = _tmpl$$e(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3306
+ var _el$ = _tmpl$$d(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
2536
3307
  insert(_el$3, () => current().title);
2537
3308
  insert(_el$4, () => current().message);
2538
3309
  createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!leaving()));
@@ -2540,7 +3311,7 @@ const HighlightNotifications = (props) => {
2540
3311
  }
2541
3312
  });
2542
3313
  };
2543
- var _tmpl$$d = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$c = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$a = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$6 = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
3314
+ var _tmpl$$c = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$c = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$a = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
2544
3315
  const TOAST_DONE_DURATION_MS = 4200;
2545
3316
  const TOAST_EXIT_MS = 300;
2546
3317
  function formatBytes(bytes) {
@@ -2631,13 +3402,13 @@ const DownloadToast = () => {
2631
3402
  return Math.min(100, Math.round(d.receivedBytes / d.totalBytes * 100));
2632
3403
  };
2633
3404
  return (() => {
2634
- var _el$ = _tmpl$$d();
3405
+ var _el$ = _tmpl$$c();
2635
3406
  insert(_el$, createComponent(For, {
2636
3407
  get each() {
2637
3408
  return downloads();
2638
3409
  },
2639
3410
  children: (dl) => (() => {
2640
- var _el$2 = _tmpl$7$6(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
3411
+ var _el$2 = _tmpl$7$7(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
2641
3412
  insert(_el$4, () => dl.filename);
2642
3413
  insert(_el$3, createComponent(Show, {
2643
3414
  get when() {
@@ -2696,7 +3467,7 @@ const DownloadToast = () => {
2696
3467
  return _el$;
2697
3468
  })();
2698
3469
  };
2699
- var _tmpl$$c = /* @__PURE__ */ template(`<div class=find-bar><input class=find-bar-input type=text placeholder="Find in page..."><button class=find-bar-btn title="Previous (Shift+Enter)">&#9650;</button><button class=find-bar-btn title="Next (Enter)">&#9660;</button><button class="find-bar-btn find-bar-close"title="Close (Escape)">&times;`), _tmpl$2$b = /* @__PURE__ */ template(`<span class=find-bar-count>`);
3470
+ var _tmpl$$b = /* @__PURE__ */ template(`<div class=find-bar><input class=find-bar-input type=text placeholder="Find in page..."><button class=find-bar-btn title="Previous (Shift+Enter)">&#9650;</button><button class=find-bar-btn title="Next (Enter)">&#9660;</button><button class="find-bar-btn find-bar-close"title="Close (Escape)">&times;`), _tmpl$2$b = /* @__PURE__ */ template(`<span class=find-bar-count>`);
2700
3471
  const FindBar = () => {
2701
3472
  const [open, setOpen] = createSignal(false);
2702
3473
  const [query, setQuery] = createSignal("");
@@ -2774,7 +3545,7 @@ const FindBar = () => {
2774
3545
  return open();
2775
3546
  },
2776
3547
  get children() {
2777
- var _el$ = _tmpl$$c(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling;
3548
+ var _el$ = _tmpl$$b(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling;
2778
3549
  _el$2.$$input = (e) => handleInput(e.currentTarget.value);
2779
3550
  var _ref$ = inputRef;
2780
3551
  typeof _ref$ === "function" ? use(_ref$, _el$2) : inputRef = _el$2;
@@ -2801,7 +3572,7 @@ const FindBar = () => {
2801
3572
  });
2802
3573
  };
2803
3574
  delegateEvents(["input", "click"]);
2804
- var _tmpl$$b = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$9 = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$9 = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$8 = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
3575
+ var _tmpl$$a = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$9 = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$9 = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$8 = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
2805
3576
  const FlowProgress = () => {
2806
3577
  const {
2807
3578
  runtimeState: runtimeState2
@@ -2832,7 +3603,7 @@ const FlowProgress = () => {
2832
3603
  return flow() || tracker();
2833
3604
  },
2834
3605
  get children() {
2835
- var _el$ = _tmpl$$b();
3606
+ var _el$ = _tmpl$$a();
2836
3607
  insert(_el$, createComponent(Show, {
2837
3608
  get when() {
2838
3609
  return tracker();
@@ -2932,7 +3703,7 @@ function formatTime(iso, options) {
2932
3703
  ...options?.includeSeconds && { second: "2-digit" }
2933
3704
  });
2934
3705
  }
2935
- var _tmpl$$a = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$9 = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$8 = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$8 = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$5$7 = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$7 = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$5 = /* @__PURE__ */ template(`<article><div class=agent-transcript-meta><span class=agent-transcript-badge></span><span class=agent-transcript-time></span></div><div class=agent-transcript-text>`);
3706
+ var _tmpl$$9 = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$9 = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$8 = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$8 = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$5$7 = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$7 = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$6 = /* @__PURE__ */ template(`<article><div class=agent-transcript-meta><span class=agent-transcript-badge></span><span class=agent-transcript-time></span></div><div class=agent-transcript-text>`);
2936
3707
  const AgentTranscriptDock = () => {
2937
3708
  const {
2938
3709
  runtimeState: runtimeState2
@@ -2969,7 +3740,7 @@ const AgentTranscriptDock = () => {
2969
3740
  return isSummary();
2970
3741
  },
2971
3742
  get children() {
2972
- var _el$ = _tmpl$$a();
3743
+ var _el$ = _tmpl$$9();
2973
3744
  insert(_el$, createComponent(Show, {
2974
3745
  get when() {
2975
3746
  return latestEntry();
@@ -3024,7 +3795,7 @@ const AgentTranscriptDock = () => {
3024
3795
  return visibleEntries();
3025
3796
  },
3026
3797
  children: (entry) => (() => {
3027
- var _el$12 = _tmpl$7$5(), _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$13.nextSibling;
3798
+ var _el$12 = _tmpl$7$6(), _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$13.nextSibling;
3028
3799
  insert(_el$14, () => entry.title || entry.kind);
3029
3800
  insert(_el$15, () => formatTime(entry.updatedAt));
3030
3801
  insert(_el$16, () => entry.text);
@@ -3154,7 +3925,7 @@ const [pendingQueries, setPendingQueries] = createSignal([]);
3154
3925
  const [pendingQueryActivities, setPendingQueryActivities] = createSignal([]);
3155
3926
  const [queueNotice, setQueueNotice] = createSignal(null);
3156
3927
  const [automationActivities, setAutomationActivities] = createSignal([]);
3157
- let initialized$2 = false;
3928
+ let initialized = false;
3158
3929
  let pendingDrainScheduled = false;
3159
3930
  let listenerCleanups = [];
3160
3931
  let pendingAutomationActivity = null;
@@ -3212,9 +3983,9 @@ function schedulePendingDrain() {
3212
3983
  }
3213
3984
  });
3214
3985
  }
3215
- function init$2() {
3216
- if (initialized$2) return;
3217
- initialized$2 = true;
3986
+ function init() {
3987
+ if (initialized) return;
3988
+ initialized = true;
3218
3989
  listenerCleanups.push(window.vessel.ai.onStreamStart((prompt) => {
3219
3990
  setMessages((prev) => {
3220
3991
  const next = [...prev, { role: "user", content: prompt }];
@@ -3297,7 +4068,7 @@ function init$2() {
3297
4068
  }));
3298
4069
  }
3299
4070
  function useAI() {
3300
- init$2();
4071
+ init();
3301
4072
  const query = async (prompt, activity = null) => {
3302
4073
  recordRecentQuery(prompt);
3303
4074
  if (isStreaming()) {
@@ -3389,7 +4160,7 @@ function useAnimatedPresence(isOpen, exitDurationMs) {
3389
4160
  });
3390
4161
  return { visible, closing };
3391
4162
  }
3392
- var _tmpl$$9 = /* @__PURE__ */ template(`<div class=command-bar-no-provider><p>Configure a chat provider to start using the AI assistant.</p><button class=command-bar-no-provider-btn>Open Settings <kbd>Ctrl+,`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$7 = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$7 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=command-bar><form><div class=command-bar-icon><svg width=16 height=16 viewBox="0 0 16 16"><circle cx=8 cy=8 r=6 fill=none stroke=var(--accent-primary) stroke-width=1.5></circle><circle cx=6 cy=7 r=0.8 fill=var(--accent-primary)></circle><circle cx=10 cy=7 r=0.8 fill=var(--accent-primary)></circle><path d="M6 10c0.5 0.8 3.5 0.8 4 0"fill=none stroke=var(--accent-primary) stroke-width=0.8 stroke-linecap=round></path></svg></div><input class=command-bar-input type=text></form><div class=command-bar-hints><span><kbd>Enter</kbd> to ask</span><span><kbd>Esc</kbd> to close`), _tmpl$5$6 = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$6 = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
4163
+ var _tmpl$$8 = /* @__PURE__ */ template(`<div class=command-bar-no-provider><p>Configure a chat provider to start using the AI assistant.</p><button class=command-bar-no-provider-btn>Open Settings <kbd>Ctrl+,`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$7 = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$7 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=command-bar><form><div class=command-bar-icon><svg width=16 height=16 viewBox="0 0 16 16"><circle cx=8 cy=8 r=6 fill=none stroke=var(--accent-primary) stroke-width=1.5></circle><circle cx=6 cy=7 r=0.8 fill=var(--accent-primary)></circle><circle cx=10 cy=7 r=0.8 fill=var(--accent-primary)></circle><path d="M6 10c0.5 0.8 3.5 0.8 4 0"fill=none stroke=var(--accent-primary) stroke-width=0.8 stroke-linecap=round></path></svg></div><input class=command-bar-input type=text></form><div class=command-bar-hints><span><kbd>Enter</kbd> to ask</span><span><kbd>Esc</kbd> to close`), _tmpl$5$6 = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$6 = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
3393
4164
  const COMMAND_BAR_EXIT_MS = 200;
3394
4165
  const CommandBar = () => {
3395
4166
  const {
@@ -3457,7 +4228,7 @@ const CommandBar = () => {
3457
4228
  return !hasProvider();
3458
4229
  },
3459
4230
  get children() {
3460
- var _el$6 = _tmpl$$9(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
4231
+ var _el$6 = _tmpl$$8(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
3461
4232
  _el$8.$$click = () => {
3462
4233
  closeCommandBar();
3463
4234
  openSettings();
@@ -3513,82 +4284,6 @@ const CommandBar = () => {
3513
4284
  });
3514
4285
  };
3515
4286
  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
4287
  const MEMORY_STORAGE_KEY = "vessel.bookmark-context.memories";
3593
4288
  const MAX_MEMORY_LINES = 4;
3594
4289
  const MAX_MEMORY_CHARS = 420;
@@ -5081,7 +5776,7 @@ function getBookmarkSearchMatch(args) {
5081
5776
  }
5082
5777
  return { matchedFields, score };
5083
5778
  }
5084
- var _tmpl$$8 = /* @__PURE__ */ template(`<div class=dropdown-select-menu role=listbox>`), _tmpl$2$7 = /* @__PURE__ */ template(`<div><button class=dropdown-select-trigger type=button aria-haspopup=listbox><span class=dropdown-select-value></span><span class=dropdown-select-caret aria-hidden=true>▾`), _tmpl$3$6 = /* @__PURE__ */ template(`<span class=dropdown-select-option-description>`), _tmpl$4$6 = /* @__PURE__ */ template(`<button class=dropdown-select-option type=button role=option><span class=dropdown-select-option-copy><span class=dropdown-select-option-label>`);
5779
+ var _tmpl$$7 = /* @__PURE__ */ template(`<div class=dropdown-select-menu role=listbox>`), _tmpl$2$7 = /* @__PURE__ */ template(`<div><button class=dropdown-select-trigger type=button aria-haspopup=listbox><span class=dropdown-select-value></span><span class=dropdown-select-caret aria-hidden=true>▾`), _tmpl$3$6 = /* @__PURE__ */ template(`<span class=dropdown-select-option-description>`), _tmpl$4$6 = /* @__PURE__ */ template(`<button class=dropdown-select-option type=button role=option><span class=dropdown-select-option-copy><span class=dropdown-select-option-label>`);
5085
5780
  const DropdownSelect = (props) => {
5086
5781
  const [open, setOpen] = createSignal(false);
5087
5782
  let rootRef;
@@ -5115,7 +5810,7 @@ const DropdownSelect = (props) => {
5115
5810
  return open();
5116
5811
  },
5117
5812
  get children() {
5118
- var _el$5 = _tmpl$$8();
5813
+ var _el$5 = _tmpl$$7();
5119
5814
  insert(_el$5, createComponent(For, {
5120
5815
  get each() {
5121
5816
  return props.options;
@@ -5131,254 +5826,44 @@ const DropdownSelect = (props) => {
5131
5826
  get when() {
5132
5827
  return option.description;
5133
5828
  },
5134
- get children() {
5135
- var _el$9 = _tmpl$3$6();
5136
- insert(_el$9, () => option.description);
5137
- return _el$9;
5138
- }
5139
- }), null);
5140
- createRenderEffect((_p$) => {
5141
- var _v$5 = !!(option.value === props.value), _v$6 = option.value === props.value;
5142
- _v$5 !== _p$.e && _el$6.classList.toggle("selected", _p$.e = _v$5);
5143
- _v$6 !== _p$.t && setAttribute(_el$6, "aria-selected", _p$.t = _v$6);
5144
- return _p$;
5145
- }, {
5146
- e: void 0,
5147
- t: void 0
5148
- });
5149
- return _el$6;
5150
- })()
5151
- }));
5152
- return _el$5;
5153
- }
5154
- }), null);
5155
- createRenderEffect((_p$) => {
5156
- var _v$ = `dropdown-select ${props.class || ""}`, _v$2 = open(), _v$3 = props.ariaLabel, _v$4 = !!open();
5157
- _v$ !== _p$.e && className(_el$, _p$.e = _v$);
5158
- _v$2 !== _p$.t && setAttribute(_el$2, "aria-expanded", _p$.t = _v$2);
5159
- _v$3 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$3);
5160
- _v$4 !== _p$.o && _el$4.classList.toggle("open", _p$.o = _v$4);
5161
- return _p$;
5162
- }, {
5163
- e: void 0,
5164
- t: void 0,
5165
- a: void 0,
5166
- o: void 0
5167
- });
5168
- return _el$;
5169
- })();
5170
- };
5171
- delegateEvents(["click"]);
5172
- var defaultAttributes = {
5173
- xmlns: "http://www.w3.org/2000/svg",
5174
- width: 24,
5175
- height: 24,
5176
- viewBox: "0 0 24 24",
5177
- fill: "none",
5178
- stroke: "currentColor",
5179
- "stroke-width": 2,
5180
- "stroke-linecap": "round",
5181
- "stroke-linejoin": "round"
5182
- };
5183
- var defaultAttributes_default = defaultAttributes;
5184
- var LucideContext = createContext({
5185
- size: 24,
5186
- color: "currentColor",
5187
- strokeWidth: 2,
5188
- absoluteStrokeWidth: false,
5189
- class: ""
5190
- });
5191
- var _tmpl$$7 = /* @__PURE__ */ template(`<svg>`);
5192
- var hasA11yProp = (props) => {
5193
- for (const prop in props) {
5194
- if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
5195
- return true;
5196
- }
5197
- }
5198
- return false;
5199
- };
5200
- var mergeClasses = (...classes) => classes.filter((className2, index, array) => {
5201
- return Boolean(className2) && className2.trim() !== "" && array.indexOf(className2) === index;
5202
- }).join(" ").trim();
5203
- var toCamelCase = (string) => string.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase());
5204
- var toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
5205
- var toPascalCase = (string) => {
5206
- const camelCase = toCamelCase(string);
5207
- return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
5208
- };
5209
- var Icon = (props) => {
5210
- const [localProps, rest] = splitProps(props, ["color", "size", "strokeWidth", "children", "class", "name", "iconNode", "absoluteStrokeWidth"]);
5211
- const globalProps = useContext(LucideContext);
5212
- return (() => {
5213
- var _el$ = _tmpl$$7();
5214
- spread(_el$, mergeProps(defaultAttributes_default, {
5215
- get width() {
5216
- return localProps.size ?? globalProps.size ?? defaultAttributes_default.width;
5217
- },
5218
- get height() {
5219
- return localProps.size ?? globalProps.size ?? defaultAttributes_default.height;
5220
- },
5221
- get stroke() {
5222
- return localProps.color ?? globalProps.color ?? defaultAttributes_default.stroke;
5223
- },
5224
- get ["stroke-width"]() {
5225
- return memo(() => (localProps.absoluteStrokeWidth ?? globalProps.absoluteStrokeWidth) === true)() ? Number(localProps.strokeWidth ?? globalProps.strokeWidth ?? defaultAttributes_default["stroke-width"]) * 24 / Number(localProps.size ?? globalProps.size) : Number(localProps.strokeWidth ?? globalProps.strokeWidth ?? defaultAttributes_default["stroke-width"]);
5226
- },
5227
- get ["class"]() {
5228
- return mergeClasses("lucide", "lucide-icon", globalProps.class, ...localProps.name != null ? [`lucide-${toKebabCase(toPascalCase(localProps.name))}`, `lucide-${toKebabCase(localProps.name)}`] : [], localProps.class);
5229
- },
5230
- get ["aria-hidden"]() {
5231
- return !localProps.children && !hasA11yProp(rest) ? "true" : void 0;
5232
- }
5233
- }, rest), true, true);
5234
- insert(_el$, createComponent(For, {
5235
- get each() {
5236
- return localProps.iconNode;
5237
- },
5238
- children: ([elementName, attrs]) => {
5239
- return createComponent(Dynamic, mergeProps({
5240
- component: elementName
5241
- }, attrs));
5829
+ get children() {
5830
+ var _el$9 = _tmpl$3$6();
5831
+ insert(_el$9, () => option.description);
5832
+ return _el$9;
5833
+ }
5834
+ }), null);
5835
+ createRenderEffect((_p$) => {
5836
+ var _v$5 = !!(option.value === props.value), _v$6 = option.value === props.value;
5837
+ _v$5 !== _p$.e && _el$6.classList.toggle("selected", _p$.e = _v$5);
5838
+ _v$6 !== _p$.t && setAttribute(_el$6, "aria-selected", _p$.t = _v$6);
5839
+ return _p$;
5840
+ }, {
5841
+ e: void 0,
5842
+ t: void 0
5843
+ });
5844
+ return _el$6;
5845
+ })()
5846
+ }));
5847
+ return _el$5;
5242
5848
  }
5243
- }));
5849
+ }), null);
5850
+ createRenderEffect((_p$) => {
5851
+ var _v$ = `dropdown-select ${props.class || ""}`, _v$2 = open(), _v$3 = props.ariaLabel, _v$4 = !!open();
5852
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
5853
+ _v$2 !== _p$.t && setAttribute(_el$2, "aria-expanded", _p$.t = _v$2);
5854
+ _v$3 !== _p$.a && setAttribute(_el$2, "aria-label", _p$.a = _v$3);
5855
+ _v$4 !== _p$.o && _el$4.classList.toggle("open", _p$.o = _v$4);
5856
+ return _p$;
5857
+ }, {
5858
+ e: void 0,
5859
+ t: void 0,
5860
+ a: void 0,
5861
+ o: void 0
5862
+ });
5244
5863
  return _el$;
5245
5864
  })();
5246
5865
  };
5247
- var Icon_default = Icon;
5248
- var iconNode$8 = [["path", {
5249
- d: "M12 7v14",
5250
- key: "1akyts"
5251
- }], ["path", {
5252
- d: "M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",
5253
- key: "ruj8y"
5254
- }]];
5255
- var BookOpen = (props) => createComponent(Icon_default, mergeProps(props, {
5256
- iconNode: iconNode$8,
5257
- name: "book-open"
5258
- }));
5259
- var book_open_default = BookOpen;
5260
- var iconNode$7 = [["rect", {
5261
- width: "8",
5262
- height: "4",
5263
- x: "8",
5264
- y: "2",
5265
- rx: "1",
5266
- ry: "1",
5267
- key: "tgr4d6"
5268
- }], ["path", {
5269
- d: "M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",
5270
- key: "116196"
5271
- }], ["path", {
5272
- d: "M12 11h4",
5273
- key: "1jrz19"
5274
- }], ["path", {
5275
- d: "M12 16h4",
5276
- key: "n85exb"
5277
- }], ["path", {
5278
- d: "M8 11h.01",
5279
- key: "1dfujw"
5280
- }], ["path", {
5281
- d: "M8 16h.01",
5282
- key: "18s6g9"
5283
- }]];
5284
- var ClipboardList = (props) => createComponent(Icon_default, mergeProps(props, {
5285
- iconNode: iconNode$7,
5286
- name: "clipboard-list"
5287
- }));
5288
- var clipboard_list_default = ClipboardList;
5289
- var iconNode$6 = [["circle", {
5290
- cx: "12",
5291
- cy: "12",
5292
- r: "10",
5293
- key: "1mglay"
5294
- }], ["path", {
5295
- d: "M12 6v6l4 2",
5296
- key: "mmk7yg"
5297
- }]];
5298
- var Clock = (props) => createComponent(Icon_default, mergeProps(props, {
5299
- iconNode: iconNode$6,
5300
- name: "clock"
5301
- }));
5302
- var clock_default = Clock;
5303
- var iconNode$5 = [["path", {
5304
- d: "M12 15V3",
5305
- key: "m9g1x1"
5306
- }], ["path", {
5307
- d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",
5308
- key: "ih7n3h"
5309
- }], ["path", {
5310
- d: "m7 10 5 5 5-5",
5311
- key: "brsn70"
5312
- }]];
5313
- var Download = (props) => createComponent(Icon_default, mergeProps(props, {
5314
- iconNode: iconNode$5,
5315
- name: "download"
5316
- }));
5317
- var download_default = Download;
5318
- var iconNode$4 = [["circle", {
5319
- cx: "12",
5320
- cy: "12",
5321
- r: "10",
5322
- key: "1mglay"
5323
- }], ["path", {
5324
- d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",
5325
- key: "13o1zl"
5326
- }], ["path", {
5327
- d: "M2 12h20",
5328
- key: "9i4pu4"
5329
- }]];
5330
- var Globe = (props) => createComponent(Icon_default, mergeProps(props, {
5331
- iconNode: iconNode$4,
5332
- name: "globe"
5333
- }));
5334
- var globe_default = Globe;
5335
- var iconNode$3 = [["path", {
5336
- d: "m21 21-4.34-4.34",
5337
- key: "14j7rj"
5338
- }], ["circle", {
5339
- cx: "11",
5340
- cy: "11",
5341
- r: "8",
5342
- key: "4ej97u"
5343
- }]];
5344
- var Search = (props) => createComponent(Icon_default, mergeProps(props, {
5345
- iconNode: iconNode$3,
5346
- name: "search"
5347
- }));
5348
- var search_default = Search;
5349
- var iconNode$2 = [["path", {
5350
- d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
5351
- key: "r04s7s"
5352
- }]];
5353
- var Star = (props) => createComponent(Icon_default, mergeProps(props, {
5354
- iconNode: iconNode$2,
5355
- name: "star"
5356
- }));
5357
- var star_default = Star;
5358
- var iconNode$1 = [["path", {
5359
- d: "M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",
5360
- key: "vktsd0"
5361
- }], ["circle", {
5362
- cx: "7.5",
5363
- cy: "7.5",
5364
- r: ".5",
5365
- fill: "currentColor",
5366
- key: "kqv944"
5367
- }]];
5368
- var Tag = (props) => createComponent(Icon_default, mergeProps(props, {
5369
- iconNode: iconNode$1,
5370
- name: "tag"
5371
- }));
5372
- var tag_default = Tag;
5373
- var iconNode = [["path", {
5374
- d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",
5375
- key: "1xq2db"
5376
- }]];
5377
- var Zap = (props) => createComponent(Icon_default, mergeProps(props, {
5378
- iconNode,
5379
- name: "zap"
5380
- }));
5381
- var zap_default = Zap;
5866
+ delegateEvents(["click"]);
5382
5867
  const BUNDLED_KIT_IDS = /* @__PURE__ */ new Set([
5383
5868
  "research-collect",
5384
5869
  "price-scout",
@@ -5528,7 +6013,7 @@ function renderKitPrompt(kit, values) {
5528
6013
  (_, key) => values[key] ?? ""
5529
6014
  );
5530
6015
  }
5531
- var _tmpl$$6 = /* @__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$6 = /* @__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$5 = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$5 = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$5 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$5 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$4 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$4 = /* @__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$2 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$2 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$2 = /* @__PURE__ */ template(`<option>`), _tmpl$42$2 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
6016
+ var _tmpl$$6 = /* @__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$6 = /* @__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$5 = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$5 = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$5 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$5 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$5 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$4 = /* @__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$2 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$2 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$2 = /* @__PURE__ */ template(`<option>`), _tmpl$42$2 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
5532
6017
  const ICON_MAP = {
5533
6018
  BookOpen: book_open_default,
5534
6019
  Tag: tag_default,
@@ -6027,7 +6512,7 @@ const AutomationTab = (props) => {
6027
6512
  },
6028
6513
  get children() {
6029
6514
  return [(() => {
6030
- var _el$19 = _tmpl$7$4(), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling;
6515
+ var _el$19 = _tmpl$7$5(), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling;
6031
6516
  insert(_el$19, createComponent(zap_default, {
6032
6517
  size: 12
6033
6518
  }), _el$20);
@@ -6367,7 +6852,7 @@ const AutomationTab = (props) => {
6367
6852
  })();
6368
6853
  };
6369
6854
  delegateEvents(["click", "input", "keydown", "contextmenu"]);
6370
- var _tmpl$$5 = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$5 = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$4 = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=agent-section-title>Recent page changes`), _tmpl$5$4 = /* @__PURE__ */ template(`<div class=page-diff-list>`), _tmpl$6$4 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$3 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$8$3 = /* @__PURE__ */ template(`<div class=page-diff-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=page-diff-content><div class=page-diff-time></div><div class=page-diff-summary>`);
6855
+ var _tmpl$$5 = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$5 = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$4 = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=agent-section-title>Recent page changes`), _tmpl$5$4 = /* @__PURE__ */ template(`<div class=page-diff-list>`), _tmpl$6$4 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$4 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$8$3 = /* @__PURE__ */ template(`<div class=page-diff-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=page-diff-content><div class=page-diff-time></div><div class=page-diff-summary>`);
6371
6856
  const PageDiffTimeline = () => {
6372
6857
  const {
6373
6858
  activeTab
@@ -6464,7 +6949,7 @@ const PageDiffTimeline = () => {
6464
6949
  return i() < bursts().length - 1;
6465
6950
  },
6466
6951
  get children() {
6467
- return _tmpl$7$3();
6952
+ return _tmpl$7$4();
6468
6953
  }
6469
6954
  }), null);
6470
6955
  insert(_el$10, () => new Date(burst.detectedAt).toLocaleString());
@@ -6481,7 +6966,7 @@ const PageDiffTimeline = () => {
6481
6966
  })();
6482
6967
  };
6483
6968
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
6484
- 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(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$3 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$3 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$8$2 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$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></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$0$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$1$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$10$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"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$11$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$12$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><button class=history-clear-btn>Clear</button></div><div class=history-list>`), _tmpl$13$1 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$15$1 = /* @__PURE__ */ template(`<span>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$17$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$18$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$19$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$20$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$21$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$22$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$23$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$27$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><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$29$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$30$1 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$34$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$35$1 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$36$1 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$37$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$38$1 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$39$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$40$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$41$1 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$42$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$43 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$44 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$46 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$47 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$51 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$52 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$53 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$54 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$55 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$56 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$57 = /* @__PURE__ */ template(`<div>`), _tmpl$58 = /* @__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$59 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
6969
+ 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(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$3 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$3 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$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$8$2 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$2 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$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></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$1$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-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-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$10$2 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$11$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"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$12$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$13$1 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><button class=history-clear-btn>Clear</button></div><div class=history-list>`), _tmpl$14$1 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$16$1 = /* @__PURE__ */ template(`<span>`), _tmpl$17$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$18$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$19$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$20$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$21$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$22$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$23$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$24$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$28$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><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$30$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$31$1 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$34$1 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$35$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$36$1 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$38$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$39$1 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$40$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$41$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$42$1 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$43 = /* @__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$44 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$47 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$53 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$54 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$55 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$56 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$57 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$58 = /* @__PURE__ */ template(`<div>`), _tmpl$59 = /* @__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$60 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$61 = /* @__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$62 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
6485
6970
  const UNSORTED_FOLDER = {
6486
6971
  id: "unsorted",
6487
6972
  name: "Unsorted",
@@ -6564,6 +7049,8 @@ const Sidebar = (props) => {
6564
7049
  saveBookmark,
6565
7050
  updateBookmark,
6566
7051
  removeBookmark,
7052
+ exportHtml,
7053
+ exportJson,
6567
7054
  createFolderWithSummary,
6568
7055
  removeFolder,
6569
7056
  renameFolder
@@ -6743,6 +7230,8 @@ ${contextBlock}` : contextBlock);
6743
7230
  const [newFolderName, setNewFolderName] = createSignal("");
6744
7231
  const [newFolderSummary, setNewFolderSummary] = createSignal("");
6745
7232
  const [bookmarkSearchQuery, setBookmarkSearchQuery] = createSignal("");
7233
+ const [bookmarkExportMessage, setBookmarkExportMessage] = createSignal("");
7234
+ const [bookmarkExporting, setBookmarkExporting] = createSignal(false);
6746
7235
  const [editingFolderId, setEditingFolderId] = createSignal(null);
6747
7236
  const [editingFolderName, setEditingFolderName] = createSignal("");
6748
7237
  const [editingFolderSummary, setEditingFolderSummary] = createSignal("");
@@ -7019,6 +7508,24 @@ ${contextBlock}` : contextBlock);
7019
7508
  setEditingFolderSummary("");
7020
7509
  }
7021
7510
  };
7511
+ const handleExportBookmarks = async (format) => {
7512
+ setBookmarkExporting(true);
7513
+ setBookmarkExportMessage("");
7514
+ try {
7515
+ const result = format === "json" ? await exportJson() : await exportHtml({
7516
+ includeNotes: format === "html-with-notes"
7517
+ });
7518
+ if (!result) {
7519
+ setBookmarkExportMessage("Export canceled.");
7520
+ return;
7521
+ }
7522
+ setBookmarkExportMessage(`Exported ${result.count} bookmarks to ${result.filePath}`);
7523
+ } catch (error) {
7524
+ setBookmarkExportMessage(error instanceof Error ? error.message : "Could not export bookmarks.");
7525
+ } finally {
7526
+ setBookmarkExporting(false);
7527
+ }
7528
+ };
7022
7529
  const toggleFolderExpanded = (folderId) => {
7023
7530
  setExpandedFolderIds((current) => current.includes(folderId) ? current.filter((id) => id !== folderId) : [...current, folderId]);
7024
7531
  };
@@ -7036,9 +7543,9 @@ ${contextBlock}` : contextBlock);
7036
7543
  return props.forceOpen || sidebarOpen2();
7037
7544
  },
7038
7545
  get children() {
7039
- var _el$9 = _tmpl$27$1(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$10.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$1.nextSibling, _el$16 = _el$15.firstChild;
7546
+ var _el$9 = _tmpl$28$1(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$10.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$1.nextSibling, _el$16 = _el$15.firstChild;
7040
7547
  _el$16.firstChild;
7041
- var _el$19 = _el$16.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling, _el$23 = _el$22.nextSibling, _el$24 = _el$23.nextSibling, _el$25 = _el$15.nextSibling, _el$104 = _el$25.firstChild;
7548
+ var _el$19 = _el$16.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling, _el$23 = _el$22.nextSibling, _el$24 = _el$23.nextSibling, _el$25 = _el$15.nextSibling, _el$111 = _el$25.firstChild;
7042
7549
  _el$0.$$pointerdown = startResize;
7043
7550
  setAttribute(_el$11, "src", vesselLogo);
7044
7551
  addEventListener(_el$13, "click", clearHistory, true);
@@ -7069,7 +7576,7 @@ ${contextBlock}` : contextBlock);
7069
7576
  return sidebarTab() === "supervisor";
7070
7577
  },
7071
7578
  get children() {
7072
- var _el$26 = _tmpl$7$2(), _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$31 = _el$28.nextSibling, _el$32 = _el$27.nextSibling, _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling, _el$36 = _el$32.nextSibling, _el$38 = _el$36.nextSibling;
7579
+ var _el$26 = _tmpl$7$3(), _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$31 = _el$28.nextSibling, _el$32 = _el$27.nextSibling, _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling, _el$36 = _el$32.nextSibling, _el$38 = _el$36.nextSibling;
7073
7580
  _el$38.firstChild;
7074
7581
  insert(_el$30, () => runtimeState2().supervisor.paused ? "Agent is paused" : "Agent is live");
7075
7582
  insert(_el$31, () => runtimeState2().supervisor.paused ? "Paused" : "Running");
@@ -7104,7 +7611,7 @@ ${contextBlock}` : contextBlock);
7104
7611
  return runtimeState2().supervisor.pendingApprovals.length > 0;
7105
7612
  },
7106
7613
  get fallback() {
7107
- return _tmpl$28$1();
7614
+ return _tmpl$29$1();
7108
7615
  },
7109
7616
  get children() {
7110
7617
  return [_tmpl$5$3(), createComponent(For, {
@@ -7112,13 +7619,13 @@ ${contextBlock}` : contextBlock);
7112
7619
  return runtimeState2().supervisor.pendingApprovals;
7113
7620
  },
7114
7621
  children: (approval) => (() => {
7115
- var _el$122 = _tmpl$29$1(), _el$123 = _el$122.firstChild, _el$124 = _el$123.nextSibling, _el$125 = _el$124.nextSibling, _el$126 = _el$125.nextSibling, _el$127 = _el$126.nextSibling, _el$128 = _el$127.firstChild, _el$129 = _el$128.nextSibling;
7116
- insert(_el$124, () => approval.name);
7117
- insert(_el$125, () => approval.argsSummary);
7118
- insert(_el$126, () => approval.reason);
7119
- _el$128.$$click = () => void resolveApproval(approval.id, true);
7120
- _el$129.$$click = () => void resolveApproval(approval.id, false);
7121
- return _el$122;
7622
+ var _el$129 = _tmpl$30$1(), _el$130 = _el$129.firstChild, _el$131 = _el$130.nextSibling, _el$132 = _el$131.nextSibling, _el$133 = _el$132.nextSibling, _el$134 = _el$133.nextSibling, _el$135 = _el$134.firstChild, _el$136 = _el$135.nextSibling;
7623
+ insert(_el$131, () => approval.name);
7624
+ insert(_el$132, () => approval.argsSummary);
7625
+ insert(_el$133, () => approval.reason);
7626
+ _el$135.$$click = () => void resolveApproval(approval.id, true);
7627
+ _el$136.$$click = () => void resolveApproval(approval.id, false);
7628
+ return _el$129;
7122
7629
  })()
7123
7630
  })];
7124
7631
  }
@@ -7142,7 +7649,7 @@ ${contextBlock}` : contextBlock);
7142
7649
  return recentActions().length > 0;
7143
7650
  },
7144
7651
  get fallback() {
7145
- return _tmpl$30$1();
7652
+ return _tmpl$31$1();
7146
7653
  },
7147
7654
  get children() {
7148
7655
  return createComponent(Show, {
@@ -7150,7 +7657,7 @@ ${contextBlock}` : contextBlock);
7150
7657
  return actionsExpanded();
7151
7658
  },
7152
7659
  get fallback() {
7153
- return _tmpl$31$1();
7660
+ return _tmpl$32$1();
7154
7661
  },
7155
7662
  get children() {
7156
7663
  return createComponent(For, {
@@ -7158,32 +7665,32 @@ ${contextBlock}` : contextBlock);
7158
7665
  return recentActions();
7159
7666
  },
7160
7667
  children: (action) => (() => {
7161
- var _el$132 = _tmpl$34$1(), _el$133 = _el$132.firstChild, _el$134 = _el$133.firstChild, _el$135 = _el$134.nextSibling, _el$136 = _el$133.nextSibling;
7162
- insert(_el$134, () => action.name);
7163
- insert(_el$135, () => action.status);
7164
- insert(_el$136, () => action.argsSummary);
7165
- insert(_el$132, createComponent(Show, {
7668
+ var _el$139 = _tmpl$35$1(), _el$140 = _el$139.firstChild, _el$141 = _el$140.firstChild, _el$142 = _el$141.nextSibling, _el$143 = _el$140.nextSibling;
7669
+ insert(_el$141, () => action.name);
7670
+ insert(_el$142, () => action.status);
7671
+ insert(_el$143, () => action.argsSummary);
7672
+ insert(_el$139, createComponent(Show, {
7166
7673
  get when() {
7167
7674
  return action.resultSummary;
7168
7675
  },
7169
7676
  get children() {
7170
- var _el$137 = _tmpl$32$1();
7171
- insert(_el$137, () => action.resultSummary);
7172
- return _el$137;
7677
+ var _el$144 = _tmpl$33$1();
7678
+ insert(_el$144, () => action.resultSummary);
7679
+ return _el$144;
7173
7680
  }
7174
7681
  }), null);
7175
- insert(_el$132, createComponent(Show, {
7682
+ insert(_el$139, createComponent(Show, {
7176
7683
  get when() {
7177
7684
  return action.error;
7178
7685
  },
7179
7686
  get children() {
7180
- var _el$138 = _tmpl$33$1();
7181
- insert(_el$138, () => action.error);
7182
- return _el$138;
7687
+ var _el$145 = _tmpl$34$1();
7688
+ insert(_el$145, () => action.error);
7689
+ return _el$145;
7183
7690
  }
7184
7691
  }), null);
7185
- createRenderEffect(() => className(_el$135, `agent-action-status ${action.status}`));
7186
- return _el$132;
7692
+ createRenderEffect(() => className(_el$142, `agent-action-status ${action.status}`));
7693
+ return _el$139;
7187
7694
  })()
7188
7695
  });
7189
7696
  }
@@ -7193,13 +7700,13 @@ ${contextBlock}` : contextBlock);
7193
7700
  createRenderEffect(() => _el$31.classList.toggle("paused", !!runtimeState2().supervisor.paused));
7194
7701
  return _el$26;
7195
7702
  }
7196
- }), _el$104);
7703
+ }), _el$111);
7197
7704
  insert(_el$25, createComponent(Show, {
7198
7705
  get when() {
7199
7706
  return sidebarTab() === "bookmarks";
7200
7707
  },
7201
7708
  get children() {
7202
- var _el$41 = _tmpl$0$2(), _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$44 = _el$43.firstChild, _el$45 = _el$44.nextSibling, _el$47 = _el$42.nextSibling, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling, _el$62 = _el$48.nextSibling, _el$63 = _el$62.firstChild, _el$64 = _el$63.firstChild, _el$65 = _el$64.nextSibling, _el$66 = _el$63.nextSibling, _el$67 = _el$62.nextSibling;
7709
+ var _el$41 = _tmpl$1$2(), _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$44 = _el$43.firstChild, _el$45 = _el$44.nextSibling, _el$47 = _el$42.nextSibling, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling, _el$51 = _el$50.firstChild, _el$52 = _el$51.nextSibling, _el$53 = _el$52.nextSibling, _el$55 = _el$48.nextSibling, _el$56 = _el$55.firstChild, _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling, _el$69 = _el$55.nextSibling, _el$70 = _el$69.firstChild, _el$71 = _el$70.firstChild, _el$72 = _el$71.nextSibling, _el$73 = _el$70.nextSibling, _el$74 = _el$69.nextSibling;
7203
7710
  insert(_el$45, (() => {
7204
7711
  var _c$2 = memo(() => !!normalizedBookmarkSearch());
7205
7712
  return () => _c$2() ? `${bookmarkMatchCount()} matches for "${bookmarkSearchQuery().trim()}"` : `${bookmarksState2().bookmarks.length} saved across ${bookmarkFolders().length} folders`;
@@ -7213,16 +7720,29 @@ ${contextBlock}` : contextBlock);
7213
7720
  }
7214
7721
  }), null);
7215
7722
  _el$47.$$input = (e) => setBookmarkSearchQuery(e.currentTarget.value);
7216
- _el$49.$$click = () => setBookmarkSaveExpanded((current) => !current);
7723
+ _el$51.$$click = () => void handleExportBookmarks("html");
7724
+ _el$52.$$click = () => void handleExportBookmarks("html-with-notes");
7725
+ _el$53.$$click = () => void handleExportBookmarks("json");
7217
7726
  insert(_el$48, createComponent(Show, {
7727
+ get when() {
7728
+ return bookmarkExportMessage();
7729
+ },
7730
+ get children() {
7731
+ var _el$54 = _tmpl$9$2();
7732
+ insert(_el$54, bookmarkExportMessage);
7733
+ return _el$54;
7734
+ }
7735
+ }), null);
7736
+ _el$56.$$click = () => setBookmarkSaveExpanded((current) => !current);
7737
+ insert(_el$55, createComponent(Show, {
7218
7738
  get when() {
7219
7739
  return bookmarkSaveExpanded();
7220
7740
  },
7221
7741
  get children() {
7222
- var _el$52 = _tmpl$9$2(), _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling, _el$55 = _el$54.nextSibling, _el$56 = _el$55.firstChild, _el$57 = _el$55.nextSibling, _el$58 = _el$57.nextSibling, _el$59 = _el$58.nextSibling, _el$60 = _el$59.nextSibling, _el$61 = _el$60.nextSibling;
7223
- insert(_el$53, () => currentTab()?.title || "No active page");
7224
- insert(_el$54, () => currentTab()?.url || "Open a page to save it here.");
7225
- insert(_el$55, createComponent(DropdownSelect, {
7742
+ var _el$59 = _tmpl$0$2(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling, _el$62 = _el$61.nextSibling, _el$63 = _el$62.firstChild, _el$64 = _el$62.nextSibling, _el$65 = _el$64.nextSibling, _el$66 = _el$65.nextSibling, _el$67 = _el$66.nextSibling, _el$68 = _el$67.nextSibling;
7743
+ insert(_el$60, () => currentTab()?.title || "No active page");
7744
+ insert(_el$61, () => currentTab()?.url || "Open a page to save it here.");
7745
+ insert(_el$62, createComponent(DropdownSelect, {
7226
7746
  "class": "bookmark-select",
7227
7747
  get value() {
7228
7748
  return selectedFolderId();
@@ -7232,37 +7752,37 @@ ${contextBlock}` : contextBlock);
7232
7752
  },
7233
7753
  ariaLabel: "Bookmark folder",
7234
7754
  onChange: (value) => setSelectedFolderId(value)
7235
- }), _el$56);
7236
- _el$56.$$click = () => void handleSaveBookmark();
7237
- _el$57.$$input = (e) => setBookmarkNote(e.currentTarget.value);
7238
- _el$58.$$input = (e) => setBookmarkIntent(e.currentTarget.value);
7239
- _el$59.$$input = (e) => setBookmarkExpectedContent(e.currentTarget.value);
7240
- _el$60.$$input = (e) => setBookmarkKeyFields(e.currentTarget.value);
7241
- _el$61.$$input = (e) => setBookmarkAgentHints(e.currentTarget.value);
7242
- createRenderEffect(() => _el$56.disabled = !currentTab()?.url);
7243
- createRenderEffect(() => _el$57.value = bookmarkNote());
7244
- createRenderEffect(() => _el$58.value = bookmarkIntent());
7245
- createRenderEffect(() => _el$59.value = bookmarkExpectedContent());
7246
- createRenderEffect(() => _el$60.value = bookmarkKeyFields());
7247
- createRenderEffect(() => _el$61.value = bookmarkAgentHints());
7248
- return _el$52;
7755
+ }), _el$63);
7756
+ _el$63.$$click = () => void handleSaveBookmark();
7757
+ _el$64.$$input = (e) => setBookmarkNote(e.currentTarget.value);
7758
+ _el$65.$$input = (e) => setBookmarkIntent(e.currentTarget.value);
7759
+ _el$66.$$input = (e) => setBookmarkExpectedContent(e.currentTarget.value);
7760
+ _el$67.$$input = (e) => setBookmarkKeyFields(e.currentTarget.value);
7761
+ _el$68.$$input = (e) => setBookmarkAgentHints(e.currentTarget.value);
7762
+ createRenderEffect(() => _el$63.disabled = !currentTab()?.url);
7763
+ createRenderEffect(() => _el$64.value = bookmarkNote());
7764
+ createRenderEffect(() => _el$65.value = bookmarkIntent());
7765
+ createRenderEffect(() => _el$66.value = bookmarkExpectedContent());
7766
+ createRenderEffect(() => _el$67.value = bookmarkKeyFields());
7767
+ createRenderEffect(() => _el$68.value = bookmarkAgentHints());
7768
+ return _el$59;
7249
7769
  }
7250
7770
  }), null);
7251
- _el$62.addEventListener("submit", handleCreateFolder);
7252
- _el$64.$$input = (e) => setNewFolderName(e.currentTarget.value);
7253
- _el$65.$$input = (e) => setNewFolderSummary(e.currentTarget.value);
7254
- insert(_el$67, createComponent(Show, {
7771
+ _el$69.addEventListener("submit", handleCreateFolder);
7772
+ _el$71.$$input = (e) => setNewFolderName(e.currentTarget.value);
7773
+ _el$72.$$input = (e) => setNewFolderSummary(e.currentTarget.value);
7774
+ insert(_el$74, createComponent(Show, {
7255
7775
  get when() {
7256
7776
  return filteredGroupedBookmarks().length > 0;
7257
7777
  },
7258
7778
  get fallback() {
7259
7779
  return (() => {
7260
- var _el$139 = _tmpl$35$1();
7261
- insert(_el$139, (() => {
7780
+ var _el$146 = _tmpl$36$1();
7781
+ insert(_el$146, (() => {
7262
7782
  var _c$5 = memo(() => !!normalizedBookmarkSearch());
7263
7783
  return () => _c$5() ? `No bookmarks matched "${bookmarkSearchQuery().trim()}".` : "No bookmarks saved yet.";
7264
7784
  })());
7265
- return _el$139;
7785
+ return _el$146;
7266
7786
  })();
7267
7787
  },
7268
7788
  get children() {
@@ -7271,100 +7791,100 @@ ${contextBlock}` : contextBlock);
7271
7791
  return filteredGroupedBookmarks();
7272
7792
  },
7273
7793
  children: (folder) => (() => {
7274
- var _el$140 = _tmpl$42$1(), _el$141 = _el$140.firstChild, _el$142 = _el$141.firstChild, _el$143 = _el$142.firstChild, _el$144 = _el$143.nextSibling, _el$145 = _el$144.firstChild, _el$146 = _el$145.nextSibling, _el$147 = _el$146.firstChild;
7275
- _el$141.$$keydown = (e) => {
7794
+ var _el$147 = _tmpl$43(), _el$148 = _el$147.firstChild, _el$149 = _el$148.firstChild, _el$150 = _el$149.firstChild, _el$151 = _el$150.nextSibling, _el$152 = _el$151.firstChild, _el$153 = _el$152.nextSibling, _el$154 = _el$153.firstChild;
7795
+ _el$148.$$keydown = (e) => {
7276
7796
  if (e.key === "Enter" || e.key === " ") {
7277
7797
  e.preventDefault();
7278
7798
  toggleFolderExpanded(folder.id);
7279
7799
  }
7280
7800
  };
7281
- _el$141.$$click = () => toggleFolderExpanded(folder.id);
7282
- insert(_el$145, () => folder.name);
7283
- insert(_el$146, () => folder.items.length, _el$147);
7284
- insert(_el$144, createComponent(Show, {
7801
+ _el$148.$$click = () => toggleFolderExpanded(folder.id);
7802
+ insert(_el$152, () => folder.name);
7803
+ insert(_el$153, () => folder.items.length, _el$154);
7804
+ insert(_el$151, createComponent(Show, {
7285
7805
  get when() {
7286
7806
  return folder.summary;
7287
7807
  },
7288
7808
  get children() {
7289
- var _el$148 = _tmpl$36$1();
7290
- insert(_el$148, () => folder.summary);
7291
- return _el$148;
7809
+ var _el$155 = _tmpl$37$1();
7810
+ insert(_el$155, () => folder.summary);
7811
+ return _el$155;
7292
7812
  }
7293
7813
  }), null);
7294
- insert(_el$141, createComponent(Show, {
7814
+ insert(_el$148, createComponent(Show, {
7295
7815
  get when() {
7296
7816
  return folder.id !== UNSORTED_FOLDER.id;
7297
7817
  },
7298
7818
  get children() {
7299
- var _el$149 = _tmpl$37$1(), _el$150 = _el$149.firstChild, _el$151 = _el$150.nextSibling;
7300
- _el$150.$$click = (e) => {
7819
+ var _el$156 = _tmpl$38$1(), _el$157 = _el$156.firstChild, _el$158 = _el$157.nextSibling;
7820
+ _el$157.$$click = (e) => {
7301
7821
  e.stopPropagation();
7302
7822
  setEditingFolderId(folder.id);
7303
7823
  setEditingFolderName(folder.name);
7304
7824
  setEditingFolderSummary(folder.summary || "");
7305
7825
  };
7306
- _el$151.$$click = (e) => {
7826
+ _el$158.$$click = (e) => {
7307
7827
  e.stopPropagation();
7308
7828
  setDeletingFolderId(folder.id);
7309
7829
  };
7310
- return _el$149;
7830
+ return _el$156;
7311
7831
  }
7312
7832
  }), null);
7313
- insert(_el$140, createComponent(Show, {
7833
+ insert(_el$147, createComponent(Show, {
7314
7834
  get when() {
7315
7835
  return deletingFolderId() === folder.id;
7316
7836
  },
7317
7837
  get children() {
7318
- var _el$152 = _tmpl$39$1(), _el$153 = _el$152.firstChild, _el$154 = _el$153.firstChild, _el$156 = _el$154.nextSibling;
7319
- _el$156.nextSibling;
7320
- var _el$157 = _el$153.nextSibling, _el$159 = _el$157.firstChild, _el$160 = _el$159.nextSibling;
7321
- insert(_el$153, () => folder.name, _el$156);
7322
- insert(_el$153, (() => {
7838
+ var _el$159 = _tmpl$40$1(), _el$160 = _el$159.firstChild, _el$161 = _el$160.firstChild, _el$163 = _el$161.nextSibling;
7839
+ _el$163.nextSibling;
7840
+ var _el$164 = _el$160.nextSibling, _el$166 = _el$164.firstChild, _el$167 = _el$166.nextSibling;
7841
+ insert(_el$160, () => folder.name, _el$163);
7842
+ insert(_el$160, (() => {
7323
7843
  var _c$6 = memo(() => folder.items.length > 0);
7324
7844
  return () => _c$6() ? ` This folder has ${folder.items.length} bookmark${folder.items.length === 1 ? "" : "s"}.` : "";
7325
7845
  })(), null);
7326
- insert(_el$157, createComponent(Show, {
7846
+ insert(_el$164, createComponent(Show, {
7327
7847
  get when() {
7328
7848
  return folder.items.length > 0;
7329
7849
  },
7330
7850
  get children() {
7331
- var _el$158 = _tmpl$38$1();
7332
- _el$158.$$click = () => void handleRemoveFolder(folder.id, false);
7333
- return _el$158;
7851
+ var _el$165 = _tmpl$39$1();
7852
+ _el$165.$$click = () => void handleRemoveFolder(folder.id, false);
7853
+ return _el$165;
7334
7854
  }
7335
- }), _el$159);
7336
- _el$159.$$click = () => void handleRemoveFolder(folder.id, true);
7337
- insert(_el$159, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
7338
- _el$160.$$click = () => setDeletingFolderId(null);
7339
- return _el$152;
7855
+ }), _el$166);
7856
+ _el$166.$$click = () => void handleRemoveFolder(folder.id, true);
7857
+ insert(_el$166, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
7858
+ _el$167.$$click = () => setDeletingFolderId(null);
7859
+ return _el$159;
7340
7860
  }
7341
7861
  }), null);
7342
- insert(_el$140, createComponent(Show, {
7862
+ insert(_el$147, createComponent(Show, {
7343
7863
  get when() {
7344
7864
  return editingFolderId() === folder.id;
7345
7865
  },
7346
7866
  get children() {
7347
- var _el$161 = _tmpl$40$1(), _el$162 = _el$161.firstChild, _el$163 = _el$162.firstChild, _el$164 = _el$163.nextSibling, _el$165 = _el$162.nextSibling, _el$166 = _el$165.nextSibling;
7348
- _el$163.$$input = (e) => setEditingFolderName(e.currentTarget.value);
7349
- _el$164.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
7350
- _el$165.$$click = () => void handleRenameFolder(folder.id);
7351
- _el$166.$$click = () => {
7867
+ var _el$168 = _tmpl$41$1(), _el$169 = _el$168.firstChild, _el$170 = _el$169.firstChild, _el$171 = _el$170.nextSibling, _el$172 = _el$169.nextSibling, _el$173 = _el$172.nextSibling;
7868
+ _el$170.$$input = (e) => setEditingFolderName(e.currentTarget.value);
7869
+ _el$171.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
7870
+ _el$172.$$click = () => void handleRenameFolder(folder.id);
7871
+ _el$173.$$click = () => {
7352
7872
  setEditingFolderId(null);
7353
7873
  setEditingFolderName("");
7354
7874
  setEditingFolderSummary("");
7355
7875
  };
7356
- createRenderEffect(() => _el$165.disabled = !editingFolderName().trim());
7357
- createRenderEffect(() => _el$163.value = editingFolderName());
7358
- createRenderEffect(() => _el$164.value = editingFolderSummary());
7359
- return _el$161;
7876
+ createRenderEffect(() => _el$172.disabled = !editingFolderName().trim());
7877
+ createRenderEffect(() => _el$170.value = editingFolderName());
7878
+ createRenderEffect(() => _el$171.value = editingFolderSummary());
7879
+ return _el$168;
7360
7880
  }
7361
7881
  }), null);
7362
- insert(_el$140, createComponent(Show, {
7882
+ insert(_el$147, createComponent(Show, {
7363
7883
  get when() {
7364
7884
  return isFolderExpanded(folder.id);
7365
7885
  },
7366
7886
  get fallback() {
7367
- return _tmpl$43();
7887
+ return _tmpl$44();
7368
7888
  },
7369
7889
  get children() {
7370
7890
  return createComponent(Show, {
@@ -7372,203 +7892,209 @@ ${contextBlock}` : contextBlock);
7372
7892
  return folder.items.length > 0;
7373
7893
  },
7374
7894
  get fallback() {
7375
- return _tmpl$44();
7895
+ return _tmpl$45();
7376
7896
  },
7377
7897
  get children() {
7378
- var _el$167 = _tmpl$41$1();
7379
- insert(_el$167, createComponent(For, {
7898
+ var _el$174 = _tmpl$42$1();
7899
+ insert(_el$174, createComponent(For, {
7380
7900
  get each() {
7381
7901
  return folder.items;
7382
7902
  },
7383
7903
  children: (bookmark) => (() => {
7384
- var _el$170 = _tmpl$51(), _el$171 = _el$170.firstChild, _el$172 = _el$171.firstChild, _el$173 = _el$172.nextSibling, _el$198 = _el$171.nextSibling, _el$199 = _el$198.firstChild, _el$200 = _el$199.nextSibling, _el$201 = _el$200.nextSibling;
7385
- _el$171.$$click = () => void createTab(bookmark.url);
7386
- insert(_el$172, () => bookmark.title || bookmark.url);
7387
- insert(_el$173, () => bookmark.url);
7388
- insert(_el$170, createComponent(Show, {
7904
+ var _el$177 = _tmpl$52(), _el$178 = _el$177.firstChild, _el$179 = _el$178.firstChild, _el$180 = _el$179.nextSibling, _el$205 = _el$178.nextSibling, _el$206 = _el$205.firstChild, _el$207 = _el$206.nextSibling, _el$208 = _el$207.nextSibling;
7905
+ _el$178.$$click = () => void createTab(bookmark.url);
7906
+ insert(_el$179, () => bookmark.title || bookmark.url);
7907
+ insert(_el$180, () => bookmark.url);
7908
+ insert(_el$177, createComponent(Show, {
7389
7909
  get when() {
7390
7910
  return bookmark.note;
7391
7911
  },
7392
7912
  get children() {
7393
- var _el$174 = _tmpl$45();
7394
- insert(_el$174, () => bookmark.note);
7395
- return _el$174;
7913
+ var _el$181 = _tmpl$46();
7914
+ insert(_el$181, () => bookmark.note);
7915
+ return _el$181;
7396
7916
  }
7397
- }), _el$198);
7398
- insert(_el$170, createComponent(Show, {
7917
+ }), _el$205);
7918
+ insert(_el$177, createComponent(Show, {
7399
7919
  get when() {
7400
7920
  return bookmark.intent || bookmark.expectedContent || (bookmark.keyFields?.length || 0) > 0 || (bookmark.agentHints && Object.keys(bookmark.agentHints).length || 0) > 0;
7401
7921
  },
7402
7922
  get children() {
7403
- var _el$175 = _tmpl$45();
7404
- insert(_el$175, createComponent(Show, {
7923
+ var _el$182 = _tmpl$46();
7924
+ insert(_el$182, createComponent(Show, {
7405
7925
  get when() {
7406
7926
  return bookmark.intent;
7407
7927
  },
7408
7928
  get children() {
7409
- var _el$176 = _tmpl$46(), _el$177 = _el$176.firstChild;
7410
- _el$177.nextSibling;
7411
- insert(_el$176, () => bookmark.intent, null);
7412
- return _el$176;
7929
+ var _el$183 = _tmpl$47(), _el$184 = _el$183.firstChild;
7930
+ _el$184.nextSibling;
7931
+ insert(_el$183, () => bookmark.intent, null);
7932
+ return _el$183;
7413
7933
  }
7414
7934
  }), null);
7415
- insert(_el$175, createComponent(Show, {
7935
+ insert(_el$182, createComponent(Show, {
7416
7936
  get when() {
7417
7937
  return bookmark.expectedContent;
7418
7938
  },
7419
7939
  get children() {
7420
- var _el$179 = _tmpl$47(), _el$180 = _el$179.firstChild;
7421
- _el$180.nextSibling;
7422
- insert(_el$179, () => bookmark.expectedContent, null);
7423
- return _el$179;
7940
+ var _el$186 = _tmpl$48(), _el$187 = _el$186.firstChild;
7941
+ _el$187.nextSibling;
7942
+ insert(_el$186, () => bookmark.expectedContent, null);
7943
+ return _el$186;
7424
7944
  }
7425
7945
  }), null);
7426
- insert(_el$175, createComponent(Show, {
7946
+ insert(_el$182, createComponent(Show, {
7427
7947
  get when() {
7428
7948
  return (bookmark.keyFields?.length || 0) > 0;
7429
7949
  },
7430
7950
  get children() {
7431
- var _el$182 = _tmpl$48(), _el$183 = _el$182.firstChild;
7432
- _el$183.nextSibling;
7433
- insert(_el$182, () => bookmark.keyFields?.join(", "), null);
7434
- return _el$182;
7951
+ var _el$189 = _tmpl$49(), _el$190 = _el$189.firstChild;
7952
+ _el$190.nextSibling;
7953
+ insert(_el$189, () => bookmark.keyFields?.join(", "), null);
7954
+ return _el$189;
7435
7955
  }
7436
7956
  }), null);
7437
- insert(_el$175, createComponent(Show, {
7957
+ insert(_el$182, createComponent(Show, {
7438
7958
  get when() {
7439
7959
  return memo(() => !!bookmark.agentHints)() && Object.keys(bookmark.agentHints).length > 0;
7440
7960
  },
7441
7961
  get children() {
7442
- var _el$185 = _tmpl$49(), _el$186 = _el$185.firstChild;
7443
- _el$186.nextSibling;
7444
- insert(_el$185, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
7445
- return _el$185;
7962
+ var _el$192 = _tmpl$50(), _el$193 = _el$192.firstChild;
7963
+ _el$193.nextSibling;
7964
+ insert(_el$192, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
7965
+ return _el$192;
7446
7966
  }
7447
7967
  }), null);
7448
- return _el$175;
7968
+ return _el$182;
7449
7969
  }
7450
- }), _el$198);
7451
- insert(_el$170, createComponent(Show, {
7970
+ }), _el$205);
7971
+ insert(_el$177, createComponent(Show, {
7452
7972
  get when() {
7453
7973
  return editingBookmarkId() === bookmark.id;
7454
7974
  },
7455
7975
  get children() {
7456
- var _el$188 = _tmpl$50(), _el$189 = _el$188.firstChild, _el$190 = _el$189.nextSibling, _el$191 = _el$190.nextSibling, _el$192 = _el$191.nextSibling, _el$193 = _el$192.nextSibling, _el$194 = _el$193.nextSibling, _el$195 = _el$194.nextSibling, _el$196 = _el$195.firstChild, _el$197 = _el$196.nextSibling;
7457
- _el$189.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
7458
- _el$190.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
7459
- _el$191.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
7460
- _el$192.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
7461
- _el$193.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
7462
- _el$194.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
7463
- _el$196.$$click = () => void handleUpdateBookmark(bookmark.id);
7464
- _el$197.$$click = resetBookmarkEditor;
7465
- createRenderEffect(() => _el$189.value = editingBookmarkTitle());
7466
- createRenderEffect(() => _el$190.value = editingBookmarkNote());
7467
- createRenderEffect(() => _el$191.value = editingBookmarkIntent());
7468
- createRenderEffect(() => _el$192.value = editingBookmarkExpectedContent());
7469
- createRenderEffect(() => _el$193.value = editingBookmarkKeyFields());
7470
- createRenderEffect(() => _el$194.value = editingBookmarkAgentHints());
7471
- return _el$188;
7976
+ var _el$195 = _tmpl$51(), _el$196 = _el$195.firstChild, _el$197 = _el$196.nextSibling, _el$198 = _el$197.nextSibling, _el$199 = _el$198.nextSibling, _el$200 = _el$199.nextSibling, _el$201 = _el$200.nextSibling, _el$202 = _el$201.nextSibling, _el$203 = _el$202.firstChild, _el$204 = _el$203.nextSibling;
7977
+ _el$196.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
7978
+ _el$197.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
7979
+ _el$198.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
7980
+ _el$199.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
7981
+ _el$200.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
7982
+ _el$201.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
7983
+ _el$203.$$click = () => void handleUpdateBookmark(bookmark.id);
7984
+ _el$204.$$click = resetBookmarkEditor;
7985
+ createRenderEffect(() => _el$196.value = editingBookmarkTitle());
7986
+ createRenderEffect(() => _el$197.value = editingBookmarkNote());
7987
+ createRenderEffect(() => _el$198.value = editingBookmarkIntent());
7988
+ createRenderEffect(() => _el$199.value = editingBookmarkExpectedContent());
7989
+ createRenderEffect(() => _el$200.value = editingBookmarkKeyFields());
7990
+ createRenderEffect(() => _el$201.value = editingBookmarkAgentHints());
7991
+ return _el$195;
7472
7992
  }
7473
- }), _el$198);
7474
- insert(_el$199, () => formatBookmarkDate(bookmark.savedAt));
7475
- _el$200.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
7476
- insert(_el$200, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
7477
- _el$201.$$click = () => {
7993
+ }), _el$205);
7994
+ insert(_el$206, () => formatBookmarkDate(bookmark.savedAt));
7995
+ _el$207.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
7996
+ insert(_el$207, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
7997
+ _el$208.$$click = () => {
7478
7998
  if (editingBookmarkId() === bookmark.id) {
7479
7999
  resetBookmarkEditor();
7480
8000
  }
7481
8001
  void removeBookmark(bookmark.id);
7482
8002
  };
7483
- createRenderEffect(() => setAttribute(_el$170, "data-bookmark-id", bookmark.id));
7484
- return _el$170;
8003
+ createRenderEffect(() => setAttribute(_el$177, "data-bookmark-id", bookmark.id));
8004
+ return _el$177;
7485
8005
  })()
7486
8006
  }));
7487
- return _el$167;
8007
+ return _el$174;
7488
8008
  }
7489
8009
  });
7490
8010
  }
7491
8011
  }), null);
7492
- createRenderEffect(() => _el$143.classList.toggle("expanded", !!isFolderExpanded(folder.id)));
7493
- return _el$140;
8012
+ createRenderEffect(() => _el$150.classList.toggle("expanded", !!isFolderExpanded(folder.id)));
8013
+ return _el$147;
7494
8014
  })()
7495
8015
  });
7496
8016
  }
7497
8017
  }));
7498
8018
  createRenderEffect((_p$) => {
7499
- var _v$ = !!bookmarkSaveExpanded(), _v$2 = !newFolderName().trim();
7500
- _v$ !== _p$.e && _el$51.classList.toggle("expanded", _p$.e = _v$);
7501
- _v$2 !== _p$.t && (_el$66.disabled = _p$.t = _v$2);
8019
+ var _v$ = bookmarkExporting(), _v$2 = bookmarkExporting(), _v$3 = bookmarkExporting(), _v$4 = !!bookmarkSaveExpanded(), _v$5 = !newFolderName().trim();
8020
+ _v$ !== _p$.e && (_el$51.disabled = _p$.e = _v$);
8021
+ _v$2 !== _p$.t && (_el$52.disabled = _p$.t = _v$2);
8022
+ _v$3 !== _p$.a && (_el$53.disabled = _p$.a = _v$3);
8023
+ _v$4 !== _p$.o && _el$58.classList.toggle("expanded", _p$.o = _v$4);
8024
+ _v$5 !== _p$.i && (_el$73.disabled = _p$.i = _v$5);
7502
8025
  return _p$;
7503
8026
  }, {
7504
8027
  e: void 0,
7505
- t: void 0
8028
+ t: void 0,
8029
+ a: void 0,
8030
+ o: void 0,
8031
+ i: void 0
7506
8032
  });
7507
8033
  createRenderEffect(() => _el$47.value = bookmarkSearchQuery());
7508
- createRenderEffect(() => _el$64.value = newFolderName());
7509
- createRenderEffect(() => _el$65.value = newFolderSummary());
8034
+ createRenderEffect(() => _el$71.value = newFolderName());
8035
+ createRenderEffect(() => _el$72.value = newFolderSummary());
7510
8036
  return _el$41;
7511
8037
  }
7512
- }), _el$104);
8038
+ }), _el$111);
7513
8039
  insert(_el$25, createComponent(Show, {
7514
8040
  get when() {
7515
8041
  return sidebarTab() === "checkpoints";
7516
8042
  },
7517
8043
  get children() {
7518
- var _el$68 = _tmpl$10$2(), _el$69 = _el$68.firstChild, _el$70 = _el$69.firstChild, _el$71 = _el$70.firstChild, _el$72 = _el$71.nextSibling, _el$73 = _el$69.nextSibling, _el$74 = _el$73.firstChild, _el$75 = _el$74.firstChild, _el$76 = _el$75.nextSibling, _el$77 = _el$76.nextSibling;
7519
- _el$74.nextSibling;
7520
- insert(_el$72, (() => {
8044
+ var _el$75 = _tmpl$11$2(), _el$76 = _el$75.firstChild, _el$77 = _el$76.firstChild, _el$78 = _el$77.firstChild, _el$79 = _el$78.nextSibling, _el$80 = _el$76.nextSibling, _el$81 = _el$80.firstChild, _el$82 = _el$81.firstChild, _el$83 = _el$82.nextSibling, _el$84 = _el$83.nextSibling;
8045
+ _el$81.nextSibling;
8046
+ insert(_el$79, (() => {
7521
8047
  var _c$3 = memo(() => recentCheckpoints().length > 0);
7522
8048
  return () => _c$3() ? `${recentCheckpoints().length} saved snapshots` : "Save and restore session snapshots";
7523
8049
  })());
7524
- _el$75.$$input = (e) => setCheckpointName(e.currentTarget.value);
7525
- _el$76.$$input = (e) => setCheckpointNote(e.currentTarget.value);
7526
- _el$77.$$click = async () => {
8050
+ _el$82.$$input = (e) => setCheckpointName(e.currentTarget.value);
8051
+ _el$83.$$input = (e) => setCheckpointNote(e.currentTarget.value);
8052
+ _el$84.$$click = async () => {
7527
8053
  const name = checkpointName().trim();
7528
8054
  await createCheckpoint(name || void 0, checkpointNote() || void 0);
7529
8055
  setCheckpointName("");
7530
8056
  setCheckpointNote("");
7531
8057
  };
7532
- insert(_el$73, createComponent(Show, {
8058
+ insert(_el$80, createComponent(Show, {
7533
8059
  get when() {
7534
8060
  return recentCheckpoints().length > 0;
7535
8061
  },
7536
8062
  get fallback() {
7537
- return _tmpl$52();
8063
+ return _tmpl$53();
7538
8064
  },
7539
8065
  get children() {
7540
- var _el$79 = _tmpl$1$2();
7541
- insert(_el$79, createComponent(For, {
8066
+ var _el$86 = _tmpl$10$2();
8067
+ insert(_el$86, createComponent(For, {
7542
8068
  get each() {
7543
8069
  return recentCheckpoints();
7544
8070
  },
7545
8071
  children: (checkpoint, i) => (() => {
7546
- var _el$203 = _tmpl$54(), _el$204 = _el$203.firstChild, _el$205 = _el$204.firstChild, _el$207 = _el$204.nextSibling, _el$208 = _el$207.firstChild, _el$209 = _el$208.nextSibling, _el$210 = _el$209.nextSibling, _el$211 = _el$210.nextSibling;
7547
- insert(_el$204, createComponent(Show, {
8072
+ var _el$210 = _tmpl$55(), _el$211 = _el$210.firstChild, _el$212 = _el$211.firstChild, _el$214 = _el$211.nextSibling, _el$215 = _el$214.firstChild, _el$216 = _el$215.nextSibling, _el$217 = _el$216.nextSibling, _el$218 = _el$217.nextSibling;
8073
+ insert(_el$211, createComponent(Show, {
7548
8074
  get when() {
7549
8075
  return i() < recentCheckpoints().length - 1;
7550
8076
  },
7551
8077
  get children() {
7552
- return _tmpl$53();
8078
+ return _tmpl$54();
7553
8079
  }
7554
8080
  }), null);
7555
- insert(_el$208, () => checkpoint.name);
7556
- insert(_el$209, () => new Date(checkpoint.createdAt).toLocaleString());
7557
- _el$210.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
7558
- _el$211.$$click = () => void restoreCheckpoint(checkpoint.id);
7559
- createRenderEffect(() => _el$205.classList.toggle("latest", !!(i() === 0)));
7560
- createRenderEffect(() => _el$210.value = checkpoint.note || "");
7561
- return _el$203;
8081
+ insert(_el$215, () => checkpoint.name);
8082
+ insert(_el$216, () => new Date(checkpoint.createdAt).toLocaleString());
8083
+ _el$217.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
8084
+ _el$218.$$click = () => void restoreCheckpoint(checkpoint.id);
8085
+ createRenderEffect(() => _el$212.classList.toggle("latest", !!(i() === 0)));
8086
+ createRenderEffect(() => _el$217.value = checkpoint.note || "");
8087
+ return _el$210;
7562
8088
  })()
7563
8089
  }));
7564
- return _el$79;
8090
+ return _el$86;
7565
8091
  }
7566
8092
  }), null);
7567
- createRenderEffect(() => _el$75.value = checkpointName());
7568
- createRenderEffect(() => _el$76.value = checkpointNote());
7569
- return _el$68;
8093
+ createRenderEffect(() => _el$82.value = checkpointName());
8094
+ createRenderEffect(() => _el$83.value = checkpointNote());
8095
+ return _el$75;
7570
8096
  }
7571
- }), _el$104);
8097
+ }), _el$111);
7572
8098
  insert(_el$25, createComponent(Show, {
7573
8099
  get when() {
7574
8100
  return sidebarTab() === "automation";
@@ -7578,67 +8104,67 @@ ${contextBlock}` : contextBlock);
7578
8104
  onRun: () => setSidebarTab("supervisor")
7579
8105
  });
7580
8106
  }
7581
- }), _el$104);
8107
+ }), _el$111);
7582
8108
  insert(_el$25, createComponent(Show, {
7583
8109
  get when() {
7584
8110
  return sidebarTab() === "history";
7585
8111
  },
7586
8112
  get children() {
7587
- var _el$80 = _tmpl$12$2(), _el$81 = _el$80.firstChild, _el$82 = _el$81.firstChild, _el$83 = _el$82.nextSibling, _el$84 = _el$81.nextSibling;
7588
- _el$83.$$click = async () => {
8113
+ var _el$87 = _tmpl$13$1(), _el$88 = _el$87.firstChild, _el$89 = _el$88.firstChild, _el$90 = _el$89.nextSibling, _el$91 = _el$88.nextSibling;
8114
+ _el$90.$$click = async () => {
7589
8115
  await history.clear();
7590
8116
  };
7591
- insert(_el$84, createComponent(For, {
8117
+ insert(_el$91, createComponent(For, {
7592
8118
  get each() {
7593
8119
  return history.historyState().entries;
7594
8120
  },
7595
8121
  children: (entry) => (() => {
7596
- var _el$212 = _tmpl$55(), _el$213 = _el$212.firstChild, _el$214 = _el$213.nextSibling, _el$215 = _el$214.nextSibling;
7597
- _el$212.$$click = () => createTab(entry.url);
7598
- insert(_el$213, () => entry.title || entry.url);
7599
- insert(_el$214, () => entry.url);
7600
- insert(_el$215, () => new Date(entry.visitedAt).toLocaleString());
7601
- return _el$212;
8122
+ var _el$219 = _tmpl$56(), _el$220 = _el$219.firstChild, _el$221 = _el$220.nextSibling, _el$222 = _el$221.nextSibling;
8123
+ _el$219.$$click = () => createTab(entry.url);
8124
+ insert(_el$220, () => entry.title || entry.url);
8125
+ insert(_el$221, () => entry.url);
8126
+ insert(_el$222, () => new Date(entry.visitedAt).toLocaleString());
8127
+ return _el$219;
7602
8128
  })()
7603
8129
  }), null);
7604
- insert(_el$84, createComponent(Show, {
8130
+ insert(_el$91, createComponent(Show, {
7605
8131
  get when() {
7606
8132
  return history.historyState().entries.length === 0;
7607
8133
  },
7608
8134
  get children() {
7609
- return _tmpl$11$2();
8135
+ return _tmpl$12$2();
7610
8136
  }
7611
8137
  }), null);
7612
- return _el$80;
8138
+ return _el$87;
7613
8139
  }
7614
- }), _el$104);
8140
+ }), _el$111);
7615
8141
  insert(_el$25, createComponent(Show, {
7616
8142
  get when() {
7617
8143
  return sidebarTab() === "diff";
7618
8144
  },
7619
8145
  get children() {
7620
- var _el$86 = _tmpl$13$1(), _el$87 = _el$86.firstChild, _el$88 = _el$87.firstChild, _el$89 = _el$88.nextSibling;
7621
- insert(_el$89, () => isPremium() ? "Page change timeline" : "Premium feature");
7622
- insert(_el$86, createComponent(Show, {
8146
+ var _el$93 = _tmpl$14$1(), _el$94 = _el$93.firstChild, _el$95 = _el$94.firstChild, _el$96 = _el$95.nextSibling;
8147
+ insert(_el$96, () => isPremium() ? "Page change timeline" : "Premium feature");
8148
+ insert(_el$93, createComponent(Show, {
7623
8149
  get when() {
7624
8150
  return isPremium();
7625
8151
  },
7626
8152
  get fallback() {
7627
8153
  return (() => {
7628
- var _el$216 = _tmpl$56(), _el$217 = _el$216.firstChild, _el$218 = _el$217.nextSibling, _el$219 = _el$218.nextSibling, _el$220 = _el$219.firstChild, _el$221 = _el$220.nextSibling;
7629
- _el$220.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
8154
+ var _el$223 = _tmpl$57(), _el$224 = _el$223.firstChild, _el$225 = _el$224.nextSibling, _el$226 = _el$225.nextSibling, _el$227 = _el$226.firstChild, _el$228 = _el$227.nextSibling;
8155
+ _el$227.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
7630
8156
  });
7631
- _el$221.$$click = openPremiumDetails;
7632
- return _el$216;
8157
+ _el$228.$$click = openPremiumDetails;
8158
+ return _el$223;
7633
8159
  })();
7634
8160
  },
7635
8161
  get children() {
7636
8162
  return createComponent(PageDiffTimeline, {});
7637
8163
  }
7638
8164
  }), null);
7639
- return _el$86;
8165
+ return _el$93;
7640
8166
  }
7641
- }), _el$104);
8167
+ }), _el$111);
7642
8168
  insert(_el$25, createComponent(Show, {
7643
8169
  get when() {
7644
8170
  return sidebarTab() === "chat";
@@ -7649,23 +8175,23 @@ ${contextBlock}` : contextBlock);
7649
8175
  return !isPremium();
7650
8176
  },
7651
8177
  get children() {
7652
- var _el$90 = _tmpl$14$1(), _el$91 = _el$90.firstChild, _el$92 = _el$91.nextSibling, _el$93 = _el$92.nextSibling, _el$94 = _el$93.firstChild, _el$95 = _el$94.nextSibling;
7653
- _el$94.$$click = () => openPremiumCheckout("chat_banner_clicked");
7654
- _el$95.$$click = openPremiumDetails;
7655
- return _el$90;
8178
+ var _el$97 = _tmpl$15$1(), _el$98 = _el$97.firstChild, _el$99 = _el$98.nextSibling, _el$100 = _el$99.nextSibling, _el$101 = _el$100.firstChild, _el$102 = _el$101.nextSibling;
8179
+ _el$101.$$click = () => openPremiumCheckout("chat_banner_clicked");
8180
+ _el$102.$$click = openPremiumDetails;
8181
+ return _el$97;
7656
8182
  }
7657
8183
  }), createComponent(For, {
7658
8184
  get each() {
7659
8185
  return messages2();
7660
8186
  },
7661
8187
  children: (msg) => (() => {
7662
- var _el$222 = _tmpl$57();
7663
- insert(_el$222, createComponent(MarkdownMessage, {
8188
+ var _el$229 = _tmpl$58();
8189
+ insert(_el$229, createComponent(MarkdownMessage, {
7664
8190
  get content() {
7665
8191
  return msg.content;
7666
8192
  }
7667
8193
  }), null);
7668
- insert(_el$222, createComponent(Show, {
8194
+ insert(_el$229, createComponent(Show, {
7669
8195
  get when() {
7670
8196
  return memo(() => msg.role === "assistant")() ? getPremiumPromptKind(msg.content) : null;
7671
8197
  },
@@ -7678,31 +8204,31 @@ ${contextBlock}` : contextBlock);
7678
8204
  onOpenSettings: openPremiumDetails
7679
8205
  })
7680
8206
  }), null);
7681
- createRenderEffect(() => className(_el$222, `message message-${msg.role}`));
7682
- return _el$222;
8207
+ createRenderEffect(() => className(_el$229, `message message-${msg.role}`));
8208
+ return _el$229;
7683
8209
  })()
7684
8210
  }), createComponent(Show, {
7685
8211
  get when() {
7686
8212
  return isStreaming2();
7687
8213
  },
7688
8214
  get children() {
7689
- var _el$96 = _tmpl$17$1(), _el$97 = _el$96.firstChild;
7690
- insert(_el$97, createComponent(Show, {
8215
+ var _el$103 = _tmpl$18$1(), _el$104 = _el$103.firstChild;
8216
+ insert(_el$104, createComponent(Show, {
7691
8217
  get when() {
7692
8218
  return hasFirstChunk2();
7693
8219
  },
7694
8220
  get fallback() {
7695
- return _tmpl$58();
8221
+ return _tmpl$59();
7696
8222
  },
7697
8223
  get children() {
7698
- var _el$98 = _tmpl$16$1(), _el$99 = _el$98.firstChild, _el$100 = _el$99.firstChild;
7699
- _el$100.nextSibling;
7700
- insert(_el$98, createComponent(MarkdownMessage, {
8224
+ var _el$105 = _tmpl$17$1(), _el$106 = _el$105.firstChild, _el$107 = _el$106.firstChild;
8225
+ _el$107.nextSibling;
8226
+ insert(_el$105, createComponent(MarkdownMessage, {
7701
8227
  get content() {
7702
8228
  return streamingText2();
7703
8229
  }
7704
- }), _el$99);
7705
- insert(_el$98, createComponent(Show, {
8230
+ }), _el$106);
8231
+ insert(_el$105, createComponent(Show, {
7706
8232
  get when() {
7707
8233
  return getPremiumPromptKind(streamingText2());
7708
8234
  },
@@ -7714,21 +8240,21 @@ ${contextBlock}` : contextBlock);
7714
8240
  onStartTrial: () => openPremiumCheckout(kind() === "premium_gate" ? "premium_gate_clicked" : "iteration_limit_clicked"),
7715
8241
  onOpenSettings: openPremiumDetails
7716
8242
  })
7717
- }), _el$99);
7718
- insert(_el$99, createComponent(Show, {
8243
+ }), _el$106);
8244
+ insert(_el$106, createComponent(Show, {
7719
8245
  get when() {
7720
8246
  return elapsedSeconds() > 0;
7721
8247
  },
7722
8248
  get children() {
7723
- var _el$102 = _tmpl$15$1();
7724
- insert(_el$102, () => ` • ${elapsedSeconds()}s`);
7725
- return _el$102;
8249
+ var _el$109 = _tmpl$16$1();
8250
+ insert(_el$109, () => ` • ${elapsedSeconds()}s`);
8251
+ return _el$109;
7726
8252
  }
7727
8253
  }), null);
7728
- return _el$98;
8254
+ return _el$105;
7729
8255
  }
7730
8256
  }));
7731
- return _el$96;
8257
+ return _el$103;
7732
8258
  }
7733
8259
  }), createComponent(Show, {
7734
8260
  get when() {
@@ -7740,22 +8266,22 @@ ${contextBlock}` : contextBlock);
7740
8266
  return runtimeState2().supervisor.pendingApprovals;
7741
8267
  },
7742
8268
  children: (approval) => (() => {
7743
- var _el$224 = _tmpl$60(), _el$225 = _el$224.firstChild, _el$226 = _el$225.nextSibling, _el$227 = _el$226.firstChild, _el$228 = _el$227.firstChild, _el$229 = _el$228.nextSibling, _el$231 = _el$227.nextSibling, _el$232 = _el$231.nextSibling, _el$233 = _el$232.firstChild, _el$234 = _el$233.nextSibling;
7744
- insert(_el$229, () => approval.name);
7745
- insert(_el$226, createComponent(Show, {
8269
+ var _el$231 = _tmpl$61(), _el$232 = _el$231.firstChild, _el$233 = _el$232.nextSibling, _el$234 = _el$233.firstChild, _el$235 = _el$234.firstChild, _el$236 = _el$235.nextSibling, _el$238 = _el$234.nextSibling, _el$239 = _el$238.nextSibling, _el$240 = _el$239.firstChild, _el$241 = _el$240.nextSibling;
8270
+ insert(_el$236, () => approval.name);
8271
+ insert(_el$233, createComponent(Show, {
7746
8272
  get when() {
7747
8273
  return approval.argsSummary;
7748
8274
  },
7749
8275
  get children() {
7750
- var _el$230 = _tmpl$59();
7751
- insert(_el$230, () => approval.argsSummary);
7752
- return _el$230;
8276
+ var _el$237 = _tmpl$60();
8277
+ insert(_el$237, () => approval.argsSummary);
8278
+ return _el$237;
7753
8279
  }
7754
- }), _el$231);
7755
- insert(_el$231, () => approval.reason);
7756
- _el$233.$$click = () => void resolveApproval(approval.id, true);
7757
- _el$234.$$click = () => void resolveApproval(approval.id, false);
7758
- return _el$224;
8280
+ }), _el$238);
8281
+ insert(_el$238, () => approval.reason);
8282
+ _el$240.$$click = () => void resolveApproval(approval.id, true);
8283
+ _el$241.$$click = () => void resolveApproval(approval.id, false);
8284
+ return _el$231;
7759
8285
  })()
7760
8286
  });
7761
8287
  }
@@ -7764,13 +8290,13 @@ ${contextBlock}` : contextBlock);
7764
8290
  return memo(() => messages2().length === 0)() && !isStreaming2();
7765
8291
  },
7766
8292
  get children() {
7767
- return _tmpl$18$1();
8293
+ return _tmpl$19$1();
7768
8294
  }
7769
8295
  })];
7770
8296
  }
7771
- }), _el$104);
8297
+ }), _el$111);
7772
8298
  var _ref$ = messagesEndRef;
7773
- typeof _ref$ === "function" ? use(_ref$, _el$104) : messagesEndRef = _el$104;
8299
+ typeof _ref$ === "function" ? use(_ref$, _el$111) : messagesEndRef = _el$111;
7774
8300
  insert(_el$9, createComponent(Show, {
7775
8301
  get when() {
7776
8302
  return sidebarTab() === "chat";
@@ -7781,141 +8307,141 @@ ${contextBlock}` : contextBlock);
7781
8307
  return isStreaming2() || messages2().length > 0;
7782
8308
  },
7783
8309
  get children() {
7784
- var _el$105 = _tmpl$21$1();
7785
- insert(_el$105, createComponent(Show, {
8310
+ var _el$112 = _tmpl$22$1();
8311
+ insert(_el$112, createComponent(Show, {
7786
8312
  get when() {
7787
8313
  return isStreaming2();
7788
8314
  },
7789
8315
  get children() {
7790
- var _el$106 = _tmpl$19$1();
7791
- _el$106.$$click = () => cancel();
7792
- return _el$106;
8316
+ var _el$113 = _tmpl$20$1();
8317
+ _el$113.$$click = () => cancel();
8318
+ return _el$113;
7793
8319
  }
7794
8320
  }), null);
7795
- insert(_el$105, createComponent(Show, {
8321
+ insert(_el$112, createComponent(Show, {
7796
8322
  get when() {
7797
8323
  return memo(() => !!!isStreaming2())() && messages2().length > 0;
7798
8324
  },
7799
8325
  get children() {
7800
- var _el$107 = _tmpl$20$1();
7801
- _el$107.$$click = handleRetry;
7802
- return _el$107;
8326
+ var _el$114 = _tmpl$21$1();
8327
+ _el$114.$$click = handleRetry;
8328
+ return _el$114;
7803
8329
  }
7804
8330
  }), null);
7805
- return _el$105;
8331
+ return _el$112;
7806
8332
  }
7807
8333
  }), createComponent(Show, {
7808
8334
  get when() {
7809
8335
  return highlightCount() > 0;
7810
8336
  },
7811
8337
  get children() {
7812
- var _el$108 = _tmpl$22$1(), _el$109 = _el$108.firstChild, _el$110 = _el$109.nextSibling;
7813
- _el$110.firstChild;
7814
- var _el$112 = _el$110.nextSibling;
7815
- _el$109.$$click = () => void scrollToHighlight(highlightIndex() - 1);
7816
- _el$110.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex());
7817
- insert(_el$110, (() => {
8338
+ var _el$115 = _tmpl$23$1(), _el$116 = _el$115.firstChild, _el$117 = _el$116.nextSibling;
8339
+ _el$117.firstChild;
8340
+ var _el$119 = _el$117.nextSibling;
8341
+ _el$116.$$click = () => void scrollToHighlight(highlightIndex() - 1);
8342
+ _el$117.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex());
8343
+ insert(_el$117, (() => {
7818
8344
  var _c$4 = memo(() => highlightIndex() >= 0);
7819
8345
  return () => _c$4() ? `${highlightIndex() + 1} / ${highlightCount()}` : `${highlightCount()} highlight${highlightCount() > 1 ? "s" : ""}`;
7820
8346
  })(), null);
7821
- _el$112.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex() + 1);
8347
+ _el$119.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex() + 1);
7822
8348
  createRenderEffect((_p$) => {
7823
- var _v$3 = highlightIndex() <= 0, _v$4 = highlightIndex() >= highlightCount() - 1;
7824
- _v$3 !== _p$.e && (_el$109.disabled = _p$.e = _v$3);
7825
- _v$4 !== _p$.t && (_el$112.disabled = _p$.t = _v$4);
8349
+ var _v$6 = highlightIndex() <= 0, _v$7 = highlightIndex() >= highlightCount() - 1;
8350
+ _v$6 !== _p$.e && (_el$116.disabled = _p$.e = _v$6);
8351
+ _v$7 !== _p$.t && (_el$119.disabled = _p$.t = _v$7);
7826
8352
  return _p$;
7827
8353
  }, {
7828
8354
  e: void 0,
7829
8355
  t: void 0
7830
8356
  });
7831
- return _el$108;
8357
+ return _el$115;
7832
8358
  }
7833
8359
  }), createComponent(Show, {
7834
8360
  get when() {
7835
8361
  return queueNotice2() !== null || pendingQueryCount() > 0;
7836
8362
  },
7837
8363
  get children() {
7838
- var _el$113 = _tmpl$25$1(), _el$114 = _el$113.firstChild, _el$115 = _el$114.firstChild;
7839
- insert(_el$115, () => queueNotice2() ?? `Queued ${pendingQueryCount()}/${pendingQueryLimit}.`);
7840
- insert(_el$114, createComponent(Show, {
8364
+ var _el$120 = _tmpl$26$1(), _el$121 = _el$120.firstChild, _el$122 = _el$121.firstChild;
8365
+ insert(_el$122, () => queueNotice2() ?? `Queued ${pendingQueryCount()}/${pendingQueryLimit}.`);
8366
+ insert(_el$121, createComponent(Show, {
7841
8367
  get when() {
7842
8368
  return pendingQueryCount() > 0;
7843
8369
  },
7844
8370
  get children() {
7845
- var _el$116 = _tmpl$23$1();
7846
- _el$116.$$click = () => clearPendingQueries();
7847
- return _el$116;
8371
+ var _el$123 = _tmpl$24$1();
8372
+ _el$123.$$click = () => clearPendingQueries();
8373
+ return _el$123;
7848
8374
  }
7849
8375
  }), null);
7850
- insert(_el$113, createComponent(Show, {
8376
+ insert(_el$120, createComponent(Show, {
7851
8377
  get when() {
7852
8378
  return pendingQueries2().length > 0;
7853
8379
  },
7854
8380
  get children() {
7855
- var _el$117 = _tmpl$24$1();
7856
- insert(_el$117, createComponent(For, {
8381
+ var _el$124 = _tmpl$25$1();
8382
+ insert(_el$124, createComponent(For, {
7857
8383
  get each() {
7858
8384
  return pendingQueries2();
7859
8385
  },
7860
8386
  children: (pendingPrompt, index) => (() => {
7861
- var _el$235 = _tmpl$61(), _el$236 = _el$235.firstChild, _el$237 = _el$236.nextSibling;
7862
- setAttribute(_el$236, "title", pendingPrompt);
7863
- insert(_el$236, pendingPrompt);
7864
- _el$237.$$click = () => removePendingQuery(index());
7865
- createRenderEffect(() => setAttribute(_el$237, "aria-label", `Remove queued prompt ${index() + 1}`));
7866
- return _el$235;
8387
+ var _el$242 = _tmpl$62(), _el$243 = _el$242.firstChild, _el$244 = _el$243.nextSibling;
8388
+ setAttribute(_el$243, "title", pendingPrompt);
8389
+ insert(_el$243, pendingPrompt);
8390
+ _el$244.$$click = () => removePendingQuery(index());
8391
+ createRenderEffect(() => setAttribute(_el$244, "aria-label", `Remove queued prompt ${index() + 1}`));
8392
+ return _el$242;
7867
8393
  })()
7868
8394
  }));
7869
- return _el$117;
8395
+ return _el$124;
7870
8396
  }
7871
8397
  }), null);
7872
- return _el$113;
8398
+ return _el$120;
7873
8399
  }
7874
8400
  }), (() => {
7875
- var _el$118 = _tmpl$26$1(), _el$119 = _el$118.firstChild, _el$120 = _el$119.nextSibling;
7876
- _el$119.$$keydown = (e) => {
8401
+ var _el$125 = _tmpl$27$1(), _el$126 = _el$125.firstChild, _el$127 = _el$126.nextSibling;
8402
+ _el$126.$$keydown = (e) => {
7877
8403
  if (e.key === "Enter" && !e.shiftKey) {
7878
8404
  e.preventDefault();
7879
8405
  void handleChatSend();
7880
8406
  }
7881
8407
  };
7882
- _el$119.$$input = (e) => setChatInput(e.currentTarget.value);
8408
+ _el$126.$$input = (e) => setChatInput(e.currentTarget.value);
7883
8409
  var _ref$2 = chatInputRef;
7884
- typeof _ref$2 === "function" ? use(_ref$2, _el$119) : chatInputRef = _el$119;
7885
- _el$120.$$click = () => void handleChatSend();
7886
- insert(_el$120, () => isStreaming2() ? "Queue" : "Send");
8410
+ typeof _ref$2 === "function" ? use(_ref$2, _el$126) : chatInputRef = _el$126;
8411
+ _el$127.$$click = () => void handleChatSend();
8412
+ insert(_el$127, () => isStreaming2() ? "Queue" : "Send");
7887
8413
  createRenderEffect((_p$) => {
7888
- var _v$5 = isStreaming2() ? "Send now to queue the next prompt..." : "Ask anything...", _v$6 = !chatInput().trim();
7889
- _v$5 !== _p$.e && setAttribute(_el$119, "placeholder", _p$.e = _v$5);
7890
- _v$6 !== _p$.t && (_el$120.disabled = _p$.t = _v$6);
8414
+ var _v$8 = isStreaming2() ? "Send now to queue the next prompt..." : "Ask anything...", _v$9 = !chatInput().trim();
8415
+ _v$8 !== _p$.e && setAttribute(_el$126, "placeholder", _p$.e = _v$8);
8416
+ _v$9 !== _p$.t && (_el$127.disabled = _p$.t = _v$9);
7891
8417
  return _p$;
7892
8418
  }, {
7893
8419
  e: void 0,
7894
8420
  t: void 0
7895
8421
  });
7896
- createRenderEffect(() => _el$119.value = chatInput());
7897
- return _el$118;
8422
+ createRenderEffect(() => _el$126.value = chatInput());
8423
+ return _el$125;
7898
8424
  })()];
7899
8425
  }
7900
8426
  }), null);
7901
8427
  createRenderEffect((_p$) => {
7902
- var _v$7 = `${sidebarWidth2()}px`, _v$8 = !!isDragging(), _v$9 = !!(sidebarTab() === "supervisor"), _v$0 = sidebarTab() === "supervisor", _v$1 = !!(sidebarTab() === "bookmarks"), _v$10 = sidebarTab() === "bookmarks", _v$11 = !!(sidebarTab() === "checkpoints"), _v$12 = sidebarTab() === "checkpoints", _v$13 = !!(sidebarTab() === "chat"), _v$14 = sidebarTab() === "chat", _v$15 = !!(sidebarTab() === "automation"), _v$16 = sidebarTab() === "automation", _v$17 = !!(sidebarTab() === "history"), _v$18 = sidebarTab() === "history", _v$19 = !!(sidebarTab() === "diff"), _v$20 = sidebarTab() === "diff";
7903
- _v$7 !== _p$.e && setStyleProperty(_el$9, "width", _p$.e = _v$7);
7904
- _v$8 !== _p$.t && _el$0.classList.toggle("dragging", _p$.t = _v$8);
7905
- _v$9 !== _p$.a && _el$16.classList.toggle("active", _p$.a = _v$9);
7906
- _v$0 !== _p$.o && setAttribute(_el$16, "aria-selected", _p$.o = _v$0);
7907
- _v$1 !== _p$.i && _el$19.classList.toggle("active", _p$.i = _v$1);
7908
- _v$10 !== _p$.n && setAttribute(_el$19, "aria-selected", _p$.n = _v$10);
7909
- _v$11 !== _p$.s && _el$20.classList.toggle("active", _p$.s = _v$11);
7910
- _v$12 !== _p$.h && setAttribute(_el$20, "aria-selected", _p$.h = _v$12);
7911
- _v$13 !== _p$.r && _el$21.classList.toggle("active", _p$.r = _v$13);
7912
- _v$14 !== _p$.d && setAttribute(_el$21, "aria-selected", _p$.d = _v$14);
7913
- _v$15 !== _p$.l && _el$22.classList.toggle("active", _p$.l = _v$15);
7914
- _v$16 !== _p$.u && setAttribute(_el$22, "aria-selected", _p$.u = _v$16);
7915
- _v$17 !== _p$.c && _el$23.classList.toggle("active", _p$.c = _v$17);
7916
- _v$18 !== _p$.w && setAttribute(_el$23, "aria-selected", _p$.w = _v$18);
7917
- _v$19 !== _p$.m && _el$24.classList.toggle("active", _p$.m = _v$19);
7918
- _v$20 !== _p$.f && setAttribute(_el$24, "aria-selected", _p$.f = _v$20);
8428
+ var _v$0 = `${sidebarWidth2()}px`, _v$1 = !!isDragging(), _v$10 = !!(sidebarTab() === "supervisor"), _v$11 = sidebarTab() === "supervisor", _v$12 = !!(sidebarTab() === "bookmarks"), _v$13 = sidebarTab() === "bookmarks", _v$14 = !!(sidebarTab() === "checkpoints"), _v$15 = sidebarTab() === "checkpoints", _v$16 = !!(sidebarTab() === "chat"), _v$17 = sidebarTab() === "chat", _v$18 = !!(sidebarTab() === "automation"), _v$19 = sidebarTab() === "automation", _v$20 = !!(sidebarTab() === "history"), _v$21 = sidebarTab() === "history", _v$22 = !!(sidebarTab() === "diff"), _v$23 = sidebarTab() === "diff";
8429
+ _v$0 !== _p$.e && setStyleProperty(_el$9, "width", _p$.e = _v$0);
8430
+ _v$1 !== _p$.t && _el$0.classList.toggle("dragging", _p$.t = _v$1);
8431
+ _v$10 !== _p$.a && _el$16.classList.toggle("active", _p$.a = _v$10);
8432
+ _v$11 !== _p$.o && setAttribute(_el$16, "aria-selected", _p$.o = _v$11);
8433
+ _v$12 !== _p$.i && _el$19.classList.toggle("active", _p$.i = _v$12);
8434
+ _v$13 !== _p$.n && setAttribute(_el$19, "aria-selected", _p$.n = _v$13);
8435
+ _v$14 !== _p$.s && _el$20.classList.toggle("active", _p$.s = _v$14);
8436
+ _v$15 !== _p$.h && setAttribute(_el$20, "aria-selected", _p$.h = _v$15);
8437
+ _v$16 !== _p$.r && _el$21.classList.toggle("active", _p$.r = _v$16);
8438
+ _v$17 !== _p$.d && setAttribute(_el$21, "aria-selected", _p$.d = _v$17);
8439
+ _v$18 !== _p$.l && _el$22.classList.toggle("active", _p$.l = _v$18);
8440
+ _v$19 !== _p$.u && setAttribute(_el$22, "aria-selected", _p$.u = _v$19);
8441
+ _v$20 !== _p$.c && _el$23.classList.toggle("active", _p$.c = _v$20);
8442
+ _v$21 !== _p$.w && setAttribute(_el$23, "aria-selected", _p$.w = _v$21);
8443
+ _v$22 !== _p$.m && _el$24.classList.toggle("active", _p$.m = _v$22);
8444
+ _v$23 !== _p$.f && setAttribute(_el$24, "aria-selected", _p$.f = _v$23);
7919
8445
  return _p$;
7920
8446
  }, {
7921
8447
  e: void 0,
@@ -7940,7 +8466,7 @@ ${contextBlock}` : contextBlock);
7940
8466
  });
7941
8467
  };
7942
8468
  delegateEvents(["click", "pointerdown", "input", "keydown"]);
7943
- var _tmpl$$3 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$2 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$2 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$2 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$2 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$1 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
8469
+ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$2 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$2 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$2 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$2 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$2 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$1 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$1 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
7944
8470
  function statusClass(status) {
7945
8471
  if (status == null) return "pending";
7946
8472
  if (status >= 200 && status < 300) return "ok";
@@ -8109,7 +8635,7 @@ const ActivityView = (props) => {
8109
8635
  return _tmpl$8$1();
8110
8636
  },
8111
8637
  get children() {
8112
- var _el$15 = _tmpl$7$1();
8638
+ var _el$15 = _tmpl$7$2();
8113
8639
  insert(_el$15, createComponent(For, {
8114
8640
  get each() {
8115
8641
  return [...props.entries].reverse();
@@ -8361,14 +8887,6 @@ const DevToolsPanel = () => {
8361
8887
  })();
8362
8888
  };
8363
8889
  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
8890
  const PROVIDERS = {
8373
8891
  anthropic: {
8374
8892
  id: "anthropic",
@@ -8469,7 +8987,7 @@ const PROVIDERS = {
8469
8987
  apiKeyHint: "Optional — only if your endpoint requires authentication"
8470
8988
  }
8471
8989
  };
8472
- 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=vault-entries>`), _tmpl$6$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$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$8 = /* @__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$9 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$0 = /* @__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$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$11 = /* @__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$12 = /* @__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$13 = /* @__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$14 = /* @__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$15 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$16 = /* @__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$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(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$24 = /* @__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=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>The search engine used by the AI agent when it needs to search the web. "None" disables the fallback and forces the agent to use on-page search inputs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=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-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current</button></div></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-section-divider></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$25 = /* @__PURE__ */ template(`<style>
8990
+ 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=vault-entries>`), _tmpl$6$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$7$1 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$8 = /* @__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$9 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$0 = /* @__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$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$11 = /* @__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$12 = /* @__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$13 = /* @__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$14 = /* @__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$15 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$16 = /* @__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$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(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$24 = /* @__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=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>The search engine used by the AI agent when it needs to search the web. "None" disables the fallback and forces the agent to use on-page search inputs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=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-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current</button></div></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-section-divider></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$25 = /* @__PURE__ */ template(`<style>
8473
8991
  .settings-panel {
8474
8992
  width: min(440px, calc(100vw - 32px));
8475
8993
  max-height: calc(100vh - 48px);
@@ -9732,7 +10250,7 @@ const Settings = () => {
9732
10250
  return !chatProviderMeta().requiresKey;
9733
10251
  },
9734
10252
  get children() {
9735
- return _tmpl$7();
10253
+ return _tmpl$7$1();
9736
10254
  }
9737
10255
  }), null);
9738
10256
  _el$66.$$input = (e) => {
@@ -10435,40 +10953,77 @@ var _tmpl$$1 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div cla
10435
10953
  font-size: 13px;
10436
10954
  color: var(--text-secondary);
10437
10955
  }
10438
- `), _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>+`);
10956
+ `), _tmpl$3 = /* @__PURE__ */ template(`<div class=keyboard-help-keys>`), _tmpl$4 = /* @__PURE__ */ template(`<div class=keyboard-help-action>`), _tmpl$5 = /* @__PURE__ */ template(`<span class=keyboard-help-plus>/`), _tmpl$6 = /* @__PURE__ */ template(`<kbd>`), _tmpl$7 = /* @__PURE__ */ template(`<span class=keyboard-help-plus>+`);
10439
10957
  const SHORTCUTS = [{
10440
10958
  keys: "Ctrl+L",
10441
- action: "AI Command Bar"
10959
+ action: "AI Command Bar",
10960
+ privateMode: false
10442
10961
  }, {
10443
10962
  keys: "Ctrl+Shift+L",
10444
- action: "Toggle AI Sidebar"
10963
+ action: "Toggle AI Sidebar",
10964
+ privateMode: false
10445
10965
  }, {
10446
10966
  keys: "Ctrl+Shift+F",
10447
- action: "Toggle Focus Mode"
10967
+ action: "Toggle Focus Mode",
10968
+ privateMode: false
10448
10969
  }, {
10449
10970
  keys: "F12",
10450
- action: "Toggle Dev Tools Panel"
10971
+ action: "Toggle Dev Tools Panel",
10972
+ privateMode: false
10973
+ }, {
10974
+ keys: "Ctrl+N",
10975
+ action: "New Window"
10451
10976
  }, {
10452
10977
  keys: "Ctrl+T",
10453
10978
  action: "New Tab"
10454
10979
  }, {
10455
10980
  keys: "Ctrl+W",
10456
10981
  action: "Close Tab"
10982
+ }, {
10983
+ keys: "Ctrl+Shift+T",
10984
+ action: "Reopen Closed Tab"
10985
+ }, {
10986
+ keys: "Ctrl+F",
10987
+ action: "Find in Page"
10988
+ }, {
10989
+ keys: "Ctrl++ / Ctrl+=",
10990
+ action: "Zoom In"
10991
+ }, {
10992
+ keys: "Ctrl+-",
10993
+ action: "Zoom Out"
10994
+ }, {
10995
+ keys: "Ctrl+0",
10996
+ action: "Reset Zoom"
10997
+ }, {
10998
+ keys: "Ctrl+Shift+N",
10999
+ action: "New Private Window"
11000
+ }, {
11001
+ keys: "Ctrl+P",
11002
+ action: "Print Page"
11003
+ }, {
11004
+ keys: "Ctrl+Shift+P",
11005
+ action: "Save Page as PDF"
10457
11006
  }, {
10458
11007
  keys: "Ctrl+,",
10459
- action: "Settings"
11008
+ action: "Settings",
11009
+ privateMode: false
10460
11010
  }, {
10461
11011
  keys: "Ctrl+H",
10462
- action: "Capture Highlight"
11012
+ action: "Capture Highlight",
11013
+ privateMode: false
10463
11014
  }, {
10464
11015
  keys: "?",
10465
11016
  action: "This help overlay"
10466
11017
  }];
11018
+ function shortcutParts(keys) {
11019
+ return keys.split(" / ").map((combo) => combo.replace(/\+\+/g, "+Plus").split("+").filter(Boolean).map((key) => key === "Plus" ? "+" : key));
11020
+ }
10467
11021
  const KeyboardHelp = (props) => {
10468
11022
  const {
10469
11023
  visible,
10470
11024
  closing
10471
11025
  } = useAnimatedPresence(() => props.open, 200);
11026
+ const shortcuts = () => props.privateMode ? SHORTCUTS.filter((shortcut) => shortcut.privateMode !== false) : SHORTCUTS;
10472
11027
  return createComponent(Show, {
10473
11028
  get when() {
10474
11029
  return visible();
@@ -10479,13 +11034,13 @@ const KeyboardHelp = (props) => {
10479
11034
  addEventListener(_el$, "click", props.onClose, true);
10480
11035
  _el$2.$$click = (e) => e.stopPropagation();
10481
11036
  addEventListener(_el$5, "click", props.onClose, true);
10482
- insert(_el$6, () => SHORTCUTS.map((s) => [(() => {
11037
+ insert(_el$6, () => shortcuts().map((s) => [(() => {
10483
11038
  var _el$8 = _tmpl$3();
10484
- insert(_el$8, () => s.keys.split("+").map((k, i) => [i > 0 && _tmpl$6(), (() => {
10485
- var _el$0 = _tmpl$5();
10486
- insert(_el$0, k);
10487
- return _el$0;
10488
- })()]));
11039
+ insert(_el$8, () => shortcutParts(s.keys).map((combo, comboIndex) => [comboIndex > 0 && _tmpl$5(), memo(() => combo.map((key, keyIndex) => [keyIndex > 0 && _tmpl$7(), (() => {
11040
+ var _el$1 = _tmpl$6();
11041
+ insert(_el$1, key);
11042
+ return _el$1;
11043
+ })()]))]));
10489
11044
  return _el$8;
10490
11045
  })(), (() => {
10491
11046
  var _el$9 = _tmpl$4();
@@ -10502,39 +11057,65 @@ delegateEvents(["click"]);
10502
11057
  function setupKeybindings(handlers) {
10503
11058
  const listener = (e) => {
10504
11059
  const ctrl = e.ctrlKey || e.metaKey;
10505
- if (ctrl && e.key === "l" && !e.shiftKey) {
11060
+ const key = e.key.toLowerCase();
11061
+ if (ctrl && key === "l" && !e.shiftKey) {
11062
+ e.preventDefault();
11063
+ handlers.openCommandBar?.();
11064
+ return;
11065
+ }
11066
+ if (ctrl && key === "l" && e.shiftKey) {
11067
+ e.preventDefault();
11068
+ handlers.toggleSidebar?.();
11069
+ return;
11070
+ }
11071
+ if (ctrl && key === "f" && e.shiftKey) {
10506
11072
  e.preventDefault();
10507
- handlers.openCommandBar();
11073
+ handlers.toggleFocusMode?.();
10508
11074
  return;
10509
11075
  }
10510
- if (ctrl && e.key === "L" && e.shiftKey) {
11076
+ if (ctrl && key === "t" && e.shiftKey) {
10511
11077
  e.preventDefault();
10512
- handlers.toggleSidebar();
11078
+ handlers.reopenClosedTab?.();
10513
11079
  return;
10514
11080
  }
10515
- if (ctrl && e.key === "F" && e.shiftKey) {
11081
+ if (ctrl && key === "n" && e.shiftKey) {
10516
11082
  e.preventDefault();
10517
- handlers.toggleFocusMode();
11083
+ handlers.openPrivateWindow?.();
10518
11084
  return;
10519
11085
  }
10520
- if (ctrl && e.key === "t") {
11086
+ if (ctrl && key === "n" && !e.shiftKey) {
11087
+ e.preventDefault();
11088
+ handlers.openNewWindow?.();
11089
+ return;
11090
+ }
11091
+ if (ctrl && key === "t" && !e.shiftKey) {
10521
11092
  e.preventDefault();
10522
11093
  handlers.newTab();
10523
11094
  return;
10524
11095
  }
10525
- if (ctrl && e.key === "w") {
11096
+ if (ctrl && key === "w") {
10526
11097
  e.preventDefault();
10527
11098
  handlers.closeTab();
10528
11099
  return;
10529
11100
  }
11101
+ if (ctrl && key === "p" && e.shiftKey) {
11102
+ e.preventDefault();
11103
+ handlers.printToPdf?.();
11104
+ return;
11105
+ }
11106
+ if (ctrl && key === "p" && !e.shiftKey) {
11107
+ e.preventDefault();
11108
+ handlers.print?.();
11109
+ return;
11110
+ }
10530
11111
  if (ctrl && e.key === ",") {
10531
11112
  e.preventDefault();
10532
- handlers.openSettings();
11113
+ handlers.openSettings?.();
10533
11114
  return;
10534
11115
  }
10535
- if (ctrl && e.key === "h" && !e.shiftKey) {
11116
+ if (ctrl && key === "h" && !e.shiftKey) {
10536
11117
  e.preventDefault();
10537
- handlers.captureHighlight();
11118
+ handlers.captureHighlight?.();
10538
11119
  return;
10539
11120
  }
10540
11121
  if (e.key === "F12") {
@@ -10542,6 +11123,21 @@ function setupKeybindings(handlers) {
10542
11123
  handlers.toggleDevTools?.();
10543
11124
  return;
10544
11125
  }
11126
+ if (ctrl && (e.key === "+" || e.key === "=")) {
11127
+ e.preventDefault();
11128
+ handlers.zoomIn?.();
11129
+ return;
11130
+ }
11131
+ if (ctrl && e.key === "-") {
11132
+ e.preventDefault();
11133
+ handlers.zoomOut?.();
11134
+ return;
11135
+ }
11136
+ if (ctrl && e.key === "0") {
11137
+ e.preventDefault();
11138
+ handlers.zoomReset?.();
11139
+ return;
11140
+ }
10545
11141
  if (e.key === "?" && !ctrl && !e.altKey) {
10546
11142
  const tag = e.target?.tagName;
10547
11143
  if (tag !== "INPUT" && tag !== "TEXTAREA" && !e.target?.isContentEditable) {
@@ -10564,6 +11160,9 @@ try {
10564
11160
  }
10565
11161
  const App = () => {
10566
11162
  const view = new URLSearchParams(window.location.search).get("view") || "chrome";
11163
+ const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
11164
+ const isSecondaryWindow = new URLSearchParams(window.location.search).get("secondary") === "1";
11165
+ const isChromeOnlyWindow = isPrivateWindow || isSecondaryWindow;
10567
11166
  const {
10568
11167
  openCommandBar,
10569
11168
  toggleSidebar,
@@ -10575,7 +11174,11 @@ const App = () => {
10575
11174
  createTab,
10576
11175
  closeTab,
10577
11176
  activeTabId: activeTabId2,
10578
- activeTab
11177
+ activeTab,
11178
+ zoomIn,
11179
+ zoomOut,
11180
+ zoomReset,
11181
+ reopenClosed
10579
11182
  } = useTabs();
10580
11183
  const [highlightToast, setHighlightToast] = createSignal(null);
10581
11184
  const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
@@ -10627,17 +11230,40 @@ const App = () => {
10627
11230
  });
10628
11231
  if (view !== "chrome") return;
10629
11232
  const cleanupKeys = setupKeybindings({
10630
- openCommandBar,
10631
- toggleSidebar,
10632
- toggleFocusMode,
11233
+ openCommandBar: isChromeOnlyWindow ? void 0 : openCommandBar,
11234
+ toggleSidebar: isChromeOnlyWindow ? void 0 : toggleSidebar,
11235
+ toggleFocusMode: isChromeOnlyWindow ? void 0 : toggleFocusMode,
10633
11236
  newTab: () => createTab(),
10634
11237
  closeTab: () => {
10635
11238
  const id = activeTabId2();
10636
11239
  if (id) closeTab(id);
10637
11240
  },
10638
- openSettings,
10639
- captureHighlight,
10640
- toggleDevTools: () => {
11241
+ openSettings: isChromeOnlyWindow ? void 0 : openSettings,
11242
+ captureHighlight: isChromeOnlyWindow ? void 0 : captureHighlight,
11243
+ zoomIn: () => {
11244
+ const id = activeTabId2();
11245
+ if (id) zoomIn(id);
11246
+ },
11247
+ zoomOut: () => {
11248
+ const id = activeTabId2();
11249
+ if (id) zoomOut(id);
11250
+ },
11251
+ zoomReset: () => {
11252
+ const id = activeTabId2();
11253
+ if (id) zoomReset(id);
11254
+ },
11255
+ reopenClosedTab: () => reopenClosed(),
11256
+ openNewWindow: () => window.vessel.tabs.openNewWindow(),
11257
+ openPrivateWindow: () => window.vessel.tabs.openPrivateWindow(),
11258
+ print: () => {
11259
+ const id = activeTabId2();
11260
+ if (id) window.vessel.tabs.print(id);
11261
+ },
11262
+ printToPdf: () => {
11263
+ const id = activeTabId2();
11264
+ if (id) void window.vessel.tabs.printToPdf(id);
11265
+ },
11266
+ toggleDevTools: isChromeOnlyWindow ? void 0 : () => {
10641
11267
  window.vessel.devtoolsPanel.toggle();
10642
11268
  },
10643
11269
  toggleKeyboardHelp: () => setKeyboardHelpOpen((v) => !v)
@@ -10658,17 +11284,25 @@ const App = () => {
10658
11284
  }
10659
11285
  return (() => {
10660
11286
  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)
11287
+ insert(_el$, createComponent(Show, {
11288
+ when: !isPrivateWindow,
11289
+ get children() {
11290
+ return [createComponent(BookmarkNotifications, {}), createComponent(HighlightNotifications, {
11291
+ get toast() {
11292
+ return highlightToast();
11293
+ },
11294
+ onDismiss: () => setHighlightToast(null)
11295
+ })];
11296
+ }
10667
11297
  }), _el$2);
10668
11298
  insert(_el$, createComponent(DownloadToast, {}), _el$2);
10669
11299
  insert(_el$, createComponent(FindBar, {}), _el$2);
10670
- insert(_el$, createComponent(FlowProgress, {}), _el$2);
10671
- insert(_el$, createComponent(AgentTranscriptDock, {}), _el$2);
11300
+ insert(_el$, createComponent(Show, {
11301
+ when: !isChromeOnlyWindow,
11302
+ get children() {
11303
+ return [createComponent(FlowProgress, {}), createComponent(AgentTranscriptDock, {})];
11304
+ }
11305
+ }), _el$2);
10672
11306
  insert(_el$2, createComponent(TitleBar, {}), null);
10673
11307
  insert(_el$2, createComponent(TabBar, {}), null);
10674
11308
  insert(_el$2, createComponent(AddressBar, {}), null);
@@ -10682,13 +11316,18 @@ const App = () => {
10682
11316
  return _el$3;
10683
11317
  }
10684
11318
  }), null);
10685
- insert(_el$, createComponent(CommandBar, {}), null);
10686
- insert(_el$, createComponent(Settings, {}), null);
11319
+ insert(_el$, createComponent(Show, {
11320
+ when: !isChromeOnlyWindow,
11321
+ get children() {
11322
+ return [createComponent(CommandBar, {}), createComponent(Settings, {})];
11323
+ }
11324
+ }), null);
10687
11325
  insert(_el$, createComponent(KeyboardHelp, {
10688
11326
  get open() {
10689
11327
  return keyboardHelpOpen();
10690
11328
  },
10691
- onClose: () => setKeyboardHelpOpen(false)
11329
+ onClose: () => setKeyboardHelpOpen(false),
11330
+ privateMode: isChromeOnlyWindow
10692
11331
  }), null);
10693
11332
  createRenderEffect(() => _el$.classList.toggle("focus-mode", !!focusMode2()));
10694
11333
  return _el$;