@quanta-intellect/vessel-browser 0.1.104 → 0.1.115

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.
@@ -2301,7 +2301,7 @@ function getAgentPresence(state, currentTime = Date.now()) {
2301
2301
  }
2302
2302
  return "idle";
2303
2303
  }
2304
- var _tmpl$$p = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$o = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$l = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list></div><div class=tab-actions><button class=tab-new data-tooltip="New window"data-tooltip-pos=left></button><button class=tab-new data-tooltip="Add active tab to group"data-tooltip-pos=left></button><button class=tab-new data-tooltip="New tab"data-tooltip-pos=left></button><button class="tab-new tab-new-private"data-tooltip="Private window"data-tooltip-pos=left><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11z">`), _tmpl$4$l = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$i = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$g = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$d = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$a = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$8 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$7 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$7 = /* @__PURE__ */ template(`<span class=tab-loading>`);
2304
+ var _tmpl$$p = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$o = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$l = /* @__PURE__ */ template(`<div class=tab-bar><div class=tab-list></div><div class=tab-actions><button class=tab-new data-tooltip="New window"data-tooltip-pos=left></button><button class=tab-new data-tooltip="Add active tab to group"data-tooltip-pos=left></button><button class=tab-new data-tooltip="New tab"data-tooltip-pos=left></button><button class="tab-new tab-new-private"data-tooltip="Private window"data-tooltip-pos=left><svg width=12 height=12 viewBox="0 0 16 16"fill=currentColor><path d="M8 1a7 7 0 100 14A7 7 0 008 1zm0 1.5a5.5 5.5 0 110 11 5.5 5.5 0 010-11z">`), _tmpl$4$l = /* @__PURE__ */ template(`<button><span class=tab-group-dot></span><span class=tab-group-name></span><span class=tab-group-count>`), _tmpl$5$i = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$g = /* @__PURE__ */ template(`<div role=tab>`), _tmpl$7$e = /* @__PURE__ */ template(`<span class=tab-title>`), _tmpl$8$a = /* @__PURE__ */ template(`<button class=tab-audio>`), _tmpl$9$9 = /* @__PURE__ */ template(`<button class=tab-close>×`), _tmpl$0$7 = /* @__PURE__ */ template(`<span class=tab-agent-indicator aria-hidden=true title="Agent active on this tab">`), _tmpl$1$7 = /* @__PURE__ */ template(`<span class=tab-loading>`);
2305
2305
  const TAB_CLOSE_MS = 200;
2306
2306
  function stringToHue(str) {
2307
2307
  let hash = 0;
@@ -2360,6 +2360,12 @@ const TabBar = () => {
2360
2360
  const [closingTabIds, setClosingTabIds] = createSignal(/* @__PURE__ */ new Set());
2361
2361
  const modelActiveTabIds = createMemo(() => getAgentActiveTabIds(runtimeState2(), now2()));
2362
2362
  const tabEntries = createMemo(() => {
2363
+ const groupCounts = /* @__PURE__ */ new Map();
2364
+ for (const tab of tabs2()) {
2365
+ if (tab.groupId) {
2366
+ groupCounts.set(tab.groupId, (groupCounts.get(tab.groupId) ?? 0) + 1);
2367
+ }
2368
+ }
2363
2369
  const seenGroups = /* @__PURE__ */ new Set();
2364
2370
  return tabs2().flatMap((tab) => {
2365
2371
  const entries2 = [];
@@ -2371,7 +2377,7 @@ const TabBar = () => {
2371
2377
  name: tab.groupName || "Group",
2372
2378
  color: tab.groupColor || "blue",
2373
2379
  collapsed: !!tab.groupCollapsed,
2374
- count: tabs2().filter((candidate) => candidate.groupId === tab.groupId).length
2380
+ count: groupCounts.get(tab.groupId) ?? 0
2375
2381
  });
2376
2382
  }
2377
2383
  if (!tab.groupCollapsed || tab.id === activeTabId2()) {
@@ -2484,7 +2490,7 @@ const TabBar = () => {
2484
2490
  insert(_el$12, (() => {
2485
2491
  var _c$ = memo(() => !!!tab.isPinned);
2486
2492
  return () => _c$() && [memo(() => memo(() => !!modelActiveTabIds().has(tab.id))() && _tmpl$0$7()), (() => {
2487
- var _el$14 = _tmpl$7$d();
2493
+ var _el$14 = _tmpl$7$e();
2488
2494
  insert(_el$14, () => tab.title || "New Tab");
2489
2495
  return _el$14;
2490
2496
  })(), createComponent(Show, {
@@ -2516,7 +2522,7 @@ const TabBar = () => {
2516
2522
  return _el$15;
2517
2523
  }
2518
2524
  }), memo(() => memo(() => !!tab.isLoading)() && _tmpl$1$7()), (() => {
2519
- var _el$16 = _tmpl$9$8();
2525
+ var _el$16 = _tmpl$9$9();
2520
2526
  _el$16.$$click = (e) => {
2521
2527
  e.stopPropagation();
2522
2528
  handleClose(tab.id);
@@ -2733,8 +2739,10 @@ function useUI() {
2733
2739
  };
2734
2740
  }
2735
2741
  const logger$3 = createLogger("HistoryStore");
2742
+ const HISTORY_PAGE_SIZE = 200;
2736
2743
  const INITIAL$1 = { entries: [] };
2737
2744
  const [historyState, setHistoryState] = createSignal(INITIAL$1);
2745
+ const [historyTotal, setHistoryTotal] = createSignal(0);
2738
2746
  let initialized$3 = false;
2739
2747
  let initPromise$1 = null;
2740
2748
  async function init$3() {
@@ -2743,9 +2751,13 @@ async function init$3() {
2743
2751
  initialized$3 = true;
2744
2752
  initPromise$1 = (async () => {
2745
2753
  try {
2746
- const state = await window.vessel.history.get();
2747
- setHistoryState(state);
2748
- window.vessel.history.onUpdate((s) => setHistoryState(s));
2754
+ const page = await window.vessel.history.list(0, HISTORY_PAGE_SIZE);
2755
+ setHistoryState({ entries: page.entries });
2756
+ setHistoryTotal(page.total);
2757
+ window.vessel.history.onUpdate((page2) => {
2758
+ setHistoryState({ entries: page2.entries });
2759
+ setHistoryTotal(page2.total);
2760
+ });
2749
2761
  } catch (error) {
2750
2762
  initialized$3 = false;
2751
2763
  logger$3.error("Failed to initialize history store:", error);
@@ -2757,8 +2769,19 @@ async function init$3() {
2757
2769
  }
2758
2770
  function useHistory() {
2759
2771
  void init$3();
2772
+ const loadMore = async (limit = HISTORY_PAGE_SIZE) => {
2773
+ const current = historyState().entries;
2774
+ const page = await window.vessel.history.list(current.length, limit);
2775
+ setHistoryState({ entries: [...current, ...page.entries] });
2776
+ setHistoryTotal(page.total);
2777
+ return page;
2778
+ };
2760
2779
  return {
2761
2780
  historyState,
2781
+ historyTotal,
2782
+ hasMore: () => historyState().entries.length < historyTotal(),
2783
+ loadMore,
2784
+ list: (offset, limit) => window.vessel.history.list(offset, limit),
2762
2785
  search: (query) => window.vessel.history.search(query),
2763
2786
  clear: () => window.vessel.history.clear()
2764
2787
  };
@@ -3003,7 +3026,7 @@ const SEARCH_ENGINE_PRESETS = {
3003
3026
  ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
3004
3027
  kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
3005
3028
  };
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>`);
3029
+ 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$d = /* @__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$8 = /* @__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$3 = /* @__PURE__ */ template(`<li>`);
3007
3030
  const AddressBar = (props) => {
3008
3031
  const {
3009
3032
  activeTab,
@@ -3456,7 +3479,7 @@ const AddressBar = (props) => {
3456
3479
  return pageDiff();
3457
3480
  },
3458
3481
  get children() {
3459
- var _el$18 = _tmpl$7$c();
3482
+ var _el$18 = _tmpl$7$d();
3460
3483
  _el$18.$$click = () => void openDiffTimeline();
3461
3484
  return _el$18;
3462
3485
  }
@@ -3489,7 +3512,7 @@ const AddressBar = (props) => {
3489
3512
  return memo(() => !!pageDiff().recentBursts?.length)() && (pageDiff().recentBursts?.length || 0) > 1;
3490
3513
  },
3491
3514
  get children() {
3492
- var _el$33 = _tmpl$9$7();
3515
+ var _el$33 = _tmpl$9$8();
3493
3516
  _el$33.firstChild;
3494
3517
  insert(_el$33, createComponent(For, {
3495
3518
  get each() {
@@ -3577,7 +3600,7 @@ const AddressBar = (props) => {
3577
3600
  return change.addedItems;
3578
3601
  },
3579
3602
  children: (item) => (() => {
3580
- var _el$80 = _tmpl$29$2();
3603
+ var _el$80 = _tmpl$29$3();
3581
3604
  insert(_el$80, item);
3582
3605
  return _el$80;
3583
3606
  })()
@@ -3596,7 +3619,7 @@ const AddressBar = (props) => {
3596
3619
  return change.removedItems;
3597
3620
  },
3598
3621
  children: (item) => (() => {
3599
- var _el$81 = _tmpl$29$2();
3622
+ var _el$81 = _tmpl$29$3();
3600
3623
  insert(_el$81, item);
3601
3624
  return _el$81;
3602
3625
  })()
@@ -3847,7 +3870,7 @@ const HighlightNotifications = (props) => {
3847
3870
  });
3848
3871
  };
3849
3872
  delegateEvents(["click"]);
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>`);
3873
+ 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$c = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
3851
3874
  const TOAST_DONE_DURATION_MS = 4200;
3852
3875
  const TOAST_EXIT_MS = 300;
3853
3876
  function formatBytes$1(bytes) {
@@ -3944,7 +3967,7 @@ const DownloadToast = () => {
3944
3967
  return downloads();
3945
3968
  },
3946
3969
  children: (dl) => (() => {
3947
- var _el$2 = _tmpl$7$b(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
3970
+ var _el$2 = _tmpl$7$c(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
3948
3971
  insert(_el$4, () => dl.filename);
3949
3972
  insert(_el$3, createComponent(Show, {
3950
3973
  get when() {
@@ -4311,7 +4334,7 @@ function formatTime(iso, options) {
4311
4334
  ...options?.includeSeconds && { second: "2-digit" }
4312
4335
  });
4313
4336
  }
4314
- var _tmpl$$g = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$g = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$f = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$f = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$5$d = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$d = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$a = /* @__PURE__ */ template(`<article><div class=agent-transcript-meta><span class=agent-transcript-badge></span><span class=agent-transcript-time></span></div><div class=agent-transcript-text>`);
4337
+ var _tmpl$$g = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$g = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$f = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$f = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Transcript</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$5$d = /* @__PURE__ */ template(`<span class=agent-summary-live-dot aria-hidden=true>`), _tmpl$6$d = /* @__PURE__ */ template(`<span class=agent-summary-text>: `), _tmpl$7$b = /* @__PURE__ */ template(`<article><div class=agent-transcript-meta><span class=agent-transcript-badge></span><span class=agent-transcript-time></span></div><div class=agent-transcript-text>`);
4315
4338
  const AgentTranscriptDock = () => {
4316
4339
  const {
4317
4340
  runtimeState: runtimeState2
@@ -4403,7 +4426,7 @@ const AgentTranscriptDock = () => {
4403
4426
  return visibleEntries();
4404
4427
  },
4405
4428
  children: (entry) => (() => {
4406
- var _el$12 = _tmpl$7$a(), _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$13.nextSibling;
4429
+ var _el$12 = _tmpl$7$b(), _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild, _el$15 = _el$14.nextSibling, _el$16 = _el$13.nextSibling;
4407
4430
  insert(_el$14, () => entry.title || entry.kind);
4408
4431
  insert(_el$15, () => formatTime(entry.updatedAt));
4409
4432
  insert(_el$16, () => entry.text);
@@ -4438,6 +4461,57 @@ const AgentTranscriptDock = () => {
4438
4461
  });
4439
4462
  };
4440
4463
  delegateEvents(["click"]);
4464
+ const MAX_PROVIDER_HISTORY_MESSAGES = 24;
4465
+ const MAX_PROVIDER_HISTORY_CHARS = 24e3;
4466
+ const MAX_PROVIDER_HISTORY_MESSAGE_CHARS = 3e3;
4467
+ const MAX_PROVIDER_HISTORY_SUMMARY_CHARS = 2e3;
4468
+ function truncateText(value, maxLength) {
4469
+ if (value.length <= maxLength) return value;
4470
+ return `${value.slice(0, maxLength - 3).trimEnd()}...`;
4471
+ }
4472
+ function normalizeHistoryMessage(message) {
4473
+ return {
4474
+ role: message.role,
4475
+ content: truncateText(message.content, MAX_PROVIDER_HISTORY_MESSAGE_CHARS)
4476
+ };
4477
+ }
4478
+ function totalHistoryChars(history) {
4479
+ return history.reduce((total, message) => total + message.content.length, 0);
4480
+ }
4481
+ function summarizeOmittedHistory(history) {
4482
+ const snippets = history.slice(-12).map((message) => `${message.role}: ${truncateText(message.content.replace(/\s+/g, " ").trim(), 220)}`).filter((line) => line.length > "assistant: ".length);
4483
+ const content = truncateText(
4484
+ [
4485
+ `[Earlier conversation compacted: ${history.length} message${history.length === 1 ? "" : "s"} omitted.]`,
4486
+ ...snippets
4487
+ ].join("\n"),
4488
+ MAX_PROVIDER_HISTORY_SUMMARY_CHARS
4489
+ );
4490
+ return { role: "user", content };
4491
+ }
4492
+ function compactProviderHistory(history = []) {
4493
+ const normalized = history.map(normalizeHistoryMessage);
4494
+ if (normalized.length <= MAX_PROVIDER_HISTORY_MESSAGES && totalHistoryChars(normalized) <= MAX_PROVIDER_HISTORY_CHARS) {
4495
+ return normalized;
4496
+ }
4497
+ const recent = [];
4498
+ const recentBudget = MAX_PROVIDER_HISTORY_CHARS - MAX_PROVIDER_HISTORY_SUMMARY_CHARS;
4499
+ let usedChars = 0;
4500
+ for (let index = normalized.length - 1; index >= 0; index--) {
4501
+ const message = normalized[index];
4502
+ const nextChars = usedChars + message.content.length;
4503
+ if (recent.length >= MAX_PROVIDER_HISTORY_MESSAGES || nextChars > recentBudget) {
4504
+ break;
4505
+ }
4506
+ recent.unshift(message);
4507
+ usedChars = nextChars;
4508
+ }
4509
+ if (recent.length === 0 && normalized.length > 0) {
4510
+ recent.unshift(normalized[normalized.length - 1]);
4511
+ }
4512
+ const omitted = normalized.slice(0, normalized.length - recent.length);
4513
+ return omitted.length > 0 ? [summarizeOmittedHistory(omitted), ...recent] : recent;
4514
+ }
4441
4515
  const MAX_AUTOMATION_ACTIVITY_ENTRIES = 8;
4442
4516
  function trimActivities(entries2, limit = MAX_AUTOMATION_ACTIVITY_ENTRIES) {
4443
4517
  return entries2.length > limit ? entries2.slice(0, limit) : entries2;
@@ -4549,10 +4623,7 @@ function recordRecentQuery(prompt) {
4549
4623
  });
4550
4624
  }
4551
4625
  function buildHistory() {
4552
- return messages().map((message) => ({
4553
- role: message.role,
4554
- content: message.content
4555
- }));
4626
+ return compactProviderHistory(messages());
4556
4627
  }
4557
4628
  async function dispatchQuery(prompt) {
4558
4629
  const result = await window.vessel.ai.query(prompt, buildHistory());
@@ -4790,7 +4861,101 @@ function useAnimatedPresence(isOpen, exitDurationMs) {
4790
4861
  });
4791
4862
  return { visible, closing };
4792
4863
  }
4793
- var _tmpl$$f = /* @__PURE__ */ template(`<div class=command-bar-no-provider><p>Configure a chat provider to start using the AI assistant.</p><button class=command-bar-no-provider-btn>Open Settings <kbd>Ctrl+,`), _tmpl$2$f = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$3$e = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$4$e = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=command-bar><form><div class=command-bar-icon><svg width=16 height=16 viewBox="0 0 16 16"><circle cx=8 cy=8 r=6 fill=none stroke=var(--accent-primary) stroke-width=1.5></circle><circle cx=6 cy=7 r=0.8 fill=var(--accent-primary)></circle><circle cx=10 cy=7 r=0.8 fill=var(--accent-primary)></circle><path d="M6 10c0.5 0.8 3.5 0.8 4 0"fill=none stroke=var(--accent-primary) stroke-width=0.8 stroke-linecap=round></path></svg></div><input class=command-bar-input type=text></form><div class=command-bar-hints><span><kbd>Enter</kbd> to ask</span><span><kbd>Esc</kbd> to close`), _tmpl$5$c = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$6$c = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
4864
+ function useProviderAuthSetup(options = {}) {
4865
+ const [codexAuthStatus, setCodexAuthStatus] = createSignal("idle");
4866
+ const [codexAccountEmail, setCodexAccountEmail] = createSignal("");
4867
+ const [codexAuthError, setCodexAuthError] = createSignal("");
4868
+ const [openRouterAuthStatus, setOpenRouterAuthStatus] = createSignal("idle");
4869
+ const [openRouterAuthError, setOpenRouterAuthError] = createSignal("");
4870
+ const markProviderConnected = (providerId, hasApiKey) => {
4871
+ setCodexAuthStatus(providerId === "openai_codex" && hasApiKey ? "connected" : "idle");
4872
+ setOpenRouterAuthStatus(providerId === "openrouter" && hasApiKey ? "connected" : "idle");
4873
+ };
4874
+ const startCodexAuth = async () => {
4875
+ setCodexAuthStatus("waiting");
4876
+ setCodexAuthError("");
4877
+ try {
4878
+ const result = await window.vessel.codex.startAuth();
4879
+ if (result.ok) {
4880
+ setCodexAccountEmail(result.accountEmail);
4881
+ setCodexAuthStatus("connected");
4882
+ await options.onCodexConnected?.();
4883
+ } else {
4884
+ setCodexAuthStatus("error");
4885
+ setCodexAuthError(result.error);
4886
+ }
4887
+ } catch (err) {
4888
+ setCodexAuthStatus("error");
4889
+ setCodexAuthError(err instanceof Error ? err.message : "Unknown error");
4890
+ }
4891
+ };
4892
+ const disconnectCodex = async () => {
4893
+ await window.vessel.codex.disconnect();
4894
+ setCodexAuthStatus("idle");
4895
+ setCodexAccountEmail("");
4896
+ await options.onCodexDisconnected?.();
4897
+ };
4898
+ const startOpenRouterAuth = async () => {
4899
+ setOpenRouterAuthStatus("waiting");
4900
+ setOpenRouterAuthError("");
4901
+ try {
4902
+ const result = await window.vessel.openrouter.startAuth();
4903
+ if (result.ok) {
4904
+ setOpenRouterAuthStatus("connected");
4905
+ await options.onOpenRouterConnected?.(result);
4906
+ } else {
4907
+ setOpenRouterAuthStatus("error");
4908
+ setOpenRouterAuthError(result.error);
4909
+ }
4910
+ } catch (err) {
4911
+ const message = err instanceof Error ? err.message : "Unknown error";
4912
+ setOpenRouterAuthStatus("error");
4913
+ setOpenRouterAuthError(message);
4914
+ }
4915
+ };
4916
+ onMount(() => {
4917
+ const unsubCodex = window.vessel.codex.onAuthStatus((payload) => {
4918
+ if (payload.status === "waiting") {
4919
+ setCodexAuthStatus("waiting");
4920
+ } else if (payload.status === "exchanging") {
4921
+ setCodexAuthStatus("exchanging");
4922
+ } else if (payload.status === "error") {
4923
+ setCodexAuthStatus("error");
4924
+ setCodexAuthError(payload.error || "Unknown error");
4925
+ }
4926
+ });
4927
+ const unsubOpenRouter = window.vessel.openrouter.onAuthStatus((payload) => {
4928
+ if (payload.status === "waiting") {
4929
+ setOpenRouterAuthStatus("waiting");
4930
+ } else if (payload.status === "exchanging") {
4931
+ setOpenRouterAuthStatus("exchanging");
4932
+ } else if (payload.status === "connected") {
4933
+ setOpenRouterAuthStatus("connected");
4934
+ } else if (payload.status === "error") {
4935
+ setOpenRouterAuthStatus("error");
4936
+ setOpenRouterAuthError(payload.error || "Unknown error");
4937
+ }
4938
+ });
4939
+ onCleanup(() => {
4940
+ unsubCodex();
4941
+ unsubOpenRouter();
4942
+ });
4943
+ });
4944
+ return {
4945
+ codexAuthStatus,
4946
+ codexAccountEmail,
4947
+ setCodexAccountEmail,
4948
+ codexAuthError,
4949
+ setCodexAuthError,
4950
+ openRouterAuthStatus,
4951
+ openRouterAuthError,
4952
+ markProviderConnected,
4953
+ startCodexAuth,
4954
+ disconnectCodex,
4955
+ startOpenRouterAuth
4956
+ };
4957
+ }
4958
+ var _tmpl$$f = /* @__PURE__ */ template(`<p class=command-bar-no-provider-error>`), _tmpl$2$f = /* @__PURE__ */ template(`<div class=command-bar-no-provider><p>Start with OpenRouter's free model router, or open Settings for more providers.</p><button class=command-bar-no-provider-btn></button><button class=command-bar-no-provider-link>More options`), _tmpl$3$e = /* @__PURE__ */ template(`<div class=command-bar-recent><span class=command-bar-recent-label>Recent</span><div class=command-bar-recent-list>`), _tmpl$4$e = /* @__PURE__ */ template(`<span>Try "summarize" or ask a question`), _tmpl$5$c = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=command-bar><form><div class=command-bar-icon><svg width=16 height=16 viewBox="0 0 16 16"><circle cx=8 cy=8 r=6 fill=none stroke=var(--accent-primary) stroke-width=1.5></circle><circle cx=6 cy=7 r=0.8 fill=var(--accent-primary)></circle><circle cx=10 cy=7 r=0.8 fill=var(--accent-primary)></circle><path d="M6 10c0.5 0.8 3.5 0.8 4 0"fill=none stroke=var(--accent-primary) stroke-width=0.8 stroke-linecap=round></path></svg></div><input class=command-bar-input type=text></form><div class=command-bar-hints><span><kbd>Enter</kbd> to ask</span><span><kbd>Esc</kbd> to close`), _tmpl$6$c = /* @__PURE__ */ template(`<button class=command-bar-recent-item type=button>`), _tmpl$7$a = /* @__PURE__ */ template(`<span>Set up a provider in Settings first`);
4794
4959
  const COMMAND_BAR_EXIT_MS = 200;
4795
4960
  const CommandBar = () => {
4796
4961
  const {
@@ -4810,8 +4975,18 @@ const CommandBar = () => {
4810
4975
  cancel
4811
4976
  } = useAI();
4812
4977
  const [input, setInput] = createSignal("");
4813
- const [settings] = createResource(() => commandBarOpen2(), async (open) => open ? window.vessel.settings.get() : null);
4978
+ let inputRef;
4979
+ const [settings, {
4980
+ refetch: refetchSettings
4981
+ }] = createResource(() => commandBarOpen2(), async (open) => open ? window.vessel.settings.get() : null);
4982
+ const providerAuth = useProviderAuthSetup({
4983
+ onOpenRouterConnected: async () => {
4984
+ await refetchSettings();
4985
+ setTimeout(() => inputRef?.focus(), 0);
4986
+ }
4987
+ });
4814
4988
  const hasProvider = () => settings()?.chatProvider !== null && settings()?.chatProvider !== void 0;
4989
+ const openRouterWorking = () => providerAuth.openRouterAuthStatus() === "waiting" || providerAuth.openRouterAuthStatus() === "exchanging";
4815
4990
  const handleSubmit = async (e) => {
4816
4991
  e.preventDefault();
4817
4992
  const val = input().trim();
@@ -4837,6 +5012,7 @@ const CommandBar = () => {
4837
5012
  }
4838
5013
  };
4839
5014
  const setRef = (el) => {
5015
+ inputRef = el;
4840
5016
  setTimeout(() => el.focus(), 0);
4841
5017
  };
4842
5018
  return createComponent(Show, {
@@ -4844,8 +5020,8 @@ const CommandBar = () => {
4844
5020
  return visible();
4845
5021
  },
4846
5022
  get children() {
4847
- var _el$ = _tmpl$4$e(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$10 = _el$3.nextSibling, _el$11 = _el$10.firstChild;
4848
- _el$11.nextSibling;
5023
+ var _el$ = _tmpl$5$c(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$12 = _el$3.nextSibling, _el$13 = _el$12.firstChild;
5024
+ _el$13.nextSibling;
4849
5025
  addEventListener(_el$, "click", closeCommandBar, true);
4850
5026
  _el$2.$$click = (e) => e.stopPropagation();
4851
5027
  _el$3.addEventListener("submit", handleSubmit);
@@ -4858,43 +5034,62 @@ const CommandBar = () => {
4858
5034
  return !hasProvider();
4859
5035
  },
4860
5036
  get children() {
4861
- var _el$6 = _tmpl$$f(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
4862
- _el$8.$$click = () => {
5037
+ var _el$6 = _tmpl$2$f(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling;
5038
+ _el$8.$$click = () => void providerAuth.startOpenRouterAuth();
5039
+ insert(_el$8, createComponent(Show, {
5040
+ get when() {
5041
+ return !openRouterWorking();
5042
+ },
5043
+ fallback: "Opening OpenRouter...",
5044
+ children: "Start free with OpenRouter"
5045
+ }));
5046
+ _el$9.$$click = () => {
4863
5047
  closeCommandBar();
4864
5048
  openSettings();
4865
5049
  };
5050
+ insert(_el$6, createComponent(Show, {
5051
+ get when() {
5052
+ return providerAuth.openRouterAuthStatus() === "error";
5053
+ },
5054
+ get children() {
5055
+ var _el$0 = _tmpl$$f();
5056
+ insert(_el$0, () => providerAuth.openRouterAuthError());
5057
+ return _el$0;
5058
+ }
5059
+ }), null);
5060
+ createRenderEffect(() => _el$8.disabled = openRouterWorking());
4866
5061
  return _el$6;
4867
5062
  }
4868
- }), _el$10);
5063
+ }), _el$12);
4869
5064
  insert(_el$2, createComponent(Show, {
4870
5065
  get when() {
4871
5066
  return memo(() => !!(hasProvider() && recentQueries2().length > 0))() && !input().trim();
4872
5067
  },
4873
5068
  get children() {
4874
- var _el$9 = _tmpl$2$f(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
4875
- insert(_el$1, createComponent(For, {
5069
+ var _el$1 = _tmpl$3$e(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
5070
+ insert(_el$11, createComponent(For, {
4876
5071
  get each() {
4877
5072
  return recentQueries2();
4878
5073
  },
4879
5074
  children: (q) => (() => {
4880
- var _el$14 = _tmpl$5$c();
4881
- _el$14.$$click = () => void handleRecentClick(q);
4882
- insert(_el$14, q);
4883
- return _el$14;
5075
+ var _el$16 = _tmpl$6$c();
5076
+ _el$16.$$click = () => void handleRecentClick(q);
5077
+ insert(_el$16, q);
5078
+ return _el$16;
4884
5079
  })()
4885
5080
  }));
4886
- return _el$9;
5081
+ return _el$1;
4887
5082
  }
4888
- }), _el$10);
4889
- insert(_el$10, createComponent(Show, {
5083
+ }), _el$12);
5084
+ insert(_el$12, createComponent(Show, {
4890
5085
  get when() {
4891
5086
  return hasProvider();
4892
5087
  },
4893
5088
  get fallback() {
4894
- return _tmpl$6$c();
5089
+ return _tmpl$7$a();
4895
5090
  },
4896
5091
  get children() {
4897
- return _tmpl$3$e();
5092
+ return _tmpl$4$e();
4898
5093
  }
4899
5094
  }), null);
4900
5095
  createRenderEffect((_p$) => {
@@ -6746,7 +6941,7 @@ function renderKitPrompt(kit, values) {
6746
6941
  (_, key) => values[key] ?? ""
6747
6942
  );
6748
6943
  }
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>`);
6944
+ 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$7 = /* @__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$2 = /* @__PURE__ */ template(`<div class=sched-context-menu><button class=sched-ctx-item type=button>Edit task</button><button class=sched-ctx-item type=button>Edit schedule</button><div class=sched-ctx-divider></div><button class=sched-ctx-item type=button></button><button class="sched-ctx-item sched-ctx-danger"type=button>Delete`), _tmpl$30$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>`);
6750
6945
  const ICON_MAP = {
6751
6946
  BookOpen: book_open_default,
6752
6947
  Tag: tag_default,
@@ -7206,7 +7401,7 @@ const AutomationTab = (props) => {
7206
7401
  return openMenuJobId() === job.id;
7207
7402
  },
7208
7403
  get children() {
7209
- var _el$94 = _tmpl$29$1(), _el$95 = _el$94.firstChild, _el$96 = _el$95.nextSibling, _el$97 = _el$96.nextSibling, _el$98 = _el$97.nextSibling, _el$99 = _el$98.nextSibling;
7404
+ var _el$94 = _tmpl$29$2(), _el$95 = _el$94.firstChild, _el$96 = _el$95.nextSibling, _el$97 = _el$96.nextSibling, _el$98 = _el$97.nextSibling, _el$99 = _el$98.nextSibling;
7210
7405
  _el$94.$$click = (e) => e.stopPropagation();
7211
7406
  _el$95.$$click = () => handleOpenEditTask(job);
7212
7407
  _el$96.$$click = () => handleOpenEditSchedule(job);
@@ -7309,7 +7504,7 @@ const AutomationTab = (props) => {
7309
7504
  },
7310
7505
  get children() {
7311
7506
  return [(() => {
7312
- var _el$23 = _tmpl$9$6(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
7507
+ var _el$23 = _tmpl$9$7(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
7313
7508
  _el$24.$$click = () => {
7314
7509
  setSelectedKit(null);
7315
7510
  setEditingTaskJobId(null);
@@ -7662,7 +7857,7 @@ function useResearch() {
7662
7857
  }
7663
7858
  };
7664
7859
  }
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`);
7860
+ 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$6 = /* @__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`);
7666
7861
  const ResearchBriefMarkdown = (props) => {
7667
7862
  const html2 = createMemo(() => renderMarkdown(props.content));
7668
7863
  return (() => {
@@ -8044,7 +8239,7 @@ const ResearchDesk = () => {
8044
8239
  return state().phase === "briefing";
8045
8240
  },
8046
8241
  get children() {
8047
- var _el$10 = _tmpl$9$5(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$18 = _el$13.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling;
8242
+ var _el$10 = _tmpl$9$6(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$18 = _el$13.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling;
8048
8243
  insert(_el$13, createComponent(Show, {
8049
8244
  get when() {
8050
8245
  return isBriefStarting();
@@ -8317,7 +8512,7 @@ const ResearchDesk = () => {
8317
8512
  })();
8318
8513
  };
8319
8514
  delegateEvents(["input", "keydown", "click"]);
8320
- var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=page-diff-history-list>`), _tmpl$6$9 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=page-diff-history-item><div class=page-diff-history-time><span class=page-diff-history-label></span><span></span></div><div class=page-diff-history-card><div class=page-diff-history-summary-list></div><div class=page-diff-history-position>Entry <!> of `), _tmpl$8$6 = /* @__PURE__ */ template(`<span class=page-diff-history-summary-section>`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=page-diff-history-summary-row><span class=page-diff-history-summary>`);
8515
+ var _tmpl$$b = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$b = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$a = /* @__PURE__ */ template(`<div class=page-diff-timeline-header><div class=agent-section-title>Change history for this page</div><div class=agent-muted>Newest detections are first. Each entry is a saved change burst.`), _tmpl$5$9 = /* @__PURE__ */ template(`<div class=page-diff-history-list>`), _tmpl$6$9 = /* @__PURE__ */ template(`<div class=page-diff-timeline>`), _tmpl$7$7 = /* @__PURE__ */ template(`<div class=page-diff-history-item><div class=page-diff-history-time><span class=page-diff-history-label></span><span></span></div><div class=page-diff-history-card><div class=page-diff-history-summary-list></div><div class=page-diff-history-position>Entry <!> of `), _tmpl$8$6 = /* @__PURE__ */ template(`<span class=page-diff-history-summary-section>`), _tmpl$9$5 = /* @__PURE__ */ template(`<div class=page-diff-history-summary-row><span class=page-diff-history-summary>`);
8321
8516
  const PageDiffTimeline = () => {
8322
8517
  const {
8323
8518
  activeTab
@@ -8420,7 +8615,7 @@ const PageDiffTimeline = () => {
8420
8615
  return parseDiffSummaryParts(burst.summary);
8421
8616
  },
8422
8617
  children: (part) => (() => {
8423
- var _el$15 = _tmpl$9$4(), _el$17 = _el$15.firstChild;
8618
+ var _el$15 = _tmpl$9$5(), _el$17 = _el$15.firstChild;
8424
8619
  insert(_el$15, createComponent(Show, {
8425
8620
  get when() {
8426
8621
  return part.section;
@@ -8448,7 +8643,7 @@ const PageDiffTimeline = () => {
8448
8643
  })();
8449
8644
  };
8450
8645
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
8451
- var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$8 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$21$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$22$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$23$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$25$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button><button class=sidebar-tab role=tab>Research<span class=sidebar-tab-beta>Beta</span></button></div><div class=sidebar-messages><div>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$53 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
8646
+ var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$8 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$4 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title>Load more history</span><span class=history-entry-url>Showing <!> of `), _tmpl$14$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$15$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$16$1 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$17$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$18$1 = /* @__PURE__ */ template(`<span>`), _tmpl$19$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$22$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$23$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$26$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$27$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button><button class=sidebar-tab role=tab>Research<span class=sidebar-tab-beta>Beta</span></button></div><div class=sidebar-messages><div>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$32 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$34 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$36 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$37 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$41 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$43 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$44 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$48 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$53 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$54 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$55 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$56 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$57 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$58 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$59 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$60 = /* @__PURE__ */ template(`<div>`), _tmpl$61 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$62 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`), _tmpl$64 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
8452
8647
  const UNSORTED_FOLDER = {
8453
8648
  id: "unsorted",
8454
8649
  name: "Unsorted",
@@ -8762,10 +8957,18 @@ ${contextBlock}` : contextBlock);
8762
8957
  value: folder.id,
8763
8958
  label: folder.name
8764
8959
  })));
8765
- const groupedBookmarks = createMemo(() => bookmarkFolders().map((folder) => ({
8766
- ...folder,
8767
- items: bookmarksState2().bookmarks.filter((bookmark) => bookmark.folderId === folder.id).sort((a, b) => b.savedAt.localeCompare(a.savedAt))
8768
- })));
8960
+ const groupedBookmarks = createMemo(() => {
8961
+ const byFolder = /* @__PURE__ */ new Map();
8962
+ for (const bookmark of bookmarksState2().bookmarks) {
8963
+ const items = byFolder.get(bookmark.folderId) ?? [];
8964
+ items.push(bookmark);
8965
+ byFolder.set(bookmark.folderId, items);
8966
+ }
8967
+ return bookmarkFolders().map((folder) => ({
8968
+ ...folder,
8969
+ items: (byFolder.get(folder.id) ?? []).slice().sort((a, b) => b.savedAt.localeCompare(a.savedAt))
8970
+ }));
8971
+ });
8769
8972
  const normalizedBookmarkSearch = createMemo(() => normalizeBookmarkSearchText(bookmarkSearchQuery()));
8770
8973
  const filteredGroupedBookmarks = createMemo(() => {
8771
8974
  const query2 = bookmarkSearchQuery().trim();
@@ -9063,9 +9266,9 @@ ${contextBlock}` : contextBlock);
9063
9266
  return props.forceOpen || sidebarOpen2();
9064
9267
  },
9065
9268
  get children() {
9066
- var _el$9 = _tmpl$29(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$10.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$1.nextSibling, _el$16 = _el$15.firstChild;
9269
+ var _el$9 = _tmpl$30(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$10.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$1.nextSibling, _el$16 = _el$15.firstChild;
9067
9270
  _el$16.firstChild;
9068
- var _el$19 = _el$16.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling, _el$23 = _el$22.nextSibling, _el$24 = _el$23.nextSibling, _el$25 = _el$24.nextSibling, _el$26 = _el$15.nextSibling, _el$125 = _el$26.firstChild;
9271
+ var _el$19 = _el$16.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling, _el$23 = _el$22.nextSibling, _el$24 = _el$23.nextSibling, _el$25 = _el$24.nextSibling, _el$26 = _el$15.nextSibling, _el$132 = _el$26.firstChild;
9069
9272
  _el$0.$$pointerdown = startResize;
9070
9273
  setAttribute(_el$11, "src", vesselLogo);
9071
9274
  addEventListener(_el$13, "click", clearHistory, true);
@@ -9132,7 +9335,7 @@ ${contextBlock}` : contextBlock);
9132
9335
  return runtimeState2().supervisor.pendingApprovals.length > 0;
9133
9336
  },
9134
9337
  get fallback() {
9135
- return _tmpl$30();
9338
+ return _tmpl$31();
9136
9339
  },
9137
9340
  get children() {
9138
9341
  return [_tmpl$5$8(), createComponent(For, {
@@ -9140,13 +9343,13 @@ ${contextBlock}` : contextBlock);
9140
9343
  return runtimeState2().supervisor.pendingApprovals;
9141
9344
  },
9142
9345
  children: (approval) => (() => {
9143
- var _el$143 = _tmpl$31(), _el$144 = _el$143.firstChild, _el$145 = _el$144.nextSibling, _el$146 = _el$145.nextSibling, _el$147 = _el$146.nextSibling, _el$148 = _el$147.nextSibling, _el$149 = _el$148.firstChild, _el$150 = _el$149.nextSibling;
9144
- insert(_el$145, () => approval.name);
9145
- insert(_el$146, () => approval.argsSummary);
9146
- insert(_el$147, () => approval.reason);
9147
- _el$149.$$click = () => void resolveApproval(approval.id, true);
9148
- _el$150.$$click = () => void resolveApproval(approval.id, false);
9149
- return _el$143;
9346
+ var _el$150 = _tmpl$32(), _el$151 = _el$150.firstChild, _el$152 = _el$151.nextSibling, _el$153 = _el$152.nextSibling, _el$154 = _el$153.nextSibling, _el$155 = _el$154.nextSibling, _el$156 = _el$155.firstChild, _el$157 = _el$156.nextSibling;
9347
+ insert(_el$152, () => approval.name);
9348
+ insert(_el$153, () => approval.argsSummary);
9349
+ insert(_el$154, () => approval.reason);
9350
+ _el$156.$$click = () => void resolveApproval(approval.id, true);
9351
+ _el$157.$$click = () => void resolveApproval(approval.id, false);
9352
+ return _el$150;
9150
9353
  })()
9151
9354
  })];
9152
9355
  }
@@ -9170,7 +9373,7 @@ ${contextBlock}` : contextBlock);
9170
9373
  return recentActions().length > 0;
9171
9374
  },
9172
9375
  get fallback() {
9173
- return _tmpl$32();
9376
+ return _tmpl$33();
9174
9377
  },
9175
9378
  get children() {
9176
9379
  return createComponent(Show, {
@@ -9178,7 +9381,7 @@ ${contextBlock}` : contextBlock);
9178
9381
  return actionsExpanded();
9179
9382
  },
9180
9383
  get fallback() {
9181
- return _tmpl$33();
9384
+ return _tmpl$34();
9182
9385
  },
9183
9386
  get children() {
9184
9387
  return createComponent(For, {
@@ -9186,32 +9389,32 @@ ${contextBlock}` : contextBlock);
9186
9389
  return recentActions();
9187
9390
  },
9188
9391
  children: (action) => (() => {
9189
- var _el$153 = _tmpl$36(), _el$154 = _el$153.firstChild, _el$155 = _el$154.firstChild, _el$156 = _el$155.nextSibling, _el$157 = _el$154.nextSibling;
9190
- insert(_el$155, () => action.name);
9191
- insert(_el$156, () => action.status);
9192
- insert(_el$157, () => action.argsSummary);
9193
- insert(_el$153, createComponent(Show, {
9392
+ var _el$160 = _tmpl$37(), _el$161 = _el$160.firstChild, _el$162 = _el$161.firstChild, _el$163 = _el$162.nextSibling, _el$164 = _el$161.nextSibling;
9393
+ insert(_el$162, () => action.name);
9394
+ insert(_el$163, () => action.status);
9395
+ insert(_el$164, () => action.argsSummary);
9396
+ insert(_el$160, createComponent(Show, {
9194
9397
  get when() {
9195
9398
  return action.resultSummary;
9196
9399
  },
9197
9400
  get children() {
9198
- var _el$158 = _tmpl$34();
9199
- insert(_el$158, () => action.resultSummary);
9200
- return _el$158;
9401
+ var _el$165 = _tmpl$35();
9402
+ insert(_el$165, () => action.resultSummary);
9403
+ return _el$165;
9201
9404
  }
9202
9405
  }), null);
9203
- insert(_el$153, createComponent(Show, {
9406
+ insert(_el$160, createComponent(Show, {
9204
9407
  get when() {
9205
9408
  return action.error;
9206
9409
  },
9207
9410
  get children() {
9208
- var _el$159 = _tmpl$35();
9209
- insert(_el$159, () => action.error);
9210
- return _el$159;
9411
+ var _el$166 = _tmpl$36();
9412
+ insert(_el$166, () => action.error);
9413
+ return _el$166;
9211
9414
  }
9212
9415
  }), null);
9213
- createRenderEffect(() => className(_el$156, `agent-action-status ${action.status}`));
9214
- return _el$153;
9416
+ createRenderEffect(() => className(_el$163, `agent-action-status ${action.status}`));
9417
+ return _el$160;
9215
9418
  })()
9216
9419
  });
9217
9420
  }
@@ -9221,7 +9424,7 @@ ${contextBlock}` : contextBlock);
9221
9424
  createRenderEffect(() => _el$32.classList.toggle("paused", !!runtimeState2().supervisor.paused));
9222
9425
  return _el$27;
9223
9426
  }
9224
- }), _el$125);
9427
+ }), _el$132);
9225
9428
  insert(_el$26, createComponent(Show, {
9226
9429
  get when() {
9227
9430
  return sidebarTab() === "bookmarks";
@@ -9249,7 +9452,7 @@ ${contextBlock}` : contextBlock);
9249
9452
  return bookmarkExportMessage();
9250
9453
  },
9251
9454
  get children() {
9252
- var _el$55 = _tmpl$9$3();
9455
+ var _el$55 = _tmpl$9$4();
9253
9456
  insert(_el$55, bookmarkExportMessage);
9254
9457
  return _el$55;
9255
9458
  }
@@ -9268,7 +9471,7 @@ ${contextBlock}` : contextBlock);
9268
9471
  return bookmarkImportMessage();
9269
9472
  },
9270
9473
  get children() {
9271
- var _el$64 = _tmpl$9$3();
9474
+ var _el$64 = _tmpl$9$4();
9272
9475
  insert(_el$64, bookmarkImportMessage);
9273
9476
  return _el$64;
9274
9477
  }
@@ -9329,12 +9532,12 @@ ${contextBlock}` : contextBlock);
9329
9532
  },
9330
9533
  get fallback() {
9331
9534
  return (() => {
9332
- var _el$160 = _tmpl$37();
9333
- insert(_el$160, (() => {
9535
+ var _el$167 = _tmpl$38();
9536
+ insert(_el$167, (() => {
9334
9537
  var _c$5 = memo(() => !!normalizedBookmarkSearch());
9335
9538
  return () => _c$5() ? `No bookmarks matched "${bookmarkSearchQuery().trim()}".` : "No bookmarks saved yet.";
9336
9539
  })());
9337
- return _el$160;
9540
+ return _el$167;
9338
9541
  })();
9339
9542
  },
9340
9543
  get children() {
@@ -9343,105 +9546,105 @@ ${contextBlock}` : contextBlock);
9343
9546
  return filteredGroupedBookmarks();
9344
9547
  },
9345
9548
  children: (folder) => (() => {
9346
- var _el$161 = _tmpl$44(), _el$162 = _el$161.firstChild, _el$163 = _el$162.firstChild, _el$164 = _el$163.firstChild, _el$165 = _el$164.nextSibling, _el$166 = _el$165.firstChild, _el$167 = _el$166.nextSibling, _el$168 = _el$167.firstChild;
9347
- _el$162.$$keydown = (e) => {
9549
+ var _el$168 = _tmpl$45(), _el$169 = _el$168.firstChild, _el$170 = _el$169.firstChild, _el$171 = _el$170.firstChild, _el$172 = _el$171.nextSibling, _el$173 = _el$172.firstChild, _el$174 = _el$173.nextSibling, _el$175 = _el$174.firstChild;
9550
+ _el$169.$$keydown = (e) => {
9348
9551
  if (e.key === "Enter" || e.key === " ") {
9349
9552
  e.preventDefault();
9350
9553
  toggleFolderExpanded(folder.id);
9351
9554
  }
9352
9555
  };
9353
- _el$162.$$click = () => toggleFolderExpanded(folder.id);
9354
- insert(_el$166, () => folder.name);
9355
- insert(_el$167, () => folder.items.length, _el$168);
9356
- insert(_el$165, createComponent(Show, {
9556
+ _el$169.$$click = () => toggleFolderExpanded(folder.id);
9557
+ insert(_el$173, () => folder.name);
9558
+ insert(_el$174, () => folder.items.length, _el$175);
9559
+ insert(_el$172, createComponent(Show, {
9357
9560
  get when() {
9358
9561
  return folder.summary;
9359
9562
  },
9360
9563
  get children() {
9361
- var _el$169 = _tmpl$38();
9362
- insert(_el$169, () => folder.summary);
9363
- return _el$169;
9564
+ var _el$176 = _tmpl$39();
9565
+ insert(_el$176, () => folder.summary);
9566
+ return _el$176;
9364
9567
  }
9365
9568
  }), null);
9366
- insert(_el$162, createComponent(Show, {
9569
+ insert(_el$169, createComponent(Show, {
9367
9570
  get when() {
9368
9571
  return folder.id !== UNSORTED_FOLDER.id;
9369
9572
  },
9370
9573
  get children() {
9371
- var _el$170 = _tmpl$39(), _el$171 = _el$170.firstChild, _el$172 = _el$171.nextSibling, _el$173 = _el$172.nextSibling;
9372
- _el$171.$$click = (e) => {
9574
+ var _el$177 = _tmpl$40(), _el$178 = _el$177.firstChild, _el$179 = _el$178.nextSibling, _el$180 = _el$179.nextSibling;
9575
+ _el$178.$$click = (e) => {
9373
9576
  e.stopPropagation();
9374
9577
  setEditingFolderId(folder.id);
9375
9578
  setEditingFolderName(folder.name);
9376
9579
  setEditingFolderSummary(folder.summary || "");
9377
9580
  };
9378
- _el$172.$$click = (e) => {
9581
+ _el$179.$$click = (e) => {
9379
9582
  e.stopPropagation();
9380
9583
  void handleExportFolder(folder.id, folder.name);
9381
9584
  };
9382
- _el$173.$$click = (e) => {
9585
+ _el$180.$$click = (e) => {
9383
9586
  e.stopPropagation();
9384
9587
  setDeletingFolderId(folder.id);
9385
9588
  };
9386
- createRenderEffect(() => _el$172.disabled = bookmarkExporting());
9387
- return _el$170;
9589
+ createRenderEffect(() => _el$179.disabled = bookmarkExporting());
9590
+ return _el$177;
9388
9591
  }
9389
9592
  }), null);
9390
- insert(_el$161, createComponent(Show, {
9593
+ insert(_el$168, createComponent(Show, {
9391
9594
  get when() {
9392
9595
  return deletingFolderId() === folder.id;
9393
9596
  },
9394
9597
  get children() {
9395
- var _el$174 = _tmpl$41(), _el$175 = _el$174.firstChild, _el$176 = _el$175.firstChild, _el$178 = _el$176.nextSibling;
9396
- _el$178.nextSibling;
9397
- var _el$179 = _el$175.nextSibling, _el$181 = _el$179.firstChild, _el$182 = _el$181.nextSibling;
9398
- insert(_el$175, () => folder.name, _el$178);
9399
- insert(_el$175, (() => {
9598
+ var _el$181 = _tmpl$42(), _el$182 = _el$181.firstChild, _el$183 = _el$182.firstChild, _el$185 = _el$183.nextSibling;
9599
+ _el$185.nextSibling;
9600
+ var _el$186 = _el$182.nextSibling, _el$188 = _el$186.firstChild, _el$189 = _el$188.nextSibling;
9601
+ insert(_el$182, () => folder.name, _el$185);
9602
+ insert(_el$182, (() => {
9400
9603
  var _c$6 = memo(() => folder.items.length > 0);
9401
9604
  return () => _c$6() ? ` This folder has ${folder.items.length} bookmark${folder.items.length === 1 ? "" : "s"}.` : "";
9402
9605
  })(), null);
9403
- insert(_el$179, createComponent(Show, {
9606
+ insert(_el$186, createComponent(Show, {
9404
9607
  get when() {
9405
9608
  return folder.items.length > 0;
9406
9609
  },
9407
9610
  get children() {
9408
- var _el$180 = _tmpl$40();
9409
- _el$180.$$click = () => void handleRemoveFolder(folder.id, false);
9410
- return _el$180;
9611
+ var _el$187 = _tmpl$41();
9612
+ _el$187.$$click = () => void handleRemoveFolder(folder.id, false);
9613
+ return _el$187;
9411
9614
  }
9412
- }), _el$181);
9413
- _el$181.$$click = () => void handleRemoveFolder(folder.id, true);
9414
- insert(_el$181, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
9415
- _el$182.$$click = () => setDeletingFolderId(null);
9416
- return _el$174;
9615
+ }), _el$188);
9616
+ _el$188.$$click = () => void handleRemoveFolder(folder.id, true);
9617
+ insert(_el$188, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
9618
+ _el$189.$$click = () => setDeletingFolderId(null);
9619
+ return _el$181;
9417
9620
  }
9418
9621
  }), null);
9419
- insert(_el$161, createComponent(Show, {
9622
+ insert(_el$168, createComponent(Show, {
9420
9623
  get when() {
9421
9624
  return editingFolderId() === folder.id;
9422
9625
  },
9423
9626
  get children() {
9424
- var _el$183 = _tmpl$42(), _el$184 = _el$183.firstChild, _el$185 = _el$184.firstChild, _el$186 = _el$185.nextSibling, _el$187 = _el$184.nextSibling, _el$188 = _el$187.nextSibling;
9425
- _el$185.$$input = (e) => setEditingFolderName(e.currentTarget.value);
9426
- _el$186.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
9427
- _el$187.$$click = () => void handleRenameFolder(folder.id);
9428
- _el$188.$$click = () => {
9627
+ var _el$190 = _tmpl$43(), _el$191 = _el$190.firstChild, _el$192 = _el$191.firstChild, _el$193 = _el$192.nextSibling, _el$194 = _el$191.nextSibling, _el$195 = _el$194.nextSibling;
9628
+ _el$192.$$input = (e) => setEditingFolderName(e.currentTarget.value);
9629
+ _el$193.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
9630
+ _el$194.$$click = () => void handleRenameFolder(folder.id);
9631
+ _el$195.$$click = () => {
9429
9632
  setEditingFolderId(null);
9430
9633
  setEditingFolderName("");
9431
9634
  setEditingFolderSummary("");
9432
9635
  };
9433
- createRenderEffect(() => _el$187.disabled = !editingFolderName().trim());
9434
- createRenderEffect(() => _el$185.value = editingFolderName());
9435
- createRenderEffect(() => _el$186.value = editingFolderSummary());
9436
- return _el$183;
9636
+ createRenderEffect(() => _el$194.disabled = !editingFolderName().trim());
9637
+ createRenderEffect(() => _el$192.value = editingFolderName());
9638
+ createRenderEffect(() => _el$193.value = editingFolderSummary());
9639
+ return _el$190;
9437
9640
  }
9438
9641
  }), null);
9439
- insert(_el$161, createComponent(Show, {
9642
+ insert(_el$168, createComponent(Show, {
9440
9643
  get when() {
9441
9644
  return isFolderExpanded(folder.id);
9442
9645
  },
9443
9646
  get fallback() {
9444
- return _tmpl$45();
9647
+ return _tmpl$46();
9445
9648
  },
9446
9649
  get children() {
9447
9650
  return createComponent(Show, {
@@ -9449,125 +9652,125 @@ ${contextBlock}` : contextBlock);
9449
9652
  return folder.items.length > 0;
9450
9653
  },
9451
9654
  get fallback() {
9452
- return _tmpl$46();
9655
+ return _tmpl$47();
9453
9656
  },
9454
9657
  get children() {
9455
- var _el$189 = _tmpl$43();
9456
- insert(_el$189, createComponent(For, {
9658
+ var _el$196 = _tmpl$44();
9659
+ insert(_el$196, createComponent(For, {
9457
9660
  get each() {
9458
9661
  return folder.items;
9459
9662
  },
9460
9663
  children: (bookmark) => (() => {
9461
- var _el$192 = _tmpl$53(), _el$193 = _el$192.firstChild, _el$194 = _el$193.firstChild, _el$195 = _el$194.nextSibling, _el$220 = _el$193.nextSibling, _el$221 = _el$220.firstChild, _el$222 = _el$221.nextSibling, _el$223 = _el$222.nextSibling;
9462
- _el$193.$$click = () => void createTab(bookmark.url);
9463
- insert(_el$194, () => bookmark.title || bookmark.url);
9464
- insert(_el$195, () => bookmark.url);
9465
- insert(_el$192, createComponent(Show, {
9664
+ var _el$199 = _tmpl$54(), _el$200 = _el$199.firstChild, _el$201 = _el$200.firstChild, _el$202 = _el$201.nextSibling, _el$227 = _el$200.nextSibling, _el$228 = _el$227.firstChild, _el$229 = _el$228.nextSibling, _el$230 = _el$229.nextSibling;
9665
+ _el$200.$$click = () => void createTab(bookmark.url);
9666
+ insert(_el$201, () => bookmark.title || bookmark.url);
9667
+ insert(_el$202, () => bookmark.url);
9668
+ insert(_el$199, createComponent(Show, {
9466
9669
  get when() {
9467
9670
  return bookmark.note;
9468
9671
  },
9469
9672
  get children() {
9470
- var _el$196 = _tmpl$47();
9471
- insert(_el$196, () => bookmark.note);
9472
- return _el$196;
9673
+ var _el$203 = _tmpl$48();
9674
+ insert(_el$203, () => bookmark.note);
9675
+ return _el$203;
9473
9676
  }
9474
- }), _el$220);
9475
- insert(_el$192, createComponent(Show, {
9677
+ }), _el$227);
9678
+ insert(_el$199, createComponent(Show, {
9476
9679
  get when() {
9477
9680
  return bookmark.intent || bookmark.expectedContent || (bookmark.keyFields?.length || 0) > 0 || (bookmark.agentHints && Object.keys(bookmark.agentHints).length || 0) > 0;
9478
9681
  },
9479
9682
  get children() {
9480
- var _el$197 = _tmpl$47();
9481
- insert(_el$197, createComponent(Show, {
9683
+ var _el$204 = _tmpl$48();
9684
+ insert(_el$204, createComponent(Show, {
9482
9685
  get when() {
9483
9686
  return bookmark.intent;
9484
9687
  },
9485
9688
  get children() {
9486
- var _el$198 = _tmpl$48(), _el$199 = _el$198.firstChild;
9487
- _el$199.nextSibling;
9488
- insert(_el$198, () => bookmark.intent, null);
9489
- return _el$198;
9689
+ var _el$205 = _tmpl$49(), _el$206 = _el$205.firstChild;
9690
+ _el$206.nextSibling;
9691
+ insert(_el$205, () => bookmark.intent, null);
9692
+ return _el$205;
9490
9693
  }
9491
9694
  }), null);
9492
- insert(_el$197, createComponent(Show, {
9695
+ insert(_el$204, createComponent(Show, {
9493
9696
  get when() {
9494
9697
  return bookmark.expectedContent;
9495
9698
  },
9496
9699
  get children() {
9497
- var _el$201 = _tmpl$49(), _el$202 = _el$201.firstChild;
9498
- _el$202.nextSibling;
9499
- insert(_el$201, () => bookmark.expectedContent, null);
9500
- return _el$201;
9700
+ var _el$208 = _tmpl$50(), _el$209 = _el$208.firstChild;
9701
+ _el$209.nextSibling;
9702
+ insert(_el$208, () => bookmark.expectedContent, null);
9703
+ return _el$208;
9501
9704
  }
9502
9705
  }), null);
9503
- insert(_el$197, createComponent(Show, {
9706
+ insert(_el$204, createComponent(Show, {
9504
9707
  get when() {
9505
9708
  return (bookmark.keyFields?.length || 0) > 0;
9506
9709
  },
9507
9710
  get children() {
9508
- var _el$204 = _tmpl$50(), _el$205 = _el$204.firstChild;
9509
- _el$205.nextSibling;
9510
- insert(_el$204, () => bookmark.keyFields?.join(", "), null);
9511
- return _el$204;
9711
+ var _el$211 = _tmpl$51(), _el$212 = _el$211.firstChild;
9712
+ _el$212.nextSibling;
9713
+ insert(_el$211, () => bookmark.keyFields?.join(", "), null);
9714
+ return _el$211;
9512
9715
  }
9513
9716
  }), null);
9514
- insert(_el$197, createComponent(Show, {
9717
+ insert(_el$204, createComponent(Show, {
9515
9718
  get when() {
9516
9719
  return memo(() => !!bookmark.agentHints)() && Object.keys(bookmark.agentHints).length > 0;
9517
9720
  },
9518
9721
  get children() {
9519
- var _el$207 = _tmpl$51(), _el$208 = _el$207.firstChild;
9520
- _el$208.nextSibling;
9521
- insert(_el$207, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
9522
- return _el$207;
9722
+ var _el$214 = _tmpl$52(), _el$215 = _el$214.firstChild;
9723
+ _el$215.nextSibling;
9724
+ insert(_el$214, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
9725
+ return _el$214;
9523
9726
  }
9524
9727
  }), null);
9525
- return _el$197;
9728
+ return _el$204;
9526
9729
  }
9527
- }), _el$220);
9528
- insert(_el$192, createComponent(Show, {
9730
+ }), _el$227);
9731
+ insert(_el$199, createComponent(Show, {
9529
9732
  get when() {
9530
9733
  return editingBookmarkId() === bookmark.id;
9531
9734
  },
9532
9735
  get children() {
9533
- var _el$210 = _tmpl$52(), _el$211 = _el$210.firstChild, _el$212 = _el$211.nextSibling, _el$213 = _el$212.nextSibling, _el$214 = _el$213.nextSibling, _el$215 = _el$214.nextSibling, _el$216 = _el$215.nextSibling, _el$217 = _el$216.nextSibling, _el$218 = _el$217.firstChild, _el$219 = _el$218.nextSibling;
9534
- _el$211.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
9535
- _el$212.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
9536
- _el$213.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
9537
- _el$214.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
9538
- _el$215.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
9539
- _el$216.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
9540
- _el$218.$$click = () => void handleUpdateBookmark(bookmark.id);
9541
- _el$219.$$click = resetBookmarkEditor;
9542
- createRenderEffect(() => _el$211.value = editingBookmarkTitle());
9543
- createRenderEffect(() => _el$212.value = editingBookmarkNote());
9544
- createRenderEffect(() => _el$213.value = editingBookmarkIntent());
9545
- createRenderEffect(() => _el$214.value = editingBookmarkExpectedContent());
9546
- createRenderEffect(() => _el$215.value = editingBookmarkKeyFields());
9547
- createRenderEffect(() => _el$216.value = editingBookmarkAgentHints());
9548
- return _el$210;
9736
+ var _el$217 = _tmpl$53(), _el$218 = _el$217.firstChild, _el$219 = _el$218.nextSibling, _el$220 = _el$219.nextSibling, _el$221 = _el$220.nextSibling, _el$222 = _el$221.nextSibling, _el$223 = _el$222.nextSibling, _el$224 = _el$223.nextSibling, _el$225 = _el$224.firstChild, _el$226 = _el$225.nextSibling;
9737
+ _el$218.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
9738
+ _el$219.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
9739
+ _el$220.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
9740
+ _el$221.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
9741
+ _el$222.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
9742
+ _el$223.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
9743
+ _el$225.$$click = () => void handleUpdateBookmark(bookmark.id);
9744
+ _el$226.$$click = resetBookmarkEditor;
9745
+ createRenderEffect(() => _el$218.value = editingBookmarkTitle());
9746
+ createRenderEffect(() => _el$219.value = editingBookmarkNote());
9747
+ createRenderEffect(() => _el$220.value = editingBookmarkIntent());
9748
+ createRenderEffect(() => _el$221.value = editingBookmarkExpectedContent());
9749
+ createRenderEffect(() => _el$222.value = editingBookmarkKeyFields());
9750
+ createRenderEffect(() => _el$223.value = editingBookmarkAgentHints());
9751
+ return _el$217;
9549
9752
  }
9550
- }), _el$220);
9551
- insert(_el$221, () => formatBookmarkDate(bookmark.savedAt));
9552
- _el$222.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
9553
- insert(_el$222, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
9554
- _el$223.$$click = () => {
9753
+ }), _el$227);
9754
+ insert(_el$228, () => formatBookmarkDate(bookmark.savedAt));
9755
+ _el$229.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
9756
+ insert(_el$229, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
9757
+ _el$230.$$click = () => {
9555
9758
  if (editingBookmarkId() === bookmark.id) {
9556
9759
  resetBookmarkEditor();
9557
9760
  }
9558
9761
  void removeBookmark(bookmark.id);
9559
9762
  };
9560
- createRenderEffect(() => setAttribute(_el$192, "data-bookmark-id", bookmark.id));
9561
- return _el$192;
9763
+ createRenderEffect(() => setAttribute(_el$199, "data-bookmark-id", bookmark.id));
9764
+ return _el$199;
9562
9765
  })()
9563
9766
  }));
9564
- return _el$189;
9767
+ return _el$196;
9565
9768
  }
9566
9769
  });
9567
9770
  }
9568
9771
  }), null);
9569
- createRenderEffect(() => _el$164.classList.toggle("expanded", !!isFolderExpanded(folder.id)));
9570
- return _el$161;
9772
+ createRenderEffect(() => _el$171.classList.toggle("expanded", !!isFolderExpanded(folder.id)));
9773
+ return _el$168;
9571
9774
  })()
9572
9775
  });
9573
9776
  }
@@ -9594,7 +9797,7 @@ ${contextBlock}` : contextBlock);
9594
9797
  createRenderEffect(() => _el$82.value = newFolderSummary());
9595
9798
  return _el$42;
9596
9799
  }
9597
- }), _el$125);
9800
+ }), _el$132);
9598
9801
  insert(_el$26, createComponent(Show, {
9599
9802
  get when() {
9600
9803
  return sidebarTab() === "checkpoints";
@@ -9619,7 +9822,7 @@ ${contextBlock}` : contextBlock);
9619
9822
  return recentCheckpoints().length > 0;
9620
9823
  },
9621
9824
  get fallback() {
9622
- return _tmpl$54();
9825
+ return _tmpl$55();
9623
9826
  },
9624
9827
  get children() {
9625
9828
  var _el$96 = _tmpl$11$3();
@@ -9628,22 +9831,22 @@ ${contextBlock}` : contextBlock);
9628
9831
  return recentCheckpoints();
9629
9832
  },
9630
9833
  children: (checkpoint, i) => (() => {
9631
- var _el$225 = _tmpl$56(), _el$226 = _el$225.firstChild, _el$227 = _el$226.firstChild, _el$229 = _el$226.nextSibling, _el$230 = _el$229.firstChild, _el$231 = _el$230.nextSibling, _el$232 = _el$231.nextSibling, _el$233 = _el$232.nextSibling;
9632
- insert(_el$226, createComponent(Show, {
9834
+ var _el$232 = _tmpl$57(), _el$233 = _el$232.firstChild, _el$234 = _el$233.firstChild, _el$236 = _el$233.nextSibling, _el$237 = _el$236.firstChild, _el$238 = _el$237.nextSibling, _el$239 = _el$238.nextSibling, _el$240 = _el$239.nextSibling;
9835
+ insert(_el$233, createComponent(Show, {
9633
9836
  get when() {
9634
9837
  return i() < recentCheckpoints().length - 1;
9635
9838
  },
9636
9839
  get children() {
9637
- return _tmpl$55();
9840
+ return _tmpl$56();
9638
9841
  }
9639
9842
  }), null);
9640
- insert(_el$230, () => checkpoint.name);
9641
- insert(_el$231, () => new Date(checkpoint.createdAt).toLocaleString());
9642
- _el$232.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
9643
- _el$233.$$click = () => void restoreCheckpoint(checkpoint.id);
9644
- createRenderEffect(() => _el$227.classList.toggle("latest", !!(i() === 0)));
9645
- createRenderEffect(() => _el$232.value = checkpoint.note || "");
9646
- return _el$225;
9843
+ insert(_el$237, () => checkpoint.name);
9844
+ insert(_el$238, () => new Date(checkpoint.createdAt).toLocaleString());
9845
+ _el$239.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
9846
+ _el$240.$$click = () => void restoreCheckpoint(checkpoint.id);
9847
+ createRenderEffect(() => _el$234.classList.toggle("latest", !!(i() === 0)));
9848
+ createRenderEffect(() => _el$239.value = checkpoint.note || "");
9849
+ return _el$232;
9647
9850
  })()
9648
9851
  }));
9649
9852
  return _el$96;
@@ -9653,7 +9856,7 @@ ${contextBlock}` : contextBlock);
9653
9856
  createRenderEffect(() => _el$93.value = checkpointNote());
9654
9857
  return _el$85;
9655
9858
  }
9656
- }), _el$125);
9859
+ }), _el$132);
9657
9860
  insert(_el$26, createComponent(Show, {
9658
9861
  get when() {
9659
9862
  return sidebarTab() === "automation";
@@ -9663,7 +9866,7 @@ ${contextBlock}` : contextBlock);
9663
9866
  onRun: () => setSidebarTab("supervisor")
9664
9867
  });
9665
9868
  }
9666
- }), _el$125);
9869
+ }), _el$132);
9667
9870
  insert(_el$26, createComponent(Show, {
9668
9871
  get when() {
9669
9872
  return sidebarTab() === "research";
@@ -9671,13 +9874,13 @@ ${contextBlock}` : contextBlock);
9671
9874
  get children() {
9672
9875
  return createComponent(ResearchDesk, {});
9673
9876
  }
9674
- }), _el$125);
9877
+ }), _el$132);
9675
9878
  insert(_el$26, createComponent(Show, {
9676
9879
  get when() {
9677
9880
  return sidebarTab() === "history";
9678
9881
  },
9679
9882
  get children() {
9680
- var _el$97 = _tmpl$14$2(), _el$98 = _el$97.firstChild, _el$99 = _el$98.firstChild, _el$100 = _el$99.nextSibling, _el$101 = _el$100.firstChild, _el$102 = _el$101.nextSibling, _el$103 = _el$102.nextSibling, _el$104 = _el$103.nextSibling, _el$105 = _el$98.nextSibling;
9883
+ var _el$97 = _tmpl$15$2(), _el$98 = _el$97.firstChild, _el$99 = _el$98.firstChild, _el$100 = _el$99.nextSibling, _el$101 = _el$100.firstChild, _el$102 = _el$101.nextSibling, _el$103 = _el$102.nextSibling, _el$104 = _el$103.nextSibling, _el$105 = _el$98.nextSibling;
9681
9884
  _el$101.$$click = async () => {
9682
9885
  await history.clear();
9683
9886
  };
@@ -9698,52 +9901,65 @@ ${contextBlock}` : contextBlock);
9698
9901
  return history.historyState().entries;
9699
9902
  },
9700
9903
  children: (entry) => (() => {
9701
- var _el$234 = _tmpl$57(), _el$235 = _el$234.firstChild, _el$236 = _el$235.nextSibling, _el$237 = _el$236.nextSibling;
9702
- _el$234.$$click = () => createTab(entry.url);
9703
- insert(_el$235, () => entry.title || entry.url);
9704
- insert(_el$236, () => entry.url);
9705
- insert(_el$237, () => new Date(entry.visitedAt).toLocaleString());
9706
- return _el$234;
9904
+ var _el$241 = _tmpl$58(), _el$242 = _el$241.firstChild, _el$243 = _el$242.nextSibling, _el$244 = _el$243.nextSibling;
9905
+ _el$241.$$click = () => createTab(entry.url);
9906
+ insert(_el$242, () => entry.title || entry.url);
9907
+ insert(_el$243, () => entry.url);
9908
+ insert(_el$244, () => new Date(entry.visitedAt).toLocaleString());
9909
+ return _el$241;
9707
9910
  })()
9708
9911
  }), null);
9912
+ insert(_el$105, createComponent(Show, {
9913
+ get when() {
9914
+ return history.hasMore();
9915
+ },
9916
+ get children() {
9917
+ var _el$106 = _tmpl$13$2(), _el$107 = _el$106.firstChild, _el$108 = _el$107.nextSibling, _el$109 = _el$108.firstChild, _el$112 = _el$109.nextSibling;
9918
+ _el$112.nextSibling;
9919
+ _el$106.$$click = () => void history.loadMore();
9920
+ insert(_el$108, () => history.historyState().entries.length, _el$112);
9921
+ insert(_el$108, () => history.historyTotal(), null);
9922
+ return _el$106;
9923
+ }
9924
+ }), null);
9709
9925
  insert(_el$105, createComponent(Show, {
9710
9926
  get when() {
9711
9927
  return history.historyState().entries.length === 0;
9712
9928
  },
9713
9929
  get children() {
9714
- return _tmpl$13$2();
9930
+ return _tmpl$14$2();
9715
9931
  }
9716
9932
  }), null);
9717
9933
  return _el$97;
9718
9934
  }
9719
- }), _el$125);
9935
+ }), _el$132);
9720
9936
  insert(_el$26, createComponent(Show, {
9721
9937
  get when() {
9722
9938
  return sidebarTab() === "diff";
9723
9939
  },
9724
9940
  get children() {
9725
- var _el$107 = _tmpl$15$2(), _el$108 = _el$107.firstChild, _el$109 = _el$108.firstChild, _el$110 = _el$109.nextSibling;
9726
- insert(_el$110, () => isPremium() ? "Page change timeline" : "Premium feature");
9727
- insert(_el$107, createComponent(Show, {
9941
+ var _el$114 = _tmpl$16$1(), _el$115 = _el$114.firstChild, _el$116 = _el$115.firstChild, _el$117 = _el$116.nextSibling;
9942
+ insert(_el$117, () => isPremium() ? "Page change timeline" : "Premium feature");
9943
+ insert(_el$114, createComponent(Show, {
9728
9944
  get when() {
9729
9945
  return isPremium();
9730
9946
  },
9731
9947
  get fallback() {
9732
9948
  return (() => {
9733
- var _el$238 = _tmpl$58(), _el$239 = _el$238.firstChild, _el$240 = _el$239.nextSibling, _el$241 = _el$240.nextSibling, _el$242 = _el$241.firstChild, _el$243 = _el$242.nextSibling;
9734
- _el$242.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
9949
+ var _el$245 = _tmpl$59(), _el$246 = _el$245.firstChild, _el$247 = _el$246.nextSibling, _el$248 = _el$247.nextSibling, _el$249 = _el$248.firstChild, _el$250 = _el$249.nextSibling;
9950
+ _el$249.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
9735
9951
  });
9736
- _el$243.$$click = openPremiumDetails;
9737
- return _el$238;
9952
+ _el$250.$$click = openPremiumDetails;
9953
+ return _el$245;
9738
9954
  })();
9739
9955
  },
9740
9956
  get children() {
9741
9957
  return createComponent(PageDiffTimeline, {});
9742
9958
  }
9743
9959
  }), null);
9744
- return _el$107;
9960
+ return _el$114;
9745
9961
  }
9746
- }), _el$125);
9962
+ }), _el$132);
9747
9963
  insert(_el$26, createComponent(Show, {
9748
9964
  get when() {
9749
9965
  return sidebarTab() === "chat";
@@ -9754,23 +9970,23 @@ ${contextBlock}` : contextBlock);
9754
9970
  return !isPremium();
9755
9971
  },
9756
9972
  get children() {
9757
- var _el$111 = _tmpl$16$1(), _el$112 = _el$111.firstChild, _el$113 = _el$112.nextSibling, _el$114 = _el$113.nextSibling, _el$115 = _el$114.firstChild, _el$116 = _el$115.nextSibling;
9758
- _el$115.$$click = () => openPremiumCheckout("chat_banner_clicked");
9759
- _el$116.$$click = openPremiumDetails;
9760
- return _el$111;
9973
+ var _el$118 = _tmpl$17$1(), _el$119 = _el$118.firstChild, _el$120 = _el$119.nextSibling, _el$121 = _el$120.nextSibling, _el$122 = _el$121.firstChild, _el$123 = _el$122.nextSibling;
9974
+ _el$122.$$click = () => openPremiumCheckout("chat_banner_clicked");
9975
+ _el$123.$$click = openPremiumDetails;
9976
+ return _el$118;
9761
9977
  }
9762
9978
  }), createComponent(For, {
9763
9979
  get each() {
9764
9980
  return messages2();
9765
9981
  },
9766
9982
  children: (msg) => (() => {
9767
- var _el$244 = _tmpl$59();
9768
- insert(_el$244, createComponent(MarkdownMessage, {
9983
+ var _el$251 = _tmpl$60();
9984
+ insert(_el$251, createComponent(MarkdownMessage, {
9769
9985
  get content() {
9770
9986
  return msg.content;
9771
9987
  }
9772
9988
  }), null);
9773
- insert(_el$244, createComponent(Show, {
9989
+ insert(_el$251, createComponent(Show, {
9774
9990
  get when() {
9775
9991
  return memo(() => msg.role === "assistant")() ? getPremiumPromptKind(msg.content) : null;
9776
9992
  },
@@ -9783,31 +9999,31 @@ ${contextBlock}` : contextBlock);
9783
9999
  onOpenSettings: openPremiumDetails
9784
10000
  })
9785
10001
  }), null);
9786
- createRenderEffect(() => className(_el$244, `message message-${msg.role}`));
9787
- return _el$244;
10002
+ createRenderEffect(() => className(_el$251, `message message-${msg.role}`));
10003
+ return _el$251;
9788
10004
  })()
9789
10005
  }), createComponent(Show, {
9790
10006
  get when() {
9791
10007
  return isStreaming2();
9792
10008
  },
9793
10009
  get children() {
9794
- var _el$117 = _tmpl$19$1(), _el$118 = _el$117.firstChild;
9795
- insert(_el$118, createComponent(Show, {
10010
+ var _el$124 = _tmpl$20$1(), _el$125 = _el$124.firstChild;
10011
+ insert(_el$125, createComponent(Show, {
9796
10012
  get when() {
9797
10013
  return hasFirstChunk2();
9798
10014
  },
9799
10015
  get fallback() {
9800
- return _tmpl$60();
10016
+ return _tmpl$61();
9801
10017
  },
9802
10018
  get children() {
9803
- var _el$119 = _tmpl$18$1(), _el$120 = _el$119.firstChild, _el$121 = _el$120.firstChild;
9804
- _el$121.nextSibling;
9805
- insert(_el$119, createComponent(MarkdownMessage, {
10019
+ var _el$126 = _tmpl$19$1(), _el$127 = _el$126.firstChild, _el$128 = _el$127.firstChild;
10020
+ _el$128.nextSibling;
10021
+ insert(_el$126, createComponent(MarkdownMessage, {
9806
10022
  get content() {
9807
10023
  return streamingText2();
9808
10024
  }
9809
- }), _el$120);
9810
- insert(_el$119, createComponent(Show, {
10025
+ }), _el$127);
10026
+ insert(_el$126, createComponent(Show, {
9811
10027
  get when() {
9812
10028
  return getPremiumPromptKind(streamingText2());
9813
10029
  },
@@ -9819,21 +10035,21 @@ ${contextBlock}` : contextBlock);
9819
10035
  onStartTrial: () => openPremiumCheckout(kind() === "premium_gate" ? "premium_gate_clicked" : "iteration_limit_clicked"),
9820
10036
  onOpenSettings: openPremiumDetails
9821
10037
  })
9822
- }), _el$120);
9823
- insert(_el$120, createComponent(Show, {
10038
+ }), _el$127);
10039
+ insert(_el$127, createComponent(Show, {
9824
10040
  get when() {
9825
10041
  return elapsedSeconds() > 0;
9826
10042
  },
9827
10043
  get children() {
9828
- var _el$123 = _tmpl$17$1();
9829
- insert(_el$123, () => ` • ${elapsedSeconds()}s`);
9830
- return _el$123;
10044
+ var _el$130 = _tmpl$18$1();
10045
+ insert(_el$130, () => ` • ${elapsedSeconds()}s`);
10046
+ return _el$130;
9831
10047
  }
9832
10048
  }), null);
9833
- return _el$119;
10049
+ return _el$126;
9834
10050
  }
9835
10051
  }));
9836
- return _el$117;
10052
+ return _el$124;
9837
10053
  }
9838
10054
  }), createComponent(Show, {
9839
10055
  get when() {
@@ -9845,22 +10061,22 @@ ${contextBlock}` : contextBlock);
9845
10061
  return runtimeState2().supervisor.pendingApprovals;
9846
10062
  },
9847
10063
  children: (approval) => (() => {
9848
- var _el$246 = _tmpl$62(), _el$247 = _el$246.firstChild, _el$248 = _el$247.nextSibling, _el$249 = _el$248.firstChild, _el$250 = _el$249.firstChild, _el$251 = _el$250.nextSibling, _el$253 = _el$249.nextSibling, _el$254 = _el$253.nextSibling, _el$255 = _el$254.firstChild, _el$256 = _el$255.nextSibling;
9849
- insert(_el$251, () => approval.name);
9850
- insert(_el$248, createComponent(Show, {
10064
+ var _el$253 = _tmpl$63(), _el$254 = _el$253.firstChild, _el$255 = _el$254.nextSibling, _el$256 = _el$255.firstChild, _el$257 = _el$256.firstChild, _el$258 = _el$257.nextSibling, _el$260 = _el$256.nextSibling, _el$261 = _el$260.nextSibling, _el$262 = _el$261.firstChild, _el$263 = _el$262.nextSibling;
10065
+ insert(_el$258, () => approval.name);
10066
+ insert(_el$255, createComponent(Show, {
9851
10067
  get when() {
9852
10068
  return approval.argsSummary;
9853
10069
  },
9854
10070
  get children() {
9855
- var _el$252 = _tmpl$61();
9856
- insert(_el$252, () => approval.argsSummary);
9857
- return _el$252;
10071
+ var _el$259 = _tmpl$62();
10072
+ insert(_el$259, () => approval.argsSummary);
10073
+ return _el$259;
9858
10074
  }
9859
- }), _el$253);
9860
- insert(_el$253, () => approval.reason);
9861
- _el$255.$$click = () => void resolveApproval(approval.id, true);
9862
- _el$256.$$click = () => void resolveApproval(approval.id, false);
9863
- return _el$246;
10075
+ }), _el$260);
10076
+ insert(_el$260, () => approval.reason);
10077
+ _el$262.$$click = () => void resolveApproval(approval.id, true);
10078
+ _el$263.$$click = () => void resolveApproval(approval.id, false);
10079
+ return _el$253;
9864
10080
  })()
9865
10081
  });
9866
10082
  }
@@ -9869,13 +10085,13 @@ ${contextBlock}` : contextBlock);
9869
10085
  return memo(() => messages2().length === 0)() && !isStreaming2();
9870
10086
  },
9871
10087
  get children() {
9872
- return _tmpl$20$1();
10088
+ return _tmpl$21$1();
9873
10089
  }
9874
10090
  })];
9875
10091
  }
9876
- }), _el$125);
10092
+ }), _el$132);
9877
10093
  var _ref$ = messagesEndRef;
9878
- typeof _ref$ === "function" ? use(_ref$, _el$125) : messagesEndRef = _el$125;
10094
+ typeof _ref$ === "function" ? use(_ref$, _el$132) : messagesEndRef = _el$132;
9879
10095
  insert(_el$9, createComponent(Show, {
9880
10096
  get when() {
9881
10097
  return sidebarTab() === "chat";
@@ -9886,120 +10102,120 @@ ${contextBlock}` : contextBlock);
9886
10102
  return isStreaming2() || messages2().length > 0;
9887
10103
  },
9888
10104
  get children() {
9889
- var _el$126 = _tmpl$23$1();
9890
- insert(_el$126, createComponent(Show, {
10105
+ var _el$133 = _tmpl$24$1();
10106
+ insert(_el$133, createComponent(Show, {
9891
10107
  get when() {
9892
10108
  return isStreaming2();
9893
10109
  },
9894
10110
  get children() {
9895
- var _el$127 = _tmpl$21$1();
9896
- _el$127.$$click = () => cancel();
9897
- return _el$127;
10111
+ var _el$134 = _tmpl$22$1();
10112
+ _el$134.$$click = () => cancel();
10113
+ return _el$134;
9898
10114
  }
9899
10115
  }), null);
9900
- insert(_el$126, createComponent(Show, {
10116
+ insert(_el$133, createComponent(Show, {
9901
10117
  get when() {
9902
10118
  return memo(() => !!!isStreaming2())() && messages2().length > 0;
9903
10119
  },
9904
10120
  get children() {
9905
- var _el$128 = _tmpl$22$1();
9906
- _el$128.$$click = handleRetry;
9907
- return _el$128;
10121
+ var _el$135 = _tmpl$23$1();
10122
+ _el$135.$$click = handleRetry;
10123
+ return _el$135;
9908
10124
  }
9909
10125
  }), null);
9910
- return _el$126;
10126
+ return _el$133;
9911
10127
  }
9912
10128
  }), createComponent(Show, {
9913
10129
  get when() {
9914
10130
  return highlightCount() > 0;
9915
10131
  },
9916
10132
  get children() {
9917
- var _el$129 = _tmpl$24$1(), _el$130 = _el$129.firstChild, _el$131 = _el$130.nextSibling;
9918
- _el$131.firstChild;
9919
- var _el$133 = _el$131.nextSibling;
9920
- _el$130.$$click = () => void scrollToHighlight(highlightIndex() - 1);
9921
- _el$131.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex());
9922
- insert(_el$131, (() => {
10133
+ var _el$136 = _tmpl$25$1(), _el$137 = _el$136.firstChild, _el$138 = _el$137.nextSibling;
10134
+ _el$138.firstChild;
10135
+ var _el$140 = _el$138.nextSibling;
10136
+ _el$137.$$click = () => void scrollToHighlight(highlightIndex() - 1);
10137
+ _el$138.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex());
10138
+ insert(_el$138, (() => {
9923
10139
  var _c$4 = memo(() => highlightIndex() >= 0);
9924
10140
  return () => _c$4() ? `${highlightIndex() + 1} / ${highlightCount()}` : `${highlightCount()} highlight${highlightCount() > 1 ? "s" : ""}`;
9925
10141
  })(), null);
9926
- _el$133.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex() + 1);
10142
+ _el$140.$$click = () => void scrollToHighlight(highlightIndex() < 0 ? 0 : highlightIndex() + 1);
9927
10143
  createRenderEffect((_p$) => {
9928
10144
  var _v$9 = highlightIndex() <= 0, _v$0 = highlightIndex() >= highlightCount() - 1;
9929
- _v$9 !== _p$.e && (_el$130.disabled = _p$.e = _v$9);
9930
- _v$0 !== _p$.t && (_el$133.disabled = _p$.t = _v$0);
10145
+ _v$9 !== _p$.e && (_el$137.disabled = _p$.e = _v$9);
10146
+ _v$0 !== _p$.t && (_el$140.disabled = _p$.t = _v$0);
9931
10147
  return _p$;
9932
10148
  }, {
9933
10149
  e: void 0,
9934
10150
  t: void 0
9935
10151
  });
9936
- return _el$129;
10152
+ return _el$136;
9937
10153
  }
9938
10154
  }), createComponent(Show, {
9939
10155
  get when() {
9940
10156
  return queueNotice2() !== null || pendingQueryCount() > 0;
9941
10157
  },
9942
10158
  get children() {
9943
- var _el$134 = _tmpl$27$1(), _el$135 = _el$134.firstChild, _el$136 = _el$135.firstChild;
9944
- insert(_el$136, () => queueNotice2() ?? `Queued ${pendingQueryCount()}/${pendingQueryLimit}.`);
9945
- insert(_el$135, createComponent(Show, {
10159
+ var _el$141 = _tmpl$28$1(), _el$142 = _el$141.firstChild, _el$143 = _el$142.firstChild;
10160
+ insert(_el$143, () => queueNotice2() ?? `Queued ${pendingQueryCount()}/${pendingQueryLimit}.`);
10161
+ insert(_el$142, createComponent(Show, {
9946
10162
  get when() {
9947
10163
  return pendingQueryCount() > 0;
9948
10164
  },
9949
10165
  get children() {
9950
- var _el$137 = _tmpl$25$1();
9951
- _el$137.$$click = () => clearPendingQueries();
9952
- return _el$137;
10166
+ var _el$144 = _tmpl$26$1();
10167
+ _el$144.$$click = () => clearPendingQueries();
10168
+ return _el$144;
9953
10169
  }
9954
10170
  }), null);
9955
- insert(_el$134, createComponent(Show, {
10171
+ insert(_el$141, createComponent(Show, {
9956
10172
  get when() {
9957
10173
  return pendingQueries2().length > 0;
9958
10174
  },
9959
10175
  get children() {
9960
- var _el$138 = _tmpl$26$1();
9961
- insert(_el$138, createComponent(For, {
10176
+ var _el$145 = _tmpl$27$1();
10177
+ insert(_el$145, createComponent(For, {
9962
10178
  get each() {
9963
10179
  return pendingQueries2();
9964
10180
  },
9965
10181
  children: (pendingPrompt, index) => (() => {
9966
- var _el$257 = _tmpl$63(), _el$258 = _el$257.firstChild, _el$259 = _el$258.nextSibling;
9967
- setAttribute(_el$258, "title", pendingPrompt);
9968
- insert(_el$258, pendingPrompt);
9969
- _el$259.$$click = () => removePendingQuery(index());
9970
- createRenderEffect(() => setAttribute(_el$259, "aria-label", `Remove queued prompt ${index() + 1}`));
9971
- return _el$257;
10182
+ var _el$264 = _tmpl$64(), _el$265 = _el$264.firstChild, _el$266 = _el$265.nextSibling;
10183
+ setAttribute(_el$265, "title", pendingPrompt);
10184
+ insert(_el$265, pendingPrompt);
10185
+ _el$266.$$click = () => removePendingQuery(index());
10186
+ createRenderEffect(() => setAttribute(_el$266, "aria-label", `Remove queued prompt ${index() + 1}`));
10187
+ return _el$264;
9972
10188
  })()
9973
10189
  }));
9974
- return _el$138;
10190
+ return _el$145;
9975
10191
  }
9976
10192
  }), null);
9977
- return _el$134;
10193
+ return _el$141;
9978
10194
  }
9979
10195
  }), (() => {
9980
- var _el$139 = _tmpl$28$1(), _el$140 = _el$139.firstChild, _el$141 = _el$140.nextSibling;
9981
- _el$140.$$keydown = (e) => {
10196
+ var _el$146 = _tmpl$29$1(), _el$147 = _el$146.firstChild, _el$148 = _el$147.nextSibling;
10197
+ _el$147.$$keydown = (e) => {
9982
10198
  if (e.key === "Enter" && !e.shiftKey) {
9983
10199
  e.preventDefault();
9984
10200
  void handleChatSend();
9985
10201
  }
9986
10202
  };
9987
- _el$140.$$input = (e) => setChatInput(e.currentTarget.value);
10203
+ _el$147.$$input = (e) => setChatInput(e.currentTarget.value);
9988
10204
  var _ref$2 = chatInputRef;
9989
- typeof _ref$2 === "function" ? use(_ref$2, _el$140) : chatInputRef = _el$140;
9990
- _el$141.$$click = () => void handleChatSend();
9991
- insert(_el$141, () => isStreaming2() ? "Queue" : "Send");
10205
+ typeof _ref$2 === "function" ? use(_ref$2, _el$147) : chatInputRef = _el$147;
10206
+ _el$148.$$click = () => void handleChatSend();
10207
+ insert(_el$148, () => isStreaming2() ? "Queue" : "Send");
9992
10208
  createRenderEffect((_p$) => {
9993
10209
  var _v$1 = isStreaming2() ? "Send now to queue the next prompt..." : "Ask anything...", _v$10 = !chatInput().trim();
9994
- _v$1 !== _p$.e && setAttribute(_el$140, "placeholder", _p$.e = _v$1);
9995
- _v$10 !== _p$.t && (_el$141.disabled = _p$.t = _v$10);
10210
+ _v$1 !== _p$.e && setAttribute(_el$147, "placeholder", _p$.e = _v$1);
10211
+ _v$10 !== _p$.t && (_el$148.disabled = _p$.t = _v$10);
9996
10212
  return _p$;
9997
10213
  }, {
9998
10214
  e: void 0,
9999
10215
  t: void 0
10000
10216
  });
10001
- createRenderEffect(() => _el$140.value = chatInput());
10002
- return _el$139;
10217
+ createRenderEffect(() => _el$147.value = chatInput());
10218
+ return _el$146;
10003
10219
  })()];
10004
10220
  }
10005
10221
  }), null);
@@ -10049,7 +10265,7 @@ ${contextBlock}` : contextBlock);
10049
10265
  });
10050
10266
  };
10051
10267
  delegateEvents(["click", "pointerdown", "input", "keydown"]);
10052
- var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$7 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$7 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$5 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$2 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$2 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$2 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$2 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
10268
+ var _tmpl$$9 = /* @__PURE__ */ template(`<div class=devtools-console>`), _tmpl$2$9 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for console output... Console monitoring activates when an agent uses devtools.`), _tmpl$3$8 = /* @__PURE__ */ template(`<div><span></span><span class=console-time></span><span class=console-text></span><span class=console-source>`), _tmpl$4$8 = /* @__PURE__ */ template(`<div class=devtools-network><div class=network-header><span>Method</span><span>URL</span><span>Status</span><span>Type</span><span>Time`), _tmpl$5$7 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for network requests... Network monitoring activates when an agent uses devtools.`), _tmpl$6$7 = /* @__PURE__ */ template(`<div><span class=network-method></span><span class=network-url></span><span></span><span class=network-type></span><span class=network-duration>`), _tmpl$7$5 = /* @__PURE__ */ template(`<div class=devtools-activity>`), _tmpl$8$4 = /* @__PURE__ */ template(`<div class=devtools-empty>Waiting for agent devtools activity...`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=activity-entry><span class=activity-time></span><span class=activity-tool></span><span class=activity-args></span><span></span><span class=activity-duration>`), _tmpl$0$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge error">`), _tmpl$1$2 = /* @__PURE__ */ template(`<span class="devtools-tab-badge count">`), _tmpl$10$2 = /* @__PURE__ */ template(`<div class=export-date-inputs><div class=export-date-row><span class=export-date-label>From</span><input class=export-date-input type=date></div><div class=export-date-row><span class=export-date-label>To</span><input class=export-date-input type=date>`), _tmpl$11$2 = /* @__PURE__ */ template(`<div class=devtools-export-dropdown><div class=export-section><div class=export-section-label>Log Types</div><label class=export-checkbox><input type=checkbox>Console</label><label class=export-checkbox><input type=checkbox>Network</label><label class=export-checkbox><input type=checkbox>Activity</label></div><div class=export-section><div class=export-section-label>Date Range</div><div class=export-date-btns><button>Today</button><button>Custom</button></div></div><button class=export-submit>Export JSON`), _tmpl$12$2 = /* @__PURE__ */ template(`<div class=devtools-panel><div class=devtools-tabs><button>Console</button><button>Network</button><button>Activity</button><div class=devtools-tab-spacer></div><div class=devtools-export-wrap><button title="Export Logs"><svg width=13 height=13 viewBox="0 0 13 13"fill=none style=vertical-align:middle><path d="M6.5 1v7M3.5 5l3 3 3-3"stroke=currentColor stroke-width=1.3 stroke-linecap=round stroke-linejoin=round></path><path d="M1 9.5v1A1.5 1.5 0 0 0 2.5 12h8A1.5 1.5 0 0 0 12 10.5v-1"stroke=currentColor stroke-width=1.3 stroke-linecap=round></path></svg></button></div><button class=devtools-close-btn title="Close DevTools">×</button></div><div class=devtools-content>`);
10053
10269
  function statusClass(status) {
10054
10270
  if (status == null) return "pending";
10055
10271
  if (status >= 200 && status < 300) return "ok";
@@ -10224,7 +10440,7 @@ const ActivityView = (props) => {
10224
10440
  return [...props.entries].reverse();
10225
10441
  },
10226
10442
  children: (entry) => (() => {
10227
- var _el$17 = _tmpl$9$2(), _el$18 = _el$17.firstChild, _el$19 = _el$18.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
10443
+ var _el$17 = _tmpl$9$3(), _el$18 = _el$17.firstChild, _el$19 = _el$18.nextSibling, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
10228
10444
  insert(_el$18, () => formatTime(entry.timestamp, {
10229
10445
  includeSeconds: true
10230
10446
  }));
@@ -10507,8 +10723,9 @@ const PROVIDERS = {
10507
10723
  openrouter: {
10508
10724
  id: "openrouter",
10509
10725
  name: "OpenRouter",
10510
- defaultModel: "anthropic/claude-sonnet-4",
10726
+ defaultModel: "openrouter/free",
10511
10727
  models: [
10728
+ "openrouter/free",
10512
10729
  "anthropic/claude-sonnet-4",
10513
10730
  "anthropic/claude-haiku-4",
10514
10731
  "openai/gpt-4o",
@@ -10700,7 +10917,7 @@ const SettingsGeneral = (props) => {
10700
10917
  })();
10701
10918
  };
10702
10919
  delegateEvents(["click", "input"]);
10703
- var _tmpl$$7 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$2$7 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;gap:8px><span style=width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block></span><span>Connected as `), _tmpl$3$6 = /* @__PURE__ */ template(`<p class=settings-hint><button type=button class=settings-link-btn>Disconnect`), _tmpl$4$6 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label>Account`), _tmpl$5$5 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$6$5 = /* @__PURE__ */ template(`<p class=settings-hint>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$7$4 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$8$3 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$9$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$0$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$1$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$11$1 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured <code>llama-server</code> base URL. For agent loops, run <code>llama-server</code> with <code>--ctx-size 16384</code> minimum and <code>32768</code> recommended.`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-reasoning-effort>Reasoning Level</label><select id=chat-reasoning-effort class="settings-input settings-select"></select><p class=settings-hint>Applies to providers and models that expose reasoning controls. Off requests no reasoning where supported and otherwise leaves the model at its normal behavior; Max requests the strongest supported reasoning tier.`), _tmpl$13$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:&lt;port&gt;/mcp</code>. Changing this value restarts the MCP server immediately.</p><div class=settings-inline-actions><button type=button class=settings-secondary-btn>Regenerate MCP token</button></div></div><div class=settings-field><label class=settings-label for=max-tool-iterations>Max Tool Iterations</label><p class=settings-hint></p></div><div class=settings-field><label class=settings-label for=agent-transcript-mode>Agent Transcript Monitor</label><select id=agent-transcript-mode class="settings-input settings-select"><option value=off>Off</option><option value=summary>Summary HUD</option><option value=full>Full transcript</option></select><p class=settings-hint>Controls the in-browser transcript monitor when an external harness publishes reasoning or status updates into Vessel via the <code>vessel_publish_transcript</code> MCP tool. Summary HUD shows a compact 2-line status surface; Full transcript shows the recent entry list.</p></div><div class=settings-field><label class=settings-label for=obsidian-vault-path>Obsidian Vault Path</label><input id=obsidian-vault-path class=settings-input placeholder=/home/you/Documents/MyVault><p class=settings-hint>Optional. When set, Vessel memory tools can write markdown notes into this vault for research breadcrumbs and summaries.`), _tmpl$15$1 = /* @__PURE__ */ template(`<option>`), _tmpl$16 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)> <button type=button class=settings-link-btn>Cancel`), _tmpl$17 = /* @__PURE__ */ template(`<div>`), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>`), _tmpl$19 = /* @__PURE__ */ template(`<button type=button class=settings-btn>Try Again`), _tmpl$20 = /* @__PURE__ */ template(`<div><button type=button class=settings-btn>Connect with ChatGPT</button><p class=settings-hint>Sign in with your ChatGPT Plus or Pro subscription. A browser tab will open where you'll authorize Vessel.`), _tmpl$21 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$24 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$26 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$27 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`);
10920
+ var _tmpl$$7 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>`), _tmpl$2$7 = /* @__PURE__ */ template(`<div class=settings-callout><div class=settings-callout-title>Start With Free AI</div><p class=settings-callout-copy>Connect OpenRouter and Vessel will use the free model router automatically.</p><div class=settings-inline-actions style=margin-top:12px><button type=button class=settings-secondary-btn>`), _tmpl$3$6 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$4$6 = /* @__PURE__ */ template(`<div style=display:flex;align-items:center;gap:8px><span style=width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block></span><span>Connected as `), _tmpl$5$5 = /* @__PURE__ */ template(`<p class=settings-hint><button type=button class=settings-link-btn>Disconnect`), _tmpl$6$5 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label>Account`), _tmpl$7$4 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$8$3 = /* @__PURE__ */ template(`<p class=settings-hint>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$9$2 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$0$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$1$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$10$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$12$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$13$1 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured <code>llama-server</code> base URL. For agent loops, run <code>llama-server</code> with <code>--ctx-size 16384</code> minimum and <code>32768</code> recommended.`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-reasoning-effort>Reasoning Level</label><select id=chat-reasoning-effort class="settings-input settings-select"></select><p class=settings-hint>Applies to providers and models that expose reasoning controls. Off requests no reasoning where supported and otherwise leaves the model at its normal behavior; Max requests the strongest supported reasoning tier.`), _tmpl$15$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$16 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:&lt;port&gt;/mcp</code>. Changing this value restarts the MCP server immediately.</p><div class=settings-inline-actions><button type=button class=settings-secondary-btn>Regenerate MCP token</button></div></div><div class=settings-field><label class=settings-label for=max-tool-iterations>Max Tool Iterations</label><p class=settings-hint></p></div><div class=settings-field><label class=settings-label for=agent-transcript-mode>Agent Transcript Monitor</label><select id=agent-transcript-mode class="settings-input settings-select"><option value=off>Off</option><option value=summary>Summary HUD</option><option value=full>Full transcript</option></select><p class=settings-hint>Controls the in-browser transcript monitor when an external harness publishes reasoning or status updates into Vessel via the <code>vessel_publish_transcript</code> MCP tool. Summary HUD shows a compact 2-line status surface; Full transcript shows the recent entry list.</p></div><div class=settings-field><label class=settings-label for=obsidian-vault-path>Obsidian Vault Path</label><input id=obsidian-vault-path class=settings-input placeholder=/home/you/Documents/MyVault><p class=settings-hint>Optional. When set, Vessel memory tools can write markdown notes into this vault for research breadcrumbs and summaries.`), _tmpl$17 = /* @__PURE__ */ template(`<option>`), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)> <button type=button class=settings-link-btn>Cancel`), _tmpl$19 = /* @__PURE__ */ template(`<div>`), _tmpl$20 = /* @__PURE__ */ template(`<button type=button class=settings-btn>Try Again`), _tmpl$21 = /* @__PURE__ */ template(`<div><button type=button class=settings-btn>Connect with ChatGPT</button><p class=settings-hint>Sign in with your ChatGPT Plus or Pro subscription. A browser tab will open where you'll authorize Vessel.`), _tmpl$22 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$24 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$25 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$26 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$28 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$29 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`);
10704
10921
  const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
10705
10922
  id: p.id,
10706
10923
  name: p.name,
@@ -10730,17 +10947,48 @@ const REASONING_EFFORT_OPTIONS = [{
10730
10947
  const SettingsAgent = (props) => {
10731
10948
  const [mcpTokenMessage, setMcpTokenMessage] = createSignal(null);
10732
10949
  const chatMeta = () => CHAT_PROVIDERS$1.find((p) => p.id === props.chat.providerId()) ?? CHAT_PROVIDERS$1[0];
10950
+ const openRouterConnecting = () => props.chat.openRouterAuthStatus() === "waiting" || props.chat.openRouterAuthStatus() === "exchanging";
10733
10951
  return (() => {
10734
- var _el$ = _tmpl$14$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$35 = _el$3.nextSibling, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, _el$38 = _el$37.nextSibling, _el$39 = _el$38.nextSibling, _el$40 = _el$39.firstChild, _el$41 = _el$35.nextSibling, _el$42 = _el$41.firstChild, _el$44 = _el$42.nextSibling, _el$45 = _el$41.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling, _el$48 = _el$45.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
10735
- _el$5.$$click = () => props.chat.setEnabled(!props.chat.enabled());
10952
+ var _el$ = _tmpl$16(), _el$2 = _el$.firstChild, _el$9 = _el$2.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$41 = _el$9.nextSibling, _el$42 = _el$41.firstChild, _el$43 = _el$42.nextSibling, _el$44 = _el$43.nextSibling, _el$45 = _el$44.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$41.nextSibling, _el$48 = _el$47.firstChild, _el$50 = _el$48.nextSibling, _el$51 = _el$47.nextSibling, _el$52 = _el$51.firstChild, _el$53 = _el$52.nextSibling, _el$54 = _el$51.nextSibling, _el$55 = _el$54.firstChild, _el$56 = _el$55.nextSibling;
10953
+ insert(_el$, createComponent(Show, {
10954
+ get when() {
10955
+ return !props.chat.enabled() || props.chat.providerId() === "openrouter" && !props.chat.hasStoredApiKey();
10956
+ },
10957
+ get children() {
10958
+ var _el$3 = _tmpl$2$7(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild;
10959
+ _el$7.$$click = () => props.chat.startOpenRouterAuth();
10960
+ insert(_el$7, createComponent(Show, {
10961
+ get when() {
10962
+ return !openRouterConnecting();
10963
+ },
10964
+ get fallback() {
10965
+ return props.chat.openRouterAuthStatus() === "exchanging" ? "Finishing setup..." : "Opening OpenRouter...";
10966
+ },
10967
+ children: "Start free with OpenRouter"
10968
+ }));
10969
+ insert(_el$3, createComponent(Show, {
10970
+ get when() {
10971
+ return props.chat.openRouterAuthStatus() === "error";
10972
+ },
10973
+ get children() {
10974
+ var _el$8 = _tmpl$$7();
10975
+ insert(_el$8, () => props.chat.openRouterAuthError());
10976
+ return _el$8;
10977
+ }
10978
+ }), null);
10979
+ createRenderEffect(() => _el$7.disabled = openRouterConnecting());
10980
+ return _el$3;
10981
+ }
10982
+ }), _el$9);
10983
+ _el$1.$$click = () => props.chat.setEnabled(!props.chat.enabled());
10736
10984
  insert(_el$, createComponent(Show, {
10737
10985
  get when() {
10738
10986
  return props.chat.enabled();
10739
10987
  },
10740
10988
  get children() {
10741
10989
  return [(() => {
10742
- var _el$6 = _tmpl$$7(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
10743
- _el$8.addEventListener("change", (e) => {
10990
+ var _el$10 = _tmpl$3$6(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
10991
+ _el$12.addEventListener("change", (e) => {
10744
10992
  const id = e.currentTarget.value;
10745
10993
  props.chat.setProviderId(id);
10746
10994
  props.chat.setModel("");
@@ -10749,32 +10997,32 @@ const SettingsAgent = (props) => {
10749
10997
  props.chat.setHasStoredApiKey(false);
10750
10998
  props.chat.resetProviderModels();
10751
10999
  });
10752
- insert(_el$8, createComponent(For, {
11000
+ insert(_el$12, createComponent(For, {
10753
11001
  each: CHAT_PROVIDERS$1,
10754
11002
  children: (p) => (() => {
10755
- var _el$51 = _tmpl$15$1();
10756
- insert(_el$51, () => p.name);
10757
- createRenderEffect(() => _el$51.value = p.id);
10758
- return _el$51;
11003
+ var _el$57 = _tmpl$17();
11004
+ insert(_el$57, () => p.name);
11005
+ createRenderEffect(() => _el$57.value = p.id);
11006
+ return _el$57;
10759
11007
  })()
10760
11008
  }));
10761
- createRenderEffect(() => _el$8.value = props.chat.providerId());
10762
- return _el$6;
11009
+ createRenderEffect(() => _el$12.value = props.chat.providerId());
11010
+ return _el$10;
10763
11011
  })(), createComponent(Show, {
10764
11012
  get when() {
10765
11013
  return props.chat.providerType() === "codex_oauth";
10766
11014
  },
10767
11015
  get children() {
10768
- var _el$9 = _tmpl$4$6();
10769
- _el$9.firstChild;
10770
- insert(_el$9, createComponent(Show, {
11016
+ var _el$13 = _tmpl$6$5();
11017
+ _el$13.firstChild;
11018
+ insert(_el$13, createComponent(Show, {
10771
11019
  get when() {
10772
11020
  return props.chat.codexAuthStatus() === "connected";
10773
11021
  },
10774
11022
  get fallback() {
10775
11023
  return (() => {
10776
- var _el$52 = _tmpl$17();
10777
- insert(_el$52, createComponent(Show, {
11024
+ var _el$58 = _tmpl$19();
11025
+ insert(_el$58, createComponent(Show, {
10778
11026
  get when() {
10779
11027
  return props.chat.codexAuthStatus() === "waiting" || props.chat.codexAuthStatus() === "exchanging";
10780
11028
  },
@@ -10785,302 +11033,302 @@ const SettingsAgent = (props) => {
10785
11033
  },
10786
11034
  get fallback() {
10787
11035
  return (() => {
10788
- var _el$58 = _tmpl$20(), _el$59 = _el$58.firstChild;
10789
- _el$59.$$click = () => props.chat.startCodexAuth();
10790
- return _el$58;
11036
+ var _el$64 = _tmpl$21(), _el$65 = _el$64.firstChild;
11037
+ _el$65.$$click = () => props.chat.startCodexAuth();
11038
+ return _el$64;
10791
11039
  })();
10792
11040
  },
10793
11041
  get children() {
10794
11042
  return [(() => {
10795
- var _el$56 = _tmpl$18();
10796
- insert(_el$56, () => props.chat.codexAuthError());
10797
- return _el$56;
11043
+ var _el$62 = _tmpl$$7();
11044
+ insert(_el$62, () => props.chat.codexAuthError());
11045
+ return _el$62;
10798
11046
  })(), (() => {
10799
- var _el$57 = _tmpl$19();
10800
- _el$57.$$click = () => props.chat.startCodexAuth();
10801
- return _el$57;
11047
+ var _el$63 = _tmpl$20();
11048
+ _el$63.$$click = () => props.chat.startCodexAuth();
11049
+ return _el$63;
10802
11050
  })()];
10803
11051
  }
10804
11052
  });
10805
11053
  },
10806
11054
  get children() {
10807
- var _el$53 = _tmpl$16(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
10808
- insert(_el$53, createComponent(Show, {
11055
+ var _el$59 = _tmpl$18(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling;
11056
+ insert(_el$59, createComponent(Show, {
10809
11057
  get when() {
10810
11058
  return props.chat.codexAuthStatus() === "waiting";
10811
11059
  },
10812
11060
  fallback: "Exchanging authorization...",
10813
11061
  children: "Waiting for browser login..."
10814
- }), _el$54);
10815
- _el$55.$$click = () => window.vessel.codex.cancelAuth();
10816
- return _el$53;
11062
+ }), _el$60);
11063
+ _el$61.$$click = () => window.vessel.codex.cancelAuth();
11064
+ return _el$59;
10817
11065
  }
10818
11066
  }));
10819
- return _el$52;
11067
+ return _el$58;
10820
11068
  })();
10821
11069
  },
10822
11070
  get children() {
10823
11071
  return [(() => {
10824
- var _el$1 = _tmpl$2$7(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
10825
- _el$11.firstChild;
10826
- insert(_el$11, () => props.chat.codexAccountEmail() || "ChatGPT", null);
10827
- return _el$1;
11072
+ var _el$15 = _tmpl$4$6(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
11073
+ _el$17.firstChild;
11074
+ insert(_el$17, () => props.chat.codexAccountEmail() || "ChatGPT", null);
11075
+ return _el$15;
10828
11076
  })(), (() => {
10829
- var _el$13 = _tmpl$3$6(), _el$14 = _el$13.firstChild;
10830
- _el$14.$$click = () => props.chat.disconnectCodex();
10831
- return _el$13;
11077
+ var _el$19 = _tmpl$5$5(), _el$20 = _el$19.firstChild;
11078
+ _el$20.$$click = () => props.chat.disconnectCodex();
11079
+ return _el$19;
10832
11080
  })()];
10833
11081
  }
10834
11082
  }), null);
10835
- return _el$9;
11083
+ return _el$13;
10836
11084
  }
10837
11085
  }), createComponent(Show, {
10838
11086
  get when() {
10839
11087
  return memo(() => props.chat.providerType() !== "codex_oauth")() && (chatMeta().requiresKey || props.chat.providerId() === "custom");
10840
11088
  },
10841
11089
  get children() {
10842
- var _el$15 = _tmpl$8$3(), _el$16 = _el$15.firstChild;
10843
- _el$16.firstChild;
10844
- var _el$19 = _el$16.nextSibling;
10845
- insert(_el$16, createComponent(Show, {
11090
+ var _el$21 = _tmpl$0$1(), _el$22 = _el$21.firstChild;
11091
+ _el$22.firstChild;
11092
+ var _el$25 = _el$22.nextSibling;
11093
+ insert(_el$22, createComponent(Show, {
10846
11094
  get when() {
10847
11095
  return !chatMeta().requiresKey;
10848
11096
  },
10849
11097
  get children() {
10850
- return _tmpl$5$5();
11098
+ return _tmpl$7$4();
10851
11099
  }
10852
11100
  }), null);
10853
- _el$19.$$input = (e) => {
11101
+ _el$25.$$input = (e) => {
10854
11102
  props.chat.setApiKey(e.currentTarget.value);
10855
11103
  if (e.currentTarget.value.trim()) {
10856
11104
  props.chat.setHasStoredApiKey(true);
10857
11105
  }
10858
11106
  };
10859
- setAttribute(_el$19, "spellcheck", false);
10860
- insert(_el$15, createComponent(Show, {
11107
+ setAttribute(_el$25, "spellcheck", false);
11108
+ insert(_el$21, createComponent(Show, {
10861
11109
  get when() {
10862
11110
  return memo(() => !!props.chat.hasStoredApiKey())() && !props.chat.apiKey().trim();
10863
11111
  },
10864
11112
  get children() {
10865
- return _tmpl$6$5();
11113
+ return _tmpl$8$3();
10866
11114
  }
10867
11115
  }), null);
10868
- insert(_el$15, createComponent(Show, {
11116
+ insert(_el$21, createComponent(Show, {
10869
11117
  get when() {
10870
11118
  return props.chat.providerId() === "custom";
10871
11119
  },
10872
11120
  get children() {
10873
- return _tmpl$7$4();
11121
+ return _tmpl$9$2();
10874
11122
  }
10875
11123
  }), null);
10876
- createRenderEffect(() => setAttribute(_el$19, "placeholder", props.chat.hasStoredApiKey() && !props.chat.apiKey().trim() ? "Stored securely. Enter a new key to replace it." : chatMeta().keyPlaceholder || "Bearer token or API key"));
10877
- createRenderEffect(() => _el$19.value = props.chat.apiKey());
10878
- return _el$15;
11124
+ createRenderEffect(() => setAttribute(_el$25, "placeholder", props.chat.hasStoredApiKey() && !props.chat.apiKey().trim() ? "Stored securely. Enter a new key to replace it." : chatMeta().keyPlaceholder || "Bearer token or API key"));
11125
+ createRenderEffect(() => _el$25.value = props.chat.apiKey());
11126
+ return _el$21;
10879
11127
  }
10880
11128
  }), (() => {
10881
- var _el$22 = _tmpl$1$1(), _el$23 = _el$22.firstChild, _el$24 = _el$23.nextSibling, _el$26 = _el$24.firstChild;
10882
- insert(_el$24, createComponent(Show, {
11129
+ var _el$28 = _tmpl$11$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$32 = _el$30.firstChild;
11130
+ insert(_el$30, createComponent(Show, {
10883
11131
  get when() {
10884
11132
  return props.chat.providerModels().length > 0;
10885
11133
  },
10886
11134
  get fallback() {
10887
11135
  return (() => {
10888
- var _el$60 = _tmpl$21();
10889
- _el$60.$$input = (e) => props.chat.setModel(e.currentTarget.value);
10890
- setAttribute(_el$60, "spellcheck", false);
10891
- createRenderEffect(() => setAttribute(_el$60, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
10892
- createRenderEffect(() => _el$60.value = props.chat.model());
10893
- return _el$60;
11136
+ var _el$66 = _tmpl$22();
11137
+ _el$66.$$input = (e) => props.chat.setModel(e.currentTarget.value);
11138
+ setAttribute(_el$66, "spellcheck", false);
11139
+ createRenderEffect(() => setAttribute(_el$66, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
11140
+ createRenderEffect(() => _el$66.value = props.chat.model());
11141
+ return _el$66;
10894
11142
  })();
10895
11143
  },
10896
11144
  get children() {
10897
- var _el$25 = _tmpl$9$1();
10898
- _el$25.addEventListener("change", (e) => props.chat.setModel(e.currentTarget.value));
10899
- insert(_el$25, createComponent(For, {
11145
+ var _el$31 = _tmpl$1$1();
11146
+ _el$31.addEventListener("change", (e) => props.chat.setModel(e.currentTarget.value));
11147
+ insert(_el$31, createComponent(For, {
10900
11148
  get each() {
10901
11149
  return props.chat.providerModels();
10902
11150
  },
10903
11151
  children: (m) => (() => {
10904
- var _el$61 = _tmpl$15$1();
10905
- _el$61.value = m;
10906
- insert(_el$61, m);
10907
- return _el$61;
11152
+ var _el$67 = _tmpl$17();
11153
+ _el$67.value = m;
11154
+ insert(_el$67, m);
11155
+ return _el$67;
10908
11156
  })()
10909
11157
  }));
10910
- createRenderEffect(() => _el$25.value = props.chat.model());
10911
- return _el$25;
11158
+ createRenderEffect(() => _el$31.value = props.chat.model());
11159
+ return _el$31;
10912
11160
  }
10913
- }), _el$26);
10914
- _el$26.$$click = () => props.chat.doFetchModels();
10915
- insert(_el$22, createComponent(Show, {
11161
+ }), _el$32);
11162
+ _el$32.$$click = () => props.chat.doFetchModels();
11163
+ insert(_el$28, createComponent(Show, {
10916
11164
  get when() {
10917
11165
  return props.chat.modelFetchState() === "error";
10918
11166
  },
10919
11167
  get children() {
10920
- return _tmpl$0$1();
11168
+ return _tmpl$10$1();
10921
11169
  }
10922
11170
  }), null);
10923
- insert(_el$22, createComponent(Show, {
11171
+ insert(_el$28, createComponent(Show, {
10924
11172
  get when() {
10925
11173
  return props.chat.modelFetchWarning();
10926
11174
  },
10927
11175
  children: (warning) => (() => {
10928
- var _el$62 = _tmpl$22();
10929
- insert(_el$62, warning);
10930
- return _el$62;
11176
+ var _el$68 = _tmpl$23();
11177
+ insert(_el$68, warning);
11178
+ return _el$68;
10931
11179
  })()
10932
11180
  }), null);
10933
- createRenderEffect(() => _el$26.disabled = props.chat.modelFetchState() === "loading");
10934
- return _el$22;
11181
+ createRenderEffect(() => _el$32.disabled = props.chat.modelFetchState() === "loading");
11182
+ return _el$28;
10935
11183
  })(), createComponent(Show, {
10936
11184
  get when() {
10937
11185
  return chatMeta().needsBaseUrl || props.chat.providerId() === "custom";
10938
11186
  },
10939
11187
  get children() {
10940
- var _el$28 = _tmpl$10$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling;
10941
- _el$30.$$input = (e) => props.chat.setBaseUrl(e.currentTarget.value);
10942
- setAttribute(_el$30, "spellcheck", false);
10943
- createRenderEffect(() => setAttribute(_el$30, "placeholder", chatMeta().defaultBaseUrl ?? "https://..."));
10944
- createRenderEffect(() => _el$30.value = props.chat.baseUrl());
10945
- return _el$28;
11188
+ var _el$34 = _tmpl$12$1(), _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling;
11189
+ _el$36.$$input = (e) => props.chat.setBaseUrl(e.currentTarget.value);
11190
+ setAttribute(_el$36, "spellcheck", false);
11191
+ createRenderEffect(() => setAttribute(_el$36, "placeholder", chatMeta().defaultBaseUrl ?? "https://..."));
11192
+ createRenderEffect(() => _el$36.value = props.chat.baseUrl());
11193
+ return _el$34;
10946
11194
  }
10947
11195
  }), createComponent(Show, {
10948
11196
  get when() {
10949
11197
  return props.chat.providerId() === "llama_cpp";
10950
11198
  },
10951
11199
  get children() {
10952
- return _tmpl$11$1();
11200
+ return _tmpl$13$1();
10953
11201
  }
10954
11202
  }), (() => {
10955
- var _el$32 = _tmpl$12$1(), _el$33 = _el$32.firstChild, _el$34 = _el$33.nextSibling;
10956
- _el$34.addEventListener("change", (e) => props.chat.setReasoningEffort(e.currentTarget.value));
10957
- insert(_el$34, createComponent(For, {
11203
+ var _el$38 = _tmpl$14$1(), _el$39 = _el$38.firstChild, _el$40 = _el$39.nextSibling;
11204
+ _el$40.addEventListener("change", (e) => props.chat.setReasoningEffort(e.currentTarget.value));
11205
+ insert(_el$40, createComponent(For, {
10958
11206
  each: REASONING_EFFORT_OPTIONS,
10959
11207
  children: (option) => (() => {
10960
- var _el$63 = _tmpl$15$1();
10961
- insert(_el$63, () => option.label);
10962
- createRenderEffect(() => _el$63.value = option.value);
10963
- return _el$63;
11208
+ var _el$69 = _tmpl$17();
11209
+ insert(_el$69, () => option.label);
11210
+ createRenderEffect(() => _el$69.value = option.value);
11211
+ return _el$69;
10964
11212
  })()
10965
11213
  }));
10966
- createRenderEffect(() => _el$34.value = props.chat.reasoningEffort());
10967
- return _el$32;
11214
+ createRenderEffect(() => _el$40.value = props.chat.reasoningEffort());
11215
+ return _el$38;
10968
11216
  })()];
10969
11217
  }
10970
- }), _el$35);
10971
- _el$37.$$input = (e) => props.setMcpPort(e.currentTarget.value);
10972
- setAttribute(_el$37, "spellcheck", false);
10973
- _el$40.$$click = async () => {
11218
+ }), _el$41);
11219
+ _el$43.$$input = (e) => props.setMcpPort(e.currentTarget.value);
11220
+ setAttribute(_el$43, "spellcheck", false);
11221
+ _el$46.$$click = async () => {
10974
11222
  const result = await window.vessel.settings.regenerateMcpToken();
10975
11223
  setMcpTokenMessage(result ? "MCP token regenerated. Update any external client config using Vessel's auth file." : "MCP server is not running, so no token was regenerated.");
10976
11224
  };
10977
- insert(_el$35, createComponent(Show, {
11225
+ insert(_el$41, createComponent(Show, {
10978
11226
  get when() {
10979
11227
  return mcpTokenMessage();
10980
11228
  },
10981
11229
  children: (message) => (() => {
10982
- var _el$64 = _tmpl$23();
10983
- insert(_el$64, message);
10984
- return _el$64;
11230
+ var _el$70 = _tmpl$24();
11231
+ insert(_el$70, message);
11232
+ return _el$70;
10985
11233
  })()
10986
11234
  }), null);
10987
- insert(_el$41, createComponent(Show, {
11235
+ insert(_el$47, createComponent(Show, {
10988
11236
  get when() {
10989
11237
  return props.premiumActive();
10990
11238
  },
10991
11239
  get fallback() {
10992
- return _tmpl$24();
11240
+ return _tmpl$25();
10993
11241
  },
10994
11242
  get children() {
10995
- var _el$43 = _tmpl$13$1();
10996
- _el$43.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
10997
- createRenderEffect(() => _el$43.value = props.maxToolIterations());
10998
- return _el$43;
11243
+ var _el$49 = _tmpl$15$1();
11244
+ _el$49.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
11245
+ createRenderEffect(() => _el$49.value = props.maxToolIterations());
11246
+ return _el$49;
10999
11247
  }
11000
- }), _el$44);
11001
- insert(_el$44, createComponent(Show, {
11248
+ }), _el$50);
11249
+ insert(_el$50, createComponent(Show, {
11002
11250
  get when() {
11003
11251
  return props.premiumActive();
11004
11252
  },
11005
11253
  fallback: "Free tier: 50 tool calls per conversation turn. Upgrade to Vessel Premium to customize this limit (up to 1,000).",
11006
11254
  children: "Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000."
11007
11255
  }));
11008
- _el$47.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
11256
+ _el$53.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
11009
11257
  insert(_el$, createComponent(Show, {
11010
11258
  get when() {
11011
11259
  return props.health();
11012
11260
  },
11013
11261
  children: (currentHealth) => (() => {
11014
- var _el$66 = _tmpl$26(), _el$67 = _el$66.firstChild, _el$68 = _el$67.nextSibling, _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
11015
- _el$70.nextSibling;
11016
- insert(_el$70, () => currentHealth().mcp.status);
11017
- insert(_el$68, () => currentHealth().mcp.message, null);
11018
- insert(_el$66, createComponent(Show, {
11262
+ var _el$72 = _tmpl$27(), _el$73 = _el$72.firstChild, _el$74 = _el$73.nextSibling, _el$75 = _el$74.firstChild, _el$76 = _el$75.nextSibling;
11263
+ _el$76.nextSibling;
11264
+ insert(_el$76, () => currentHealth().mcp.status);
11265
+ insert(_el$74, () => currentHealth().mcp.message, null);
11266
+ insert(_el$72, createComponent(Show, {
11019
11267
  get when() {
11020
11268
  return currentHealth().mcp.endpoint;
11021
11269
  },
11022
11270
  children: (endpoint) => (() => {
11023
- var _el$73 = _tmpl$27(), _el$74 = _el$73.firstChild, _el$75 = _el$74.nextSibling;
11024
- insert(_el$75, endpoint);
11025
- return _el$73;
11271
+ var _el$79 = _tmpl$28(), _el$80 = _el$79.firstChild, _el$81 = _el$80.nextSibling;
11272
+ insert(_el$81, endpoint);
11273
+ return _el$79;
11026
11274
  })()
11027
11275
  }), null);
11028
- insert(_el$66, createComponent(Show, {
11276
+ insert(_el$72, createComponent(Show, {
11029
11277
  get when() {
11030
11278
  return currentHealth().startupIssues.length > 0;
11031
11279
  },
11032
11280
  get children() {
11033
- var _el$72 = _tmpl$25();
11034
- insert(_el$72, () => currentHealth().startupIssues.map((issue) => (() => {
11035
- var _el$76 = _tmpl$28(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
11036
- insert(_el$77, () => issue.title);
11037
- insert(_el$78, () => issue.detail);
11038
- insert(_el$76, createComponent(Show, {
11281
+ var _el$78 = _tmpl$26();
11282
+ insert(_el$78, () => currentHealth().startupIssues.map((issue) => (() => {
11283
+ var _el$82 = _tmpl$29(), _el$83 = _el$82.firstChild, _el$84 = _el$83.nextSibling;
11284
+ insert(_el$83, () => issue.title);
11285
+ insert(_el$84, () => issue.detail);
11286
+ insert(_el$82, createComponent(Show, {
11039
11287
  get when() {
11040
11288
  return issue.action;
11041
11289
  },
11042
11290
  children: (action) => (() => {
11043
- var _el$79 = _tmpl$17();
11044
- insert(_el$79, action);
11045
- return _el$79;
11291
+ var _el$85 = _tmpl$19();
11292
+ insert(_el$85, action);
11293
+ return _el$85;
11046
11294
  })()
11047
11295
  }), null);
11048
11296
  createRenderEffect((_p$) => {
11049
11297
  var _v$3 = !!(issue.severity === "warning"), _v$4 = !!(issue.severity === "error");
11050
- _v$3 !== _p$.e && _el$76.classList.toggle("warning", _p$.e = _v$3);
11051
- _v$4 !== _p$.t && _el$76.classList.toggle("error", _p$.t = _v$4);
11298
+ _v$3 !== _p$.e && _el$82.classList.toggle("warning", _p$.e = _v$3);
11299
+ _v$4 !== _p$.t && _el$82.classList.toggle("error", _p$.t = _v$4);
11052
11300
  return _p$;
11053
11301
  }, {
11054
11302
  e: void 0,
11055
11303
  t: void 0
11056
11304
  });
11057
- return _el$76;
11305
+ return _el$82;
11058
11306
  })()));
11059
- return _el$72;
11307
+ return _el$78;
11060
11308
  }
11061
11309
  }), null);
11062
- return _el$66;
11310
+ return _el$72;
11063
11311
  })()
11064
- }), _el$48);
11065
- _el$50.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
11066
- setAttribute(_el$50, "spellcheck", false);
11312
+ }), _el$54);
11313
+ _el$56.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
11314
+ setAttribute(_el$56, "spellcheck", false);
11067
11315
  createRenderEffect((_p$) => {
11068
11316
  var _v$ = !!props.chat.enabled(), _v$2 = props.chat.enabled();
11069
- _v$ !== _p$.e && _el$5.classList.toggle("on", _p$.e = _v$);
11070
- _v$2 !== _p$.t && setAttribute(_el$5, "aria-checked", _p$.t = _v$2);
11317
+ _v$ !== _p$.e && _el$1.classList.toggle("on", _p$.e = _v$);
11318
+ _v$2 !== _p$.t && setAttribute(_el$1, "aria-checked", _p$.t = _v$2);
11071
11319
  return _p$;
11072
11320
  }, {
11073
11321
  e: void 0,
11074
11322
  t: void 0
11075
11323
  });
11076
- createRenderEffect(() => _el$37.value = props.mcpPort());
11077
- createRenderEffect(() => _el$47.value = props.agentTranscriptMode());
11078
- createRenderEffect(() => _el$50.value = props.obsidianVaultPath());
11324
+ createRenderEffect(() => _el$43.value = props.mcpPort());
11325
+ createRenderEffect(() => _el$53.value = props.agentTranscriptMode());
11326
+ createRenderEffect(() => _el$56.value = props.obsidianVaultPath());
11079
11327
  return _el$;
11080
11328
  })();
11081
11329
  };
11082
11330
  delegateEvents(["click", "input"]);
11083
- var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Store credentials for agent-driven logins. Credentials are encrypted at rest and never sent to AI providers — they are filled directly into login forms with your consent.`), _tmpl$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$4 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Label (e.g. Work GitHub)"><input class=settings-input placeholder="Domain pattern (e.g. github.com, *.aws.amazon.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><input class=settings-input placeholder="TOTP secret (optional, base32)"><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Credential</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$6$4 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Save login credentials for any website. Passwords are encrypted locally and filled directly into login forms. The agent can list and fill them with your consent, but passwords are never sent to AI providers.`), _tmpl$7$3 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Password`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Title (e.g. GitHub Personal)"><input class=settings-input placeholder="URL (e.g. https://github.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><select class=settings-input><option value=login>Login</option><option value=credit_card>Credit Card</option><option value=identity>Identity</option><option value=secure_note>Secure Note</option></select><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Password</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$9 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$0 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-field><label class=settings-label>Passwords</label></div><div class=settings-field><label class=settings-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`), _tmpl$12 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Your personal password manager. Save, organize, and autofill login credentials. Upgrade to Premium to unlock Passwords.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove password">&times;`), _tmpl$15 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">&times;`);
11331
+ var _tmpl$$6 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$2$6 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Store credentials for agent-driven logins. Credentials are encrypted at rest and never sent to AI providers — they are filled directly into login forms with your consent.`), _tmpl$3$5 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$5 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$5$4 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Label (e.g. Work GitHub)"><input class=settings-input placeholder="Domain pattern (e.g. github.com, *.aws.amazon.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><input class=settings-input placeholder="TOTP secret (optional, base32)"><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Credential</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$6$4 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Save login credentials for any website. Passwords are encrypted locally and filled directly into login forms. The agent can list and fill them with your consent, but passwords are never sent to AI providers.`), _tmpl$7$3 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Password`), _tmpl$8$2 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Title (e.g. GitHub Personal)"><input class=settings-input placeholder="URL (e.g. https://github.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><select class=settings-input><option value=login>Login</option><option value=credit_card>Credit Card</option><option value=identity>Identity</option><option value=secure_note>Secure Note</option></select><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Password</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$9$1 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$0 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-field><label class=settings-label>Passwords</label></div><div class=settings-field><label class=settings-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`), _tmpl$12 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Your personal password manager. Save, organize, and autofill login credentials. Upgrade to Premium to unlock Passwords.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove password">&times;`), _tmpl$15 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">&times;`);
11084
11332
  const SettingsVaults = (props) => {
11085
11333
  const v = props.vault;
11086
11334
  const h = props.humanVault;
@@ -11359,7 +11607,7 @@ const SettingsVaults = (props) => {
11359
11607
  return !a.adding();
11360
11608
  },
11361
11609
  get children() {
11362
- var _el$38 = _tmpl$9();
11610
+ var _el$38 = _tmpl$9$1();
11363
11611
  _el$38.$$click = () => {
11364
11612
  a.setAdding(true);
11365
11613
  };
@@ -11515,22 +11763,96 @@ const SettingsPrivacy = (props) => {
11515
11763
  })();
11516
11764
  };
11517
11765
  delegateEvents(["input", "click"]);
11518
- var _tmpl$$4 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$2$4 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$3$3 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-field><label class=settings-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current`), _tmpl$4$3 = /* @__PURE__ */ template(`<div class=premium-activate-row><input class="settings-input premium-email-input"inputmode=numeric maxlength=6 placeholder="Enter 6-digit code"><button class="premium-btn premium-btn-activate">`), _tmpl$5$2 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$6$2 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">`), _tmpl$7$2 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; <!> cookies &middot; <!> domains</span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Restore this session (replaces current tabs and cookies)"style="padding:2px 10px;font-size:12px">Load</button><button class=vault-entry-remove title="Delete session">&times;`);
11766
+ var _tmpl$$4 = /* @__PURE__ */ template(`<div class=settings-feedback-form><input class=settings-input type=email placeholder="Your reply email"><textarea class="settings-textarea settings-feedback-textarea"placeholder="Tell us what happened, what you expected, or what would make Vessel better."></textarea><div class=settings-inline-actions><button class=settings-secondary-btn>`), _tmpl$2$4 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$3$3 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$4$3 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Support</label><div class=settings-inline-actions><button class=settings-secondary-btn></button></div></div><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-field><label class=settings-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current`), _tmpl$5$2 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$6$2 = /* @__PURE__ */ template(`<div class=premium-activate-row><input class="settings-input premium-email-input"inputmode=numeric maxlength=6 placeholder="Enter 6-digit code"><button class="premium-btn premium-btn-activate">`), _tmpl$7$2 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">`), _tmpl$9 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; <!> cookies &middot; <!> domains</span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Restore this session (replaces current tabs and cookies)"style="padding:2px 10px;font-size:12px">Load</button><button class=vault-entry-remove title="Delete session">&times;`);
11519
11767
  const SettingsAccount = (props) => {
11520
11768
  const p = props.premium;
11521
11769
  const s = props.sessions;
11770
+ const [feedbackExpanded, setFeedbackExpanded] = createSignal(false);
11771
+ const [feedbackEmail, setFeedbackEmail] = createSignal(p.state().email || "");
11772
+ const [feedbackMessage, setFeedbackMessage] = createSignal("");
11773
+ const [feedbackSending, setFeedbackSending] = createSignal(false);
11774
+ const [feedbackStatus, setFeedbackStatus] = createSignal(null);
11775
+ const handleSubmitFeedback = async () => {
11776
+ setFeedbackSending(true);
11777
+ setFeedbackStatus(null);
11778
+ try {
11779
+ const result = await window.vessel.support.submitFeedback(feedbackEmail(), feedbackMessage());
11780
+ if (result.ok) {
11781
+ setFeedbackMessage("");
11782
+ setFeedbackExpanded(false);
11783
+ setFeedbackStatus({
11784
+ kind: "success",
11785
+ text: "Feedback sent. Thank you."
11786
+ });
11787
+ return;
11788
+ }
11789
+ setFeedbackStatus({
11790
+ kind: "error",
11791
+ text: result.error || "Could not send feedback."
11792
+ });
11793
+ } finally {
11794
+ setFeedbackSending(false);
11795
+ }
11796
+ };
11522
11797
  return (() => {
11523
- var _el$ = _tmpl$3$3(), _el$2 = _el$.firstChild;
11524
- _el$2.firstChild;
11525
- var _el$1 = _el$2.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
11798
+ var _el$ = _tmpl$4$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$1 = _el$2.nextSibling;
11799
+ _el$1.firstChild;
11800
+ var _el$18 = _el$1.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling;
11801
+ _el$5.$$click = () => {
11802
+ setFeedbackExpanded(!feedbackExpanded());
11803
+ setFeedbackStatus(null);
11804
+ };
11805
+ insert(_el$5, () => feedbackExpanded() ? "Cancel" : "Submit Feedback");
11806
+ insert(_el$2, createComponent(Show, {
11807
+ get when() {
11808
+ return feedbackExpanded();
11809
+ },
11810
+ get children() {
11811
+ var _el$6 = _tmpl$$4(), _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.firstChild;
11812
+ _el$7.$$input = (event) => {
11813
+ setFeedbackEmail(event.currentTarget.value);
11814
+ setFeedbackStatus(null);
11815
+ };
11816
+ setAttribute(_el$7, "spellcheck", false);
11817
+ _el$8.$$input = (event) => {
11818
+ setFeedbackMessage(event.currentTarget.value);
11819
+ setFeedbackStatus(null);
11820
+ };
11821
+ _el$0.$$click = handleSubmitFeedback;
11822
+ insert(_el$0, () => feedbackSending() ? "Sending..." : "Send Feedback");
11823
+ createRenderEffect(() => _el$0.disabled = feedbackSending() || !feedbackEmail().trim() || !feedbackMessage().trim());
11824
+ createRenderEffect(() => _el$7.value = feedbackEmail());
11825
+ createRenderEffect(() => _el$8.value = feedbackMessage());
11826
+ return _el$6;
11827
+ }
11828
+ }), null);
11526
11829
  insert(_el$2, createComponent(Show, {
11830
+ get when() {
11831
+ return feedbackStatus();
11832
+ },
11833
+ children: (status) => (() => {
11834
+ var _el$25 = _tmpl$5$2();
11835
+ insert(_el$25, () => status().text);
11836
+ createRenderEffect((_p$) => {
11837
+ var _v$ = !!(status().kind === "success"), _v$2 = !!(status().kind === "error");
11838
+ _v$ !== _p$.e && _el$25.classList.toggle("success", _p$.e = _v$);
11839
+ _v$2 !== _p$.t && _el$25.classList.toggle("error", _p$.t = _v$2);
11840
+ return _p$;
11841
+ }, {
11842
+ e: void 0,
11843
+ t: void 0
11844
+ });
11845
+ return _el$25;
11846
+ })()
11847
+ }), null);
11848
+ insert(_el$1, createComponent(Show, {
11527
11849
  get when() {
11528
11850
  return p.active();
11529
11851
  },
11530
11852
  get fallback() {
11531
11853
  return (() => {
11532
- var _el$16 = _tmpl$6$2(), _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$24 = _el$18.nextSibling;
11533
- _el$19.$$input = (e) => {
11854
+ var _el$26 = _tmpl$8$1(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$34 = _el$28.nextSibling;
11855
+ _el$29.$$input = (e) => {
11534
11856
  const nextEmail = e.currentTarget.value;
11535
11857
  if (nextEmail.trim().toLowerCase() !== p.email().trim().toLowerCase()) {
11536
11858
  p.resetFlow();
@@ -11538,8 +11860,8 @@ const SettingsAccount = (props) => {
11538
11860
  }
11539
11861
  p.setEmail(nextEmail);
11540
11862
  };
11541
- setAttribute(_el$19, "spellcheck", false);
11542
- _el$20.$$click = async () => {
11863
+ setAttribute(_el$29, "spellcheck", false);
11864
+ _el$30.$$click = async () => {
11543
11865
  p.setLoading(true);
11544
11866
  p.setMessage(null);
11545
11867
  try {
@@ -11568,23 +11890,23 @@ const SettingsAccount = (props) => {
11568
11890
  p.setLoading(false);
11569
11891
  }
11570
11892
  };
11571
- insert(_el$20, (() => {
11893
+ insert(_el$30, (() => {
11572
11894
  var _c$ = memo(() => !!p.loading());
11573
11895
  return () => _c$() ? "Sending..." : p.codeSent() ? "Resend Code" : "Send Code";
11574
11896
  })());
11575
- insert(_el$16, createComponent(Show, {
11897
+ insert(_el$26, createComponent(Show, {
11576
11898
  get when() {
11577
11899
  return p.codeSent();
11578
11900
  },
11579
11901
  get children() {
11580
- var _el$21 = _tmpl$4$3(), _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling;
11581
- _el$22.$$input = (e) => {
11902
+ var _el$31 = _tmpl$6$2(), _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling;
11903
+ _el$32.$$input = (e) => {
11582
11904
  const nextCode = e.currentTarget.value.replace(/\D+/g, "").slice(0, 6);
11583
11905
  p.setCode(nextCode);
11584
11906
  p.setMessage(null);
11585
11907
  };
11586
- setAttribute(_el$22, "spellcheck", false);
11587
- _el$23.$$click = async () => {
11908
+ setAttribute(_el$32, "spellcheck", false);
11909
+ _el$33.$$click = async () => {
11588
11910
  p.setLoading(true);
11589
11911
  p.setMessage(null);
11590
11912
  try {
@@ -11611,69 +11933,69 @@ const SettingsAccount = (props) => {
11611
11933
  p.setLoading(false);
11612
11934
  }
11613
11935
  };
11614
- insert(_el$23, () => p.loading() ? "Verifying..." : "Verify Code");
11615
- createRenderEffect(() => _el$23.disabled = p.loading() || !p.email().trim() || p.code().trim().length !== 6 || !p.challengeToken());
11616
- createRenderEffect(() => _el$22.value = p.code());
11617
- return _el$21;
11936
+ insert(_el$33, () => p.loading() ? "Verifying..." : "Verify Code");
11937
+ createRenderEffect(() => _el$33.disabled = p.loading() || !p.email().trim() || p.code().trim().length !== 6 || !p.challengeToken());
11938
+ createRenderEffect(() => _el$32.value = p.code());
11939
+ return _el$31;
11618
11940
  }
11619
- }), _el$24);
11620
- _el$24.$$click = () => {
11941
+ }), _el$34);
11942
+ _el$34.$$click = () => {
11621
11943
  p.startCheckout();
11622
11944
  };
11623
- insert(_el$24, () => p.loading() ? "Opening Checkout..." : "Subscribe to Premium — $5.99/mo after 7-day free trial");
11624
- insert(_el$16, createComponent(Show, {
11945
+ insert(_el$34, () => p.loading() ? "Opening Checkout..." : "Subscribe to Premium — $5.99/mo after 7-day free trial");
11946
+ insert(_el$26, createComponent(Show, {
11625
11947
  get when() {
11626
11948
  return p.message();
11627
11949
  },
11628
11950
  children: (msg) => (() => {
11629
- var _el$26 = _tmpl$7$2();
11630
- insert(_el$26, () => msg().text);
11951
+ var _el$36 = _tmpl$5$2();
11952
+ insert(_el$36, () => msg().text);
11631
11953
  createRenderEffect((_p$) => {
11632
- var _v$3 = !!(msg().kind === "success"), _v$4 = !!(msg().kind === "error");
11633
- _v$3 !== _p$.e && _el$26.classList.toggle("success", _p$.e = _v$3);
11634
- _v$4 !== _p$.t && _el$26.classList.toggle("error", _p$.t = _v$4);
11954
+ var _v$5 = !!(msg().kind === "success"), _v$6 = !!(msg().kind === "error");
11955
+ _v$5 !== _p$.e && _el$36.classList.toggle("success", _p$.e = _v$5);
11956
+ _v$6 !== _p$.t && _el$36.classList.toggle("error", _p$.t = _v$6);
11635
11957
  return _p$;
11636
11958
  }, {
11637
11959
  e: void 0,
11638
11960
  t: void 0
11639
11961
  });
11640
- return _el$26;
11962
+ return _el$36;
11641
11963
  })()
11642
11964
  }), null);
11643
- insert(_el$16, createComponent(Show, {
11965
+ insert(_el$26, createComponent(Show, {
11644
11966
  get when() {
11645
11967
  return p.state().email || p.email();
11646
11968
  },
11647
11969
  get children() {
11648
- var _el$25 = _tmpl$5$2();
11649
- _el$25.$$click = async () => {
11970
+ var _el$35 = _tmpl$7$2();
11971
+ _el$35.$$click = async () => {
11650
11972
  const nextState = await window.vessel.premium.reset();
11651
11973
  p.setState(nextState);
11652
11974
  p.setEmail("");
11653
11975
  p.resetFlow();
11654
11976
  p.setMessage(null);
11655
11977
  };
11656
- return _el$25;
11978
+ return _el$35;
11657
11979
  }
11658
11980
  }), null);
11659
11981
  createRenderEffect((_p$) => {
11660
- var _v$ = p.loading() || !p.email().trim(), _v$2 = p.loading();
11661
- _v$ !== _p$.e && (_el$20.disabled = _p$.e = _v$);
11662
- _v$2 !== _p$.t && (_el$24.disabled = _p$.t = _v$2);
11982
+ var _v$3 = p.loading() || !p.email().trim(), _v$4 = p.loading();
11983
+ _v$3 !== _p$.e && (_el$30.disabled = _p$.e = _v$3);
11984
+ _v$4 !== _p$.t && (_el$34.disabled = _p$.t = _v$4);
11663
11985
  return _p$;
11664
11986
  }, {
11665
11987
  e: void 0,
11666
11988
  t: void 0
11667
11989
  });
11668
- createRenderEffect(() => _el$19.value = p.email());
11669
- return _el$16;
11990
+ createRenderEffect(() => _el$29.value = p.email());
11991
+ return _el$26;
11670
11992
  })();
11671
11993
  },
11672
11994
  get children() {
11673
- var _el$4 = _tmpl$$4(), _el$5 = _el$4.firstChild;
11674
- _el$5.firstChild;
11675
- var _el$7 = _el$5.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling;
11676
- insert(_el$5, createComponent(Show, {
11995
+ var _el$11 = _tmpl$2$4(), _el$12 = _el$11.firstChild;
11996
+ _el$12.firstChild;
11997
+ var _el$14 = _el$12.nextSibling, _el$15 = _el$14.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
11998
+ insert(_el$12, createComponent(Show, {
11677
11999
  get when() {
11678
12000
  return p.state().status === "trialing";
11679
12001
  },
@@ -11681,8 +12003,8 @@ const SettingsAccount = (props) => {
11681
12003
  return [" ", "(Trial)"];
11682
12004
  }
11683
12005
  }), null);
11684
- insert(_el$7, () => p.state().email, null);
11685
- insert(_el$7, createComponent(Show, {
12006
+ insert(_el$14, () => p.state().email, null);
12007
+ insert(_el$14, createComponent(Show, {
11686
12008
  get when() {
11687
12009
  return p.state().expiresAt;
11688
12010
  },
@@ -11690,7 +12012,7 @@ const SettingsAccount = (props) => {
11690
12012
  return [" ", "· Renews", " ", memo(() => new Date(p.state().expiresAt).toLocaleDateString())];
11691
12013
  }
11692
12014
  }), null);
11693
- _el$9.$$click = async () => {
12015
+ _el$16.$$click = async () => {
11694
12016
  const result = await window.vessel.premium.portal();
11695
12017
  if (!result.ok) {
11696
12018
  p.setMessage({
@@ -11700,38 +12022,38 @@ const SettingsAccount = (props) => {
11700
12022
  setTimeout(() => p.setMessage(null), 5e3);
11701
12023
  }
11702
12024
  };
11703
- _el$0.$$click = async () => {
12025
+ _el$17.$$click = async () => {
11704
12026
  const nextState = await window.vessel.premium.reset();
11705
12027
  p.setState(nextState);
11706
12028
  p.setEmail("");
11707
12029
  p.resetFlow();
11708
12030
  p.setMessage(null);
11709
12031
  };
11710
- insert(_el$4, createComponent(Show, {
12032
+ insert(_el$11, createComponent(Show, {
11711
12033
  get when() {
11712
12034
  return p.message();
11713
12035
  },
11714
12036
  children: (msg) => (() => {
11715
- var _el$27 = _tmpl$7$2();
11716
- insert(_el$27, () => msg().text);
12037
+ var _el$37 = _tmpl$5$2();
12038
+ insert(_el$37, () => msg().text);
11717
12039
  createRenderEffect((_p$) => {
11718
- var _v$5 = !!(msg().kind === "success"), _v$6 = !!(msg().kind === "error");
11719
- _v$5 !== _p$.e && _el$27.classList.toggle("success", _p$.e = _v$5);
11720
- _v$6 !== _p$.t && _el$27.classList.toggle("error", _p$.t = _v$6);
12040
+ var _v$7 = !!(msg().kind === "success"), _v$8 = !!(msg().kind === "error");
12041
+ _v$7 !== _p$.e && _el$37.classList.toggle("success", _p$.e = _v$7);
12042
+ _v$8 !== _p$.t && _el$37.classList.toggle("error", _p$.t = _v$8);
11721
12043
  return _p$;
11722
12044
  }, {
11723
12045
  e: void 0,
11724
12046
  t: void 0
11725
12047
  });
11726
- return _el$27;
12048
+ return _el$37;
11727
12049
  })()
11728
12050
  }), null);
11729
- return _el$4;
12051
+ return _el$11;
11730
12052
  }
11731
12053
  }), null);
11732
- _el$13.$$input = (e) => s.setSaveName(e.currentTarget.value);
11733
- setAttribute(_el$13, "spellcheck", false);
11734
- _el$14.$$click = async () => {
12054
+ _el$22.$$input = (e) => s.setSaveName(e.currentTarget.value);
12055
+ setAttribute(_el$22, "spellcheck", false);
12056
+ _el$23.$$click = async () => {
11735
12057
  try {
11736
12058
  await window.vessel.sessions.save(s.saveName().trim());
11737
12059
  s.setSaveName("");
@@ -11748,25 +12070,25 @@ const SettingsAccount = (props) => {
11748
12070
  });
11749
12071
  }
11750
12072
  };
11751
- insert(_el$1, createComponent(Show, {
12073
+ insert(_el$18, createComponent(Show, {
11752
12074
  get when() {
11753
12075
  return s.list().length > 0;
11754
12076
  },
11755
12077
  get children() {
11756
- var _el$15 = _tmpl$2$4();
11757
- insert(_el$15, createComponent(For, {
12078
+ var _el$24 = _tmpl$3$3();
12079
+ insert(_el$24, createComponent(For, {
11758
12080
  get each() {
11759
12081
  return s.list();
11760
12082
  },
11761
12083
  children: (session) => (() => {
11762
- var _el$28 = _tmpl$8$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild, _el$31 = _el$30.nextSibling, _el$32 = _el$31.firstChild, _el$38 = _el$32.nextSibling, _el$34 = _el$38.nextSibling, _el$39 = _el$34.nextSibling;
11763
- _el$39.nextSibling;
11764
- var _el$40 = _el$29.nextSibling, _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling;
11765
- insert(_el$30, () => session.name);
11766
- insert(_el$31, () => new Date(session.updatedAt).toLocaleDateString(), _el$32);
11767
- insert(_el$31, () => session.cookieCount, _el$38);
11768
- insert(_el$31, () => session.domains.length, _el$39);
11769
- _el$41.$$click = async () => {
12084
+ var _el$38 = _tmpl$9(), _el$39 = _el$38.firstChild, _el$40 = _el$39.firstChild, _el$41 = _el$40.nextSibling, _el$42 = _el$41.firstChild, _el$48 = _el$42.nextSibling, _el$44 = _el$48.nextSibling, _el$49 = _el$44.nextSibling;
12085
+ _el$49.nextSibling;
12086
+ var _el$50 = _el$39.nextSibling, _el$51 = _el$50.firstChild, _el$52 = _el$51.nextSibling;
12087
+ insert(_el$40, () => session.name);
12088
+ insert(_el$41, () => new Date(session.updatedAt).toLocaleDateString(), _el$42);
12089
+ insert(_el$41, () => session.cookieCount, _el$48);
12090
+ insert(_el$41, () => session.domains.length, _el$49);
12091
+ _el$51.$$click = async () => {
11770
12092
  try {
11771
12093
  await window.vessel.sessions.load(session.name);
11772
12094
  props.setStatus({
@@ -11781,18 +12103,18 @@ const SettingsAccount = (props) => {
11781
12103
  });
11782
12104
  }
11783
12105
  };
11784
- _el$42.$$click = async () => {
12106
+ _el$52.$$click = async () => {
11785
12107
  await window.vessel.sessions.delete(session.name);
11786
12108
  await s.loadList();
11787
12109
  };
11788
- return _el$28;
12110
+ return _el$38;
11789
12111
  })()
11790
12112
  }));
11791
- return _el$15;
12113
+ return _el$24;
11792
12114
  }
11793
12115
  }), null);
11794
- createRenderEffect(() => _el$14.disabled = !s.saveName().trim());
11795
- createRenderEffect(() => _el$13.value = s.saveName());
12116
+ createRenderEffect(() => _el$23.disabled = !s.saveName().trim());
12117
+ createRenderEffect(() => _el$22.value = s.saveName());
11796
12118
  return _el$;
11797
12119
  })();
11798
12120
  };
@@ -12084,6 +12406,10 @@ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><spa
12084
12406
  box-sizing: border-box;
12085
12407
  line-height: 1.5;
12086
12408
  }
12409
+ .settings-feedback-textarea {
12410
+ margin-top: 8px;
12411
+ min-height: 96px;
12412
+ }
12087
12413
  .settings-input:focus,
12088
12414
  .settings-textarea:focus {
12089
12415
  outline: none;
@@ -12847,7 +13173,7 @@ const Settings = () => {
12847
13173
  setPremiumCodeSent(false);
12848
13174
  };
12849
13175
  const [chatEnabled, setChatEnabled] = createSignal(false);
12850
- const [chatProviderId, setChatProviderId] = createSignal("anthropic");
13176
+ const [chatProviderId, setChatProviderId] = createSignal("openrouter");
12851
13177
  const [chatApiKey, setChatApiKey] = createSignal("");
12852
13178
  const [chatHasStoredApiKey, setChatHasStoredApiKey] = createSignal(false);
12853
13179
  const [chatModel, setChatModel] = createSignal("");
@@ -12858,9 +13184,24 @@ const Settings = () => {
12858
13184
  const [providerModels, setProviderModels] = createSignal([]);
12859
13185
  const [modelFetchState, setModelFetchState] = createSignal("idle");
12860
13186
  const [modelFetchWarning, setModelFetchWarning] = createSignal(null);
12861
- const [codexAuthStatus, setCodexAuthStatus] = createSignal("idle");
12862
- const [codexAccountEmail, setCodexAccountEmail] = createSignal("");
12863
- const [codexAuthError, setCodexAuthError] = createSignal("");
13187
+ const providerAuth = useProviderAuthSetup({
13188
+ onCodexConnected: () => {
13189
+ setChatHasStoredApiKey(true);
13190
+ },
13191
+ onCodexDisconnected: () => {
13192
+ setChatHasStoredApiKey(false);
13193
+ },
13194
+ onOpenRouterConnected: async (result) => {
13195
+ setChatEnabled(true);
13196
+ setChatProviderId("openrouter");
13197
+ setChatApiKey("");
13198
+ setChatHasStoredApiKey(true);
13199
+ setChatModel(result.model || PROVIDERS.openrouter.defaultModel);
13200
+ setChatBaseUrl(PROVIDERS.openrouter.defaultBaseUrl);
13201
+ setChatReasoningEffort("off");
13202
+ await loadState();
13203
+ }
13204
+ });
12864
13205
  const resetProviderModels = () => {
12865
13206
  setProviderModels([]);
12866
13207
  setModelFetchState("idle");
@@ -12905,30 +13246,6 @@ const Settings = () => {
12905
13246
  setModelFetchState("error");
12906
13247
  });
12907
13248
  };
12908
- const startCodexAuth = async () => {
12909
- setCodexAuthStatus("waiting");
12910
- setCodexAuthError("");
12911
- try {
12912
- const result = await window.vessel.codex.startAuth();
12913
- if (result.ok) {
12914
- setCodexAccountEmail(result.accountEmail);
12915
- setCodexAuthStatus("connected");
12916
- setChatHasStoredApiKey(true);
12917
- } else {
12918
- setCodexAuthStatus("error");
12919
- setCodexAuthError(result.error);
12920
- }
12921
- } catch (err) {
12922
- setCodexAuthStatus("error");
12923
- setCodexAuthError(err instanceof Error ? err.message : "Unknown error");
12924
- }
12925
- };
12926
- const disconnectCodex = async () => {
12927
- await window.vessel.codex.disconnect();
12928
- setCodexAuthStatus("idle");
12929
- setCodexAccountEmail("");
12930
- setChatHasStoredApiKey(false);
12931
- };
12932
13249
  createEffect(() => {
12933
13250
  if (!chatEnabled()) return;
12934
13251
  const meta = chatProviderMeta();
@@ -12972,9 +13289,7 @@ const Settings = () => {
12972
13289
  setChatHasStoredApiKey(false);
12973
13290
  setChatReasoningEffort("off");
12974
13291
  }
12975
- if (cp?.id === "openai_codex" && cp.hasApiKey) {
12976
- setCodexAuthStatus("connected");
12977
- }
13292
+ providerAuth.markProviderConnected(cp?.id, cp?.hasApiKey === true);
12978
13293
  setTelemetryEnabled(settings.telemetryEnabled !== false);
12979
13294
  const dp = settings.domainPolicy ?? {
12980
13295
  allowedDomains: [],
@@ -13021,20 +13336,9 @@ const Settings = () => {
13021
13336
  });
13022
13337
  }
13023
13338
  });
13024
- const unsubCodex = window.vessel.codex.onAuthStatus((payload) => {
13025
- if (payload.status === "waiting") {
13026
- setCodexAuthStatus("waiting");
13027
- } else if (payload.status === "exchanging") {
13028
- setCodexAuthStatus("exchanging");
13029
- } else if (payload.status === "error") {
13030
- setCodexAuthStatus("error");
13031
- setCodexAuthError(payload.error || "Unknown error");
13032
- }
13033
- });
13034
13339
  onCleanup(() => {
13035
13340
  unsubscribe2();
13036
13341
  unsubscribePremium();
13037
- unsubCodex();
13038
13342
  });
13039
13343
  });
13040
13344
  createEffect(() => {
@@ -13187,34 +13491,39 @@ const Settings = () => {
13187
13491
  },
13188
13492
  get children() {
13189
13493
  return createComponent(SettingsAgent, {
13190
- chat: {
13191
- enabled: chatEnabled,
13192
- setEnabled: setChatEnabled,
13193
- providerId: chatProviderId,
13194
- setProviderId: setChatProviderId,
13195
- apiKey: chatApiKey,
13196
- setApiKey: setChatApiKey,
13197
- hasStoredApiKey: chatHasStoredApiKey,
13198
- setHasStoredApiKey: setChatHasStoredApiKey,
13199
- model: chatModel,
13200
- setModel: setChatModel,
13201
- baseUrl: chatBaseUrl,
13202
- setBaseUrl: setChatBaseUrl,
13203
- reasoningEffort: chatReasoningEffort,
13204
- setReasoningEffort: setChatReasoningEffort,
13205
- providerModels,
13206
- modelFetchState,
13207
- modelFetchWarning,
13208
- doFetchModels,
13209
- resetProviderModels,
13210
- codexAuthStatus,
13211
- codexAccountEmail,
13212
- setCodexAccountEmail,
13213
- codexAuthError,
13214
- setCodexAuthError,
13215
- providerType,
13216
- startCodexAuth,
13217
- disconnectCodex
13494
+ get chat() {
13495
+ return {
13496
+ enabled: chatEnabled,
13497
+ setEnabled: setChatEnabled,
13498
+ providerId: chatProviderId,
13499
+ setProviderId: setChatProviderId,
13500
+ apiKey: chatApiKey,
13501
+ setApiKey: setChatApiKey,
13502
+ hasStoredApiKey: chatHasStoredApiKey,
13503
+ setHasStoredApiKey: setChatHasStoredApiKey,
13504
+ model: chatModel,
13505
+ setModel: setChatModel,
13506
+ baseUrl: chatBaseUrl,
13507
+ setBaseUrl: setChatBaseUrl,
13508
+ reasoningEffort: chatReasoningEffort,
13509
+ setReasoningEffort: setChatReasoningEffort,
13510
+ providerModels,
13511
+ modelFetchState,
13512
+ modelFetchWarning,
13513
+ doFetchModels,
13514
+ resetProviderModels,
13515
+ codexAuthStatus: providerAuth.codexAuthStatus,
13516
+ codexAccountEmail: providerAuth.codexAccountEmail,
13517
+ setCodexAccountEmail: providerAuth.setCodexAccountEmail,
13518
+ codexAuthError: providerAuth.codexAuthError,
13519
+ setCodexAuthError: providerAuth.setCodexAuthError,
13520
+ openRouterAuthStatus: providerAuth.openRouterAuthStatus,
13521
+ openRouterAuthError: providerAuth.openRouterAuthError,
13522
+ providerType,
13523
+ startCodexAuth: providerAuth.startCodexAuth,
13524
+ disconnectCodex: providerAuth.disconnectCodex,
13525
+ startOpenRouterAuth: providerAuth.startOpenRouterAuth
13526
+ };
13218
13527
  },
13219
13528
  mcpPort,
13220
13529
  setMcpPort,