@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 +8 -0
- package/out/main/index.js +281 -120
- package/out/renderer/assets/{index-DM2iGE8-.js → index-DRzS5XLW.js} +104 -68
- package/out/renderer/index.html +1 -1
- package/package.json +1 -1
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:
|
|
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
|
|
1585
|
+
var textMatches = contentRoot ? collectTextRangeMatches(contentRoot, searchText, 20) : [];
|
|
1472
1586
|
// Fallback: if no matches in content area, search the whole body
|
|
1473
|
-
if (
|
|
1474
|
-
|
|
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 =
|
|
1479
|
-
var
|
|
1480
|
-
|
|
1481
|
-
|
|
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
|
-
}
|
|
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
|
|
1590
|
-
|
|
1591
|
-
|
|
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 =
|
|
1595
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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(
|
|
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 =
|
|
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(
|
|
12252
|
-
|
|
12404
|
+
sections.push(
|
|
12405
|
+
`## Active User Selection
|
|
12406
|
+
The user currently has this text selected on screen:
|
|
12407
|
+
- "${preview}"`
|
|
12408
|
+
);
|
|
12253
12409
|
}
|
|
12254
|
-
|
|
12255
|
-
(highlight) =>
|
|
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
|
|
12261
|
-
|
|
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(
|
|
12264
|
-
|
|
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>×`), _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$
|
|
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>×`), _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$
|
|
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 & 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$
|
|
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 & 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$
|
|
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$
|
|
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:<port>/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$
|
|
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$
|
|
9722
|
-
insert(_el$
|
|
9723
|
-
createRenderEffect(() => _el$
|
|
9724
|
-
return _el$
|
|
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$
|
|
9781
|
-
_el$
|
|
9782
|
-
setAttribute(_el$
|
|
9783
|
-
createRenderEffect(() => setAttribute(_el$
|
|
9784
|
-
createRenderEffect(() => _el$
|
|
9785
|
-
return _el$
|
|
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$
|
|
9797
|
-
_el$
|
|
9798
|
-
insert(_el$
|
|
9799
|
-
return _el$
|
|
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$
|
|
9821
|
-
insert(_el$
|
|
9822
|
-
return _el$
|
|
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$
|
|
9849
|
-
_el$
|
|
9850
|
-
setAttribute(_el$
|
|
9851
|
-
insert(_el$
|
|
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$
|
|
9886
|
+
return _tmpl$15$1();
|
|
9857
9887
|
},
|
|
9858
9888
|
get children() {
|
|
9859
|
-
var _el$
|
|
9860
|
-
_el$
|
|
9861
|
-
createRenderEffect(() => _el$
|
|
9862
|
-
return _el$
|
|
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$
|
|
9865
|
-
insert(_el$
|
|
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$
|
|
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$
|
|
9879
|
-
_el$
|
|
9880
|
-
insert(_el$
|
|
9881
|
-
insert(_el$
|
|
9882
|
-
insert(_el$
|
|
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$
|
|
9888
|
-
insert(_el$
|
|
9889
|
-
return _el$
|
|
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$
|
|
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$
|
|
9898
|
-
insert(_el$
|
|
9899
|
-
var _el$
|
|
9900
|
-
insert(_el$
|
|
9901
|
-
insert(_el$
|
|
9902
|
-
insert(_el$
|
|
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$
|
|
9908
|
-
insert(_el$
|
|
9909
|
-
return _el$
|
|
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$
|
|
9915
|
-
_v$4 !== _p$.t && _el$
|
|
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$
|
|
9951
|
+
return _el$56;
|
|
9922
9952
|
})()));
|
|
9923
|
-
return _el$
|
|
9953
|
+
return _el$52;
|
|
9924
9954
|
}
|
|
9925
9955
|
}), null);
|
|
9926
|
-
return _el$
|
|
9956
|
+
return _el$46;
|
|
9927
9957
|
})()
|
|
9928
|
-
}), _el$
|
|
9929
|
-
_el$
|
|
9930
|
-
setAttribute(_el$
|
|
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$
|
|
9941
|
-
createRenderEffect(() => _el$
|
|
9942
|
-
createRenderEffect(() => _el$
|
|
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,
|
package/out/renderer/index.html
CHANGED
|
@@ -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-
|
|
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.
|
|
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": {
|