@quanta-intellect/vessel-browser 0.1.68 → 0.1.69
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.
|
@@ -4945,7 +4945,7 @@ function renderToolChip(name, args) {
|
|
|
4945
4945
|
function renderMarkdown(source) {
|
|
4946
4946
|
const codeBlocks = [];
|
|
4947
4947
|
const toolChips = [];
|
|
4948
|
-
const normalized = source.replace(/\r\n?/g, "\n").replace(
|
|
4948
|
+
const normalized = source.replace(/\r\n?/g, "\n").replace(/<<erase_prev>>/g, "\0ERASE\0").replace(
|
|
4949
4949
|
/<<tool:([^:>\n]+)(?::([^>\n]*))?>>/g,
|
|
4950
4950
|
(_, name, args) => {
|
|
4951
4951
|
const token = `\0TC${toolChips.length}\0`;
|
|
@@ -4969,10 +4969,16 @@ ${token}
|
|
|
4969
4969
|
);
|
|
4970
4970
|
const rendered = normalized.split(/\n{2,}/).map((block) => {
|
|
4971
4971
|
const trimmed = block.trim();
|
|
4972
|
+
if (trimmed === "\0ERASE\0") return "\0ERASE\0";
|
|
4972
4973
|
if (/^\x00TC\d+\x00$/.test(trimmed)) return trimmed;
|
|
4973
4974
|
return renderBlock(block);
|
|
4974
4975
|
}).filter(Boolean).join("");
|
|
4975
|
-
|
|
4976
|
+
const erased = rendered.replace(
|
|
4977
|
+
/(?:^|(?<=\x00TC\d+\x00))([\s\S]*?)\x00ERASE\x00/g,
|
|
4978
|
+
(_, _content) => ""
|
|
4979
|
+
);
|
|
4980
|
+
const cleaned = erased.replace(/\x00ERASE\x00/g, "");
|
|
4981
|
+
let output = cleaned;
|
|
4976
4982
|
output = codeBlocks.reduce(
|
|
4977
4983
|
(out, snippet, index) => out.replace(`\0CB${index}\0`, snippet),
|
|
4978
4984
|
output
|
|
@@ -8355,6 +8361,14 @@ const DevToolsPanel = () => {
|
|
|
8355
8361
|
})();
|
|
8356
8362
|
};
|
|
8357
8363
|
delegateEvents(["click", "input"]);
|
|
8364
|
+
const SEARCH_ENGINE_PRESETS = {
|
|
8365
|
+
duckduckgo: { label: "DuckDuckGo", url: "https://duckduckgo.com/?q=" },
|
|
8366
|
+
google: { label: "Google", url: "https://www.google.com/search?q=" },
|
|
8367
|
+
bing: { label: "Bing", url: "https://www.bing.com/search?q=" },
|
|
8368
|
+
brave: { label: "Brave Search", url: "https://search.brave.com/search?q=" },
|
|
8369
|
+
ecosia: { label: "Ecosia", url: "https://www.ecosia.org/search?q=" },
|
|
8370
|
+
kagi: { label: "Kagi", url: "https://kagi.com/search?q=" }
|
|
8371
|
+
};
|
|
8358
8372
|
const PROVIDERS = {
|
|
8359
8373
|
anthropic: {
|
|
8360
8374
|
id: "anthropic",
|
|
@@ -8455,7 +8469,7 @@ const PROVIDERS = {
|
|
|
8455
8469
|
apiKeyHint: "Optional — only if your endpoint requires authentication"
|
|
8456
8470
|
}
|
|
8457
8471
|
};
|
|
8458
|
-
var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$2 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>×</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — scroll to Chat Assistant below and add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown below</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$1 = /* @__PURE__ */ template(`<div class="settings-callout settings-premium-callout"><div class=settings-callout-title>Start Vessel Premium with a 7-day free trial</div><p class=settings-callout-copy>Unlock screenshots, saved sessions, workflow tracking, table extraction, the credential vault, and longer autonomous runs without leaving the app.</p><div class=settings-premium-callout-actions><button class="premium-btn premium-btn-upgrade">Start 7-day free trial — $5.99/mo after</button><button class="premium-btn premium-btn-activate">See activation steps`), _tmpl$4$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$5$1 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$6$1 = /* @__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$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$8 = /* @__PURE__ */ template(`<p class=settings-hint>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$9 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$0 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$12 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured \`llama-server\` base URL. For agent loops, run \`llama-server\` with \`--ctx-size 16384\` minimum and \`32768\` recommended.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$15 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$16 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Store credentials for agent-driven logins. Credentials are encrypted at rest and never sent to AI providers — they are filled directly into login forms with your consent.`), _tmpl$17 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$18 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Label (e.g. Work GitHub)"><input class=settings-input placeholder="Domain pattern (e.g. github.com, *.aws.amazon.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><input class=settings-input placeholder="TOTP secret (optional, base32)"><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Credential</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$19 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$20 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$21 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$24 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><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-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=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=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.</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-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current</button></div></div><div class=settings-section-divider></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-section-divider></div><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Anonymous Usage Analytics</span></label><p class=settings-hint>Help improve Vessel by sending anonymous usage data (tool popularity, session duration, provider type). No URLs, page content, queries, or personal data is ever collected.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$25 = /* @__PURE__ */ template(`<style>
|
|
8472
|
+
var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><button class="premium-btn premium-btn-upgrade">Try Premium free for 7 days — $5.99/mo after</button><span class=welcome-banner-note>Best for screenshots, saved sessions, credential vault, and longer autonomous runs.`), _tmpl$2$2 = /* @__PURE__ */ template(`<div class=welcome-banner><div class=welcome-banner-header><span class=welcome-banner-title>Welcome to Vessel</span><button class=welcome-banner-dismiss>×</button></div><p class=welcome-banner-text>Get started in three steps:</p><ol class=welcome-banner-steps><li><strong>Configure a chat provider</strong> — scroll to Chat Assistant below and add an API key</li><li><strong>Connect your agent harness</strong> — point it at the MCP endpoint shown below</li><li><strong>Learn the shortcuts</strong> — press <kbd>?</kbd> anytime for a quick reference`), _tmpl$3$1 = /* @__PURE__ */ template(`<div class="settings-callout settings-premium-callout"><div class=settings-callout-title>Start Vessel Premium with a 7-day free trial</div><p class=settings-callout-copy>Unlock screenshots, saved sessions, workflow tracking, table extraction, the credential vault, and longer autonomous runs without leaving the app.</p><div class=settings-premium-callout-actions><button class="premium-btn premium-btn-upgrade">Start 7-day free trial — $5.99/mo after</button><button class="premium-btn premium-btn-activate">See activation steps`), _tmpl$4$1 = /* @__PURE__ */ template(`<input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200>`), _tmpl$5$1 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$6$1 = /* @__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$7 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$8 = /* @__PURE__ */ template(`<p class=settings-hint>An API key is already stored securely for this provider. Leave this blank to keep it, or enter a new key to replace it.`), _tmpl$9 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$0 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-api-key>API Key</label><input id=chat-api-key class=settings-input type=password>`), _tmpl$1 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$10 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$11 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-model>Model</label><div style=display:flex;gap:6px;align-items:center><button type=button class=settings-refresh-btn title="Refresh model list">↺`), _tmpl$12 = /* @__PURE__ */ template(`<div class=settings-field><label class=settings-label for=chat-base-url>Base URL</label><input id=chat-base-url class=settings-input>`), _tmpl$13 = /* @__PURE__ */ template(`<p class=settings-hint>Vessel auto-detects the active model from your configured \`llama-server\` base URL. For agent loops, run \`llama-server\` with \`--ctx-size 16384\` minimum and \`32768\` recommended.`), _tmpl$14 = /* @__PURE__ */ template(`<div class=premium-section><div class=premium-active-badge>Premium Active</div><p class=premium-detail></p><div class=premium-actions-row><button class="premium-btn premium-btn-manage">Manage Subscription</button><button class="premium-btn premium-btn-reset">Sign Out`), _tmpl$15 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$16 = /* @__PURE__ */ template(`<p class=settings-hint style=margin-bottom:10px>Store credentials for agent-driven logins. Credentials are encrypted at rest and never sent to AI providers — they are filled directly into login forms with your consent.`), _tmpl$17 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Credential`), _tmpl$18 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Label (e.g. Work GitHub)"><input class=settings-input placeholder="Domain pattern (e.g. github.com, *.aws.amazon.com)"><input class=settings-input placeholder="Username / email"><input class=settings-input type=password placeholder=Password><input class=settings-input placeholder="TOTP secret (optional, base32)"><input class=settings-input placeholder="Notes (optional)"><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Credential</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$19 = /* @__PURE__ */ template(`<button class=vault-add-btn>+ Add Profile`), _tmpl$20 = /* @__PURE__ */ template(`<div class=vault-add-form><input class=settings-input placeholder="Profile name (e.g. Personal, Work)"><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder="First name"><input class=settings-input placeholder="Last name"></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:8px"><input class=settings-input placeholder=Email><input class=settings-input placeholder=Phone></div><input class=settings-input placeholder="Organization (optional)"><input class=settings-input placeholder="Address line 1"><input class=settings-input placeholder="Address line 2 (optional)"><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"><input class=settings-input placeholder=City><input class=settings-input placeholder=State><input class=settings-input placeholder="ZIP / Postal"></div><input class=settings-input placeholder=Country><div class=vault-add-actions><button class="premium-btn premium-btn-activate">Save Profile</button><button class="premium-btn premium-btn-reset">Cancel`), _tmpl$21 = /* @__PURE__ */ template(`<textarea class="settings-input settings-textarea"rows=4>`), _tmpl$22 = /* @__PURE__ */ template(`<p class=settings-hint>`), _tmpl$23 = /* @__PURE__ */ template(`<p class=settings-hint>Restrict which domains can be navigated to. Use allowlist mode for kiosk or supervised browsing, blocklist to block specific sites.`), _tmpl$24 = /* @__PURE__ */ template(`<div class=command-bar-overlay><div class=settings-panel><h2 class=settings-title>Runtime Settings</h2><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-label for=default-homepage>Homepage</label><input id=default-homepage class=settings-input placeholder=https://start.duckduckgo.com><p class=settings-hint>The page that opens when you create a new tab or launch Vessel without restoring a previous session.</p></div><div class=settings-field><label class=settings-label for=default-search-engine>Default Search Engine</label><select id=default-search-engine class=settings-input><option value=none>None (disabled)</option></select><p class=settings-hint>The search engine used by the AI agent when it needs to search the web. "None" disables the fallback and forces the agent to use on-page search inputs only.</p></div><div class=settings-field><label class=settings-label for=download-path>Download Location</label><input id=download-path class=settings-input placeholder="Default: ~/Downloads"><p class=settings-hint>Directory for saved files. Leave blank to use the system default Downloads folder.</p></div><div class=settings-field><label class=settings-label for=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=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.</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-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Restore last browser session on launch</span></label></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Start bookmarks fresh on launch</span></label><p class=settings-hint>Off by default. When enabled, bookmark folders and saved pages are cleared each time Vessel starts.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Saved Sessions</label><p class=settings-hint style=margin-bottom:10px>Save the current browser state (tabs, cookies, storage) as a named session. Restore it later from this panel.</p><div class=premium-activate-row style=margin-bottom:8px><input class="settings-input premium-email-input"placeholder="Session name"><button class="premium-btn premium-btn-activate">Save Current</button></div></div><div class=settings-section-divider></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-section-divider></div><div class=settings-field><label class=settings-label>Vessel Premium</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Agent Credential Vault</label></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label>Form Autofill</label><p class=settings-hint style=margin-bottom:10px>Store your info once. Vessel matches it to form fields on any site using labels, field names, and autocomplete hints.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-toggle><button type=button class=toggle-switch role=switch><span class=toggle-switch-thumb></span></button><span>Anonymous Usage Analytics</span></label><p class=settings-hint>Help improve Vessel by sending anonymous usage data (tool popularity, session duration, provider type). No URLs, page content, queries, or personal data is ever collected.</p></div><div class=settings-section-divider></div><div class=settings-field><label class=settings-label for=theme-select>Theme</label><select id=theme-select class="settings-input settings-select"><option value=dark>Dark</option><option value=light>Light</option></select><p class=settings-hint>Choose the application color scheme. Takes effect after saving.</p></div><div class=settings-field><label class=settings-label for=domain-policy-mode>Domain Restrictions</label><select id=domain-policy-mode class="settings-input settings-select"><option value=none>No restrictions</option><option value=allowlist>Allowlist (only listed domains)</option><option value=blocklist>Blocklist (block listed domains)</option></select></div><div class=settings-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$25 = /* @__PURE__ */ template(`<style>
|
|
8459
8473
|
.settings-panel {
|
|
8460
8474
|
width: min(440px, calc(100vw - 32px));
|
|
8461
8475
|
max-height: calc(100vh - 48px);
|
|
@@ -8997,7 +9011,7 @@ var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><butt
|
|
|
8997
9011
|
justify-content: flex-end;
|
|
8998
9012
|
margin-top: 4px;
|
|
8999
9013
|
}
|
|
9000
|
-
`), _tmpl$26 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$
|
|
9014
|
+
`), _tmpl$26 = /* @__PURE__ */ template(`<option>`), _tmpl$27 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$28 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$29 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$30 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$31 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$32 = /* @__PURE__ */ template(`<div>`), _tmpl$33 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> · <!> cookies · <!> domains</span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Restore this session (replaces current tabs and cookies)"style="padding:2px 10px;font-size:12px">Load</button><button class=vault-entry-remove title="Delete session">×`), _tmpl$34 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$35 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$36 = /* @__PURE__ */ template(`<div class=premium-activate-row><input class="settings-input premium-email-input"inputmode=numeric maxlength=6 placeholder="Enter 6-digit code"><button class="premium-btn premium-btn-activate">`), _tmpl$37 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$38 = /* @__PURE__ */ template(`<div class=premium-section><p class=premium-description>Unlock screenshot/vision analysis, session management, Obsidian integration, workflow tracking, DevTools tools, table extraction, Agent Credential Vault, and unlimited tool iterations.</p><div class=premium-activate-row><input class="settings-input premium-email-input"type=email placeholder="Enter your subscription email"><button class="premium-btn premium-btn-activate"></button></div><button class="premium-btn premium-btn-upgrade">Subscribe to Premium — $5.99/mo after 7-day free trial`), _tmpl$39 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$40 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$41 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> · </span></div><button class=vault-entry-remove title="Remove credential">×`), _tmpl$42 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail></span></div><div style=display:flex;gap:6px;align-items:center><button class="premium-btn premium-btn-activate"title="Fill forms on current page with this profile"style="padding:2px 10px;font-size:12px">Fill</button><button class=vault-entry-remove title="Remove profile">×`);
|
|
9001
9015
|
const CHAT_PROVIDERS = Object.values(PROVIDERS).map((p) => ({
|
|
9002
9016
|
id: p.id,
|
|
9003
9017
|
name: p.name,
|
|
@@ -9026,6 +9040,7 @@ const Settings = () => {
|
|
|
9026
9040
|
const [agentTranscriptMode, setAgentTranscriptMode] = createSignal("summary");
|
|
9027
9041
|
const [health, setHealth] = createSignal(null);
|
|
9028
9042
|
const [defaultUrl, setDefaultUrl] = createSignal("https://start.duckduckgo.com");
|
|
9043
|
+
const [defaultSearchEngine, setDefaultSearchEngine] = createSignal("duckduckgo");
|
|
9029
9044
|
const [downloadPath, setDownloadPath] = createSignal("");
|
|
9030
9045
|
const [status, setStatus] = createSignal(null);
|
|
9031
9046
|
const [telemetryEnabled, setTelemetryEnabled] = createSignal(true);
|
|
@@ -9315,6 +9330,7 @@ const Settings = () => {
|
|
|
9315
9330
|
const runtimeHealth = await window.vessel.settings.getHealth();
|
|
9316
9331
|
setTheme(settings.theme ?? "dark");
|
|
9317
9332
|
setDefaultUrl(settings.defaultUrl ?? "https://start.duckduckgo.com");
|
|
9333
|
+
setDefaultSearchEngine(settings.defaultSearchEngine ?? "duckduckgo");
|
|
9318
9334
|
setDownloadPath(settings.downloadPath ?? "");
|
|
9319
9335
|
setAutoRestoreSession(settings.autoRestoreSession ?? true);
|
|
9320
9336
|
setClearBookmarksOnLaunch(settings.clearBookmarksOnLaunch ?? false);
|
|
@@ -9416,6 +9432,7 @@ const Settings = () => {
|
|
|
9416
9432
|
await window.vessel.settings.set("maxToolIterations", Math.max(10, Math.min(1e3, parsedIterations)));
|
|
9417
9433
|
await window.vessel.settings.set("agentTranscriptMode", agentTranscriptMode());
|
|
9418
9434
|
await window.vessel.settings.set("telemetryEnabled", telemetryEnabled());
|
|
9435
|
+
await window.vessel.settings.set("defaultSearchEngine", defaultSearchEngine());
|
|
9419
9436
|
const domains = domainList().split("\n").map((d) => d.trim()).filter((d) => d.length > 0);
|
|
9420
9437
|
const domainPolicy = domainMode() === "allowlist" ? {
|
|
9421
9438
|
allowedDomains: domains,
|
|
@@ -9457,13 +9474,13 @@ const Settings = () => {
|
|
|
9457
9474
|
},
|
|
9458
9475
|
get children() {
|
|
9459
9476
|
return [(() => {
|
|
9460
|
-
var _el$ = _tmpl$24(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$11 = _el$3.nextSibling, _el$18 = _el$11.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$
|
|
9461
|
-
_el$
|
|
9462
|
-
var _el$
|
|
9463
|
-
_el$
|
|
9464
|
-
var _el$
|
|
9465
|
-
_el$
|
|
9466
|
-
var _el$
|
|
9477
|
+
var _el$ = _tmpl$24(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$11 = _el$3.nextSibling, _el$18 = _el$11.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$24 = _el$23.firstChild, _el$25 = _el$21.nextSibling, _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling, _el$28 = _el$25.nextSibling, _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling, _el$31 = _el$28.nextSibling, _el$32 = _el$31.firstChild, _el$34 = _el$32.nextSibling, _el$35 = _el$31.nextSibling, _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, _el$38 = _el$35.nextSibling, _el$39 = _el$38.firstChild, _el$40 = _el$39.nextSibling, _el$41 = _el$38.nextSibling, _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$44 = _el$41.nextSibling, _el$45 = _el$44.firstChild, _el$46 = _el$45.firstChild, _el$47 = _el$44.nextSibling, _el$48 = _el$47.nextSibling, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling, _el$51 = _el$50.nextSibling, _el$52 = _el$51.firstChild, _el$53 = _el$52.nextSibling, _el$55 = _el$48.nextSibling, _el$56 = _el$55.nextSibling, _el$57 = _el$56.firstChild, _el$58 = _el$57.firstChild, _el$79 = _el$56.nextSibling, _el$80 = _el$79.nextSibling;
|
|
9478
|
+
_el$80.firstChild;
|
|
9479
|
+
var _el$89 = _el$80.nextSibling, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild;
|
|
9480
|
+
_el$91.firstChild;
|
|
9481
|
+
var _el$107 = _el$90.nextSibling, _el$108 = _el$107.nextSibling, _el$109 = _el$108.firstChild;
|
|
9482
|
+
_el$109.nextSibling;
|
|
9483
|
+
var _el$132 = _el$108.nextSibling, _el$133 = _el$132.nextSibling, _el$134 = _el$133.firstChild, _el$135 = _el$134.firstChild, _el$136 = _el$133.nextSibling, _el$137 = _el$136.nextSibling, _el$138 = _el$137.firstChild, _el$139 = _el$138.nextSibling, _el$140 = _el$137.nextSibling, _el$141 = _el$140.firstChild, _el$142 = _el$141.nextSibling, _el$146 = _el$140.nextSibling, _el$147 = _el$146.firstChild, _el$148 = _el$147.nextSibling;
|
|
9467
9484
|
addEventListener(_el$, "click", closeSettings, true);
|
|
9468
9485
|
_el$2.$$keydown = handleKeyDown;
|
|
9469
9486
|
_el$2.$$click = (e) => e.stopPropagation();
|
|
@@ -9513,25 +9530,37 @@ const Settings = () => {
|
|
|
9513
9530
|
}), _el$18);
|
|
9514
9531
|
_el$20.$$input = (e) => setDefaultUrl(e.currentTarget.value);
|
|
9515
9532
|
setAttribute(_el$20, "spellcheck", false);
|
|
9516
|
-
_el$23
|
|
9517
|
-
|
|
9518
|
-
|
|
9519
|
-
|
|
9520
|
-
|
|
9533
|
+
_el$23.addEventListener("change", (e) => setDefaultSearchEngine(e.currentTarget.value));
|
|
9534
|
+
insert(_el$23, createComponent(For, {
|
|
9535
|
+
get each() {
|
|
9536
|
+
return Object.entries(SEARCH_ENGINE_PRESETS);
|
|
9537
|
+
},
|
|
9538
|
+
children: ([id, preset]) => (() => {
|
|
9539
|
+
var _el$150 = _tmpl$26();
|
|
9540
|
+
_el$150.value = id;
|
|
9541
|
+
insert(_el$150, () => preset.label);
|
|
9542
|
+
return _el$150;
|
|
9543
|
+
})()
|
|
9544
|
+
}), _el$24);
|
|
9545
|
+
_el$27.$$input = (e) => setDownloadPath(e.currentTarget.value);
|
|
9546
|
+
setAttribute(_el$27, "spellcheck", false);
|
|
9547
|
+
_el$30.$$input = (e) => setMcpPort(e.currentTarget.value);
|
|
9548
|
+
setAttribute(_el$30, "spellcheck", false);
|
|
9549
|
+
insert(_el$31, createComponent(Show, {
|
|
9521
9550
|
get when() {
|
|
9522
9551
|
return premiumActive();
|
|
9523
9552
|
},
|
|
9524
9553
|
get fallback() {
|
|
9525
|
-
return _tmpl$
|
|
9554
|
+
return _tmpl$27();
|
|
9526
9555
|
},
|
|
9527
9556
|
get children() {
|
|
9528
|
-
var _el$
|
|
9529
|
-
_el$
|
|
9530
|
-
createRenderEffect(() => _el$
|
|
9531
|
-
return _el$
|
|
9557
|
+
var _el$33 = _tmpl$4$1();
|
|
9558
|
+
_el$33.$$input = (e) => setMaxToolIterations(e.currentTarget.value);
|
|
9559
|
+
createRenderEffect(() => _el$33.value = maxToolIterations());
|
|
9560
|
+
return _el$33;
|
|
9532
9561
|
}
|
|
9533
|
-
}), _el$
|
|
9534
|
-
insert(_el$
|
|
9562
|
+
}), _el$34);
|
|
9563
|
+
insert(_el$34, createComponent(Show, {
|
|
9535
9564
|
get when() {
|
|
9536
9565
|
return premiumActive();
|
|
9537
9566
|
},
|
|
@@ -9543,65 +9572,65 @@ const Settings = () => {
|
|
|
9543
9572
|
return health();
|
|
9544
9573
|
},
|
|
9545
9574
|
children: (currentHealth) => (() => {
|
|
9546
|
-
var _el$
|
|
9547
|
-
_el$
|
|
9548
|
-
insert(_el$
|
|
9549
|
-
insert(_el$
|
|
9550
|
-
insert(_el$
|
|
9575
|
+
var _el$152 = _tmpl$29(), _el$153 = _el$152.firstChild, _el$154 = _el$153.nextSibling, _el$155 = _el$154.firstChild, _el$157 = _el$155.nextSibling;
|
|
9576
|
+
_el$157.nextSibling;
|
|
9577
|
+
insert(_el$157, () => currentHealth().mcp.status);
|
|
9578
|
+
insert(_el$154, () => currentHealth().mcp.message, null);
|
|
9579
|
+
insert(_el$152, createComponent(Show, {
|
|
9551
9580
|
get when() {
|
|
9552
9581
|
return currentHealth().mcp.endpoint;
|
|
9553
9582
|
},
|
|
9554
9583
|
children: (endpoint) => (() => {
|
|
9555
|
-
var _el$
|
|
9556
|
-
insert(_el$
|
|
9557
|
-
return _el$
|
|
9584
|
+
var _el$160 = _tmpl$30(), _el$161 = _el$160.firstChild, _el$162 = _el$161.nextSibling;
|
|
9585
|
+
insert(_el$162, endpoint);
|
|
9586
|
+
return _el$160;
|
|
9558
9587
|
})()
|
|
9559
9588
|
}), null);
|
|
9560
|
-
insert(_el$
|
|
9589
|
+
insert(_el$152, createComponent(Show, {
|
|
9561
9590
|
get when() {
|
|
9562
9591
|
return currentHealth().startupIssues.length > 0;
|
|
9563
9592
|
},
|
|
9564
9593
|
get children() {
|
|
9565
|
-
var _el$
|
|
9566
|
-
insert(_el$
|
|
9567
|
-
var _el$
|
|
9568
|
-
insert(_el$
|
|
9569
|
-
insert(_el$
|
|
9570
|
-
insert(_el$
|
|
9594
|
+
var _el$159 = _tmpl$28();
|
|
9595
|
+
insert(_el$159, () => currentHealth().startupIssues.map((issue) => (() => {
|
|
9596
|
+
var _el$163 = _tmpl$31(), _el$164 = _el$163.firstChild, _el$165 = _el$164.nextSibling;
|
|
9597
|
+
insert(_el$164, () => issue.title);
|
|
9598
|
+
insert(_el$165, () => issue.detail);
|
|
9599
|
+
insert(_el$163, createComponent(Show, {
|
|
9571
9600
|
get when() {
|
|
9572
9601
|
return issue.action;
|
|
9573
9602
|
},
|
|
9574
9603
|
children: (action) => (() => {
|
|
9575
|
-
var _el$
|
|
9576
|
-
insert(_el$
|
|
9577
|
-
return _el$
|
|
9604
|
+
var _el$166 = _tmpl$32();
|
|
9605
|
+
insert(_el$166, action);
|
|
9606
|
+
return _el$166;
|
|
9578
9607
|
})()
|
|
9579
9608
|
}), null);
|
|
9580
9609
|
createRenderEffect((_p$) => {
|
|
9581
9610
|
var _v$1 = !!(issue.severity === "warning"), _v$10 = !!(issue.severity === "error");
|
|
9582
|
-
_v$1 !== _p$.e && _el$
|
|
9583
|
-
_v$10 !== _p$.t && _el$
|
|
9611
|
+
_v$1 !== _p$.e && _el$163.classList.toggle("warning", _p$.e = _v$1);
|
|
9612
|
+
_v$10 !== _p$.t && _el$163.classList.toggle("error", _p$.t = _v$10);
|
|
9584
9613
|
return _p$;
|
|
9585
9614
|
}, {
|
|
9586
9615
|
e: void 0,
|
|
9587
9616
|
t: void 0
|
|
9588
9617
|
});
|
|
9589
|
-
return _el$
|
|
9618
|
+
return _el$163;
|
|
9590
9619
|
})()));
|
|
9591
|
-
return _el$
|
|
9620
|
+
return _el$159;
|
|
9592
9621
|
}
|
|
9593
9622
|
}), null);
|
|
9594
|
-
return _el$
|
|
9623
|
+
return _el$152;
|
|
9595
9624
|
})()
|
|
9596
|
-
}), _el$
|
|
9597
|
-
_el$
|
|
9598
|
-
setAttribute(_el$
|
|
9599
|
-
_el$
|
|
9600
|
-
_el$
|
|
9601
|
-
_el$
|
|
9602
|
-
_el$
|
|
9603
|
-
setAttribute(_el$
|
|
9604
|
-
_el$
|
|
9625
|
+
}), _el$35);
|
|
9626
|
+
_el$37.$$input = (e) => setObsidianVaultPath(e.currentTarget.value);
|
|
9627
|
+
setAttribute(_el$37, "spellcheck", false);
|
|
9628
|
+
_el$40.addEventListener("change", (e) => setAgentTranscriptMode(e.currentTarget.value));
|
|
9629
|
+
_el$43.$$click = () => setAutoRestoreSession(!autoRestoreSession());
|
|
9630
|
+
_el$46.$$click = () => setClearBookmarksOnLaunch(!clearBookmarksOnLaunch());
|
|
9631
|
+
_el$52.$$input = (e) => setSessionSaveName(e.currentTarget.value);
|
|
9632
|
+
setAttribute(_el$52, "spellcheck", false);
|
|
9633
|
+
_el$53.$$click = async () => {
|
|
9605
9634
|
try {
|
|
9606
9635
|
await window.vessel.sessions.save(sessionSaveName().trim());
|
|
9607
9636
|
setSessionSaveName("");
|
|
@@ -9618,25 +9647,25 @@ const Settings = () => {
|
|
|
9618
9647
|
});
|
|
9619
9648
|
}
|
|
9620
9649
|
};
|
|
9621
|
-
insert(_el$
|
|
9650
|
+
insert(_el$48, createComponent(Show, {
|
|
9622
9651
|
get when() {
|
|
9623
9652
|
return sessionList().length > 0;
|
|
9624
9653
|
},
|
|
9625
9654
|
get children() {
|
|
9626
|
-
var _el$
|
|
9627
|
-
insert(_el$
|
|
9655
|
+
var _el$54 = _tmpl$5$1();
|
|
9656
|
+
insert(_el$54, createComponent(For, {
|
|
9628
9657
|
get each() {
|
|
9629
9658
|
return sessionList();
|
|
9630
9659
|
},
|
|
9631
9660
|
children: (s) => (() => {
|
|
9632
|
-
var _el$
|
|
9633
|
-
_el$
|
|
9634
|
-
var _el$
|
|
9635
|
-
insert(_el$
|
|
9636
|
-
insert(_el$
|
|
9637
|
-
insert(_el$
|
|
9638
|
-
insert(_el$
|
|
9639
|
-
_el$
|
|
9661
|
+
var _el$167 = _tmpl$33(), _el$168 = _el$167.firstChild, _el$169 = _el$168.firstChild, _el$170 = _el$169.nextSibling, _el$171 = _el$170.firstChild, _el$177 = _el$171.nextSibling, _el$173 = _el$177.nextSibling, _el$178 = _el$173.nextSibling;
|
|
9662
|
+
_el$178.nextSibling;
|
|
9663
|
+
var _el$179 = _el$168.nextSibling, _el$180 = _el$179.firstChild, _el$181 = _el$180.nextSibling;
|
|
9664
|
+
insert(_el$169, () => s.name);
|
|
9665
|
+
insert(_el$170, () => new Date(s.updatedAt).toLocaleDateString(), _el$171);
|
|
9666
|
+
insert(_el$170, () => s.cookieCount, _el$177);
|
|
9667
|
+
insert(_el$170, () => s.domains.length, _el$178);
|
|
9668
|
+
_el$180.$$click = async () => {
|
|
9640
9669
|
try {
|
|
9641
9670
|
await window.vessel.sessions.load(s.name);
|
|
9642
9671
|
setStatus({
|
|
@@ -9651,25 +9680,25 @@ const Settings = () => {
|
|
|
9651
9680
|
});
|
|
9652
9681
|
}
|
|
9653
9682
|
};
|
|
9654
|
-
_el$
|
|
9683
|
+
_el$181.$$click = async () => {
|
|
9655
9684
|
await window.vessel.sessions.delete(s.name);
|
|
9656
9685
|
await loadSessionList();
|
|
9657
9686
|
};
|
|
9658
|
-
return _el$
|
|
9687
|
+
return _el$167;
|
|
9659
9688
|
})()
|
|
9660
9689
|
}));
|
|
9661
|
-
return _el$
|
|
9690
|
+
return _el$54;
|
|
9662
9691
|
}
|
|
9663
9692
|
}), null);
|
|
9664
|
-
_el$
|
|
9693
|
+
_el$58.$$click = () => setChatEnabled(!chatEnabled());
|
|
9665
9694
|
insert(_el$2, createComponent(Show, {
|
|
9666
9695
|
get when() {
|
|
9667
9696
|
return chatEnabled();
|
|
9668
9697
|
},
|
|
9669
9698
|
get children() {
|
|
9670
9699
|
return [(() => {
|
|
9671
|
-
var _el$
|
|
9672
|
-
_el$
|
|
9700
|
+
var _el$59 = _tmpl$6$1(), _el$60 = _el$59.firstChild, _el$61 = _el$60.nextSibling;
|
|
9701
|
+
_el$61.addEventListener("change", (e) => {
|
|
9673
9702
|
const id = e.currentTarget.value;
|
|
9674
9703
|
setChatProviderId(id);
|
|
9675
9704
|
setChatModel("");
|
|
@@ -9679,26 +9708,26 @@ const Settings = () => {
|
|
|
9679
9708
|
setProviderModels([]);
|
|
9680
9709
|
setModelFetchState("idle");
|
|
9681
9710
|
});
|
|
9682
|
-
insert(_el$
|
|
9711
|
+
insert(_el$61, createComponent(For, {
|
|
9683
9712
|
each: CHAT_PROVIDERS,
|
|
9684
9713
|
children: (p) => (() => {
|
|
9685
|
-
var _el$
|
|
9686
|
-
insert(_el$
|
|
9687
|
-
createRenderEffect(() => _el$
|
|
9688
|
-
return _el$
|
|
9714
|
+
var _el$182 = _tmpl$26();
|
|
9715
|
+
insert(_el$182, () => p.name);
|
|
9716
|
+
createRenderEffect(() => _el$182.value = p.id);
|
|
9717
|
+
return _el$182;
|
|
9689
9718
|
})()
|
|
9690
9719
|
}));
|
|
9691
|
-
createRenderEffect(() => _el$
|
|
9692
|
-
return _el$
|
|
9720
|
+
createRenderEffect(() => _el$61.value = chatProviderId());
|
|
9721
|
+
return _el$59;
|
|
9693
9722
|
})(), createComponent(Show, {
|
|
9694
9723
|
get when() {
|
|
9695
9724
|
return chatProviderMeta().requiresKey || chatProviderId() === "custom";
|
|
9696
9725
|
},
|
|
9697
9726
|
get children() {
|
|
9698
|
-
var _el$
|
|
9699
|
-
_el$
|
|
9700
|
-
var _el$
|
|
9701
|
-
insert(_el$
|
|
9727
|
+
var _el$62 = _tmpl$0(), _el$63 = _el$62.firstChild;
|
|
9728
|
+
_el$63.firstChild;
|
|
9729
|
+
var _el$66 = _el$63.nextSibling;
|
|
9730
|
+
insert(_el$63, createComponent(Show, {
|
|
9702
9731
|
get when() {
|
|
9703
9732
|
return !chatProviderMeta().requiresKey;
|
|
9704
9733
|
},
|
|
@@ -9706,14 +9735,14 @@ const Settings = () => {
|
|
|
9706
9735
|
return _tmpl$7();
|
|
9707
9736
|
}
|
|
9708
9737
|
}), null);
|
|
9709
|
-
_el$
|
|
9738
|
+
_el$66.$$input = (e) => {
|
|
9710
9739
|
setChatApiKey(e.currentTarget.value);
|
|
9711
9740
|
if (e.currentTarget.value.trim()) {
|
|
9712
9741
|
setChatHasStoredApiKey(true);
|
|
9713
9742
|
}
|
|
9714
9743
|
};
|
|
9715
|
-
setAttribute(_el$
|
|
9716
|
-
insert(_el$
|
|
9744
|
+
setAttribute(_el$66, "spellcheck", false);
|
|
9745
|
+
insert(_el$62, createComponent(Show, {
|
|
9717
9746
|
get when() {
|
|
9718
9747
|
return memo(() => !!chatHasStoredApiKey())() && !chatApiKey().trim();
|
|
9719
9748
|
},
|
|
@@ -9721,7 +9750,7 @@ const Settings = () => {
|
|
|
9721
9750
|
return _tmpl$8();
|
|
9722
9751
|
}
|
|
9723
9752
|
}), null);
|
|
9724
|
-
insert(_el$
|
|
9753
|
+
insert(_el$62, createComponent(Show, {
|
|
9725
9754
|
get when() {
|
|
9726
9755
|
return chatProviderId() === "custom";
|
|
9727
9756
|
},
|
|
@@ -9729,46 +9758,46 @@ const Settings = () => {
|
|
|
9729
9758
|
return _tmpl$9();
|
|
9730
9759
|
}
|
|
9731
9760
|
}), null);
|
|
9732
|
-
createRenderEffect(() => setAttribute(_el$
|
|
9733
|
-
createRenderEffect(() => _el$
|
|
9734
|
-
return _el$
|
|
9761
|
+
createRenderEffect(() => setAttribute(_el$66, "placeholder", chatHasStoredApiKey() && !chatApiKey().trim() ? "Stored securely. Enter a new key to replace it." : chatProviderMeta().keyPlaceholder || "Bearer token or API key"));
|
|
9762
|
+
createRenderEffect(() => _el$66.value = chatApiKey());
|
|
9763
|
+
return _el$62;
|
|
9735
9764
|
}
|
|
9736
9765
|
}), (() => {
|
|
9737
|
-
var _el$
|
|
9738
|
-
insert(_el$
|
|
9766
|
+
var _el$69 = _tmpl$11(), _el$70 = _el$69.firstChild, _el$71 = _el$70.nextSibling, _el$73 = _el$71.firstChild;
|
|
9767
|
+
insert(_el$71, createComponent(Show, {
|
|
9739
9768
|
get when() {
|
|
9740
9769
|
return providerModels().length > 0;
|
|
9741
9770
|
},
|
|
9742
9771
|
get fallback() {
|
|
9743
9772
|
return (() => {
|
|
9744
|
-
var _el$
|
|
9745
|
-
_el$
|
|
9746
|
-
setAttribute(_el$
|
|
9747
|
-
createRenderEffect(() => setAttribute(_el$
|
|
9748
|
-
createRenderEffect(() => _el$
|
|
9749
|
-
return _el$
|
|
9773
|
+
var _el$183 = _tmpl$34();
|
|
9774
|
+
_el$183.$$input = (e) => setChatModel(e.currentTarget.value);
|
|
9775
|
+
setAttribute(_el$183, "spellcheck", false);
|
|
9776
|
+
createRenderEffect(() => setAttribute(_el$183, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() && !chatHasStoredApiKey() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
|
|
9777
|
+
createRenderEffect(() => _el$183.value = chatModel());
|
|
9778
|
+
return _el$183;
|
|
9750
9779
|
})();
|
|
9751
9780
|
},
|
|
9752
9781
|
get children() {
|
|
9753
|
-
var _el$
|
|
9754
|
-
_el$
|
|
9755
|
-
insert(_el$
|
|
9782
|
+
var _el$72 = _tmpl$1();
|
|
9783
|
+
_el$72.addEventListener("change", (e) => setChatModel(e.currentTarget.value));
|
|
9784
|
+
insert(_el$72, createComponent(For, {
|
|
9756
9785
|
get each() {
|
|
9757
9786
|
return providerModels();
|
|
9758
9787
|
},
|
|
9759
9788
|
children: (m) => (() => {
|
|
9760
|
-
var _el$
|
|
9761
|
-
_el$
|
|
9762
|
-
insert(_el$
|
|
9763
|
-
return _el$
|
|
9789
|
+
var _el$184 = _tmpl$26();
|
|
9790
|
+
_el$184.value = m;
|
|
9791
|
+
insert(_el$184, m);
|
|
9792
|
+
return _el$184;
|
|
9764
9793
|
})()
|
|
9765
9794
|
}));
|
|
9766
|
-
createRenderEffect(() => _el$
|
|
9767
|
-
return _el$
|
|
9795
|
+
createRenderEffect(() => _el$72.value = chatModel());
|
|
9796
|
+
return _el$72;
|
|
9768
9797
|
}
|
|
9769
|
-
}), _el$
|
|
9770
|
-
_el$
|
|
9771
|
-
insert(_el$
|
|
9798
|
+
}), _el$73);
|
|
9799
|
+
_el$73.$$click = doFetchModels;
|
|
9800
|
+
insert(_el$69, createComponent(Show, {
|
|
9772
9801
|
get when() {
|
|
9773
9802
|
return modelFetchState() === "error";
|
|
9774
9803
|
},
|
|
@@ -9776,29 +9805,29 @@ const Settings = () => {
|
|
|
9776
9805
|
return _tmpl$10();
|
|
9777
9806
|
}
|
|
9778
9807
|
}), null);
|
|
9779
|
-
insert(_el$
|
|
9808
|
+
insert(_el$69, createComponent(Show, {
|
|
9780
9809
|
get when() {
|
|
9781
9810
|
return modelFetchWarning();
|
|
9782
9811
|
},
|
|
9783
9812
|
children: (warning) => (() => {
|
|
9784
|
-
var _el$
|
|
9785
|
-
insert(_el$
|
|
9786
|
-
return _el$
|
|
9813
|
+
var _el$185 = _tmpl$35();
|
|
9814
|
+
insert(_el$185, warning);
|
|
9815
|
+
return _el$185;
|
|
9787
9816
|
})()
|
|
9788
9817
|
}), null);
|
|
9789
|
-
createRenderEffect(() => _el$
|
|
9790
|
-
return _el$
|
|
9818
|
+
createRenderEffect(() => _el$73.disabled = modelFetchState() === "loading");
|
|
9819
|
+
return _el$69;
|
|
9791
9820
|
})(), createComponent(Show, {
|
|
9792
9821
|
get when() {
|
|
9793
9822
|
return chatProviderMeta().needsBaseUrl || chatProviderId() === "custom";
|
|
9794
9823
|
},
|
|
9795
9824
|
get children() {
|
|
9796
|
-
var _el$
|
|
9797
|
-
_el$
|
|
9798
|
-
setAttribute(_el$
|
|
9799
|
-
createRenderEffect(() => setAttribute(_el$
|
|
9800
|
-
createRenderEffect(() => _el$
|
|
9801
|
-
return _el$
|
|
9825
|
+
var _el$75 = _tmpl$12(), _el$76 = _el$75.firstChild, _el$77 = _el$76.nextSibling;
|
|
9826
|
+
_el$77.$$input = (e) => setChatBaseUrl(e.currentTarget.value);
|
|
9827
|
+
setAttribute(_el$77, "spellcheck", false);
|
|
9828
|
+
createRenderEffect(() => setAttribute(_el$77, "placeholder", chatProviderMeta().defaultBaseUrl ?? "https://..."));
|
|
9829
|
+
createRenderEffect(() => _el$77.value = chatBaseUrl());
|
|
9830
|
+
return _el$75;
|
|
9802
9831
|
}
|
|
9803
9832
|
}), createComponent(Show, {
|
|
9804
9833
|
get when() {
|
|
@@ -9809,15 +9838,15 @@ const Settings = () => {
|
|
|
9809
9838
|
}
|
|
9810
9839
|
})];
|
|
9811
9840
|
}
|
|
9812
|
-
}), _el$
|
|
9813
|
-
insert(_el$
|
|
9841
|
+
}), _el$79);
|
|
9842
|
+
insert(_el$80, createComponent(Show, {
|
|
9814
9843
|
get when() {
|
|
9815
9844
|
return premiumActive();
|
|
9816
9845
|
},
|
|
9817
9846
|
get fallback() {
|
|
9818
9847
|
return (() => {
|
|
9819
|
-
var _el$
|
|
9820
|
-
_el$
|
|
9848
|
+
var _el$186 = _tmpl$38(), _el$187 = _el$186.firstChild, _el$188 = _el$187.nextSibling, _el$189 = _el$188.firstChild, _el$190 = _el$189.nextSibling, _el$194 = _el$188.nextSibling;
|
|
9849
|
+
_el$189.$$input = (e) => {
|
|
9821
9850
|
const nextEmail = e.currentTarget.value;
|
|
9822
9851
|
if (nextEmail.trim().toLowerCase() !== premiumEmail().trim().toLowerCase()) {
|
|
9823
9852
|
resetPremiumActivationFlow();
|
|
@@ -9825,8 +9854,8 @@ const Settings = () => {
|
|
|
9825
9854
|
}
|
|
9826
9855
|
setPremiumEmail(nextEmail);
|
|
9827
9856
|
};
|
|
9828
|
-
setAttribute(_el$
|
|
9829
|
-
_el$
|
|
9857
|
+
setAttribute(_el$189, "spellcheck", false);
|
|
9858
|
+
_el$190.$$click = async () => {
|
|
9830
9859
|
setPremiumLoading(true);
|
|
9831
9860
|
setPremiumMessage(null);
|
|
9832
9861
|
try {
|
|
@@ -9855,23 +9884,23 @@ const Settings = () => {
|
|
|
9855
9884
|
setPremiumLoading(false);
|
|
9856
9885
|
}
|
|
9857
9886
|
};
|
|
9858
|
-
insert(_el$
|
|
9887
|
+
insert(_el$190, (() => {
|
|
9859
9888
|
var _c$ = memo(() => !!premiumLoading());
|
|
9860
9889
|
return () => _c$() ? "Sending..." : premiumCodeSent() ? "Resend Code" : "Send Code";
|
|
9861
9890
|
})());
|
|
9862
|
-
insert(_el$
|
|
9891
|
+
insert(_el$186, createComponent(Show, {
|
|
9863
9892
|
get when() {
|
|
9864
9893
|
return premiumCodeSent();
|
|
9865
9894
|
},
|
|
9866
9895
|
get children() {
|
|
9867
|
-
var _el$
|
|
9868
|
-
_el$
|
|
9896
|
+
var _el$191 = _tmpl$36(), _el$192 = _el$191.firstChild, _el$193 = _el$192.nextSibling;
|
|
9897
|
+
_el$192.$$input = (e) => {
|
|
9869
9898
|
const nextCode = e.currentTarget.value.replace(/\D+/g, "").slice(0, 6);
|
|
9870
9899
|
setPremiumCode(nextCode);
|
|
9871
9900
|
setPremiumMessage(null);
|
|
9872
9901
|
};
|
|
9873
|
-
setAttribute(_el$
|
|
9874
|
-
_el$
|
|
9902
|
+
setAttribute(_el$192, "spellcheck", false);
|
|
9903
|
+
_el$193.$$click = async () => {
|
|
9875
9904
|
setPremiumLoading(true);
|
|
9876
9905
|
setPremiumMessage(null);
|
|
9877
9906
|
try {
|
|
@@ -9898,60 +9927,60 @@ const Settings = () => {
|
|
|
9898
9927
|
setPremiumLoading(false);
|
|
9899
9928
|
}
|
|
9900
9929
|
};
|
|
9901
|
-
insert(_el$
|
|
9902
|
-
createRenderEffect(() => _el$
|
|
9903
|
-
createRenderEffect(() => _el$
|
|
9904
|
-
return _el$
|
|
9930
|
+
insert(_el$193, () => premiumLoading() ? "Verifying..." : "Verify Code");
|
|
9931
|
+
createRenderEffect(() => _el$193.disabled = premiumLoading() || !premiumEmail().trim() || premiumCode().trim().length !== 6 || !premiumChallengeToken());
|
|
9932
|
+
createRenderEffect(() => _el$192.value = premiumCode());
|
|
9933
|
+
return _el$191;
|
|
9905
9934
|
}
|
|
9906
|
-
}), _el$
|
|
9907
|
-
_el$
|
|
9935
|
+
}), _el$194);
|
|
9936
|
+
_el$194.$$click = () => {
|
|
9908
9937
|
startPremiumCheckout();
|
|
9909
9938
|
};
|
|
9910
|
-
insert(_el$
|
|
9939
|
+
insert(_el$186, createComponent(Show, {
|
|
9911
9940
|
get when() {
|
|
9912
9941
|
return premiumMessage();
|
|
9913
9942
|
},
|
|
9914
9943
|
children: (msg) => (() => {
|
|
9915
|
-
var _el$
|
|
9916
|
-
insert(_el$
|
|
9944
|
+
var _el$196 = _tmpl$39();
|
|
9945
|
+
insert(_el$196, () => msg().text);
|
|
9917
9946
|
createRenderEffect((_p$) => {
|
|
9918
9947
|
var _v$11 = !!(msg().kind === "success"), _v$12 = !!(msg().kind === "error");
|
|
9919
|
-
_v$11 !== _p$.e && _el$
|
|
9920
|
-
_v$12 !== _p$.t && _el$
|
|
9948
|
+
_v$11 !== _p$.e && _el$196.classList.toggle("success", _p$.e = _v$11);
|
|
9949
|
+
_v$12 !== _p$.t && _el$196.classList.toggle("error", _p$.t = _v$12);
|
|
9921
9950
|
return _p$;
|
|
9922
9951
|
}, {
|
|
9923
9952
|
e: void 0,
|
|
9924
9953
|
t: void 0
|
|
9925
9954
|
});
|
|
9926
|
-
return _el$
|
|
9955
|
+
return _el$196;
|
|
9927
9956
|
})()
|
|
9928
9957
|
}), null);
|
|
9929
|
-
insert(_el$
|
|
9958
|
+
insert(_el$186, createComponent(Show, {
|
|
9930
9959
|
get when() {
|
|
9931
9960
|
return premiumState().email || premiumEmail();
|
|
9932
9961
|
},
|
|
9933
9962
|
get children() {
|
|
9934
|
-
var _el$
|
|
9935
|
-
_el$
|
|
9963
|
+
var _el$195 = _tmpl$37();
|
|
9964
|
+
_el$195.$$click = async () => {
|
|
9936
9965
|
const state = await window.vessel.premium.reset();
|
|
9937
9966
|
setPremiumState(state);
|
|
9938
9967
|
setPremiumEmail("");
|
|
9939
9968
|
resetPremiumActivationFlow();
|
|
9940
9969
|
setPremiumMessage(null);
|
|
9941
9970
|
};
|
|
9942
|
-
return _el$
|
|
9971
|
+
return _el$195;
|
|
9943
9972
|
}
|
|
9944
9973
|
}), null);
|
|
9945
|
-
createRenderEffect(() => _el$
|
|
9946
|
-
createRenderEffect(() => _el$
|
|
9947
|
-
return _el$
|
|
9974
|
+
createRenderEffect(() => _el$190.disabled = premiumLoading() || !premiumEmail().trim());
|
|
9975
|
+
createRenderEffect(() => _el$189.value = premiumEmail());
|
|
9976
|
+
return _el$186;
|
|
9948
9977
|
})();
|
|
9949
9978
|
},
|
|
9950
9979
|
get children() {
|
|
9951
|
-
var _el$
|
|
9952
|
-
_el$
|
|
9953
|
-
var _el$
|
|
9954
|
-
insert(_el$
|
|
9980
|
+
var _el$82 = _tmpl$14(), _el$83 = _el$82.firstChild;
|
|
9981
|
+
_el$83.firstChild;
|
|
9982
|
+
var _el$85 = _el$83.nextSibling, _el$86 = _el$85.nextSibling, _el$87 = _el$86.firstChild, _el$88 = _el$87.nextSibling;
|
|
9983
|
+
insert(_el$83, createComponent(Show, {
|
|
9955
9984
|
get when() {
|
|
9956
9985
|
return premiumState().status === "trialing";
|
|
9957
9986
|
},
|
|
@@ -9959,8 +9988,8 @@ const Settings = () => {
|
|
|
9959
9988
|
return [" ", "(Trial)"];
|
|
9960
9989
|
}
|
|
9961
9990
|
}), null);
|
|
9962
|
-
insert(_el$
|
|
9963
|
-
insert(_el$
|
|
9991
|
+
insert(_el$85, () => premiumState().email, null);
|
|
9992
|
+
insert(_el$85, createComponent(Show, {
|
|
9964
9993
|
get when() {
|
|
9965
9994
|
return premiumState().expiresAt;
|
|
9966
9995
|
},
|
|
@@ -9968,7 +9997,7 @@ const Settings = () => {
|
|
|
9968
9997
|
return [" ", "· Renews", " ", memo(() => new Date(premiumState().expiresAt).toLocaleDateString())];
|
|
9969
9998
|
}
|
|
9970
9999
|
}), null);
|
|
9971
|
-
_el$
|
|
10000
|
+
_el$87.$$click = async () => {
|
|
9972
10001
|
const result = await window.vessel.premium.portal();
|
|
9973
10002
|
if (!result.ok) {
|
|
9974
10003
|
setPremiumMessage({
|
|
@@ -9978,36 +10007,36 @@ const Settings = () => {
|
|
|
9978
10007
|
setTimeout(() => setPremiumMessage(null), 5e3);
|
|
9979
10008
|
}
|
|
9980
10009
|
};
|
|
9981
|
-
_el$
|
|
10010
|
+
_el$88.$$click = async () => {
|
|
9982
10011
|
const state = await window.vessel.premium.reset();
|
|
9983
10012
|
setPremiumState(state);
|
|
9984
10013
|
setPremiumEmail("");
|
|
9985
10014
|
resetPremiumActivationFlow();
|
|
9986
10015
|
setPremiumMessage(null);
|
|
9987
10016
|
};
|
|
9988
|
-
insert(_el$
|
|
10017
|
+
insert(_el$82, createComponent(Show, {
|
|
9989
10018
|
get when() {
|
|
9990
10019
|
return premiumMessage();
|
|
9991
10020
|
},
|
|
9992
10021
|
children: (msg) => (() => {
|
|
9993
|
-
var _el$
|
|
9994
|
-
insert(_el$
|
|
10022
|
+
var _el$197 = _tmpl$39();
|
|
10023
|
+
insert(_el$197, () => msg().text);
|
|
9995
10024
|
createRenderEffect((_p$) => {
|
|
9996
10025
|
var _v$13 = !!(msg().kind === "success"), _v$14 = !!(msg().kind === "error");
|
|
9997
|
-
_v$13 !== _p$.e && _el$
|
|
9998
|
-
_v$14 !== _p$.t && _el$
|
|
10026
|
+
_v$13 !== _p$.e && _el$197.classList.toggle("success", _p$.e = _v$13);
|
|
10027
|
+
_v$14 !== _p$.t && _el$197.classList.toggle("error", _p$.t = _v$14);
|
|
9999
10028
|
return _p$;
|
|
10000
10029
|
}, {
|
|
10001
10030
|
e: void 0,
|
|
10002
10031
|
t: void 0
|
|
10003
10032
|
});
|
|
10004
|
-
return _el$
|
|
10033
|
+
return _el$197;
|
|
10005
10034
|
})()
|
|
10006
10035
|
}), null);
|
|
10007
|
-
return _el$
|
|
10036
|
+
return _el$82;
|
|
10008
10037
|
}
|
|
10009
10038
|
}), null);
|
|
10010
|
-
insert(_el$
|
|
10039
|
+
insert(_el$91, createComponent(Show, {
|
|
10011
10040
|
get when() {
|
|
10012
10041
|
return !premiumActive();
|
|
10013
10042
|
},
|
|
@@ -10015,7 +10044,7 @@ const Settings = () => {
|
|
|
10015
10044
|
return _tmpl$15();
|
|
10016
10045
|
}
|
|
10017
10046
|
}), null);
|
|
10018
|
-
insert(_el$
|
|
10047
|
+
insert(_el$90, createComponent(Show, {
|
|
10019
10048
|
get when() {
|
|
10020
10049
|
return premiumActive();
|
|
10021
10050
|
},
|
|
@@ -10028,17 +10057,17 @@ const Settings = () => {
|
|
|
10028
10057
|
return vaultEntries().length > 0;
|
|
10029
10058
|
},
|
|
10030
10059
|
get children() {
|
|
10031
|
-
var _el$
|
|
10032
|
-
insert(_el$
|
|
10060
|
+
var _el$95 = _tmpl$5$1();
|
|
10061
|
+
insert(_el$95, createComponent(For, {
|
|
10033
10062
|
get each() {
|
|
10034
10063
|
return vaultEntries();
|
|
10035
10064
|
},
|
|
10036
10065
|
children: (entry) => (() => {
|
|
10037
|
-
var _el$
|
|
10038
|
-
insert(_el$
|
|
10039
|
-
insert(_el$
|
|
10040
|
-
insert(_el$
|
|
10041
|
-
insert(_el$
|
|
10066
|
+
var _el$199 = _tmpl$41(), _el$200 = _el$199.firstChild, _el$201 = _el$200.firstChild, _el$202 = _el$201.nextSibling, _el$203 = _el$202.firstChild, _el$204 = _el$200.nextSibling;
|
|
10067
|
+
insert(_el$201, () => entry.label);
|
|
10068
|
+
insert(_el$202, () => entry.username, _el$203);
|
|
10069
|
+
insert(_el$202, () => entry.domainPattern, null);
|
|
10070
|
+
insert(_el$202, createComponent(Show, {
|
|
10042
10071
|
get when() {
|
|
10043
10072
|
return entry.useCount > 0;
|
|
10044
10073
|
},
|
|
@@ -10046,43 +10075,43 @@ const Settings = () => {
|
|
|
10046
10075
|
return [" ", "· Used ", memo(() => entry.useCount), "x"];
|
|
10047
10076
|
}
|
|
10048
10077
|
}), null);
|
|
10049
|
-
_el$
|
|
10050
|
-
return _el$
|
|
10078
|
+
_el$204.$$click = () => handleVaultRemove(entry.id);
|
|
10079
|
+
return _el$199;
|
|
10051
10080
|
})()
|
|
10052
10081
|
}));
|
|
10053
|
-
return _el$
|
|
10082
|
+
return _el$95;
|
|
10054
10083
|
}
|
|
10055
10084
|
}), createComponent(Show, {
|
|
10056
10085
|
get when() {
|
|
10057
10086
|
return !vaultAdding();
|
|
10058
10087
|
},
|
|
10059
10088
|
get children() {
|
|
10060
|
-
var _el$
|
|
10061
|
-
_el$
|
|
10089
|
+
var _el$96 = _tmpl$17();
|
|
10090
|
+
_el$96.$$click = () => {
|
|
10062
10091
|
setVaultAdding(true);
|
|
10063
10092
|
setVaultMessage(null);
|
|
10064
10093
|
};
|
|
10065
|
-
return _el$
|
|
10094
|
+
return _el$96;
|
|
10066
10095
|
}
|
|
10067
10096
|
}), createComponent(Show, {
|
|
10068
10097
|
get when() {
|
|
10069
10098
|
return vaultAdding();
|
|
10070
10099
|
},
|
|
10071
10100
|
get children() {
|
|
10072
|
-
var _el$
|
|
10073
|
-
_el$
|
|
10074
|
-
setAttribute(_el$94, "spellcheck", false);
|
|
10075
|
-
_el$95.$$input = (e) => setVaultNewDomain(e.currentTarget.value);
|
|
10076
|
-
setAttribute(_el$95, "spellcheck", false);
|
|
10077
|
-
_el$96.$$input = (e) => setVaultNewUsername(e.currentTarget.value);
|
|
10078
|
-
setAttribute(_el$96, "spellcheck", false);
|
|
10079
|
-
_el$97.$$input = (e) => setVaultNewPassword(e.currentTarget.value);
|
|
10080
|
-
_el$98.$$input = (e) => setVaultNewTotp(e.currentTarget.value);
|
|
10101
|
+
var _el$97 = _tmpl$18(), _el$98 = _el$97.firstChild, _el$99 = _el$98.nextSibling, _el$100 = _el$99.nextSibling, _el$101 = _el$100.nextSibling, _el$102 = _el$101.nextSibling, _el$103 = _el$102.nextSibling, _el$104 = _el$103.nextSibling, _el$105 = _el$104.firstChild, _el$106 = _el$105.nextSibling;
|
|
10102
|
+
_el$98.$$input = (e) => setVaultNewLabel(e.currentTarget.value);
|
|
10081
10103
|
setAttribute(_el$98, "spellcheck", false);
|
|
10082
|
-
_el$99.$$input = (e) =>
|
|
10104
|
+
_el$99.$$input = (e) => setVaultNewDomain(e.currentTarget.value);
|
|
10083
10105
|
setAttribute(_el$99, "spellcheck", false);
|
|
10084
|
-
_el$
|
|
10085
|
-
_el$
|
|
10106
|
+
_el$100.$$input = (e) => setVaultNewUsername(e.currentTarget.value);
|
|
10107
|
+
setAttribute(_el$100, "spellcheck", false);
|
|
10108
|
+
_el$101.$$input = (e) => setVaultNewPassword(e.currentTarget.value);
|
|
10109
|
+
_el$102.$$input = (e) => setVaultNewTotp(e.currentTarget.value);
|
|
10110
|
+
setAttribute(_el$102, "spellcheck", false);
|
|
10111
|
+
_el$103.$$input = (e) => setVaultNewNotes(e.currentTarget.value);
|
|
10112
|
+
setAttribute(_el$103, "spellcheck", false);
|
|
10113
|
+
_el$105.$$click = handleVaultAdd;
|
|
10114
|
+
_el$106.$$click = () => {
|
|
10086
10115
|
setVaultAdding(false);
|
|
10087
10116
|
setVaultNewLabel("");
|
|
10088
10117
|
setVaultNewDomain("");
|
|
@@ -10091,100 +10120,100 @@ const Settings = () => {
|
|
|
10091
10120
|
setVaultNewTotp("");
|
|
10092
10121
|
setVaultNewNotes("");
|
|
10093
10122
|
};
|
|
10094
|
-
createRenderEffect(() => _el$
|
|
10095
|
-
createRenderEffect(() => _el$
|
|
10096
|
-
createRenderEffect(() => _el$
|
|
10097
|
-
createRenderEffect(() => _el$
|
|
10098
|
-
createRenderEffect(() => _el$
|
|
10099
|
-
createRenderEffect(() => _el$
|
|
10100
|
-
return _el$
|
|
10123
|
+
createRenderEffect(() => _el$98.value = vaultNewLabel());
|
|
10124
|
+
createRenderEffect(() => _el$99.value = vaultNewDomain());
|
|
10125
|
+
createRenderEffect(() => _el$100.value = vaultNewUsername());
|
|
10126
|
+
createRenderEffect(() => _el$101.value = vaultNewPassword());
|
|
10127
|
+
createRenderEffect(() => _el$102.value = vaultNewTotp());
|
|
10128
|
+
createRenderEffect(() => _el$103.value = vaultNewNotes());
|
|
10129
|
+
return _el$97;
|
|
10101
10130
|
}
|
|
10102
10131
|
}), createComponent(Show, {
|
|
10103
10132
|
get when() {
|
|
10104
10133
|
return vaultMessage();
|
|
10105
10134
|
},
|
|
10106
10135
|
children: (msg) => (() => {
|
|
10107
|
-
var _el$
|
|
10108
|
-
insert(_el$
|
|
10136
|
+
var _el$205 = _tmpl$39();
|
|
10137
|
+
insert(_el$205, () => msg().text);
|
|
10109
10138
|
createRenderEffect((_p$) => {
|
|
10110
10139
|
var _v$15 = !!(msg().kind === "success"), _v$16 = !!(msg().kind === "error");
|
|
10111
|
-
_v$15 !== _p$.e && _el$
|
|
10112
|
-
_v$16 !== _p$.t && _el$
|
|
10140
|
+
_v$15 !== _p$.e && _el$205.classList.toggle("success", _p$.e = _v$15);
|
|
10141
|
+
_v$16 !== _p$.t && _el$205.classList.toggle("error", _p$.t = _v$16);
|
|
10113
10142
|
return _p$;
|
|
10114
10143
|
}, {
|
|
10115
10144
|
e: void 0,
|
|
10116
10145
|
t: void 0
|
|
10117
10146
|
});
|
|
10118
|
-
return _el$
|
|
10147
|
+
return _el$205;
|
|
10119
10148
|
})()
|
|
10120
10149
|
})];
|
|
10121
10150
|
}
|
|
10122
10151
|
}), null);
|
|
10123
|
-
insert(_el$
|
|
10152
|
+
insert(_el$108, createComponent(Show, {
|
|
10124
10153
|
get when() {
|
|
10125
10154
|
return autofillProfiles().length > 0;
|
|
10126
10155
|
},
|
|
10127
10156
|
get children() {
|
|
10128
|
-
var _el$
|
|
10129
|
-
insert(_el$
|
|
10157
|
+
var _el$111 = _tmpl$5$1();
|
|
10158
|
+
insert(_el$111, createComponent(For, {
|
|
10130
10159
|
get each() {
|
|
10131
10160
|
return autofillProfiles();
|
|
10132
10161
|
},
|
|
10133
10162
|
children: (profile) => (() => {
|
|
10134
|
-
var _el$
|
|
10135
|
-
insert(_el$
|
|
10136
|
-
insert(_el$
|
|
10137
|
-
insert(_el$
|
|
10163
|
+
var _el$206 = _tmpl$42(), _el$207 = _el$206.firstChild, _el$208 = _el$207.firstChild, _el$209 = _el$208.nextSibling, _el$210 = _el$207.nextSibling, _el$211 = _el$210.firstChild, _el$212 = _el$211.nextSibling;
|
|
10164
|
+
insert(_el$208, () => profile.label);
|
|
10165
|
+
insert(_el$209, () => profile.firstName, null);
|
|
10166
|
+
insert(_el$209, (() => {
|
|
10138
10167
|
var _c$2 = memo(() => !!profile.lastName);
|
|
10139
10168
|
return () => _c$2() ? ` ${profile.lastName}` : "";
|
|
10140
10169
|
})(), null);
|
|
10141
|
-
insert(_el$
|
|
10170
|
+
insert(_el$209, (() => {
|
|
10142
10171
|
var _c$3 = memo(() => !!profile.email);
|
|
10143
10172
|
return () => _c$3() ? ` · ${profile.email}` : "";
|
|
10144
10173
|
})(), null);
|
|
10145
|
-
_el$
|
|
10146
|
-
_el$
|
|
10147
|
-
return _el$
|
|
10174
|
+
_el$211.$$click = () => handleAutofillFill(profile.id);
|
|
10175
|
+
_el$212.$$click = () => handleAutofillRemove(profile.id);
|
|
10176
|
+
return _el$206;
|
|
10148
10177
|
})()
|
|
10149
10178
|
}));
|
|
10150
|
-
return _el$
|
|
10179
|
+
return _el$111;
|
|
10151
10180
|
}
|
|
10152
10181
|
}), null);
|
|
10153
|
-
insert(_el$
|
|
10182
|
+
insert(_el$108, createComponent(Show, {
|
|
10154
10183
|
get when() {
|
|
10155
10184
|
return !autofillAdding();
|
|
10156
10185
|
},
|
|
10157
10186
|
get children() {
|
|
10158
|
-
var _el$
|
|
10159
|
-
_el$
|
|
10187
|
+
var _el$112 = _tmpl$19();
|
|
10188
|
+
_el$112.$$click = () => {
|
|
10160
10189
|
setAutofillAdding(true);
|
|
10161
10190
|
setAutofillMessage(null);
|
|
10162
10191
|
};
|
|
10163
|
-
return _el$
|
|
10192
|
+
return _el$112;
|
|
10164
10193
|
}
|
|
10165
10194
|
}), null);
|
|
10166
|
-
insert(_el$
|
|
10195
|
+
insert(_el$108, createComponent(Show, {
|
|
10167
10196
|
get when() {
|
|
10168
10197
|
return autofillAdding();
|
|
10169
10198
|
},
|
|
10170
10199
|
get children() {
|
|
10171
|
-
var _el$
|
|
10172
|
-
_el$
|
|
10173
|
-
setAttribute(_el$
|
|
10174
|
-
_el$
|
|
10175
|
-
_el$
|
|
10176
|
-
_el$
|
|
10177
|
-
setAttribute(_el$
|
|
10178
|
-
_el$
|
|
10179
|
-
_el$
|
|
10180
|
-
_el$
|
|
10181
|
-
_el$
|
|
10182
|
-
_el$
|
|
10183
|
-
_el$
|
|
10184
|
-
_el$
|
|
10185
|
-
_el$
|
|
10186
|
-
_el$
|
|
10187
|
-
_el$
|
|
10200
|
+
var _el$113 = _tmpl$20(), _el$114 = _el$113.firstChild, _el$115 = _el$114.nextSibling, _el$116 = _el$115.firstChild, _el$117 = _el$116.nextSibling, _el$118 = _el$115.nextSibling, _el$119 = _el$118.firstChild, _el$120 = _el$119.nextSibling, _el$121 = _el$118.nextSibling, _el$122 = _el$121.nextSibling, _el$123 = _el$122.nextSibling, _el$124 = _el$123.nextSibling, _el$125 = _el$124.firstChild, _el$126 = _el$125.nextSibling, _el$127 = _el$126.nextSibling, _el$128 = _el$124.nextSibling, _el$129 = _el$128.nextSibling, _el$130 = _el$129.firstChild, _el$131 = _el$130.nextSibling;
|
|
10201
|
+
_el$114.$$input = (e) => setAutofillLabel(e.currentTarget.value);
|
|
10202
|
+
setAttribute(_el$114, "spellcheck", false);
|
|
10203
|
+
_el$116.$$input = (e) => setAutofillFirstName(e.currentTarget.value);
|
|
10204
|
+
_el$117.$$input = (e) => setAutofillLastName(e.currentTarget.value);
|
|
10205
|
+
_el$119.$$input = (e) => setAutofillEmail(e.currentTarget.value);
|
|
10206
|
+
setAttribute(_el$119, "spellcheck", false);
|
|
10207
|
+
_el$120.$$input = (e) => setAutofillPhone(e.currentTarget.value);
|
|
10208
|
+
_el$121.$$input = (e) => setAutofillOrg(e.currentTarget.value);
|
|
10209
|
+
_el$122.$$input = (e) => setAutofillAddr1(e.currentTarget.value);
|
|
10210
|
+
_el$123.$$input = (e) => setAutofillAddr2(e.currentTarget.value);
|
|
10211
|
+
_el$125.$$input = (e) => setAutofillCity(e.currentTarget.value);
|
|
10212
|
+
_el$126.$$input = (e) => setAutofillState(e.currentTarget.value);
|
|
10213
|
+
_el$127.$$input = (e) => setAutofillZip(e.currentTarget.value);
|
|
10214
|
+
_el$128.$$input = (e) => setAutofillCountry(e.currentTarget.value);
|
|
10215
|
+
_el$130.$$click = handleAutofillAdd;
|
|
10216
|
+
_el$131.$$click = () => {
|
|
10188
10217
|
setAutofillAdding(false);
|
|
10189
10218
|
setAutofillLabel("");
|
|
10190
10219
|
setAutofillFirstName("");
|
|
@@ -10199,63 +10228,63 @@ const Settings = () => {
|
|
|
10199
10228
|
setAutofillZip("");
|
|
10200
10229
|
setAutofillCountry("");
|
|
10201
10230
|
};
|
|
10202
|
-
createRenderEffect(() => _el$
|
|
10203
|
-
createRenderEffect(() => _el$
|
|
10204
|
-
createRenderEffect(() => _el$
|
|
10205
|
-
createRenderEffect(() => _el$
|
|
10206
|
-
createRenderEffect(() => _el$
|
|
10207
|
-
createRenderEffect(() => _el$
|
|
10208
|
-
createRenderEffect(() => _el$
|
|
10209
|
-
createRenderEffect(() => _el$
|
|
10210
|
-
createRenderEffect(() => _el$
|
|
10211
|
-
createRenderEffect(() => _el$
|
|
10212
|
-
createRenderEffect(() => _el$
|
|
10213
|
-
createRenderEffect(() => _el$
|
|
10214
|
-
return _el$
|
|
10231
|
+
createRenderEffect(() => _el$114.value = autofillLabel());
|
|
10232
|
+
createRenderEffect(() => _el$116.value = autofillFirstName());
|
|
10233
|
+
createRenderEffect(() => _el$117.value = autofillLastName());
|
|
10234
|
+
createRenderEffect(() => _el$119.value = autofillEmail());
|
|
10235
|
+
createRenderEffect(() => _el$120.value = autofillPhone());
|
|
10236
|
+
createRenderEffect(() => _el$121.value = autofillOrg());
|
|
10237
|
+
createRenderEffect(() => _el$122.value = autofillAddr1());
|
|
10238
|
+
createRenderEffect(() => _el$123.value = autofillAddr2());
|
|
10239
|
+
createRenderEffect(() => _el$125.value = autofillCity());
|
|
10240
|
+
createRenderEffect(() => _el$126.value = autofillState());
|
|
10241
|
+
createRenderEffect(() => _el$127.value = autofillZip());
|
|
10242
|
+
createRenderEffect(() => _el$128.value = autofillCountry());
|
|
10243
|
+
return _el$113;
|
|
10215
10244
|
}
|
|
10216
10245
|
}), null);
|
|
10217
|
-
insert(_el$
|
|
10246
|
+
insert(_el$108, createComponent(Show, {
|
|
10218
10247
|
get when() {
|
|
10219
10248
|
return autofillMessage();
|
|
10220
10249
|
},
|
|
10221
10250
|
children: (msg) => (() => {
|
|
10222
|
-
var _el$
|
|
10223
|
-
insert(_el$
|
|
10251
|
+
var _el$213 = _tmpl$39();
|
|
10252
|
+
insert(_el$213, () => msg().text);
|
|
10224
10253
|
createRenderEffect((_p$) => {
|
|
10225
10254
|
var _v$17 = !!(msg().kind === "success"), _v$18 = !!(msg().kind === "error");
|
|
10226
|
-
_v$17 !== _p$.e && _el$
|
|
10227
|
-
_v$18 !== _p$.t && _el$
|
|
10255
|
+
_v$17 !== _p$.e && _el$213.classList.toggle("success", _p$.e = _v$17);
|
|
10256
|
+
_v$18 !== _p$.t && _el$213.classList.toggle("error", _p$.t = _v$18);
|
|
10228
10257
|
return _p$;
|
|
10229
10258
|
}, {
|
|
10230
10259
|
e: void 0,
|
|
10231
10260
|
t: void 0
|
|
10232
10261
|
});
|
|
10233
|
-
return _el$
|
|
10262
|
+
return _el$213;
|
|
10234
10263
|
})()
|
|
10235
10264
|
}), null);
|
|
10236
|
-
_el$
|
|
10237
|
-
_el$
|
|
10238
|
-
_el$
|
|
10239
|
-
insert(_el$
|
|
10265
|
+
_el$135.$$click = () => setTelemetryEnabled(!telemetryEnabled());
|
|
10266
|
+
_el$139.addEventListener("change", (e) => setTheme(e.currentTarget.value));
|
|
10267
|
+
_el$142.addEventListener("change", (e) => setDomainMode(e.currentTarget.value));
|
|
10268
|
+
insert(_el$140, createComponent(Show, {
|
|
10240
10269
|
get when() {
|
|
10241
10270
|
return domainMode() !== "none";
|
|
10242
10271
|
},
|
|
10243
10272
|
get children() {
|
|
10244
10273
|
return [(() => {
|
|
10245
|
-
var _el$
|
|
10246
|
-
_el$
|
|
10247
|
-
setAttribute(_el$
|
|
10248
|
-
createRenderEffect(() => setAttribute(_el$
|
|
10249
|
-
createRenderEffect(() => _el$
|
|
10250
|
-
return _el$
|
|
10274
|
+
var _el$143 = _tmpl$21();
|
|
10275
|
+
_el$143.$$input = (e) => setDomainList(e.currentTarget.value);
|
|
10276
|
+
setAttribute(_el$143, "spellcheck", false);
|
|
10277
|
+
createRenderEffect(() => setAttribute(_el$143, "placeholder", domainMode() === "allowlist" ? "example.com\napi.example.com" : "ads.example.com\ntracker.io"));
|
|
10278
|
+
createRenderEffect(() => _el$143.value = domainList());
|
|
10279
|
+
return _el$143;
|
|
10251
10280
|
})(), (() => {
|
|
10252
|
-
var _el$
|
|
10253
|
-
insert(_el$
|
|
10254
|
-
return _el$
|
|
10281
|
+
var _el$144 = _tmpl$22();
|
|
10282
|
+
insert(_el$144, () => domainMode() === "allowlist" ? "One domain per line. Subdomains of listed domains are also allowed." : "One domain per line. Subdomains of listed domains are also blocked.");
|
|
10283
|
+
return _el$144;
|
|
10255
10284
|
})()];
|
|
10256
10285
|
}
|
|
10257
10286
|
}), null);
|
|
10258
|
-
insert(_el$
|
|
10287
|
+
insert(_el$140, createComponent(Show, {
|
|
10259
10288
|
get when() {
|
|
10260
10289
|
return domainMode() === "none";
|
|
10261
10290
|
},
|
|
@@ -10263,39 +10292,39 @@ const Settings = () => {
|
|
|
10263
10292
|
return _tmpl$23();
|
|
10264
10293
|
}
|
|
10265
10294
|
}), null);
|
|
10266
|
-
_el$
|
|
10267
|
-
addEventListener(_el$
|
|
10295
|
+
_el$147.$$click = handleSave;
|
|
10296
|
+
addEventListener(_el$148, "click", closeSettings, true);
|
|
10268
10297
|
insert(_el$2, createComponent(Show, {
|
|
10269
10298
|
get when() {
|
|
10270
10299
|
return status();
|
|
10271
10300
|
},
|
|
10272
10301
|
children: (currentStatus) => (() => {
|
|
10273
|
-
var _el$
|
|
10274
|
-
insert(_el$
|
|
10302
|
+
var _el$214 = _tmpl$39();
|
|
10303
|
+
insert(_el$214, () => currentStatus().text);
|
|
10275
10304
|
createRenderEffect((_p$) => {
|
|
10276
10305
|
var _v$19 = !!(currentStatus().kind === "success"), _v$20 = !!(currentStatus().kind === "error");
|
|
10277
|
-
_v$19 !== _p$.e && _el$
|
|
10278
|
-
_v$20 !== _p$.t && _el$
|
|
10306
|
+
_v$19 !== _p$.e && _el$214.classList.toggle("success", _p$.e = _v$19);
|
|
10307
|
+
_v$20 !== _p$.t && _el$214.classList.toggle("error", _p$.t = _v$20);
|
|
10279
10308
|
return _p$;
|
|
10280
10309
|
}, {
|
|
10281
10310
|
e: void 0,
|
|
10282
10311
|
t: void 0
|
|
10283
10312
|
});
|
|
10284
|
-
return _el$
|
|
10313
|
+
return _el$214;
|
|
10285
10314
|
})()
|
|
10286
10315
|
}), null);
|
|
10287
10316
|
createRenderEffect((_p$) => {
|
|
10288
10317
|
var _v$ = !!settingsClosing(), _v$2 = !!autoRestoreSession(), _v$3 = autoRestoreSession(), _v$4 = !!clearBookmarksOnLaunch(), _v$5 = clearBookmarksOnLaunch(), _v$6 = !sessionSaveName().trim(), _v$7 = !!chatEnabled(), _v$8 = chatEnabled(), _v$9 = !!telemetryEnabled(), _v$0 = telemetryEnabled();
|
|
10289
10318
|
_v$ !== _p$.e && _el$.classList.toggle("closing", _p$.e = _v$);
|
|
10290
|
-
_v$2 !== _p$.t && _el$
|
|
10291
|
-
_v$3 !== _p$.a && setAttribute(_el$
|
|
10292
|
-
_v$4 !== _p$.o && _el$
|
|
10293
|
-
_v$5 !== _p$.i && setAttribute(_el$
|
|
10294
|
-
_v$6 !== _p$.n && (_el$
|
|
10295
|
-
_v$7 !== _p$.s && _el$
|
|
10296
|
-
_v$8 !== _p$.h && setAttribute(_el$
|
|
10297
|
-
_v$9 !== _p$.r && _el$
|
|
10298
|
-
_v$0 !== _p$.d && setAttribute(_el$
|
|
10319
|
+
_v$2 !== _p$.t && _el$43.classList.toggle("on", _p$.t = _v$2);
|
|
10320
|
+
_v$3 !== _p$.a && setAttribute(_el$43, "aria-checked", _p$.a = _v$3);
|
|
10321
|
+
_v$4 !== _p$.o && _el$46.classList.toggle("on", _p$.o = _v$4);
|
|
10322
|
+
_v$5 !== _p$.i && setAttribute(_el$46, "aria-checked", _p$.i = _v$5);
|
|
10323
|
+
_v$6 !== _p$.n && (_el$53.disabled = _p$.n = _v$6);
|
|
10324
|
+
_v$7 !== _p$.s && _el$58.classList.toggle("on", _p$.s = _v$7);
|
|
10325
|
+
_v$8 !== _p$.h && setAttribute(_el$58, "aria-checked", _p$.h = _v$8);
|
|
10326
|
+
_v$9 !== _p$.r && _el$135.classList.toggle("on", _p$.r = _v$9);
|
|
10327
|
+
_v$0 !== _p$.d && setAttribute(_el$135, "aria-checked", _p$.d = _v$0);
|
|
10299
10328
|
return _p$;
|
|
10300
10329
|
}, {
|
|
10301
10330
|
e: void 0,
|
|
@@ -10310,13 +10339,14 @@ const Settings = () => {
|
|
|
10310
10339
|
d: void 0
|
|
10311
10340
|
});
|
|
10312
10341
|
createRenderEffect(() => _el$20.value = defaultUrl());
|
|
10313
|
-
createRenderEffect(() => _el$23.value =
|
|
10314
|
-
createRenderEffect(() => _el$
|
|
10315
|
-
createRenderEffect(() => _el$
|
|
10316
|
-
createRenderEffect(() => _el$
|
|
10317
|
-
createRenderEffect(() => _el$
|
|
10318
|
-
createRenderEffect(() => _el$
|
|
10319
|
-
createRenderEffect(() => _el$
|
|
10342
|
+
createRenderEffect(() => _el$23.value = defaultSearchEngine());
|
|
10343
|
+
createRenderEffect(() => _el$27.value = downloadPath());
|
|
10344
|
+
createRenderEffect(() => _el$30.value = mcpPort());
|
|
10345
|
+
createRenderEffect(() => _el$37.value = obsidianVaultPath());
|
|
10346
|
+
createRenderEffect(() => _el$40.value = agentTranscriptMode());
|
|
10347
|
+
createRenderEffect(() => _el$52.value = sessionSaveName());
|
|
10348
|
+
createRenderEffect(() => _el$139.value = theme());
|
|
10349
|
+
createRenderEffect(() => _el$142.value = domainMode());
|
|
10320
10350
|
return _el$;
|
|
10321
10351
|
})(), _tmpl$25()];
|
|
10322
10352
|
}
|