@quanta-intellect/vessel-browser 0.1.127 → 0.1.130

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.
@@ -2491,93 +2491,11 @@ function useRuntime() {
2491
2491
  restoreSession: () => window.vessel.ai.restoreSession()
2492
2492
  };
2493
2493
  }
2494
- function formatAgentActionName(name) {
2495
- return name.split(/[_-]+/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
2496
- }
2497
- function summarizeAgentAction(action) {
2498
- if (action.status === "waiting-approval") {
2499
- return action.argsSummary || "Waiting for approval";
2500
- }
2501
- if (action.status === "running") {
2502
- return action.argsSummary || "Running";
2503
- }
2504
- if (action.status === "failed") {
2505
- return action.error || action.resultSummary || "Action failed";
2506
- }
2507
- return action.resultSummary || action.argsSummary || "Completed";
2508
- }
2509
- function formatAgentTimelineDuration(durationMs) {
2510
- if (!durationMs || durationMs < 1) return null;
2511
- if (durationMs < 1e3) return `${Math.round(durationMs)}ms`;
2512
- return `${(durationMs / 1e3).toFixed(durationMs < 1e4 ? 1 : 0)}s`;
2513
- }
2514
- function buildAgentTimelineItems(state, limit = 12) {
2515
- const transcriptItems = state.transcript.map((entry) => ({
2516
- id: `transcript:${entry.id}`,
2517
- type: "transcript",
2518
- timestamp: entry.updatedAt,
2519
- status: entry.status,
2520
- kind: entry.kind,
2521
- label: entry.title || entry.kind,
2522
- detail: entry.text
2523
- }));
2524
- const actionItems = state.actions.map((action) => ({
2525
- id: `action:${action.id}`,
2526
- type: "action",
2527
- timestamp: action.finishedAt || action.startedAt,
2528
- status: action.status,
2529
- kind: "action",
2530
- label: formatAgentActionName(action.name),
2531
- detail: summarizeAgentAction(action),
2532
- durationMs: action.durationMs
2533
- }));
2534
- return [...transcriptItems, ...actionItems].sort(
2535
- (left, right) => new Date(right.timestamp).getTime() - new Date(left.timestamp).getTime()
2536
- ).slice(0, limit);
2537
- }
2538
- function isLiveAgentTimelineItem(item) {
2539
- return item.status === "streaming" || item.status === "running";
2540
- }
2541
2494
  const AGENT_ACTIVITY_WINDOW_MS = 6e3;
2542
- const AGENT_RECENT_WINDOW_MS = 3e4;
2543
2495
  const AGENT_RUNNING_STALE_WINDOW_MS = 5 * 6e4;
2544
2496
  function isAgentActionSource(source) {
2545
2497
  return source === "ai" || source === "mcp";
2546
2498
  }
2547
- function isAgentTranscriptActive(entry, currentTime) {
2548
- if (!isAgentActionSource(entry.source)) return false;
2549
- if (entry.status === "streaming") {
2550
- const updatedAt2 = new Date(entry.updatedAt).getTime();
2551
- if (Number.isNaN(updatedAt2)) return true;
2552
- return currentTime - updatedAt2 < AGENT_ACTIVITY_WINDOW_MS;
2553
- }
2554
- const updatedAt = new Date(entry.updatedAt).getTime();
2555
- if (Number.isNaN(updatedAt)) return false;
2556
- return currentTime - updatedAt < AGENT_ACTIVITY_WINDOW_MS;
2557
- }
2558
- function summarizeTranscriptText(entry) {
2559
- const raw = `${entry.title ? `${entry.title}: ` : ""}${entry.text}`.trim();
2560
- const singleLine = raw.replace(/\s+/g, " ").trim();
2561
- return singleLine.length > 96 ? `${singleLine.slice(0, 93).trimEnd()}...` : singleLine;
2562
- }
2563
- function summarizeActionText(action) {
2564
- const name = formatAgentActionName(action.name);
2565
- if (action.status === "running") {
2566
- return `${name} in progress`;
2567
- }
2568
- if (action.status === "waiting-approval") {
2569
- return `${name} waiting for approval`;
2570
- }
2571
- if (action.status === "completed" && action.resultSummary) {
2572
- const singleLine = action.resultSummary.replace(/\s+/g, " ").trim();
2573
- return singleLine.length > 96 ? `${singleLine.slice(0, 93).trimEnd()}...` : singleLine;
2574
- }
2575
- if (action.status === "failed" && action.error) {
2576
- const singleLine = action.error.replace(/\s+/g, " ").trim();
2577
- return `${name} failed: ${singleLine.length > 72 ? `${singleLine.slice(0, 69).trimEnd()}...` : singleLine}`;
2578
- }
2579
- return name;
2580
- }
2581
2499
  function isAgentActionActive(action, currentTime) {
2582
2500
  if (!isAgentActionSource(action.source)) return false;
2583
2501
  if (action.status === "waiting-approval") {
@@ -2595,9 +2513,6 @@ function isAgentActionActive(action, currentTime) {
2595
2513
  if (Number.isNaN(finishedAt)) return false;
2596
2514
  return currentTime - finishedAt < AGENT_ACTIVITY_WINDOW_MS;
2597
2515
  }
2598
- function hasRecentAgentActivity(state, currentTime = Date.now()) {
2599
- return state.actions.some((action) => isAgentActionActive(action, currentTime)) || state.transcript.some((entry) => isAgentTranscriptActive(entry, currentTime));
2600
- }
2601
2516
  function getAgentActiveTabIds(state, currentTime = Date.now()) {
2602
2517
  const activeTabIds = /* @__PURE__ */ new Set();
2603
2518
  for (const action of state.actions) {
@@ -2608,50 +2523,7 @@ function getAgentActiveTabIds(state, currentTime = Date.now()) {
2608
2523
  }
2609
2524
  return activeTabIds;
2610
2525
  }
2611
- function getLatestAgentStatusMessage(state, currentTime = Date.now()) {
2612
- const recentTranscript = [...state.transcript].filter((entry) => isAgentTranscriptActive(entry, currentTime)).sort(
2613
- (left, right) => new Date(right.updatedAt).getTime() - new Date(left.updatedAt).getTime()
2614
- )[0];
2615
- if (recentTranscript) {
2616
- const summary = summarizeTranscriptText(recentTranscript);
2617
- if (summary) return summary;
2618
- }
2619
- const recentAction = [...state.actions].filter((action) => isAgentActionActive(action, currentTime)).sort((left, right) => {
2620
- const leftTime = new Date(
2621
- left.finishedAt || left.startedAt
2622
- ).getTime();
2623
- const rightTime = new Date(
2624
- right.finishedAt || right.startedAt
2625
- ).getTime();
2626
- return rightTime - leftTime;
2627
- })[0];
2628
- return recentAction ? summarizeActionText(recentAction) : null;
2629
- }
2630
- function hasRecentActivity(state, windowMs, currentTime) {
2631
- for (const action of state.actions) {
2632
- if (!isAgentActionSource(action.source)) continue;
2633
- if (isAgentActionActive(action, currentTime)) return true;
2634
- const ts = action.finishedAt ? new Date(action.finishedAt).getTime() : new Date(action.startedAt).getTime();
2635
- if (!Number.isNaN(ts) && currentTime - ts < windowMs) return true;
2636
- }
2637
- for (const entry of state.transcript) {
2638
- if (!isAgentActionSource(entry.source)) continue;
2639
- const ts = new Date(entry.updatedAt).getTime();
2640
- if (!Number.isNaN(ts) && currentTime - ts < windowMs) return true;
2641
- }
2642
- return false;
2643
- }
2644
- function getAgentPresence(state, currentTime = Date.now()) {
2645
- if (hasRecentAgentActivity(state, currentTime)) {
2646
- return "active";
2647
- }
2648
- const mcpConnected = state.mcpStatus === "ready";
2649
- if (mcpConnected || hasRecentActivity(state, AGENT_RECENT_WINDOW_MS, currentTime)) {
2650
- return "recent";
2651
- }
2652
- return "idle";
2653
- }
2654
- var _tmpl$$r = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$q = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$m = /* @__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$m = /* @__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>`);
2526
+ var _tmpl$$r = /* @__PURE__ */ template(`<img class=tab-favicon alt>`), _tmpl$2$q = /* @__PURE__ */ template(`<span class=tab-favicon-fallback>`), _tmpl$3$m = /* @__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$h = /* @__PURE__ */ template(`<button class="tab-audio tab-audio-pinned">`), _tmpl$6$f = /* @__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$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>`);
2655
2527
  const TAB_CLOSE_MS = 200;
2656
2528
  function stringToHue(str) {
2657
2529
  let hash = 0;
@@ -2762,7 +2634,7 @@ const TabBar = () => {
2762
2634
  },
2763
2635
  get fallback() {
2764
2636
  return memo(() => entry.type === "group")() && (() => {
2765
- var _el$0 = _tmpl$4$m(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
2637
+ var _el$0 = _tmpl$4$l(), _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$10.nextSibling;
2766
2638
  _el$0.$$contextmenu = (e) => {
2767
2639
  e.preventDefault();
2768
2640
  window.vessel.tabs.showGroupContextMenu(entry.groupId);
@@ -2788,7 +2660,7 @@ const TabBar = () => {
2788
2660
  return memo(() => entry.type === "tab")() && (() => {
2789
2661
  const tab = entry.tab;
2790
2662
  return (() => {
2791
- var _el$12 = _tmpl$6$g();
2663
+ var _el$12 = _tmpl$6$f();
2792
2664
  _el$12.$$contextmenu = (e) => {
2793
2665
  e.preventDefault();
2794
2666
  window.vessel.tabs.showContextMenu(tab.id);
@@ -2813,7 +2685,7 @@ const TabBar = () => {
2813
2685
  return memo(() => !!tab.isPinned)() && (tab.isAudible || tab.isMuted);
2814
2686
  },
2815
2687
  get children() {
2816
- var _el$13 = _tmpl$5$i();
2688
+ var _el$13 = _tmpl$5$h();
2817
2689
  _el$13.$$click = (e) => {
2818
2690
  e.stopPropagation();
2819
2691
  void toggleMute(tab.id);
@@ -2840,7 +2712,7 @@ const TabBar = () => {
2840
2712
  insert(_el$12, (() => {
2841
2713
  var _c$ = memo(() => !!!tab.isPinned);
2842
2714
  return () => _c$() && [memo(() => memo(() => !!modelActiveTabIds().has(tab.id))() && _tmpl$0$7()), (() => {
2843
- var _el$14 = _tmpl$7$e();
2715
+ var _el$14 = _tmpl$7$d();
2844
2716
  insert(_el$14, () => tab.title || "New Tab");
2845
2717
  return _el$14;
2846
2718
  })(), createComponent(Show, {
@@ -2917,7 +2789,7 @@ const TabBar = () => {
2917
2789
  })();
2918
2790
  };
2919
2791
  delegateEvents(["click", "contextmenu"]);
2920
- var _tmpl$$q = /* @__PURE__ */ template(`<button class=security-popup-link>Reset permissions for this site`), _tmpl$2$p = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More</button><div class=security-popup-section><div class=security-popup-section-title>Site permissions`), _tmpl$3$l = /* @__PURE__ */ template(`<p class=security-popup-muted>No saved permission decisions for this site.`), _tmpl$4$l = /* @__PURE__ */ template(`<div class=security-popup-permission-row><span></span><strong>`), _tmpl$5$h = /* @__PURE__ */ template(`<div class=security-popup-actions><button class=security-popup-action-proceed>Proceed Anyway</button><button class=security-popup-action-back>Go Back to Safety`);
2792
+ var _tmpl$$q = /* @__PURE__ */ template(`<button class=security-popup-link>Reset permissions for this site`), _tmpl$2$p = /* @__PURE__ */ template(`<div class=security-popup><div class=security-popup-content><p class=security-popup-text></p><button class=security-popup-link>Learn More</button><div class=security-popup-section><div class=security-popup-section-title>Site permissions`), _tmpl$3$l = /* @__PURE__ */ template(`<p class=security-popup-muted>No saved permission decisions for this site.`), _tmpl$4$k = /* @__PURE__ */ template(`<div class=security-popup-permission-row><span></span><strong>`), _tmpl$5$g = /* @__PURE__ */ template(`<div class=security-popup-actions><button class=security-popup-action-proceed>Proceed Anyway</button><button class=security-popup-action-back>Go Back to Safety`);
2921
2793
  const SecurityPopup = (props) => {
2922
2794
  const statusText = () => {
2923
2795
  switch (props.state.status) {
@@ -2943,7 +2815,8 @@ const SecurityPopup = (props) => {
2943
2815
  const loadPermissions = async () => {
2944
2816
  try {
2945
2817
  setPermissions(await window.vessel.permissions.getAll());
2946
- } catch {
2818
+ } catch (err) {
2819
+ console.warn("Failed to load permissions:", err);
2947
2820
  }
2948
2821
  };
2949
2822
  const handleLearnMore = () => {
@@ -2988,7 +2861,7 @@ const SecurityPopup = (props) => {
2988
2861
  return sitePermissions();
2989
2862
  },
2990
2863
  children: (item) => (() => {
2991
- var _el$9 = _tmpl$4$l(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
2864
+ var _el$9 = _tmpl$4$k(), _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
2992
2865
  insert(_el$0, () => item.permission);
2993
2866
  insert(_el$1, () => item.decision);
2994
2867
  createRenderEffect(() => className(_el$1, item.decision));
@@ -3007,7 +2880,7 @@ const SecurityPopup = (props) => {
3007
2880
  insert(_el$2, (() => {
3008
2881
  var _c$ = memo(() => !!props.state.canProceed);
3009
2882
  return () => _c$() && (() => {
3010
- var _el$10 = _tmpl$5$h(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
2883
+ var _el$10 = _tmpl$5$g(), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling;
3011
2884
  _el$11.$$click = handleProceedAnyway;
3012
2885
  _el$12.$$click = handleGoBackToSafety;
3013
2886
  return _el$10;
@@ -3147,10 +3020,15 @@ function useHistory() {
3147
3020
  void init$3();
3148
3021
  const loadMore = async (limit = HISTORY_PAGE_SIZE) => {
3149
3022
  const current = historyState().entries;
3150
- const page = await window.vessel.history.list(current.length, limit);
3151
- setHistoryState({ entries: [...current, ...page.entries] });
3152
- setHistoryTotal(page.total);
3153
- return page;
3023
+ try {
3024
+ const page = await window.vessel.history.list(current.length, limit);
3025
+ setHistoryState({ entries: [...current, ...page.entries] });
3026
+ setHistoryTotal(page.total);
3027
+ return page;
3028
+ } catch (err) {
3029
+ logger$3.error("Failed to load more history entries:", err);
3030
+ return { entries: [], total: historyTotal() };
3031
+ }
3154
3032
  };
3155
3033
  return {
3156
3034
  historyState,
@@ -3402,7 +3280,7 @@ const SEARCH_ENGINE_PRESETS = {
3402
3280
  ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
3403
3281
  kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
3404
3282
  };
3405
- var _tmpl$$p = /* @__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$o = /* @__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$k = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></path><line x1=2 y1=12 x2=12 y2=2 stroke=currentColor stroke-width=1.5>`), _tmpl$4$k = /* @__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></span><button type=button class=agent-status-dismiss aria-label="Dismiss agent status"title=Dismiss>`), _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>`);
3283
+ var _tmpl$$p = /* @__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$o = /* @__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$k = /* @__PURE__ */ template(`<svg width=14 height=14 viewBox="0 0 14 14"fill=currentColor><path d="M7 1a4 4 0 00-4 4v2H1.5a.5.5 0 00-.5.5v5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-5a.5.5 0 00-.5-.5H11V5a4 4 0 00-4-4zm0 1a3 3 0 013 3v2H4V5a3 3 0 013-3z"></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$f = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$e = /* @__PURE__ */ template(`<button class=page-diff-trigger title="Open the What Changed timeline"><span class=page-diff-trigger-dot aria-hidden=true></span><span class=page-diff-trigger-text>What Changed?`), _tmpl$7$c = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$8$9 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$9$8 = /* @__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$0$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$1$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$10$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$11$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$12$6 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$13$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$14$5 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$15$5 = /* @__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$16$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$17$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$18$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$19$4 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$20$4 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$21$4 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$22$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$23$4 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$24$4 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$25$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$26$3 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$27$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$28$3 = /* @__PURE__ */ template(`<li>`);
3406
3284
  const AddressBar = (props) => {
3407
3285
  const {
3408
3286
  activeTab,
@@ -3438,8 +3316,6 @@ const AddressBar = (props) => {
3438
3316
  const [searchEngine, setSearchEngine] = createSignal("duckduckgo");
3439
3317
  const [showSecurityPopup, setShowSecurityPopup] = createSignal(false);
3440
3318
  const [hasEditedAddress, setHasEditedAddress] = createSignal(false);
3441
- const [dismissedAgentStatusKey, setDismissedAgentStatusKey] = createSignal(null);
3442
- const now2 = useNow();
3443
3319
  let inputRef;
3444
3320
  let addressBlurTimer = null;
3445
3321
  let skipNextAddressBlurSync = false;
@@ -3450,22 +3326,6 @@ const AddressBar = (props) => {
3450
3326
  const tabId = activeTabId2();
3451
3327
  return tabId ? getSecurityState(tabId) : void 0;
3452
3328
  });
3453
- const agentPresence = createMemo(() => getAgentPresence(runtimeState2(), now2()));
3454
- const agentStatusMessage = createMemo(() => getLatestAgentStatusMessage(runtimeState2(), now2()));
3455
- const agentStatusKey = createMemo(() => {
3456
- const message = agentStatusMessage();
3457
- if (!message) return null;
3458
- return `${agentPresence()}:${message}`;
3459
- });
3460
- const showAgentStatusBadge = createMemo(() => {
3461
- const key = agentStatusKey();
3462
- return !!key && dismissedAgentStatusKey() !== key;
3463
- });
3464
- createEffect(() => {
3465
- if (!agentStatusKey()) {
3466
- setDismissedAgentStatusKey(null);
3467
- }
3468
- });
3469
3329
  const pendingApprovalCount = createMemo(() => runtimeState2().supervisor.pendingApprovals.length);
3470
3330
  const searchEnginePreset = createMemo(() => {
3471
3331
  const engine = searchEngine();
@@ -3713,7 +3573,7 @@ const AddressBar = (props) => {
3713
3573
  };
3714
3574
  const formatSectionLabel = (section) => section === "title" ? "Title" : section === "headings" ? "Headings" : "Content";
3715
3575
  return (() => {
3716
- var _el$ = _tmpl$17$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$11 = _el$2.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$36 = _el$11.nextSibling, _el$37 = _el$36.firstChild, _el$38 = _el$37.firstChild;
3576
+ var _el$ = _tmpl$16$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$11 = _el$2.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$32 = _el$11.nextSibling, _el$33 = _el$32.firstChild, _el$34 = _el$33.firstChild;
3717
3577
  addEventListener(_el$3, "click", goBack, true);
3718
3578
  addEventListener(_el$4, "click", goForward, true);
3719
3579
  addEventListener(_el$5, "click", reload, true);
@@ -3728,14 +3588,14 @@ const AddressBar = (props) => {
3728
3588
  return memo(() => !!securityState()?.status)() && securityState()?.status !== "none";
3729
3589
  },
3730
3590
  get children() {
3731
- var _el$7 = _tmpl$4$k(), _el$8 = _el$7.firstChild;
3591
+ var _el$7 = _tmpl$4$j(), _el$8 = _el$7.firstChild;
3732
3592
  _el$8.$$click = () => setShowSecurityPopup((prev) => !prev);
3733
3593
  insert(_el$8, createComponent(Switch, {
3734
3594
  get fallback() {
3735
3595
  return (() => {
3736
- var _el$49 = _tmpl$18$4();
3737
- _el$49.firstChild;
3738
- return _el$49;
3596
+ var _el$45 = _tmpl$17$4();
3597
+ _el$45.firstChild;
3598
+ return _el$45;
3739
3599
  })();
3740
3600
  },
3741
3601
  get children() {
@@ -3813,75 +3673,49 @@ const AddressBar = (props) => {
3813
3673
  return memo(() => !!showSuggestions())() && suggestions().length > 0;
3814
3674
  },
3815
3675
  get children() {
3816
- var _el$14 = _tmpl$5$g();
3676
+ var _el$14 = _tmpl$5$f();
3817
3677
  insert(_el$14, createComponent(For, {
3818
3678
  get each() {
3819
3679
  return suggestions();
3820
3680
  },
3821
3681
  children: (item, i) => (() => {
3822
- var _el$51 = _tmpl$19$4(), _el$52 = _el$51.firstChild, _el$53 = _el$52.nextSibling, _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
3823
- _el$51.addEventListener("mouseenter", () => setSelectedIndex(i()));
3824
- _el$51.$$mousedown = (e) => {
3682
+ var _el$47 = _tmpl$18$4(), _el$48 = _el$47.firstChild, _el$49 = _el$48.nextSibling, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling;
3683
+ _el$47.addEventListener("mouseenter", () => setSelectedIndex(i()));
3684
+ _el$47.$$mousedown = (e) => {
3825
3685
  e.preventDefault();
3826
3686
  selectSuggestion(item.url);
3827
3687
  };
3828
- insert(_el$52, (() => {
3688
+ insert(_el$48, (() => {
3829
3689
  var _c$ = memo(() => item.source === "bookmark");
3830
3690
  return () => _c$() ? "★" : item.source === "search" ? "⌕" : "◌";
3831
3691
  })());
3832
- insert(_el$54, () => item.title || item.url);
3833
- insert(_el$55, () => item.subtitle || item.url);
3692
+ insert(_el$50, () => item.title || item.url);
3693
+ insert(_el$51, () => item.subtitle || item.url);
3834
3694
  createRenderEffect((_p$) => {
3835
- var _v$12 = `address-autocomplete-${i()}`, _v$13 = `autocomplete-item ${selectedIndex() === i() ? "selected" : ""}`, _v$14 = selectedIndex() === i();
3836
- _v$12 !== _p$.e && setAttribute(_el$51, "id", _p$.e = _v$12);
3837
- _v$13 !== _p$.t && className(_el$51, _p$.t = _v$13);
3838
- _v$14 !== _p$.a && setAttribute(_el$51, "aria-selected", _p$.a = _v$14);
3695
+ var _v$10 = `address-autocomplete-${i()}`, _v$11 = `autocomplete-item ${selectedIndex() === i() ? "selected" : ""}`, _v$12 = selectedIndex() === i();
3696
+ _v$10 !== _p$.e && setAttribute(_el$47, "id", _p$.e = _v$10);
3697
+ _v$11 !== _p$.t && className(_el$47, _p$.t = _v$11);
3698
+ _v$12 !== _p$.a && setAttribute(_el$47, "aria-selected", _p$.a = _v$12);
3839
3699
  return _p$;
3840
3700
  }, {
3841
3701
  e: void 0,
3842
3702
  t: void 0,
3843
3703
  a: void 0
3844
3704
  });
3845
- return _el$51;
3705
+ return _el$47;
3846
3706
  })()
3847
3707
  }));
3848
3708
  return _el$14;
3849
3709
  }
3850
3710
  }), null);
3851
- insert(_el$11, createComponent(Show, {
3852
- get when() {
3853
- return !isPrivateWindow && showAgentStatusBadge();
3854
- },
3855
- get children() {
3856
- var _el$15 = _tmpl$6$f(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$17.nextSibling;
3857
- insert(_el$17, agentStatusMessage);
3858
- _el$18.$$click = (event) => {
3859
- event.stopPropagation();
3860
- setDismissedAgentStatusKey(agentStatusKey());
3861
- };
3862
- insert(_el$18, createComponent(x_default, {
3863
- size: 12
3864
- }));
3865
- createRenderEffect((_p$) => {
3866
- var _v$3 = `agent-status-badge ${agentPresence()}`, _v$4 = agentStatusMessage() || "Agent is using the browser";
3867
- _v$3 !== _p$.e && className(_el$15, _p$.e = _v$3);
3868
- _v$4 !== _p$.t && setAttribute(_el$15, "title", _p$.t = _v$4);
3869
- return _p$;
3870
- }, {
3871
- e: void 0,
3872
- t: void 0
3873
- });
3874
- return _el$15;
3875
- }
3876
- }), null);
3877
3711
  insert(_el$11, createComponent(Show, {
3878
3712
  get when() {
3879
3713
  return pageDiff();
3880
3714
  },
3881
3715
  get children() {
3882
- var _el$19 = _tmpl$7$d();
3883
- _el$19.$$click = () => void openDiffTimeline();
3884
- return _el$19;
3716
+ var _el$15 = _tmpl$6$e();
3717
+ _el$15.$$click = () => void openDiffTimeline();
3718
+ return _el$15;
3885
3719
  }
3886
3720
  }), null);
3887
3721
  insert(_el$, createComponent(Show, {
@@ -3889,245 +3723,245 @@ const AddressBar = (props) => {
3889
3723
  return memo(() => !!pageDiff())() && diffExpanded();
3890
3724
  },
3891
3725
  get children() {
3892
- var _el$20 = _tmpl$0$6(), _el$21 = _el$20.firstChild, _el$22 = _el$21.firstChild, _el$23 = _el$22.firstChild, _el$24 = _el$23.nextSibling;
3893
- _el$24.firstChild;
3894
- var _el$31 = _el$22.nextSibling, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling;
3895
- insert(_el$24, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
3896
- insert(_el$22, createComponent(Show, {
3726
+ var _el$16 = _tmpl$9$8(), _el$17 = _el$16.firstChild, _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling;
3727
+ _el$20.firstChild;
3728
+ var _el$27 = _el$18.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling;
3729
+ insert(_el$20, () => formatRelativeTime(pageDiff().oldSnapshot.capturedAt), null);
3730
+ insert(_el$18, createComponent(Show, {
3897
3731
  get when() {
3898
3732
  return memo(() => !!((pageDiff().burstCount || 0) > 1 && pageDiff().firstDetectedAt))() && pageDiff().lastDetectedAt;
3899
3733
  },
3900
3734
  get children() {
3901
- var _el$26 = _tmpl$8$9(), _el$27 = _el$26.firstChild, _el$30 = _el$27.nextSibling;
3902
- _el$30.nextSibling;
3903
- insert(_el$26, () => pageDiff().burstCount, _el$30);
3904
- insert(_el$26, () => formatElapsedTime(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
3905
- return _el$26;
3735
+ var _el$22 = _tmpl$7$c(), _el$23 = _el$22.firstChild, _el$26 = _el$23.nextSibling;
3736
+ _el$26.nextSibling;
3737
+ insert(_el$22, () => pageDiff().burstCount, _el$26);
3738
+ insert(_el$22, () => formatElapsedTime(pageDiff().firstDetectedAt, pageDiff().lastDetectedAt), null);
3739
+ return _el$22;
3906
3740
  }
3907
3741
  }), null);
3908
- _el$32.$$click = () => void openDiffTimeline();
3909
- _el$33.$$click = () => setDiffExpanded(false);
3910
- insert(_el$20, createComponent(Show, {
3742
+ _el$28.$$click = () => void openDiffTimeline();
3743
+ _el$29.$$click = () => setDiffExpanded(false);
3744
+ insert(_el$16, createComponent(Show, {
3911
3745
  get when() {
3912
3746
  return memo(() => !!pageDiff().recentBursts?.length)() && (pageDiff().recentBursts?.length || 0) > 1;
3913
3747
  },
3914
3748
  get children() {
3915
- var _el$34 = _tmpl$9$8();
3916
- _el$34.firstChild;
3917
- insert(_el$34, createComponent(For, {
3749
+ var _el$30 = _tmpl$8$9();
3750
+ _el$30.firstChild;
3751
+ insert(_el$30, createComponent(For, {
3918
3752
  get each() {
3919
3753
  return pageDiff().recentBursts;
3920
3754
  },
3921
3755
  children: (burst, i) => (() => {
3922
- var _el$56 = _tmpl$20$4(), _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling;
3923
- insert(_el$57, (() => {
3756
+ var _el$52 = _tmpl$19$4(), _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling;
3757
+ insert(_el$53, (() => {
3924
3758
  var _c$2 = memo(() => i() === 0);
3925
3759
  return () => _c$2() ? "Latest" : formatRelativeTime(burst.detectedAt);
3926
3760
  })());
3927
- insert(_el$58, createComponent(For, {
3761
+ insert(_el$54, createComponent(For, {
3928
3762
  get each() {
3929
3763
  return parseDiffSummaryParts(burst.summary);
3930
3764
  },
3931
3765
  children: (part) => (() => {
3932
- var _el$59 = _tmpl$22$4(), _el$61 = _el$59.firstChild;
3933
- insert(_el$59, createComponent(Show, {
3766
+ var _el$55 = _tmpl$21$4(), _el$57 = _el$55.firstChild;
3767
+ insert(_el$55, createComponent(Show, {
3934
3768
  get when() {
3935
3769
  return part.section;
3936
3770
  },
3937
3771
  get children() {
3938
- var _el$60 = _tmpl$21$4();
3939
- insert(_el$60, () => part.section);
3940
- return _el$60;
3772
+ var _el$56 = _tmpl$20$4();
3773
+ insert(_el$56, () => part.section);
3774
+ return _el$56;
3941
3775
  }
3942
- }), _el$61);
3943
- insert(_el$61, () => part.text);
3944
- return _el$59;
3776
+ }), _el$57);
3777
+ insert(_el$57, () => part.text);
3778
+ return _el$55;
3945
3779
  })()
3946
3780
  }));
3947
- createRenderEffect(() => _el$56.classList.toggle("latest", !!(i() === 0)));
3948
- return _el$56;
3781
+ createRenderEffect(() => _el$52.classList.toggle("latest", !!(i() === 0)));
3782
+ return _el$52;
3949
3783
  })()
3950
3784
  }), null);
3951
- return _el$34;
3785
+ return _el$30;
3952
3786
  }
3953
3787
  }), null);
3954
- insert(_el$20, createComponent(For, {
3788
+ insert(_el$16, createComponent(For, {
3955
3789
  get each() {
3956
3790
  return pageDiff().changes;
3957
3791
  },
3958
3792
  children: (change) => (() => {
3959
- var _el$62 = _tmpl$28$3(), _el$63 = _el$62.firstChild, _el$64 = _el$63.firstChild, _el$65 = _el$64.firstChild, _el$66 = _el$65.nextSibling, _el$67 = _el$64.nextSibling;
3960
- insert(_el$65, () => getChangeKindLabel(change.kind));
3961
- insert(_el$66, () => formatSectionLabel(change.section));
3962
- insert(_el$67, () => change.summary);
3963
- insert(_el$62, createComponent(Show, {
3793
+ var _el$58 = _tmpl$27$3(), _el$59 = _el$58.firstChild, _el$60 = _el$59.firstChild, _el$61 = _el$60.firstChild, _el$62 = _el$61.nextSibling, _el$63 = _el$60.nextSibling;
3794
+ insert(_el$61, () => getChangeKindLabel(change.kind));
3795
+ insert(_el$62, () => formatSectionLabel(change.section));
3796
+ insert(_el$63, () => change.summary);
3797
+ insert(_el$58, createComponent(Show, {
3964
3798
  get when() {
3965
3799
  return change.before || change.after;
3966
3800
  },
3967
3801
  get children() {
3968
- var _el$68 = _tmpl$25$3();
3969
- insert(_el$68, createComponent(Show, {
3802
+ var _el$64 = _tmpl$24$4();
3803
+ insert(_el$64, createComponent(Show, {
3970
3804
  get when() {
3971
3805
  return change.before;
3972
3806
  },
3973
3807
  get children() {
3974
- var _el$69 = _tmpl$23$4(), _el$70 = _el$69.firstChild, _el$71 = _el$70.nextSibling;
3975
- insert(_el$71, () => change.before);
3976
- return _el$69;
3808
+ var _el$65 = _tmpl$22$4(), _el$66 = _el$65.firstChild, _el$67 = _el$66.nextSibling;
3809
+ insert(_el$67, () => change.before);
3810
+ return _el$65;
3977
3811
  }
3978
3812
  }), null);
3979
- insert(_el$68, createComponent(Show, {
3813
+ insert(_el$64, createComponent(Show, {
3980
3814
  get when() {
3981
3815
  return change.after;
3982
3816
  },
3983
3817
  get children() {
3984
- var _el$72 = _tmpl$24$4(), _el$73 = _el$72.firstChild, _el$74 = _el$73.nextSibling;
3985
- insert(_el$74, () => change.after);
3986
- return _el$72;
3818
+ var _el$68 = _tmpl$23$4(), _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling;
3819
+ insert(_el$70, () => change.after);
3820
+ return _el$68;
3987
3821
  }
3988
3822
  }), null);
3989
- return _el$68;
3823
+ return _el$64;
3990
3824
  }
3991
3825
  }), null);
3992
- insert(_el$62, createComponent(Show, {
3826
+ insert(_el$58, createComponent(Show, {
3993
3827
  get when() {
3994
3828
  return change.addedItems?.length;
3995
3829
  },
3996
3830
  get children() {
3997
- var _el$75 = _tmpl$26$3(), _el$76 = _el$75.firstChild, _el$77 = _el$76.nextSibling;
3998
- insert(_el$77, createComponent(For, {
3831
+ var _el$71 = _tmpl$25$3(), _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling;
3832
+ insert(_el$73, createComponent(For, {
3999
3833
  get each() {
4000
3834
  return change.addedItems;
4001
3835
  },
4002
3836
  children: (item) => (() => {
4003
- var _el$81 = _tmpl$29$3();
4004
- insert(_el$81, item);
4005
- return _el$81;
3837
+ var _el$77 = _tmpl$28$3();
3838
+ insert(_el$77, item);
3839
+ return _el$77;
4006
3840
  })()
4007
3841
  }));
4008
- return _el$75;
3842
+ return _el$71;
4009
3843
  }
4010
3844
  }), null);
4011
- insert(_el$62, createComponent(Show, {
3845
+ insert(_el$58, createComponent(Show, {
4012
3846
  get when() {
4013
3847
  return change.removedItems?.length;
4014
3848
  },
4015
3849
  get children() {
4016
- var _el$78 = _tmpl$27$3(), _el$79 = _el$78.firstChild, _el$80 = _el$79.nextSibling;
4017
- insert(_el$80, createComponent(For, {
3850
+ var _el$74 = _tmpl$26$3(), _el$75 = _el$74.firstChild, _el$76 = _el$75.nextSibling;
3851
+ insert(_el$76, createComponent(For, {
4018
3852
  get each() {
4019
3853
  return change.removedItems;
4020
3854
  },
4021
3855
  children: (item) => (() => {
4022
- var _el$82 = _tmpl$29$3();
4023
- insert(_el$82, item);
4024
- return _el$82;
3856
+ var _el$78 = _tmpl$28$3();
3857
+ insert(_el$78, item);
3858
+ return _el$78;
4025
3859
  })()
4026
3860
  }));
4027
- return _el$78;
3861
+ return _el$74;
4028
3862
  }
4029
3863
  }), null);
4030
- createRenderEffect(() => className(_el$62, `page-diff-item page-diff-${change.kind}`));
4031
- return _el$62;
3864
+ createRenderEffect(() => className(_el$58, `page-diff-item page-diff-${change.kind}`));
3865
+ return _el$58;
4032
3866
  })()
4033
3867
  }), null);
4034
- return _el$20;
3868
+ return _el$16;
4035
3869
  }
4036
- }), _el$36);
4037
- _el$37.$$click = async () => {
3870
+ }), _el$32);
3871
+ _el$33.$$click = async () => {
4038
3872
  const id = activeTabId2();
4039
3873
  if (!id) return;
4040
3874
  await toggleAdBlock(id);
4041
3875
  };
4042
- insert(_el$38, createComponent(Show, {
3876
+ insert(_el$34, createComponent(Show, {
4043
3877
  get when() {
4044
3878
  return activeTab()?.adBlockingEnabled;
4045
3879
  },
4046
3880
  get children() {
4047
- return _tmpl$1$6();
3881
+ return _tmpl$0$6();
4048
3882
  }
4049
3883
  }), null);
4050
- insert(_el$38, createComponent(Show, {
3884
+ insert(_el$34, createComponent(Show, {
4051
3885
  get when() {
4052
3886
  return !activeTab()?.adBlockingEnabled;
4053
3887
  },
4054
3888
  get children() {
4055
- return [_tmpl$1$6(), _tmpl$10$6()];
3889
+ return [_tmpl$0$6(), _tmpl$1$6()];
4056
3890
  }
4057
3891
  }), null);
4058
- insert(_el$36, createComponent(Show, {
3892
+ insert(_el$32, createComponent(Show, {
4059
3893
  when: !isPrivateWindow,
4060
3894
  get children() {
4061
- var _el$42 = _tmpl$11$6();
4062
- _el$42.$$click = () => window.vessel.content.toggleReader();
4063
- createRenderEffect(() => _el$42.classList.toggle("active", !!activeTab()?.isReaderMode));
4064
- return _el$42;
3895
+ var _el$38 = _tmpl$10$6();
3896
+ _el$38.$$click = () => window.vessel.content.toggleReader();
3897
+ createRenderEffect(() => _el$38.classList.toggle("active", !!activeTab()?.isReaderMode));
3898
+ return _el$38;
4065
3899
  }
4066
3900
  }), null);
4067
- insert(_el$36, createComponent(Show, {
3901
+ insert(_el$32, createComponent(Show, {
4068
3902
  when: !isPrivateWindow,
4069
3903
  get children() {
4070
- var _el$43 = _tmpl$12$6();
4071
- addEventListener(_el$43, "click", toggleDevTools, true);
4072
- createRenderEffect(() => _el$43.classList.toggle("active", !!devtoolsPanelOpen2()));
4073
- return _el$43;
3904
+ var _el$39 = _tmpl$11$6();
3905
+ addEventListener(_el$39, "click", toggleDevTools, true);
3906
+ createRenderEffect(() => _el$39.classList.toggle("active", !!devtoolsPanelOpen2()));
3907
+ return _el$39;
4074
3908
  }
4075
3909
  }), null);
4076
- insert(_el$36, createComponent(Show, {
3910
+ insert(_el$32, createComponent(Show, {
4077
3911
  when: !isPrivateWindow,
4078
3912
  get children() {
4079
- var _el$44 = _tmpl$14$5();
4080
- _el$44.firstChild;
4081
- addEventListener(_el$44, "click", toggleSidebar, true);
4082
- insert(_el$44, createComponent(Show, {
3913
+ var _el$40 = _tmpl$13$5();
3914
+ _el$40.firstChild;
3915
+ addEventListener(_el$40, "click", toggleSidebar, true);
3916
+ insert(_el$40, createComponent(Show, {
4083
3917
  get when() {
4084
3918
  return pendingApprovalCount() > 0;
4085
3919
  },
4086
3920
  get children() {
4087
- var _el$46 = _tmpl$13$5();
4088
- insert(_el$46, pendingApprovalCount);
4089
- createRenderEffect(() => setAttribute(_el$46, "aria-label", `${pendingApprovalCount()} pending`));
4090
- return _el$46;
3921
+ var _el$42 = _tmpl$12$6();
3922
+ insert(_el$42, pendingApprovalCount);
3923
+ createRenderEffect(() => setAttribute(_el$42, "aria-label", `${pendingApprovalCount()} pending`));
3924
+ return _el$42;
4091
3925
  }
4092
3926
  }), null);
4093
3927
  createRenderEffect((_p$) => {
4094
- var _v$5 = !!(pendingApprovalCount() > 0), _v$6 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
4095
- _v$5 !== _p$.e && _el$44.classList.toggle("has-approvals", _p$.e = _v$5);
4096
- _v$6 !== _p$.t && setAttribute(_el$44, "title", _p$.t = _v$6);
3928
+ var _v$3 = !!(pendingApprovalCount() > 0), _v$4 = pendingApprovalCount() > 0 ? `AI Sidebar — ${pendingApprovalCount()} pending approval${pendingApprovalCount() > 1 ? "s" : ""}` : "AI Sidebar (Ctrl+Shift+L)";
3929
+ _v$3 !== _p$.e && _el$40.classList.toggle("has-approvals", _p$.e = _v$3);
3930
+ _v$4 !== _p$.t && setAttribute(_el$40, "title", _p$.t = _v$4);
4097
3931
  return _p$;
4098
3932
  }, {
4099
3933
  e: void 0,
4100
3934
  t: void 0
4101
3935
  });
4102
- return _el$44;
3936
+ return _el$40;
4103
3937
  }
4104
3938
  }), null);
4105
- insert(_el$36, createComponent(Show, {
3939
+ insert(_el$32, createComponent(Show, {
4106
3940
  when: !isPrivateWindow,
4107
3941
  get children() {
4108
3942
  return [(() => {
4109
- var _el$47 = _tmpl$15$5();
4110
- addEventListener(_el$47, "click", props.onClearData, true);
4111
- insert(_el$47, createComponent(trash_2_default, {
3943
+ var _el$43 = _tmpl$14$5();
3944
+ addEventListener(_el$43, "click", props.onClearData, true);
3945
+ insert(_el$43, createComponent(trash_2_default, {
4112
3946
  size: 14
4113
3947
  }));
4114
- return _el$47;
3948
+ return _el$43;
4115
3949
  })(), (() => {
4116
- var _el$48 = _tmpl$16$4();
4117
- addEventListener(_el$48, "click", openSettings, true);
4118
- return _el$48;
3950
+ var _el$44 = _tmpl$15$5();
3951
+ addEventListener(_el$44, "click", openSettings, true);
3952
+ return _el$44;
4119
3953
  })()];
4120
3954
  }
4121
3955
  }), null);
4122
3956
  createRenderEffect((_p$) => {
4123
- var _v$7 = !activeTab()?.canGoBack, _v$8 = !activeTab()?.canGoForward, _v$9 = showSuggestions() && suggestions().length > 0, _v$0 = selectedIndex() >= 0 ? `address-autocomplete-${selectedIndex()}` : void 0, _v$1 = !!activeTab()?.adBlockingEnabled, _v$10 = !activeTab()?.adBlockingEnabled, _v$11 = activeTab()?.adBlockingEnabled ? "Ad Block: On (click to disable)" : "Ad Block: Off (click to enable)";
4124
- _v$7 !== _p$.e && (_el$3.disabled = _p$.e = _v$7);
4125
- _v$8 !== _p$.t && (_el$4.disabled = _p$.t = _v$8);
4126
- _v$9 !== _p$.a && setAttribute(_el$13, "aria-expanded", _p$.a = _v$9);
4127
- _v$0 !== _p$.o && setAttribute(_el$13, "aria-activedescendant", _p$.o = _v$0);
4128
- _v$1 !== _p$.i && _el$37.classList.toggle("active", _p$.i = _v$1);
4129
- _v$10 !== _p$.n && _el$37.classList.toggle("nav-btn-muted", _p$.n = _v$10);
4130
- _v$11 !== _p$.s && setAttribute(_el$37, "title", _p$.s = _v$11);
3957
+ var _v$5 = !activeTab()?.canGoBack, _v$6 = !activeTab()?.canGoForward, _v$7 = showSuggestions() && suggestions().length > 0, _v$8 = selectedIndex() >= 0 ? `address-autocomplete-${selectedIndex()}` : void 0, _v$9 = !!activeTab()?.adBlockingEnabled, _v$0 = !activeTab()?.adBlockingEnabled, _v$1 = activeTab()?.adBlockingEnabled ? "Ad Block: On (click to disable)" : "Ad Block: Off (click to enable)";
3958
+ _v$5 !== _p$.e && (_el$3.disabled = _p$.e = _v$5);
3959
+ _v$6 !== _p$.t && (_el$4.disabled = _p$.t = _v$6);
3960
+ _v$7 !== _p$.a && setAttribute(_el$13, "aria-expanded", _p$.a = _v$7);
3961
+ _v$8 !== _p$.o && setAttribute(_el$13, "aria-activedescendant", _p$.o = _v$8);
3962
+ _v$9 !== _p$.i && _el$33.classList.toggle("active", _p$.i = _v$9);
3963
+ _v$0 !== _p$.n && _el$33.classList.toggle("nav-btn-muted", _p$.n = _v$0);
3964
+ _v$1 !== _p$.s && setAttribute(_el$33, "title", _p$.s = _v$1);
4131
3965
  return _p$;
4132
3966
  }, {
4133
3967
  e: void 0,
@@ -4270,7 +4104,7 @@ const HighlightNotifications = (props) => {
4270
4104
  });
4271
4105
  };
4272
4106
  delegateEvents(["click"]);
4273
- var _tmpl$$m = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$m = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$j = /* @__PURE__ */ template(`<span class=download-toast-failed>!`), _tmpl$4$j = /* @__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>`);
4107
+ var _tmpl$$m = /* @__PURE__ */ template(`<div class=download-toast-stack aria-live=polite>`), _tmpl$2$m = /* @__PURE__ */ template(`<span class=download-toast-done>&#10003;`), _tmpl$3$j = /* @__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$e = /* @__PURE__ */ template(`<div class=download-toast-size>`), _tmpl$6$d = /* @__PURE__ */ template(`<div class="download-toast-size download-toast-size-done"> downloaded`), _tmpl$7$b = /* @__PURE__ */ template(`<div class=download-toast role=status><div class=download-toast-header><span class=download-toast-filename>`);
4274
4108
  const TOAST_DONE_DURATION_MS = 4200;
4275
4109
  const TOAST_EXIT_MS = 300;
4276
4110
  function formatBytes$1(bytes) {
@@ -4367,7 +4201,7 @@ const DownloadToast = () => {
4367
4201
  return downloads();
4368
4202
  },
4369
4203
  children: (dl) => (() => {
4370
- var _el$2 = _tmpl$7$c(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
4204
+ var _el$2 = _tmpl$7$b(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
4371
4205
  insert(_el$4, () => dl.filename);
4372
4206
  insert(_el$3, createComponent(Show, {
4373
4207
  get when() {
@@ -4391,11 +4225,11 @@ const DownloadToast = () => {
4391
4225
  },
4392
4226
  get children() {
4393
4227
  return [(() => {
4394
- var _el$7 = _tmpl$4$j(), _el$8 = _el$7.firstChild;
4228
+ var _el$7 = _tmpl$4$i(), _el$8 = _el$7.firstChild;
4395
4229
  createRenderEffect((_$p) => setStyleProperty(_el$8, "width", `${progressPercent(dl)}%`));
4396
4230
  return _el$7;
4397
4231
  })(), (() => {
4398
- var _el$9 = _tmpl$5$f();
4232
+ var _el$9 = _tmpl$5$e();
4399
4233
  insert(_el$9, () => formatBytes$1(dl.receivedBytes), null);
4400
4234
  insert(_el$9, createComponent(Show, {
4401
4235
  get when() {
@@ -4414,7 +4248,7 @@ const DownloadToast = () => {
4414
4248
  return dl.state === "completed";
4415
4249
  },
4416
4250
  get children() {
4417
- var _el$0 = _tmpl$6$e(), _el$1 = _el$0.firstChild;
4251
+ var _el$0 = _tmpl$6$d(), _el$1 = _el$0.firstChild;
4418
4252
  insert(_el$0, () => formatBytes$1(dl.receivedBytes), _el$1);
4419
4253
  return _el$0;
4420
4254
  }
@@ -4426,7 +4260,7 @@ const DownloadToast = () => {
4426
4260
  return _el$;
4427
4261
  })();
4428
4262
  };
4429
- var _tmpl$$l = /* @__PURE__ */ template(`<div class=modal-backdrop><div class=downloads-panel><div class=downloads-panel-header><div><h2>Downloads</h2><p>Recent files saved by Vessel</p></div><div class=downloads-panel-actions><button>Clear</button><button>Close</button></div></div><div class=downloads-panel-list>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=downloads-empty>No downloads yet.`), _tmpl$3$i = /* @__PURE__ */ template(`<div class=downloads-row><div class=downloads-file><strong></strong><span></span><small> · </small></div><div class=downloads-row-actions><button>Open</button><button>Show in folder`), _tmpl$4$i = /* @__PURE__ */ template(`<span>Source: `);
4263
+ var _tmpl$$l = /* @__PURE__ */ template(`<div class=modal-backdrop><div class=downloads-panel><div class=downloads-panel-header><div><h2>Downloads</h2><p>Recent files saved by Vessel</p></div><div class=downloads-panel-actions><button>Clear</button><button>Close</button></div></div><div class=downloads-panel-list>`), _tmpl$2$l = /* @__PURE__ */ template(`<div class=downloads-empty>No downloads yet.`), _tmpl$3$i = /* @__PURE__ */ template(`<div class=downloads-row><div class=downloads-file><strong></strong><span></span><small> · </small></div><div class=downloads-row-actions><button>Open</button><button>Show in folder`), _tmpl$4$h = /* @__PURE__ */ template(`<span>Source: `);
4430
4264
  const formatBytes = (bytes) => {
4431
4265
  if (!bytes) return "0 B";
4432
4266
  const units = ["B", "KB", "MB", "GB"];
@@ -4475,7 +4309,7 @@ const DownloadsPanel = (props) => {
4475
4309
  return item.url;
4476
4310
  },
4477
4311
  children: (url) => (() => {
4478
- var _el$17 = _tmpl$4$i();
4312
+ var _el$17 = _tmpl$4$h();
4479
4313
  _el$17.firstChild;
4480
4314
  insert(_el$17, url, null);
4481
4315
  return _el$17;
@@ -4603,7 +4437,7 @@ const FindBar = () => {
4603
4437
  });
4604
4438
  };
4605
4439
  delegateEvents(["input", "click"]);
4606
- var _tmpl$$j = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$j = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$h = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$h = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$e = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
4440
+ var _tmpl$$j = /* @__PURE__ */ template(`<div class=flow-progress>`), _tmpl$2$j = /* @__PURE__ */ template(`<div class=flow-progress-hint>Last: `), _tmpl$3$h = /* @__PURE__ */ template(`<div class=flow-progress-hint>Next: `), _tmpl$4$g = /* @__PURE__ */ template(`<div class=flow-progress-section><div class=flow-progress-header><span class=flow-progress-goal></span><span class=flow-progress-pct>%</span></div><div class=flow-progress-bar-track><div class=flow-progress-bar-fill></div></div><div class=flow-steps>`), _tmpl$5$d = /* @__PURE__ */ template(`<div><span class=flow-step-dot></span><span class=flow-step-label>`);
4607
4441
  const FlowProgress = () => {
4608
4442
  const {
4609
4443
  runtimeState: runtimeState2
@@ -4640,7 +4474,7 @@ const FlowProgress = () => {
4640
4474
  return tracker();
4641
4475
  },
4642
4476
  children: (t) => (() => {
4643
- var _el$2 = _tmpl$4$h(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$3.nextSibling, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling;
4477
+ var _el$2 = _tmpl$4$g(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$3.nextSibling, _el$8 = _el$7.firstChild, _el$9 = _el$7.nextSibling;
4644
4478
  insert(_el$4, () => t().goal);
4645
4479
  insert(_el$5, () => progressPercent(t().steps), _el$6);
4646
4480
  insert(_el$9, createComponent(For, {
@@ -4648,7 +4482,7 @@ const FlowProgress = () => {
4648
4482
  return t().steps;
4649
4483
  },
4650
4484
  children: (step) => (() => {
4651
- var _el$12 = _tmpl$5$e(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
4485
+ var _el$12 = _tmpl$5$d(), _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling;
4652
4486
  insert(_el$14, () => step.label);
4653
4487
  createRenderEffect(() => className(_el$12, `flow-step ${stepStatusClass(step.status)}`));
4654
4488
  return _el$12;
@@ -4685,7 +4519,7 @@ const FlowProgress = () => {
4685
4519
  return memo(() => !!flow())() && !tracker();
4686
4520
  },
4687
4521
  children: (f) => (() => {
4688
- var _el$15 = _tmpl$4$h(), _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$16.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$20.nextSibling;
4522
+ var _el$15 = _tmpl$4$g(), _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$16.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$20.nextSibling;
4689
4523
  insert(_el$17, () => f().goal);
4690
4524
  insert(_el$18, () => progressPercent(f().steps), _el$19);
4691
4525
  insert(_el$22, createComponent(For, {
@@ -4693,7 +4527,7 @@ const FlowProgress = () => {
4693
4527
  return f().steps;
4694
4528
  },
4695
4529
  children: (step) => (() => {
4696
- var _el$23 = _tmpl$5$e(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
4530
+ var _el$23 = _tmpl$5$d(), _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling;
4697
4531
  insert(_el$25, () => step.label);
4698
4532
  createRenderEffect(() => className(_el$23, `flow-step ${stepStatusClass(step.status)}`));
4699
4533
  return _el$23;
@@ -4734,19 +4568,66 @@ function formatTime(iso, options) {
4734
4568
  ...options?.includeSeconds && { second: "2-digit" }
4735
4569
  });
4736
4570
  }
4737
- var _tmpl$$i = /* @__PURE__ */ template(`<div class=agent-summary-hud>`), _tmpl$2$i = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$3$g = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$4$g = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Timeline</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>`);
4571
+ function formatAgentActionName(name) {
4572
+ return name.split(/[_-]+/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
4573
+ }
4574
+ function summarizeAgentAction(action) {
4575
+ if (action.status === "waiting-approval") {
4576
+ return action.argsSummary || "Waiting for approval";
4577
+ }
4578
+ if (action.status === "running") {
4579
+ return action.argsSummary || "Running";
4580
+ }
4581
+ if (action.status === "failed") {
4582
+ return action.error || action.resultSummary || "Action failed";
4583
+ }
4584
+ return action.resultSummary || action.argsSummary || "Completed";
4585
+ }
4586
+ function formatAgentTimelineDuration(durationMs) {
4587
+ if (!durationMs || durationMs < 1) return null;
4588
+ if (durationMs < 1e3) return `${Math.round(durationMs)}ms`;
4589
+ return `${(durationMs / 1e3).toFixed(durationMs < 1e4 ? 1 : 0)}s`;
4590
+ }
4591
+ function buildAgentTimelineItems(state, limit = 12) {
4592
+ const transcriptItems = state.transcript.map((entry) => ({
4593
+ id: `transcript:${entry.id}`,
4594
+ type: "transcript",
4595
+ timestamp: entry.updatedAt,
4596
+ status: entry.status,
4597
+ kind: entry.kind,
4598
+ label: entry.title || entry.kind,
4599
+ detail: entry.text
4600
+ }));
4601
+ const actionItems = state.actions.map((action) => ({
4602
+ id: `action:${action.id}`,
4603
+ type: "action",
4604
+ timestamp: action.finishedAt || action.startedAt,
4605
+ status: action.status,
4606
+ kind: "action",
4607
+ label: formatAgentActionName(action.name),
4608
+ detail: summarizeAgentAction(action),
4609
+ durationMs: action.durationMs
4610
+ }));
4611
+ return [...transcriptItems, ...actionItems].sort(
4612
+ (left, right) => new Date(right.timestamp).getTime() - new Date(left.timestamp).getTime()
4613
+ ).slice(0, limit);
4614
+ }
4615
+ function isLiveAgentTimelineItem(item) {
4616
+ return item.status === "streaming" || item.status === "running";
4617
+ }
4618
+ var _tmpl$$i = /* @__PURE__ */ template(`<span class=agent-transcript-live><span class=agent-transcript-live-dot aria-hidden=true></span>Live`), _tmpl$2$i = /* @__PURE__ */ template(`<div class=agent-transcript-list>`), _tmpl$3$g = /* @__PURE__ */ template(`<aside class=agent-transcript-dock><div class=agent-transcript-header><div class=agent-transcript-title-row><span class=agent-transcript-title>Agent Timeline</span></div><div class=agent-transcript-actions><button class=agent-transcript-icon></button><button class=agent-transcript-icon data-tooltip=Hide>×`), _tmpl$4$f = /* @__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>`);
4738
4619
  const AgentTranscriptDock = () => {
4739
4620
  const {
4740
4621
  runtimeState: runtimeState2
4741
4622
  } = useRuntime();
4742
- const [mode, setMode] = createSignal("summary");
4623
+ const [mode, setMode] = createSignal("off");
4743
4624
  const [collapsed, setCollapsed] = createSignal(false);
4744
4625
  onMount(() => {
4745
4626
  void window.vessel.settings.get().then((settings) => {
4746
- setMode(settings.agentTranscriptMode ?? "summary");
4627
+ setMode(settings.agentTranscriptMode ?? "off");
4747
4628
  });
4748
4629
  const unsubscribe2 = window.vessel.settings.onUpdate((settings) => {
4749
- setMode(settings.agentTranscriptMode ?? "summary");
4630
+ setMode(settings.agentTranscriptMode ?? "off");
4750
4631
  });
4751
4632
  onCleanup(unsubscribe2);
4752
4633
  });
@@ -4756,120 +4637,79 @@ const AgentTranscriptDock = () => {
4756
4637
  setMode("off");
4757
4638
  await window.vessel.settings.set("agentTranscriptMode", "off");
4758
4639
  };
4759
- const isSummary = createMemo(() => mode() === "summary");
4760
- const latestEntry = createMemo(() => {
4761
- const entries2 = timelineItems();
4762
- return entries2.length > 0 ? entries2[0] : null;
4763
- });
4764
4640
  return createComponent(Show, {
4765
4641
  get when() {
4766
- return memo(() => mode() !== "off")() && timelineItems().length > 0;
4642
+ return memo(() => mode() === "full")() && timelineItems().length > 0;
4767
4643
  },
4768
4644
  get children() {
4769
- return [createComponent(Show, {
4645
+ var _el$ = _tmpl$3$g(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild;
4646
+ _el$3.firstChild;
4647
+ var _el$6 = _el$3.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
4648
+ insert(_el$3, createComponent(Show, {
4770
4649
  get when() {
4771
- return isSummary();
4650
+ return hasStreamingEntry();
4772
4651
  },
4773
4652
  get children() {
4774
- var _el$ = _tmpl$$i();
4775
- insert(_el$, createComponent(Show, {
4776
- get when() {
4777
- return latestEntry();
4778
- },
4779
- children: (entry) => [createComponent(Show, {
4780
- get when() {
4781
- return hasStreamingEntry();
4782
- },
4783
- get children() {
4784
- return _tmpl$5$d();
4785
- }
4786
- }), (() => {
4787
- var _el$10 = _tmpl$6$d(), _el$11 = _el$10.firstChild;
4788
- insert(_el$10, () => entry().label, _el$11);
4789
- insert(_el$10, (() => {
4790
- var _c$ = memo(() => entry().detail.length > 80);
4791
- return () => _c$() ? entry().detail.slice(0, 77) + "..." : entry().detail;
4792
- })(), null);
4793
- return _el$10;
4794
- })()]
4795
- }));
4796
- return _el$;
4653
+ return _tmpl$$i();
4797
4654
  }
4798
- }), createComponent(Show, {
4655
+ }), null);
4656
+ _el$7.$$click = () => setCollapsed((value) => !value);
4657
+ insert(_el$7, () => collapsed() ? "▴" : "▾");
4658
+ _el$8.$$click = () => void hideDock();
4659
+ insert(_el$, createComponent(Show, {
4799
4660
  get when() {
4800
- return !isSummary();
4661
+ return !collapsed();
4801
4662
  },
4802
4663
  get children() {
4803
- var _el$2 = _tmpl$4$g(), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild;
4804
- _el$4.firstChild;
4805
- var _el$7 = _el$4.nextSibling, _el$8 = _el$7.firstChild, _el$9 = _el$8.nextSibling;
4806
- insert(_el$4, createComponent(Show, {
4807
- get when() {
4808
- return hasStreamingEntry();
4809
- },
4810
- get children() {
4811
- return _tmpl$2$i();
4812
- }
4813
- }), null);
4814
- _el$8.$$click = () => setCollapsed((value) => !value);
4815
- insert(_el$8, () => collapsed() ? "▴" : "▾");
4816
- _el$9.$$click = () => void hideDock();
4817
- insert(_el$2, createComponent(Show, {
4818
- get when() {
4819
- return !collapsed();
4664
+ var _el$9 = _tmpl$2$i();
4665
+ use((el) => useScrollFade(el), _el$9);
4666
+ insert(_el$9, createComponent(For, {
4667
+ get each() {
4668
+ return timelineItems();
4820
4669
  },
4821
- get children() {
4822
- var _el$0 = _tmpl$3$g();
4823
- use((el) => useScrollFade(el), _el$0);
4824
- insert(_el$0, createComponent(For, {
4825
- get each() {
4826
- return timelineItems();
4827
- },
4828
- children: (entry) => {
4829
- const duration = () => entry.type === "action" ? formatAgentTimelineDuration(entry.durationMs) : null;
4830
- return (() => {
4831
- var _el$13 = _tmpl$7$b(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling, _el$17 = _el$14.nextSibling;
4832
- insert(_el$15, () => entry.label);
4833
- insert(_el$16, () => formatTime(entry.timestamp), null);
4834
- insert(_el$16, createComponent(Show, {
4835
- get when() {
4836
- return duration();
4837
- },
4838
- children: (value) => [" · ", memo(value)]
4839
- }), null);
4840
- insert(_el$17, () => entry.detail);
4841
- createRenderEffect((_p$) => {
4842
- var _v$3 = `agent-transcript-entry ${entry.kind}`, _v$4 = !!isLiveAgentTimelineItem(entry), _v$5 = !!(entry.status === "failed"), _v$6 = !!(entry.status === "waiting-approval");
4843
- _v$3 !== _p$.e && className(_el$13, _p$.e = _v$3);
4844
- _v$4 !== _p$.t && _el$13.classList.toggle("streaming", _p$.t = _v$4);
4845
- _v$5 !== _p$.a && _el$13.classList.toggle("failed", _p$.a = _v$5);
4846
- _v$6 !== _p$.o && _el$13.classList.toggle("waiting-approval", _p$.o = _v$6);
4847
- return _p$;
4848
- }, {
4849
- e: void 0,
4850
- t: void 0,
4851
- a: void 0,
4852
- o: void 0
4853
- });
4854
- return _el$13;
4855
- })();
4856
- }
4857
- }));
4858
- return _el$0;
4670
+ children: (entry) => {
4671
+ const duration = () => entry.type === "action" ? formatAgentTimelineDuration(entry.durationMs) : null;
4672
+ return (() => {
4673
+ var _el$0 = _tmpl$4$f(), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling;
4674
+ insert(_el$10, () => entry.label);
4675
+ insert(_el$11, () => formatTime(entry.timestamp), null);
4676
+ insert(_el$11, createComponent(Show, {
4677
+ get when() {
4678
+ return duration();
4679
+ },
4680
+ children: (value) => [" · ", memo(value)]
4681
+ }), null);
4682
+ insert(_el$12, () => entry.detail);
4683
+ createRenderEffect((_p$) => {
4684
+ var _v$3 = `agent-transcript-entry ${entry.kind}`, _v$4 = !!isLiveAgentTimelineItem(entry), _v$5 = !!(entry.status === "failed"), _v$6 = !!(entry.status === "waiting-approval");
4685
+ _v$3 !== _p$.e && className(_el$0, _p$.e = _v$3);
4686
+ _v$4 !== _p$.t && _el$0.classList.toggle("streaming", _p$.t = _v$4);
4687
+ _v$5 !== _p$.a && _el$0.classList.toggle("failed", _p$.a = _v$5);
4688
+ _v$6 !== _p$.o && _el$0.classList.toggle("waiting-approval", _p$.o = _v$6);
4689
+ return _p$;
4690
+ }, {
4691
+ e: void 0,
4692
+ t: void 0,
4693
+ a: void 0,
4694
+ o: void 0
4695
+ });
4696
+ return _el$0;
4697
+ })();
4859
4698
  }
4860
- }), null);
4861
- createRenderEffect((_p$) => {
4862
- var _v$ = !!collapsed(), _v$2 = collapsed() ? "Expand" : "Collapse";
4863
- _v$ !== _p$.e && _el$2.classList.toggle("collapsed", _p$.e = _v$);
4864
- _v$2 !== _p$.t && setAttribute(_el$8, "data-tooltip", _p$.t = _v$2);
4865
- return _p$;
4866
- }, {
4867
- e: void 0,
4868
- t: void 0
4869
- });
4870
- return _el$2;
4699
+ }));
4700
+ return _el$9;
4871
4701
  }
4872
- })];
4702
+ }), null);
4703
+ createRenderEffect((_p$) => {
4704
+ var _v$ = !!collapsed(), _v$2 = collapsed() ? "Expand" : "Collapse";
4705
+ _v$ !== _p$.e && _el$.classList.toggle("collapsed", _p$.e = _v$);
4706
+ _v$2 !== _p$.t && setAttribute(_el$7, "data-tooltip", _p$.t = _v$2);
4707
+ return _p$;
4708
+ }, {
4709
+ e: void 0,
4710
+ t: void 0
4711
+ });
4712
+ return _el$;
4873
4713
  }
4874
4714
  });
4875
4715
  };
@@ -5205,7 +5045,7 @@ function isEditableTarget(target) {
5205
5045
  }
5206
5046
  return target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable;
5207
5047
  }
5208
- var _tmpl$$h = /* @__PURE__ */ template(`<div class=browser-command-overlay><section class=browser-command-palette><div class=browser-command-search><input placeholder="Search browser commands..."><kbd>Esc</kbd></div><div class=browser-command-list role=listbox>`), _tmpl$2$h = /* @__PURE__ */ template(`<div class=browser-command-empty>No matching commands`), _tmpl$3$f = /* @__PURE__ */ template(`<button type=button class=browser-command-item role=option><span class=browser-command-icon></span><span class=browser-command-copy><span class=browser-command-label></span><span class=browser-command-hint>`), _tmpl$4$f = /* @__PURE__ */ template(`<kbd class=browser-command-shortcut>`);
5048
+ var _tmpl$$h = /* @__PURE__ */ template(`<div class=browser-command-overlay><section class=browser-command-palette><div class=browser-command-search><input placeholder="Search browser commands..."><kbd>Esc</kbd></div><div class=browser-command-list role=listbox>`), _tmpl$2$h = /* @__PURE__ */ template(`<div class=browser-command-empty>No matching commands`), _tmpl$3$f = /* @__PURE__ */ template(`<button type=button class=browser-command-item role=option><span class=browser-command-icon></span><span class=browser-command-copy><span class=browser-command-label></span><span class=browser-command-hint>`), _tmpl$4$e = /* @__PURE__ */ template(`<kbd class=browser-command-shortcut>`);
5209
5049
  const PALETTE_EXIT_MS = 160;
5210
5050
  const COMMAND_ICONS = {
5211
5051
  "app-window": app_window_default,
@@ -5382,7 +5222,7 @@ const BrowserCommandPalette = (props) => {
5382
5222
  return command.shortcut;
5383
5223
  },
5384
5224
  children: (shortcut) => (() => {
5385
- var _el$10 = _tmpl$4$f();
5225
+ var _el$10 = _tmpl$4$e();
5386
5226
  insert(_el$10, shortcut);
5387
5227
  return _el$10;
5388
5228
  })()
@@ -5876,7 +5716,7 @@ function useProviderAuthSetup(options = {}) {
5876
5716
  startOpenRouterAuth
5877
5717
  };
5878
5718
  }
5879
- var _tmpl$$g = /* @__PURE__ */ template(`<p class=command-bar-no-provider-error>`), _tmpl$2$g = /* @__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`);
5719
+ var _tmpl$$g = /* @__PURE__ */ template(`<p class=command-bar-no-provider-error>`), _tmpl$2$g = /* @__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$d = /* @__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`);
5880
5720
  const COMMAND_BAR_EXIT_MS = 200;
5881
5721
  const CommandBar = () => {
5882
5722
  const {
@@ -6010,7 +5850,7 @@ const CommandBar = () => {
6010
5850
  return _tmpl$7$a();
6011
5851
  },
6012
5852
  get children() {
6013
- return _tmpl$4$e();
5853
+ return _tmpl$4$d();
6014
5854
  }
6015
5855
  }), null);
6016
5856
  createRenderEffect((_p$) => {
@@ -7389,7 +7229,7 @@ function sanitizeUrl(url) {
7389
7229
  }
7390
7230
  function applyInlineMarkdown(text2) {
7391
7231
  const codeSpans = [];
7392
- let withCodeTokens = text2.replace(/`([^`]+)`/g, (_, code) => {
7232
+ const withCodeTokens = text2.replace(/`([^`]+)`/g, (_, code) => {
7393
7233
  const token = `\0CS${codeSpans.length}\0`;
7394
7234
  codeSpans.push(`<code>${escapeHtml(code)}</code>`);
7395
7235
  return token;
@@ -7406,7 +7246,7 @@ function applyInlineMarkdown(text2) {
7406
7246
  return `<a href="${escapeHtml(safeHref)}" target="_blank" rel="noreferrer">${escapeHtml(safeLabel)}</a>`;
7407
7247
  }
7408
7248
  );
7409
- html2 = html2.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>").replace(/__([^_]+)__/g, "<strong>$1</strong>").replace(/(^|[^\*])\*(?!\s)([^*\n]+?)(?<!\s)\*/g, "$1<em>$2</em>").replace(/(^|[^_])_(?!\s)([^_\n]+?)(?<!\s)_/g, "$1<em>$2</em>");
7249
+ html2 = html2.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>").replace(/__([^_]+)__/g, "<strong>$1</strong>").replace(/(^|[^*])\*(?!\s)([^*\n]+?)(?<!\s)\*/g, "$1<em>$2</em>").replace(/(^|[^_])_(?!\s)([^_\n]+?)(?<!\s)_/g, "$1<em>$2</em>");
7410
7250
  return codeSpans.reduce(
7411
7251
  (output, snippet, index) => output.replace(`\0CS${index}\0`, snippet),
7412
7252
  html2
@@ -7737,7 +7577,7 @@ function getBookmarkSearchMatch(args) {
7737
7577
  }
7738
7578
  return { matchedFields, score };
7739
7579
  }
7740
- var _tmpl$$f = /* @__PURE__ */ template(`<div class=dropdown-select-menu role=listbox>`), _tmpl$2$f = /* @__PURE__ */ template(`<div><button class=dropdown-select-trigger type=button aria-haspopup=listbox><span class=dropdown-select-value></span><span class=dropdown-select-caret aria-hidden=true>▾`), _tmpl$3$d = /* @__PURE__ */ template(`<span class=dropdown-select-option-description>`), _tmpl$4$d = /* @__PURE__ */ template(`<button class=dropdown-select-option type=button role=option><span class=dropdown-select-option-copy><span class=dropdown-select-option-label>`);
7580
+ var _tmpl$$f = /* @__PURE__ */ template(`<div class=dropdown-select-menu role=listbox>`), _tmpl$2$f = /* @__PURE__ */ template(`<div><button class=dropdown-select-trigger type=button aria-haspopup=listbox><span class=dropdown-select-value></span><span class=dropdown-select-caret aria-hidden=true>▾`), _tmpl$3$d = /* @__PURE__ */ template(`<span class=dropdown-select-option-description>`), _tmpl$4$c = /* @__PURE__ */ template(`<button class=dropdown-select-option type=button role=option><span class=dropdown-select-option-copy><span class=dropdown-select-option-label>`);
7741
7581
  const DropdownSelect = (props) => {
7742
7582
  const [open, setOpen] = createSignal(false);
7743
7583
  let rootRef;
@@ -7777,7 +7617,7 @@ const DropdownSelect = (props) => {
7777
7617
  return props.options;
7778
7618
  },
7779
7619
  children: (option) => (() => {
7780
- var _el$6 = _tmpl$4$d(), _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild;
7620
+ var _el$6 = _tmpl$4$c(), _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild;
7781
7621
  _el$6.$$click = () => {
7782
7622
  props.onChange(option.value);
7783
7623
  setOpen(false);
@@ -7974,7 +7814,7 @@ function renderKitPrompt(kit, values) {
7974
7814
  (_, key) => values[key] ?? ""
7975
7815
  );
7976
7816
  }
7977
- var _tmpl$$e = /* @__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$e = /* @__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>`);
7817
+ var _tmpl$$e = /* @__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$e = /* @__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$b = /* @__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>`);
7978
7818
  const ICON_MAP = {
7979
7819
  BookOpen: book_open_default,
7980
7820
  Tag: tag_default,
@@ -8328,7 +8168,7 @@ const AutomationTab = (props) => {
8328
8168
  return _el$11;
8329
8169
  }
8330
8170
  }), (() => {
8331
- var _el$14 = _tmpl$4$c();
8171
+ var _el$14 = _tmpl$4$b();
8332
8172
  insert(_el$14, createComponent(For, {
8333
8173
  get each() {
8334
8174
  return allKits();
@@ -8890,7 +8730,7 @@ function useResearch() {
8890
8730
  }
8891
8731
  };
8892
8732
  }
8893
- var _tmpl$$d = /* @__PURE__ */ template(`<div class=markdown-content>`), _tmpl$2$d = /* @__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`);
8733
+ var _tmpl$$d = /* @__PURE__ */ template(`<div class=markdown-content>`), _tmpl$2$d = /* @__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$a = /* @__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`);
8894
8734
  const ResearchBriefMarkdown = (props) => {
8895
8735
  const html2 = createMemo(() => renderMarkdown(props.content));
8896
8736
  return (() => {
@@ -8963,7 +8803,7 @@ function extractFollowUpOptions(prompt) {
8963
8803
  if (j >= lines.length) continue;
8964
8804
  const nextLine = lines[j].trim();
8965
8805
  if (EXPLICIT_OPTION_PREFIX.test(nextLine)) continue;
8966
- if (!/[,;\/|]|\bor\b/.test(nextLine)) continue;
8806
+ if (!/[,;/|]|\bor\b/.test(nextLine)) continue;
8967
8807
  options.push(...extractDelimitedOptions(nextLine));
8968
8808
  }
8969
8809
  return uniqueQuickReplies(options);
@@ -8978,7 +8818,7 @@ function extractInlineOptions(prompt) {
8978
8818
  if (/\b(?:options?|choices?|examples?|example answers?|examples? include|sample answers?|sample responses?)\b.*[::]/i.test(afterQuestion)) {
8979
8819
  continue;
8980
8820
  }
8981
- const hasDelimiters = /[,;\/|]|\bor\b/.test(afterQuestion);
8821
+ const hasDelimiters = /[,;/|]|\bor\b/.test(afterQuestion);
8982
8822
  const hasDashList = /\s+-\s+/.test(afterQuestion);
8983
8823
  if (!hasDelimiters && !hasDashList) continue;
8984
8824
  if (hasDelimiters) {
@@ -9013,7 +8853,7 @@ function extractImplicitOptions(prompt) {
9013
8853
  if (!line) break;
9014
8854
  if (EXPLICIT_OPTION_PREFIX.test(line)) break;
9015
8855
  if (SENTENCE_STARTER.test(line)) break;
9016
- const hasDelimiters = /[,;\/|]|\bor\b/.test(line);
8856
+ const hasDelimiters = /[,;/|]|\bor\b/.test(line);
9017
8857
  if (line.length > 80 && !hasDelimiters) break;
9018
8858
  candidates.push(line);
9019
8859
  }
@@ -9258,7 +9098,7 @@ const ResearchDesk = () => {
9258
9098
  return startError();
9259
9099
  },
9260
9100
  get children() {
9261
- var _el$1 = _tmpl$4$b();
9101
+ var _el$1 = _tmpl$4$a();
9262
9102
  insert(_el$1, startError);
9263
9103
  return _el$1;
9264
9104
  }
@@ -9545,7 +9385,7 @@ const ResearchDesk = () => {
9545
9385
  })();
9546
9386
  };
9547
9387
  delegateEvents(["input", "keydown", "click"]);
9548
- var _tmpl$$c = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$c = /* @__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>`);
9388
+ var _tmpl$$c = /* @__PURE__ */ template(`<div class=agent-muted>Loading...`), _tmpl$2$c = /* @__PURE__ */ template(`<div class=agent-muted>`), _tmpl$3$a = /* @__PURE__ */ template(`<div class=agent-muted>No changes detected yet.`), _tmpl$4$9 = /* @__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>`);
9549
9389
  const PageDiffTimeline = () => {
9550
9390
  const {
9551
9391
  activeTab
@@ -9629,7 +9469,7 @@ const PageDiffTimeline = () => {
9629
9469
  return memo(() => !!(!loading() && !error()))() && bursts().length > 0;
9630
9470
  },
9631
9471
  get children() {
9632
- return [_tmpl$4$a(), (() => {
9472
+ return [_tmpl$4$9(), (() => {
9633
9473
  var _el$6 = _tmpl$5$9();
9634
9474
  insert(_el$6, createComponent(For, {
9635
9475
  get each() {
@@ -9726,7 +9566,7 @@ const SidebarWindowControls = (props) => {
9726
9566
  };
9727
9567
  delegateEvents(["click"]);
9728
9568
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
9729
- 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(`<div class=sidebar-resize-handle>`), _tmpl$4$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$5$8 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$7$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$8$5 = /* @__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$9$4 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$1$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$10$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$11$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$12$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$13$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$14$2 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title>Load more history</span><span class=history-entry-url>Showing <!> of `), _tmpl$15$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$16$1 = /* @__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$17$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$18$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$19$1 = /* @__PURE__ */ template(`<span>`), _tmpl$20$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$22$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$23$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$24$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$25$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$26$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$27$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=sidebar><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></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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$33 = /* @__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$34 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$35 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$36 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$37 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$38 = /* @__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$39 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$41 = /* @__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$42 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$43 = /* @__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$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$46 = /* @__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$47 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$48 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$49 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$53 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$54 = /* @__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$55 = /* @__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$56 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$57 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$58 = /* @__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$59 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$64 = /* @__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$65 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
9569
+ 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(`<div class=sidebar-resize-handle>`), _tmpl$4$8 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$5$8 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$7$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$8$5 = /* @__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$9$4 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$1$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$10$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$11$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$12$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$13$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$14$2 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title>Load more history</span><span class=history-entry-url>Showing <!> of `), _tmpl$15$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$16$1 = /* @__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$17$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$18$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$19$1 = /* @__PURE__ */ template(`<span>`), _tmpl$20$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$22$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$23$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$24$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$25$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$26$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=var(--accent-primary) stroke=var(--accent-primary) 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$27$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=sidebar><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></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$32 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$33 = /* @__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$34 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$35 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$36 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$37 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$38 = /* @__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$39 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$40 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$41 = /* @__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$42 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$43 = /* @__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$44 = /* @__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$45 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$46 = /* @__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$47 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$48 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$49 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$53 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$54 = /* @__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$55 = /* @__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$56 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$57 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$58 = /* @__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$59 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<div>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$64 = /* @__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$65 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
9730
9570
  const UNSORTED_FOLDER = {
9731
9571
  id: "unsorted",
9732
9572
  name: "Unsorted",
@@ -10012,7 +9852,6 @@ ${contextBlock}` : contextBlock);
10012
9852
  const [deletingFolderId, setDeletingFolderId] = createSignal(null);
10013
9853
  const [expandedFolderIds, setExpandedFolderIds] = createSignal([UNSORTED_FOLDER.id]);
10014
9854
  const [actionsExpanded, setActionsExpanded] = createSignal(false);
10015
- const [checkpointsExpanded, setCheckpointsExpanded] = createSignal(false);
10016
9855
  const [isDragging, setIsDragging] = createSignal(false);
10017
9856
  const now2 = useNow();
10018
9857
  let messagesContainerRef;
@@ -10381,7 +10220,7 @@ ${contextBlock}` : contextBlock);
10381
10220
  return runtimeState2().supervisor.pendingApprovals.length > 0;
10382
10221
  },
10383
10222
  get children() {
10384
- var _el$17 = _tmpl$4$9();
10223
+ var _el$17 = _tmpl$4$8();
10385
10224
  insert(_el$17, () => runtimeState2().supervisor.pendingApprovals.length);
10386
10225
  return _el$17;
10387
10226
  }
@@ -11365,7 +11204,7 @@ ${contextBlock}` : contextBlock);
11365
11204
  });
11366
11205
  };
11367
11206
  delegateEvents(["click", "pointerdown", "input", "keydown"]);
11368
- 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>`);
11207
+ 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$7 = /* @__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>`);
11369
11208
  function statusClass(status) {
11370
11209
  if (status == null) return "pending";
11371
11210
  if (status >= 200 && status < 300) return "ok";
@@ -11414,7 +11253,7 @@ const ConsoleView = (props) => {
11414
11253
  autoScroll = atBottom;
11415
11254
  };
11416
11255
  createEffect(() => {
11417
- props.entries.length;
11256
+ void props.entries.length;
11418
11257
  if (autoScroll && scrollRef) {
11419
11258
  requestAnimationFrame(() => {
11420
11259
  scrollRef.scrollTop = scrollRef.scrollHeight;
@@ -11470,7 +11309,7 @@ const NetworkView = (props) => {
11470
11309
  autoScroll = atBottom;
11471
11310
  };
11472
11311
  createEffect(() => {
11473
- props.entries.length;
11312
+ void props.entries.length;
11474
11313
  if (autoScroll && scrollRef) {
11475
11314
  requestAnimationFrame(() => {
11476
11315
  scrollRef.scrollTop = scrollRef.scrollHeight;
@@ -11485,7 +11324,7 @@ const NetworkView = (props) => {
11485
11324
  return _tmpl$5$7();
11486
11325
  },
11487
11326
  get children() {
11488
- var _el$8 = _tmpl$4$8();
11327
+ var _el$8 = _tmpl$4$7();
11489
11328
  _el$8.firstChild;
11490
11329
  _el$8.addEventListener("scroll", onScroll);
11491
11330
  var _ref$2 = scrollRef;
@@ -11898,7 +11737,7 @@ const PROVIDERS = {
11898
11737
  apiKeyHint: "Optional — only if your endpoint requires authentication"
11899
11738
  }
11900
11739
  };
11901
- var _tmpl$$8 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>&times;</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<button type=button class=settings-secondary-btn>Open latest release`), _tmpl$4$7 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>Used for searches typed directly into the address bar and for agent web-search fallbacks. "None" disables address-bar search, so entries are treated as URLs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label>Updates</label><div class=settings-inline-actions><button type=button class=settings-secondary-btn></button></div><p class=settings-hint>Checks the published npm package and links to GitHub Releases for installers/AppImages.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.`), _tmpl$5$6 = /* @__PURE__ */ template(`<option>`), _tmpl$6$6 = /* @__PURE__ */ template(`<p class=settings-hint>`);
11740
+ var _tmpl$$8 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$8 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>&times;</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — switch to AI & Agent to add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown in AI & Agent</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$7 = /* @__PURE__ */ template(`<button type=button class=settings-secondary-btn>Open latest release`), _tmpl$4$6 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>Used for searches typed directly into the address bar and for agent web-search fallbacks. "None" disables address-bar search, so entries are treated as URLs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label>Updates</label><div class=settings-inline-actions><button type=button class=settings-secondary-btn></button></div><p class=settings-hint>Checks the published npm package and links to GitHub Releases for installers/AppImages.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.`), _tmpl$5$6 = /* @__PURE__ */ template(`<option>`), _tmpl$6$6 = /* @__PURE__ */ template(`<p class=settings-hint>`);
11902
11741
  const SettingsGeneral = (props) => {
11903
11742
  const [checkingUpdates, setCheckingUpdates] = createSignal(false);
11904
11743
  const [updateResult, setUpdateResult] = createSignal(null);
@@ -11911,7 +11750,7 @@ const SettingsGeneral = (props) => {
11911
11750
  }
11912
11751
  };
11913
11752
  return (() => {
11914
- var _el$ = _tmpl$4$7(), _el$0 = _el$.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$0.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$23.firstChild, _el$26 = _el$23.nextSibling, _el$27 = _el$21.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild;
11753
+ var _el$ = _tmpl$4$6(), _el$0 = _el$.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$0.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$11.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$23.firstChild, _el$26 = _el$23.nextSibling, _el$27 = _el$21.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild;
11915
11754
  insert(_el$, createComponent(Show, {
11916
11755
  get when() {
11917
11756
  return props.welcomeBanner.show();
@@ -12017,7 +11856,7 @@ const SettingsGeneral = (props) => {
12017
11856
  })();
12018
11857
  };
12019
11858
  delegateEvents(["click", "input"]);
12020
- 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>`);
11859
+ 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$5 = /* @__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=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. 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>`);
12021
11860
  const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
12022
11861
  id: p.id,
12023
11862
  name: p.name,
@@ -12169,7 +12008,7 @@ const SettingsAgent = (props) => {
12169
12008
  },
12170
12009
  get children() {
12171
12010
  return [(() => {
12172
- var _el$15 = _tmpl$4$6(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
12011
+ var _el$15 = _tmpl$4$5(), _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling;
12173
12012
  _el$17.firstChild;
12174
12013
  insert(_el$17, () => props.chat.codexAccountEmail() || "ChatGPT", null);
12175
12014
  return _el$15;
@@ -12428,7 +12267,7 @@ const SettingsAgent = (props) => {
12428
12267
  })();
12429
12268
  };
12430
12269
  delegateEvents(["click", "input"]);
12431
- 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;`);
12270
+ 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$4 = /* @__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;`);
12432
12271
  const SettingsVaults = (props) => {
12433
12272
  const v = props.vault;
12434
12273
  const h = props.humanVault;
@@ -12490,7 +12329,7 @@ const SettingsVaults = (props) => {
12490
12329
  return !v.adding();
12491
12330
  },
12492
12331
  get children() {
12493
- var _el$8 = _tmpl$4$5();
12332
+ var _el$8 = _tmpl$4$4();
12494
12333
  _el$8.$$click = () => {
12495
12334
  v.setAdding(true);
12496
12335
  v.setMessage(null);
@@ -12788,7 +12627,7 @@ const SettingsVaults = (props) => {
12788
12627
  })();
12789
12628
  };
12790
12629
  delegateEvents(["click", "input"]);
12791
- var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$4$4 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-field><label class=settings-label for=source-do-not-allow-list>Source Do Not Allow List</label><textarea id=source-do-not-allow-list class="settings-input settings-textarea"rows=4 placeholder="example.com
12630
+ var _tmpl$$5 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$2$5 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$3$4 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$4$3 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-field><label class=settings-label for=source-do-not-allow-list>Source Do Not Allow List</label><textarea id=source-do-not-allow-list class="settings-input settings-textarea"rows=4 placeholder="example.com
12792
12631
  low-quality-source.net"></textarea><p class=settings-hint>One domain per line. Research Desk will avoid citing or visiting these sources during research, without blocking normal browsing.</p></div><div class=settings-field><label class=settings-label>Site Permissions</label><p class=settings-hint>Camera, microphone, location, notifications, and other site capability choices remembered by Vessel.</p><div class=settings-list></div><button type=button class=settings-secondary-btn>Clear saved permissions</button></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Anonymous Usage Analytics</span></label><p class=settings-hint>Help improve Vessel by sending anonymous usage data (tool popularity, session duration, provider type). No URLs, page content, queries, or personal data is ever collected.`), _tmpl$5$3 = /* @__PURE__ */ template(`<p class=settings-hint>No saved permission decisions yet.`), _tmpl$6$3 = /* @__PURE__ */ template(`<div class=settings-list-row><span></span><span>: `);
12793
12632
  const SettingsPrivacy = (props) => {
12794
12633
  const [permissions, setPermissions] = createSignal([]);
@@ -12797,7 +12636,7 @@ const SettingsPrivacy = (props) => {
12797
12636
  void loadPermissions();
12798
12637
  });
12799
12638
  return (() => {
12800
- var _el$ = _tmpl$4$4(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$8.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$1.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
12639
+ var _el$ = _tmpl$4$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$8 = _el$2.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$8.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$13 = _el$12.nextSibling, _el$14 = _el$1.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild;
12801
12640
  _el$4.addEventListener("change", (e) => props.setDomainMode(e.currentTarget.value));
12802
12641
  insert(_el$2, createComponent(Show, {
12803
12642
  get when() {
@@ -12863,7 +12702,7 @@ const SettingsPrivacy = (props) => {
12863
12702
  })();
12864
12703
  };
12865
12704
  delegateEvents(["input", "click"]);
12866
- 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;`);
12705
+ 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$2 = /* @__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;`);
12867
12706
  const SettingsAccount = (props) => {
12868
12707
  const p = props.premium;
12869
12708
  const s = props.sessions;
@@ -12895,7 +12734,7 @@ const SettingsAccount = (props) => {
12895
12734
  }
12896
12735
  };
12897
12736
  return (() => {
12898
- 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;
12737
+ var _el$ = _tmpl$4$2(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$1 = _el$2.nextSibling;
12899
12738
  _el$1.firstChild;
12900
12739
  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;
12901
12740
  _el$5.$$click = () => {
@@ -13219,715 +13058,7 @@ const SettingsAccount = (props) => {
13219
13058
  })();
13220
13059
  };
13221
13060
  delegateEvents(["click", "input"]);
13222
- var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><span class=settings-compact-upsell-text>Premium: screenshots, saved sessions, credential vault, and longer autonomous runs.</span><div class=settings-compact-upsell-actions><button class="premium-btn premium-btn-upgrade">Try free for 7 days</button><button class="premium-btn premium-btn-activate">Activate`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><div class=settings-layout><nav class=settings-sidebar role=navigation aria-label="Settings categories"><button class=settings-nav-item><span>General</span></button><button class=settings-nav-item><span>AI & Agent</span></button><button class=settings-nav-item><span>Vaults</span></button><button class=settings-nav-item><span>Privacy</span></button><button class=settings-nav-item><span>Account</span></button></nav><div class=settings-content></div></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$3$2 = /* @__PURE__ */ template(`<style>
13223
- .settings-panel {
13224
- width: min(820px, calc(100vw - 32px));
13225
- max-height: calc(100vh - 48px);
13226
- display: flex;
13227
- flex-direction: column;
13228
- overflow: hidden;
13229
- background: var(--bg-elevated);
13230
- border: 1px solid var(--border-visible);
13231
- border-radius: 14px;
13232
- padding: 28px 24px 24px;
13233
- overscroll-behavior: contain;
13234
- box-shadow:
13235
- 0 4px 24px var(--shadow-color),
13236
- 0 24px 64px var(--shadow-color-strong),
13237
- inset 0 1px 0 var(--inset-highlight);
13238
- animation: command-bar-enter 350ms var(--ease-out-expo) both;
13239
- }
13240
- .command-bar-overlay.closing .settings-panel {
13241
- animation: command-bar-exit 200ms var(--ease-in-out) both;
13242
- }
13243
- .settings-title {
13244
- font-size: 16px;
13245
- font-weight: 600;
13246
- color: var(--text-primary);
13247
- margin-bottom: 22px;
13248
- letter-spacing: 0.01em;
13249
- flex-shrink: 0;
13250
- }
13251
-
13252
- /* Compact global upsell */
13253
- .settings-compact-upsell {
13254
- flex-shrink: 0;
13255
- display: flex;
13256
- align-items: center;
13257
- justify-content: space-between;
13258
- gap: 12px;
13259
- padding: 8px 14px;
13260
- margin-bottom: 16px;
13261
- border-radius: var(--radius-md);
13262
- background: color-mix(in srgb, var(--accent-primary) 8%, transparent);
13263
- border: 1px solid color-mix(in srgb, var(--accent-primary) 18%, transparent);
13264
- }
13265
- .settings-compact-upsell-text {
13266
- font-size: 12px;
13267
- color: var(--text-secondary);
13268
- line-height: 1.4;
13269
- }
13270
- .settings-compact-upsell-actions {
13271
- display: flex;
13272
- gap: 8px;
13273
- flex-shrink: 0;
13274
- }
13275
- .settings-compact-upsell-actions .premium-btn {
13276
- font-size: 11px;
13277
- padding: 4px 12px;
13278
- height: auto;
13279
- }
13280
-
13281
- /* Sidebar + Content layout */
13282
- .settings-layout {
13283
- flex: 1;
13284
- min-height: 0;
13285
- display: flex;
13286
- gap: 0;
13287
- }
13288
- .settings-sidebar {
13289
- width: 170px;
13290
- flex-shrink: 0;
13291
- border-right: 1px solid var(--border-subtle);
13292
- padding: 8px 8px 8px 0;
13293
- display: flex;
13294
- flex-direction: column;
13295
- gap: 2px;
13296
- }
13297
- .settings-nav-item {
13298
- display: flex;
13299
- align-items: center;
13300
- gap: 10px;
13301
- width: 100%;
13302
- padding: 8px 12px;
13303
- border-radius: var(--radius-md);
13304
- font-size: 12px;
13305
- color: var(--text-secondary);
13306
- background: transparent;
13307
- border: none;
13308
- cursor: pointer;
13309
- transition: background var(--duration-fast), color var(--duration-fast);
13310
- text-align: left;
13311
- }
13312
- .settings-nav-item:hover {
13313
- background: var(--surface-hover);
13314
- color: var(--text-primary);
13315
- }
13316
- .settings-nav-item:focus-visible {
13317
- outline: 1px solid var(--accent-primary);
13318
- outline-offset: -1px;
13319
- }
13320
- .settings-nav-item.active {
13321
- background: color-mix(in srgb, var(--accent-primary) 12%, transparent);
13322
- color: var(--accent-primary);
13323
- font-weight: 500;
13324
- }
13325
- .settings-nav-item svg {
13326
- flex-shrink: 0;
13327
- }
13328
- .settings-content {
13329
- flex: 1;
13330
- min-width: 0;
13331
- overflow-y: auto;
13332
- padding: 0 0 0 20px;
13333
- overscroll-behavior: contain;
13334
- scrollbar-gutter: stable;
13335
- }
13336
- .settings-category-panel {
13337
- /* wrapper for each category's content */
13338
- }
13339
-
13340
- /* Mobile: stack sidebar above content */
13341
- @media (max-width: 700px) {
13342
- .settings-panel {
13343
- width: min(440px, calc(100vw - 32px));
13344
- }
13345
- .settings-layout {
13346
- flex-direction: column;
13347
- }
13348
- .settings-sidebar {
13349
- flex-direction: row;
13350
- width: 100%;
13351
- border-right: none;
13352
- border-bottom: 1px solid var(--border-subtle);
13353
- padding: 0 0 8px 0;
13354
- margin-bottom: 12px;
13355
- overflow-x: auto;
13356
- gap: 2px;
13357
- }
13358
- .settings-nav-item {
13359
- flex-shrink: 0;
13360
- width: auto;
13361
- padding: 6px 10px;
13362
- font-size: 11px;
13363
- }
13364
- .settings-nav-item span {
13365
- display: none;
13366
- }
13367
- .settings-content {
13368
- padding-left: 0;
13369
- }
13370
- }
13371
-
13372
- .settings-callout {
13373
- margin-bottom: 20px;
13374
- padding: 14px;
13375
- border-radius: var(--radius-md);
13376
- border: 1px solid color-mix(in srgb, var(--accent-primary) 14%, transparent);
13377
- background: color-mix(in srgb, var(--accent-primary) 6%, transparent);
13378
- }
13379
- .settings-callout-title {
13380
- font-size: 12px;
13381
- font-weight: 600;
13382
- color: var(--text-primary);
13383
- margin-bottom: 6px;
13384
- letter-spacing: 0.01em;
13385
- }
13386
- .settings-callout-copy {
13387
- font-size: 12px;
13388
- line-height: 1.55;
13389
- color: var(--text-secondary);
13390
- margin: 0;
13391
- }
13392
- .settings-premium-callout {
13393
- background:
13394
- radial-gradient(circle at top right, color-mix(in srgb, var(--accent-primary) 16%, transparent), transparent 40%),
13395
- color-mix(in srgb, var(--accent-primary) 6%, transparent);
13396
- border-color: color-mix(in srgb, var(--accent-primary) 22%, transparent);
13397
- }
13398
- .settings-premium-callout-actions {
13399
- display: flex;
13400
- flex-wrap: wrap;
13401
- gap: 10px;
13402
- margin-top: 12px;
13403
- }
13404
- .settings-field {
13405
- margin-bottom: 18px;
13406
- }
13407
- .settings-health {
13408
- margin-bottom: 20px;
13409
- padding: 14px;
13410
- border-radius: var(--radius-md);
13411
- border: 1px solid var(--border-visible);
13412
- background: var(--surface-glass);
13413
- }
13414
- .settings-health-issues {
13415
- display: flex;
13416
- flex-direction: column;
13417
- gap: 8px;
13418
- margin-top: 10px;
13419
- }
13420
- .settings-health-issue {
13421
- font-size: 12px;
13422
- line-height: 1.5;
13423
- padding: 10px 12px;
13424
- border-radius: var(--radius-md);
13425
- border: 1px solid var(--border-glass);
13426
- color: var(--text-secondary);
13427
- }
13428
- .settings-health-issue.warning {
13429
- border-color: color-mix(in srgb, var(--accent-primary) 28%, transparent);
13430
- background: color-mix(in srgb, var(--accent-primary) 6%, transparent);
13431
- }
13432
- .settings-health-issue.error {
13433
- border-color: color-mix(in srgb, var(--status-error) 32%, transparent);
13434
- background: color-mix(in srgb, var(--status-error) 6%, transparent);
13435
- }
13436
- .settings-inline-actions {
13437
- display: flex;
13438
- flex-wrap: wrap;
13439
- gap: 8px;
13440
- margin-bottom: 8px;
13441
- }
13442
- .settings-secondary-btn {
13443
- height: 32px;
13444
- padding: 0 12px;
13445
- border-radius: var(--radius-md);
13446
- border: 1px solid var(--border-visible);
13447
- background: var(--surface-glass);
13448
- color: var(--text-primary);
13449
- font-size: 12px;
13450
- cursor: pointer;
13451
- }
13452
- .settings-secondary-btn:hover:not(:disabled) {
13453
- background: var(--bg-tertiary);
13454
- }
13455
- .settings-secondary-btn:disabled {
13456
- opacity: 0.55;
13457
- cursor: not-allowed;
13458
- }
13459
- .settings-label {
13460
- display: block;
13461
- font-size: 12px;
13462
- color: var(--text-secondary);
13463
- margin-bottom: 6px;
13464
- font-weight: 500;
13465
- letter-spacing: 0.01em;
13466
- }
13467
- .settings-label-optional {
13468
- font-size: 11px;
13469
- color: var(--text-muted);
13470
- font-style: italic;
13471
- }
13472
- .settings-input {
13473
- width: 100%;
13474
- height: 34px;
13475
- padding: 0 10px;
13476
- margin: 0;
13477
- border-radius: var(--radius-md);
13478
- border: 1px solid var(--border-visible);
13479
- background: var(--surface-glass);
13480
- color: var(--text-primary);
13481
- font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
13482
- font-size: 12px;
13483
- line-height: 1;
13484
- box-sizing: border-box;
13485
- text-rendering: auto;
13486
- }
13487
- .settings-select {
13488
- appearance: none;
13489
- padding-right: 30px;
13490
- background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'/%3E%3C/svg%3E");
13491
- background-repeat: no-repeat;
13492
- background-position: right 10px center;
13493
- }
13494
- .settings-textarea {
13495
- width: 100%;
13496
- padding: 8px 10px;
13497
- margin: 0;
13498
- border-radius: var(--radius-md);
13499
- border: 1px solid var(--border-visible);
13500
- background: var(--surface-glass);
13501
- color: var(--text-primary);
13502
- font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
13503
- font-size: 12px;
13504
- min-height: 120px;
13505
- resize: vertical;
13506
- box-sizing: border-box;
13507
- line-height: 1.5;
13508
- }
13509
- .settings-feedback-textarea {
13510
- margin-top: 8px;
13511
- min-height: 96px;
13512
- }
13513
- .settings-input:focus,
13514
- .settings-textarea:focus {
13515
- outline: none;
13516
- border-color: var(--accent-primary);
13517
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-primary) 18%, transparent);
13518
- }
13519
- .settings-hint {
13520
- font-size: 11px;
13521
- color: var(--text-muted);
13522
- margin-top: 4px;
13523
- line-height: 1.5;
13524
- }
13525
- .settings-hint code {
13526
- font-size: 11px;
13527
- background: var(--bg-tertiary);
13528
- padding: 1px 5px;
13529
- border-radius: 3px;
13530
- }
13531
- .settings-toggle {
13532
- display: flex;
13533
- align-items: center;
13534
- justify-content: space-between;
13535
- gap: 12px;
13536
- font-size: 12px;
13537
- color: var(--text-secondary);
13538
- cursor: pointer;
13539
- user-select: none;
13540
- }
13541
- .toggle-switch {
13542
- position: relative;
13543
- display: inline-block;
13544
- width: 36px;
13545
- height: 20px;
13546
- border-radius: 10px;
13547
- background: color-mix(in srgb, var(--text-muted) 40%, transparent);
13548
- border: none;
13549
- cursor: pointer;
13550
- flex-shrink: 0;
13551
- transition: background var(--duration-fast);
13552
- }
13553
- .toggle-switch:hover {
13554
- background: color-mix(in srgb, var(--text-muted) 60%, transparent);
13555
- }
13556
- .toggle-switch.on {
13557
- background: var(--accent-primary);
13558
- }
13559
- .toggle-switch.on:hover {
13560
- background: var(--button-primary-hover-bg);
13561
- }
13562
- .toggle-switch-thumb {
13563
- position: absolute;
13564
- top: 3px;
13565
- left: 3px;
13566
- width: 14px;
13567
- height: 14px;
13568
- border-radius: 7px;
13569
- background: #fff;
13570
- transition: transform var(--duration-fast);
13571
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
13572
- }
13573
- .toggle-switch.on .toggle-switch-thumb {
13574
- transform: translateX(16px);
13575
- }
13576
- .settings-status {
13577
- margin-top: 12px;
13578
- font-size: 12px;
13579
- color: var(--text-secondary);
13580
- line-height: 1.5;
13581
- }
13582
- .settings-status.success {
13583
- color: var(--status-success, #52c41a);
13584
- }
13585
- .settings-status.error {
13586
- color: var(--status-error, #f43f5e);
13587
- }
13588
- .settings-actions {
13589
- display: flex;
13590
- gap: 10px;
13591
- justify-content: flex-end;
13592
- margin-top: 20px;
13593
- flex-shrink: 0;
13594
- }
13595
- .settings-save {
13596
- height: 34px;
13597
- padding: 0 18px;
13598
- border-radius: var(--radius-md);
13599
- border: none;
13600
- font-size: 12px;
13601
- font-weight: 600;
13602
- background: var(--accent-primary);
13603
- color: var(--button-primary-fg);
13604
- cursor: pointer;
13605
- transition: background var(--duration-fast);
13606
- }
13607
- .settings-save:hover {
13608
- background: var(--button-primary-hover-bg);
13609
- }
13610
- .settings-close {
13611
- height: 34px;
13612
- padding: 0 18px;
13613
- border-radius: var(--radius-md);
13614
- border: 1px solid var(--border-visible);
13615
- font-size: 12px;
13616
- background: var(--surface-glass);
13617
- color: var(--text-secondary);
13618
- cursor: pointer;
13619
- transition: background var(--duration-fast);
13620
- }
13621
- .settings-close:hover {
13622
- background: var(--surface-hover);
13623
- }
13624
- .settings-refresh-btn {
13625
- width: 32px;
13626
- height: 32px;
13627
- border: 1px solid var(--border-visible);
13628
- border-radius: var(--radius-md);
13629
- background: var(--surface-glass);
13630
- color: var(--text-secondary);
13631
- cursor: pointer;
13632
- display: flex;
13633
- align-items: center;
13634
- justify-content: center;
13635
- transition: background var(--duration-fast);
13636
- flex-shrink: 0;
13637
- }
13638
- .settings-refresh-btn:hover {
13639
- background: var(--surface-hover);
13640
- }
13641
- .settings-refresh-btn:disabled {
13642
- opacity: 0.5;
13643
- cursor: not-allowed;
13644
- }
13645
- .settings-input-disabled {
13646
- display: flex;
13647
- align-items: center;
13648
- width: 100%;
13649
- height: 34px;
13650
- padding: 0 10px;
13651
- border-radius: var(--radius-md);
13652
- border: 1px solid var(--border-subtle);
13653
- background: var(--bg-tertiary);
13654
- color: var(--text-muted);
13655
- font-size: 12px;
13656
- opacity: 0.7;
13657
- cursor: not-allowed;
13658
- }
13659
-
13660
- /* --- Premium section --- */
13661
- .premium-section {
13662
- display: flex;
13663
- flex-direction: column;
13664
- }
13665
- .premium-description {
13666
- font-size: 12px;
13667
- line-height: 1.6;
13668
- color: var(--text-secondary);
13669
- margin: 0 0 12px;
13670
- }
13671
- .premium-activate-row {
13672
- display: flex;
13673
- gap: 10px;
13674
- align-items: center;
13675
- }
13676
- .premium-email-input {
13677
- flex: 1;
13678
- }
13679
- .premium-btn {
13680
- height: 34px;
13681
- padding: 0 16px;
13682
- border-radius: var(--radius-md);
13683
- font-size: 12px;
13684
- font-weight: 500;
13685
- cursor: pointer;
13686
- transition: background var(--duration-fast), transform var(--duration-fast);
13687
- white-space: nowrap;
13688
- }
13689
- .premium-btn:active {
13690
- transform: scale(0.97);
13691
- }
13692
- .premium-btn:disabled {
13693
- opacity: 0.5;
13694
- cursor: not-allowed;
13695
- }
13696
- .premium-btn-activate {
13697
- background: var(--surface-glass);
13698
- border: 1px solid var(--border-visible);
13699
- color: var(--text-primary);
13700
- }
13701
- .premium-btn-activate:hover {
13702
- background: var(--surface-hover);
13703
- }
13704
- .premium-btn-upgrade {
13705
- background: var(--accent-primary);
13706
- border: none;
13707
- color: var(--button-primary-fg);
13708
- }
13709
- .premium-btn-upgrade:hover {
13710
- background: var(--button-primary-hover-bg);
13711
- }
13712
- .premium-btn-manage {
13713
- background: var(--surface-glass);
13714
- border: 1px solid var(--border-visible);
13715
- color: var(--text-primary);
13716
- align-self: flex-start;
13717
- }
13718
- .premium-btn-manage:hover {
13719
- background: var(--surface-hover);
13720
- }
13721
- .premium-active-badge {
13722
- display: inline-block;
13723
- font-size: 11px;
13724
- font-weight: 600;
13725
- color: var(--button-primary-fg);
13726
- background: var(--status-success, #52c41a);
13727
- padding: 2px 10px;
13728
- border-radius: 4px;
13729
- margin-bottom: 10px;
13730
- }
13731
- .premium-detail {
13732
- font-size: 11px;
13733
- color: var(--text-muted);
13734
- margin: 6px 0;
13735
- }
13736
- .premium-actions-row {
13737
- display: flex;
13738
- gap: 10px;
13739
- margin-top: 10px;
13740
- }
13741
- .premium-btn-reset {
13742
- height: 30px;
13743
- padding: 0 12px;
13744
- border-radius: var(--radius-md);
13745
- border: 1px solid var(--border-subtle);
13746
- background: transparent;
13747
- color: var(--text-muted);
13748
- font-size: 11px;
13749
- cursor: pointer;
13750
- }
13751
- .premium-btn-reset:hover {
13752
- background: var(--surface-hover);
13753
- }
13754
-
13755
- /* Welcome banner */
13756
- .welcome-banner {
13757
- margin-bottom: 20px;
13758
- padding: 16px;
13759
- border-radius: var(--radius-md);
13760
- border: 1px solid color-mix(in srgb, var(--accent-primary) 22%, transparent);
13761
- background: color-mix(in srgb, var(--accent-primary) 8%, transparent);
13762
- }
13763
- .welcome-banner-header {
13764
- display: flex;
13765
- align-items: center;
13766
- justify-content: space-between;
13767
- margin-bottom: 8px;
13768
- }
13769
- .welcome-banner-title {
13770
- font-size: 13px;
13771
- font-weight: 600;
13772
- color: var(--accent-primary);
13773
- }
13774
- .welcome-banner-dismiss {
13775
- width: 24px;
13776
- height: 24px;
13777
- border-radius: 4px;
13778
- background: transparent;
13779
- border: none;
13780
- color: var(--text-muted);
13781
- font-size: 18px;
13782
- cursor: pointer;
13783
- display: flex;
13784
- align-items: center;
13785
- justify-content: center;
13786
- }
13787
- .welcome-banner-dismiss:hover {
13788
- background: var(--surface-hover);
13789
- color: var(--text-primary);
13790
- }
13791
- .welcome-banner-text {
13792
- font-size: 12px;
13793
- color: var(--text-secondary);
13794
- margin: 0 0 8px;
13795
- }
13796
- .welcome-banner-steps {
13797
- margin: 8px 0 0 16px;
13798
- padding: 0;
13799
- font-size: 12px;
13800
- color: var(--text-secondary);
13801
- line-height: 1.7;
13802
- }
13803
- .welcome-banner-steps li.done {
13804
- color: var(--text-muted);
13805
- text-decoration: line-through;
13806
- }
13807
- .welcome-banner-steps kbd {
13808
- display: inline-block;
13809
- padding: 1px 5px;
13810
- font-size: 11px;
13811
- font-family: "JetBrains Mono", "SF Mono", monospace;
13812
- background: var(--bg-tertiary);
13813
- border: 1px solid var(--border-subtle);
13814
- border-radius: 3px;
13815
- margin: 0 2px;
13816
- }
13817
- .welcome-banner-actions {
13818
- margin-top: 14px;
13819
- display: flex;
13820
- flex-wrap: wrap;
13821
- gap: 10px;
13822
- align-items: center;
13823
- }
13824
- .welcome-banner-note {
13825
- font-size: 11px;
13826
- line-height: 1.5;
13827
- color: var(--text-muted);
13828
- max-width: 360px;
13829
- }
13830
-
13831
- /* Agent Credential Vault */
13832
- .vault-premium-badge {
13833
- display: inline-block;
13834
- font-size: 10px;
13835
- font-weight: 600;
13836
- color: var(--accent-primary);
13837
- background: color-mix(in srgb, var(--accent-primary) 15%, transparent);
13838
- padding: 1px 6px;
13839
- border-radius: 4px;
13840
- margin-left: 8px;
13841
- vertical-align: middle;
13842
- }
13843
- .vault-entries {
13844
- display: flex;
13845
- flex-direction: column;
13846
- gap: 6px;
13847
- margin-bottom: 10px;
13848
- }
13849
- .vault-entry {
13850
- display: flex;
13851
- align-items: center;
13852
- justify-content: space-between;
13853
- padding: 8px 12px;
13854
- background: var(--bg-tertiary);
13855
- border: 1px solid var(--border-subtle);
13856
- border-radius: var(--radius-md);
13857
- }
13858
- .vault-entry-info {
13859
- display: flex;
13860
- flex-direction: column;
13861
- gap: 2px;
13862
- min-width: 0;
13863
- }
13864
- .vault-entry-label {
13865
- font-size: 12px;
13866
- font-weight: 500;
13867
- color: var(--text-primary);
13868
- white-space: nowrap;
13869
- overflow: hidden;
13870
- text-overflow: ellipsis;
13871
- }
13872
- .vault-entry-detail {
13873
- font-size: 11px;
13874
- color: var(--text-muted);
13875
- white-space: nowrap;
13876
- overflow: hidden;
13877
- text-overflow: ellipsis;
13878
- }
13879
- .vault-entry-remove {
13880
- flex-shrink: 0;
13881
- width: 24px;
13882
- height: 24px;
13883
- border-radius: 4px;
13884
- background: transparent;
13885
- border: none;
13886
- color: var(--text-muted);
13887
- font-size: 16px;
13888
- cursor: pointer;
13889
- display: flex;
13890
- align-items: center;
13891
- justify-content: center;
13892
- transition: background var(--duration-fast), color var(--duration-fast);
13893
- }
13894
- .vault-entry-remove:hover {
13895
- background: color-mix(in srgb, var(--status-error) 12%, transparent);
13896
- color: var(--status-error);
13897
- }
13898
- .vault-add-btn {
13899
- height: 32px;
13900
- padding: 0 14px;
13901
- border-radius: var(--radius-md);
13902
- font-size: 12px;
13903
- font-weight: 500;
13904
- background: var(--bg-tertiary);
13905
- border: 1px dashed var(--border-subtle);
13906
- color: var(--text-secondary);
13907
- cursor: pointer;
13908
- width: 100%;
13909
- transition: background var(--duration-fast), border-color var(--duration-fast);
13910
- }
13911
- .vault-add-btn:hover {
13912
- background: var(--border-visible);
13913
- border-color: var(--border-visible);
13914
- }
13915
- .vault-add-form {
13916
- display: flex;
13917
- flex-direction: column;
13918
- gap: 8px;
13919
- padding: 12px;
13920
- background: var(--surface-glass);
13921
- border: 1px solid var(--border-subtle);
13922
- border-radius: var(--radius-md);
13923
- }
13924
- .vault-add-actions {
13925
- display: flex;
13926
- gap: 8px;
13927
- justify-content: flex-end;
13928
- margin-top: 4px;
13929
- }
13930
- `), _tmpl$4$2 = /* @__PURE__ */ template(`<p class=settings-status>`);
13061
+ var _tmpl$$3 = /* @__PURE__ */ template(`<div class=settings-compact-upsell><span class=settings-compact-upsell-text>Premium: screenshots, saved sessions, credential vault, and longer autonomous runs.</span><div class=settings-compact-upsell-actions><button class="premium-btn premium-btn-upgrade">Try free for 7 days</button><button class="premium-btn premium-btn-activate">Activate`), _tmpl$2$3 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><div class=settings-layout><nav class=settings-sidebar role=navigation aria-label="Settings categories"><button class=settings-nav-item><span>General</span></button><button class=settings-nav-item><span>AI & Agent</span></button><button class=settings-nav-item><span>Vaults</span></button><button class=settings-nav-item><span>Privacy</span></button><button class=settings-nav-item><span>Account</span></button></nav><div class=settings-content></div></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$3$2 = /* @__PURE__ */ template(`<p class=settings-status>`);
13931
13062
  const CHAT_PROVIDERS = Object.values(PROVIDERS).map((p) => ({
13932
13063
  id: p.id,
13933
13064
  name: p.name,
@@ -13964,7 +13095,7 @@ const Settings = () => {
13964
13095
  const [obsidianVaultPath, setObsidianVaultPath] = createSignal("");
13965
13096
  const [mcpPort, setMcpPort] = createSignal("3100");
13966
13097
  const [maxToolIterations, setMaxToolIterations] = createSignal("200");
13967
- const [agentTranscriptMode, setAgentTranscriptMode] = createSignal("summary");
13098
+ const [agentTranscriptMode, setAgentTranscriptMode] = createSignal("off");
13968
13099
  const [health, setHealth] = createSignal(null);
13969
13100
  const [defaultUrl, setDefaultUrl] = createSignal("https://start.duckduckgo.com");
13970
13101
  const [defaultSearchEngine, setDefaultSearchEngine] = createSignal("duckduckgo");
@@ -14373,7 +13504,7 @@ const Settings = () => {
14373
13504
  setObsidianVaultPath(settings.obsidianVaultPath ?? "");
14374
13505
  setMcpPort(String(settings.mcpPort ?? 3100));
14375
13506
  setMaxToolIterations(String(settings.maxToolIterations ?? 200));
14376
- setAgentTranscriptMode(settings.agentTranscriptMode ?? "summary");
13507
+ setAgentTranscriptMode(settings.agentTranscriptMode ?? "off");
14377
13508
  setHealth(runtimeHealth);
14378
13509
  const cp = settings.chatProvider ?? null;
14379
13510
  setChatEnabled(cp !== null);
@@ -14517,315 +13648,313 @@ const Settings = () => {
14517
13648
  return settingsVisible();
14518
13649
  },
14519
13650
  get children() {
14520
- return [(() => {
14521
- var _el$ = _tmpl$2$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$9 = _el$3.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$1.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$11.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$13.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$15.nextSibling, _el$18 = _el$17.firstChild, _el$19 = _el$0.nextSibling, _el$20 = _el$9.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$21.nextSibling;
14522
- addEventListener(_el$, "click", closeSettings, true);
14523
- _el$2.$$keydown = handleKeyDown;
14524
- _el$2.$$click = (e) => e.stopPropagation();
14525
- insert(_el$2, createComponent(Show, {
14526
- get when() {
14527
- return !premiumActive();
14528
- },
14529
- get children() {
14530
- var _el$4 = _tmpl$$3(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
14531
- _el$7.$$click = () => {
14532
- void trackPremiumContext("settings_banner_clicked");
14533
- startPremiumCheckout();
14534
- };
14535
- _el$8.$$click = () => selectCategory("account");
14536
- return _el$4;
14537
- }
14538
- }), _el$9);
14539
- _el$1.$$click = () => selectCategory("general");
14540
- insert(_el$1, createComponent(globe_default, {
14541
- size: 16
14542
- }), _el$10);
14543
- _el$11.$$click = () => selectCategory("agent");
14544
- insert(_el$11, createComponent(cpu_default, {
14545
- size: 16
14546
- }), _el$12);
14547
- _el$13.$$click = () => selectCategory("vaults");
14548
- insert(_el$13, createComponent(shield_default, {
14549
- size: 16
14550
- }), _el$14);
14551
- _el$15.$$click = () => selectCategory("privacy");
14552
- insert(_el$15, createComponent(lock_default, {
14553
- size: 16
14554
- }), _el$16);
14555
- _el$17.$$click = () => selectCategory("account");
14556
- insert(_el$17, createComponent(user_default, {
14557
- size: 16
14558
- }), _el$18);
14559
- var _ref$ = settingsContentEl;
14560
- typeof _ref$ === "function" ? use(_ref$, _el$19) : settingsContentEl = _el$19;
14561
- insert(_el$19, createComponent(Show, {
14562
- get when() {
14563
- return activeCategory() === "general";
14564
- },
14565
- get children() {
14566
- return createComponent(SettingsGeneral, {
14567
- welcomeBanner: {
14568
- show: showWelcome,
14569
- dismiss: dismissWelcome
14570
- },
14571
- defaultUrl,
14572
- setDefaultUrl,
14573
- defaultSearchEngine,
14574
- setDefaultSearchEngine,
14575
- downloadPath,
14576
- setDownloadPath,
14577
- theme,
14578
- setTheme,
14579
- autoRestoreSession,
14580
- setAutoRestoreSession,
14581
- clearBookmarksOnLaunch,
14582
- setClearBookmarksOnLaunch,
14583
- premiumActive,
14584
- startPremiumCheckout
14585
- });
14586
- }
14587
- }), null);
14588
- insert(_el$19, createComponent(Show, {
14589
- get when() {
14590
- return activeCategory() === "agent";
14591
- },
14592
- get children() {
14593
- return createComponent(SettingsAgent, {
14594
- get chat() {
14595
- return {
14596
- enabled: chatEnabled,
14597
- setEnabled: setChatEnabled,
14598
- providerId: chatProviderId,
14599
- setProviderId: setChatProviderId,
14600
- apiKey: chatApiKey,
14601
- setApiKey: setChatApiKey,
14602
- hasStoredApiKey: chatHasStoredApiKey,
14603
- setHasStoredApiKey: setChatHasStoredApiKey,
14604
- model: chatModel,
14605
- setModel: setChatModel,
14606
- baseUrl: chatBaseUrl,
14607
- setBaseUrl: setChatBaseUrl,
14608
- reasoningEffort: chatReasoningEffort,
14609
- setReasoningEffort: setChatReasoningEffort,
14610
- providerModels,
14611
- modelFetchState,
14612
- modelFetchWarning,
14613
- doFetchModels,
14614
- resetProviderModels,
14615
- codexAuthStatus: providerAuth.codexAuthStatus,
14616
- codexAccountEmail: providerAuth.codexAccountEmail,
14617
- setCodexAccountEmail: providerAuth.setCodexAccountEmail,
14618
- codexAuthError: providerAuth.codexAuthError,
14619
- setCodexAuthError: providerAuth.setCodexAuthError,
14620
- openRouterAuthStatus: providerAuth.openRouterAuthStatus,
14621
- openRouterAuthError: providerAuth.openRouterAuthError,
14622
- providerType,
14623
- startCodexAuth: providerAuth.startCodexAuth,
14624
- disconnectCodex: providerAuth.disconnectCodex,
14625
- startOpenRouterAuth: providerAuth.startOpenRouterAuth
14626
- };
14627
- },
14628
- mcpPort,
14629
- setMcpPort,
14630
- maxToolIterations,
14631
- setMaxToolIterations,
14632
- agentTranscriptMode,
14633
- setAgentTranscriptMode,
14634
- obsidianVaultPath,
14635
- setObsidianVaultPath,
14636
- health,
14637
- premiumActive
14638
- });
14639
- }
14640
- }), null);
14641
- insert(_el$19, createComponent(Show, {
14642
- get when() {
14643
- return activeCategory() === "vaults";
14644
- },
14645
- get children() {
14646
- return createComponent(SettingsVaults, {
14647
- premiumActive,
14648
- vault: {
14649
- entries: vaultEntries,
14650
- expanded: vaultExpanded,
14651
- setExpanded: setVaultExpanded,
14652
- adding: vaultAdding,
14653
- setAdding: setVaultAdding,
14654
- newLabel: vaultNewLabel,
14655
- setNewLabel: setVaultNewLabel,
14656
- newDomain: vaultNewDomain,
14657
- setNewDomain: setVaultNewDomain,
14658
- newUsername: vaultNewUsername,
14659
- setNewUsername: setVaultNewUsername,
14660
- newPassword: vaultNewPassword,
14661
- setNewPassword: setVaultNewPassword,
14662
- newTotp: vaultNewTotp,
14663
- setNewTotp: setVaultNewTotp,
14664
- newNotes: vaultNewNotes,
14665
- setNewNotes: setVaultNewNotes,
14666
- message: vaultMessage,
14667
- setMessage: setVaultMessage,
14668
- handleAdd: handleVaultAdd,
14669
- handleRemove: handleVaultRemove
14670
- },
14671
- humanVault: {
14672
- entries: humanEntries,
14673
- adding: humanAdding,
14674
- setAdding: setHumanAdding,
14675
- newTitle: humanNewTitle,
14676
- setNewTitle: setHumanNewTitle,
14677
- newUrl: humanNewUrl,
14678
- setNewUrl: setHumanNewUrl,
14679
- newUsername: humanNewUsername,
14680
- setNewUsername: setHumanNewUsername,
14681
- newPassword: humanNewPassword,
14682
- setNewPassword: setHumanNewPassword,
14683
- newCategory: humanNewCategory,
14684
- setNewCategory: setHumanNewCategory,
14685
- newNotes: humanNewNotes,
14686
- setNewNotes: setHumanNewNotes,
14687
- message: humanMessage,
14688
- handleAdd: handleHumanAdd,
14689
- handleRemove: handleHumanRemove
14690
- },
14691
- autofill: {
14692
- profiles: autofillProfiles,
14693
- adding: autofillAdding,
14694
- setAdding: setAutofillAdding,
14695
- label: autofillLabel,
14696
- setLabel: setAutofillLabel,
14697
- firstName: autofillFirstName,
14698
- setFirstName: setAutofillFirstName,
14699
- lastName: autofillLastName,
14700
- setLastName: setAutofillLastName,
14701
- email: autofillEmail,
14702
- setEmail: setAutofillEmail,
14703
- phone: autofillPhone,
14704
- setPhone: setAutofillPhone,
14705
- organization: autofillOrg,
14706
- setOrganization: setAutofillOrg,
14707
- addressLine1: autofillAddr1,
14708
- setAddressLine1: setAutofillAddr1,
14709
- addressLine2: autofillAddr2,
14710
- setAddressLine2: setAutofillAddr2,
14711
- city: autofillCity,
14712
- setCity: setAutofillCity,
14713
- state: autofillState,
14714
- setState: setAutofillState,
14715
- postalCode: autofillZip,
14716
- setPostalCode: setAutofillZip,
14717
- country: autofillCountry,
14718
- setCountry: setAutofillCountry,
14719
- message: autofillMessage,
14720
- handleAdd: handleAutofillAdd,
14721
- handleRemove: handleAutofillRemove,
14722
- handleFill: handleAutofillFill
14723
- }
14724
- });
14725
- }
14726
- }), null);
14727
- insert(_el$19, createComponent(Show, {
14728
- get when() {
14729
- return activeCategory() === "privacy";
14730
- },
14731
- get children() {
14732
- return createComponent(SettingsPrivacy, {
14733
- telemetryEnabled,
14734
- setTelemetryEnabled,
14735
- domainMode,
14736
- setDomainMode,
14737
- domainList,
14738
- setDomainList,
14739
- sourceDoNotAllowList,
14740
- setSourceDoNotAllowList
14741
- });
14742
- }
14743
- }), null);
14744
- insert(_el$19, createComponent(Show, {
14745
- get when() {
14746
- return activeCategory() === "account";
14747
- },
14748
- get children() {
14749
- return createComponent(SettingsAccount, {
14750
- premium: {
14751
- state: premiumState,
14752
- setState: setPremiumState,
14753
- email: premiumEmail,
14754
- setEmail: setPremiumEmail,
14755
- code: premiumCode,
14756
- setCode: setPremiumCode,
14757
- challengeToken: premiumChallengeToken,
14758
- setChallengeToken: setPremiumChallengeToken,
14759
- codeSent: premiumCodeSent,
14760
- setCodeSent: setPremiumCodeSent,
14761
- loading: premiumLoading,
14762
- setLoading: setPremiumLoading,
14763
- message: premiumMessage,
14764
- setMessage: setPremiumMessage,
14765
- active: premiumActive,
14766
- startCheckout: startPremiumCheckout,
14767
- resetFlow: resetPremiumActivationFlow
14768
- },
14769
- sessions: {
14770
- list: sessionList,
14771
- saveName: sessionSaveName,
14772
- setSaveName: setSessionSaveName,
14773
- loadList: loadSessionList
14774
- },
14775
- setStatus
14776
- });
14777
- }
14778
- }), null);
14779
- _el$21.$$click = handleSave;
14780
- addEventListener(_el$22, "click", closeSettings, true);
14781
- insert(_el$2, createComponent(Show, {
14782
- get when() {
14783
- return status();
14784
- },
14785
- children: (currentStatus) => (() => {
14786
- var _el$24 = _tmpl$4$2();
14787
- insert(_el$24, () => currentStatus().text);
14788
- createRenderEffect((_p$) => {
14789
- var _v$10 = !!(currentStatus().kind === "success"), _v$11 = !!(currentStatus().kind === "error");
14790
- _v$10 !== _p$.e && _el$24.classList.toggle("success", _p$.e = _v$10);
14791
- _v$11 !== _p$.t && _el$24.classList.toggle("error", _p$.t = _v$11);
14792
- return _p$;
14793
- }, {
14794
- e: void 0,
14795
- t: void 0
14796
- });
14797
- return _el$24;
14798
- })()
14799
- }), null);
14800
- createRenderEffect((_p$) => {
14801
- var _v$ = !!settingsClosing(), _v$2 = !!(activeCategory() === "general"), _v$3 = activeCategory() === "general" ? "page" : void 0, _v$4 = !!(activeCategory() === "agent"), _v$5 = activeCategory() === "agent" ? "page" : void 0, _v$6 = !!(activeCategory() === "vaults"), _v$7 = activeCategory() === "vaults" ? "page" : void 0, _v$8 = !!(activeCategory() === "privacy"), _v$9 = activeCategory() === "privacy" ? "page" : void 0, _v$0 = !!(activeCategory() === "account"), _v$1 = activeCategory() === "account" ? "page" : void 0;
14802
- _v$ !== _p$.e && _el$.classList.toggle("closing", _p$.e = _v$);
14803
- _v$2 !== _p$.t && _el$1.classList.toggle("active", _p$.t = _v$2);
14804
- _v$3 !== _p$.a && setAttribute(_el$1, "aria-current", _p$.a = _v$3);
14805
- _v$4 !== _p$.o && _el$11.classList.toggle("active", _p$.o = _v$4);
14806
- _v$5 !== _p$.i && setAttribute(_el$11, "aria-current", _p$.i = _v$5);
14807
- _v$6 !== _p$.n && _el$13.classList.toggle("active", _p$.n = _v$6);
14808
- _v$7 !== _p$.s && setAttribute(_el$13, "aria-current", _p$.s = _v$7);
14809
- _v$8 !== _p$.h && _el$15.classList.toggle("active", _p$.h = _v$8);
14810
- _v$9 !== _p$.r && setAttribute(_el$15, "aria-current", _p$.r = _v$9);
14811
- _v$0 !== _p$.d && _el$17.classList.toggle("active", _p$.d = _v$0);
14812
- _v$1 !== _p$.l && setAttribute(_el$17, "aria-current", _p$.l = _v$1);
14813
- return _p$;
14814
- }, {
14815
- e: void 0,
14816
- t: void 0,
14817
- a: void 0,
14818
- o: void 0,
14819
- i: void 0,
14820
- n: void 0,
14821
- s: void 0,
14822
- h: void 0,
14823
- r: void 0,
14824
- d: void 0,
14825
- l: void 0
14826
- });
14827
- return _el$;
14828
- })(), _tmpl$3$2()];
13651
+ var _el$ = _tmpl$2$3(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$9 = _el$3.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$11 = _el$1.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$11.nextSibling, _el$14 = _el$13.firstChild, _el$15 = _el$13.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$15.nextSibling, _el$18 = _el$17.firstChild, _el$19 = _el$0.nextSibling, _el$20 = _el$9.nextSibling, _el$21 = _el$20.firstChild, _el$22 = _el$21.nextSibling;
13652
+ addEventListener(_el$, "click", closeSettings, true);
13653
+ _el$2.$$keydown = handleKeyDown;
13654
+ _el$2.$$click = (e) => e.stopPropagation();
13655
+ insert(_el$2, createComponent(Show, {
13656
+ get when() {
13657
+ return !premiumActive();
13658
+ },
13659
+ get children() {
13660
+ var _el$4 = _tmpl$$3(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling;
13661
+ _el$7.$$click = () => {
13662
+ void trackPremiumContext("settings_banner_clicked");
13663
+ startPremiumCheckout();
13664
+ };
13665
+ _el$8.$$click = () => selectCategory("account");
13666
+ return _el$4;
13667
+ }
13668
+ }), _el$9);
13669
+ _el$1.$$click = () => selectCategory("general");
13670
+ insert(_el$1, createComponent(globe_default, {
13671
+ size: 16
13672
+ }), _el$10);
13673
+ _el$11.$$click = () => selectCategory("agent");
13674
+ insert(_el$11, createComponent(cpu_default, {
13675
+ size: 16
13676
+ }), _el$12);
13677
+ _el$13.$$click = () => selectCategory("vaults");
13678
+ insert(_el$13, createComponent(shield_default, {
13679
+ size: 16
13680
+ }), _el$14);
13681
+ _el$15.$$click = () => selectCategory("privacy");
13682
+ insert(_el$15, createComponent(lock_default, {
13683
+ size: 16
13684
+ }), _el$16);
13685
+ _el$17.$$click = () => selectCategory("account");
13686
+ insert(_el$17, createComponent(user_default, {
13687
+ size: 16
13688
+ }), _el$18);
13689
+ var _ref$ = settingsContentEl;
13690
+ typeof _ref$ === "function" ? use(_ref$, _el$19) : settingsContentEl = _el$19;
13691
+ insert(_el$19, createComponent(Show, {
13692
+ get when() {
13693
+ return activeCategory() === "general";
13694
+ },
13695
+ get children() {
13696
+ return createComponent(SettingsGeneral, {
13697
+ welcomeBanner: {
13698
+ show: showWelcome,
13699
+ dismiss: dismissWelcome
13700
+ },
13701
+ defaultUrl,
13702
+ setDefaultUrl,
13703
+ defaultSearchEngine,
13704
+ setDefaultSearchEngine,
13705
+ downloadPath,
13706
+ setDownloadPath,
13707
+ theme,
13708
+ setTheme,
13709
+ autoRestoreSession,
13710
+ setAutoRestoreSession,
13711
+ clearBookmarksOnLaunch,
13712
+ setClearBookmarksOnLaunch,
13713
+ premiumActive,
13714
+ startPremiumCheckout
13715
+ });
13716
+ }
13717
+ }), null);
13718
+ insert(_el$19, createComponent(Show, {
13719
+ get when() {
13720
+ return activeCategory() === "agent";
13721
+ },
13722
+ get children() {
13723
+ return createComponent(SettingsAgent, {
13724
+ get chat() {
13725
+ return {
13726
+ enabled: chatEnabled,
13727
+ setEnabled: setChatEnabled,
13728
+ providerId: chatProviderId,
13729
+ setProviderId: setChatProviderId,
13730
+ apiKey: chatApiKey,
13731
+ setApiKey: setChatApiKey,
13732
+ hasStoredApiKey: chatHasStoredApiKey,
13733
+ setHasStoredApiKey: setChatHasStoredApiKey,
13734
+ model: chatModel,
13735
+ setModel: setChatModel,
13736
+ baseUrl: chatBaseUrl,
13737
+ setBaseUrl: setChatBaseUrl,
13738
+ reasoningEffort: chatReasoningEffort,
13739
+ setReasoningEffort: setChatReasoningEffort,
13740
+ providerModels,
13741
+ modelFetchState,
13742
+ modelFetchWarning,
13743
+ doFetchModels,
13744
+ resetProviderModels,
13745
+ codexAuthStatus: providerAuth.codexAuthStatus,
13746
+ codexAccountEmail: providerAuth.codexAccountEmail,
13747
+ setCodexAccountEmail: providerAuth.setCodexAccountEmail,
13748
+ codexAuthError: providerAuth.codexAuthError,
13749
+ setCodexAuthError: providerAuth.setCodexAuthError,
13750
+ openRouterAuthStatus: providerAuth.openRouterAuthStatus,
13751
+ openRouterAuthError: providerAuth.openRouterAuthError,
13752
+ providerType,
13753
+ startCodexAuth: providerAuth.startCodexAuth,
13754
+ disconnectCodex: providerAuth.disconnectCodex,
13755
+ startOpenRouterAuth: providerAuth.startOpenRouterAuth
13756
+ };
13757
+ },
13758
+ mcpPort,
13759
+ setMcpPort,
13760
+ maxToolIterations,
13761
+ setMaxToolIterations,
13762
+ agentTranscriptMode,
13763
+ setAgentTranscriptMode,
13764
+ obsidianVaultPath,
13765
+ setObsidianVaultPath,
13766
+ health,
13767
+ premiumActive
13768
+ });
13769
+ }
13770
+ }), null);
13771
+ insert(_el$19, createComponent(Show, {
13772
+ get when() {
13773
+ return activeCategory() === "vaults";
13774
+ },
13775
+ get children() {
13776
+ return createComponent(SettingsVaults, {
13777
+ premiumActive,
13778
+ vault: {
13779
+ entries: vaultEntries,
13780
+ expanded: vaultExpanded,
13781
+ setExpanded: setVaultExpanded,
13782
+ adding: vaultAdding,
13783
+ setAdding: setVaultAdding,
13784
+ newLabel: vaultNewLabel,
13785
+ setNewLabel: setVaultNewLabel,
13786
+ newDomain: vaultNewDomain,
13787
+ setNewDomain: setVaultNewDomain,
13788
+ newUsername: vaultNewUsername,
13789
+ setNewUsername: setVaultNewUsername,
13790
+ newPassword: vaultNewPassword,
13791
+ setNewPassword: setVaultNewPassword,
13792
+ newTotp: vaultNewTotp,
13793
+ setNewTotp: setVaultNewTotp,
13794
+ newNotes: vaultNewNotes,
13795
+ setNewNotes: setVaultNewNotes,
13796
+ message: vaultMessage,
13797
+ setMessage: setVaultMessage,
13798
+ handleAdd: handleVaultAdd,
13799
+ handleRemove: handleVaultRemove
13800
+ },
13801
+ humanVault: {
13802
+ entries: humanEntries,
13803
+ adding: humanAdding,
13804
+ setAdding: setHumanAdding,
13805
+ newTitle: humanNewTitle,
13806
+ setNewTitle: setHumanNewTitle,
13807
+ newUrl: humanNewUrl,
13808
+ setNewUrl: setHumanNewUrl,
13809
+ newUsername: humanNewUsername,
13810
+ setNewUsername: setHumanNewUsername,
13811
+ newPassword: humanNewPassword,
13812
+ setNewPassword: setHumanNewPassword,
13813
+ newCategory: humanNewCategory,
13814
+ setNewCategory: setHumanNewCategory,
13815
+ newNotes: humanNewNotes,
13816
+ setNewNotes: setHumanNewNotes,
13817
+ message: humanMessage,
13818
+ handleAdd: handleHumanAdd,
13819
+ handleRemove: handleHumanRemove
13820
+ },
13821
+ autofill: {
13822
+ profiles: autofillProfiles,
13823
+ adding: autofillAdding,
13824
+ setAdding: setAutofillAdding,
13825
+ label: autofillLabel,
13826
+ setLabel: setAutofillLabel,
13827
+ firstName: autofillFirstName,
13828
+ setFirstName: setAutofillFirstName,
13829
+ lastName: autofillLastName,
13830
+ setLastName: setAutofillLastName,
13831
+ email: autofillEmail,
13832
+ setEmail: setAutofillEmail,
13833
+ phone: autofillPhone,
13834
+ setPhone: setAutofillPhone,
13835
+ organization: autofillOrg,
13836
+ setOrganization: setAutofillOrg,
13837
+ addressLine1: autofillAddr1,
13838
+ setAddressLine1: setAutofillAddr1,
13839
+ addressLine2: autofillAddr2,
13840
+ setAddressLine2: setAutofillAddr2,
13841
+ city: autofillCity,
13842
+ setCity: setAutofillCity,
13843
+ state: autofillState,
13844
+ setState: setAutofillState,
13845
+ postalCode: autofillZip,
13846
+ setPostalCode: setAutofillZip,
13847
+ country: autofillCountry,
13848
+ setCountry: setAutofillCountry,
13849
+ message: autofillMessage,
13850
+ handleAdd: handleAutofillAdd,
13851
+ handleRemove: handleAutofillRemove,
13852
+ handleFill: handleAutofillFill
13853
+ }
13854
+ });
13855
+ }
13856
+ }), null);
13857
+ insert(_el$19, createComponent(Show, {
13858
+ get when() {
13859
+ return activeCategory() === "privacy";
13860
+ },
13861
+ get children() {
13862
+ return createComponent(SettingsPrivacy, {
13863
+ telemetryEnabled,
13864
+ setTelemetryEnabled,
13865
+ domainMode,
13866
+ setDomainMode,
13867
+ domainList,
13868
+ setDomainList,
13869
+ sourceDoNotAllowList,
13870
+ setSourceDoNotAllowList
13871
+ });
13872
+ }
13873
+ }), null);
13874
+ insert(_el$19, createComponent(Show, {
13875
+ get when() {
13876
+ return activeCategory() === "account";
13877
+ },
13878
+ get children() {
13879
+ return createComponent(SettingsAccount, {
13880
+ premium: {
13881
+ state: premiumState,
13882
+ setState: setPremiumState,
13883
+ email: premiumEmail,
13884
+ setEmail: setPremiumEmail,
13885
+ code: premiumCode,
13886
+ setCode: setPremiumCode,
13887
+ challengeToken: premiumChallengeToken,
13888
+ setChallengeToken: setPremiumChallengeToken,
13889
+ codeSent: premiumCodeSent,
13890
+ setCodeSent: setPremiumCodeSent,
13891
+ loading: premiumLoading,
13892
+ setLoading: setPremiumLoading,
13893
+ message: premiumMessage,
13894
+ setMessage: setPremiumMessage,
13895
+ active: premiumActive,
13896
+ startCheckout: startPremiumCheckout,
13897
+ resetFlow: resetPremiumActivationFlow
13898
+ },
13899
+ sessions: {
13900
+ list: sessionList,
13901
+ saveName: sessionSaveName,
13902
+ setSaveName: setSessionSaveName,
13903
+ loadList: loadSessionList
13904
+ },
13905
+ setStatus
13906
+ });
13907
+ }
13908
+ }), null);
13909
+ _el$21.$$click = handleSave;
13910
+ addEventListener(_el$22, "click", closeSettings, true);
13911
+ insert(_el$2, createComponent(Show, {
13912
+ get when() {
13913
+ return status();
13914
+ },
13915
+ children: (currentStatus) => (() => {
13916
+ var _el$23 = _tmpl$3$2();
13917
+ insert(_el$23, () => currentStatus().text);
13918
+ createRenderEffect((_p$) => {
13919
+ var _v$10 = !!(currentStatus().kind === "success"), _v$11 = !!(currentStatus().kind === "error");
13920
+ _v$10 !== _p$.e && _el$23.classList.toggle("success", _p$.e = _v$10);
13921
+ _v$11 !== _p$.t && _el$23.classList.toggle("error", _p$.t = _v$11);
13922
+ return _p$;
13923
+ }, {
13924
+ e: void 0,
13925
+ t: void 0
13926
+ });
13927
+ return _el$23;
13928
+ })()
13929
+ }), null);
13930
+ createRenderEffect((_p$) => {
13931
+ var _v$ = !!settingsClosing(), _v$2 = !!(activeCategory() === "general"), _v$3 = activeCategory() === "general" ? "page" : void 0, _v$4 = !!(activeCategory() === "agent"), _v$5 = activeCategory() === "agent" ? "page" : void 0, _v$6 = !!(activeCategory() === "vaults"), _v$7 = activeCategory() === "vaults" ? "page" : void 0, _v$8 = !!(activeCategory() === "privacy"), _v$9 = activeCategory() === "privacy" ? "page" : void 0, _v$0 = !!(activeCategory() === "account"), _v$1 = activeCategory() === "account" ? "page" : void 0;
13932
+ _v$ !== _p$.e && _el$.classList.toggle("closing", _p$.e = _v$);
13933
+ _v$2 !== _p$.t && _el$1.classList.toggle("active", _p$.t = _v$2);
13934
+ _v$3 !== _p$.a && setAttribute(_el$1, "aria-current", _p$.a = _v$3);
13935
+ _v$4 !== _p$.o && _el$11.classList.toggle("active", _p$.o = _v$4);
13936
+ _v$5 !== _p$.i && setAttribute(_el$11, "aria-current", _p$.i = _v$5);
13937
+ _v$6 !== _p$.n && _el$13.classList.toggle("active", _p$.n = _v$6);
13938
+ _v$7 !== _p$.s && setAttribute(_el$13, "aria-current", _p$.s = _v$7);
13939
+ _v$8 !== _p$.h && _el$15.classList.toggle("active", _p$.h = _v$8);
13940
+ _v$9 !== _p$.r && setAttribute(_el$15, "aria-current", _p$.r = _v$9);
13941
+ _v$0 !== _p$.d && _el$17.classList.toggle("active", _p$.d = _v$0);
13942
+ _v$1 !== _p$.l && setAttribute(_el$17, "aria-current", _p$.l = _v$1);
13943
+ return _p$;
13944
+ }, {
13945
+ e: void 0,
13946
+ t: void 0,
13947
+ a: void 0,
13948
+ o: void 0,
13949
+ i: void 0,
13950
+ n: void 0,
13951
+ s: void 0,
13952
+ h: void 0,
13953
+ r: void 0,
13954
+ d: void 0,
13955
+ l: void 0
13956
+ });
13957
+ return _el$;
14829
13958
  }
14830
13959
  });
14831
13960
  };
@@ -15194,7 +14323,8 @@ const App = () => {
15194
14323
  document.documentElement.setAttribute("data-theme", theme);
15195
14324
  try {
15196
14325
  localStorage.setItem("vessel:theme", theme);
15197
- } catch {
14326
+ } catch (err) {
14327
+ console.warn("Failed to persist theme to localStorage:", err);
15198
14328
  }
15199
14329
  };
15200
14330
  const loadAndApplyTheme = async () => {