@quanta-intellect/vessel-browser 0.1.99 → 0.1.101

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.
@@ -3003,7 +3003,7 @@ const SEARCH_ENGINE_PRESETS = {
3003
3003
  ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
3004
3004
  kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
3005
3005
  };
3006
- var _tmpl$$n = /* @__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$m = /* @__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$j = /* @__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$j = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$g = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$f = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$c = /* @__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$9 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$7 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$6 = /* @__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$6 = /* @__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$6 = /* @__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$6 = /* @__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$6 = /* @__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$5 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$5 = /* @__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$5 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`), _tmpl$17$4 = /* @__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$4 = /* @__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$4 = /* @__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$4 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$4 = /* @__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$3 = /* @__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>`);
3006
+ var _tmpl$$n = /* @__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$m = /* @__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$j = /* @__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$j = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$g = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$f = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$c = /* @__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$9 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$7 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$6 = /* @__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$6 = /* @__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$6 = /* @__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$6 = /* @__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$6 = /* @__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$5 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$5 = /* @__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$5 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip=Settings><svg width=14 height=14 viewBox="0 0 14 14"><circle cx=7 cy=7 r=2 fill=none stroke=currentColor stroke-width=1.2></circle><path d="M7 1v2M7 11v2M1 7h2M11 7h2M2.8 2.8l1.4 1.4M9.8 9.8l1.4 1.4M11.2 2.8l-1.4 1.4M4.2 9.8l-1.4 1.4"stroke=currentColor stroke-width=1 stroke-linecap=round>`), _tmpl$17$4 = /* @__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$4 = /* @__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$4 = /* @__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$4 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$4 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$4 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$4 = /* @__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$3 = /* @__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>`);
3007
3007
  const AddressBar = (props) => {
3008
3008
  const {
3009
3009
  activeTab,
@@ -3506,7 +3506,7 @@ const AddressBar = (props) => {
3506
3506
  return parseDiffSummaryParts(burst.summary);
3507
3507
  },
3508
3508
  children: (part) => (() => {
3509
- var _el$58 = _tmpl$22$3(), _el$60 = _el$58.firstChild;
3509
+ var _el$58 = _tmpl$22$4(), _el$60 = _el$58.firstChild;
3510
3510
  insert(_el$58, createComponent(Show, {
3511
3511
  get when() {
3512
3512
  return part.section;
@@ -3548,7 +3548,7 @@ const AddressBar = (props) => {
3548
3548
  return change.before;
3549
3549
  },
3550
3550
  get children() {
3551
- var _el$68 = _tmpl$23$3(), _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
3551
+ var _el$68 = _tmpl$23$4(), _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
3552
3552
  insert(_el$70, () => change.before);
3553
3553
  return _el$68;
3554
3554
  }
@@ -3558,7 +3558,7 @@ const AddressBar = (props) => {
3558
3558
  return change.after;
3559
3559
  },
3560
3560
  get children() {
3561
- var _el$71 = _tmpl$24$3(), _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling;
3561
+ var _el$71 = _tmpl$24$4(), _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling;
3562
3562
  insert(_el$73, () => change.after);
3563
3563
  return _el$71;
3564
3564
  }
@@ -3720,7 +3720,7 @@ const AddressBar = (props) => {
3720
3720
  })();
3721
3721
  };
3722
3722
  delegateEvents(["click", "input", "keydown", "mousedown"]);
3723
- var _tmpl$$m = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-title></div><div class=bookmark-toast-message>`);
3723
+ var _tmpl$$m = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite aria-atomic=true>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=bookmark-toast role=status><div class=bookmark-toast-header><div class=bookmark-toast-title></div><button type=button class=bookmark-toast-close aria-label="Dismiss notification">×</button></div><div class=bookmark-toast-message>`);
3724
3724
  const TOAST_DURATION_MS$1 = 4200;
3725
3725
  const TOAST_EXIT_MS$2 = 300;
3726
3726
  function isBookmarkToastCandidate(action) {
@@ -3786,9 +3786,10 @@ const BookmarkNotifications = () => {
3786
3786
  return toasts();
3787
3787
  },
3788
3788
  children: (toast) => (() => {
3789
- var _el$2 = _tmpl$2$l(), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3790
- insert(_el$3, () => toast.title);
3791
- insert(_el$4, () => toast.message);
3789
+ var _el$2 = _tmpl$2$l(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$3.nextSibling;
3790
+ insert(_el$4, () => toast.title);
3791
+ _el$5.$$click = () => dismissToast(toast.id);
3792
+ insert(_el$6, () => toast.message);
3792
3793
  createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!toast.leaving));
3793
3794
  return _el$2;
3794
3795
  })()
@@ -3796,7 +3797,8 @@ const BookmarkNotifications = () => {
3796
3797
  return _el$;
3797
3798
  })();
3798
3799
  };
3799
- var _tmpl$$l = /* @__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>`);
3800
+ delegateEvents(["click"]);
3801
+ var _tmpl$$l = /* @__PURE__ */ template(`<div class=bookmark-toast-stack aria-live=polite><div class="bookmark-toast highlight-toast"role=status><div class=bookmark-toast-header><div class=bookmark-toast-title></div><button type=button class=bookmark-toast-close aria-label="Dismiss notification">×</button></div><div class=bookmark-toast-message>`);
3800
3802
  const TOAST_DURATION_MS = 3e3;
3801
3803
  const TOAST_EXIT_MS$1 = 300;
3802
3804
  const HighlightNotifications = (props) => {
@@ -3835,14 +3837,16 @@ const HighlightNotifications = (props) => {
3835
3837
  return memo(() => !!visible())() && current();
3836
3838
  },
3837
3839
  get children() {
3838
- var _el$ = _tmpl$$l(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
3839
- insert(_el$3, () => current().title);
3840
- insert(_el$4, () => current().message);
3840
+ var _el$ = _tmpl$$l(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$3.nextSibling;
3841
+ insert(_el$4, () => current().title);
3842
+ _el$5.$$click = dismiss;
3843
+ insert(_el$6, () => current().message);
3841
3844
  createRenderEffect(() => _el$2.classList.toggle("bookmark-toast-leaving", !!leaving()));
3842
3845
  return _el$;
3843
3846
  }
3844
3847
  });
3845
3848
  };
3849
+ delegateEvents(["click"]);
3846
3850
  var _tmpl$$k = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$k = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$i = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$i = /* @__PURE__ */ template(`<div class=download-toast-bar-track><div class=download-toast-bar-fill>`), _tmpl$5$f = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$e = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$b = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
3847
3851
  const TOAST_DONE_DURATION_MS = 4200;
3848
3852
  const TOAST_EXIT_MS = 300;
@@ -6221,7 +6225,7 @@ function renderTable(block) {
6221
6225
  (cell, i) => `<td${alignAttr(i)}>${applyInlineMarkdown(cell)}</td>`
6222
6226
  ).join("")}</tr>`
6223
6227
  ).join("");
6224
- return `<table><thead>${thead}</thead><tbody>${tbody}</tbody></table>`;
6228
+ return `<div class="markdown-table-scroll"><table><thead>${thead}</thead><tbody>${tbody}</tbody></table></div>`;
6225
6229
  }
6226
6230
  function renderBlock(block) {
6227
6231
  const trimmed = block.trim();
@@ -6742,7 +6746,7 @@ function renderKitPrompt(kit, values) {
6742
6746
  (_, key) => values[key] ?? ""
6743
6747
  );
6744
6748
  }
6745
- var _tmpl$$d = /* @__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$d = /* @__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$c = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$c = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$b = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$b = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$9 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$8 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$6 = /* @__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$5 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$5 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$5 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$5 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$5 = /* @__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$4 = /* @__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$4 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$4 = /* @__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$3 = /* @__PURE__ */ template(`<p class=kit-schedule-error>`), _tmpl$17$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-section><label class=kit-schedule-toggle><input type=checkbox>Schedule for later`), _tmpl$19$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Run at</label><input type=datetime-local class="kit-form-input kit-schedule-time">`), _tmpl$20$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Day</label><select class="kit-form-input kit-schedule-time">`), _tmpl$21$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$2 = /* @__PURE__ */ template(`<div class=sched-edit-backdrop><div class=sched-edit-panel><div class=sched-edit-header><span class=sched-edit-title>Edit schedule</span><span class=sched-edit-job-name></span></div><div class=kit-schedule-types></div><div class=sched-edit-actions><button class=kit-back-btn type=button>Cancel</button><button class=agent-primary-button type=button>Save`), _tmpl$23$2 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$2 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=kit-card role=button tabindex=0><span class=kit-card-icon aria-hidden=true></span><div class=kit-card-body><div class=kit-card-name></div><div class=kit-card-desc>`), _tmpl$27$2 = /* @__PURE__ */ template(`<svg class=kit-card-caret width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M5 3l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$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>`);
6749
+ var _tmpl$$d = /* @__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$d = /* @__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$c = /* @__PURE__ */ template(`<div class=kit-install-error><span></span><button class=kit-install-error-dismiss type=button aria-label=Dismiss>×`), _tmpl$4$c = /* @__PURE__ */ template(`<div class=kit-list>`), _tmpl$5$b = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$b = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$9 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$8 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$6 = /* @__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$5 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$5 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$5 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$5 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$5 = /* @__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$4 = /* @__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$4 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$4 = /* @__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$3 = /* @__PURE__ */ template(`<p class=kit-schedule-error>`), _tmpl$17$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-section><label class=kit-schedule-toggle><input type=checkbox>Schedule for later`), _tmpl$19$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Run at</label><input type=datetime-local class="kit-form-input kit-schedule-time">`), _tmpl$20$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Day</label><select class="kit-form-input kit-schedule-time">`), _tmpl$21$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$3 = /* @__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$3 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$3 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$2 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=kit-card role=button tabindex=0><span class=kit-card-icon aria-hidden=true></span><div class=kit-card-body><div class=kit-card-name></div><div class=kit-card-desc>`), _tmpl$27$2 = /* @__PURE__ */ template(`<svg class=kit-card-caret width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M5 3l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$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>`);
6746
6750
  const ICON_MAP = {
6747
6751
  BookOpen: book_open_default,
6748
6752
  Tag: tag_default,
@@ -7061,7 +7065,7 @@ const AutomationTab = (props) => {
7061
7065
  };
7062
7066
  const timeValue = () => `${String(schedHour()).padStart(2, "0")}:${String(schedMinute()).padStart(2, "0")}`;
7063
7067
  return (() => {
7064
- var _el$ = _tmpl$23$2();
7068
+ var _el$ = _tmpl$23$3();
7065
7069
  insert(_el$, createComponent(Show, {
7066
7070
  get when() {
7067
7071
  return memo(() => !!!premiumData.loading)() && !isPremium();
@@ -7118,7 +7122,7 @@ const AutomationTab = (props) => {
7118
7122
  return kit.estimatedMinutes !== void 0;
7119
7123
  },
7120
7124
  get children() {
7121
- var _el$78 = _tmpl$24$2(), _el$79 = _el$78.firstChild, _el$81 = _el$79.nextSibling;
7125
+ var _el$78 = _tmpl$24$3(), _el$79 = _el$78.firstChild, _el$81 = _el$79.nextSibling;
7122
7126
  _el$81.nextSibling;
7123
7127
  insert(_el$78, () => kit.estimatedMinutes, _el$81);
7124
7128
  return _el$78;
@@ -7504,7 +7508,7 @@ const AutomationTab = (props) => {
7504
7508
  return editingJob() !== null;
7505
7509
  },
7506
7510
  get children() {
7507
- 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;
7511
+ var _el$54 = _tmpl$22$3(), _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;
7508
7512
  _el$54.$$click = () => setEditingJob(null);
7509
7513
  _el$55.$$click = (e) => e.stopPropagation();
7510
7514
  insert(_el$58, () => editingJob().kitName);
@@ -7587,6 +7591,7 @@ const initialState = {
7587
7591
  includeTraces: false,
7588
7592
  objectives: null,
7589
7593
  threads: [],
7594
+ threadProgress: [],
7590
7595
  threadFindings: [],
7591
7596
  report: null,
7592
7597
  subAgentTraces: [],
@@ -7638,6 +7643,9 @@ function useResearch() {
7638
7643
  cancel() {
7639
7644
  return window.vessel.research.cancel();
7640
7645
  },
7646
+ stopAndSynthesize() {
7647
+ return window.vessel.research.stopAndSynthesize();
7648
+ },
7641
7649
  exportReport() {
7642
7650
  return window.vessel.research.exportReport();
7643
7651
  },
@@ -7654,7 +7662,7 @@ function useResearch() {
7654
7662
  }
7655
7663
  };
7656
7664
  }
7657
- var _tmpl$$c = /* @__PURE__ */ template(`<div class=markdown-content>`), _tmpl$2$c = /* @__PURE__ */ template(`<div>`), _tmpl$3$b = /* @__PURE__ */ template(`<div class=research-premium-notice><span class=premium-badge>Premium</span> Brief is free; full research and export require Vessel Premium.`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=research-brief-status>`), _tmpl$5$a = /* @__PURE__ */ template(`<div class=research-idle><h3>Research Desk</h3><p>Start with a topic. Vessel will shape it into a focused brief, draft a research plan, and then send sub-agents after the strongest sources.</p><form class=research-topic-form><textarea class=research-topic-input rows=3 placeholder="What should we research?"></textarea><button class=research-start-btn type=submit>Start Briefing`), _tmpl$6$a = /* @__PURE__ */ template(`<div class=research-brief-loading role=status aria-live=polite><span class=research-spinner aria-hidden=true></span><div><div class=research-loading-title>Brief started</div><div class=research-loading-copy>Preparing the first briefing question...`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class="research-brief-status thinking"role=status aria-live=polite><span class=research-spinner aria-hidden=true></span><span>Thinking...`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=research-brief-status> queued`), _tmpl$9$5 = /* @__PURE__ */ template(`<div class=research-phase><h3>Briefing</h3><p>Work through the brief here. Once the assistant has enough context, turn it into a research plan.</p><div class=research-brief-thread></div><form class=research-brief-form><textarea class=research-brief-input rows=2></textarea><button type=submit></button></form><div class=phase-controls><button>Build Research Plan</button><button class=secondary>Cancel`), _tmpl$0$4 = /* @__PURE__ */ template(`<div class=research-phase><h3>Planning Research</h3><p>Creating Research Objectives based on your brief...`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=research-phase><h3>Research Objectives`), _tmpl$10$4 = /* @__PURE__ */ template(`<p> of <!> threads complete`), _tmpl$11$4 = /* @__PURE__ */ template(`<button>Switch to Walk-Away`), _tmpl$12$4 = /* @__PURE__ */ template(`<button>Switch to Interactive`), _tmpl$13$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Researching`), _tmpl$14$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Synthesizing Report</h3><p>Compiling findings into the Research Report...`), _tmpl$15$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Report Ready`), _tmpl$16$2 = /* @__PURE__ */ template(`<div class=research-desk>`), _tmpl$17$2 = /* @__PURE__ */ template(`<div class="research-quick-replies inline"aria-label="Suggested briefing responses">`), _tmpl$18$2 = /* @__PURE__ */ template(`<button type=button class=research-quick-reply>`), _tmpl$19$2 = /* @__PURE__ */ template(`<div class=objectives-card><p><strong>Question:</strong> </p><p><strong>Threads:</strong> </p><ul></ul><label class=mode-toggle><input type=checkbox>Walk-away mode (notified when done)</label><label class=traces-toggle><input type=checkbox>Include agent traces with report</label><div class=phase-controls><button>Start Research</button><button class=secondary>Cancel`), _tmpl$20$2 = /* @__PURE__ */ template(`<li> (<!> sources)`), _tmpl$21$2 = /* @__PURE__ */ template(`<div class=report-card><h4></h4><p>...</p><p> sources cited</p><button>Export as Markdown</button><button class=secondary>New Research`);
7665
+ var _tmpl$$c = /* @__PURE__ */ template(`<div class=markdown-content>`), _tmpl$2$c = /* @__PURE__ */ template(`<div>`), _tmpl$3$b = /* @__PURE__ */ template(`<div class=research-premium-notice><span class=premium-badge>Premium</span> Brief is free; full research and export require Vessel Premium.`), _tmpl$4$b = /* @__PURE__ */ template(`<div class=research-brief-status>`), _tmpl$5$a = /* @__PURE__ */ template(`<div class=research-idle><h3>Research Desk</h3><p>Start with a topic. Vessel will shape it into a focused brief, draft a research plan, and then send sub-agents after the strongest sources.</p><form class=research-topic-form><textarea class=research-topic-input rows=3 placeholder="What should we research?"></textarea><button class=research-start-btn type=submit>Start Briefing`), _tmpl$6$a = /* @__PURE__ */ template(`<div class=research-brief-loading role=status aria-live=polite><span class=research-spinner aria-hidden=true></span><div><div class=research-loading-title>Brief started</div><div class=research-loading-copy>Preparing the first briefing question...`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class="research-brief-status thinking"role=status aria-live=polite><span class=research-spinner aria-hidden=true></span><span>Thinking...`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=research-brief-status> queued`), _tmpl$9$5 = /* @__PURE__ */ template(`<div class=research-phase><h3>Briefing</h3><p>Work through the brief here. Once the assistant has enough context, turn it into a research plan.</p><div class=research-brief-thread></div><form class=research-brief-form><textarea class=research-brief-input rows=2></textarea><button type=submit></button></form><div class=phase-controls><button>Build Research Plan</button><button class=secondary>Cancel`), _tmpl$0$4 = /* @__PURE__ */ template(`<div class=research-phase><h3>Planning Research</h3><p>Creating Research Objectives based on your brief...`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=research-phase><h3>Research Objectives`), _tmpl$10$4 = /* @__PURE__ */ template(`<div class=research-thread-progress-list>`), _tmpl$11$4 = /* @__PURE__ */ template(`<button>Switch to Walk-Away`), _tmpl$12$4 = /* @__PURE__ */ template(`<button>Switch to Interactive`), _tmpl$13$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Researching</h3><div class=research-active-card role=status aria-live=polite><span class="research-spinner research-active-spinner"aria-hidden=true></span><div class=research-active-copy><div class=research-active-title>Agents are working</div><p> of <!> threads complete</p></div></div><div class=phase-controls><button class=secondary>Stop Research</button><button>Stop Research &amp; Synthesize Current Findings`), _tmpl$14$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Synthesizing Report</h3><p>Compiling findings into the Research Report...`), _tmpl$15$3 = /* @__PURE__ */ template(`<div class=research-phase><h3>Report Ready`), _tmpl$16$2 = /* @__PURE__ */ template(`<div class=research-desk>`), _tmpl$17$2 = /* @__PURE__ */ template(`<div class="research-quick-replies inline"aria-label="Suggested briefing responses">`), _tmpl$18$2 = /* @__PURE__ */ template(`<button type=button class=research-quick-reply>`), _tmpl$19$2 = /* @__PURE__ */ template(`<div class=objectives-card><section class=objectives-section><p class=objectives-label>Question</p><p class=objectives-question></p></section><section class=objectives-section><div class=objectives-section-header><p class=objectives-label>Research Threads</p><span></span></div><ul class=objectives-thread-list></ul></section><section class="objectives-section objectives-settings"><label class=mode-toggle><input type=checkbox><span>Walk-away mode (notified when done)</span></label><label class=traces-toggle><input type=checkbox><span>Include agent traces with report</span></label></section><div class=phase-controls><button>Start Research</button><button class=secondary>Cancel`), _tmpl$20$2 = /* @__PURE__ */ template(`<li><span></span><small> sources`), _tmpl$21$2 = /* @__PURE__ */ template(`<section class=objectives-section><p class=objectives-label>Excluded Sources</p><div class=objectives-source-list>`), _tmpl$22$2 = /* @__PURE__ */ template(`<span>`), _tmpl$23$2 = /* @__PURE__ */ template(`<div><span></span><small>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=report-card><h4></h4><p>...</p><p> sources cited</p><button>Export as Markdown</button><button class=secondary>New Research`);
7658
7666
  const ResearchBriefMarkdown = (props) => {
7659
7667
  const html2 = createMemo(() => renderMarkdown(props.content));
7660
7668
  return (() => {
@@ -7696,9 +7704,12 @@ const YES_NO_QUESTION_PATTERN = /^\s*(?:do you want|should (?:i|we|vessel)|would
7696
7704
  const PROCEED_QUESTION_PATTERN = /\b(?:proceed|continue|use defaults?|make assumptions?|sensible defaults?)\b/i;
7697
7705
  const EXPLICIT_OPTION_PREFIX = /^\s*(?:[-*+•–—]|\d+[.)]|\(\d+\)|[A-Za-z][.)]|\([A-Za-z]\)|Option\s+\d+[::])\s+/i;
7698
7706
  const SENTENCE_STARTER = /^(?:Here|These|They|You|I\s|We\s|This|That|If|When|Because|Also|Please|Let|Will|Would|Could|Should|Can|May|Might|Must|Shall)\b/i;
7707
+ const MAX_QUICK_REPLY_LABEL_LENGTH = 180;
7699
7708
  function makeQuickReply(label) {
7700
- const cleaned = label.replace(EXPLICIT_OPTION_PREFIX, "").replace(/\s+/g, " ").trim().replace(/[.?!:]$/, "");
7701
- if (cleaned.length < 2 || cleaned.length > 80) return null;
7709
+ const cleaned = label.replace(EXPLICIT_OPTION_PREFIX, "").replace(/[*_`~]/g, "").replace(/\s+/g, " ").trim().replace(/[.?!:]$/, "");
7710
+ if (cleaned.length < 2 || cleaned.length > MAX_QUICK_REPLY_LABEL_LENGTH) {
7711
+ return null;
7712
+ }
7702
7713
  return {
7703
7714
  label: cleaned,
7704
7715
  response: `Let's use: ${cleaned}.`
@@ -7878,7 +7889,10 @@ function pickResearchClarificationQuickReplies(clarification) {
7878
7889
  if (parsedQuestionOptions.length > 0 && (structuredOptions.length === 0 || structuredOptions.every(isDefaultQuickReply))) {
7879
7890
  return parsedQuestionOptions;
7880
7891
  }
7881
- return structuredOptions;
7892
+ if (parsedQuestionOptions.length > structuredOptions.length) {
7893
+ return uniqueQuickReplies([...structuredOptions, ...parsedQuestionOptions]).slice(0, 6);
7894
+ }
7895
+ return uniqueQuickReplies(structuredOptions).slice(0, 6);
7882
7896
  }
7883
7897
  function findLatestAssistantQuickReplyTarget(messages2) {
7884
7898
  for (let i = messages2.length - 1; i >= 0; i -= 1) {
@@ -7952,6 +7966,18 @@ const ResearchDesk = () => {
7952
7966
  });
7953
7967
  const shouldShowQuickRepliesForMessage = (content) => quickReplies().length > 0 && content.trim() === latestAssistantQuickReplyTarget();
7954
7968
  const isBriefStarting = createMemo(() => state().phase === "briefing" && transcriptMessages().length === 0 && !streamingText2() && pendingQueryCount() === 0);
7969
+ const researchProgress = createMemo(() => {
7970
+ const progress = state().threadProgress;
7971
+ const total = Math.max(state().threads.length, progress.length, 0);
7972
+ const complete = progress.filter((item) => item.status === "completed" || item.status === "failed").length;
7973
+ const active = progress.filter((item) => item.status === "running" || item.status === "stopping").length;
7974
+ return {
7975
+ total,
7976
+ complete: Math.min(complete, total),
7977
+ active,
7978
+ progress
7979
+ };
7980
+ });
7955
7981
  const sendBriefMessage = async (message) => {
7956
7982
  const trimmed = message.trim();
7957
7983
  if (!trimmed) return;
@@ -8043,19 +8069,19 @@ const ResearchDesk = () => {
8043
8069
  return memo(() => message.role === "assistant")() && shouldShowQuickRepliesForMessage(message.content);
8044
8070
  },
8045
8071
  get children() {
8046
- var _el$38 = _tmpl$17$2();
8047
- insert(_el$38, createComponent(For, {
8072
+ var _el$46 = _tmpl$17$2();
8073
+ insert(_el$46, createComponent(For, {
8048
8074
  get each() {
8049
8075
  return quickReplies();
8050
8076
  },
8051
8077
  children: (option) => (() => {
8052
- var _el$39 = _tmpl$18$2();
8053
- _el$39.$$click = () => void sendBriefMessage(option.response);
8054
- insert(_el$39, () => option.label);
8055
- return _el$39;
8078
+ var _el$47 = _tmpl$18$2();
8079
+ _el$47.$$click = () => void sendBriefMessage(option.response);
8080
+ insert(_el$47, () => option.label);
8081
+ return _el$47;
8056
8082
  })()
8057
8083
  }));
8058
- return _el$38;
8084
+ return _el$46;
8059
8085
  }
8060
8086
  })]
8061
8087
  }), null);
@@ -8144,30 +8170,49 @@ const ResearchDesk = () => {
8144
8170
  return state().objectives;
8145
8171
  },
8146
8172
  children: (obj) => (() => {
8147
- var _el$40 = _tmpl$19$2(), _el$41 = _el$40.firstChild, _el$42 = _el$41.firstChild;
8148
- _el$42.nextSibling;
8149
- var _el$44 = _el$41.nextSibling, _el$45 = _el$44.firstChild;
8150
- _el$45.nextSibling;
8151
- var _el$47 = _el$44.nextSibling, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$48.nextSibling, _el$51 = _el$50.firstChild, _el$52 = _el$50.nextSibling, _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling;
8152
- insert(_el$41, () => obj().researchQuestion, null);
8153
- insert(_el$44, () => obj().threads.length, null);
8154
- insert(_el$47, () => obj().threads.map((t) => (() => {
8155
- var _el$55 = _tmpl$20$2(), _el$56 = _el$55.firstChild, _el$58 = _el$56.nextSibling;
8156
- _el$58.nextSibling;
8157
- insert(_el$55, () => t.label, _el$56);
8158
- insert(_el$55, () => t.sourceBudget, _el$58);
8159
- return _el$55;
8173
+ var _el$48 = _tmpl$19$2(), _el$49 = _el$48.firstChild, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling, _el$52 = _el$49.nextSibling, _el$53 = _el$52.firstChild, _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling, _el$56 = _el$53.nextSibling, _el$57 = _el$52.nextSibling, _el$58 = _el$57.firstChild, _el$59 = _el$58.firstChild, _el$60 = _el$58.nextSibling, _el$61 = _el$60.firstChild, _el$62 = _el$57.nextSibling, _el$63 = _el$62.firstChild, _el$64 = _el$63.nextSibling;
8174
+ insert(_el$51, () => obj().researchQuestion);
8175
+ insert(_el$55, () => obj().threads.length);
8176
+ insert(_el$56, () => obj().threads.map((t) => (() => {
8177
+ var _el$65 = _tmpl$20$2(), _el$66 = _el$65.firstChild, _el$67 = _el$66.nextSibling, _el$68 = _el$67.firstChild;
8178
+ insert(_el$66, () => t.label);
8179
+ insert(_el$67, () => t.sourceBudget, _el$68);
8180
+ return _el$65;
8160
8181
  })()));
8161
- _el$49.addEventListener("change", (e) => research.setMode(e.currentTarget.checked ? "walk-away" : "interactive"));
8162
- _el$51.addEventListener("change", (e) => research.setTraces(e.currentTarget.checked));
8163
- _el$53.$$click = () => research.approveObjectives({
8182
+ insert(_el$48, createComponent(Show, {
8183
+ get when() {
8184
+ return Array.from(new Set(obj().threads.flatMap((thread) => thread.blockedDomains)));
8185
+ },
8186
+ children: (blockedDomains) => createComponent(Show, {
8187
+ get when() {
8188
+ return blockedDomains().length > 0;
8189
+ },
8190
+ get children() {
8191
+ var _el$69 = _tmpl$21$2(), _el$70 = _el$69.firstChild, _el$71 = _el$70.nextSibling;
8192
+ insert(_el$71, createComponent(For, {
8193
+ get each() {
8194
+ return blockedDomains();
8195
+ },
8196
+ children: (domain) => (() => {
8197
+ var _el$72 = _tmpl$22$2();
8198
+ insert(_el$72, domain);
8199
+ return _el$72;
8200
+ })()
8201
+ }));
8202
+ return _el$69;
8203
+ }
8204
+ })
8205
+ }), _el$57);
8206
+ _el$59.addEventListener("change", (e) => research.setMode(e.currentTarget.checked ? "walk-away" : "interactive"));
8207
+ _el$61.addEventListener("change", (e) => research.setTraces(e.currentTarget.checked));
8208
+ _el$63.$$click = () => research.approveObjectives({
8164
8209
  supervisionMode: state().supervisionMode,
8165
8210
  includeTraces: state().includeTraces
8166
8211
  });
8167
- _el$54.$$click = () => research.cancel();
8168
- createRenderEffect(() => _el$49.checked = state().supervisionMode === "walk-away");
8169
- createRenderEffect(() => _el$51.checked = state().includeTraces);
8170
- return _el$40;
8212
+ _el$64.$$click = () => research.cancel();
8213
+ createRenderEffect(() => _el$59.checked = state().supervisionMode === "walk-away");
8214
+ createRenderEffect(() => _el$61.checked = state().includeTraces);
8215
+ return _el$48;
8171
8216
  })()
8172
8217
  }), null);
8173
8218
  return _el$25;
@@ -8177,28 +8222,50 @@ const ResearchDesk = () => {
8177
8222
  return state().phase === "executing";
8178
8223
  },
8179
8224
  get children() {
8180
- var _el$27 = _tmpl$13$3();
8181
- _el$27.firstChild;
8182
- insert(_el$27, createComponent(Show, {
8225
+ var _el$27 = _tmpl$13$3(), _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling, _el$30 = _el$29.firstChild, _el$31 = _el$30.nextSibling, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$33.firstChild, _el$36 = _el$34.nextSibling;
8226
+ _el$36.nextSibling;
8227
+ var _el$38 = _el$29.nextSibling, _el$39 = _el$38.firstChild, _el$40 = _el$39.nextSibling;
8228
+ insert(_el$33, () => researchProgress().complete, _el$34);
8229
+ insert(_el$33, () => researchProgress().total, _el$36);
8230
+ insert(_el$33, createComponent(Show, {
8183
8231
  get when() {
8184
- return state().threadFindings.length > 0;
8232
+ return researchProgress().active > 0;
8185
8233
  },
8186
8234
  get children() {
8187
- var _el$29 = _tmpl$10$4(), _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling;
8188
- _el$32.nextSibling;
8189
- insert(_el$29, () => state().threadFindings.length, _el$30);
8190
- insert(_el$29, () => state().threads.length, _el$32);
8191
- return _el$29;
8235
+ return [" ", "· ", memo(() => researchProgress().active), " active"];
8192
8236
  }
8193
8237
  }), null);
8238
+ insert(_el$27, createComponent(Show, {
8239
+ get when() {
8240
+ return researchProgress().progress.length > 0;
8241
+ },
8242
+ get children() {
8243
+ var _el$37 = _tmpl$10$4();
8244
+ insert(_el$37, createComponent(For, {
8245
+ get each() {
8246
+ return researchProgress().progress;
8247
+ },
8248
+ children: (thread) => (() => {
8249
+ var _el$73 = _tmpl$23$2(), _el$74 = _el$73.firstChild, _el$75 = _el$74.nextSibling;
8250
+ insert(_el$74, () => thread.threadLabel);
8251
+ insert(_el$75, () => thread.message);
8252
+ createRenderEffect(() => className(_el$73, `research-thread-progress ${thread.status}`));
8253
+ return _el$73;
8254
+ })()
8255
+ }));
8256
+ return _el$37;
8257
+ }
8258
+ }), _el$38);
8259
+ _el$39.$$click = () => research.cancel();
8260
+ _el$40.$$click = () => research.stopAndSynthesize();
8194
8261
  insert(_el$27, createComponent(Show, {
8195
8262
  get when() {
8196
8263
  return state().supervisionMode === "interactive";
8197
8264
  },
8198
8265
  get children() {
8199
- var _el$33 = _tmpl$11$4();
8200
- _el$33.$$click = () => research.setMode("walk-away");
8201
- return _el$33;
8266
+ var _el$41 = _tmpl$11$4();
8267
+ _el$41.$$click = () => research.setMode("walk-away");
8268
+ return _el$41;
8202
8269
  }
8203
8270
  }), null);
8204
8271
  insert(_el$27, createComponent(Show, {
@@ -8206,9 +8273,9 @@ const ResearchDesk = () => {
8206
8273
  return state().supervisionMode === "walk-away";
8207
8274
  },
8208
8275
  get children() {
8209
- var _el$34 = _tmpl$12$4();
8210
- _el$34.$$click = () => research.setMode("interactive");
8211
- return _el$34;
8276
+ var _el$42 = _tmpl$12$4();
8277
+ _el$42.$$click = () => research.setMode("interactive");
8278
+ return _el$42;
8212
8279
  }
8213
8280
  }), null);
8214
8281
  return _el$27;
@@ -8225,23 +8292,23 @@ const ResearchDesk = () => {
8225
8292
  return state().phase === "delivered";
8226
8293
  },
8227
8294
  get children() {
8228
- var _el$36 = _tmpl$15$3();
8229
- _el$36.firstChild;
8230
- insert(_el$36, createComponent(Show, {
8295
+ var _el$44 = _tmpl$15$3();
8296
+ _el$44.firstChild;
8297
+ insert(_el$44, createComponent(Show, {
8231
8298
  get when() {
8232
8299
  return state().report;
8233
8300
  },
8234
8301
  children: (report) => (() => {
8235
- var _el$59 = _tmpl$21$2(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling, _el$62 = _el$61.firstChild, _el$63 = _el$61.nextSibling, _el$64 = _el$63.firstChild, _el$65 = _el$63.nextSibling, _el$66 = _el$65.nextSibling;
8236
- insert(_el$60, () => report().title);
8237
- insert(_el$61, () => report().executiveSummary.slice(0, 300), _el$62);
8238
- insert(_el$63, () => report().sourceIndex.length, _el$64);
8239
- _el$65.$$click = () => research.exportReport();
8240
- _el$66.$$click = () => research.cancel();
8241
- return _el$59;
8302
+ var _el$76 = _tmpl$24$2(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling, _el$79 = _el$78.firstChild, _el$80 = _el$78.nextSibling, _el$81 = _el$80.firstChild, _el$82 = _el$80.nextSibling, _el$83 = _el$82.nextSibling;
8303
+ insert(_el$77, () => report().title);
8304
+ insert(_el$78, () => report().executiveSummary.slice(0, 300), _el$79);
8305
+ insert(_el$80, () => report().sourceIndex.length, _el$81);
8306
+ _el$82.$$click = () => research.exportReport();
8307
+ _el$83.$$click = () => research.cancel();
8308
+ return _el$76;
8242
8309
  })()
8243
8310
  }), null);
8244
- return _el$36;
8311
+ return _el$44;
8245
8312
  }
8246
8313
  })];
8247
8314
  }
@@ -11373,7 +11440,8 @@ const SettingsVaults = (props) => {
11373
11440
  })();
11374
11441
  };
11375
11442
  delegateEvents(["click", "input"]);
11376
- 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>: `);
11443
+ 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 for=source-do-not-allow-list>Source Do Not Allow List</label><textarea id=source-do-not-allow-list class="settings-input settings-textarea"rows=4 placeholder="example.com
11444
+ low-quality-source.net"></textarea><p class=settings-hint>One domain per line. Research Desk will avoid citing or visiting these sources during research, without blocking normal browsing.</p></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>: `);
11377
11445
  const SettingsPrivacy = (props) => {
11378
11446
  const [permissions, setPermissions] = createSignal([]);
11379
11447
  const loadPermissions = async () => setPermissions(await window.vessel.permissions.getAll());
@@ -11381,7 +11449,7 @@ const SettingsPrivacy = (props) => {
11381
11449
  void loadPermissions();
11382
11450
  });
11383
11451
  return (() => {
11384
- 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;
11452
+ 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$8.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$1.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
11385
11453
  _el$4.addEventListener("change", (e) => props.setDomainMode(e.currentTarget.value));
11386
11454
  insert(_el$2, createComponent(Show, {
11387
11455
  get when() {
@@ -11410,7 +11478,9 @@ const SettingsPrivacy = (props) => {
11410
11478
  return _tmpl$3$4();
11411
11479
  }
11412
11480
  }), null);
11413
- insert(_el$1, createComponent(For, {
11481
+ _el$0.$$input = (e) => props.setSourceDoNotAllowList(e.currentTarget.value);
11482
+ setAttribute(_el$0, "spellcheck", false);
11483
+ insert(_el$12, createComponent(For, {
11414
11484
  get each() {
11415
11485
  return permissions();
11416
11486
  },
@@ -11418,28 +11488,29 @@ const SettingsPrivacy = (props) => {
11418
11488
  return _tmpl$5$3();
11419
11489
  },
11420
11490
  children: (item) => (() => {
11421
- var _el$15 = _tmpl$6$3(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$17.firstChild;
11422
- insert(_el$16, () => item.origin);
11423
- insert(_el$17, () => item.permission, _el$18);
11424
- insert(_el$17, () => item.decision, null);
11425
- return _el$15;
11491
+ var _el$18 = _tmpl$6$3(), _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$20.firstChild;
11492
+ insert(_el$19, () => item.origin);
11493
+ insert(_el$20, () => item.permission, _el$21);
11494
+ insert(_el$20, () => item.decision, null);
11495
+ return _el$18;
11426
11496
  })()
11427
11497
  }));
11428
- _el$10.$$click = async () => {
11498
+ _el$13.$$click = async () => {
11429
11499
  await window.vessel.permissions.clear();
11430
11500
  await loadPermissions();
11431
11501
  };
11432
- _el$13.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
11502
+ _el$16.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
11433
11503
  createRenderEffect((_p$) => {
11434
11504
  var _v$ = !!props.telemetryEnabled(), _v$2 = props.telemetryEnabled();
11435
- _v$ !== _p$.e && _el$13.classList.toggle("on", _p$.e = _v$);
11436
- _v$2 !== _p$.t && setAttribute(_el$13, "aria-checked", _p$.t = _v$2);
11505
+ _v$ !== _p$.e && _el$16.classList.toggle("on", _p$.e = _v$);
11506
+ _v$2 !== _p$.t && setAttribute(_el$16, "aria-checked", _p$.t = _v$2);
11437
11507
  return _p$;
11438
11508
  }, {
11439
11509
  e: void 0,
11440
11510
  t: void 0
11441
11511
  });
11442
11512
  createRenderEffect(() => _el$4.value = props.domainMode());
11513
+ createRenderEffect(() => _el$0.value = props.sourceDoNotAllowList());
11443
11514
  return _el$;
11444
11515
  })();
11445
11516
  };
@@ -12468,6 +12539,7 @@ const Settings = () => {
12468
12539
  const [theme, setTheme] = createSignal("dark");
12469
12540
  const [domainMode, setDomainMode] = createSignal("none");
12470
12541
  const [domainList, setDomainList] = createSignal("");
12542
+ const [sourceDoNotAllowList, setSourceDoNotAllowList] = createSignal("");
12471
12543
  const [sessionList, setSessionList] = createSignal([]);
12472
12544
  const [sessionSaveName, setSessionSaveName] = createSignal("");
12473
12545
  const loadSessionList = async () => {
@@ -12887,6 +12959,7 @@ const Settings = () => {
12887
12959
  setDomainMode("none");
12888
12960
  setDomainList("");
12889
12961
  }
12962
+ setSourceDoNotAllowList((settings.sourceDoNotAllowList ?? []).join("\n"));
12890
12963
  try {
12891
12964
  const ps = await window.vessel.premium.getState();
12892
12965
  setPremiumState(ps);
@@ -12978,6 +13051,8 @@ const Settings = () => {
12978
13051
  blockedDomains: []
12979
13052
  };
12980
13053
  await window.vessel.settings.set("domainPolicy", domainPolicy);
13054
+ const sourceExclusions = sourceDoNotAllowList().split("\n").map((d) => d.trim()).filter((d) => d.length > 0);
13055
+ await window.vessel.settings.set("sourceDoNotAllowList", Array.from(new Set(sourceExclusions)));
12981
13056
  const chatConfig = chatEnabled() ? {
12982
13057
  id: chatProviderId(),
12983
13058
  apiKey: chatApiKey().trim(),
@@ -13220,7 +13295,9 @@ const Settings = () => {
13220
13295
  domainMode,
13221
13296
  setDomainMode,
13222
13297
  domainList,
13223
- setDomainList
13298
+ setDomainList,
13299
+ sourceDoNotAllowList,
13300
+ setSourceDoNotAllowList
13224
13301
  });
13225
13302
  }
13226
13303
  }), null);
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; base-uri 'none'; object-src 'none'; frame-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; form-action 'self';" />
7
7
  <title>Vessel</title>
8
- <script type="module" crossorigin src="./assets/index-DEcAiUVe.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-CzIBoLK8.css">
8
+ <script type="module" crossorigin src="./assets/index-CfezqyLr.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-BF_JrL2V.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>