@quanta-intellect/vessel-browser 0.1.88 → 0.1.92

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.
@@ -1466,8 +1466,8 @@ function Dynamic(props) {
1466
1466
  const [, others] = splitProps(props, ["component"]);
1467
1467
  return createDynamic(() => props.component, others);
1468
1468
  }
1469
- var _tmpl$$p = /* @__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>`);
1470
- const TitleBar = () => {
1469
+ var _tmpl$$q = /* @__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=Downloads>↓</button><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>`);
1470
+ const TitleBar = (props) => {
1471
1471
  const isPrivateWindow = new URLSearchParams(window.location.search).get("private") === "1";
1472
1472
  const [mcpStatus, setMcpStatus] = createSignal("starting");
1473
1473
  const [mcpTooltip, setMcpTooltip] = createSignal("MCP: starting...");
@@ -1499,11 +1499,12 @@ const TitleBar = () => {
1499
1499
  window.vessel.ui.setSettingsVisibility(true);
1500
1500
  };
1501
1501
  return (() => {
1502
- var _el$ = _tmpl$$p(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling;
1502
+ var _el$ = _tmpl$$q(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling;
1503
1503
  _el$4.$$click = handleMcpClick;
1504
- _el$6.$$click = () => window.vessel.window.minimize();
1505
- _el$7.$$click = () => window.vessel.window.maximize();
1506
- _el$8.$$click = () => window.vessel.window.close();
1504
+ _el$6.$$click = () => props.onOpenDownloads?.();
1505
+ _el$7.$$click = () => window.vessel.window.minimize();
1506
+ _el$8.$$click = () => window.vessel.window.maximize();
1507
+ _el$9.$$click = () => window.vessel.window.close();
1507
1508
  createRenderEffect((_p$) => {
1508
1509
  var _v$ = !!(mcpStatus() === "ready"), _v$2 = !!(mcpStatus() === "error"), _v$3 = !!(mcpStatus() === "starting" || mcpStatus() === "stopped"), _v$4 = mcpTooltip();
1509
1510
  _v$ !== _p$.e && _el$4.classList.toggle("mcp-ready", _p$.e = _v$);
@@ -1540,7 +1541,7 @@ var LucideContext = createContext({
1540
1541
  absoluteStrokeWidth: false,
1541
1542
  class: ""
1542
1543
  });
1543
- var _tmpl$$o = /* @__PURE__ */ template(`<svg>`);
1544
+ var _tmpl$$p = /* @__PURE__ */ template(`<svg>`);
1544
1545
  var hasA11yProp = (props) => {
1545
1546
  for (const prop in props) {
1546
1547
  if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
@@ -1562,7 +1563,7 @@ var Icon = (props) => {
1562
1563
  const [localProps, rest] = splitProps(props, ["color", "size", "strokeWidth", "children", "class", "name", "iconNode", "absoluteStrokeWidth"]);
1563
1564
  const globalProps = useContext(LucideContext);
1564
1565
  return (() => {
1565
- var _el$ = _tmpl$$o();
1566
+ var _el$ = _tmpl$$p();
1566
1567
  spread(_el$, mergeProps(defaultAttributes_default, {
1567
1568
  get width() {
1568
1569
  return localProps.size ?? globalProps.size ?? defaultAttributes_default.width;
@@ -2295,7 +2296,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
2295
2296
  }
2296
2297
  return "idle";
2297
2298
  }
2298
- var _tmpl$$n = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$m = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$i = /* @__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$i = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$e = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$d = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$c = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$9 = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$7 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$6 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$6 = /* @__PURE__ */ template(`<span class=tab-loading>`);
2299
+ var _tmpl$$o = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$n = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$k = /* @__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$j = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$h = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$f = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$c = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$9 = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$7 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$6 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$6 = /* @__PURE__ */ template(`<span class=tab-loading>`);
2299
2300
  const TAB_CLOSE_MS = 200;
2300
2301
  function stringToHue(str) {
2301
2302
  let hash = 0;
@@ -2322,14 +2323,14 @@ const TabFavicon = (props) => {
2322
2323
  },
2323
2324
  get fallback() {
2324
2325
  return (() => {
2325
- var _el$2 = _tmpl$2$m();
2326
+ var _el$2 = _tmpl$2$n();
2326
2327
  insert(_el$2, letter);
2327
2328
  createRenderEffect((_$p) => setStyleProperty(_el$2, "--favicon-hue", `${hue()}`));
2328
2329
  return _el$2;
2329
2330
  })();
2330
2331
  },
2331
2332
  get children() {
2332
- var _el$ = _tmpl$$n();
2333
+ var _el$ = _tmpl$$o();
2333
2334
  _el$.addEventListener("error", () => setFailed(true));
2334
2335
  createRenderEffect(() => setAttribute(_el$, "src", props.favicon));
2335
2336
  return _el$;
@@ -2389,7 +2390,7 @@ const TabBar = () => {
2389
2390
  }, TAB_CLOSE_MS);
2390
2391
  };
2391
2392
  return (() => {
2392
- var _el$3 = _tmpl$3$i(), _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;
2393
+ var _el$3 = _tmpl$3$k(), _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;
2393
2394
  insert(_el$4, createComponent(For, {
2394
2395
  get each() {
2395
2396
  return tabEntries();
@@ -2400,7 +2401,7 @@ const TabBar = () => {
2400
2401
  },
2401
2402
  get fallback() {
2402
2403
  return memo(() => entry.type === "group")() && (() => {
2403
- var _el$0 = _tmpl$4$i(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
2404
+ var _el$0 = _tmpl$4$j(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
2404
2405
  _el$0.$$contextmenu = (e) => {
2405
2406
  e.preventDefault();
2406
2407
  window.vessel.tabs.showGroupContextMenu(entry.groupId);
@@ -2426,7 +2427,7 @@ const TabBar = () => {
2426
2427
  return memo(() => entry.type === "tab")() && (() => {
2427
2428
  const tab = entry.tab;
2428
2429
  return (() => {
2429
- var _el$12 = _tmpl$6$d();
2430
+ var _el$12 = _tmpl$6$f();
2430
2431
  _el$12.$$contextmenu = (e) => {
2431
2432
  e.preventDefault();
2432
2433
  window.vessel.tabs.showContextMenu(tab.id);
@@ -2451,7 +2452,7 @@ const TabBar = () => {
2451
2452
  return memo(() => !!tab.isPinned)() && (tab.isAudible || tab.isMuted);
2452
2453
  },
2453
2454
  get children() {
2454
- var _el$13 = _tmpl$5$e();
2455
+ var _el$13 = _tmpl$5$h();
2455
2456
  _el$13.$$click = (e) => {
2456
2457
  e.stopPropagation();
2457
2458
  void toggleMute(tab.id);
@@ -2555,7 +2556,7 @@ const TabBar = () => {
2555
2556
  })();
2556
2557
  };
2557
2558
  delegateEvents(["click", "contextmenu"]);
2558
- var _tmpl$$m = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=security-popup-actions><button class=security-popup-action-proceed>Proceed Anyway</button><button class=security-popup-action-back>Go Back to Safety`);
2559
+ var _tmpl$$n = /* @__PURE__ */ template(`<button class=security-popup-link>Reset permissions for this site`), _tmpl$2$m = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More</button><div class=security-popup-section><div class=security-popup-section-title>Site permissions`), _tmpl$3$j = /* @__PURE__ */ template(`<p class=security-popup-muted>No saved permission decisions for this site.`), _tmpl$4$i = /* @__PURE__ */ template(`<div class=security-popup-permission-row><span></span><strong>`), _tmpl$5$g = /* @__PURE__ */ template(`<div class=security-popup-actions><button class=security-popup-action-proceed>Proceed Anyway</button><button class=security-popup-action-back>Go Back to Safety`);
2559
2560
  const SecurityPopup = (props) => {
2560
2561
  const statusText = () => {
2561
2562
  switch (props.state.status) {
@@ -2569,6 +2570,21 @@ const SecurityPopup = (props) => {
2569
2570
  return "No security information available.";
2570
2571
  }
2571
2572
  };
2573
+ const [permissions, setPermissions] = createSignal([]);
2574
+ const origin = createMemo(() => {
2575
+ try {
2576
+ return new URL(props.state.url).origin;
2577
+ } catch {
2578
+ return "";
2579
+ }
2580
+ });
2581
+ const sitePermissions = createMemo(() => permissions().filter((item) => item.origin === origin()));
2582
+ const loadPermissions = async () => {
2583
+ try {
2584
+ setPermissions(await window.vessel.permissions.getAll());
2585
+ } catch {
2586
+ }
2587
+ };
2572
2588
  const handleLearnMore = () => {
2573
2589
  window.vessel.security.showDetails(props.state);
2574
2590
  props.onClose();
@@ -2582,6 +2598,7 @@ const SecurityPopup = (props) => {
2582
2598
  props.onClose();
2583
2599
  };
2584
2600
  onMount(() => {
2601
+ void loadPermissions();
2585
2602
  const handleClickOutside = (e) => {
2586
2603
  const target = e.target;
2587
2604
  if (!target.closest(".security-indicator-wrapper")) {
@@ -2592,17 +2609,47 @@ const SecurityPopup = (props) => {
2592
2609
  onCleanup(() => document.removeEventListener("click", handleClickOutside, true));
2593
2610
  });
2594
2611
  return (() => {
2595
- var _el$ = _tmpl$$m(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
2612
+ var _el$ = _tmpl$2$m(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling;
2613
+ _el$5.firstChild;
2596
2614
  _el$.$$click = (e) => e.stopPropagation();
2597
2615
  insert(_el$3, statusText);
2598
2616
  _el$4.$$click = handleLearnMore;
2617
+ insert(_el$5, createComponent(Show, {
2618
+ get when() {
2619
+ return sitePermissions().length > 0;
2620
+ },
2621
+ get fallback() {
2622
+ return _tmpl$3$j();
2623
+ },
2624
+ get children() {
2625
+ return [createComponent(For, {
2626
+ get each() {
2627
+ return sitePermissions();
2628
+ },
2629
+ children: (item) => (() => {
2630
+ var _el$9 = _tmpl$4$i(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
2631
+ insert(_el$0, () => item.permission);
2632
+ insert(_el$1, () => item.decision);
2633
+ createRenderEffect(() => className(_el$1, item.decision));
2634
+ return _el$9;
2635
+ })()
2636
+ }), (() => {
2637
+ var _el$7 = _tmpl$$n();
2638
+ _el$7.$$click = async () => {
2639
+ await window.vessel.permissions.clearOrigin(origin());
2640
+ await loadPermissions();
2641
+ };
2642
+ return _el$7;
2643
+ })()];
2644
+ }
2645
+ }), null);
2599
2646
  insert(_el$2, (() => {
2600
2647
  var _c$ = memo(() => !!props.state.canProceed);
2601
2648
  return () => _c$() && (() => {
2602
- var _el$5 = _tmpl$2$l(), _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;
2603
- _el$6.$$click = handleProceedAnyway;
2604
- _el$7.$$click = handleGoBackToSafety;
2605
- return _el$5;
2649
+ var _el$10 = _tmpl$5$g(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
2650
+ _el$11.$$click = handleProceedAnyway;
2651
+ _el$12.$$click = handleGoBackToSafety;
2652
+ return _el$10;
2606
2653
  })();
2607
2654
  })(), null);
2608
2655
  return _el$;
@@ -2951,7 +2998,7 @@ const SEARCH_ENGINE_PRESETS = {
2951
2998
  ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
2952
2999
  kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
2953
3000
  };
2954
- var _tmpl$$l = /* @__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$k = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z">`), _tmpl$3$h = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.5>`), _tmpl$4$h = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$d = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$c = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$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$8$8 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$6 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$5 = /* @__PURE__ */ template(`<div class=page-diff-popup><div class=page-diff-popup-header><div class=page-diff-popup-header-copy><span>Compared with your last visit</span><span class=page-diff-burst-meta>Previous snapshot from </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$1$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$10$5 = /* @__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$11$5 = /* @__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$12$5 = /* @__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$13$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$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$15$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$3 = /* @__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$17$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$18$3 = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><circle cx=7 cy=8 r=0.8 fill=white>`), _tmpl$19$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$20$3 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$25$2 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$27$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><div class=page-diff-badges><span class=page-diff-kind></span><span class=page-diff-section></span></div><span class=page-diff-summary>`), _tmpl$29$2 = /* @__PURE__ */ template(`<li>`);
3001
+ var _tmpl$$m = /* @__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$l = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z">`), _tmpl$3$i = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.5>`), _tmpl$4$h = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$f = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$e = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$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$8$8 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$6 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$5 = /* @__PURE__ */ template(`<div class=page-diff-popup><div class=page-diff-popup-header><div class=page-diff-popup-header-copy><span>Compared with your last visit</span><span class=page-diff-burst-meta>Previous snapshot from </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$1$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$10$5 = /* @__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$11$5 = /* @__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$12$5 = /* @__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$13$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$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$15$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$3 = /* @__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$17$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$18$3 = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><circle cx=7 cy=8 r=0.8 fill=white>`), _tmpl$19$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$20$3 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$3 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$3 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$3 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$25$3 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$26$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$27$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><div class=page-diff-badges><span class=page-diff-kind></span><span class=page-diff-section></span></div><span class=page-diff-summary>`), _tmpl$29$2 = /* @__PURE__ */ template(`<li>`);
2955
3002
  const AddressBar = (props) => {
2956
3003
  const {
2957
3004
  activeTab,
@@ -3006,6 +3053,21 @@ const AddressBar = (props) => {
3006
3053
  return engine === "none" ? SEARCH_ENGINE_PRESETS.duckduckgo : SEARCH_ENGINE_PRESETS[engine];
3007
3054
  });
3008
3055
  const buildSearchUrl = (query) => searchEnginePreset().url + encodeURIComponent(query);
3056
+ const looksLikeUrl = (value) => {
3057
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(value)) return true;
3058
+ if (/^(about|file|data|javascript):/i.test(value)) return true;
3059
+ if (/^localhost(:\d+)?([/?#]|$)/i.test(value)) return true;
3060
+ if (/^\d{1,3}(\.\d{1,3}){3}(:\d+)?([/?#]|$)/.test(value)) return true;
3061
+ return /^[^\s]+\.[^\s]{2,}([/?#].*)?$/i.test(value);
3062
+ };
3063
+ const resolveAddressInput = (value) => {
3064
+ const trimmed = value.trim();
3065
+ if (!trimmed) return trimmed;
3066
+ if (searchEngine() !== "none" && !looksLikeUrl(trimmed)) {
3067
+ return buildSearchUrl(trimmed);
3068
+ }
3069
+ return trimmed;
3070
+ };
3009
3071
  const [pageDiff, setPageDiff] = createSignal(null);
3010
3072
  const [diffExpanded, setDiffExpanded] = createSignal(false);
3011
3073
  let diffCollapseTimer = null;
@@ -3202,7 +3264,7 @@ const AddressBar = (props) => {
3202
3264
  selectSuggestion(items[idx].url);
3203
3265
  } else {
3204
3266
  const val = inputValue().trim();
3205
- if (val) commitAddressNavigation(val);
3267
+ if (val) commitAddressNavigation(resolveAddressInput(val));
3206
3268
  }
3207
3269
  };
3208
3270
  const handleInputKeyDown = (e) => {
@@ -3239,7 +3301,7 @@ const AddressBar = (props) => {
3239
3301
  insert(_el$, createComponent(Show, {
3240
3302
  when: isPrivateWindow,
3241
3303
  get children() {
3242
- return _tmpl$$l();
3304
+ return _tmpl$$m();
3243
3305
  }
3244
3306
  }), _el$11);
3245
3307
  insert(_el$, createComponent(Show, {
@@ -3263,7 +3325,7 @@ const AddressBar = (props) => {
3263
3325
  return securityState()?.status === "secure";
3264
3326
  },
3265
3327
  get children() {
3266
- var _el$9 = _tmpl$2$k();
3328
+ var _el$9 = _tmpl$2$l();
3267
3329
  _el$9.firstChild;
3268
3330
  return _el$9;
3269
3331
  }
@@ -3272,7 +3334,7 @@ const AddressBar = (props) => {
3272
3334
  return securityState()?.status === "insecure";
3273
3335
  },
3274
3336
  get children() {
3275
- var _el$1 = _tmpl$3$h();
3337
+ var _el$1 = _tmpl$3$i();
3276
3338
  _el$1.firstChild;
3277
3339
  return _el$1;
3278
3340
  }
@@ -3332,7 +3394,7 @@ const AddressBar = (props) => {
3332
3394
  return memo(() => !!showSuggestions())() && suggestions().length > 0;
3333
3395
  },
3334
3396
  get children() {
3335
- var _el$14 = _tmpl$5$d();
3397
+ var _el$14 = _tmpl$5$f();
3336
3398
  insert(_el$14, createComponent(For, {
3337
3399
  get each() {
3338
3400
  return suggestions();
@@ -3370,7 +3432,7 @@ const AddressBar = (props) => {
3370
3432
  insert(_el$11, createComponent(Show, {
3371
3433
  when: !isPrivateWindow,
3372
3434
  get children() {
3373
- var _el$15 = _tmpl$6$c(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
3435
+ var _el$15 = _tmpl$6$e(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
3374
3436
  insert(_el$17, () => agentStatusMessage() || (agentPresence() === "active" ? "Agent Active" : agentPresence() === "recent" ? "Agent Connected" : "Agent Offline"));
3375
3437
  createRenderEffect((_p$) => {
3376
3438
  var _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");
@@ -3439,13 +3501,13 @@ const AddressBar = (props) => {
3439
3501
  return parseDiffSummaryParts(burst.summary);
3440
3502
  },
3441
3503
  children: (part) => (() => {
3442
- var _el$58 = _tmpl$22$2(), _el$60 = _el$58.firstChild;
3504
+ var _el$58 = _tmpl$22$3(), _el$60 = _el$58.firstChild;
3443
3505
  insert(_el$58, createComponent(Show, {
3444
3506
  get when() {
3445
3507
  return part.section;
3446
3508
  },
3447
3509
  get children() {
3448
- var _el$59 = _tmpl$21$2();
3510
+ var _el$59 = _tmpl$21$3();
3449
3511
  insert(_el$59, () => part.section);
3450
3512
  return _el$59;
3451
3513
  }
@@ -3475,13 +3537,13 @@ const AddressBar = (props) => {
3475
3537
  return change.before || change.after;
3476
3538
  },
3477
3539
  get children() {
3478
- var _el$67 = _tmpl$25$2();
3540
+ var _el$67 = _tmpl$25$3();
3479
3541
  insert(_el$67, createComponent(Show, {
3480
3542
  get when() {
3481
3543
  return change.before;
3482
3544
  },
3483
3545
  get children() {
3484
- var _el$68 = _tmpl$23$2(), _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
3546
+ var _el$68 = _tmpl$23$3(), _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
3485
3547
  insert(_el$70, () => change.before);
3486
3548
  return _el$68;
3487
3549
  }
@@ -3491,7 +3553,7 @@ const AddressBar = (props) => {
3491
3553
  return change.after;
3492
3554
  },
3493
3555
  get children() {
3494
- var _el$71 = _tmpl$24$2(), _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling;
3556
+ var _el$71 = _tmpl$24$3(), _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling;
3495
3557
  insert(_el$73, () => change.after);
3496
3558
  return _el$71;
3497
3559
  }
@@ -3504,7 +3566,7 @@ const AddressBar = (props) => {
3504
3566
  return change.addedItems?.length;
3505
3567
  },
3506
3568
  get children() {
3507
- var _el$74 = _tmpl$26$2(), _el$75 = _el$74.firstChild, _el$76 = _el$75.nextSibling;
3569
+ var _el$74 = _tmpl$26$3(), _el$75 = _el$74.firstChild, _el$76 = _el$75.nextSibling;
3508
3570
  insert(_el$76, createComponent(For, {
3509
3571
  get each() {
3510
3572
  return change.addedItems;
@@ -3523,7 +3585,7 @@ const AddressBar = (props) => {
3523
3585
  return change.removedItems?.length;
3524
3586
  },
3525
3587
  get children() {
3526
- var _el$77 = _tmpl$27$2(), _el$78 = _el$77.firstChild, _el$79 = _el$78.nextSibling;
3588
+ var _el$77 = _tmpl$27$3(), _el$78 = _el$77.firstChild, _el$79 = _el$78.nextSibling;
3527
3589
  insert(_el$79, createComponent(For, {
3528
3590
  get each() {
3529
3591
  return change.removedItems;
@@ -3653,7 +3715,7 @@ const AddressBar = (props) => {
3653
3715
  })();
3654
3716
  };
3655
3717
  delegateEvents(["click", "input", "keydown", "mousedown"]);
3656
- var _tmpl$$k = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$j = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
3718
+ var _tmpl$$l = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$k = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
3657
3719
  const TOAST_DURATION_MS$1 = 4200;
3658
3720
  const TOAST_EXIT_MS$2 = 300;
3659
3721
  function isBookmarkToastCandidate(action) {
@@ -3713,13 +3775,13 @@ const BookmarkNotifications = () => {
3713
3775
  timeoutIds.clear();
3714
3776
  });
3715
3777
  return (() => {
3716
- var _el$ = _tmpl$$k();
3778
+ var _el$ = _tmpl$$l();
3717
3779
  insert(_el$, createComponent(For, {
3718
3780
  get each() {
3719
3781
  return toasts();
3720
3782
  },
3721
3783
  children: (toast) => (() => {
3722
- var _el$2 = _tmpl$2$j(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3784
+ var _el$2 = _tmpl$2$k(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3723
3785
  insert(_el$3, () => toast.title);
3724
3786
  insert(_el$4, () => toast.message);
3725
3787
  createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!toast.leaving));
@@ -3729,7 +3791,7 @@ const BookmarkNotifications = () => {
3729
3791
  return _el$;
3730
3792
  })();
3731
3793
  };
3732
- var _tmpl$$j = /* @__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>`);
3794
+ var _tmpl$$k = /* @__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>`);
3733
3795
  const TOAST_DURATION_MS = 3e3;
3734
3796
  const TOAST_EXIT_MS$1 = 300;
3735
3797
  const HighlightNotifications = (props) => {
@@ -3768,7 +3830,7 @@ const HighlightNotifications = (props) => {
3768
3830
  return memo(() => !!visible())() && current();
3769
3831
  },
3770
3832
  get children() {
3771
- var _el$ = _tmpl$$j(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3833
+ var _el$ = _tmpl$$k(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3772
3834
  insert(_el$3, () => current().title);
3773
3835
  insert(_el$4, () => current().message);
3774
3836
  createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!leaving()));
@@ -3776,10 +3838,10 @@ const HighlightNotifications = (props) => {
3776
3838
  }
3777
3839
  });
3778
3840
  };
3779
- var _tmpl$$i = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$i = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$g = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$g = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$c = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$b = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$a = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
3841
+ var _tmpl$$j = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$j = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$h = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$g = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$e = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$d = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$a = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
3780
3842
  const TOAST_DONE_DURATION_MS = 4200;
3781
3843
  const TOAST_EXIT_MS = 300;
3782
- function formatBytes(bytes) {
3844
+ function formatBytes$1(bytes) {
3783
3845
  if (bytes <= 0) return "";
3784
3846
  const units = ["B", "KB", "MB", "GB"];
3785
3847
  let i = 0;
@@ -3867,7 +3929,7 @@ const DownloadToast = () => {
3867
3929
  return Math.min(100, Math.round(d.receivedBytes / d.totalBytes * 100));
3868
3930
  };
3869
3931
  return (() => {
3870
- var _el$ = _tmpl$$i();
3932
+ var _el$ = _tmpl$$j();
3871
3933
  insert(_el$, createComponent(For, {
3872
3934
  get each() {
3873
3935
  return downloads();
@@ -3880,7 +3942,7 @@ const DownloadToast = () => {
3880
3942
  return dl.state === "completed";
3881
3943
  },
3882
3944
  get children() {
3883
- return _tmpl$2$i();
3945
+ return _tmpl$2$j();
3884
3946
  }
3885
3947
  }), null);
3886
3948
  insert(_el$3, createComponent(Show, {
@@ -3888,7 +3950,7 @@ const DownloadToast = () => {
3888
3950
  return dl.state === "cancelled" || dl.state === "interrupted";
3889
3951
  },
3890
3952
  get children() {
3891
- return _tmpl$3$g();
3953
+ return _tmpl$3$h();
3892
3954
  }
3893
3955
  }), null);
3894
3956
  insert(_el$2, createComponent(Show, {
@@ -3901,14 +3963,14 @@ const DownloadToast = () => {
3901
3963
  createRenderEffect((_$p) => setStyleProperty(_el$8, "width", `${progressPercent(dl)}%`));
3902
3964
  return _el$7;
3903
3965
  })(), (() => {
3904
- var _el$9 = _tmpl$5$c();
3905
- insert(_el$9, () => formatBytes(dl.receivedBytes), null);
3966
+ var _el$9 = _tmpl$5$e();
3967
+ insert(_el$9, () => formatBytes$1(dl.receivedBytes), null);
3906
3968
  insert(_el$9, createComponent(Show, {
3907
3969
  get when() {
3908
3970
  return dl.totalBytes > 0;
3909
3971
  },
3910
3972
  get children() {
3911
- return [" / ", memo(() => formatBytes(dl.totalBytes))];
3973
+ return [" / ", memo(() => formatBytes$1(dl.totalBytes))];
3912
3974
  }
3913
3975
  }), null);
3914
3976
  return _el$9;
@@ -3920,8 +3982,8 @@ const DownloadToast = () => {
3920
3982
  return dl.state === "completed";
3921
3983
  },
3922
3984
  get children() {
3923
- var _el$0 = _tmpl$6$b(), _el$1 = _el$0.firstChild;
3924
- insert(_el$0, () => formatBytes(dl.receivedBytes), _el$1);
3985
+ var _el$0 = _tmpl$6$d(), _el$1 = _el$0.firstChild;
3986
+ insert(_el$0, () => formatBytes$1(dl.receivedBytes), _el$1);
3925
3987
  return _el$0;
3926
3988
  }
3927
3989
  }), null);
@@ -3932,6 +3994,67 @@ const DownloadToast = () => {
3932
3994
  return _el$;
3933
3995
  })();
3934
3996
  };
3997
+ var _tmpl$$i = /* @__PURE__ */ template(`<div class=modal-backdrop><div class=downloads-panel><div class=downloads-panel-header><div><h2>Downloads</h2><p>Recent files saved by Vessel</p></div><div class=downloads-panel-actions><button>Clear</button><button>Close</button></div></div><div class=downloads-panel-list>`), _tmpl$2$i = /* @__PURE__ */ template(`<div class=downloads-empty>No downloads yet.`), _tmpl$3$g = /* @__PURE__ */ template(`<div class=downloads-row><div class=downloads-file><strong></strong><span></span><small> · </small></div><div class=downloads-row-actions><button>Open</button><button>Show in folder`);
3998
+ const formatBytes = (bytes) => {
3999
+ if (!bytes) return "0 B";
4000
+ const units = ["B", "KB", "MB", "GB"];
4001
+ let size = bytes;
4002
+ let unit = 0;
4003
+ while (size >= 1024 && unit < units.length - 1) {
4004
+ size /= 1024;
4005
+ unit += 1;
4006
+ }
4007
+ return `${size.toFixed(size >= 10 || unit === 0 ? 0 : 1)} ${units[unit]}`;
4008
+ };
4009
+ const DownloadsPanel = (props) => {
4010
+ const [items, setItems] = createSignal([]);
4011
+ const load = async () => setItems(await window.vessel.downloads.getAll());
4012
+ onMount(() => {
4013
+ void load();
4014
+ const off = window.vessel.downloads.onUpdate(setItems);
4015
+ onCleanup(off);
4016
+ });
4017
+ return createComponent(Show, {
4018
+ get when() {
4019
+ return props.open;
4020
+ },
4021
+ get children() {
4022
+ var _el$ = _tmpl$$i(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$3.nextSibling;
4023
+ addEventListener(_el$, "click", props.onClose, true);
4024
+ _el$2.$$click = (e) => e.stopPropagation();
4025
+ _el$6.$$click = async () => {
4026
+ await window.vessel.downloads.clear();
4027
+ await load();
4028
+ };
4029
+ addEventListener(_el$7, "click", props.onClose, true);
4030
+ insert(_el$8, createComponent(For, {
4031
+ get each() {
4032
+ return items();
4033
+ },
4034
+ get fallback() {
4035
+ return _tmpl$2$i();
4036
+ },
4037
+ children: (item) => (() => {
4038
+ var _el$0 = _tmpl$3$g(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$1.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
4039
+ insert(_el$10, () => item.filename);
4040
+ insert(_el$11, () => item.savePath);
4041
+ insert(_el$12, () => item.state, _el$13);
4042
+ insert(_el$12, () => formatBytes(item.receivedBytes), null);
4043
+ insert(_el$12, (() => {
4044
+ var _c$ = memo(() => !!item.totalBytes);
4045
+ return () => _c$() ? ` / ${formatBytes(item.totalBytes)}` : "";
4046
+ })(), null);
4047
+ _el$15.$$click = () => window.vessel.downloads.open(item.id);
4048
+ _el$16.$$click = () => window.vessel.downloads.showInFolder(item.id);
4049
+ createRenderEffect(() => _el$15.disabled = item.state !== "completed");
4050
+ return _el$0;
4051
+ })()
4052
+ }));
4053
+ return _el$;
4054
+ }
4055
+ });
4056
+ };
4057
+ delegateEvents(["click"]);
3935
4058
  var _tmpl$$h = /* @__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$h = /* @__PURE__ */ template(`<span class=find-bar-count>`);
3936
4059
  const FindBar = () => {
3937
4060
  const [open, setOpen] = createSignal(false);
@@ -4037,7 +4160,7 @@ const FindBar = () => {
4037
4160
  });
4038
4161
  };
4039
4162
  delegateEvents(["input", "click"]);
4040
- var _tmpl$$g = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$g = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$f = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$f = /* @__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$b = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
4163
+ var _tmpl$$g = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$g = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$f = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$f = /* @__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$d = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
4041
4164
  const FlowProgress = () => {
4042
4165
  const {
4043
4166
  runtimeState: runtimeState2
@@ -4082,7 +4205,7 @@ const FlowProgress = () => {
4082
4205
  return t().steps;
4083
4206
  },
4084
4207
  children: (step) => (() => {
4085
- var _el$12 = _tmpl$5$b(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
4208
+ var _el$12 = _tmpl$5$d(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
4086
4209
  insert(_el$14, () => step.label);
4087
4210
  createRenderEffect(() => className(_el$12, `flow-step ${stepStatusClass(step.status)}`));
4088
4211
  return _el$12;
@@ -4127,7 +4250,7 @@ const FlowProgress = () => {
4127
4250
  return f().steps;
4128
4251
  },
4129
4252
  children: (step) => (() => {
4130
- var _el$23 = _tmpl$5$b(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
4253
+ var _el$23 = _tmpl$5$d(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
4131
4254
  insert(_el$25, () => step.label);
4132
4255
  createRenderEffect(() => className(_el$23, `flow-step ${stepStatusClass(step.status)}`));
4133
4256
  return _el$23;
@@ -4168,7 +4291,7 @@ function formatTime(iso, options) {
4168
4291
  ...options?.includeSeconds && { second: "2-digit" }
4169
4292
  });
4170
4293
  }
4171
- var _tmpl$$f = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$e = /* @__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$a = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$a = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$9 = /* @__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>`);
4294
+ var _tmpl$$f = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$f = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$e = /* @__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$c = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$c = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$9 = /* @__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>`);
4172
4295
  const AgentTranscriptDock = () => {
4173
4296
  const {
4174
4297
  runtimeState: runtimeState2
@@ -4215,10 +4338,10 @@ const AgentTranscriptDock = () => {
4215
4338
  return hasStreamingEntry();
4216
4339
  },
4217
4340
  get children() {
4218
- return _tmpl$5$a();
4341
+ return _tmpl$5$c();
4219
4342
  }
4220
4343
  }), (() => {
4221
- var _el$10 = _tmpl$6$a(), _el$11 = _el$10.firstChild;
4344
+ var _el$10 = _tmpl$6$c(), _el$11 = _el$10.firstChild;
4222
4345
  insert(_el$10, () => entry().title || entry().kind, _el$11);
4223
4346
  insert(_el$10, (() => {
4224
4347
  var _c$ = memo(() => entry().text.length > 80);
@@ -4625,7 +4748,7 @@ function useAnimatedPresence(isOpen, exitDurationMs) {
4625
4748
  });
4626
4749
  return { visible, closing };
4627
4750
  }
4628
- var _tmpl$$e = /* @__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$e = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$d = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$d = /* @__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$9 = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$9 = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
4751
+ var _tmpl$$e = /* @__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$e = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$d = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$d = /* @__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$b = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$b = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
4629
4752
  const COMMAND_BAR_EXIT_MS = 200;
4630
4753
  const CommandBar = () => {
4631
4754
  const {
@@ -4712,7 +4835,7 @@ const CommandBar = () => {
4712
4835
  return recentQueries2();
4713
4836
  },
4714
4837
  children: (q) => (() => {
4715
- var _el$14 = _tmpl$5$9();
4838
+ var _el$14 = _tmpl$5$b();
4716
4839
  _el$14.$$click = () => void handleRecentClick(q);
4717
4840
  insert(_el$14, q);
4718
4841
  return _el$14;
@@ -4726,7 +4849,7 @@ const CommandBar = () => {
4726
4849
  return hasProvider();
4727
4850
  },
4728
4851
  get fallback() {
4729
- return _tmpl$6$9();
4852
+ return _tmpl$6$b();
4730
4853
  },
4731
4854
  get children() {
4732
4855
  return _tmpl$3$d();
@@ -6539,7 +6662,7 @@ function renderKitPrompt(kit, values) {
6539
6662
  (_, key) => values[key] ?? ""
6540
6663
  );
6541
6664
  }
6542
- var _tmpl$$c = /* @__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$c = /* @__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$b = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$5 = /* @__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$4 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$4 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$4 = /* @__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$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$3 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$1 = /* @__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$1 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$1 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-activity-output>`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=kit-activity-card><div class=kit-activity-header><div class=kit-activity-title><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-activity-title-copy><div class=kit-sched-name></div><div class=kit-activity-time></div></div></div><span class=kit-activity-badge>`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$1 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$1 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$1 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$1 = /* @__PURE__ */ template(`<input class=kit-form-input>`), _tmpl$39$1 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$1 = /* @__PURE__ */ template(`<option>`), _tmpl$42$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
6665
+ var _tmpl$$c = /* @__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$c = /* @__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$b = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$a = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$a = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$5 = /* @__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$4 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$4 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$4 = /* @__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$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$3 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-activity-output>`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=kit-activity-card><div class=kit-activity-header><div class=kit-activity-title><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-activity-title-copy><div class=kit-sched-name></div><div class=kit-activity-time></div></div></div><span class=kit-activity-badge>`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$1 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$1 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$1 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$1 = /* @__PURE__ */ template(`<input class=kit-form-input>`), _tmpl$39$1 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$1 = /* @__PURE__ */ template(`<option>`), _tmpl$42$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
6543
6666
  const ICON_MAP = {
6544
6667
  BookOpen: book_open_default,
6545
6668
  Tag: tag_default,
@@ -6858,7 +6981,7 @@ const AutomationTab = (props) => {
6858
6981
  };
6859
6982
  const timeValue = () => `${String(schedHour()).padStart(2, "0")}:${String(schedMinute()).padStart(2, "0")}`;
6860
6983
  return (() => {
6861
- var _el$ = _tmpl$23$1();
6984
+ var _el$ = _tmpl$23$2();
6862
6985
  insert(_el$, createComponent(Show, {
6863
6986
  get when() {
6864
6987
  return memo(() => !!!premiumData.loading)() && !isPremium();
@@ -6899,7 +7022,7 @@ const AutomationTab = (props) => {
6899
7022
  return allKits();
6900
7023
  },
6901
7024
  children: (kit) => (() => {
6902
- var _el$73 = _tmpl$26$1(), _el$74 = _el$73.firstChild, _el$75 = _el$74.nextSibling, _el$76 = _el$75.firstChild, _el$77 = _el$76.nextSibling;
7025
+ var _el$73 = _tmpl$26$2(), _el$74 = _el$73.firstChild, _el$75 = _el$74.nextSibling, _el$76 = _el$75.firstChild, _el$77 = _el$76.nextSibling;
6903
7026
  _el$73.$$keydown = (e) => e.key === "Enter" && selectKit(kit);
6904
7027
  _el$73.$$click = () => selectKit(kit);
6905
7028
  insert(_el$74, createComponent(KitIcon, {
@@ -6915,7 +7038,7 @@ const AutomationTab = (props) => {
6915
7038
  return kit.estimatedMinutes !== void 0;
6916
7039
  },
6917
7040
  get children() {
6918
- var _el$78 = _tmpl$24$1(), _el$79 = _el$78.firstChild, _el$81 = _el$79.nextSibling;
7041
+ var _el$78 = _tmpl$24$2(), _el$79 = _el$78.firstChild, _el$81 = _el$79.nextSibling;
6919
7042
  _el$81.nextSibling;
6920
7043
  insert(_el$78, () => kit.estimatedMinutes, _el$81);
6921
7044
  return _el$78;
@@ -6926,10 +7049,10 @@ const AutomationTab = (props) => {
6926
7049
  return !BUNDLED_KIT_IDS.has(kit.id);
6927
7050
  },
6928
7051
  get fallback() {
6929
- return _tmpl$27$1();
7052
+ return _tmpl$27$2();
6930
7053
  },
6931
7054
  get children() {
6932
- var _el$82 = _tmpl$25$1();
7055
+ var _el$82 = _tmpl$25$2();
6933
7056
  _el$82.$$click = (e) => void handleUninstall(e, kit.id);
6934
7057
  createRenderEffect((_p$) => {
6935
7058
  var _v$ = `Remove ${kit.name}`, _v$2 = `Remove ${kit.name}`;
@@ -6953,14 +7076,14 @@ const AutomationTab = (props) => {
6953
7076
  },
6954
7077
  get children() {
6955
7078
  return [(() => {
6956
- var _el$15 = _tmpl$5$8(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
7079
+ var _el$15 = _tmpl$5$a(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
6957
7080
  insert(_el$15, createComponent(clock_default, {
6958
7081
  size: 12
6959
7082
  }), _el$16);
6960
7083
  insert(_el$17, () => scheduledJobs().length);
6961
7084
  return _el$15;
6962
7085
  })(), (() => {
6963
- var _el$18 = _tmpl$6$8();
7086
+ var _el$18 = _tmpl$6$a();
6964
7087
  insert(_el$18, createComponent(For, {
6965
7088
  get each() {
6966
7089
  return scheduledJobs();
@@ -7301,7 +7424,7 @@ const AutomationTab = (props) => {
7301
7424
  return editingJob() !== null;
7302
7425
  },
7303
7426
  get children() {
7304
- var _el$54 = _tmpl$22$1(), _el$55 = _el$54.firstChild, _el$56 = _el$55.firstChild, _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling, _el$59 = _el$56.nextSibling, _el$70 = _el$59.nextSibling, _el$71 = _el$70.firstChild, _el$72 = _el$71.nextSibling;
7427
+ var _el$54 = _tmpl$22$2(), _el$55 = _el$54.firstChild, _el$56 = _el$55.firstChild, _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling, _el$59 = _el$56.nextSibling, _el$70 = _el$59.nextSibling, _el$71 = _el$70.firstChild, _el$72 = _el$71.nextSibling;
7305
7428
  _el$54.$$click = () => setEditingJob(null);
7306
7429
  _el$55.$$click = (e) => e.stopPropagation();
7307
7430
  insert(_el$58, () => editingJob().kitName);
@@ -7352,7 +7475,7 @@ const AutomationTab = (props) => {
7352
7475
  return _el$63;
7353
7476
  }
7354
7477
  }), (() => {
7355
- var _el$66 = _tmpl$21$1(), _el$67 = _el$66.firstChild, _el$68 = _el$67.nextSibling;
7478
+ var _el$66 = _tmpl$21$2(), _el$67 = _el$66.firstChild, _el$68 = _el$67.nextSibling;
7356
7479
  _el$68.$$input = (e) => parseEditTimeInput(e.currentTarget.value);
7357
7480
  createRenderEffect(() => _el$68.value = editTimeValue());
7358
7481
  return _el$66;
@@ -7378,7 +7501,7 @@ const AutomationTab = (props) => {
7378
7501
  })();
7379
7502
  };
7380
7503
  delegateEvents(["click", "input", "keydown", "contextmenu"]);
7381
- var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$7 = /* @__PURE__ */ template(`<div class=page-diff-history-list>`), _tmpl$6$7 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=page-diff-history-item><div class=page-diff-history-time><span class=page-diff-history-label></span><span></span></div><div class=page-diff-history-card><div class=page-diff-history-summary-list></div><div class=page-diff-history-position>Entry <!> of `), _tmpl$8$6 = /* @__PURE__ */ template(`<span class=page-diff-history-summary-section>`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=page-diff-history-summary-row><span class=page-diff-history-summary>`);
7504
+ var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=page-diff-history-list>`), _tmpl$6$9 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=page-diff-history-item><div class=page-diff-history-time><span class=page-diff-history-label></span><span></span></div><div class=page-diff-history-card><div class=page-diff-history-summary-list></div><div class=page-diff-history-position>Entry <!> of `), _tmpl$8$6 = /* @__PURE__ */ template(`<span class=page-diff-history-summary-section>`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=page-diff-history-summary-row><span class=page-diff-history-summary>`);
7382
7505
  const PageDiffTimeline = () => {
7383
7506
  const {
7384
7507
  activeTab
@@ -7430,7 +7553,7 @@ const PageDiffTimeline = () => {
7430
7553
  unsubscribe2();
7431
7554
  });
7432
7555
  return (() => {
7433
- var _el$ = _tmpl$6$7();
7556
+ var _el$ = _tmpl$6$9();
7434
7557
  insert(_el$, createComponent(Show, {
7435
7558
  get when() {
7436
7559
  return loading();
@@ -7463,7 +7586,7 @@ const PageDiffTimeline = () => {
7463
7586
  },
7464
7587
  get children() {
7465
7588
  return [_tmpl$4$a(), (() => {
7466
- var _el$6 = _tmpl$5$7();
7589
+ var _el$6 = _tmpl$5$9();
7467
7590
  insert(_el$6, createComponent(For, {
7468
7591
  get each() {
7469
7592
  return bursts();
@@ -7509,7 +7632,7 @@ const PageDiffTimeline = () => {
7509
7632
  })();
7510
7633
  };
7511
7634
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
7512
- var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__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$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$6 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__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$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__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$10$3 = /* @__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-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></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$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__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$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__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$16$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$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20$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$21 = /* @__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$22 = /* @__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$23 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24 = /* @__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$25 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__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$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__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$42 = /* @__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$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__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$53 = /* @__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$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__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$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__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$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
7635
+ var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__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$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$8 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__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$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__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$10$3 = /* @__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-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></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$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__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$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__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$16$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$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20$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$21$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$22$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$23$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24$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$25$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__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$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__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$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__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$42 = /* @__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$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__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$53 = /* @__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$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__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$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__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$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
7513
7636
  const UNSORTED_FOLDER = {
7514
7637
  id: "unsorted",
7515
7638
  name: "Unsorted",
@@ -8195,7 +8318,7 @@ ${contextBlock}` : contextBlock);
8195
8318
  return _tmpl$30();
8196
8319
  },
8197
8320
  get children() {
8198
- return [_tmpl$5$6(), createComponent(For, {
8321
+ return [_tmpl$5$8(), createComponent(For, {
8199
8322
  get each() {
8200
8323
  return runtimeState2().supervisor.pendingApprovals;
8201
8324
  },
@@ -8216,7 +8339,7 @@ ${contextBlock}` : contextBlock);
8216
8339
  return recentActions().length > 0;
8217
8340
  },
8218
8341
  get children() {
8219
- var _el$40 = _tmpl$6$6();
8342
+ var _el$40 = _tmpl$6$8();
8220
8343
  _el$40.$$click = () => setActionsExpanded((current) => !current);
8221
8344
  insert(_el$40, (() => {
8222
8345
  var _c$ = memo(() => !!actionsExpanded());
@@ -8938,13 +9061,13 @@ ${contextBlock}` : contextBlock);
8938
9061
  return isStreaming2() || messages2().length > 0;
8939
9062
  },
8940
9063
  get children() {
8941
- var _el$125 = _tmpl$23();
9064
+ var _el$125 = _tmpl$23$1();
8942
9065
  insert(_el$125, createComponent(Show, {
8943
9066
  get when() {
8944
9067
  return isStreaming2();
8945
9068
  },
8946
9069
  get children() {
8947
- var _el$126 = _tmpl$21();
9070
+ var _el$126 = _tmpl$21$1();
8948
9071
  _el$126.$$click = () => cancel();
8949
9072
  return _el$126;
8950
9073
  }
@@ -8954,7 +9077,7 @@ ${contextBlock}` : contextBlock);
8954
9077
  return memo(() => !!!isStreaming2())() && messages2().length > 0;
8955
9078
  },
8956
9079
  get children() {
8957
- var _el$127 = _tmpl$22();
9080
+ var _el$127 = _tmpl$22$1();
8958
9081
  _el$127.$$click = handleRetry;
8959
9082
  return _el$127;
8960
9083
  }
@@ -8966,7 +9089,7 @@ ${contextBlock}` : contextBlock);
8966
9089
  return highlightCount() > 0;
8967
9090
  },
8968
9091
  get children() {
8969
- var _el$128 = _tmpl$24(), _el$129 = _el$128.firstChild, _el$130 = _el$129.nextSibling;
9092
+ var _el$128 = _tmpl$24$1(), _el$129 = _el$128.firstChild, _el$130 = _el$129.nextSibling;
8970
9093
  _el$130.firstChild;
8971
9094
  var _el$132 = _el$130.nextSibling;
8972
9095
  _el$129.$$click = () => void scrollToHighlight(highlightIndex() - 1);
@@ -8992,14 +9115,14 @@ ${contextBlock}` : contextBlock);
8992
9115
  return queueNotice2() !== null || pendingQueryCount() > 0;
8993
9116
  },
8994
9117
  get children() {
8995
- var _el$133 = _tmpl$27(), _el$134 = _el$133.firstChild, _el$135 = _el$134.firstChild;
9118
+ var _el$133 = _tmpl$27$1(), _el$134 = _el$133.firstChild, _el$135 = _el$134.firstChild;
8996
9119
  insert(_el$135, () => queueNotice2() ?? `Queued ${pendingQueryCount()}/${pendingQueryLimit}.`);
8997
9120
  insert(_el$134, createComponent(Show, {
8998
9121
  get when() {
8999
9122
  return pendingQueryCount() > 0;
9000
9123
  },
9001
9124
  get children() {
9002
- var _el$136 = _tmpl$25();
9125
+ var _el$136 = _tmpl$25$1();
9003
9126
  _el$136.$$click = () => clearPendingQueries();
9004
9127
  return _el$136;
9005
9128
  }
@@ -9009,7 +9132,7 @@ ${contextBlock}` : contextBlock);
9009
9132
  return pendingQueries2().length > 0;
9010
9133
  },
9011
9134
  get children() {
9012
- var _el$137 = _tmpl$26();
9135
+ var _el$137 = _tmpl$26$1();
9013
9136
  insert(_el$137, createComponent(For, {
9014
9137
  get each() {
9015
9138
  return pendingQueries2();
@@ -9097,7 +9220,7 @@ ${contextBlock}` : contextBlock);
9097
9220
  });
9098
9221
  };
9099
9222
  delegateEvents(["click", "pointerdown", "input", "keydown"]);
9100
- var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__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$5 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$5 = /* @__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$5 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$2 = /* @__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$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$2 = /* @__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$2 = /* @__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$2 = /* @__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>`);
9223
+ var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__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$7 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$7 = /* @__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$5 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$2 = /* @__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$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$2 = /* @__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$2 = /* @__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$2 = /* @__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>`);
9101
9224
  function statusClass(status) {
9102
9225
  if (status == null) return "pending";
9103
9226
  if (status >= 200 && status < 300) return "ok";
@@ -9214,7 +9337,7 @@ const NetworkView = (props) => {
9214
9337
  return props.entries.length > 0;
9215
9338
  },
9216
9339
  get fallback() {
9217
- return _tmpl$5$5();
9340
+ return _tmpl$5$7();
9218
9341
  },
9219
9342
  get children() {
9220
9343
  var _el$8 = _tmpl$4$8();
@@ -9227,7 +9350,7 @@ const NetworkView = (props) => {
9227
9350
  return props.entries;
9228
9351
  },
9229
9352
  children: (entry) => (() => {
9230
- var _el$1 = _tmpl$6$5(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling;
9353
+ var _el$1 = _tmpl$6$7(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling;
9231
9354
  insert(_el$10, () => entry.method);
9232
9355
  insert(_el$11, () => shortenUrl(entry.url));
9233
9356
  insert(_el$12, (() => {
@@ -9541,6 +9664,17 @@ const PROVIDERS = {
9541
9664
  apiKeyPlaceholder: "sk-...",
9542
9665
  apiKeyHint: "Get your key from platform.openai.com"
9543
9666
  },
9667
+ openai_codex: {
9668
+ id: "openai_codex",
9669
+ name: "OpenAI Codex",
9670
+ type: "codex_oauth",
9671
+ defaultModel: "gpt-5",
9672
+ models: ["gpt-5", "gpt-5-mini", "gpt-5-nano", "o4", "o4-mini"],
9673
+ requiresApiKey: false,
9674
+ defaultBaseUrl: "https://api.openai.com/v1",
9675
+ apiKeyPlaceholder: "",
9676
+ apiKeyHint: "Sign in with your ChatGPT Plus or Pro subscription"
9677
+ },
9544
9678
  openrouter: {
9545
9679
  id: "openrouter",
9546
9680
  name: "OpenRouter",
@@ -9618,10 +9752,20 @@ const PROVIDERS = {
9618
9752
  apiKeyHint: "Optional — only if your endpoint requires authentication"
9619
9753
  }
9620
9754
  };
9621
- var _tmpl$$8 = /* @__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$8 = /* @__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> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<div class=settings-category-panel><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=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-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.`), _tmpl$4$7 = /* @__PURE__ */ template(`<option>`);
9755
+ var _tmpl$$8 = /* @__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$8 = /* @__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> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<button type=button class=settings-secondary-btn>Open latest release`), _tmpl$4$7 = /* @__PURE__ */ template(`<div class=settings-category-panel><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>Used for searches typed directly into the address bar and for agent web-search fallbacks. "None" disables address-bar search, so entries are treated as URLs 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=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>Updates</label><div class=settings-inline-actions><button type=button class=settings-secondary-btn></button></div><p class=settings-hint>Checks the published npm package and links to GitHub Releases for installers/AppImages.</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.`), _tmpl$5$6 = /* @__PURE__ */ template(`<option>`), _tmpl$6$6 = /* @__PURE__ */ template(`<p class=settings-hint>`);
9622
9756
  const SettingsGeneral = (props) => {
9757
+ const [checkingUpdates, setCheckingUpdates] = createSignal(false);
9758
+ const [updateResult, setUpdateResult] = createSignal(null);
9759
+ const checkUpdates = async () => {
9760
+ setCheckingUpdates(true);
9761
+ try {
9762
+ setUpdateResult(await window.vessel.updates.check());
9763
+ } finally {
9764
+ setCheckingUpdates(false);
9765
+ }
9766
+ };
9623
9767
  return (() => {
9624
- var _el$ = _tmpl$3$7(), _el$0 = _el$.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$0.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.firstChild, _el$24 = _el$21.nextSibling, _el$25 = _el$24.firstChild, _el$26 = _el$25.firstChild;
9768
+ var _el$ = _tmpl$4$7(), _el$0 = _el$.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$0.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$23.firstChild, _el$26 = _el$23.nextSibling, _el$27 = _el$21.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild;
9625
9769
  insert(_el$, createComponent(Show, {
9626
9770
  get when() {
9627
9771
  return props.welcomeBanner.show();
@@ -9651,29 +9795,73 @@ const SettingsGeneral = (props) => {
9651
9795
  return Object.entries(SEARCH_ENGINE_PRESETS);
9652
9796
  },
9653
9797
  children: ([id, preset]) => (() => {
9654
- var _el$27 = _tmpl$4$7();
9655
- _el$27.value = id;
9656
- insert(_el$27, () => preset.label);
9657
- return _el$27;
9798
+ var _el$33 = _tmpl$5$6();
9799
+ _el$33.value = id;
9800
+ insert(_el$33, () => preset.label);
9801
+ return _el$33;
9658
9802
  })()
9659
9803
  }), _el$14);
9660
9804
  _el$17.$$input = (e) => props.setDownloadPath(e.currentTarget.value);
9661
9805
  setAttribute(_el$17, "spellcheck", false);
9662
9806
  _el$20.addEventListener("change", (e) => props.setTheme(e.currentTarget.value));
9663
- _el$23.$$click = () => props.setAutoRestoreSession(!props.autoRestoreSession());
9664
- _el$26.$$click = () => props.setClearBookmarksOnLaunch(!props.clearBookmarksOnLaunch());
9807
+ _el$24.$$click = checkUpdates;
9808
+ insert(_el$24, () => checkingUpdates() ? "Checking…" : "Check for updates");
9809
+ insert(_el$23, createComponent(Show, {
9810
+ get when() {
9811
+ return updateResult()?.updateAvailable;
9812
+ },
9813
+ get children() {
9814
+ var _el$25 = _tmpl$3$7();
9815
+ _el$25.$$click = () => window.vessel.updates.openDownload();
9816
+ return _el$25;
9817
+ }
9818
+ }), null);
9819
+ insert(_el$21, createComponent(Show, {
9820
+ get when() {
9821
+ return updateResult();
9822
+ },
9823
+ children: (result) => (() => {
9824
+ var _el$34 = _tmpl$6$6();
9825
+ insert(_el$34, createComponent(Show, {
9826
+ get when() {
9827
+ return !result().error;
9828
+ },
9829
+ get fallback() {
9830
+ return ["Could not check for updates: ", memo(() => result().error)];
9831
+ },
9832
+ get children() {
9833
+ return createComponent(Show, {
9834
+ get when() {
9835
+ return result().updateAvailable;
9836
+ },
9837
+ get fallback() {
9838
+ return ["Vessel is up to date. Current version: ", memo(() => result().currentVersion), "."];
9839
+ },
9840
+ get children() {
9841
+ return ["Update available: ", memo(() => result().latestVersion), " is available. You have ", memo(() => result().currentVersion), "."];
9842
+ }
9843
+ });
9844
+ }
9845
+ }));
9846
+ return _el$34;
9847
+ })()
9848
+ }), _el$26);
9849
+ _el$29.$$click = () => props.setAutoRestoreSession(!props.autoRestoreSession());
9850
+ _el$32.$$click = () => props.setClearBookmarksOnLaunch(!props.clearBookmarksOnLaunch());
9665
9851
  createRenderEffect((_p$) => {
9666
- var _v$ = !!props.autoRestoreSession(), _v$2 = props.autoRestoreSession(), _v$3 = !!props.clearBookmarksOnLaunch(), _v$4 = props.clearBookmarksOnLaunch();
9667
- _v$ !== _p$.e && _el$23.classList.toggle("on", _p$.e = _v$);
9668
- _v$2 !== _p$.t && setAttribute(_el$23, "aria-checked", _p$.t = _v$2);
9669
- _v$3 !== _p$.a && _el$26.classList.toggle("on", _p$.a = _v$3);
9670
- _v$4 !== _p$.o && setAttribute(_el$26, "aria-checked", _p$.o = _v$4);
9852
+ var _v$ = checkingUpdates(), _v$2 = !!props.autoRestoreSession(), _v$3 = props.autoRestoreSession(), _v$4 = !!props.clearBookmarksOnLaunch(), _v$5 = props.clearBookmarksOnLaunch();
9853
+ _v$ !== _p$.e && (_el$24.disabled = _p$.e = _v$);
9854
+ _v$2 !== _p$.t && _el$29.classList.toggle("on", _p$.t = _v$2);
9855
+ _v$3 !== _p$.a && setAttribute(_el$29, "aria-checked", _p$.a = _v$3);
9856
+ _v$4 !== _p$.o && _el$32.classList.toggle("on", _p$.o = _v$4);
9857
+ _v$5 !== _p$.i && setAttribute(_el$32, "aria-checked", _p$.i = _v$5);
9671
9858
  return _p$;
9672
9859
  }, {
9673
9860
  e: void 0,
9674
9861
  t: void 0,
9675
9862
  a: void 0,
9676
- o: void 0
9863
+ o: void 0,
9864
+ i: void 0
9677
9865
  });
9678
9866
  createRenderEffect(() => _el$10.value = props.defaultUrl());
9679
9867
  createRenderEffect(() => _el$13.value = props.defaultSearchEngine());
@@ -9683,7 +9871,7 @@ const SettingsGeneral = (props) => {
9683
9871
  })();
9684
9872
  };
9685
9873
  delegateEvents(["click", "input"]);
9686
- var _tmpl$$7 = /* @__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$2$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$3$6 = /* @__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$4$6 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$5$4 = /* @__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$6$4 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$7$4 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$8$3 = /* @__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$9$1 = /* @__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$0$1 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured <code>llama-server</code> base URL. For agent loops, run <code>llama-server</code> with <code>--ctx-size 16384</code> minimum and <code>32768</code> recommended.`), _tmpl$1$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-reasoning-effort>Reasoning Level</label><select id=chat-reasoning-effort class="settings-input settings-select"></select><p class=settings-hint>Applies to providers and models that expose reasoning controls. Off requests no reasoning where supported and otherwise leaves the model at its normal behavior; Max requests the strongest supported reasoning tier.`), _tmpl$10$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><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-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-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=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-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.`), _tmpl$12$1 = /* @__PURE__ */ template(`<option>`), _tmpl$13$1 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$14$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$16 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$17 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$19 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$20 = /* @__PURE__ */ template(`<div>`);
9874
+ var _tmpl$$7 = /* @__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$2$7 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;gap:8px><span style=width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block></span><span>Connected as `), _tmpl$3$6 = /* @__PURE__ */ template(`<p class=settings-hint><button type=button class=settings-link-btn>Disconnect`), _tmpl$4$6 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label>Account`), _tmpl$5$5 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$6$5 = /* @__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$7$4 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$8$3 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$9$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$0$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$1$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$11$1 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured <code>llama-server</code> base URL. For agent loops, run <code>llama-server</code> with <code>--ctx-size 16384</code> minimum and <code>32768</code> recommended.`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-reasoning-effort>Reasoning Level</label><select id=chat-reasoning-effort class="settings-input settings-select"></select><p class=settings-hint>Applies to providers and models that expose reasoning controls. Off requests no reasoning where supported and otherwise leaves the model at its normal behavior; Max requests the strongest supported reasoning tier.`), _tmpl$13$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><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-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-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=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-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.`), _tmpl$15$1 = /* @__PURE__ */ template(`<option>`), _tmpl$16 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)> <button type=button class=settings-link-btn>Cancel`), _tmpl$17 = /* @__PURE__ */ template(`<div>`), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>`), _tmpl$19 = /* @__PURE__ */ template(`<button type=button class=settings-btn>Try Again`), _tmpl$20 = /* @__PURE__ */ template(`<div><button type=button class=settings-btn>Connect with ChatGPT</button><p class=settings-hint>Sign in with your ChatGPT Plus or Pro subscription. A browser tab will open where you'll authorize Vessel.`), _tmpl$21 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$23 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$24 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$26 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`);
9687
9875
  const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
9688
9876
  id: p.id,
9689
9877
  name: p.name,
@@ -9713,7 +9901,7 @@ const REASONING_EFFORT_OPTIONS = [{
9713
9901
  const SettingsAgent = (props) => {
9714
9902
  const chatMeta = () => CHAT_PROVIDERS$1.find((p) => p.id === props.chat.providerId()) ?? CHAT_PROVIDERS$1[0];
9715
9903
  return (() => {
9716
- var _el$ = _tmpl$11$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$27 = _el$3.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$33 = _el$31.nextSibling, _el$34 = _el$30.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.nextSibling;
9904
+ var _el$ = _tmpl$14$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$35 = _el$3.nextSibling, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, _el$38 = _el$35.nextSibling, _el$39 = _el$38.firstChild, _el$41 = _el$39.nextSibling, _el$42 = _el$38.nextSibling, _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling, _el$45 = _el$42.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling;
9717
9905
  _el$5.$$click = () => props.chat.setEnabled(!props.chat.enabled());
9718
9906
  insert(_el$, createComponent(Show, {
9719
9907
  get when() {
@@ -9734,230 +9922,304 @@ const SettingsAgent = (props) => {
9734
9922
  insert(_el$8, createComponent(For, {
9735
9923
  each: CHAT_PROVIDERS$1,
9736
9924
  children: (p) => (() => {
9737
- var _el$40 = _tmpl$12$1();
9738
- insert(_el$40, () => p.name);
9739
- createRenderEffect(() => _el$40.value = p.id);
9740
- return _el$40;
9925
+ var _el$48 = _tmpl$15$1();
9926
+ insert(_el$48, () => p.name);
9927
+ createRenderEffect(() => _el$48.value = p.id);
9928
+ return _el$48;
9741
9929
  })()
9742
9930
  }));
9743
9931
  createRenderEffect(() => _el$8.value = props.chat.providerId());
9744
9932
  return _el$6;
9745
9933
  })(), createComponent(Show, {
9746
9934
  get when() {
9747
- return chatMeta().requiresKey || props.chat.providerId() === "custom";
9935
+ return props.chat.providerType() === "codex_oauth";
9748
9936
  },
9749
9937
  get children() {
9750
- var _el$9 = _tmpl$5$4(), _el$0 = _el$9.firstChild;
9751
- _el$0.firstChild;
9752
- var _el$11 = _el$0.nextSibling;
9753
- insert(_el$0, createComponent(Show, {
9938
+ var _el$9 = _tmpl$4$6();
9939
+ _el$9.firstChild;
9940
+ insert(_el$9, createComponent(Show, {
9941
+ get when() {
9942
+ return props.chat.codexAuthStatus() === "connected";
9943
+ },
9944
+ get fallback() {
9945
+ return (() => {
9946
+ var _el$49 = _tmpl$17();
9947
+ insert(_el$49, createComponent(Show, {
9948
+ get when() {
9949
+ return props.chat.codexAuthStatus() === "waiting" || props.chat.codexAuthStatus() === "exchanging";
9950
+ },
9951
+ get fallback() {
9952
+ return createComponent(Show, {
9953
+ get when() {
9954
+ return props.chat.codexAuthStatus() === "error";
9955
+ },
9956
+ get fallback() {
9957
+ return (() => {
9958
+ var _el$55 = _tmpl$20(), _el$56 = _el$55.firstChild;
9959
+ _el$56.$$click = () => props.chat.startCodexAuth();
9960
+ return _el$55;
9961
+ })();
9962
+ },
9963
+ get children() {
9964
+ return [(() => {
9965
+ var _el$53 = _tmpl$18();
9966
+ insert(_el$53, () => props.chat.codexAuthError());
9967
+ return _el$53;
9968
+ })(), (() => {
9969
+ var _el$54 = _tmpl$19();
9970
+ _el$54.$$click = () => props.chat.startCodexAuth();
9971
+ return _el$54;
9972
+ })()];
9973
+ }
9974
+ });
9975
+ },
9976
+ get children() {
9977
+ var _el$50 = _tmpl$16(), _el$51 = _el$50.firstChild, _el$52 = _el$51.nextSibling;
9978
+ insert(_el$50, createComponent(Show, {
9979
+ get when() {
9980
+ return props.chat.codexAuthStatus() === "waiting";
9981
+ },
9982
+ fallback: "Exchanging authorization...",
9983
+ children: "Waiting for browser login..."
9984
+ }), _el$51);
9985
+ _el$52.$$click = () => window.vessel.codex.cancelAuth();
9986
+ return _el$50;
9987
+ }
9988
+ }));
9989
+ return _el$49;
9990
+ })();
9991
+ },
9992
+ get children() {
9993
+ return [(() => {
9994
+ var _el$1 = _tmpl$2$7(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
9995
+ _el$11.firstChild;
9996
+ insert(_el$11, () => props.chat.codexAccountEmail() || "ChatGPT", null);
9997
+ return _el$1;
9998
+ })(), (() => {
9999
+ var _el$13 = _tmpl$3$6(), _el$14 = _el$13.firstChild;
10000
+ _el$14.$$click = () => props.chat.disconnectCodex();
10001
+ return _el$13;
10002
+ })()];
10003
+ }
10004
+ }), null);
10005
+ return _el$9;
10006
+ }
10007
+ }), createComponent(Show, {
10008
+ get when() {
10009
+ return memo(() => props.chat.providerType() !== "codex_oauth")() && (chatMeta().requiresKey || props.chat.providerId() === "custom");
10010
+ },
10011
+ get children() {
10012
+ var _el$15 = _tmpl$8$3(), _el$16 = _el$15.firstChild;
10013
+ _el$16.firstChild;
10014
+ var _el$19 = _el$16.nextSibling;
10015
+ insert(_el$16, createComponent(Show, {
9754
10016
  get when() {
9755
10017
  return !chatMeta().requiresKey;
9756
10018
  },
9757
10019
  get children() {
9758
- return _tmpl$2$7();
10020
+ return _tmpl$5$5();
9759
10021
  }
9760
10022
  }), null);
9761
- _el$11.$$input = (e) => {
10023
+ _el$19.$$input = (e) => {
9762
10024
  props.chat.setApiKey(e.currentTarget.value);
9763
10025
  if (e.currentTarget.value.trim()) {
9764
10026
  props.chat.setHasStoredApiKey(true);
9765
10027
  }
9766
10028
  };
9767
- setAttribute(_el$11, "spellcheck", false);
9768
- insert(_el$9, createComponent(Show, {
10029
+ setAttribute(_el$19, "spellcheck", false);
10030
+ insert(_el$15, createComponent(Show, {
9769
10031
  get when() {
9770
10032
  return memo(() => !!props.chat.hasStoredApiKey())() && !props.chat.apiKey().trim();
9771
10033
  },
9772
10034
  get children() {
9773
- return _tmpl$3$6();
10035
+ return _tmpl$6$5();
9774
10036
  }
9775
10037
  }), null);
9776
- insert(_el$9, createComponent(Show, {
10038
+ insert(_el$15, createComponent(Show, {
9777
10039
  get when() {
9778
10040
  return props.chat.providerId() === "custom";
9779
10041
  },
9780
10042
  get children() {
9781
- return _tmpl$4$6();
10043
+ return _tmpl$7$4();
9782
10044
  }
9783
10045
  }), null);
9784
- createRenderEffect(() => setAttribute(_el$11, "placeholder", props.chat.hasStoredApiKey() && !props.chat.apiKey().trim() ? "Stored securely. Enter a new key to replace it." : chatMeta().keyPlaceholder || "Bearer token or API key"));
9785
- createRenderEffect(() => _el$11.value = props.chat.apiKey());
9786
- return _el$9;
10046
+ createRenderEffect(() => setAttribute(_el$19, "placeholder", props.chat.hasStoredApiKey() && !props.chat.apiKey().trim() ? "Stored securely. Enter a new key to replace it." : chatMeta().keyPlaceholder || "Bearer token or API key"));
10047
+ createRenderEffect(() => _el$19.value = props.chat.apiKey());
10048
+ return _el$15;
9787
10049
  }
9788
10050
  }), (() => {
9789
- var _el$14 = _tmpl$8$3(), _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling, _el$18 = _el$16.firstChild;
9790
- insert(_el$16, createComponent(Show, {
10051
+ var _el$22 = _tmpl$1$1(), _el$23 = _el$22.firstChild, _el$24 = _el$23.nextSibling, _el$26 = _el$24.firstChild;
10052
+ insert(_el$24, createComponent(Show, {
9791
10053
  get when() {
9792
10054
  return props.chat.providerModels().length > 0;
9793
10055
  },
9794
10056
  get fallback() {
9795
10057
  return (() => {
9796
- var _el$41 = _tmpl$13$1();
9797
- _el$41.$$input = (e) => props.chat.setModel(e.currentTarget.value);
9798
- setAttribute(_el$41, "spellcheck", false);
9799
- createRenderEffect(() => setAttribute(_el$41, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
9800
- createRenderEffect(() => _el$41.value = props.chat.model());
9801
- return _el$41;
10058
+ var _el$57 = _tmpl$21();
10059
+ _el$57.$$input = (e) => props.chat.setModel(e.currentTarget.value);
10060
+ setAttribute(_el$57, "spellcheck", false);
10061
+ createRenderEffect(() => setAttribute(_el$57, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
10062
+ createRenderEffect(() => _el$57.value = props.chat.model());
10063
+ return _el$57;
9802
10064
  })();
9803
10065
  },
9804
10066
  get children() {
9805
- var _el$17 = _tmpl$6$4();
9806
- _el$17.addEventListener("change", (e) => props.chat.setModel(e.currentTarget.value));
9807
- insert(_el$17, createComponent(For, {
10067
+ var _el$25 = _tmpl$9$1();
10068
+ _el$25.addEventListener("change", (e) => props.chat.setModel(e.currentTarget.value));
10069
+ insert(_el$25, createComponent(For, {
9808
10070
  get each() {
9809
10071
  return props.chat.providerModels();
9810
10072
  },
9811
10073
  children: (m) => (() => {
9812
- var _el$42 = _tmpl$12$1();
9813
- _el$42.value = m;
9814
- insert(_el$42, m);
9815
- return _el$42;
10074
+ var _el$58 = _tmpl$15$1();
10075
+ _el$58.value = m;
10076
+ insert(_el$58, m);
10077
+ return _el$58;
9816
10078
  })()
9817
10079
  }));
9818
- createRenderEffect(() => _el$17.value = props.chat.model());
9819
- return _el$17;
10080
+ createRenderEffect(() => _el$25.value = props.chat.model());
10081
+ return _el$25;
9820
10082
  }
9821
- }), _el$18);
9822
- _el$18.$$click = () => props.chat.doFetchModels();
9823
- insert(_el$14, createComponent(Show, {
10083
+ }), _el$26);
10084
+ _el$26.$$click = () => props.chat.doFetchModels();
10085
+ insert(_el$22, createComponent(Show, {
9824
10086
  get when() {
9825
10087
  return props.chat.modelFetchState() === "error";
9826
10088
  },
9827
10089
  get children() {
9828
- return _tmpl$7$4();
10090
+ return _tmpl$0$1();
9829
10091
  }
9830
10092
  }), null);
9831
- insert(_el$14, createComponent(Show, {
10093
+ insert(_el$22, createComponent(Show, {
9832
10094
  get when() {
9833
10095
  return props.chat.modelFetchWarning();
9834
10096
  },
9835
10097
  children: (warning) => (() => {
9836
- var _el$43 = _tmpl$14$1();
9837
- insert(_el$43, warning);
9838
- return _el$43;
10098
+ var _el$59 = _tmpl$22();
10099
+ insert(_el$59, warning);
10100
+ return _el$59;
9839
10101
  })()
9840
10102
  }), null);
9841
- createRenderEffect(() => _el$18.disabled = props.chat.modelFetchState() === "loading");
9842
- return _el$14;
10103
+ createRenderEffect(() => _el$26.disabled = props.chat.modelFetchState() === "loading");
10104
+ return _el$22;
9843
10105
  })(), createComponent(Show, {
9844
10106
  get when() {
9845
10107
  return chatMeta().needsBaseUrl || props.chat.providerId() === "custom";
9846
10108
  },
9847
10109
  get children() {
9848
- var _el$20 = _tmpl$9$1(), _el$21 = _el$20.firstChild, _el$22 = _el$21.nextSibling;
9849
- _el$22.$$input = (e) => props.chat.setBaseUrl(e.currentTarget.value);
9850
- setAttribute(_el$22, "spellcheck", false);
9851
- createRenderEffect(() => setAttribute(_el$22, "placeholder", chatMeta().defaultBaseUrl ?? "https://..."));
9852
- createRenderEffect(() => _el$22.value = props.chat.baseUrl());
9853
- return _el$20;
10110
+ var _el$28 = _tmpl$10$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling;
10111
+ _el$30.$$input = (e) => props.chat.setBaseUrl(e.currentTarget.value);
10112
+ setAttribute(_el$30, "spellcheck", false);
10113
+ createRenderEffect(() => setAttribute(_el$30, "placeholder", chatMeta().defaultBaseUrl ?? "https://..."));
10114
+ createRenderEffect(() => _el$30.value = props.chat.baseUrl());
10115
+ return _el$28;
9854
10116
  }
9855
10117
  }), createComponent(Show, {
9856
10118
  get when() {
9857
10119
  return props.chat.providerId() === "llama_cpp";
9858
10120
  },
9859
10121
  get children() {
9860
- return _tmpl$0$1();
10122
+ return _tmpl$11$1();
9861
10123
  }
9862
10124
  }), (() => {
9863
- var _el$24 = _tmpl$1$1(), _el$25 = _el$24.firstChild, _el$26 = _el$25.nextSibling;
9864
- _el$26.addEventListener("change", (e) => props.chat.setReasoningEffort(e.currentTarget.value));
9865
- insert(_el$26, createComponent(For, {
10125
+ var _el$32 = _tmpl$12$1(), _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling;
10126
+ _el$34.addEventListener("change", (e) => props.chat.setReasoningEffort(e.currentTarget.value));
10127
+ insert(_el$34, createComponent(For, {
9866
10128
  each: REASONING_EFFORT_OPTIONS,
9867
10129
  children: (option) => (() => {
9868
- var _el$44 = _tmpl$12$1();
9869
- insert(_el$44, () => option.label);
9870
- createRenderEffect(() => _el$44.value = option.value);
9871
- return _el$44;
10130
+ var _el$60 = _tmpl$15$1();
10131
+ insert(_el$60, () => option.label);
10132
+ createRenderEffect(() => _el$60.value = option.value);
10133
+ return _el$60;
9872
10134
  })()
9873
10135
  }));
9874
- createRenderEffect(() => _el$26.value = props.chat.reasoningEffort());
9875
- return _el$24;
10136
+ createRenderEffect(() => _el$34.value = props.chat.reasoningEffort());
10137
+ return _el$32;
9876
10138
  })()];
9877
10139
  }
9878
- }), _el$27);
9879
- _el$29.$$input = (e) => props.setMcpPort(e.currentTarget.value);
9880
- setAttribute(_el$29, "spellcheck", false);
9881
- insert(_el$30, createComponent(Show, {
10140
+ }), _el$35);
10141
+ _el$37.$$input = (e) => props.setMcpPort(e.currentTarget.value);
10142
+ setAttribute(_el$37, "spellcheck", false);
10143
+ insert(_el$38, createComponent(Show, {
9882
10144
  get when() {
9883
10145
  return props.premiumActive();
9884
10146
  },
9885
10147
  get fallback() {
9886
- return _tmpl$15$1();
10148
+ return _tmpl$23();
9887
10149
  },
9888
10150
  get children() {
9889
- var _el$32 = _tmpl$10$1();
9890
- _el$32.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
9891
- createRenderEffect(() => _el$32.value = props.maxToolIterations());
9892
- return _el$32;
10151
+ var _el$40 = _tmpl$13$1();
10152
+ _el$40.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
10153
+ createRenderEffect(() => _el$40.value = props.maxToolIterations());
10154
+ return _el$40;
9893
10155
  }
9894
- }), _el$33);
9895
- insert(_el$33, createComponent(Show, {
10156
+ }), _el$41);
10157
+ insert(_el$41, createComponent(Show, {
9896
10158
  get when() {
9897
10159
  return props.premiumActive();
9898
10160
  },
9899
10161
  fallback: "Free tier: 50 tool calls per conversation turn. Upgrade to Vessel Premium to customize this limit (up to 1,000).",
9900
10162
  children: "Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000."
9901
10163
  }));
9902
- _el$36.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
10164
+ _el$44.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
9903
10165
  insert(_el$, createComponent(Show, {
9904
10166
  get when() {
9905
10167
  return props.health();
9906
10168
  },
9907
10169
  children: (currentHealth) => (() => {
9908
- var _el$46 = _tmpl$17(), _el$47 = _el$46.firstChild, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
9909
- _el$50.nextSibling;
9910
- insert(_el$50, () => currentHealth().mcp.status);
9911
- insert(_el$48, () => currentHealth().mcp.message, null);
9912
- insert(_el$46, createComponent(Show, {
10170
+ var _el$62 = _tmpl$25(), _el$63 = _el$62.firstChild, _el$64 = _el$63.nextSibling, _el$65 = _el$64.firstChild, _el$66 = _el$65.nextSibling;
10171
+ _el$66.nextSibling;
10172
+ insert(_el$66, () => currentHealth().mcp.status);
10173
+ insert(_el$64, () => currentHealth().mcp.message, null);
10174
+ insert(_el$62, createComponent(Show, {
9913
10175
  get when() {
9914
10176
  return currentHealth().mcp.endpoint;
9915
10177
  },
9916
10178
  children: (endpoint) => (() => {
9917
- var _el$53 = _tmpl$18(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
9918
- insert(_el$55, endpoint);
9919
- return _el$53;
10179
+ var _el$69 = _tmpl$26(), _el$70 = _el$69.firstChild, _el$71 = _el$70.nextSibling;
10180
+ insert(_el$71, endpoint);
10181
+ return _el$69;
9920
10182
  })()
9921
10183
  }), null);
9922
- insert(_el$46, createComponent(Show, {
10184
+ insert(_el$62, createComponent(Show, {
9923
10185
  get when() {
9924
10186
  return currentHealth().startupIssues.length > 0;
9925
10187
  },
9926
10188
  get children() {
9927
- var _el$52 = _tmpl$16();
9928
- insert(_el$52, () => currentHealth().startupIssues.map((issue) => (() => {
9929
- var _el$56 = _tmpl$19(), _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling;
9930
- insert(_el$57, () => issue.title);
9931
- insert(_el$58, () => issue.detail);
9932
- insert(_el$56, createComponent(Show, {
10189
+ var _el$68 = _tmpl$24();
10190
+ insert(_el$68, () => currentHealth().startupIssues.map((issue) => (() => {
10191
+ var _el$72 = _tmpl$27(), _el$73 = _el$72.firstChild, _el$74 = _el$73.nextSibling;
10192
+ insert(_el$73, () => issue.title);
10193
+ insert(_el$74, () => issue.detail);
10194
+ insert(_el$72, createComponent(Show, {
9933
10195
  get when() {
9934
10196
  return issue.action;
9935
10197
  },
9936
10198
  children: (action) => (() => {
9937
- var _el$59 = _tmpl$20();
9938
- insert(_el$59, action);
9939
- return _el$59;
10199
+ var _el$75 = _tmpl$17();
10200
+ insert(_el$75, action);
10201
+ return _el$75;
9940
10202
  })()
9941
10203
  }), null);
9942
10204
  createRenderEffect((_p$) => {
9943
10205
  var _v$3 = !!(issue.severity === "warning"), _v$4 = !!(issue.severity === "error");
9944
- _v$3 !== _p$.e && _el$56.classList.toggle("warning", _p$.e = _v$3);
9945
- _v$4 !== _p$.t && _el$56.classList.toggle("error", _p$.t = _v$4);
10206
+ _v$3 !== _p$.e && _el$72.classList.toggle("warning", _p$.e = _v$3);
10207
+ _v$4 !== _p$.t && _el$72.classList.toggle("error", _p$.t = _v$4);
9946
10208
  return _p$;
9947
10209
  }, {
9948
10210
  e: void 0,
9949
10211
  t: void 0
9950
10212
  });
9951
- return _el$56;
10213
+ return _el$72;
9952
10214
  })()));
9953
- return _el$52;
10215
+ return _el$68;
9954
10216
  }
9955
10217
  }), null);
9956
- return _el$46;
10218
+ return _el$62;
9957
10219
  })()
9958
- }), _el$37);
9959
- _el$39.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
9960
- setAttribute(_el$39, "spellcheck", false);
10220
+ }), _el$45);
10221
+ _el$47.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
10222
+ setAttribute(_el$47, "spellcheck", false);
9961
10223
  createRenderEffect((_p$) => {
9962
10224
  var _v$ = !!props.chat.enabled(), _v$2 = props.chat.enabled();
9963
10225
  _v$ !== _p$.e && _el$5.classList.toggle("on", _p$.e = _v$);
@@ -9967,14 +10229,14 @@ const SettingsAgent = (props) => {
9967
10229
  e: void 0,
9968
10230
  t: void 0
9969
10231
  });
9970
- createRenderEffect(() => _el$29.value = props.mcpPort());
9971
- createRenderEffect(() => _el$36.value = props.agentTranscriptMode());
9972
- createRenderEffect(() => _el$39.value = props.obsidianVaultPath());
10232
+ createRenderEffect(() => _el$37.value = props.mcpPort());
10233
+ createRenderEffect(() => _el$44.value = props.agentTranscriptMode());
10234
+ createRenderEffect(() => _el$47.value = props.obsidianVaultPath());
9973
10235
  return _el$;
9974
10236
  })();
9975
10237
  };
9976
10238
  delegateEvents(["click", "input"]);
9977
- var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__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$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$3 = /* @__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$6$3 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Save login credentials for any website. Passwords are encrypted locally and filled directly into login forms. The agent can list and fill them with your consent, but passwords are never sent to AI providers.`), _tmpl$7$3 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Password`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Title (e.g. GitHub Personal)"><input class=settings-input placeholder="URL (e.g. https://github.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><select class=settings-input><option value=login>Login</option><option value=credit_card>Credit Card</option><option value=identity>Identity</option><option value=secure_note>Secure Note</option></select><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Password</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$9 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$0 = /* @__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$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-field><label class=settings-label>Passwords</label></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.`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`), _tmpl$12 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Your personal password manager. Save, organize, and autofill login credentials. Upgrade to Premium to unlock Passwords.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove password">&times;`), _tmpl$15 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">&times;`);
10239
+ var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__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$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$4 = /* @__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$6$4 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Save login credentials for any website. Passwords are encrypted locally and filled directly into login forms. The agent can list and fill them with your consent, but passwords are never sent to AI providers.`), _tmpl$7$3 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Password`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Title (e.g. GitHub Personal)"><input class=settings-input placeholder="URL (e.g. https://github.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><select class=settings-input><option value=login>Login</option><option value=credit_card>Credit Card</option><option value=identity>Identity</option><option value=secure_note>Secure Note</option></select><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Password</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$9 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$0 = /* @__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$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-field><label class=settings-label>Passwords</label></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.`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`), _tmpl$12 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Your personal password manager. Save, organize, and autofill login credentials. Upgrade to Premium to unlock Passwords.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove password">&times;`), _tmpl$15 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">&times;`);
9978
10240
  const SettingsVaults = (props) => {
9979
10241
  const v = props.vault;
9980
10242
  const h = props.humanVault;
@@ -10048,7 +10310,7 @@ const SettingsVaults = (props) => {
10048
10310
  return v.adding();
10049
10311
  },
10050
10312
  get children() {
10051
- var _el$9 = _tmpl$5$3(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
10313
+ var _el$9 = _tmpl$5$4(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$13.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
10052
10314
  _el$0.$$input = (e) => v.setNewLabel(e.currentTarget.value);
10053
10315
  setAttribute(_el$0, "spellcheck", false);
10054
10316
  _el$1.$$input = (e) => v.setNewDomain(e.currentTarget.value);
@@ -10115,7 +10377,7 @@ const SettingsVaults = (props) => {
10115
10377
  return _tmpl$13();
10116
10378
  },
10117
10379
  get children() {
10118
- return [_tmpl$6$3(), createComponent(Show, {
10380
+ return [_tmpl$6$4(), createComponent(Show, {
10119
10381
  get when() {
10120
10382
  return h.entries().length > 0;
10121
10383
  },
@@ -10334,10 +10596,15 @@ const SettingsVaults = (props) => {
10334
10596
  })();
10335
10597
  };
10336
10598
  delegateEvents(["click", "input"]);
10337
- var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__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$4$4 = /* @__PURE__ */ template(`<div class=settings-category-panel><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-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.`);
10599
+ var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__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$4$4 = /* @__PURE__ */ template(`<div class=settings-category-panel><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-field><label class=settings-label>Site Permissions</label><p class=settings-hint>Camera, microphone, location, notifications, and other site capability choices remembered by Vessel.</p><div class=settings-list></div><button type=button class=settings-secondary-btn>Clear saved permissions</button></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.`), _tmpl$5$3 = /* @__PURE__ */ template(`<p class=settings-hint>No saved permission decisions yet.`), _tmpl$6$3 = /* @__PURE__ */ template(`<div class=settings-list-row><span></span><span>: `);
10338
10600
  const SettingsPrivacy = (props) => {
10601
+ const [permissions, setPermissions] = createSignal([]);
10602
+ const loadPermissions = async () => setPermissions(await window.vessel.permissions.getAll());
10603
+ onMount(() => {
10604
+ void loadPermissions();
10605
+ });
10339
10606
  return (() => {
10340
- var _el$ = _tmpl$4$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild;
10607
+ var _el$ = _tmpl$4$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$0.nextSibling, _el$10 = _el$1.nextSibling, _el$11 = _el$8.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild;
10341
10608
  _el$4.addEventListener("change", (e) => props.setDomainMode(e.currentTarget.value));
10342
10609
  insert(_el$2, createComponent(Show, {
10343
10610
  get when() {
@@ -10366,11 +10633,30 @@ const SettingsPrivacy = (props) => {
10366
10633
  return _tmpl$3$4();
10367
10634
  }
10368
10635
  }), null);
10369
- _el$0.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
10636
+ insert(_el$1, createComponent(For, {
10637
+ get each() {
10638
+ return permissions();
10639
+ },
10640
+ get fallback() {
10641
+ return _tmpl$5$3();
10642
+ },
10643
+ children: (item) => (() => {
10644
+ var _el$15 = _tmpl$6$3(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$17.firstChild;
10645
+ insert(_el$16, () => item.origin);
10646
+ insert(_el$17, () => item.permission, _el$18);
10647
+ insert(_el$17, () => item.decision, null);
10648
+ return _el$15;
10649
+ })()
10650
+ }));
10651
+ _el$10.$$click = async () => {
10652
+ await window.vessel.permissions.clear();
10653
+ await loadPermissions();
10654
+ };
10655
+ _el$13.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
10370
10656
  createRenderEffect((_p$) => {
10371
10657
  var _v$ = !!props.telemetryEnabled(), _v$2 = props.telemetryEnabled();
10372
- _v$ !== _p$.e && _el$0.classList.toggle("on", _p$.e = _v$);
10373
- _v$2 !== _p$.t && setAttribute(_el$0, "aria-checked", _p$.t = _v$2);
10658
+ _v$ !== _p$.e && _el$13.classList.toggle("on", _p$.e = _v$);
10659
+ _v$2 !== _p$.t && setAttribute(_el$13, "aria-checked", _p$.t = _v$2);
10374
10660
  return _p$;
10375
10661
  }, {
10376
10662
  e: void 0,
@@ -10868,6 +11154,29 @@ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><spa
10868
11154
  border-color: color-mix(in srgb, var(--status-error) 32%, transparent);
10869
11155
  background: color-mix(in srgb, var(--status-error) 6%, transparent);
10870
11156
  }
11157
+ .settings-inline-actions {
11158
+ display: flex;
11159
+ flex-wrap: wrap;
11160
+ gap: 8px;
11161
+ margin-bottom: 8px;
11162
+ }
11163
+ .settings-secondary-btn {
11164
+ height: 32px;
11165
+ padding: 0 12px;
11166
+ border-radius: var(--radius-md);
11167
+ border: 1px solid var(--border-visible);
11168
+ background: var(--surface-glass);
11169
+ color: var(--text-primary);
11170
+ font-size: 12px;
11171
+ cursor: pointer;
11172
+ }
11173
+ .settings-secondary-btn:hover:not(:disabled) {
11174
+ background: var(--bg-tertiary);
11175
+ }
11176
+ .settings-secondary-btn:disabled {
11177
+ opacity: 0.55;
11178
+ cursor: not-allowed;
11179
+ }
10871
11180
  .settings-label {
10872
11181
  display: block;
10873
11182
  font-size: 12px;
@@ -11339,6 +11648,7 @@ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><spa
11339
11648
  const CHAT_PROVIDERS = Object.values(PROVIDERS).map((p) => ({
11340
11649
  id: p.id,
11341
11650
  name: p.name,
11651
+ type: p.type,
11342
11652
  requiresKey: p.requiresApiKey,
11343
11653
  needsBaseUrl: p.id === "llama_cpp" || p.id === "custom",
11344
11654
  defaultBaseUrl: p.defaultBaseUrl,
@@ -11664,9 +11974,13 @@ const Settings = () => {
11664
11974
  const [chatBaseUrl, setChatBaseUrl] = createSignal("");
11665
11975
  const [chatReasoningEffort, setChatReasoningEffort] = createSignal("off");
11666
11976
  const chatProviderMeta = () => CHAT_PROVIDERS.find((p) => p.id === chatProviderId()) ?? CHAT_PROVIDERS[0];
11977
+ const providerType = () => chatProviderMeta()?.type;
11667
11978
  const [providerModels, setProviderModels] = createSignal([]);
11668
11979
  const [modelFetchState, setModelFetchState] = createSignal("idle");
11669
11980
  const [modelFetchWarning, setModelFetchWarning] = createSignal(null);
11981
+ const [codexAuthStatus, setCodexAuthStatus] = createSignal("idle");
11982
+ const [codexAccountEmail, setCodexAccountEmail] = createSignal("");
11983
+ const [codexAuthError, setCodexAuthError] = createSignal("");
11670
11984
  const resetProviderModels = () => {
11671
11985
  setProviderModels([]);
11672
11986
  setModelFetchState("idle");
@@ -11711,6 +12025,30 @@ const Settings = () => {
11711
12025
  setModelFetchState("error");
11712
12026
  });
11713
12027
  };
12028
+ const startCodexAuth = async () => {
12029
+ setCodexAuthStatus("waiting");
12030
+ setCodexAuthError("");
12031
+ try {
12032
+ const result = await window.vessel.codex.startAuth();
12033
+ if (result.ok) {
12034
+ setCodexAccountEmail(result.accountEmail);
12035
+ setCodexAuthStatus("connected");
12036
+ setChatHasStoredApiKey(true);
12037
+ } else {
12038
+ setCodexAuthStatus("error");
12039
+ setCodexAuthError(result.error);
12040
+ }
12041
+ } catch (err) {
12042
+ setCodexAuthStatus("error");
12043
+ setCodexAuthError(err instanceof Error ? err.message : "Unknown error");
12044
+ }
12045
+ };
12046
+ const disconnectCodex = async () => {
12047
+ await window.vessel.codex.disconnect();
12048
+ setCodexAuthStatus("idle");
12049
+ setCodexAccountEmail("");
12050
+ setChatHasStoredApiKey(false);
12051
+ };
11714
12052
  createEffect(() => {
11715
12053
  if (!chatEnabled()) return;
11716
12054
  const meta = chatProviderMeta();
@@ -11754,6 +12092,9 @@ const Settings = () => {
11754
12092
  setChatHasStoredApiKey(false);
11755
12093
  setChatReasoningEffort("off");
11756
12094
  }
12095
+ if (cp?.id === "openai_codex" && cp.hasApiKey) {
12096
+ setCodexAuthStatus("connected");
12097
+ }
11757
12098
  setTelemetryEnabled(settings.telemetryEnabled !== false);
11758
12099
  const dp = settings.domainPolicy ?? {
11759
12100
  allowedDomains: [],
@@ -11799,9 +12140,20 @@ const Settings = () => {
11799
12140
  });
11800
12141
  }
11801
12142
  });
12143
+ const unsubCodex = window.vessel.codex.onAuthStatus((payload) => {
12144
+ if (payload.status === "waiting") {
12145
+ setCodexAuthStatus("waiting");
12146
+ } else if (payload.status === "exchanging") {
12147
+ setCodexAuthStatus("exchanging");
12148
+ } else if (payload.status === "error") {
12149
+ setCodexAuthStatus("error");
12150
+ setCodexAuthError(payload.error || "Unknown error");
12151
+ }
12152
+ });
11802
12153
  onCleanup(() => {
11803
12154
  unsubscribe2();
11804
12155
  unsubscribePremium();
12156
+ unsubCodex();
11805
12157
  });
11806
12158
  });
11807
12159
  createEffect(() => {
@@ -11971,7 +12323,15 @@ const Settings = () => {
11971
12323
  modelFetchState,
11972
12324
  modelFetchWarning,
11973
12325
  doFetchModels,
11974
- resetProviderModels
12326
+ resetProviderModels,
12327
+ codexAuthStatus,
12328
+ codexAccountEmail,
12329
+ setCodexAccountEmail,
12330
+ codexAuthError,
12331
+ setCodexAuthError,
12332
+ providerType,
12333
+ startCodexAuth,
12334
+ disconnectCodex
11975
12335
  },
11976
12336
  mcpPort,
11977
12337
  setMcpPort,
@@ -12645,6 +13005,7 @@ const App = () => {
12645
13005
  const [highlightToast, setHighlightToast] = createSignal(null);
12646
13006
  const [keyboardHelpOpen, setKeyboardHelpOpen] = createSignal(false);
12647
13007
  const [clearDataOpen, setClearDataOpen] = createSignal(false);
13008
+ const [downloadsOpen, setDownloadsOpen] = createSignal(false);
12648
13009
  const loadingPresence = useAnimatedPresence(() => !!activeTab()?.isLoading, 300);
12649
13010
  const showHighlightResult = (result) => {
12650
13011
  if (result.success && result.text) {
@@ -12775,7 +13136,9 @@ const App = () => {
12775
13136
  return [createComponent(FlowProgress, {}), createComponent(AgentTranscriptDock, {})];
12776
13137
  }
12777
13138
  }), _el$2);
12778
- insert(_el$2, createComponent(TitleBar, {}), null);
13139
+ insert(_el$2, createComponent(TitleBar, {
13140
+ onOpenDownloads: () => setDownloadsOpen(true)
13141
+ }), null);
12779
13142
  insert(_el$2, createComponent(TabBar, {}), null);
12780
13143
  insert(_el$2, createComponent(AddressBar, {
12781
13144
  onClearData: () => setClearDataOpen(true)
@@ -12796,6 +13159,12 @@ const App = () => {
12796
13159
  return [createComponent(CommandBar, {}), createComponent(Settings, {})];
12797
13160
  }
12798
13161
  }), null);
13162
+ insert(_el$, createComponent(DownloadsPanel, {
13163
+ get open() {
13164
+ return downloadsOpen();
13165
+ },
13166
+ onClose: () => setDownloadsOpen(false)
13167
+ }), null);
12799
13168
  insert(_el$, createComponent(ClearBrowsingData, {
12800
13169
  get open() {
12801
13170
  return clearDataOpen();