@quanta-intellect/vessel-browser 0.1.140 → 0.1.143
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.
|
@@ -2195,6 +2195,24 @@ let pageDiffActivityThrottleTimer = null;
|
|
|
2195
2195
|
let lastPageDiffSignature = "";
|
|
2196
2196
|
const PAGE_DIFF_ACTIVITY_THROTTLE_MS = 350;
|
|
2197
2197
|
const PAGE_DIFF_MUTATION_DEBOUNCE_MS = 1200;
|
|
2198
|
+
const CUSTOM_TEXT_FIELD_SELECTOR = '[contenteditable]:not([contenteditable="false"]), [role="textbox"], [role="searchbox"], [role="combobox"]';
|
|
2199
|
+
const ACTION_CONTROL_SELECTOR = [
|
|
2200
|
+
"button",
|
|
2201
|
+
'[role="button"]',
|
|
2202
|
+
'[role="tab"]',
|
|
2203
|
+
'[role="menuitem"]',
|
|
2204
|
+
'[role="option"]',
|
|
2205
|
+
'[role="radio"]',
|
|
2206
|
+
'[role="checkbox"]',
|
|
2207
|
+
'[role="switch"]',
|
|
2208
|
+
'input[type="submit"]',
|
|
2209
|
+
'input[type="button"]',
|
|
2210
|
+
'a[href^="#"][aria-selected]',
|
|
2211
|
+
'a[href^="#"][data-date]',
|
|
2212
|
+
'a[href^="#"][data-day]',
|
|
2213
|
+
'a[href^="#"][role="tab"]',
|
|
2214
|
+
'a[href^="#"][role="button"]'
|
|
2215
|
+
].join(", ");
|
|
2198
2216
|
function normalizeSignatureText(value) {
|
|
2199
2217
|
return (value || "").replace(/\s+/g, " ").trim();
|
|
2200
2218
|
}
|
|
@@ -2938,6 +2956,37 @@ function getInputLabelWithSource(el) {
|
|
|
2938
2956
|
if (placeholder) return { label: placeholder, source: "placeholder" };
|
|
2939
2957
|
return {};
|
|
2940
2958
|
}
|
|
2959
|
+
function getCustomTextFieldLabelWithSource(el) {
|
|
2960
|
+
const ariaLabel = getTrimmedText(el.getAttribute("aria-label"));
|
|
2961
|
+
if (ariaLabel) return { label: ariaLabel, source: "aria-label" };
|
|
2962
|
+
const labelledBy = getNodeTextByIds(el.getAttribute("aria-labelledby"));
|
|
2963
|
+
if (labelledBy) return { label: labelledBy, source: "label" };
|
|
2964
|
+
const placeholder = getTrimmedText(el.getAttribute("placeholder"));
|
|
2965
|
+
if (placeholder) return { label: placeholder, source: "placeholder" };
|
|
2966
|
+
const text = getTrimmedText(el.textContent);
|
|
2967
|
+
if (text) return { label: text, source: "text" };
|
|
2968
|
+
return {};
|
|
2969
|
+
}
|
|
2970
|
+
function isNativeFormField(el) {
|
|
2971
|
+
return el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement;
|
|
2972
|
+
}
|
|
2973
|
+
function shouldExposeCustomTextField(el) {
|
|
2974
|
+
if (!(el instanceof HTMLElement) || isNativeFormField(el)) return false;
|
|
2975
|
+
if (!isElementVisible(el) || isElementDisabled(el)) return false;
|
|
2976
|
+
const role = getElementRole(el);
|
|
2977
|
+
return el.isContentEditable || el.hasAttribute("contenteditable") && el.getAttribute("contenteditable") !== "false" || role === "textbox" || role === "searchbox" || role === "combobox";
|
|
2978
|
+
}
|
|
2979
|
+
function getCustomTextFieldInputType(el) {
|
|
2980
|
+
const role = getElementRole(el);
|
|
2981
|
+
if (role === "searchbox") return "search";
|
|
2982
|
+
if (role === "combobox") return "combobox";
|
|
2983
|
+
if (role === "textbox") return "text";
|
|
2984
|
+
return el instanceof HTMLElement && el.isContentEditable ? "text" : void 0;
|
|
2985
|
+
}
|
|
2986
|
+
function getCustomTextFieldHasValue(el) {
|
|
2987
|
+
const value = getTrimmedText(el.textContent) || getTrimmedText(el.getAttribute("aria-valuetext")) || getTrimmedText(el.getAttribute("value"));
|
|
2988
|
+
return value ? true : void 0;
|
|
2989
|
+
}
|
|
2941
2990
|
function getButtonTextWithSource(el) {
|
|
2942
2991
|
const textContent = getTrimmedText(el.textContent);
|
|
2943
2992
|
if (textContent) return { text: textContent, source: "text" };
|
|
@@ -2986,6 +3035,18 @@ function getElementValue(el) {
|
|
|
2986
3035
|
}
|
|
2987
3036
|
return void 0;
|
|
2988
3037
|
}
|
|
3038
|
+
function getElementHasValue(el) {
|
|
3039
|
+
if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
|
|
3040
|
+
if (el.type === "password" || el.type === "checkbox" || el.type === "radio") {
|
|
3041
|
+
return void 0;
|
|
3042
|
+
}
|
|
3043
|
+
return getTrimmedText(el.value) ? true : void 0;
|
|
3044
|
+
}
|
|
3045
|
+
if (el instanceof HTMLSelectElement) {
|
|
3046
|
+
return getTrimmedText(el.value) ? true : void 0;
|
|
3047
|
+
}
|
|
3048
|
+
return void 0;
|
|
3049
|
+
}
|
|
2989
3050
|
function getSelectOptions(el) {
|
|
2990
3051
|
const options = Array.from(el.options).map((option) => ({
|
|
2991
3052
|
label: option.textContent?.trim() || option.value.trim(),
|
|
@@ -2999,6 +3060,13 @@ function getAriaBoolean(el, attr) {
|
|
|
2999
3060
|
if (val === "false") return false;
|
|
3000
3061
|
return void 0;
|
|
3001
3062
|
}
|
|
3063
|
+
function getDeepActiveElement() {
|
|
3064
|
+
let active = document.activeElement;
|
|
3065
|
+
while (active instanceof HTMLElement && active.shadowRoot?.activeElement) {
|
|
3066
|
+
active = active.shadowRoot.activeElement;
|
|
3067
|
+
}
|
|
3068
|
+
return active;
|
|
3069
|
+
}
|
|
3002
3070
|
function buildBaseMetadata(el) {
|
|
3003
3071
|
return {
|
|
3004
3072
|
context: getElementContext(el),
|
|
@@ -3009,11 +3077,35 @@ function buildBaseMetadata(el) {
|
|
|
3009
3077
|
description: getElementDescription(el),
|
|
3010
3078
|
...getVisibilityState(el),
|
|
3011
3079
|
disabled: isElementDisabled(el),
|
|
3080
|
+
focused: getDeepActiveElement() === el || void 0,
|
|
3012
3081
|
ariaExpanded: getAriaBoolean(el, "aria-expanded"),
|
|
3013
3082
|
ariaPressed: getAriaBoolean(el, "aria-pressed"),
|
|
3014
3083
|
ariaSelected: getAriaBoolean(el, "aria-selected")
|
|
3015
3084
|
};
|
|
3016
3085
|
}
|
|
3086
|
+
function isNavigableEmbeddedSrc(src) {
|
|
3087
|
+
const normalized = src.trim().toLowerCase();
|
|
3088
|
+
return Boolean(normalized) && !/^(about:blank|javascript:|data:)/.test(normalized);
|
|
3089
|
+
}
|
|
3090
|
+
function getEmbeddedFrameLabel(iframe) {
|
|
3091
|
+
const explicitLabel = getTrimmedText(iframe.getAttribute("title")) || getTrimmedText(iframe.getAttribute("aria-label")) || getTrimmedText(iframe.name) || getTrimmedText(iframe.id);
|
|
3092
|
+
if (explicitLabel) {
|
|
3093
|
+
return explicitLabel.slice(0, MAX_LABEL_LENGTH);
|
|
3094
|
+
}
|
|
3095
|
+
let host = "embedded page";
|
|
3096
|
+
try {
|
|
3097
|
+
host = new URL(iframe.src, window.location.href).hostname.replace(
|
|
3098
|
+
/^www\./,
|
|
3099
|
+
""
|
|
3100
|
+
);
|
|
3101
|
+
} catch {
|
|
3102
|
+
}
|
|
3103
|
+
const srcText = iframe.src.toLowerCase();
|
|
3104
|
+
const prefix = /\b(ticket|showtime|movie|cinema|theat(?:er|re))\b/.test(
|
|
3105
|
+
srcText
|
|
3106
|
+
) ? "Embedded ticketing page" : "Embedded page";
|
|
3107
|
+
return `${prefix}: ${host}`.slice(0, MAX_LABEL_LENGTH);
|
|
3108
|
+
}
|
|
3017
3109
|
function extractHeadings() {
|
|
3018
3110
|
return deepQuerySelectorAll("h1, h2, h3, h4, h5, h6").map((el) => {
|
|
3019
3111
|
const text = el.textContent?.trim() || "";
|
|
@@ -3074,9 +3166,7 @@ function getFieldMetadata(el) {
|
|
|
3074
3166
|
}
|
|
3075
3167
|
function extractInteractiveElements() {
|
|
3076
3168
|
const elements = [];
|
|
3077
|
-
deepQuerySelectorAll(
|
|
3078
|
-
'button, [role="button"], input[type="submit"], input[type="button"]'
|
|
3079
|
-
).forEach((btn) => {
|
|
3169
|
+
deepQuerySelectorAll(ACTION_CONTROL_SELECTOR).forEach((btn) => {
|
|
3080
3170
|
const { text, source } = getButtonTextWithSource(btn);
|
|
3081
3171
|
const role = getElementRole(btn);
|
|
3082
3172
|
elements.push({
|
|
@@ -3102,6 +3192,17 @@ function extractInteractiveElements() {
|
|
|
3102
3192
|
context
|
|
3103
3193
|
});
|
|
3104
3194
|
});
|
|
3195
|
+
deepQuerySelectorAll("iframe[src]").forEach((frame) => {
|
|
3196
|
+
const iframe = frame;
|
|
3197
|
+
if (!isNavigableEmbeddedSrc(iframe.src)) return;
|
|
3198
|
+
elements.push({
|
|
3199
|
+
type: "link",
|
|
3200
|
+
text: getEmbeddedFrameLabel(iframe),
|
|
3201
|
+
href: iframe.src.slice(0, MAX_HREF_LENGTH),
|
|
3202
|
+
...buildBaseMetadata(iframe),
|
|
3203
|
+
context: getElementContext(iframe)
|
|
3204
|
+
});
|
|
3205
|
+
});
|
|
3105
3206
|
deepQuerySelectorAll(
|
|
3106
3207
|
'input:not([type="hidden"]):not([type="submit"]):not([type="button"]), select, textarea'
|
|
3107
3208
|
).forEach((input) => {
|
|
@@ -3120,6 +3221,7 @@ function extractInteractiveElements() {
|
|
|
3120
3221
|
placeholder: element.getAttribute("placeholder") || void 0,
|
|
3121
3222
|
required: element.hasAttribute("required") || void 0,
|
|
3122
3223
|
value: getElementValue(element),
|
|
3224
|
+
hasValue: getElementHasValue(element),
|
|
3123
3225
|
options: element instanceof HTMLSelectElement ? getSelectOptions(element) : void 0,
|
|
3124
3226
|
...buildBaseMetadata(input),
|
|
3125
3227
|
role,
|
|
@@ -3128,6 +3230,20 @@ function extractInteractiveElements() {
|
|
|
3128
3230
|
...getFieldMetadata(element)
|
|
3129
3231
|
});
|
|
3130
3232
|
});
|
|
3233
|
+
deepQuerySelectorAll(CUSTOM_TEXT_FIELD_SELECTOR).forEach((field) => {
|
|
3234
|
+
if (!shouldExposeCustomTextField(field)) return;
|
|
3235
|
+
const label = getCustomTextFieldLabelWithSource(field);
|
|
3236
|
+
const role = getElementRole(field);
|
|
3237
|
+
elements.push({
|
|
3238
|
+
type: "input",
|
|
3239
|
+
label: label.label?.slice(0, MAX_LABEL_LENGTH),
|
|
3240
|
+
labelSource: label.source,
|
|
3241
|
+
inputType: getCustomTextFieldInputType(field),
|
|
3242
|
+
hasValue: getCustomTextFieldHasValue(field),
|
|
3243
|
+
...buildBaseMetadata(field),
|
|
3244
|
+
role
|
|
3245
|
+
});
|
|
3246
|
+
});
|
|
3131
3247
|
return elements;
|
|
3132
3248
|
}
|
|
3133
3249
|
function extractForms() {
|
|
@@ -3143,23 +3259,28 @@ function extractForms() {
|
|
|
3143
3259
|
const form = formEl;
|
|
3144
3260
|
const fields = [];
|
|
3145
3261
|
form.querySelectorAll(
|
|
3146
|
-
|
|
3262
|
+
`input:not([type='hidden']):not([type='submit']):not([type='button']):not([type='image']), select, textarea, ${CUSTOM_TEXT_FIELD_SELECTOR}`
|
|
3147
3263
|
).forEach((input) => {
|
|
3264
|
+
if (!isNativeFormField(input) && !shouldExposeCustomTextField(input)) {
|
|
3265
|
+
return;
|
|
3266
|
+
}
|
|
3148
3267
|
const element = input;
|
|
3149
3268
|
const tag = input.tagName.toLowerCase();
|
|
3150
3269
|
const label = getInputLabelWithSource(element);
|
|
3270
|
+
const customLabel = isNativeFormField(input) ? {} : getCustomTextFieldLabelWithSource(input);
|
|
3151
3271
|
const role = getElementRole(input);
|
|
3152
3272
|
const radioText = role === "radio" || element instanceof HTMLInputElement && element.type === "radio" ? getTrimmedText(
|
|
3153
3273
|
element.getAttribute("value") || element.getAttribute("aria-label") || label.label
|
|
3154
3274
|
) : void 0;
|
|
3155
3275
|
fields.push({
|
|
3156
3276
|
type: tag === "select" ? "select" : tag === "textarea" ? "textarea" : "input",
|
|
3157
|
-
label: label.label?.slice(0, MAX_LABEL_LENGTH),
|
|
3158
|
-
labelSource: label.source,
|
|
3159
|
-
inputType: element.getAttribute("type") || void 0,
|
|
3277
|
+
label: (label.label || customLabel.label)?.slice(0, MAX_LABEL_LENGTH),
|
|
3278
|
+
labelSource: label.source || customLabel.source,
|
|
3279
|
+
inputType: element.getAttribute("type") || getCustomTextFieldInputType(input) || void 0,
|
|
3160
3280
|
placeholder: element.getAttribute("placeholder") || void 0,
|
|
3161
3281
|
required: element.hasAttribute("required") || void 0,
|
|
3162
3282
|
value: getElementValue(element),
|
|
3283
|
+
hasValue: isNativeFormField(input) ? getElementHasValue(element) : getCustomTextFieldHasValue(input),
|
|
3163
3284
|
options: element instanceof HTMLSelectElement ? getSelectOptions(element) : void 0,
|
|
3164
3285
|
...buildBaseMetadata(input),
|
|
3165
3286
|
role,
|
|
@@ -3763,6 +3763,55 @@
|
|
|
3763
3763
|
background: var(--surface-active);
|
|
3764
3764
|
}
|
|
3765
3765
|
|
|
3766
|
+
.tool-chip-group {
|
|
3767
|
+
margin: 3px 0;
|
|
3768
|
+
}
|
|
3769
|
+
|
|
3770
|
+
.tool-chip-group .tool-chip {
|
|
3771
|
+
margin: 0;
|
|
3772
|
+
}
|
|
3773
|
+
|
|
3774
|
+
.tool-chip-summary {
|
|
3775
|
+
width: 100%;
|
|
3776
|
+
cursor: pointer;
|
|
3777
|
+
text-align: left;
|
|
3778
|
+
}
|
|
3779
|
+
|
|
3780
|
+
.tool-chip-group:not(.expanded) .tool-chip-group-items {
|
|
3781
|
+
display: none;
|
|
3782
|
+
}
|
|
3783
|
+
|
|
3784
|
+
.tool-chip-summary::after {
|
|
3785
|
+
content: "▸";
|
|
3786
|
+
margin-left: auto;
|
|
3787
|
+
color: var(--text-muted);
|
|
3788
|
+
font-size: 10px;
|
|
3789
|
+
transition: transform var(--duration-fast) var(--ease-in-out);
|
|
3790
|
+
}
|
|
3791
|
+
|
|
3792
|
+
.tool-chip-group.expanded .tool-chip-summary::after {
|
|
3793
|
+
transform: rotate(90deg);
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
.tool-chip-count {
|
|
3797
|
+
padding: 1px 6px;
|
|
3798
|
+
border-radius: 999px;
|
|
3799
|
+
background: color-mix(in srgb, var(--accent-primary) 10%, transparent);
|
|
3800
|
+
color: var(--text-muted);
|
|
3801
|
+
font-size: 10px;
|
|
3802
|
+
font-weight: 600;
|
|
3803
|
+
line-height: 1.4;
|
|
3804
|
+
}
|
|
3805
|
+
|
|
3806
|
+
.tool-chip-group-items {
|
|
3807
|
+
display: flex;
|
|
3808
|
+
flex-direction: column;
|
|
3809
|
+
gap: 3px;
|
|
3810
|
+
margin: 4px 0 4px 14px;
|
|
3811
|
+
padding-left: 8px;
|
|
3812
|
+
border-left: 1px solid var(--border-subtle);
|
|
3813
|
+
}
|
|
3814
|
+
|
|
3766
3815
|
.tool-chip-failed {
|
|
3767
3816
|
border-left-color: color-mix(in srgb, var(--error) 60%, transparent);
|
|
3768
3817
|
background: color-mix(in srgb, var(--error) 8%, var(--surface-hover));
|
|
@@ -6515,11 +6515,11 @@ function createDOMPurify() {
|
|
|
6515
6515
|
const originalDocument = document2;
|
|
6516
6516
|
const currentScript = originalDocument.currentScript;
|
|
6517
6517
|
window2.DocumentFragment;
|
|
6518
|
-
const HTMLTemplateElement = window2.HTMLTemplateElement, Node = window2.Node,
|
|
6518
|
+
const HTMLTemplateElement = window2.HTMLTemplateElement, Node = window2.Node, Element2 = window2.Element, NodeFilter = window2.NodeFilter, _window$NamedNodeMap = window2.NamedNodeMap;
|
|
6519
6519
|
_window$NamedNodeMap === void 0 ? window2.NamedNodeMap || window2.MozNamedAttrMap : _window$NamedNodeMap;
|
|
6520
6520
|
window2.HTMLFormElement;
|
|
6521
6521
|
const DOMParser = window2.DOMParser, trustedTypes = window2.trustedTypes;
|
|
6522
|
-
const ElementPrototype =
|
|
6522
|
+
const ElementPrototype = Element2.prototype;
|
|
6523
6523
|
const cloneNode = lookupGetter(ElementPrototype, "cloneNode");
|
|
6524
6524
|
const remove = lookupGetter(ElementPrototype, "remove");
|
|
6525
6525
|
const getNextSibling = lookupGetter(ElementPrototype, "nextSibling");
|
|
@@ -7602,13 +7602,59 @@ const TOOL_ICONS = {
|
|
|
7602
7602
|
create_checkpoint: "⚑",
|
|
7603
7603
|
restore_checkpoint: "⟲"
|
|
7604
7604
|
};
|
|
7605
|
+
function formatToolName(name) {
|
|
7606
|
+
return name.replace(/_/g, " ");
|
|
7607
|
+
}
|
|
7605
7608
|
function renderToolChip(name, args) {
|
|
7606
7609
|
const icon = TOOL_ICONS[name] || "⚙";
|
|
7607
|
-
const displayName = name
|
|
7610
|
+
const displayName = formatToolName(name);
|
|
7608
7611
|
const failed = args.trim().startsWith("⚠");
|
|
7609
7612
|
const argsHtml = args ? `<span class="tool-chip-args">${escapeHtml(args.length > MAX_PREVIEW_TEXT ? args.slice(0, TRUNCATE_KEEP) + "..." : args)}</span>` : "";
|
|
7610
7613
|
return `<div class="tool-chip${failed ? " tool-chip-failed" : ""}"><span class="tool-chip-icon">${icon}</span><span class="tool-chip-name">${escapeHtml(displayName)}</span>${argsHtml}</div>`;
|
|
7611
7614
|
}
|
|
7615
|
+
function renderToolChipGroup(chips) {
|
|
7616
|
+
if (chips.length === 1) return chips[0].html;
|
|
7617
|
+
const first = chips[0];
|
|
7618
|
+
const icon = TOOL_ICONS[first.name] || "⚙";
|
|
7619
|
+
const failed = chips.some((chip) => chip.failed);
|
|
7620
|
+
const latestArgs = [...chips].reverse().find((chip) => chip.args)?.args ?? "";
|
|
7621
|
+
const argsHtml = latestArgs ? `<span class="tool-chip-args">${escapeHtml(latestArgs.length > MAX_PREVIEW_TEXT ? latestArgs.slice(0, TRUNCATE_KEEP) + "..." : latestArgs)}</span>` : "";
|
|
7622
|
+
return [
|
|
7623
|
+
`<div class="tool-chip-group${failed ? " tool-chip-group-failed" : ""}">`,
|
|
7624
|
+
`<div class="tool-chip tool-chip-summary${failed ? " tool-chip-failed" : ""}">`,
|
|
7625
|
+
`<span class="tool-chip-icon">${icon}</span>`,
|
|
7626
|
+
`<span class="tool-chip-name">${escapeHtml(formatToolName(first.name))}</span>`,
|
|
7627
|
+
`<span class="tool-chip-count">${chips.length} calls</span>`,
|
|
7628
|
+
argsHtml,
|
|
7629
|
+
`</div>`,
|
|
7630
|
+
`<div class="tool-chip-group-items">`,
|
|
7631
|
+
chips.map((chip) => chip.html).join(""),
|
|
7632
|
+
`</div>`,
|
|
7633
|
+
`</div>`
|
|
7634
|
+
].join("");
|
|
7635
|
+
}
|
|
7636
|
+
function collapseAdjacentToolTokens(html2, toolChips) {
|
|
7637
|
+
return html2.replace(/(?:\x00TC\d+\x00){2,}/g, (sequence) => {
|
|
7638
|
+
const indices = Array.from(
|
|
7639
|
+
sequence.matchAll(/\x00TC(\d+)\x00/g),
|
|
7640
|
+
(match) => Number(match[1])
|
|
7641
|
+
);
|
|
7642
|
+
const groups = [];
|
|
7643
|
+
for (const index of indices) {
|
|
7644
|
+
const chip = toolChips[index];
|
|
7645
|
+
if (!chip) continue;
|
|
7646
|
+
const current = groups[groups.length - 1];
|
|
7647
|
+
if (current && current[0]?.name === chip.name) {
|
|
7648
|
+
current.push(chip);
|
|
7649
|
+
} else {
|
|
7650
|
+
groups.push([chip]);
|
|
7651
|
+
}
|
|
7652
|
+
}
|
|
7653
|
+
return groups.map(
|
|
7654
|
+
(group) => group.length > 1 ? renderToolChipGroup(group) : `\0TC${toolChips.indexOf(group[0])}\0`
|
|
7655
|
+
).join("");
|
|
7656
|
+
});
|
|
7657
|
+
}
|
|
7612
7658
|
function renderMarkdown(source) {
|
|
7613
7659
|
const codeBlocks = [];
|
|
7614
7660
|
const toolChips = [];
|
|
@@ -7616,7 +7662,15 @@ function renderMarkdown(source) {
|
|
|
7616
7662
|
/<<tool:([^:>\n]+)(?::([^>\n]*))?>>/g,
|
|
7617
7663
|
(_, name, args) => {
|
|
7618
7664
|
const token = `\0TC${toolChips.length}\0`;
|
|
7619
|
-
|
|
7665
|
+
const normalizedName = name.trim();
|
|
7666
|
+
const normalizedArgs = (args || "").trim();
|
|
7667
|
+
toolChips.push({
|
|
7668
|
+
index: toolChips.length,
|
|
7669
|
+
name: normalizedName,
|
|
7670
|
+
args: normalizedArgs,
|
|
7671
|
+
html: renderToolChip(normalizedName, normalizedArgs),
|
|
7672
|
+
failed: normalizedArgs.startsWith("⚠")
|
|
7673
|
+
});
|
|
7620
7674
|
return `
|
|
7621
7675
|
|
|
7622
7676
|
${token}
|
|
@@ -7645,13 +7699,13 @@ ${token}
|
|
|
7645
7699
|
(_, _content) => ""
|
|
7646
7700
|
);
|
|
7647
7701
|
const cleaned = erased.replace(/\x00ERASE\x00/g, "");
|
|
7648
|
-
let output = cleaned;
|
|
7702
|
+
let output = collapseAdjacentToolTokens(cleaned, toolChips);
|
|
7649
7703
|
output = codeBlocks.reduce(
|
|
7650
7704
|
(out, snippet, index) => out.replace(`\0CB${index}\0`, snippet),
|
|
7651
7705
|
output
|
|
7652
7706
|
);
|
|
7653
7707
|
output = toolChips.reduce(
|
|
7654
|
-
(out, snippet, index) => out.replace(`\0TC${index}\0`, snippet),
|
|
7708
|
+
(out, snippet, index) => out.replace(`\0TC${index}\0`, snippet.html),
|
|
7655
7709
|
output
|
|
7656
7710
|
);
|
|
7657
7711
|
if (typeof purify?.sanitize !== "function") {
|
|
@@ -7687,7 +7741,14 @@ ${token}
|
|
|
7687
7741
|
"tr",
|
|
7688
7742
|
"ul"
|
|
7689
7743
|
],
|
|
7690
|
-
ALLOWED_ATTR: [
|
|
7744
|
+
ALLOWED_ATTR: [
|
|
7745
|
+
"href",
|
|
7746
|
+
"target",
|
|
7747
|
+
"rel",
|
|
7748
|
+
"data-language",
|
|
7749
|
+
"style",
|
|
7750
|
+
"class"
|
|
7751
|
+
]
|
|
7691
7752
|
});
|
|
7692
7753
|
}
|
|
7693
7754
|
function isPremiumStatus(status) {
|
|
@@ -9817,7 +9878,7 @@ const SidebarWindowControls = (props) => {
|
|
|
9817
9878
|
};
|
|
9818
9879
|
delegateEvents(["click"]);
|
|
9819
9880
|
const vesselLogo = "" + new URL("vessel-logo-transparent-IT25qr-Z.png", import.meta.url).href;
|
|
9820
|
-
var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<div class=sidebar-resize-handle>`), _tmpl$4$8 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$5$8 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$7$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$8$5 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$9$4 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$10$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$11$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$12$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$13$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$14$2 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title>Load more history</span><span class=history-entry-url>Showing <!> of `), _tmpl$15$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$17$1 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$19$1 = /* @__PURE__ */ template(`<span>`), _tmpl$20$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Generating`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$22$1 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$23$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$24$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill=var(--accent-primary) stroke=var(--accent-primary) stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$27$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=chat-command-error><span></span><button class=chat-command-error-dismiss type=button aria-label="Dismiss command error">×`), _tmpl$31 = /* @__PURE__ */ template(`<div class=chat-skill-suggestions role=listbox>`), _tmpl$32 = /* @__PURE__ */ template(`<div class=sidebar-input-area><div class=sidebar-input-frame><textarea class=sidebar-input rows=2></textarea></div><button class=sidebar-send>`), _tmpl$33 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Skills</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button><button class=sidebar-tab role=tab>Research<span class=sidebar-tab-beta>Beta</span></button></div><div class=sidebar-messages><div>`), _tmpl$34 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$35 = /* @__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$36 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$37 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$38 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$39 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$40 = /* @__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$41 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$43 = /* @__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$44 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$45 = /* @__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$46 = /* @__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$47 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$48 = /* @__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$49 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$50 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$51 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$53 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$54 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$55 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$56 = /* @__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$57 = /* @__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$58 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$59 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div>`), _tmpl$64 = /* @__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$65 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$66 = /* @__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$67 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`), _tmpl$68 = /* @__PURE__ */ template(`<button class=chat-skill-suggestion type=button role=option><span class=chat-skill-suggestion-command>/</span><span class=chat-skill-suggestion-body><span class=chat-skill-suggestion-name></span><span class=chat-skill-suggestion-desc>`), _tmpl$69 = /* @__PURE__ */ template(`<div class=sidebar-input-highlight aria-hidden=true><span class=sidebar-input-highlight-command>`);
|
|
9881
|
+
var _tmpl$$a = /* @__PURE__ */ template(`<div class="message-content markdown-content">`), _tmpl$2$a = /* @__PURE__ */ template(`<div class=premium-inline-offer><div class=premium-inline-kicker>Vessel Premium</div><div class=premium-inline-title></div><p class=premium-inline-copy></p><div class=premium-inline-actions><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>View details`), _tmpl$3$9 = /* @__PURE__ */ template(`<div class=sidebar-resize-handle>`), _tmpl$4$8 = /* @__PURE__ */ template(`<span class=sidebar-tab-badge>`), _tmpl$5$8 = /* @__PURE__ */ template(`<button class=agent-primary-button type=button>Undo last action`), _tmpl$6$8 = /* @__PURE__ */ template(`<div class=agent-section-title>Pending approvals`), _tmpl$7$6 = /* @__PURE__ */ template(`<button class=agent-section-toggle type=button>`), _tmpl$8$5 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div><div class=agent-panel-title>Supervisor</div><div class=agent-panel-subtitle></div></div><span class=agent-status-pill></span></div><div class=agent-panel-controls><button class=agent-control-button type=button></button><button class=agent-control-button type=button>Restore session</button></div><div class=agent-muted></div><div class=agent-section-header><div class=agent-section-title>Recent actions`), _tmpl$9$4 = /* @__PURE__ */ template(`<span class=bookmark-status-pill>Saved`), _tmpl$0$3 = /* @__PURE__ */ template(`<div class=bookmark-export-message>`), _tmpl$1$3 = /* @__PURE__ */ template(`<div class=bookmark-save-body><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Import HTML</button><button class=bookmark-secondary-button type=button>Import JSON`), _tmpl$10$3 = /* @__PURE__ */ template(`<div class=bookmark-save-card><div class=bookmark-current-title></div><div class=bookmark-current-url></div><div class=bookmark-save-controls><button class=bookmark-primary-button type=button>Save page</button></div><textarea class=bookmark-note-input placeholder="Optional note about why this matters"rows=2></textarea><textarea class=bookmark-note-input placeholder="Intent: what is this page for?"rows=1></textarea><textarea class=bookmark-note-input placeholder="Expected content: what should be here?"rows=1></textarea><input class=bookmark-input placeholder="Key fields (comma-separated)"><textarea class=bookmark-note-input placeholder="Agent hints (one key:value per line)"rows=2>`), _tmpl$11$3 = /* @__PURE__ */ template(`<section class=bookmark-panel><div class=bookmark-panel-header><div><div class=bookmark-panel-title>Bookmarks</div><div class=bookmark-panel-subtitle></div></div></div><input class="bookmark-input bookmark-search-input"placeholder="Search titles, URLs, notes, and folders"><div class=bookmark-export-card><div><div class=bookmark-panel-title>Export</div><div class=bookmark-panel-subtitle>Save browser-ready HTML or a full Vessel archive</div></div><div class=bookmark-export-actions><button class=bookmark-secondary-button type=button>Browser HTML</button><button class=bookmark-secondary-button type=button>HTML + notes</button><button class=bookmark-secondary-button type=button>Vessel JSON</button></div></div><div class=bookmark-import-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Import Bookmarks</span><span class=bookmark-save-toggle-subtitle>Import from HTML or Vessel JSON</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><div class=bookmark-save-shell><button class=bookmark-save-toggle type=button><span class=bookmark-save-toggle-copy><span class=bookmark-save-toggle-title>Save Current Page</span><span class=bookmark-save-toggle-subtitle>Manual bookmark save options</span></span><span class=bookmark-save-toggle-caret aria-hidden=true>▾</span></button></div><form class=bookmark-folder-create><div class=bookmark-folder-form-fields><input class=bookmark-input placeholder="Create a folder"><input class=bookmark-input placeholder="Optional one-line summary"></div><button class=bookmark-secondary-button type=submit>New folder</button></form><div class=bookmark-folder-list>`), _tmpl$12$3 = /* @__PURE__ */ template(`<div class=checkpoint-timeline>`), _tmpl$13$2 = /* @__PURE__ */ template(`<section class="agent-panel checkpoint-panel"><div class=agent-panel-header><div><div class=agent-panel-title>Checkpoints</div><div class=agent-panel-subtitle></div></div></div><div class=agent-panel-body><div class=agent-checkpoint-row><input class=agent-input placeholder="Checkpoint name"><textarea class=agent-textarea rows=2 placeholder="Optional note for this checkpoint"></textarea><button class=agent-primary-button type=button>Save checkpoint</button></div><div class=agent-section-title>Recent checkpoints`), _tmpl$14$2 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title>Load more history</span><span class=history-entry-url>Showing <!> of `), _tmpl$15$2 = /* @__PURE__ */ template(`<p class=history-empty>No browsing history yet.`), _tmpl$16$1 = /* @__PURE__ */ template(`<div class=history-panel><div class=history-panel-header><span class=history-panel-title>Browsing History</span><div class=history-panel-actions><button class=history-clear-btn>Clear</button><button class=history-clear-btn>Export HTML</button><button class=history-clear-btn>Export JSON</button><button class=history-clear-btn>Import</button></div></div><div class=history-list>`), _tmpl$17$1 = /* @__PURE__ */ template(`<section class=agent-panel><div class=agent-panel-header><div class=agent-panel-title>What Changed</div><div class=agent-panel-subtitle>`), _tmpl$18$1 = /* @__PURE__ */ template(`<div class="kit-upsell premium-chat-banner"><p class=kit-upsell-title>Vessel Premium</p><p class="kit-upsell-body premium-chat-banner-body">Give the built-in agent a bigger toolbox and longer runway: screenshots, saved sessions, workflow tracking, table extraction, and up to 1,000 tool calls per turn.</p><div class="premium-inline-actions premium-chat-banner-actions"><button class="agent-primary-button premium-inline-primary"type=button>Start 7-day free trial — $5.99/mo after</button><button class="agent-control-button premium-inline-secondary"type=button>See Premium`), _tmpl$19$1 = /* @__PURE__ */ template(`<span>`), _tmpl$20$1 = /* @__PURE__ */ template(`<div><div class=streaming-status><span class=streaming-pulse aria-hidden=true></span><span>Thinking`), _tmpl$21$1 = /* @__PURE__ */ template(`<div class="message message-assistant"><div class=message-content>`), _tmpl$22$1 = /* @__PURE__ */ template(`<div class=sidebar-empty><svg class=sidebar-empty-icon width=48 height=48 viewBox="0 0 48 48"aria-hidden=true><line x1=8 y1=8 x2=24 y2=5 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=24 y1=5 x2=40 y2=10 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=8 y1=8 x2=6 y2=24 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=40 y1=10 x2=44 y2=26 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=6 y1=24 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=44 y1=26 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=10 y1=38 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=38 y1=40 x2=24 y2=44 stroke=var(--border-visible) stroke-width=1 opacity=0.35></line><line x1=8 y1=8 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=24 y1=5 x2=20 y2=18 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=40 y1=10 x2=32 y2=20 stroke=var(--border-visible) stroke-width=1 opacity=0.5></line><line x1=20 y1=18 x2=32 y2=20 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.3></line><line x1=6 y1=24 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=20 y1=18 x2=18 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=32 y1=20 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=44 y1=26 x2=36 y2=30 stroke=var(--border-visible) stroke-width=1 opacity=0.45></line><line x1=18 y1=30 x2=36 y2=30 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.25></line><line x1=18 y1=30 x2=10 y2=38 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=36 y1=30 x2=38 y2=40 stroke=var(--border-visible) stroke-width=1 opacity=0.4></line><line x1=18 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><line x1=36 y1=30 x2=24 y2=44 stroke=var(--accent-primary) stroke-width=0.75 opacity=0.2></line><circle cx=8 cy=8 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=24 cy=5 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=40 cy=10 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.7></circle><circle cx=6 cy=24 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=44 cy=26 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.55></circle><circle cx=10 cy=38 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=38 cy=40 r=2 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.45></circle><circle cx=24 cy=44 r=2.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.5></circle><circle cx=20 cy=18 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.85></circle><circle cx=32 cy=20 r=4 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.9></circle><circle cx=18 cy=30 r=3 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.75></circle><circle cx=36 cy=30 r=3.5 fill=var(--bg-secondary) stroke=var(--accent-primary) stroke-width=1.5 opacity=0.8></circle></svg><p class=sidebar-empty-title>Your move.</p><p class=sidebar-empty-hint>Configure a provider in Settings (Ctrl+,) then ask anything about the current page or beyond.`), _tmpl$23$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Stop generating"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><rect x=2 y=2 width=10 height=10 rx=1.5 fill=currentColor></rect></svg>Stop`), _tmpl$24$1 = /* @__PURE__ */ template(`<button class=chat-action-btn title="Retry last prompt"><svg width=14 height=14 viewBox="0 0 14 14"fill=none aria-hidden=true><path d="M11.5 7a4.5 4.5 0 1 1-1.3-3.2"stroke=currentColor stroke-width=1.5 stroke-linecap=round></path><path d="M10.5 1v3h-3"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg>Retry`), _tmpl$25$1 = /* @__PURE__ */ template(`<div class=chat-actions>`), _tmpl$26$1 = /* @__PURE__ */ template(`<div class=highlight-nav><button class=highlight-nav-btn type=button title="Previous highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M8 10L4 6l4-4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round></path></svg></button><button class=highlight-nav-label type=button title="Go to current highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><circle cx=6 cy=6 r=3 fill=var(--accent-primary) stroke=var(--accent-primary) stroke-width=1></circle></svg></button><button class=highlight-nav-btn type=button title="Next highlight"><svg width=12 height=12 viewBox="0 0 12 12"fill=none aria-hidden=true><path d="M4 2l4 4-4 4"stroke=currentColor stroke-width=1.5 stroke-linecap=round stroke-linejoin=round>`), _tmpl$27$1 = /* @__PURE__ */ template(`<button class=chat-queue-clear type=button>Clear queue`), _tmpl$28$1 = /* @__PURE__ */ template(`<div class=chat-queue-list>`), _tmpl$29$1 = /* @__PURE__ */ template(`<div class=chat-queue-status><div class=chat-queue-status-row><span>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=chat-command-error><span></span><button class=chat-command-error-dismiss type=button aria-label="Dismiss command error">×`), _tmpl$31 = /* @__PURE__ */ template(`<div class=chat-skill-suggestions role=listbox>`), _tmpl$32 = /* @__PURE__ */ template(`<div class=sidebar-input-area><div class=sidebar-input-frame><textarea class=sidebar-input rows=2></textarea></div><button class=sidebar-send>`), _tmpl$33 = /* @__PURE__ */ template(`<div class=sidebar><div class=sidebar-header><div class=sidebar-brand><img class=sidebar-logo alt=Vessel><span class=sidebar-brand-text>Vessel Browser</span></div><div class=sidebar-header-actions><button class=sidebar-clear title="Clear chat">Clear</button></div></div><div class=sidebar-tabs role=tablist><button class=sidebar-tab role=tab>Supervisor</button><button class=sidebar-tab role=tab>Bookmarks</button><button class=sidebar-tab role=tab>Checkpoints</button><button class=sidebar-tab role=tab>Chat</button><button class=sidebar-tab role=tab>Skills</button><button class=sidebar-tab role=tab>History</button><button class=sidebar-tab role=tab>Changes</button><button class=sidebar-tab role=tab>Research<span class=sidebar-tab-beta>Beta</span></button></div><div class=sidebar-messages><div>`), _tmpl$34 = /* @__PURE__ */ template(`<div class=agent-muted>No pending approvals.`), _tmpl$35 = /* @__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$36 = /* @__PURE__ */ template(`<div class=agent-muted>No actions yet.`), _tmpl$37 = /* @__PURE__ */ template(`<div class=agent-muted>Recent actions are collapsed to reduce noise.`), _tmpl$38 = /* @__PURE__ */ template(`<div class="agent-card-copy success">`), _tmpl$39 = /* @__PURE__ */ template(`<div class="agent-card-copy error">`), _tmpl$40 = /* @__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$41 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>`), _tmpl$42 = /* @__PURE__ */ template(`<div class=bookmark-folder-summary>`), _tmpl$43 = /* @__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$44 = /* @__PURE__ */ template(`<button class=bookmark-ghost-button type=button>Keep bookmarks`), _tmpl$45 = /* @__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$46 = /* @__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$47 = /* @__PURE__ */ template(`<div class=bookmark-items>`), _tmpl$48 = /* @__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$49 = /* @__PURE__ */ template(`<div class=bookmark-folder-collapsed-hint>Click to view saved links.`), _tmpl$50 = /* @__PURE__ */ template(`<div class=bookmark-empty-folder>No bookmarks in this folder yet.`), _tmpl$51 = /* @__PURE__ */ template(`<div class=bookmark-item-note>`), _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Intent:</strong> `), _tmpl$53 = /* @__PURE__ */ template(`<div><strong>Expected:</strong> `), _tmpl$54 = /* @__PURE__ */ template(`<div><strong>Key fields:</strong> `), _tmpl$55 = /* @__PURE__ */ template(`<div><strong>Hints:</strong> `), _tmpl$56 = /* @__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$57 = /* @__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$58 = /* @__PURE__ */ template(`<div class=agent-muted>No checkpoints yet.`), _tmpl$59 = /* @__PURE__ */ template(`<span class=checkpoint-timeline-line>`), _tmpl$60 = /* @__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$61 = /* @__PURE__ */ template(`<button class=history-entry><span class=history-entry-title></span><span class=history-entry-url></span><span class=history-entry-time>`), _tmpl$62 = /* @__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$63 = /* @__PURE__ */ template(`<div>`), _tmpl$64 = /* @__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$65 = /* @__PURE__ */ template(`<div class=chat-approval-detail>`), _tmpl$66 = /* @__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$67 = /* @__PURE__ */ template(`<div class=chat-queue-item><span class=chat-queue-text></span><button class=chat-queue-remove type=button>×`), _tmpl$68 = /* @__PURE__ */ template(`<button class=chat-skill-suggestion type=button role=option><span class=chat-skill-suggestion-command>/</span><span class=chat-skill-suggestion-body><span class=chat-skill-suggestion-name></span><span class=chat-skill-suggestion-desc>`), _tmpl$69 = /* @__PURE__ */ template(`<div class=sidebar-input-highlight aria-hidden=true><span class=sidebar-input-highlight-command>`);
|
|
9821
9882
|
const UNSORTED_FOLDER = {
|
|
9822
9883
|
id: "unsorted",
|
|
9823
9884
|
name: "Unsorted",
|
|
@@ -9825,8 +9886,19 @@ const UNSORTED_FOLDER = {
|
|
|
9825
9886
|
};
|
|
9826
9887
|
const MarkdownMessage = (props) => {
|
|
9827
9888
|
const html2 = createMemo(() => renderMarkdown(props.content));
|
|
9889
|
+
const handleClick = (event) => {
|
|
9890
|
+
const target = event.target;
|
|
9891
|
+
if (!(target instanceof Element)) return;
|
|
9892
|
+
const summary = target.closest(".tool-chip-summary");
|
|
9893
|
+
if (!(summary instanceof HTMLElement)) return;
|
|
9894
|
+
const group = summary.closest(".tool-chip-group");
|
|
9895
|
+
if (!(group instanceof HTMLElement)) return;
|
|
9896
|
+
const expanded = !group.classList.contains("expanded");
|
|
9897
|
+
group.classList.toggle("expanded", expanded);
|
|
9898
|
+
};
|
|
9828
9899
|
return (() => {
|
|
9829
9900
|
var _el$ = _tmpl$$a();
|
|
9901
|
+
_el$.$$click = handleClick;
|
|
9830
9902
|
createRenderEffect(() => _el$.innerHTML = html2());
|
|
9831
9903
|
return _el$;
|
|
9832
9904
|
})();
|
package/out/renderer/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
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'; base-uri 'none'; object-src 'none'; frame-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; form-action 'self';" />
|
|
7
7
|
<title>Vessel</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-BW4Oa1R1.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-B4pY2BdC.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
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.143",
|
|
5
5
|
"description": "AI-native web browser runtime for autonomous agents with human supervision",
|
|
6
6
|
"main": "./out/main/index.js",
|
|
7
7
|
"bin": {
|