@quanta-intellect/vessel-browser 0.1.83 → 0.1.86

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
@@ -182,6 +182,14 @@ The packaged AppImage path:
182
182
  - uses the packaged Vessel app icon and metadata
183
183
  - is the recommended path for early adopters who just want to run Vessel
184
184
 
185
+ Windows packaged releases:
186
+
187
+ - use the `Vessel-<version>-x64-setup.exe` NSIS installer
188
+ - can be installed over an existing Vessel install when upgrading
189
+ - preserve Vessel app data during the normal upgrade path
190
+
191
+ You do not need to uninstall Vessel before installing a newer Windows release. Uninstall first only if you are recovering from a broken install or intentionally removing local Vessel data.
192
+
185
193
  After install:
186
194
 
187
195
  ```bash
package/out/main/index.js CHANGED
@@ -183,6 +183,15 @@ function sanitizePort(value) {
183
183
  });
184
184
  return defaults.mcpPort;
185
185
  }
186
+ function sanitizeReasoningEffortLevel$1(value) {
187
+ return value === "low" || value === "medium" || value === "high" || value === "max" || value === "off" ? value : "off";
188
+ }
189
+ function sanitizeChatProvider(provider) {
190
+ return provider ? {
191
+ ...provider,
192
+ reasoningEffort: sanitizeReasoningEffortLevel$1(provider.reasoningEffort)
193
+ } : null;
194
+ }
186
195
  function loadSettings() {
187
196
  if (settings) return settings;
188
197
  settingsIssues = [];
@@ -194,7 +203,9 @@ function loadSettings() {
194
203
  settings = {
195
204
  ...defaults,
196
205
  ...parsed,
197
- chatProvider: mergeChatProviderSecret(parsed.chatProvider ?? null),
206
+ chatProvider: sanitizeChatProvider(
207
+ mergeChatProviderSecret(parsed.chatProvider ?? null)
208
+ ),
198
209
  mcpPort: sanitizePort(parsed.mcpPort ?? defaults.mcpPort),
199
210
  agentTranscriptMode: parsed.agentTranscriptMode === "off" || parsed.agentTranscriptMode === "summary" || parsed.agentTranscriptMode === "full" ? parsed.agentTranscriptMode : parsed.showAgentTranscript === false ? "off" : defaults.agentTranscriptMode
200
211
  };
@@ -260,7 +271,10 @@ function setSetting(key, value) {
260
271
  settings.chatProvider = {
261
272
  ...nextProvider,
262
273
  apiKey: resolvedApiKey,
263
- hasApiKey: Boolean(resolvedApiKey)
274
+ hasApiKey: Boolean(resolvedApiKey),
275
+ reasoningEffort: sanitizeReasoningEffortLevel$1(
276
+ nextProvider.reasoningEffort
277
+ )
264
278
  };
265
279
  }
266
280
  } else {
@@ -602,7 +616,7 @@ class Tab {
602
616
  var el = document.elementFromPoint(${x}, ${y});
603
617
  while (el) {
604
618
  if (el.hasAttribute && el.hasAttribute('data-vessel-highlight')) {
605
- return el.textContent || '';
619
+ return el.getAttribute('data-vessel-highlight-text') || el.textContent || '';
606
620
  }
607
621
  el = el.parentElement;
608
622
  }
@@ -917,6 +931,7 @@ class Tab {
917
931
  mark.style.setProperty('background', 'rgba(240, 198, 54, 0.3)', 'important');
918
932
  mark.style.setProperty('border-bottom-color', '#f0c636', 'important');
919
933
  mark.setAttribute('data-vessel-highlight', 'true');
934
+ mark.setAttribute('data-vessel-highlight-text', text);
920
935
  range.surroundContents(mark);
921
936
  } else {
922
937
  // For cross-node selections, extract and wrap in a mark
@@ -925,6 +940,7 @@ class Tab {
925
940
  mark.style.setProperty('background', 'rgba(240, 198, 54, 0.3)', 'important');
926
941
  mark.style.setProperty('border-bottom-color', '#f0c636', 'important');
927
942
  mark.setAttribute('data-vessel-highlight', 'true');
943
+ mark.setAttribute('data-vessel-highlight-text', text);
928
944
  var contents = range.extractContents();
929
945
  mark.appendChild(contents);
930
946
  range.insertNode(mark);
@@ -1201,6 +1217,134 @@ for (var cr = 0; cr < contentRoots.length; cr++) {
1201
1217
  if (contentRoot) break;
1202
1218
  }`;
1203
1219
  const NAV_ANCESTORS_JS = `var NAV_ANCESTORS = 'nav, aside, footer, header, [role="navigation"], [role="complementary"], .sidebar, .navbox, .infobox, figcaption, .thumbcaption, .mw-jump-link';`;
1220
+ const TEXT_MATCH_HELPERS_JS = `
1221
+ function normalizeHighlightSearchText(value) {
1222
+ return String(value || '').replace(/\\s+/g, ' ').trim().toLowerCase();
1223
+ }
1224
+
1225
+ function isHighlightableTextNode(n) {
1226
+ var p = n.parentElement;
1227
+ if (!p) return false;
1228
+ if (SKIP_TAGS[p.tagName]) return false;
1229
+ if (p.closest('[data-vessel-highlight]')) return false;
1230
+ if (p.closest(NAV_ANCESTORS)) return false;
1231
+ var style = window.getComputedStyle(p);
1232
+ if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false;
1233
+ if (p.offsetWidth === 0 && p.offsetHeight === 0) return false;
1234
+ return true;
1235
+ }
1236
+
1237
+ function collectTextRangeMatches(root, searchText, limit) {
1238
+ var normalizedSearch = normalizeHighlightSearchText(searchText);
1239
+ if (!root || !normalizedSearch) return [];
1240
+ var normalized = '';
1241
+ var map = [];
1242
+ var w = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
1243
+ acceptNode: function(n) {
1244
+ return isHighlightableTextNode(n)
1245
+ ? NodeFilter.FILTER_ACCEPT
1246
+ : NodeFilter.FILTER_REJECT;
1247
+ }
1248
+ });
1249
+ var n;
1250
+ while ((n = w.nextNode())) {
1251
+ var text = n.textContent || '';
1252
+ for (var i = 0; i < text.length; i++) {
1253
+ var ch = text.charAt(i);
1254
+ if (/\\s/.test(ch)) {
1255
+ if (normalized.length === 0 || normalized.charAt(normalized.length - 1) === ' ') {
1256
+ continue;
1257
+ }
1258
+ normalized += ' ';
1259
+ } else {
1260
+ normalized += ch.toLowerCase();
1261
+ }
1262
+ map.push({ node: n, offset: i });
1263
+ }
1264
+ }
1265
+ var matches = [];
1266
+ var from = 0;
1267
+ while (matches.length < limit) {
1268
+ var idx = normalized.indexOf(normalizedSearch, from);
1269
+ if (idx === -1) break;
1270
+ var start = map[idx];
1271
+ var end = map[idx + normalizedSearch.length - 1];
1272
+ if (start && end) {
1273
+ matches.push({
1274
+ startNode: start.node,
1275
+ startOffset: start.offset,
1276
+ endNode: end.node,
1277
+ endOffset: end.offset + 1,
1278
+ });
1279
+ }
1280
+ from = idx + Math.max(1, normalizedSearch.length);
1281
+ }
1282
+ return matches;
1283
+ }
1284
+
1285
+ function collectTextSegmentsForMatch(match) {
1286
+ var segments = [];
1287
+ var inRange = false;
1288
+ var w = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
1289
+ acceptNode: function(n) {
1290
+ return isHighlightableTextNode(n) || n === match.startNode || n === match.endNode
1291
+ ? NodeFilter.FILTER_ACCEPT
1292
+ : NodeFilter.FILTER_REJECT;
1293
+ }
1294
+ });
1295
+ var n;
1296
+ while ((n = w.nextNode())) {
1297
+ if (n === match.startNode) inRange = true;
1298
+ if (!inRange) continue;
1299
+ segments.push({
1300
+ node: n,
1301
+ start: n === match.startNode ? match.startOffset : 0,
1302
+ end: n === match.endNode ? match.endOffset : (n.textContent || '').length,
1303
+ });
1304
+ if (n === match.endNode) break;
1305
+ }
1306
+ return segments;
1307
+ }
1308
+
1309
+ function markTextSegment(segment, solidColor, bgColor, fullText) {
1310
+ if (!segment.node || segment.end <= segment.start) return null;
1311
+ var parent = segment.node.parentNode;
1312
+ if (!parent) return null;
1313
+ var text = segment.node.textContent || '';
1314
+ var selected = text.slice(segment.start, segment.end);
1315
+ if (!selected) return null;
1316
+ var mark = document.createElement('mark');
1317
+ mark.className = '__vessel-highlight-text';
1318
+ mark.style.setProperty('background', bgColor, 'important');
1319
+ mark.style.setProperty('border-bottom-color', solidColor, 'important');
1320
+ mark.setAttribute('data-vessel-highlight', 'true');
1321
+ if (fullText) {
1322
+ mark.setAttribute('data-vessel-highlight-text', fullText);
1323
+ }
1324
+ mark.textContent = selected;
1325
+ if (segment.start > 0) {
1326
+ parent.insertBefore(document.createTextNode(text.slice(0, segment.start)), segment.node);
1327
+ }
1328
+ parent.insertBefore(mark, segment.node);
1329
+ if (segment.end < text.length) {
1330
+ parent.insertBefore(document.createTextNode(text.slice(segment.end)), segment.node);
1331
+ }
1332
+ parent.removeChild(segment.node);
1333
+ return mark;
1334
+ }
1335
+
1336
+ function applyTextRangeMatch(match, solidColor, bgColor, fullText) {
1337
+ var segments = collectTextSegmentsForMatch(match);
1338
+ var marks = [];
1339
+ for (var i = segments.length - 1; i >= 0; i--) {
1340
+ try {
1341
+ var mark = markTextSegment(segments[i], solidColor, bgColor, fullText);
1342
+ if (mark) marks.unshift(mark);
1343
+ } catch (_e) {}
1344
+ }
1345
+ return marks;
1346
+ }
1347
+ `;
1204
1348
  const HIGHLIGHT_COLORS = {
1205
1349
  yellow: {
1206
1350
  solid: "#f0c636",
@@ -1424,7 +1568,6 @@ async function highlightOnPage(wc, resolvedSelector, text, label, durationMs, co
1424
1568
  return wc.executeJavaScript(`
1425
1569
  (function() {
1426
1570
  var searchText = (${JSON.stringify(text)} || '').trim();
1427
- var foldedSearchText = searchText.toLowerCase();
1428
1571
  var solidColor = ${JSON.stringify(c.solid)};
1429
1572
  var bgColor = ${JSON.stringify(c.bg)};
1430
1573
  var labelBg = ${JSON.stringify(c.label)};
@@ -1436,60 +1579,22 @@ async function highlightOnPage(wc, resolvedSelector, text, label, durationMs, co
1436
1579
  ${SKIP_TAGS_JS}
1437
1580
  ${CONTENT_ROOTS_JS}
1438
1581
  ${NAV_ANCESTORS_JS}
1439
-
1440
- function collectMatches(root, limit) {
1441
- var matches = [];
1442
- var w = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
1443
- acceptNode: function(n) {
1444
- var p = n.parentElement;
1445
- if (!p) return NodeFilter.FILTER_REJECT;
1446
- if (SKIP_TAGS[p.tagName]) return NodeFilter.FILTER_REJECT;
1447
- if (p.closest('[data-vessel-highlight]')) return NodeFilter.FILTER_REJECT;
1448
- if (p.closest(NAV_ANCESTORS)) return NodeFilter.FILTER_REJECT;
1449
- var style = window.getComputedStyle(p);
1450
- if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return NodeFilter.FILTER_REJECT;
1451
- if (p.offsetWidth === 0 && p.offsetHeight === 0) return NodeFilter.FILTER_REJECT;
1452
- return NodeFilter.FILTER_ACCEPT;
1453
- }
1454
- });
1455
- var n;
1456
- while ((n = w.nextNode())) {
1457
- var haystack = n.textContent || '';
1458
- var idx = haystack.indexOf(searchText);
1459
- if (idx === -1 && foldedSearchText) {
1460
- idx = haystack.toLowerCase().indexOf(foldedSearchText);
1461
- }
1462
- if (idx !== -1) {
1463
- matches.push({ node: n, idx: idx });
1464
- if (matches.length >= limit) break;
1465
- }
1466
- }
1467
- return matches;
1468
- }
1582
+ ${TEXT_MATCH_HELPERS_JS}
1469
1583
 
1470
1584
  // First try: match inside main content area (skip nav/sidebar/captions)
1471
- var textNodes = contentRoot ? collectMatches(contentRoot, 20) : [];
1585
+ var textMatches = contentRoot ? collectTextRangeMatches(contentRoot, searchText, 20) : [];
1472
1586
  // Fallback: if no matches in content area, search the whole body
1473
- if (textNodes.length === 0) {
1474
- textNodes = collectMatches(document.body, 20);
1587
+ if (textMatches.length === 0) {
1588
+ textMatches = collectTextRangeMatches(document.body, searchText, 20);
1475
1589
  }
1476
1590
  var count = 0;
1477
1591
  var firstMark = null;
1478
- for (var i = 0; i < textNodes.length; i++) {
1479
- var match = textNodes[i];
1480
- try {
1481
- var range = document.createRange();
1482
- range.setStart(match.node, match.idx);
1483
- range.setEnd(match.node, match.idx + searchText.length);
1484
- var mark = document.createElement('mark');
1485
- mark.className = '__vessel-highlight-text';
1486
- mark.style.setProperty('background', bgColor, 'important');
1487
- mark.style.setProperty('border-bottom-color', solidColor, 'important');
1488
- mark.setAttribute('data-vessel-highlight', 'true');
1489
- range.surroundContents(mark);
1490
- if (!firstMark) firstMark = mark;
1592
+ for (var i = textMatches.length - 1; i >= 0; i--) {
1593
+ var marks = applyTextRangeMatch(textMatches[i], solidColor, bgColor, searchText);
1594
+ if (marks.length > 0) {
1595
+ firstMark = marks[0];
1491
1596
  count++;
1492
- } catch (_e) {}
1597
+ }
1493
1598
  }
1494
1599
  if (count === 0) return 'Text not found: ' + searchText.slice(0, 80);
1495
1600
  if (firstMark) firstMark.scrollIntoView({ behavior: 'smooth', block: 'center' });
@@ -1550,60 +1655,19 @@ async function highlightBatchOnPage(wc, entries) {
1550
1655
  ${SKIP_TAGS_JS}
1551
1656
  ${CONTENT_ROOTS_JS}
1552
1657
  ${NAV_ANCESTORS_JS}
1553
-
1554
- function collectMatches(root, searchText, foldedSearchText, limit) {
1555
- var matches = [];
1556
- var w = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
1557
- acceptNode: function(n) {
1558
- var p = n.parentElement;
1559
- if (!p) return NodeFilter.FILTER_REJECT;
1560
- if (SKIP_TAGS[p.tagName]) return NodeFilter.FILTER_REJECT;
1561
- if (p.closest('[data-vessel-highlight]')) return NodeFilter.FILTER_REJECT;
1562
- if (p.closest(NAV_ANCESTORS)) return NodeFilter.FILTER_REJECT;
1563
- var style = window.getComputedStyle(p);
1564
- if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return NodeFilter.FILTER_REJECT;
1565
- if (p.offsetWidth === 0 && p.offsetHeight === 0) return NodeFilter.FILTER_REJECT;
1566
- return NodeFilter.FILTER_ACCEPT;
1567
- }
1568
- });
1569
- var n;
1570
- while ((n = w.nextNode())) {
1571
- var haystack = n.textContent || '';
1572
- var idx = haystack.indexOf(searchText);
1573
- if (idx === -1 && foldedSearchText) {
1574
- idx = haystack.toLowerCase().indexOf(foldedSearchText);
1575
- }
1576
- if (idx !== -1) {
1577
- matches.push({ node: n, idx: idx });
1578
- if (matches.length >= limit) break;
1579
- }
1580
- }
1581
- return matches;
1582
- }
1658
+ ${TEXT_MATCH_HELPERS_JS}
1583
1659
 
1584
1660
  for (var e = 0; e < entries.length; e++) {
1585
1661
  var entry = entries[e];
1586
1662
  var c = entry.color;
1587
1663
  if (entry.text) {
1588
1664
  var searchText = (entry.text || '').trim();
1589
- var foldedSearchText = searchText.toLowerCase();
1590
- var textNodes = contentRoot ? collectMatches(contentRoot, searchText, foldedSearchText, 20) : [];
1591
- if (textNodes.length === 0) {
1592
- textNodes = collectMatches(document.body, searchText, foldedSearchText, 20);
1665
+ var textMatches = contentRoot ? collectTextRangeMatches(contentRoot, searchText, 20) : [];
1666
+ if (textMatches.length === 0) {
1667
+ textMatches = collectTextRangeMatches(document.body, searchText, 20);
1593
1668
  }
1594
- for (var i = 0; i < textNodes.length; i++) {
1595
- try {
1596
- var match = textNodes[i];
1597
- var range = document.createRange();
1598
- range.setStart(match.node, match.idx);
1599
- range.setEnd(match.node, match.idx + searchText.length);
1600
- var mark = document.createElement('mark');
1601
- mark.className = '__vessel-highlight-text';
1602
- mark.style.setProperty('background', c.bg, 'important');
1603
- mark.style.setProperty('border-bottom-color', c.solid, 'important');
1604
- mark.setAttribute('data-vessel-highlight', 'true');
1605
- range.surroundContents(mark);
1606
- } catch (_e) {}
1669
+ for (var i = textMatches.length - 1; i >= 0; i--) {
1670
+ applyTextRangeMatch(textMatches[i], c.solid, c.bg, searchText);
1607
1671
  }
1608
1672
  } else if (entry.selector) {
1609
1673
  try {
@@ -3196,7 +3260,8 @@ class TabManager {
3196
3260
  `(function() {
3197
3261
  var marks = document.querySelectorAll('mark.__vessel-highlight-text[data-vessel-highlight]');
3198
3262
  marks.forEach(function(m) {
3199
- if (m.textContent === ${JSON.stringify(text)}) {
3263
+ var highlightText = m.getAttribute('data-vessel-highlight-text') || m.textContent;
3264
+ if (highlightText === ${JSON.stringify(text)}) {
3200
3265
  var parent = m.parentNode;
3201
3266
  while (m.firstChild) parent.insertBefore(m.firstChild, m);
3202
3267
  m.remove();
@@ -6819,17 +6884,38 @@ function isClickReadLoop(names) {
6819
6884
  }
6820
6885
  return clickReadPairs >= 2;
6821
6886
  }
6887
+ const ANTHROPIC_MAX_TOKENS = 4096;
6822
6888
  function isRecord(value) {
6823
6889
  return value !== null && typeof value === "object" && !Array.isArray(value);
6824
6890
  }
6891
+ function anthropicModelLikelySupportsThinking(model) {
6892
+ return /claude-(?:opus|sonnet|haiku)-4/i.test(model.trim());
6893
+ }
6894
+ function toAnthropicThinkingConfig(effort, model) {
6895
+ if (!effort || effort === "off" || !anthropicModelLikelySupportsThinking(model)) {
6896
+ return void 0;
6897
+ }
6898
+ const budgetByEffort = {
6899
+ low: 1024,
6900
+ medium: 2048,
6901
+ high: 3072,
6902
+ max: 3584
6903
+ };
6904
+ return {
6905
+ type: "enabled",
6906
+ budget_tokens: budgetByEffort[effort]
6907
+ };
6908
+ }
6825
6909
  class AnthropicProvider {
6826
6910
  agentToolProfile = "default";
6827
6911
  client;
6828
6912
  model;
6913
+ reasoningEffort;
6829
6914
  abortController = null;
6830
- constructor(apiKey, model) {
6915
+ constructor(apiKey, model, reasoningEffort = "off") {
6831
6916
  this.client = new Anthropic({ apiKey });
6832
6917
  this.model = model || "claude-sonnet-4-20250514";
6918
+ this.reasoningEffort = reasoningEffort;
6833
6919
  }
6834
6920
  async streamQuery(systemPrompt, userMessage, onChunk, onEnd, history) {
6835
6921
  this.abortController = new AbortController();
@@ -6837,13 +6923,15 @@ class AnthropicProvider {
6837
6923
  ...(history ?? []).map((m) => ({ role: m.role, content: m.content })),
6838
6924
  { role: "user", content: userMessage }
6839
6925
  ];
6926
+ const thinking = toAnthropicThinkingConfig(this.reasoningEffort, this.model);
6840
6927
  try {
6841
6928
  const stream = this.client.messages.stream(
6842
6929
  {
6843
6930
  model: this.model,
6844
- max_tokens: 4096,
6931
+ max_tokens: ANTHROPIC_MAX_TOKENS,
6845
6932
  system: systemPrompt,
6846
- messages
6933
+ messages,
6934
+ ...thinking ? { thinking } : {}
6847
6935
  },
6848
6936
  { signal: this.abortController.signal }
6849
6937
  );
@@ -6869,6 +6957,7 @@ class AnthropicProvider {
6869
6957
  ...(history ?? []).map((m) => ({ role: m.role, content: m.content })),
6870
6958
  { role: "user", content: userMessage }
6871
6959
  ];
6960
+ const thinking = toAnthropicThinkingConfig(this.reasoningEffort, this.model);
6872
6961
  try {
6873
6962
  const maxIterations = getEffectiveMaxIterations();
6874
6963
  let iterationsUsed = 0;
@@ -6879,10 +6968,11 @@ class AnthropicProvider {
6879
6968
  const stream = this.client.messages.stream(
6880
6969
  {
6881
6970
  model: this.model,
6882
- max_tokens: 4096,
6971
+ max_tokens: ANTHROPIC_MAX_TOKENS,
6883
6972
  system: systemPrompt,
6884
6973
  messages,
6885
- tools
6974
+ tools,
6975
+ ...thinking ? { thinking } : {}
6886
6976
  },
6887
6977
  { signal: this.abortController.signal }
6888
6978
  );
@@ -6943,6 +7033,20 @@ class AnthropicProvider {
6943
7033
  }
6944
7034
  const finalMessage = await stream.finalMessage();
6945
7035
  const assistantContent = [];
7036
+ for (const block of finalMessage.content) {
7037
+ if (block.type === "thinking") {
7038
+ assistantContent.push({
7039
+ type: "thinking",
7040
+ thinking: block.thinking,
7041
+ signature: block.signature
7042
+ });
7043
+ } else if (block.type === "redacted_thinking") {
7044
+ assistantContent.push({
7045
+ type: "redacted_thinking",
7046
+ data: block.data
7047
+ });
7048
+ }
7049
+ }
6946
7050
  if (textContent) {
6947
7051
  assistantContent.push({ type: "text", text: textContent });
6948
7052
  }
@@ -7266,6 +7370,30 @@ function toOpenAITools(tools) {
7266
7370
  function agentTemperatureForProfile(profile) {
7267
7371
  return profile === "compact" ? 0.2 : void 0;
7268
7372
  }
7373
+ function modelLikelySupportsOpenAIReasoningEffort(model) {
7374
+ return /^(?:o\d|o[1-9]|gpt-5|codex|computer-use)/i.test(model.trim());
7375
+ }
7376
+ function toOpenAIReasoningEffort(effort, providerId, model) {
7377
+ const supportsReasoningParam = providerId === "openrouter" || providerId === "custom" || providerId === "openai" && modelLikelySupportsOpenAIReasoningEffort(model);
7378
+ if (!supportsReasoningParam) return void 0;
7379
+ switch (effort) {
7380
+ case "off":
7381
+ if (providerId === "openai" && !/^gpt-5\.1/i.test(model.trim())) {
7382
+ return void 0;
7383
+ }
7384
+ return "none";
7385
+ case "low":
7386
+ return "low";
7387
+ case "medium":
7388
+ return "medium";
7389
+ case "high":
7390
+ return "high";
7391
+ case "max":
7392
+ return "xhigh";
7393
+ default:
7394
+ return void 0;
7395
+ }
7396
+ }
7269
7397
  function followUpReminderForProfile(profile, userMessage, assistantText, latestToolResultPreview) {
7270
7398
  if (profile !== "compact") return null;
7271
7399
  const phaseReminder = buildPhaseReminder(userMessage, assistantText || "");
@@ -7876,6 +8004,7 @@ class OpenAICompatProvider {
7876
8004
  client;
7877
8005
  model;
7878
8006
  providerId;
8007
+ reasoningEffort;
7879
8008
  abortController = null;
7880
8009
  constructor(config) {
7881
8010
  const meta = PROVIDERS[config.id];
@@ -7893,6 +8022,7 @@ class OpenAICompatProvider {
7893
8022
  });
7894
8023
  this.providerId = config.id;
7895
8024
  this.model = config.model || meta?.defaultModel || "gpt-4o";
8025
+ this.reasoningEffort = config.reasoningEffort ?? "off";
7896
8026
  this.agentToolProfile = resolveAgentToolProfile(config);
7897
8027
  }
7898
8028
  async streamQuery(systemPrompt, userMessage, onChunk, onEnd, history) {
@@ -7902,13 +8032,19 @@ class OpenAICompatProvider {
7902
8032
  ...(history ?? []).map((m) => ({ role: m.role, content: m.content })),
7903
8033
  { role: "user", content: userMessage }
7904
8034
  ];
8035
+ const reasoningEffort = toOpenAIReasoningEffort(
8036
+ this.reasoningEffort,
8037
+ this.providerId,
8038
+ this.model
8039
+ );
7905
8040
  try {
7906
8041
  const stream = await this.client.chat.completions.create(
7907
8042
  {
7908
8043
  model: this.model,
7909
8044
  max_tokens: 4096,
7910
8045
  stream: true,
7911
- messages
8046
+ messages,
8047
+ ...reasoningEffort ? { reasoning_effort: reasoningEffort } : {}
7912
8048
  },
7913
8049
  { signal: this.abortController.signal }
7914
8050
  );
@@ -7946,6 +8082,11 @@ class OpenAICompatProvider {
7946
8082
  ...(history ?? []).map((m) => ({ role: m.role, content: m.content })),
7947
8083
  { role: "user", content: userMessage }
7948
8084
  ];
8085
+ const reasoningEffort = toOpenAIReasoningEffort(
8086
+ this.reasoningEffort,
8087
+ this.providerId,
8088
+ this.model
8089
+ );
7949
8090
  try {
7950
8091
  const maxIterations = getEffectiveMaxIterations();
7951
8092
  let iterationsUsed = 0;
@@ -7973,7 +8114,8 @@ class OpenAICompatProvider {
7973
8114
  messages,
7974
8115
  tools: openAITools,
7975
8116
  tool_choice: "auto",
7976
- temperature: agentTemperatureForProfile(this.agentToolProfile)
8117
+ temperature: agentTemperatureForProfile(this.agentToolProfile),
8118
+ ...reasoningEffort ? { reasoning_effort: reasoningEffort } : {}
7977
8119
  },
7978
8120
  { signal: this.abortController.signal }
7979
8121
  );
@@ -8268,9 +8410,13 @@ function sanitizeProviderConfig(config) {
8268
8410
  ...config,
8269
8411
  apiKey: config.apiKey.trim(),
8270
8412
  model: config.model.trim(),
8271
- baseUrl: config.baseUrl?.trim() || void 0
8413
+ baseUrl: config.baseUrl?.trim() || void 0,
8414
+ reasoningEffort: sanitizeReasoningEffortLevel(config.reasoningEffort)
8272
8415
  };
8273
8416
  }
8417
+ function sanitizeReasoningEffortLevel(value) {
8418
+ return value === "low" || value === "medium" || value === "high" || value === "max" || value === "off" ? value : "off";
8419
+ }
8274
8420
  function validateProviderConfig(config) {
8275
8421
  return validateProviderConnection(config, { requireModel: true });
8276
8422
  }
@@ -8372,7 +8518,11 @@ function createProvider(config) {
8372
8518
  throw new Error(error);
8373
8519
  }
8374
8520
  if (normalized.id === "anthropic") {
8375
- return new AnthropicProvider(normalized.apiKey, normalized.model);
8521
+ return new AnthropicProvider(
8522
+ normalized.apiKey,
8523
+ normalized.model,
8524
+ normalized.reasoningEffort
8525
+ );
8376
8526
  }
8377
8527
  return new OpenAICompatProvider(normalized);
8378
8528
  }
@@ -12212,7 +12362,10 @@ async function captureLiveHighlightSnapshot(wc, savedHighlights = []) {
12212
12362
  const pageHighlights = Array.from(
12213
12363
  document.querySelectorAll("mark.__vessel-highlight-text[data-vessel-highlight]")
12214
12364
  ).map((mark) => {
12215
- const text = mark.textContent?.trim() || "";
12365
+ const text =
12366
+ mark.getAttribute("data-vessel-highlight-text")?.trim() ||
12367
+ mark.textContent?.trim() ||
12368
+ "";
12216
12369
  const style = window.getComputedStyle(mark);
12217
12370
  return {
12218
12371
  text,
@@ -12248,20 +12401,28 @@ function formatLiveSelectionSection(snapshot) {
12248
12401
  const sections = [];
12249
12402
  if (snapshot.activeSelection) {
12250
12403
  const preview = snapshot.activeSelection.length > 400 ? `${snapshot.activeSelection.slice(0, 397)}...` : snapshot.activeSelection;
12251
- sections.push(`## Active User Selection
12252
- "${preview}"`);
12404
+ sections.push(
12405
+ `## Active User Selection
12406
+ The user currently has this text selected on screen:
12407
+ - "${preview}"`
12408
+ );
12253
12409
  }
12254
- const unsavedHighlights = snapshot.pageHighlights.filter(
12255
- (highlight) => !highlight.persisted
12256
- );
12257
- if (unsavedHighlights.length > 0) {
12258
- const lines = unsavedHighlights.map((highlight) => {
12410
+ if (snapshot.pageHighlights.length > 0) {
12411
+ const lines = snapshot.pageHighlights.map((highlight) => {
12259
12412
  const preview = highlight.text.length > 180 ? `${highlight.text.slice(0, 177)}...` : highlight.text;
12260
- const color = highlight.color ? ` (${highlight.color})` : "";
12261
- return `- "${preview}"${color}`;
12413
+ const details = [
12414
+ highlight.persisted ? "saved" : "visible only",
12415
+ highlight.color ? `color: ${highlight.color}` : ""
12416
+ ].filter(Boolean);
12417
+ return `- "${preview}"${details.length ? ` (${details.join(", ")})` : ""}`;
12262
12418
  });
12263
- sections.push(`## Unsaved Visible Highlights
12264
- ${lines.join("\n")}`);
12419
+ sections.push(
12420
+ [
12421
+ "## Visible Highlights On Screen",
12422
+ "These are the highlighted passages currently visible in the page. Treat this as authoritative before searching or inspecting:",
12423
+ lines.join("\n")
12424
+ ].join("\n")
12425
+ );
12265
12426
  }
12266
12427
  return sections.length > 0 ? sections.join("\n\n") : null;
12267
12428
  }
@@ -2951,7 +2951,7 @@ const SEARCH_ENGINE_PRESETS = {
2951
2951
  ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
2952
2952
  kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
2953
2953
  };
2954
- var _tmpl$$l = /* @__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$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">`), _tmpl$3$h = /* @__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$h = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$d = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$c = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$b = /* @__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$8 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$6 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$5 = /* @__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$5 = /* @__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$5 = /* @__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$5 = /* @__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$5 = /* @__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$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$4 = /* @__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$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$3 = /* @__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$3 = /* @__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$3 = /* @__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$3 = /* @__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$2 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$25$2 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$27$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><div class=page-diff-badges><span class=page-diff-kind></span><span class=page-diff-section></span></div><span class=page-diff-summary>`), _tmpl$29$2 = /* @__PURE__ */ template(`<li>`);
2954
+ var _tmpl$$l = /* @__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$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">`), _tmpl$3$h = /* @__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$h = /* @__PURE__ */ template(`<div class=security-indicator-wrapper><button>`), _tmpl$5$d = /* @__PURE__ */ template(`<div id=address-autocomplete class=autocomplete-dropdown role=listbox>`), _tmpl$6$c = /* @__PURE__ */ template(`<div><span class=agent-status-dot aria-hidden=true></span><span class=agent-status-text>`), _tmpl$7$b = /* @__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$8 = /* @__PURE__ */ template(`<span class=page-diff-burst-meta>Updated <!> times over `), _tmpl$9$6 = /* @__PURE__ */ template(`<div class=page-diff-burst-history><div class=page-diff-burst-history-label>Recent detections`), _tmpl$0$5 = /* @__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$5 = /* @__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$5 = /* @__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$5 = /* @__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$5 = /* @__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$4 = /* @__PURE__ */ template(`<span class=nav-btn-badge>`), _tmpl$14$4 = /* @__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$4 = /* @__PURE__ */ template(`<button class=nav-btn data-tooltip="Clear Data">`), _tmpl$16$3 = /* @__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$3 = /* @__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$3 = /* @__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$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=page-diff-burst-row><span class=page-diff-burst-time></span><span class=page-diff-burst-summary>`), _tmpl$21$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-section>`), _tmpl$22$2 = /* @__PURE__ */ template(`<span class=page-diff-burst-summary-part><span>`), _tmpl$23$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>Before</span><span class=page-diff-snippet-text>`), _tmpl$24$2 = /* @__PURE__ */ template(`<div class=page-diff-snippet><span class=page-diff-snippet-label>After</span><span class=page-diff-snippet-text>`), _tmpl$25$2 = /* @__PURE__ */ template(`<div class=page-diff-snippets>`), _tmpl$26$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Added</span><ul class=page-diff-list>`), _tmpl$27$2 = /* @__PURE__ */ template(`<div class=page-diff-list-group><span class=page-diff-list-label>Removed</span><ul class=page-diff-list>`), _tmpl$28$2 = /* @__PURE__ */ template(`<div><div class=page-diff-item-header><div class=page-diff-badges><span class=page-diff-kind></span><span class=page-diff-section></span></div><span class=page-diff-summary>`), _tmpl$29$2 = /* @__PURE__ */ template(`<li>`);
2955
2955
  const AddressBar = (props) => {
2956
2956
  const {
2957
2957
  activeTab,
@@ -3429,7 +3429,7 @@ const AddressBar = (props) => {
3429
3429
  return pageDiff().recentBursts;
3430
3430
  },
3431
3431
  children: (burst, i) => (() => {
3432
- var _el$55 = _tmpl$20$2(), _el$56 = _el$55.firstChild, _el$57 = _el$56.nextSibling;
3432
+ var _el$55 = _tmpl$20$3(), _el$56 = _el$55.firstChild, _el$57 = _el$56.nextSibling;
3433
3433
  insert(_el$56, (() => {
3434
3434
  var _c$2 = memo(() => i() === 0);
3435
3435
  return () => _c$2() ? "Latest" : formatRelativeTime(burst.detectedAt);
@@ -6539,7 +6539,7 @@ function renderKitPrompt(kit, values) {
6539
6539
  (_, key) => values[key] ?? ""
6540
6540
  );
6541
6541
  }
6542
- var _tmpl$$c = /* @__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$c = /* @__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$b = /* @__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$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$5 = /* @__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$4 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$4 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$4 = /* @__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$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$3 = /* @__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$2 = /* @__PURE__ */ template(`<p class=kit-schedule-error>`), _tmpl$17$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class=kit-schedule-section><label class=kit-schedule-toggle><input type=checkbox>Schedule for later`), _tmpl$19$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Run at</label><input type=datetime-local class="kit-form-input kit-schedule-time">`), _tmpl$20$1 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Day</label><select class="kit-form-input kit-schedule-time">`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$1 = /* @__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$1 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$1 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=sched-context-menu><button class=sched-ctx-item type=button>Edit task</button><button class=sched-ctx-item type=button>Edit schedule</button><div class=sched-ctx-divider></div><button class=sched-ctx-item type=button></button><button class="sched-ctx-item sched-ctx-danger"type=button>Delete`), _tmpl$30$1 = /* @__PURE__ */ template(`<div class=kit-sched-card><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-sched-body><div class=kit-sched-name></div><div class=kit-sched-meta></div></div><div class=kit-sched-actions><button class=kit-sched-toggle type=button></button><button class=kit-remove-btn type=button title="Delete schedule"aria-label="Delete schedule">×`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=kit-activity-output>`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=kit-activity-card><div class=kit-activity-header><div class=kit-activity-title><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-activity-title-copy><div class=kit-sched-name></div><div class=kit-activity-time></div></div></div><span class=kit-activity-badge>`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$1 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$1 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$1 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$1 = /* @__PURE__ */ template(`<input class=kit-form-input>`), _tmpl$39$1 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$1 = /* @__PURE__ */ template(`<option>`), _tmpl$42$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
6542
+ var _tmpl$$c = /* @__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$c = /* @__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$b = /* @__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$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Scheduled</span><span class=kit-list-count>`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=kit-sched-list>`), _tmpl$7$8 = /* @__PURE__ */ template(`<div class=kit-sched-section><span>Recent Activity</span><span class=kit-list-count>`), _tmpl$8$7 = /* @__PURE__ */ template(`<div class=kit-activity-list>`), _tmpl$9$5 = /* @__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$4 = /* @__PURE__ */ template(`<p class=kit-form-desc>`), _tmpl$1$4 = /* @__PURE__ */ template(`<div class=kit-form-fields>`), _tmpl$10$4 = /* @__PURE__ */ template(`<p class=kit-form-estimate>Estimated run time: ~<!> min`), _tmpl$11$4 = /* @__PURE__ */ template(`<button class="agent-primary-button kit-run-btn"type=button>`), _tmpl$12$4 = /* @__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$3 = /* @__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$3 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label class=kit-form-label>Day</label><select class=kit-form-input>`), _tmpl$15$3 = /* @__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$2 = /* @__PURE__ */ template(`<p class=kit-schedule-error>`), _tmpl$17$2 = /* @__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$2 = /* @__PURE__ */ template(`<div class=kit-schedule-section><label class=kit-schedule-toggle><input type=checkbox>Schedule for later`), _tmpl$19$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Run at</label><input type=datetime-local class="kit-form-input kit-schedule-time">`), _tmpl$20$2 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Day</label><select class="kit-form-input kit-schedule-time">`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class=kit-schedule-row><label>Time</label><input type=time class="kit-form-input kit-schedule-time">`), _tmpl$22$1 = /* @__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$1 = /* @__PURE__ */ template(`<section class=automation-panel>`), _tmpl$24$1 = /* @__PURE__ */ template(`<div class=kit-card-meta>~<!> min`), _tmpl$25$1 = /* @__PURE__ */ template(`<button class=kit-remove-btn type=button>×`), _tmpl$26$1 = /* @__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$1 = /* @__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$1 = /* @__PURE__ */ template(`<div class=kit-sched-next>Next: `), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=sched-context-menu><button class=sched-ctx-item type=button>Edit task</button><button class=sched-ctx-item type=button>Edit schedule</button><div class=sched-ctx-divider></div><button class=sched-ctx-item type=button></button><button class="sched-ctx-item sched-ctx-danger"type=button>Delete`), _tmpl$30$1 = /* @__PURE__ */ template(`<div class=kit-sched-card><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-sched-body><div class=kit-sched-name></div><div class=kit-sched-meta></div></div><div class=kit-sched-actions><button class=kit-sched-toggle type=button></button><button class=kit-remove-btn type=button title="Delete schedule"aria-label="Delete schedule">×`), _tmpl$31$1 = /* @__PURE__ */ template(`<div class=kit-activity-output>`), _tmpl$32$1 = /* @__PURE__ */ template(`<div class=kit-activity-card><div class=kit-activity-header><div class=kit-activity-title><span class="kit-card-icon kit-sched-icon"aria-hidden=true></span><div class=kit-activity-title-copy><div class=kit-sched-name></div><div class=kit-activity-time></div></div></div><span class=kit-activity-badge>`), _tmpl$33$1 = /* @__PURE__ */ template(`<div class="kit-activity-output kit-activity-placeholder">`), _tmpl$34$1 = /* @__PURE__ */ template(`<span class=kit-form-required aria-hidden=true>*`), _tmpl$35$1 = /* @__PURE__ */ template(`<textarea class=kit-form-textarea rows=3>`), _tmpl$36$1 = /* @__PURE__ */ template(`<p class=kit-form-hint>`), _tmpl$37$1 = /* @__PURE__ */ template(`<div class=kit-form-field><label class=kit-form-label>`), _tmpl$38$1 = /* @__PURE__ */ template(`<input class=kit-form-input>`), _tmpl$39$1 = /* @__PURE__ */ template(`<span class=kit-run-spinner aria-hidden=true>`), _tmpl$40$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=sched-type>`), _tmpl$41$1 = /* @__PURE__ */ template(`<option>`), _tmpl$42$1 = /* @__PURE__ */ template(`<label class=kit-schedule-type-option><input type=radio name=edit-sched-type>`);
6543
6543
  const ICON_MAP = {
6544
6544
  BookOpen: book_open_default,
6545
6545
  Tag: tag_default,
@@ -7337,7 +7337,7 @@ const AutomationTab = (props) => {
7337
7337
  return editType() === "weekly";
7338
7338
  },
7339
7339
  get children() {
7340
- var _el$63 = _tmpl$20$1(), _el$64 = _el$63.firstChild, _el$65 = _el$64.nextSibling;
7340
+ var _el$63 = _tmpl$20$2(), _el$64 = _el$63.firstChild, _el$65 = _el$64.nextSibling;
7341
7341
  _el$65.addEventListener("change", (e) => setEditDayOfWeek(Number(e.currentTarget.value)));
7342
7342
  insert(_el$65, createComponent(For, {
7343
7343
  each: DAY_NAMES,
@@ -7509,7 +7509,7 @@ const PageDiffTimeline = () => {
7509
7509
  })();
7510
7510
  };
7511
7511
  const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
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
+ 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$1 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$21 = /* @__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>×`);
7513
7513
  const UNSORTED_FOLDER = {
7514
7514
  id: "unsorted",
7515
7515
  name: "Unsorted",
@@ -8921,7 +8921,7 @@ ${contextBlock}` : contextBlock);
8921
8921
  return memo(() => messages2().length === 0)() && !isStreaming2();
8922
8922
  },
8923
8923
  get children() {
8924
- return _tmpl$20();
8924
+ return _tmpl$20$1();
8925
8925
  }
8926
8926
  })];
8927
8927
  }
@@ -9683,7 +9683,7 @@ const SettingsGeneral = (props) => {
9683
9683
  })();
9684
9684
  };
9685
9685
  delegateEvents(["click", "input"]);
9686
- var _tmpl$$7 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$2$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$3$6 = /* @__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$4$6 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$5$4 = /* @__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$6$4 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$7$4 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$8$3 = /* @__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$9$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$0$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$1$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$10$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:&lt;port&gt;/mcp</code>. Changing this value restarts the MCP server immediately.</p></div><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$11$1 = /* @__PURE__ */ template(`<option>`), _tmpl$12$1 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$13$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$14$1 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$16 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$17 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$18 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$19 = /* @__PURE__ */ template(`<div>`);
9686
+ var _tmpl$$7 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$2$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$3$6 = /* @__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$4$6 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$5$4 = /* @__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$6$4 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$7$4 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$8$3 = /* @__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$9$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$0$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$1$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$10$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$11$1 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-callout><div class=settings-callout-title>External Agent Control</div><p class=settings-callout-copy>Vessel is configured to run under an external harness such as Hermes Agent or OpenClaw. Provider and model selection are not configured inside Vessel.</p></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Enable Chat Assistant</span></label><p class=settings-hint>Adds a Chat tab to the sidebar for conversing with an AI provider of your choice.</p></div><div class=settings-field><label class=settings-label for=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:&lt;port&gt;/mcp</code>. Changing this value restarts the MCP server immediately.</p></div><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$12$1 = /* @__PURE__ */ template(`<option>`), _tmpl$13$1 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$14$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$15$1 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$16 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$17 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$18 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$19 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$20 = /* @__PURE__ */ template(`<div>`);
9687
9687
  const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
9688
9688
  id: p.id,
9689
9689
  name: p.name,
@@ -9694,10 +9694,26 @@ const CHAT_PROVIDERS$1 = Object.values(PROVIDERS).map((p) => ({
9694
9694
  defaultModel: p.defaultModel,
9695
9695
  models: p.models
9696
9696
  }));
9697
+ const REASONING_EFFORT_OPTIONS = [{
9698
+ value: "off",
9699
+ label: "Off"
9700
+ }, {
9701
+ value: "low",
9702
+ label: "Low"
9703
+ }, {
9704
+ value: "medium",
9705
+ label: "Medium"
9706
+ }, {
9707
+ value: "high",
9708
+ label: "High"
9709
+ }, {
9710
+ value: "max",
9711
+ label: "Max"
9712
+ }];
9697
9713
  const SettingsAgent = (props) => {
9698
9714
  const chatMeta = () => CHAT_PROVIDERS$1.find((p) => p.id === props.chat.providerId()) ?? CHAT_PROVIDERS$1[0];
9699
9715
  return (() => {
9700
- var _el$ = _tmpl$10$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$24 = _el$3.nextSibling, _el$25 = _el$24.firstChild, _el$26 = _el$25.nextSibling, _el$27 = _el$24.nextSibling, _el$28 = _el$27.firstChild, _el$30 = _el$28.nextSibling, _el$31 = _el$27.nextSibling, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$31.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling;
9716
+ var _el$ = _tmpl$11$1(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$27 = _el$3.nextSibling, _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling, _el$30 = _el$27.nextSibling, _el$31 = _el$30.firstChild, _el$33 = _el$31.nextSibling, _el$34 = _el$30.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.nextSibling;
9701
9717
  _el$5.$$click = () => props.chat.setEnabled(!props.chat.enabled());
9702
9718
  insert(_el$, createComponent(Show, {
9703
9719
  get when() {
@@ -9718,10 +9734,10 @@ const SettingsAgent = (props) => {
9718
9734
  insert(_el$8, createComponent(For, {
9719
9735
  each: CHAT_PROVIDERS$1,
9720
9736
  children: (p) => (() => {
9721
- var _el$37 = _tmpl$11$1();
9722
- insert(_el$37, () => p.name);
9723
- createRenderEffect(() => _el$37.value = p.id);
9724
- return _el$37;
9737
+ var _el$40 = _tmpl$12$1();
9738
+ insert(_el$40, () => p.name);
9739
+ createRenderEffect(() => _el$40.value = p.id);
9740
+ return _el$40;
9725
9741
  })()
9726
9742
  }));
9727
9743
  createRenderEffect(() => _el$8.value = props.chat.providerId());
@@ -9777,12 +9793,12 @@ const SettingsAgent = (props) => {
9777
9793
  },
9778
9794
  get fallback() {
9779
9795
  return (() => {
9780
- var _el$38 = _tmpl$12$1();
9781
- _el$38.$$input = (e) => props.chat.setModel(e.currentTarget.value);
9782
- setAttribute(_el$38, "spellcheck", false);
9783
- createRenderEffect(() => setAttribute(_el$38, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
9784
- createRenderEffect(() => _el$38.value = props.chat.model());
9785
- return _el$38;
9796
+ var _el$41 = _tmpl$13$1();
9797
+ _el$41.$$input = (e) => props.chat.setModel(e.currentTarget.value);
9798
+ setAttribute(_el$41, "spellcheck", false);
9799
+ createRenderEffect(() => setAttribute(_el$41, "placeholder", props.chat.modelFetchState() === "loading" ? "Fetching models…" : chatMeta().requiresKey && !props.chat.apiKey().trim() && !props.chat.hasStoredApiKey() ? "Enter API key to load models" : chatMeta().defaultModel || "model name"));
9800
+ createRenderEffect(() => _el$41.value = props.chat.model());
9801
+ return _el$41;
9786
9802
  })();
9787
9803
  },
9788
9804
  get children() {
@@ -9793,10 +9809,10 @@ const SettingsAgent = (props) => {
9793
9809
  return props.chat.providerModels();
9794
9810
  },
9795
9811
  children: (m) => (() => {
9796
- var _el$39 = _tmpl$11$1();
9797
- _el$39.value = m;
9798
- insert(_el$39, m);
9799
- return _el$39;
9812
+ var _el$42 = _tmpl$12$1();
9813
+ _el$42.value = m;
9814
+ insert(_el$42, m);
9815
+ return _el$42;
9800
9816
  })()
9801
9817
  }));
9802
9818
  createRenderEffect(() => _el$17.value = props.chat.model());
@@ -9817,9 +9833,9 @@ const SettingsAgent = (props) => {
9817
9833
  return props.chat.modelFetchWarning();
9818
9834
  },
9819
9835
  children: (warning) => (() => {
9820
- var _el$40 = _tmpl$13$1();
9821
- insert(_el$40, warning);
9822
- return _el$40;
9836
+ var _el$43 = _tmpl$14$1();
9837
+ insert(_el$43, warning);
9838
+ return _el$43;
9823
9839
  })()
9824
9840
  }), null);
9825
9841
  createRenderEffect(() => _el$18.disabled = props.chat.modelFetchState() === "loading");
@@ -9843,91 +9859,105 @@ const SettingsAgent = (props) => {
9843
9859
  get children() {
9844
9860
  return _tmpl$0$1();
9845
9861
  }
9846
- })];
9862
+ }), (() => {
9863
+ var _el$24 = _tmpl$1$1(), _el$25 = _el$24.firstChild, _el$26 = _el$25.nextSibling;
9864
+ _el$26.addEventListener("change", (e) => props.chat.setReasoningEffort(e.currentTarget.value));
9865
+ insert(_el$26, createComponent(For, {
9866
+ each: REASONING_EFFORT_OPTIONS,
9867
+ children: (option) => (() => {
9868
+ var _el$44 = _tmpl$12$1();
9869
+ insert(_el$44, () => option.label);
9870
+ createRenderEffect(() => _el$44.value = option.value);
9871
+ return _el$44;
9872
+ })()
9873
+ }));
9874
+ createRenderEffect(() => _el$26.value = props.chat.reasoningEffort());
9875
+ return _el$24;
9876
+ })()];
9847
9877
  }
9848
- }), _el$24);
9849
- _el$26.$$input = (e) => props.setMcpPort(e.currentTarget.value);
9850
- setAttribute(_el$26, "spellcheck", false);
9851
- insert(_el$27, createComponent(Show, {
9878
+ }), _el$27);
9879
+ _el$29.$$input = (e) => props.setMcpPort(e.currentTarget.value);
9880
+ setAttribute(_el$29, "spellcheck", false);
9881
+ insert(_el$30, createComponent(Show, {
9852
9882
  get when() {
9853
9883
  return props.premiumActive();
9854
9884
  },
9855
9885
  get fallback() {
9856
- return _tmpl$14$1();
9886
+ return _tmpl$15$1();
9857
9887
  },
9858
9888
  get children() {
9859
- var _el$29 = _tmpl$1$1();
9860
- _el$29.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
9861
- createRenderEffect(() => _el$29.value = props.maxToolIterations());
9862
- return _el$29;
9889
+ var _el$32 = _tmpl$10$1();
9890
+ _el$32.$$input = (e) => props.setMaxToolIterations(e.currentTarget.value);
9891
+ createRenderEffect(() => _el$32.value = props.maxToolIterations());
9892
+ return _el$32;
9863
9893
  }
9864
- }), _el$30);
9865
- insert(_el$30, createComponent(Show, {
9894
+ }), _el$33);
9895
+ insert(_el$33, createComponent(Show, {
9866
9896
  get when() {
9867
9897
  return props.premiumActive();
9868
9898
  },
9869
9899
  fallback: "Free tier: 50 tool calls per conversation turn. Upgrade to Vessel Premium to customize this limit (up to 1,000).",
9870
9900
  children: "Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000."
9871
9901
  }));
9872
- _el$33.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
9902
+ _el$36.addEventListener("change", (e) => props.setAgentTranscriptMode(e.currentTarget.value));
9873
9903
  insert(_el$, createComponent(Show, {
9874
9904
  get when() {
9875
9905
  return props.health();
9876
9906
  },
9877
9907
  children: (currentHealth) => (() => {
9878
- var _el$42 = _tmpl$16(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling, _el$45 = _el$44.firstChild, _el$46 = _el$45.nextSibling;
9879
- _el$46.nextSibling;
9880
- insert(_el$46, () => currentHealth().mcp.status);
9881
- insert(_el$44, () => currentHealth().mcp.message, null);
9882
- insert(_el$42, createComponent(Show, {
9908
+ var _el$46 = _tmpl$17(), _el$47 = _el$46.firstChild, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling;
9909
+ _el$50.nextSibling;
9910
+ insert(_el$50, () => currentHealth().mcp.status);
9911
+ insert(_el$48, () => currentHealth().mcp.message, null);
9912
+ insert(_el$46, createComponent(Show, {
9883
9913
  get when() {
9884
9914
  return currentHealth().mcp.endpoint;
9885
9915
  },
9886
9916
  children: (endpoint) => (() => {
9887
- var _el$49 = _tmpl$17(), _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling;
9888
- insert(_el$51, endpoint);
9889
- return _el$49;
9917
+ var _el$53 = _tmpl$18(), _el$54 = _el$53.firstChild, _el$55 = _el$54.nextSibling;
9918
+ insert(_el$55, endpoint);
9919
+ return _el$53;
9890
9920
  })()
9891
9921
  }), null);
9892
- insert(_el$42, createComponent(Show, {
9922
+ insert(_el$46, createComponent(Show, {
9893
9923
  get when() {
9894
9924
  return currentHealth().startupIssues.length > 0;
9895
9925
  },
9896
9926
  get children() {
9897
- var _el$48 = _tmpl$15$1();
9898
- insert(_el$48, () => currentHealth().startupIssues.map((issue) => (() => {
9899
- var _el$52 = _tmpl$18(), _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling;
9900
- insert(_el$53, () => issue.title);
9901
- insert(_el$54, () => issue.detail);
9902
- insert(_el$52, createComponent(Show, {
9927
+ var _el$52 = _tmpl$16();
9928
+ insert(_el$52, () => currentHealth().startupIssues.map((issue) => (() => {
9929
+ var _el$56 = _tmpl$19(), _el$57 = _el$56.firstChild, _el$58 = _el$57.nextSibling;
9930
+ insert(_el$57, () => issue.title);
9931
+ insert(_el$58, () => issue.detail);
9932
+ insert(_el$56, createComponent(Show, {
9903
9933
  get when() {
9904
9934
  return issue.action;
9905
9935
  },
9906
9936
  children: (action) => (() => {
9907
- var _el$55 = _tmpl$19();
9908
- insert(_el$55, action);
9909
- return _el$55;
9937
+ var _el$59 = _tmpl$20();
9938
+ insert(_el$59, action);
9939
+ return _el$59;
9910
9940
  })()
9911
9941
  }), null);
9912
9942
  createRenderEffect((_p$) => {
9913
9943
  var _v$3 = !!(issue.severity === "warning"), _v$4 = !!(issue.severity === "error");
9914
- _v$3 !== _p$.e && _el$52.classList.toggle("warning", _p$.e = _v$3);
9915
- _v$4 !== _p$.t && _el$52.classList.toggle("error", _p$.t = _v$4);
9944
+ _v$3 !== _p$.e && _el$56.classList.toggle("warning", _p$.e = _v$3);
9945
+ _v$4 !== _p$.t && _el$56.classList.toggle("error", _p$.t = _v$4);
9916
9946
  return _p$;
9917
9947
  }, {
9918
9948
  e: void 0,
9919
9949
  t: void 0
9920
9950
  });
9921
- return _el$52;
9951
+ return _el$56;
9922
9952
  })()));
9923
- return _el$48;
9953
+ return _el$52;
9924
9954
  }
9925
9955
  }), null);
9926
- return _el$42;
9956
+ return _el$46;
9927
9957
  })()
9928
- }), _el$34);
9929
- _el$36.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
9930
- setAttribute(_el$36, "spellcheck", false);
9958
+ }), _el$37);
9959
+ _el$39.$$input = (e) => props.setObsidianVaultPath(e.currentTarget.value);
9960
+ setAttribute(_el$39, "spellcheck", false);
9931
9961
  createRenderEffect((_p$) => {
9932
9962
  var _v$ = !!props.chat.enabled(), _v$2 = props.chat.enabled();
9933
9963
  _v$ !== _p$.e && _el$5.classList.toggle("on", _p$.e = _v$);
@@ -9937,9 +9967,9 @@ const SettingsAgent = (props) => {
9937
9967
  e: void 0,
9938
9968
  t: void 0
9939
9969
  });
9940
- createRenderEffect(() => _el$26.value = props.mcpPort());
9941
- createRenderEffect(() => _el$33.value = props.agentTranscriptMode());
9942
- createRenderEffect(() => _el$36.value = props.obsidianVaultPath());
9970
+ createRenderEffect(() => _el$29.value = props.mcpPort());
9971
+ createRenderEffect(() => _el$36.value = props.agentTranscriptMode());
9972
+ createRenderEffect(() => _el$39.value = props.obsidianVaultPath());
9943
9973
  return _el$;
9944
9974
  })();
9945
9975
  };
@@ -11632,6 +11662,7 @@ const Settings = () => {
11632
11662
  const [chatHasStoredApiKey, setChatHasStoredApiKey] = createSignal(false);
11633
11663
  const [chatModel, setChatModel] = createSignal("");
11634
11664
  const [chatBaseUrl, setChatBaseUrl] = createSignal("");
11665
+ const [chatReasoningEffort, setChatReasoningEffort] = createSignal("off");
11635
11666
  const chatProviderMeta = () => CHAT_PROVIDERS.find((p) => p.id === chatProviderId()) ?? CHAT_PROVIDERS[0];
11636
11667
  const [providerModels, setProviderModels] = createSignal([]);
11637
11668
  const [modelFetchState, setModelFetchState] = createSignal("idle");
@@ -11717,9 +11748,11 @@ const Settings = () => {
11717
11748
  setChatHasStoredApiKey(cp.hasApiKey === true);
11718
11749
  setChatModel(cp.model);
11719
11750
  setChatBaseUrl(cp.baseUrl ?? "");
11751
+ setChatReasoningEffort(cp.reasoningEffort ?? "off");
11720
11752
  } else {
11721
11753
  setChatApiKey("");
11722
11754
  setChatHasStoredApiKey(false);
11755
+ setChatReasoningEffort("off");
11723
11756
  }
11724
11757
  setTelemetryEnabled(settings.telemetryEnabled !== false);
11725
11758
  const dp = settings.domainPolicy ?? {
@@ -11821,7 +11854,8 @@ const Settings = () => {
11821
11854
  apiKey: chatApiKey().trim(),
11822
11855
  hasApiKey: chatHasStoredApiKey() && !chatApiKey().trim(),
11823
11856
  model: chatModel().trim() || chatProviderMeta().defaultModel,
11824
- baseUrl: chatBaseUrl().trim() || void 0
11857
+ baseUrl: chatBaseUrl().trim() || void 0,
11858
+ reasoningEffort: chatReasoningEffort()
11825
11859
  } : null;
11826
11860
  await window.vessel.settings.set("chatProvider", chatConfig);
11827
11861
  await loadState();
@@ -11931,6 +11965,8 @@ const Settings = () => {
11931
11965
  setModel: setChatModel,
11932
11966
  baseUrl: chatBaseUrl,
11933
11967
  setBaseUrl: setChatBaseUrl,
11968
+ reasoningEffort: chatReasoningEffort,
11969
+ setReasoningEffort: setChatReasoningEffort,
11934
11970
  providerModels,
11935
11971
  modelFetchState,
11936
11972
  modelFetchWarning,
@@ -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-DM2iGE8-.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-DRzS5XLW.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.83",
4
+ "version": "0.1.86",
5
5
  "description": "AI-native web browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {