@quanta-intellect/vessel-browser 0.1.97 → 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 (() => {
@@ -7692,12 +7700,16 @@ function uniqueQuickReplies(options) {
7692
7700
  return true;
7693
7701
  });
7694
7702
  }
7695
- const YES_NO_QUESTION_PATTERN = /\b(?:do you want|should (?:i|we|vessel)|would you like|is it okay|okay to|shall (?:i|we))\b/i;
7703
+ const YES_NO_QUESTION_PATTERN = /^\s*(?:do you want|should (?:i|we|vessel)|would you like|is it okay|okay to|shall (?:i|we))\b/i;
7696
7704
  const PROCEED_QUESTION_PATTERN = /\b(?:proceed|continue|use defaults?|make assumptions?|sensible defaults?)\b/i;
7697
- const EXPLICIT_OPTION_PREFIX = /^\s*(?:[-*•–—]|\d+[.)]|\(\d+\)|[A-Z][.)]|\([A-Z]\)|Option\s+\d+[::])\s+/i;
7705
+ const EXPLICIT_OPTION_PREFIX = /^\s*(?:[-*+•–—]|\d+[.)]|\(\d+\)|[A-Za-z][.)]|\([A-Za-z]\)|Option\s+\d+[::])\s+/i;
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;
7698
7708
  function makeQuickReply(label) {
7699
- const cleaned = label.replace(EXPLICIT_OPTION_PREFIX, "").replace(/\s+/g, " ").trim().replace(/[.?!:]$/, "");
7700
- 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
+ }
7701
7713
  return {
7702
7714
  label: cleaned,
7703
7715
  response: `Let's use: ${cleaned}.`
@@ -7710,22 +7722,81 @@ function isExplicitOptionLine(line) {
7710
7722
  return !/[?]$/.test(cleaned);
7711
7723
  }
7712
7724
  function extractDelimitedOptions(text2) {
7713
- return text2.split(/\s*(?:;|,|\/|\||\bor\b)\s*/i).map(makeQuickReply).filter((option) => option !== null);
7725
+ return text2.split(/\s*(?:;|,|\/|\||\s+-\s+|\bor\b)\s*/i).map(makeQuickReply).filter((option) => option !== null);
7714
7726
  }
7715
7727
  function extractFollowUpOptions(prompt) {
7716
7728
  const lines = prompt.split("\n");
7717
7729
  const options = [];
7718
7730
  for (let i = 0; i < lines.length - 1; i++) {
7719
7731
  const line = lines[i].trim();
7720
- const nextLine = lines[i + 1].trim();
7721
7732
  if (!line.includes("?")) continue;
7722
- if (!nextLine) continue;
7733
+ let j = i + 1;
7734
+ while (j < lines.length && !lines[j].trim()) j++;
7735
+ if (j >= lines.length) continue;
7736
+ const nextLine = lines[j].trim();
7723
7737
  if (EXPLICIT_OPTION_PREFIX.test(nextLine)) continue;
7724
7738
  if (!/[,;\/|]|\bor\b/.test(nextLine)) continue;
7725
7739
  options.push(...extractDelimitedOptions(nextLine));
7726
7740
  }
7727
7741
  return uniqueQuickReplies(options);
7728
7742
  }
7743
+ function extractInlineOptions(prompt) {
7744
+ const options = [];
7745
+ for (const line of prompt.split("\n")) {
7746
+ const trimmed = line.trim();
7747
+ if (!/\?/.test(trimmed)) continue;
7748
+ const afterQuestion = trimmed.slice(trimmed.lastIndexOf("?") + 1).trim();
7749
+ if (!afterQuestion) continue;
7750
+ if (/\b(?:options?|choices?|examples?|example answers?|examples? include|sample answers?|sample responses?)\b.*[::]/i.test(afterQuestion)) {
7751
+ continue;
7752
+ }
7753
+ const hasDelimiters = /[,;\/|]|\bor\b/.test(afterQuestion);
7754
+ const hasDashList = /\s+-\s+/.test(afterQuestion);
7755
+ if (!hasDelimiters && !hasDashList) continue;
7756
+ if (hasDelimiters) {
7757
+ options.push(...extractDelimitedOptions(afterQuestion));
7758
+ }
7759
+ if (hasDashList) {
7760
+ const parts = afterQuestion.split(/\s+-\s+/);
7761
+ for (const part of parts) {
7762
+ const option = makeQuickReply(part);
7763
+ if (option) options.push(option);
7764
+ }
7765
+ }
7766
+ }
7767
+ return uniqueQuickReplies(options);
7768
+ }
7769
+ function extractImplicitOptions(prompt) {
7770
+ const lines = prompt.split("\n");
7771
+ const options = [];
7772
+ let questionIdx = -1;
7773
+ for (let i2 = lines.length - 1; i2 >= 0; i2--) {
7774
+ if (lines[i2].includes("?")) {
7775
+ questionIdx = i2;
7776
+ break;
7777
+ }
7778
+ }
7779
+ if (questionIdx < 0) return [];
7780
+ let i = questionIdx + 1;
7781
+ while (i < lines.length && !lines[i].trim()) i++;
7782
+ const candidates = [];
7783
+ for (; i < lines.length; i++) {
7784
+ const line = lines[i].trim();
7785
+ if (!line) break;
7786
+ if (EXPLICIT_OPTION_PREFIX.test(line)) break;
7787
+ if (SENTENCE_STARTER.test(line)) break;
7788
+ const hasDelimiters = /[,;\/|]|\bor\b/.test(line);
7789
+ if (line.length > 80 && !hasDelimiters) break;
7790
+ candidates.push(line);
7791
+ }
7792
+ if (candidates.length >= 2 && candidates.length <= 6) {
7793
+ for (const candidate of candidates) {
7794
+ const option = makeQuickReply(candidate);
7795
+ if (option) options.push(option);
7796
+ }
7797
+ }
7798
+ return uniqueQuickReplies(options);
7799
+ }
7729
7800
  function extractExampleQuickReplies(prompt) {
7730
7801
  const options = [];
7731
7802
  for (const line of prompt.split("\n")) {
@@ -7753,9 +7824,22 @@ function extractExplicitQuickReplies(prompt) {
7753
7824
  if (inlineMatch) {
7754
7825
  options.push(...extractDelimitedOptions(inlineMatch[1]));
7755
7826
  }
7756
- const labelledMatch = prompt.match(/(?:options?|choices?)\s*[::]\s*(.+?)(?:\n|$)/i);
7757
- if (labelledMatch) {
7758
- options.push(...extractDelimitedOptions(labelledMatch[1]));
7827
+ options.push(...extractInlineOptions(prompt));
7828
+ const lines = prompt.split("\n");
7829
+ for (let i = 0; i < lines.length; i++) {
7830
+ if (!/\b(?:options?|choices?)\s*[::]/i.test(lines[i])) continue;
7831
+ const restOfLine = lines[i].replace(/^.*?\b(?:options?|choices?)\s*[::]\s*/i, "").trim();
7832
+ if (restOfLine) {
7833
+ options.push(...extractDelimitedOptions(restOfLine));
7834
+ }
7835
+ let j = i + 1;
7836
+ while (j < lines.length && !lines[j].trim()) j++;
7837
+ for (; j < lines.length; j++) {
7838
+ const line = lines[j].trim();
7839
+ if (!line) break;
7840
+ const option = makeQuickReply(line);
7841
+ if (option) options.push(option);
7842
+ }
7759
7843
  }
7760
7844
  options.push(...extractExampleQuickReplies(prompt));
7761
7845
  options.push(...extractFollowUpOptions(prompt));
@@ -7766,6 +7850,10 @@ function buildQuickReplies(prompt) {
7766
7850
  if (explicitOptions.length > 0) {
7767
7851
  return explicitOptions.slice(0, 6);
7768
7852
  }
7853
+ const implicitOptions = extractImplicitOptions(prompt);
7854
+ if (implicitOptions.length > 0) {
7855
+ return implicitOptions.slice(0, 6);
7856
+ }
7769
7857
  if (YES_NO_QUESTION_PATTERN.test(prompt)) {
7770
7858
  return [{
7771
7859
  label: "Yes",
@@ -7801,7 +7889,10 @@ function pickResearchClarificationQuickReplies(clarification) {
7801
7889
  if (parsedQuestionOptions.length > 0 && (structuredOptions.length === 0 || structuredOptions.every(isDefaultQuickReply))) {
7802
7890
  return parsedQuestionOptions;
7803
7891
  }
7804
- return structuredOptions;
7892
+ if (parsedQuestionOptions.length > structuredOptions.length) {
7893
+ return uniqueQuickReplies([...structuredOptions, ...parsedQuestionOptions]).slice(0, 6);
7894
+ }
7895
+ return uniqueQuickReplies(structuredOptions).slice(0, 6);
7805
7896
  }
7806
7897
  function findLatestAssistantQuickReplyTarget(messages2) {
7807
7898
  for (let i = messages2.length - 1; i >= 0; i -= 1) {
@@ -7875,6 +7966,18 @@ const ResearchDesk = () => {
7875
7966
  });
7876
7967
  const shouldShowQuickRepliesForMessage = (content) => quickReplies().length > 0 && content.trim() === latestAssistantQuickReplyTarget();
7877
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
+ });
7878
7981
  const sendBriefMessage = async (message) => {
7879
7982
  const trimmed = message.trim();
7880
7983
  if (!trimmed) return;
@@ -7966,19 +8069,19 @@ const ResearchDesk = () => {
7966
8069
  return memo(() => message.role === "assistant")() && shouldShowQuickRepliesForMessage(message.content);
7967
8070
  },
7968
8071
  get children() {
7969
- var _el$38 = _tmpl$17$2();
7970
- insert(_el$38, createComponent(For, {
8072
+ var _el$46 = _tmpl$17$2();
8073
+ insert(_el$46, createComponent(For, {
7971
8074
  get each() {
7972
8075
  return quickReplies();
7973
8076
  },
7974
8077
  children: (option) => (() => {
7975
- var _el$39 = _tmpl$18$2();
7976
- _el$39.$$click = () => void sendBriefMessage(option.response);
7977
- insert(_el$39, () => option.label);
7978
- 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;
7979
8082
  })()
7980
8083
  }));
7981
- return _el$38;
8084
+ return _el$46;
7982
8085
  }
7983
8086
  })]
7984
8087
  }), null);
@@ -8067,30 +8170,49 @@ const ResearchDesk = () => {
8067
8170
  return state().objectives;
8068
8171
  },
8069
8172
  children: (obj) => (() => {
8070
- var _el$40 = _tmpl$19$2(), _el$41 = _el$40.firstChild, _el$42 = _el$41.firstChild;
8071
- _el$42.nextSibling;
8072
- var _el$44 = _el$41.nextSibling, _el$45 = _el$44.firstChild;
8073
- _el$45.nextSibling;
8074
- 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;
8075
- insert(_el$41, () => obj().researchQuestion, null);
8076
- insert(_el$44, () => obj().threads.length, null);
8077
- insert(_el$47, () => obj().threads.map((t) => (() => {
8078
- var _el$55 = _tmpl$20$2(), _el$56 = _el$55.firstChild, _el$58 = _el$56.nextSibling;
8079
- _el$58.nextSibling;
8080
- insert(_el$55, () => t.label, _el$56);
8081
- insert(_el$55, () => t.sourceBudget, _el$58);
8082
- 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;
8083
8181
  })()));
8084
- _el$49.addEventListener("change", (e) => research.setMode(e.currentTarget.checked ? "walk-away" : "interactive"));
8085
- _el$51.addEventListener("change", (e) => research.setTraces(e.currentTarget.checked));
8086
- _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({
8087
8209
  supervisionMode: state().supervisionMode,
8088
8210
  includeTraces: state().includeTraces
8089
8211
  });
8090
- _el$54.$$click = () => research.cancel();
8091
- createRenderEffect(() => _el$49.checked = state().supervisionMode === "walk-away");
8092
- createRenderEffect(() => _el$51.checked = state().includeTraces);
8093
- 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;
8094
8216
  })()
8095
8217
  }), null);
8096
8218
  return _el$25;
@@ -8100,28 +8222,50 @@ const ResearchDesk = () => {
8100
8222
  return state().phase === "executing";
8101
8223
  },
8102
8224
  get children() {
8103
- var _el$27 = _tmpl$13$3();
8104
- _el$27.firstChild;
8105
- 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, {
8106
8231
  get when() {
8107
- return state().threadFindings.length > 0;
8232
+ return researchProgress().active > 0;
8108
8233
  },
8109
8234
  get children() {
8110
- var _el$29 = _tmpl$10$4(), _el$30 = _el$29.firstChild, _el$32 = _el$30.nextSibling;
8111
- _el$32.nextSibling;
8112
- insert(_el$29, () => state().threadFindings.length, _el$30);
8113
- insert(_el$29, () => state().threads.length, _el$32);
8114
- return _el$29;
8235
+ return [" ", "· ", memo(() => researchProgress().active), " active"];
8115
8236
  }
8116
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();
8117
8261
  insert(_el$27, createComponent(Show, {
8118
8262
  get when() {
8119
8263
  return state().supervisionMode === "interactive";
8120
8264
  },
8121
8265
  get children() {
8122
- var _el$33 = _tmpl$11$4();
8123
- _el$33.$$click = () => research.setMode("walk-away");
8124
- return _el$33;
8266
+ var _el$41 = _tmpl$11$4();
8267
+ _el$41.$$click = () => research.setMode("walk-away");
8268
+ return _el$41;
8125
8269
  }
8126
8270
  }), null);
8127
8271
  insert(_el$27, createComponent(Show, {
@@ -8129,9 +8273,9 @@ const ResearchDesk = () => {
8129
8273
  return state().supervisionMode === "walk-away";
8130
8274
  },
8131
8275
  get children() {
8132
- var _el$34 = _tmpl$12$4();
8133
- _el$34.$$click = () => research.setMode("interactive");
8134
- return _el$34;
8276
+ var _el$42 = _tmpl$12$4();
8277
+ _el$42.$$click = () => research.setMode("interactive");
8278
+ return _el$42;
8135
8279
  }
8136
8280
  }), null);
8137
8281
  return _el$27;
@@ -8148,23 +8292,23 @@ const ResearchDesk = () => {
8148
8292
  return state().phase === "delivered";
8149
8293
  },
8150
8294
  get children() {
8151
- var _el$36 = _tmpl$15$3();
8152
- _el$36.firstChild;
8153
- insert(_el$36, createComponent(Show, {
8295
+ var _el$44 = _tmpl$15$3();
8296
+ _el$44.firstChild;
8297
+ insert(_el$44, createComponent(Show, {
8154
8298
  get when() {
8155
8299
  return state().report;
8156
8300
  },
8157
8301
  children: (report) => (() => {
8158
- 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;
8159
- insert(_el$60, () => report().title);
8160
- insert(_el$61, () => report().executiveSummary.slice(0, 300), _el$62);
8161
- insert(_el$63, () => report().sourceIndex.length, _el$64);
8162
- _el$65.$$click = () => research.exportReport();
8163
- _el$66.$$click = () => research.cancel();
8164
- 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;
8165
8309
  })()
8166
8310
  }), null);
8167
- return _el$36;
8311
+ return _el$44;
8168
8312
  }
8169
8313
  })];
8170
8314
  }
@@ -11296,7 +11440,8 @@ const SettingsVaults = (props) => {
11296
11440
  })();
11297
11441
  };
11298
11442
  delegateEvents(["click", "input"]);
11299
- 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>: `);
11300
11445
  const SettingsPrivacy = (props) => {
11301
11446
  const [permissions, setPermissions] = createSignal([]);
11302
11447
  const loadPermissions = async () => setPermissions(await window.vessel.permissions.getAll());
@@ -11304,7 +11449,7 @@ const SettingsPrivacy = (props) => {
11304
11449
  void loadPermissions();
11305
11450
  });
11306
11451
  return (() => {
11307
- 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;
11308
11453
  _el$4.addEventListener("change", (e) => props.setDomainMode(e.currentTarget.value));
11309
11454
  insert(_el$2, createComponent(Show, {
11310
11455
  get when() {
@@ -11333,7 +11478,9 @@ const SettingsPrivacy = (props) => {
11333
11478
  return _tmpl$3$4();
11334
11479
  }
11335
11480
  }), null);
11336
- 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, {
11337
11484
  get each() {
11338
11485
  return permissions();
11339
11486
  },
@@ -11341,28 +11488,29 @@ const SettingsPrivacy = (props) => {
11341
11488
  return _tmpl$5$3();
11342
11489
  },
11343
11490
  children: (item) => (() => {
11344
- var _el$15 = _tmpl$6$3(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$17.firstChild;
11345
- insert(_el$16, () => item.origin);
11346
- insert(_el$17, () => item.permission, _el$18);
11347
- insert(_el$17, () => item.decision, null);
11348
- 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;
11349
11496
  })()
11350
11497
  }));
11351
- _el$10.$$click = async () => {
11498
+ _el$13.$$click = async () => {
11352
11499
  await window.vessel.permissions.clear();
11353
11500
  await loadPermissions();
11354
11501
  };
11355
- _el$13.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
11502
+ _el$16.$$click = () => props.setTelemetryEnabled(!props.telemetryEnabled());
11356
11503
  createRenderEffect((_p$) => {
11357
11504
  var _v$ = !!props.telemetryEnabled(), _v$2 = props.telemetryEnabled();
11358
- _v$ !== _p$.e && _el$13.classList.toggle("on", _p$.e = _v$);
11359
- _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);
11360
11507
  return _p$;
11361
11508
  }, {
11362
11509
  e: void 0,
11363
11510
  t: void 0
11364
11511
  });
11365
11512
  createRenderEffect(() => _el$4.value = props.domainMode());
11513
+ createRenderEffect(() => _el$0.value = props.sourceDoNotAllowList());
11366
11514
  return _el$;
11367
11515
  })();
11368
11516
  };
@@ -12391,6 +12539,7 @@ const Settings = () => {
12391
12539
  const [theme, setTheme] = createSignal("dark");
12392
12540
  const [domainMode, setDomainMode] = createSignal("none");
12393
12541
  const [domainList, setDomainList] = createSignal("");
12542
+ const [sourceDoNotAllowList, setSourceDoNotAllowList] = createSignal("");
12394
12543
  const [sessionList, setSessionList] = createSignal([]);
12395
12544
  const [sessionSaveName, setSessionSaveName] = createSignal("");
12396
12545
  const loadSessionList = async () => {
@@ -12810,6 +12959,7 @@ const Settings = () => {
12810
12959
  setDomainMode("none");
12811
12960
  setDomainList("");
12812
12961
  }
12962
+ setSourceDoNotAllowList((settings.sourceDoNotAllowList ?? []).join("\n"));
12813
12963
  try {
12814
12964
  const ps = await window.vessel.premium.getState();
12815
12965
  setPremiumState(ps);
@@ -12901,6 +13051,8 @@ const Settings = () => {
12901
13051
  blockedDomains: []
12902
13052
  };
12903
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)));
12904
13056
  const chatConfig = chatEnabled() ? {
12905
13057
  id: chatProviderId(),
12906
13058
  apiKey: chatApiKey().trim(),
@@ -13143,7 +13295,9 @@ const Settings = () => {
13143
13295
  domainMode,
13144
13296
  setDomainMode,
13145
13297
  domainList,
13146
- setDomainList
13298
+ setDomainList,
13299
+ sourceDoNotAllowList,
13300
+ setSourceDoNotAllowList
13147
13301
  });
13148
13302
  }
13149
13303
  }), null);