@quanta-intellect/vessel-browser 0.1.81 → 0.1.83

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.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <div align="center">
2
-
2
+
3
3
  ![quanta-intellect-logo-transparent](https://cdn-uploads.huggingface.co/production/uploads/686c460ba3fc457ad14ab6f8/gB6J60f9Yeyb3Thop2dUa.png)
4
4
 
5
5
  <a href="https://snapcraft.io/vessel-browser">
@@ -22,11 +22,9 @@ Vessel gives external agent harnesses a real browser with durable state, MCP con
22
22
  *Vessel is in active development and currently makes no security assurances. Use and deploy it with care.*
23
23
 
24
24
 
25
-
26
25
  https://github.com/user-attachments/assets/0a72b48a-873a-4eb0-b8f2-23e34d8472c4
27
26
 
28
27
 
29
-
30
28
  ## Quick Start
31
29
 
32
30
  Want the full agent toolkit from day one? [Start a 7-Day Free Trial of Vessel Premium — $5.99/mo](https://vesselpremium.quantaintellect.com/checkout).
@@ -80,7 +78,6 @@ Most browser automation stacks are either headless, stateless, or designed aroun
80
78
  <img width="1280" height="800" alt="@quanta-intellectvessel-browser_2026-03-17_195754_6624" src="https://github.com/user-attachments/assets/3b3d2033-5a59-4806-bbc1-359efb7b43a9" />
81
79
 
82
80
 
83
-
84
81
  <img width="1280" height="800" alt="vessel_2026-03-17_145154_5389" src="https://github.com/user-attachments/assets/b1c08d6c-bcdf-4c9a-8429-a71a23a61903" />
85
82
 
86
83
  Vessel is built for persistent web agents that need a real browser, durable state, and a human-visible interface. The agent is the primary operator. The human follows along in the live browser UI, audits what the agent is doing, and steers when needed.
@@ -420,7 +417,7 @@ mcp_servers:
420
417
  connect_timeout: 30
421
418
  ```
422
419
 
423
- ## Configuration
420
+ ## Configuration
424
421
 
425
422
  The installer writes three snippets to:
426
423
 
package/out/main/index.js CHANGED
@@ -3284,6 +3284,7 @@ const Channels = {
3284
3284
  FOLDER_CREATE: "bookmarks:folder-create",
3285
3285
  FOLDER_REMOVE: "bookmarks:folder-remove",
3286
3286
  FOLDER_RENAME: "bookmarks:folder-rename",
3287
+ FOLDER_EXPORT_HTML: "bookmarks:folder-export-html",
3287
3288
  // Highlights
3288
3289
  HIGHLIGHT_CAPTURE: "highlights:capture",
3289
3290
  HIGHLIGHT_CAPTURE_RESULT: "highlights:capture-result",
@@ -11759,6 +11760,41 @@ function exportBookmarksHtml(options = {}) {
11759
11760
  return `${lines.join("\n")}
11760
11761
  `;
11761
11762
  }
11763
+ function exportBookmarkFolderHtml(folderId, options = {}) {
11764
+ const current = getState();
11765
+ const folder = current.folders.find((item) => item.id === folderId);
11766
+ if (!folder) return null;
11767
+ const resolvedOptions = {
11768
+ includeNotes: options.includeNotes ?? false
11769
+ };
11770
+ const now = Math.floor(Date.now() / 1e3);
11771
+ const items = current.bookmarks.filter(
11772
+ (bookmark) => bookmark.folderId === folder.id
11773
+ );
11774
+ const addDate = toNetscapeTimestamp(folder.createdAt) || now;
11775
+ const lines = [
11776
+ NETSCAPE_BOOKMARKS_DOCTYPE,
11777
+ '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">',
11778
+ `<TITLE>${escapeBookmarkHtml(folder.name)}</TITLE>`,
11779
+ `<H1>${escapeBookmarkHtml(folder.name)}</H1>`,
11780
+ "<DL><p>",
11781
+ ` <DT><H3 ADD_DATE="${addDate}" LAST_MODIFIED="${now}">${escapeBookmarkHtml(folder.name)}</H3>`
11782
+ ];
11783
+ if (resolvedOptions.includeNotes && folder.summary) {
11784
+ lines.push(` <DD>${escapeBookmarkHtml(folder.summary)}`);
11785
+ }
11786
+ lines.push(" <DL><p>");
11787
+ for (const bookmark of items) {
11788
+ appendBookmarkHtml(lines, bookmark, resolvedOptions, " ");
11789
+ }
11790
+ lines.push(" </DL><p>", "</DL><p>");
11791
+ return {
11792
+ content: `${lines.join("\n")}
11793
+ `,
11794
+ count: items.length,
11795
+ folderName: folder.name
11796
+ };
11797
+ }
11762
11798
  function exportBookmarksJson() {
11763
11799
  return `${JSON.stringify(getState(), null, 2)}
11764
11800
  `;
@@ -24750,6 +24786,10 @@ function createSecondaryWindow() {
24750
24786
  win.show();
24751
24787
  return state2;
24752
24788
  }
24789
+ function getSafeBookmarkExportName(name) {
24790
+ const safeName = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
24791
+ return safeName || "folder";
24792
+ }
24753
24793
  function registerBookmarkHandlers() {
24754
24794
  electron.ipcMain.handle(Channels.BOOKMARKS_GET, () => {
24755
24795
  return getState();
@@ -24828,6 +24868,29 @@ function registerBookmarkHandlers() {
24828
24868
  count: getState().bookmarks.length
24829
24869
  };
24830
24870
  });
24871
+ electron.ipcMain.handle(
24872
+ Channels.FOLDER_EXPORT_HTML,
24873
+ async (_, folderId, options) => {
24874
+ const folder = getFolder(folderId);
24875
+ if (!folder) return null;
24876
+ const { canceled, filePath } = await electron.dialog.showSaveDialog({
24877
+ title: `Export ${folder.name}`,
24878
+ defaultPath: `vessel-bookmarks-${getSafeBookmarkExportName(folder.name)}.html`,
24879
+ filters: [{ name: "HTML Bookmarks", extensions: ["html"] }]
24880
+ });
24881
+ if (canceled || !filePath) return null;
24882
+ const result = exportBookmarkFolderHtml(folderId, {
24883
+ includeNotes: options?.includeNotes ?? true
24884
+ });
24885
+ if (!result) return null;
24886
+ await fs.promises.writeFile(filePath, result.content, "utf-8");
24887
+ trackBookmarkAction("export");
24888
+ return {
24889
+ filePath,
24890
+ count: result.count
24891
+ };
24892
+ }
24893
+ );
24831
24894
  electron.ipcMain.handle(Channels.BOOKMARKS_IMPORT_HTML, async () => {
24832
24895
  const { canceled, filePaths } = await electron.dialog.showOpenDialog({
24833
24896
  title: "Import Bookmarks",
@@ -67,6 +67,7 @@ const Channels = {
67
67
  FOLDER_CREATE: "bookmarks:folder-create",
68
68
  FOLDER_REMOVE: "bookmarks:folder-remove",
69
69
  FOLDER_RENAME: "bookmarks:folder-rename",
70
+ FOLDER_EXPORT_HTML: "bookmarks:folder-export-html",
70
71
  // Highlights
71
72
  HIGHLIGHT_CAPTURE: "highlights:capture",
72
73
  HIGHLIGHT_CAPTURE_RESULT: "highlights:capture-result",
@@ -359,6 +360,7 @@ const api = {
359
360
  removeBookmark: (id) => electron.ipcRenderer.invoke(Channels.BOOKMARK_REMOVE, id),
360
361
  exportHtml: (options) => electron.ipcRenderer.invoke(Channels.BOOKMARKS_EXPORT_HTML, options),
361
362
  exportJson: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_EXPORT_JSON),
363
+ exportFolderHtml: (folderId, options) => electron.ipcRenderer.invoke(Channels.FOLDER_EXPORT_HTML, folderId, options),
362
364
  importHtml: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_IMPORT_HTML),
363
365
  importJson: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_IMPORT_JSON),
364
366
  createFolder: (name) => electron.ipcRenderer.invoke(Channels.FOLDER_CREATE, name),
@@ -2752,6 +2752,7 @@ function useBookmarks() {
2752
2752
  removeBookmark: (id) => window.vessel.bookmarks.removeBookmark(id),
2753
2753
  exportHtml: (options) => window.vessel.bookmarks.exportHtml(options),
2754
2754
  exportJson: () => window.vessel.bookmarks.exportJson(),
2755
+ exportFolderHtml: (folderId, options) => window.vessel.bookmarks.exportFolderHtml(folderId, options),
2755
2756
  createFolder: (name) => window.vessel.bookmarks.createFolder(name),
2756
2757
  createFolderWithSummary: (name, summary) => window.vessel.bookmarks.createFolderWithSummary(name, summary),
2757
2758
  removeFolder: (id, deleteContents) => window.vessel.bookmarks.removeFolder(id, deleteContents),
@@ -7508,7 +7509,7 @@ const PageDiffTimeline = () => {
7508
7509
  })();
7509
7510
  };
7510
7511
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
7511
- var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$6 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$21 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$22 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$23 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$25 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$53 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
7512
+ var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$4$9 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$5$6 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$6$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$7$6 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$8$5 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$9$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$10$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$11$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$12$3 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$13$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$14$2 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$15$2 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$17$1 = /* @__PURE__ */ template(`<span>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$19$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$20 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$21 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$22 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$23 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$24 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill="rgba(196, 160, 90, 0.6)"stroke="rgba(196, 160, 90, 0.9)"stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$25 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$26 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$27 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$28 = /* @__PURE__ */ template(`<div class=sidebar-input-area><textarea class=sidebar-input rows=2></textarea><button class=sidebar-send>`), _tmpl$29 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-resize-handle></div><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button><button class=sidebar-close title="Close AI chat (Esc)"aria-label="Close AI chat"><svg width=14 height=14 viewBox="0 0 14 14"aria-hidden=true><path d="M3.5 3.5l7 7M10.5 3.5l-7 7"fill=none stroke=currentColor stroke-width=1.4 stroke-linecap=round></path></svg></button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Automate</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button></div><div class=sidebar-messages><div>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$31 = /* @__PURE__ */ template(`<div class="agent-card agent-card-approval"><div class=agent-card-approval-stripe aria-hidden=true></div><div class=agent-card-title></div><div class=agent-card-copy></div><div class=agent-card-copy></div><div class=agent-card-actions><button class=agent-primary-button type=button>Approve</button><button class=agent-control-button type=button>Reject`), _tmpl$32 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$33 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$34 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$36 = /* @__PURE__ */ template(`<div class=agent-card><div class=agent-action-row><span class=agent-card-title></span><span></span></div><div class=agent-card-copy>`), _tmpl$37 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$38 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=bookmark-folder-actions><button class=bookmark-ghost-button type=button>Rename</button><button class=bookmark-ghost-button type=button>Export</button><button class="bookmark-ghost-button danger"type=button>Delete`), _tmpl$40 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$41 = /* @__PURE__ */ template(`<div class=bookmark-folder-delete-confirm><p class=bookmark-delete-prompt>Delete "<!>"?</p><div class=bookmark-delete-options><button class="bookmark-ghost-button danger"type=button></button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><div class=bookmark-folder-form-fields><input class=bookmark-input><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=button>Save</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$43 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$44 = /* @__PURE__ */ template(`<div class=bookmark-folder-section><div class="bookmark-folder-header clickable"role=button tabindex=0><div class=bookmark-folder-overview><span class=bookmark-folder-chevron aria-hidden=true>▸</span><div><div class=bookmark-folder-name></div><div class=bookmark-folder-meta> saved`), _tmpl$45 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$46 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$47 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$48 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$49 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$50 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$51 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$52 = /* @__PURE__ */ template(`<div class=bookmark-folder-edit><input class=bookmark-input placeholder="Bookmark title"><textarea class=bookmark-note-input rows=2 placeholder="Why this bookmark matters"></textarea><textarea class=bookmark-note-input rows=1 placeholder=Intent></textarea><textarea class=bookmark-note-input rows=1 placeholder="Expected content"></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input rows=2 placeholder="Agent hints (one key:value per line)"></textarea><div class=bookmark-item-footer><button class=bookmark-secondary-button type=button>Save edits</button><button class=bookmark-ghost-button type=button>Cancel`), _tmpl$53 = /* @__PURE__ */ template(`<div class=bookmark-item><button class=bookmark-item-link type=button><span class=bookmark-item-title></span><span class=bookmark-item-url></span></button><div class=bookmark-item-footer><span class=bookmark-item-time></span><button class=bookmark-ghost-button type=button></button><button class="bookmark-ghost-button danger"type=button>Remove`), _tmpl$54 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$55 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$56 = /* @__PURE__ */ template(`<div class=checkpoint-timeline-item><div class=checkpoint-timeline-rail><span class=checkpoint-timeline-dot></span></div><div class=checkpoint-timeline-content><div class=checkpoint-timeline-name></div><div class=checkpoint-timeline-time></div><textarea class=agent-textarea rows=2 placeholder="Add a note..."></textarea><button class=agent-control-button type=button>Restore`), _tmpl$57 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$58 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">The Diff timeline is a premium feature. Upgrade to see a full history of what changed on this page.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$59 = /* @__PURE__ */ template(`<div>`), _tmpl$60 = /* @__PURE__ */ template(`<div class=thinking-state><div class=thinking-orb aria-hidden=true><span></span><span></span><span></span></div><div class=thinking-copy><div class=thinking-title>Thinking`), _tmpl$61 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$62 = /* @__PURE__ */ template(`<div class=chat-approval><div class=chat-approval-icon aria-hidden=true><svg width=16 height=16 viewBox="0 0 16 16"fill=none><path d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7.25 4.75a.75.75 0 011.5 0v3.5a.75.75 0 01-1.5 0v-3.5zM8 11.5a.75.75 0 110-1.5.75.75 0 010 1.5z"fill=currentColor></path></svg></div><div class=chat-approval-body><div class=chat-approval-title>Approval needed: <strong></strong></div><div class=chat-approval-detail></div><div class=chat-approval-actions><button class="chat-approval-btn chat-approval-approve"type=button>Approve</button><button class="chat-approval-btn chat-approval-reject"type=button>Reject`), _tmpl$63 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`);
7512
7513
  const UNSORTED_FOLDER = {
7513
7514
  id: "unsorted",
7514
7515
  name: "Unsorted",
@@ -7593,6 +7594,7 @@ const Sidebar = (props) => {
7593
7594
  removeBookmark,
7594
7595
  exportHtml,
7595
7596
  exportJson,
7597
+ exportFolderHtml,
7596
7598
  createFolderWithSummary,
7597
7599
  removeFolder,
7598
7600
  renameFolder
@@ -8053,6 +8055,24 @@ ${contextBlock}` : contextBlock);
8053
8055
  setEditingFolderSummary("");
8054
8056
  }
8055
8057
  };
8058
+ const handleExportFolder = async (folderId, folderName) => {
8059
+ setBookmarkExporting(true);
8060
+ setBookmarkExportMessage("");
8061
+ try {
8062
+ const result = await exportFolderHtml(folderId, {
8063
+ includeNotes: true
8064
+ });
8065
+ if (!result) {
8066
+ setBookmarkExportMessage("Export canceled.");
8067
+ return;
8068
+ }
8069
+ setBookmarkExportMessage(`Exported ${folderName} (${result.count} bookmarks) to ${result.filePath}`);
8070
+ } catch (error) {
8071
+ setBookmarkExportMessage(error instanceof Error ? error.message : `Could not export ${folderName}.`);
8072
+ } finally {
8073
+ setBookmarkExporting(false);
8074
+ }
8075
+ };
8056
8076
  const handleExportBookmarks = async (format) => {
8057
8077
  setBookmarkExporting(true);
8058
8078
  setBookmarkExportMessage("");
@@ -8408,7 +8428,7 @@ ${contextBlock}` : contextBlock);
8408
8428
  return folder.id !== UNSORTED_FOLDER.id;
8409
8429
  },
8410
8430
  get children() {
8411
- var _el$169 = _tmpl$39(), _el$170 = _el$169.firstChild, _el$171 = _el$170.nextSibling;
8431
+ var _el$169 = _tmpl$39(), _el$170 = _el$169.firstChild, _el$171 = _el$170.nextSibling, _el$172 = _el$171.nextSibling;
8412
8432
  _el$170.$$click = (e) => {
8413
8433
  e.stopPropagation();
8414
8434
  setEditingFolderId(folder.id);
@@ -8416,9 +8436,14 @@ ${contextBlock}` : contextBlock);
8416
8436
  setEditingFolderSummary(folder.summary || "");
8417
8437
  };
8418
8438
  _el$171.$$click = (e) => {
8439
+ e.stopPropagation();
8440
+ void handleExportFolder(folder.id, folder.name);
8441
+ };
8442
+ _el$172.$$click = (e) => {
8419
8443
  e.stopPropagation();
8420
8444
  setDeletingFolderId(folder.id);
8421
8445
  };
8446
+ createRenderEffect(() => _el$171.disabled = bookmarkExporting());
8422
8447
  return _el$169;
8423
8448
  }
8424
8449
  }), null);
@@ -8427,28 +8452,28 @@ ${contextBlock}` : contextBlock);
8427
8452
  return deletingFolderId() === folder.id;
8428
8453
  },
8429
8454
  get children() {
8430
- var _el$172 = _tmpl$41(), _el$173 = _el$172.firstChild, _el$174 = _el$173.firstChild, _el$176 = _el$174.nextSibling;
8431
- _el$176.nextSibling;
8432
- var _el$177 = _el$173.nextSibling, _el$179 = _el$177.firstChild, _el$180 = _el$179.nextSibling;
8433
- insert(_el$173, () => folder.name, _el$176);
8434
- insert(_el$173, (() => {
8455
+ var _el$173 = _tmpl$41(), _el$174 = _el$173.firstChild, _el$175 = _el$174.firstChild, _el$177 = _el$175.nextSibling;
8456
+ _el$177.nextSibling;
8457
+ var _el$178 = _el$174.nextSibling, _el$180 = _el$178.firstChild, _el$181 = _el$180.nextSibling;
8458
+ insert(_el$174, () => folder.name, _el$177);
8459
+ insert(_el$174, (() => {
8435
8460
  var _c$6 = memo(() => folder.items.length > 0);
8436
8461
  return () => _c$6() ? ` This folder has ${folder.items.length} bookmark${folder.items.length === 1 ? "" : "s"}.` : "";
8437
8462
  })(), null);
8438
- insert(_el$177, createComponent(Show, {
8463
+ insert(_el$178, createComponent(Show, {
8439
8464
  get when() {
8440
8465
  return folder.items.length > 0;
8441
8466
  },
8442
8467
  get children() {
8443
- var _el$178 = _tmpl$40();
8444
- _el$178.$$click = () => void handleRemoveFolder(folder.id, false);
8445
- return _el$178;
8468
+ var _el$179 = _tmpl$40();
8469
+ _el$179.$$click = () => void handleRemoveFolder(folder.id, false);
8470
+ return _el$179;
8446
8471
  }
8447
- }), _el$179);
8448
- _el$179.$$click = () => void handleRemoveFolder(folder.id, true);
8449
- insert(_el$179, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
8450
- _el$180.$$click = () => setDeletingFolderId(null);
8451
- return _el$172;
8472
+ }), _el$180);
8473
+ _el$180.$$click = () => void handleRemoveFolder(folder.id, true);
8474
+ insert(_el$180, () => folder.items.length > 0 ? "Delete all" : "Delete folder");
8475
+ _el$181.$$click = () => setDeletingFolderId(null);
8476
+ return _el$173;
8452
8477
  }
8453
8478
  }), null);
8454
8479
  insert(_el$160, createComponent(Show, {
@@ -8456,19 +8481,19 @@ ${contextBlock}` : contextBlock);
8456
8481
  return editingFolderId() === folder.id;
8457
8482
  },
8458
8483
  get children() {
8459
- var _el$181 = _tmpl$42(), _el$182 = _el$181.firstChild, _el$183 = _el$182.firstChild, _el$184 = _el$183.nextSibling, _el$185 = _el$182.nextSibling, _el$186 = _el$185.nextSibling;
8460
- _el$183.$$input = (e) => setEditingFolderName(e.currentTarget.value);
8461
- _el$184.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
8462
- _el$185.$$click = () => void handleRenameFolder(folder.id);
8463
- _el$186.$$click = () => {
8484
+ var _el$182 = _tmpl$42(), _el$183 = _el$182.firstChild, _el$184 = _el$183.firstChild, _el$185 = _el$184.nextSibling, _el$186 = _el$183.nextSibling, _el$187 = _el$186.nextSibling;
8485
+ _el$184.$$input = (e) => setEditingFolderName(e.currentTarget.value);
8486
+ _el$185.$$input = (e) => setEditingFolderSummary(e.currentTarget.value);
8487
+ _el$186.$$click = () => void handleRenameFolder(folder.id);
8488
+ _el$187.$$click = () => {
8464
8489
  setEditingFolderId(null);
8465
8490
  setEditingFolderName("");
8466
8491
  setEditingFolderSummary("");
8467
8492
  };
8468
- createRenderEffect(() => _el$185.disabled = !editingFolderName().trim());
8469
- createRenderEffect(() => _el$183.value = editingFolderName());
8470
- createRenderEffect(() => _el$184.value = editingFolderSummary());
8471
- return _el$181;
8493
+ createRenderEffect(() => _el$186.disabled = !editingFolderName().trim());
8494
+ createRenderEffect(() => _el$184.value = editingFolderName());
8495
+ createRenderEffect(() => _el$185.value = editingFolderSummary());
8496
+ return _el$182;
8472
8497
  }
8473
8498
  }), null);
8474
8499
  insert(_el$160, createComponent(Show, {
@@ -8487,116 +8512,116 @@ ${contextBlock}` : contextBlock);
8487
8512
  return _tmpl$46();
8488
8513
  },
8489
8514
  get children() {
8490
- var _el$187 = _tmpl$43();
8491
- insert(_el$187, createComponent(For, {
8515
+ var _el$188 = _tmpl$43();
8516
+ insert(_el$188, createComponent(For, {
8492
8517
  get each() {
8493
8518
  return folder.items;
8494
8519
  },
8495
8520
  children: (bookmark) => (() => {
8496
- var _el$190 = _tmpl$53(), _el$191 = _el$190.firstChild, _el$192 = _el$191.firstChild, _el$193 = _el$192.nextSibling, _el$218 = _el$191.nextSibling, _el$219 = _el$218.firstChild, _el$220 = _el$219.nextSibling, _el$221 = _el$220.nextSibling;
8497
- _el$191.$$click = () => void createTab(bookmark.url);
8498
- insert(_el$192, () => bookmark.title || bookmark.url);
8499
- insert(_el$193, () => bookmark.url);
8500
- insert(_el$190, createComponent(Show, {
8521
+ var _el$191 = _tmpl$53(), _el$192 = _el$191.firstChild, _el$193 = _el$192.firstChild, _el$194 = _el$193.nextSibling, _el$219 = _el$192.nextSibling, _el$220 = _el$219.firstChild, _el$221 = _el$220.nextSibling, _el$222 = _el$221.nextSibling;
8522
+ _el$192.$$click = () => void createTab(bookmark.url);
8523
+ insert(_el$193, () => bookmark.title || bookmark.url);
8524
+ insert(_el$194, () => bookmark.url);
8525
+ insert(_el$191, createComponent(Show, {
8501
8526
  get when() {
8502
8527
  return bookmark.note;
8503
8528
  },
8504
8529
  get children() {
8505
- var _el$194 = _tmpl$47();
8506
- insert(_el$194, () => bookmark.note);
8507
- return _el$194;
8530
+ var _el$195 = _tmpl$47();
8531
+ insert(_el$195, () => bookmark.note);
8532
+ return _el$195;
8508
8533
  }
8509
- }), _el$218);
8510
- insert(_el$190, createComponent(Show, {
8534
+ }), _el$219);
8535
+ insert(_el$191, createComponent(Show, {
8511
8536
  get when() {
8512
8537
  return bookmark.intent || bookmark.expectedContent || (bookmark.keyFields?.length || 0) > 0 || (bookmark.agentHints && Object.keys(bookmark.agentHints).length || 0) > 0;
8513
8538
  },
8514
8539
  get children() {
8515
- var _el$195 = _tmpl$47();
8516
- insert(_el$195, createComponent(Show, {
8540
+ var _el$196 = _tmpl$47();
8541
+ insert(_el$196, createComponent(Show, {
8517
8542
  get when() {
8518
8543
  return bookmark.intent;
8519
8544
  },
8520
8545
  get children() {
8521
- var _el$196 = _tmpl$48(), _el$197 = _el$196.firstChild;
8522
- _el$197.nextSibling;
8523
- insert(_el$196, () => bookmark.intent, null);
8524
- return _el$196;
8546
+ var _el$197 = _tmpl$48(), _el$198 = _el$197.firstChild;
8547
+ _el$198.nextSibling;
8548
+ insert(_el$197, () => bookmark.intent, null);
8549
+ return _el$197;
8525
8550
  }
8526
8551
  }), null);
8527
- insert(_el$195, createComponent(Show, {
8552
+ insert(_el$196, createComponent(Show, {
8528
8553
  get when() {
8529
8554
  return bookmark.expectedContent;
8530
8555
  },
8531
8556
  get children() {
8532
- var _el$199 = _tmpl$49(), _el$200 = _el$199.firstChild;
8533
- _el$200.nextSibling;
8534
- insert(_el$199, () => bookmark.expectedContent, null);
8535
- return _el$199;
8557
+ var _el$200 = _tmpl$49(), _el$201 = _el$200.firstChild;
8558
+ _el$201.nextSibling;
8559
+ insert(_el$200, () => bookmark.expectedContent, null);
8560
+ return _el$200;
8536
8561
  }
8537
8562
  }), null);
8538
- insert(_el$195, createComponent(Show, {
8563
+ insert(_el$196, createComponent(Show, {
8539
8564
  get when() {
8540
8565
  return (bookmark.keyFields?.length || 0) > 0;
8541
8566
  },
8542
8567
  get children() {
8543
- var _el$202 = _tmpl$50(), _el$203 = _el$202.firstChild;
8544
- _el$203.nextSibling;
8545
- insert(_el$202, () => bookmark.keyFields?.join(", "), null);
8546
- return _el$202;
8568
+ var _el$203 = _tmpl$50(), _el$204 = _el$203.firstChild;
8569
+ _el$204.nextSibling;
8570
+ insert(_el$203, () => bookmark.keyFields?.join(", "), null);
8571
+ return _el$203;
8547
8572
  }
8548
8573
  }), null);
8549
- insert(_el$195, createComponent(Show, {
8574
+ insert(_el$196, createComponent(Show, {
8550
8575
  get when() {
8551
8576
  return memo(() => !!bookmark.agentHints)() && Object.keys(bookmark.agentHints).length > 0;
8552
8577
  },
8553
8578
  get children() {
8554
- var _el$205 = _tmpl$51(), _el$206 = _el$205.firstChild;
8555
- _el$206.nextSibling;
8556
- insert(_el$205, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
8557
- return _el$205;
8579
+ var _el$206 = _tmpl$51(), _el$207 = _el$206.firstChild;
8580
+ _el$207.nextSibling;
8581
+ insert(_el$206, () => Object.entries(bookmark.agentHints || {}).map(([key, hint]) => `${key}: ${hint}`).join(" • "), null);
8582
+ return _el$206;
8558
8583
  }
8559
8584
  }), null);
8560
- return _el$195;
8585
+ return _el$196;
8561
8586
  }
8562
- }), _el$218);
8563
- insert(_el$190, createComponent(Show, {
8587
+ }), _el$219);
8588
+ insert(_el$191, createComponent(Show, {
8564
8589
  get when() {
8565
8590
  return editingBookmarkId() === bookmark.id;
8566
8591
  },
8567
8592
  get children() {
8568
- var _el$208 = _tmpl$52(), _el$209 = _el$208.firstChild, _el$210 = _el$209.nextSibling, _el$211 = _el$210.nextSibling, _el$212 = _el$211.nextSibling, _el$213 = _el$212.nextSibling, _el$214 = _el$213.nextSibling, _el$215 = _el$214.nextSibling, _el$216 = _el$215.firstChild, _el$217 = _el$216.nextSibling;
8569
- _el$209.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
8570
- _el$210.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
8571
- _el$211.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
8572
- _el$212.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
8573
- _el$213.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
8574
- _el$214.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
8575
- _el$216.$$click = () => void handleUpdateBookmark(bookmark.id);
8576
- _el$217.$$click = resetBookmarkEditor;
8577
- createRenderEffect(() => _el$209.value = editingBookmarkTitle());
8578
- createRenderEffect(() => _el$210.value = editingBookmarkNote());
8579
- createRenderEffect(() => _el$211.value = editingBookmarkIntent());
8580
- createRenderEffect(() => _el$212.value = editingBookmarkExpectedContent());
8581
- createRenderEffect(() => _el$213.value = editingBookmarkKeyFields());
8582
- createRenderEffect(() => _el$214.value = editingBookmarkAgentHints());
8583
- return _el$208;
8593
+ var _el$209 = _tmpl$52(), _el$210 = _el$209.firstChild, _el$211 = _el$210.nextSibling, _el$212 = _el$211.nextSibling, _el$213 = _el$212.nextSibling, _el$214 = _el$213.nextSibling, _el$215 = _el$214.nextSibling, _el$216 = _el$215.nextSibling, _el$217 = _el$216.firstChild, _el$218 = _el$217.nextSibling;
8594
+ _el$210.$$input = (e) => setEditingBookmarkTitle(e.currentTarget.value);
8595
+ _el$211.$$input = (e) => setEditingBookmarkNote(e.currentTarget.value);
8596
+ _el$212.$$input = (e) => setEditingBookmarkIntent(e.currentTarget.value);
8597
+ _el$213.$$input = (e) => setEditingBookmarkExpectedContent(e.currentTarget.value);
8598
+ _el$214.$$input = (e) => setEditingBookmarkKeyFields(e.currentTarget.value);
8599
+ _el$215.$$input = (e) => setEditingBookmarkAgentHints(e.currentTarget.value);
8600
+ _el$217.$$click = () => void handleUpdateBookmark(bookmark.id);
8601
+ _el$218.$$click = resetBookmarkEditor;
8602
+ createRenderEffect(() => _el$210.value = editingBookmarkTitle());
8603
+ createRenderEffect(() => _el$211.value = editingBookmarkNote());
8604
+ createRenderEffect(() => _el$212.value = editingBookmarkIntent());
8605
+ createRenderEffect(() => _el$213.value = editingBookmarkExpectedContent());
8606
+ createRenderEffect(() => _el$214.value = editingBookmarkKeyFields());
8607
+ createRenderEffect(() => _el$215.value = editingBookmarkAgentHints());
8608
+ return _el$209;
8584
8609
  }
8585
- }), _el$218);
8586
- insert(_el$219, () => formatBookmarkDate(bookmark.savedAt));
8587
- _el$220.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
8588
- insert(_el$220, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
8589
- _el$221.$$click = () => {
8610
+ }), _el$219);
8611
+ insert(_el$220, () => formatBookmarkDate(bookmark.savedAt));
8612
+ _el$221.$$click = () => editingBookmarkId() === bookmark.id ? resetBookmarkEditor() : startEditingBookmark(bookmark);
8613
+ insert(_el$221, () => editingBookmarkId() === bookmark.id ? "Close" : "Edit");
8614
+ _el$222.$$click = () => {
8590
8615
  if (editingBookmarkId() === bookmark.id) {
8591
8616
  resetBookmarkEditor();
8592
8617
  }
8593
8618
  void removeBookmark(bookmark.id);
8594
8619
  };
8595
- createRenderEffect(() => setAttribute(_el$190, "data-bookmark-id", bookmark.id));
8596
- return _el$190;
8620
+ createRenderEffect(() => setAttribute(_el$191, "data-bookmark-id", bookmark.id));
8621
+ return _el$191;
8597
8622
  })()
8598
8623
  }));
8599
- return _el$187;
8624
+ return _el$188;
8600
8625
  }
8601
8626
  });
8602
8627
  }
@@ -8663,8 +8688,8 @@ ${contextBlock}` : contextBlock);
8663
8688
  return recentCheckpoints();
8664
8689
  },
8665
8690
  children: (checkpoint, i) => (() => {
8666
- var _el$223 = _tmpl$56(), _el$224 = _el$223.firstChild, _el$225 = _el$224.firstChild, _el$227 = _el$224.nextSibling, _el$228 = _el$227.firstChild, _el$229 = _el$228.nextSibling, _el$230 = _el$229.nextSibling, _el$231 = _el$230.nextSibling;
8667
- insert(_el$224, createComponent(Show, {
8691
+ var _el$224 = _tmpl$56(), _el$225 = _el$224.firstChild, _el$226 = _el$225.firstChild, _el$228 = _el$225.nextSibling, _el$229 = _el$228.firstChild, _el$230 = _el$229.nextSibling, _el$231 = _el$230.nextSibling, _el$232 = _el$231.nextSibling;
8692
+ insert(_el$225, createComponent(Show, {
8668
8693
  get when() {
8669
8694
  return i() < recentCheckpoints().length - 1;
8670
8695
  },
@@ -8672,13 +8697,13 @@ ${contextBlock}` : contextBlock);
8672
8697
  return _tmpl$55();
8673
8698
  }
8674
8699
  }), null);
8675
- insert(_el$228, () => checkpoint.name);
8676
- insert(_el$229, () => new Date(checkpoint.createdAt).toLocaleString());
8677
- _el$230.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
8678
- _el$231.$$click = () => void restoreCheckpoint(checkpoint.id);
8679
- createRenderEffect(() => _el$225.classList.toggle("latest", !!(i() === 0)));
8680
- createRenderEffect(() => _el$230.value = checkpoint.note || "");
8681
- return _el$223;
8700
+ insert(_el$229, () => checkpoint.name);
8701
+ insert(_el$230, () => new Date(checkpoint.createdAt).toLocaleString());
8702
+ _el$231.addEventListener("blur", (e) => void updateCheckpointNote(checkpoint.id, e.currentTarget.value));
8703
+ _el$232.$$click = () => void restoreCheckpoint(checkpoint.id);
8704
+ createRenderEffect(() => _el$226.classList.toggle("latest", !!(i() === 0)));
8705
+ createRenderEffect(() => _el$231.value = checkpoint.note || "");
8706
+ return _el$224;
8682
8707
  })()
8683
8708
  }));
8684
8709
  return _el$95;
@@ -8725,12 +8750,12 @@ ${contextBlock}` : contextBlock);
8725
8750
  return history.historyState().entries;
8726
8751
  },
8727
8752
  children: (entry) => (() => {
8728
- var _el$232 = _tmpl$57(), _el$233 = _el$232.firstChild, _el$234 = _el$233.nextSibling, _el$235 = _el$234.nextSibling;
8729
- _el$232.$$click = () => createTab(entry.url);
8730
- insert(_el$233, () => entry.title || entry.url);
8731
- insert(_el$234, () => entry.url);
8732
- insert(_el$235, () => new Date(entry.visitedAt).toLocaleString());
8733
- return _el$232;
8753
+ var _el$233 = _tmpl$57(), _el$234 = _el$233.firstChild, _el$235 = _el$234.nextSibling, _el$236 = _el$235.nextSibling;
8754
+ _el$233.$$click = () => createTab(entry.url);
8755
+ insert(_el$234, () => entry.title || entry.url);
8756
+ insert(_el$235, () => entry.url);
8757
+ insert(_el$236, () => new Date(entry.visitedAt).toLocaleString());
8758
+ return _el$233;
8734
8759
  })()
8735
8760
  }), null);
8736
8761
  insert(_el$104, createComponent(Show, {
@@ -8757,11 +8782,11 @@ ${contextBlock}` : contextBlock);
8757
8782
  },
8758
8783
  get fallback() {
8759
8784
  return (() => {
8760
- var _el$236 = _tmpl$58(), _el$237 = _el$236.firstChild, _el$238 = _el$237.nextSibling, _el$239 = _el$238.nextSibling, _el$240 = _el$239.firstChild, _el$241 = _el$240.nextSibling;
8761
- _el$240.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
8785
+ var _el$237 = _tmpl$58(), _el$238 = _el$237.firstChild, _el$239 = _el$238.nextSibling, _el$240 = _el$239.nextSibling, _el$241 = _el$240.firstChild, _el$242 = _el$241.nextSibling;
8786
+ _el$241.$$click = () => void window.vessel.premium.checkout(premiumState().email || void 0).catch(() => {
8762
8787
  });
8763
- _el$241.$$click = openPremiumDetails;
8764
- return _el$236;
8788
+ _el$242.$$click = openPremiumDetails;
8789
+ return _el$237;
8765
8790
  })();
8766
8791
  },
8767
8792
  get children() {
@@ -8791,13 +8816,13 @@ ${contextBlock}` : contextBlock);
8791
8816
  return messages2();
8792
8817
  },
8793
8818
  children: (msg) => (() => {
8794
- var _el$242 = _tmpl$59();
8795
- insert(_el$242, createComponent(MarkdownMessage, {
8819
+ var _el$243 = _tmpl$59();
8820
+ insert(_el$243, createComponent(MarkdownMessage, {
8796
8821
  get content() {
8797
8822
  return msg.content;
8798
8823
  }
8799
8824
  }), null);
8800
- insert(_el$242, createComponent(Show, {
8825
+ insert(_el$243, createComponent(Show, {
8801
8826
  get when() {
8802
8827
  return memo(() => msg.role === "assistant")() ? getPremiumPromptKind(msg.content) : null;
8803
8828
  },
@@ -8810,8 +8835,8 @@ ${contextBlock}` : contextBlock);
8810
8835
  onOpenSettings: openPremiumDetails
8811
8836
  })
8812
8837
  }), null);
8813
- createRenderEffect(() => className(_el$242, `message message-${msg.role}`));
8814
- return _el$242;
8838
+ createRenderEffect(() => className(_el$243, `message message-${msg.role}`));
8839
+ return _el$243;
8815
8840
  })()
8816
8841
  }), createComponent(Show, {
8817
8842
  get when() {
@@ -8872,22 +8897,22 @@ ${contextBlock}` : contextBlock);
8872
8897
  return runtimeState2().supervisor.pendingApprovals;
8873
8898
  },
8874
8899
  children: (approval) => (() => {
8875
- var _el$244 = _tmpl$62(), _el$245 = _el$244.firstChild, _el$246 = _el$245.nextSibling, _el$247 = _el$246.firstChild, _el$248 = _el$247.firstChild, _el$249 = _el$248.nextSibling, _el$251 = _el$247.nextSibling, _el$252 = _el$251.nextSibling, _el$253 = _el$252.firstChild, _el$254 = _el$253.nextSibling;
8876
- insert(_el$249, () => approval.name);
8877
- insert(_el$246, createComponent(Show, {
8900
+ var _el$245 = _tmpl$62(), _el$246 = _el$245.firstChild, _el$247 = _el$246.nextSibling, _el$248 = _el$247.firstChild, _el$249 = _el$248.firstChild, _el$250 = _el$249.nextSibling, _el$252 = _el$248.nextSibling, _el$253 = _el$252.nextSibling, _el$254 = _el$253.firstChild, _el$255 = _el$254.nextSibling;
8901
+ insert(_el$250, () => approval.name);
8902
+ insert(_el$247, createComponent(Show, {
8878
8903
  get when() {
8879
8904
  return approval.argsSummary;
8880
8905
  },
8881
8906
  get children() {
8882
- var _el$250 = _tmpl$61();
8883
- insert(_el$250, () => approval.argsSummary);
8884
- return _el$250;
8907
+ var _el$251 = _tmpl$61();
8908
+ insert(_el$251, () => approval.argsSummary);
8909
+ return _el$251;
8885
8910
  }
8886
- }), _el$251);
8887
- insert(_el$251, () => approval.reason);
8888
- _el$253.$$click = () => void resolveApproval(approval.id, true);
8889
- _el$254.$$click = () => void resolveApproval(approval.id, false);
8890
- return _el$244;
8911
+ }), _el$252);
8912
+ insert(_el$252, () => approval.reason);
8913
+ _el$254.$$click = () => void resolveApproval(approval.id, true);
8914
+ _el$255.$$click = () => void resolveApproval(approval.id, false);
8915
+ return _el$245;
8891
8916
  })()
8892
8917
  });
8893
8918
  }
@@ -8990,12 +9015,12 @@ ${contextBlock}` : contextBlock);
8990
9015
  return pendingQueries2();
8991
9016
  },
8992
9017
  children: (pendingPrompt, index) => (() => {
8993
- var _el$255 = _tmpl$63(), _el$256 = _el$255.firstChild, _el$257 = _el$256.nextSibling;
8994
- setAttribute(_el$256, "title", pendingPrompt);
8995
- insert(_el$256, pendingPrompt);
8996
- _el$257.$$click = () => removePendingQuery(index());
8997
- createRenderEffect(() => setAttribute(_el$257, "aria-label", `Remove queued prompt ${index() + 1}`));
8998
- return _el$255;
9018
+ var _el$256 = _tmpl$63(), _el$257 = _el$256.firstChild, _el$258 = _el$257.nextSibling;
9019
+ setAttribute(_el$257, "title", pendingPrompt);
9020
+ insert(_el$257, pendingPrompt);
9021
+ _el$258.$$click = () => removePendingQuery(index());
9022
+ createRenderEffect(() => setAttribute(_el$258, "aria-label", `Remove queued prompt ${index() + 1}`));
9023
+ return _el$256;
8999
9024
  })()
9000
9025
  }));
9001
9026
  return _el$137;
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:;" />
7
7
  <title>Vessel</title>
8
- <script type="module" crossorigin src="./assets/index-DOJa9vgV.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-DM2iGE8-.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="./assets/index-CHSGQlQr.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@quanta-intellect/vessel-browser",
3
3
  "mcpName": "io.github.unmodeled-tyler/vessel-browser",
4
- "version": "0.1.81",
4
+ "version": "0.1.83",
5
5
  "description": "AI-native web browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {