@quanta-intellect/vessel-browser 0.1.46 → 0.1.48

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.
@@ -3184,10 +3184,10 @@ function vesselExtractContent() {
3184
3184
  elementIndex = 0;
3185
3185
  activeOverlays = [];
3186
3186
  Object.keys(elementSelectors).forEach(
3187
- (key) => delete elementSelectors[key]
3187
+ (key) => delete elementSelectors[Number(key)]
3188
3188
  );
3189
3189
  Object.keys(indexedElementRefs).forEach(
3190
- (key) => delete indexedElementRefs[key]
3190
+ (key) => delete indexedElementRefs[Number(key)]
3191
3191
  );
3192
3192
  const documentClone = document.cloneNode(true);
3193
3193
  const reader = new readabilityExports.Readability(documentClone);
@@ -7096,6 +7096,106 @@ const DevToolsPanel = () => {
7096
7096
  })();
7097
7097
  };
7098
7098
  delegateEvents(["click", "input"]);
7099
+ const PROVIDERS = {
7100
+ anthropic: {
7101
+ id: "anthropic",
7102
+ name: "Anthropic",
7103
+ defaultModel: "claude-sonnet-4-20250514",
7104
+ models: [
7105
+ "claude-sonnet-4-20250514",
7106
+ "claude-opus-4-20250514",
7107
+ "claude-haiku-4-20250506"
7108
+ ],
7109
+ requiresApiKey: true,
7110
+ apiKeyPlaceholder: "sk-ant-...",
7111
+ apiKeyHint: "Get your key from console.anthropic.com"
7112
+ },
7113
+ openai: {
7114
+ id: "openai",
7115
+ name: "OpenAI",
7116
+ defaultModel: "gpt-4o",
7117
+ models: ["gpt-4o", "gpt-4o-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "o3-mini"],
7118
+ requiresApiKey: true,
7119
+ apiKeyPlaceholder: "sk-...",
7120
+ apiKeyHint: "Get your key from platform.openai.com"
7121
+ },
7122
+ openrouter: {
7123
+ id: "openrouter",
7124
+ name: "OpenRouter",
7125
+ defaultModel: "anthropic/claude-sonnet-4",
7126
+ models: [
7127
+ "anthropic/claude-sonnet-4",
7128
+ "anthropic/claude-haiku-4",
7129
+ "openai/gpt-4o",
7130
+ "google/gemini-2.5-pro",
7131
+ "mistralai/mistral-large-latest"
7132
+ ],
7133
+ requiresApiKey: true,
7134
+ defaultBaseUrl: "https://openrouter.ai/api/v1",
7135
+ apiKeyPlaceholder: "sk-or-...",
7136
+ apiKeyHint: "Get your key from openrouter.ai/keys"
7137
+ },
7138
+ ollama: {
7139
+ id: "ollama",
7140
+ name: "Ollama (Local)",
7141
+ defaultModel: "llama3.1",
7142
+ models: ["llama3.1", "llama3.2", "mistral", "gemma2", "qwen2.5", "phi3"],
7143
+ requiresApiKey: false,
7144
+ defaultBaseUrl: "http://localhost:11434/v1",
7145
+ apiKeyPlaceholder: "",
7146
+ apiKeyHint: "No API key needed — runs locally via Ollama"
7147
+ },
7148
+ llama_cpp: {
7149
+ id: "llama_cpp",
7150
+ name: "llama.cpp (Local)",
7151
+ defaultModel: "",
7152
+ models: [],
7153
+ requiresApiKey: false,
7154
+ defaultBaseUrl: "http://localhost:8080/v1",
7155
+ apiKeyPlaceholder: "",
7156
+ apiKeyHint: "No API key needed — scans the active llama-server model on localhost:8080"
7157
+ },
7158
+ mistral: {
7159
+ id: "mistral",
7160
+ name: "Mistral AI",
7161
+ defaultModel: "mistral-large-latest",
7162
+ models: ["mistral-large-latest", "mistral-medium-latest", "mistral-small-latest", "codestral-latest"],
7163
+ requiresApiKey: true,
7164
+ defaultBaseUrl: "https://api.mistral.ai/v1",
7165
+ apiKeyPlaceholder: "sk-...",
7166
+ apiKeyHint: "Get your key from console.mistral.ai"
7167
+ },
7168
+ xai: {
7169
+ id: "xai",
7170
+ name: "xAI (Grok)",
7171
+ defaultModel: "grok-3",
7172
+ models: ["grok-3", "grok-3-mini", "grok-2"],
7173
+ requiresApiKey: true,
7174
+ defaultBaseUrl: "https://api.x.ai/v1",
7175
+ apiKeyPlaceholder: "xai-...",
7176
+ apiKeyHint: "Get your key from console.x.ai"
7177
+ },
7178
+ google: {
7179
+ id: "google",
7180
+ name: "Google Gemini",
7181
+ defaultModel: "gemini-2.5-pro",
7182
+ models: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.0-flash"],
7183
+ requiresApiKey: true,
7184
+ defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
7185
+ apiKeyPlaceholder: "AI...",
7186
+ apiKeyHint: "Get your key from aistudio.google.com"
7187
+ },
7188
+ custom: {
7189
+ id: "custom",
7190
+ name: "Custom (OpenAI-Compatible)",
7191
+ defaultModel: "",
7192
+ models: [],
7193
+ requiresApiKey: false,
7194
+ defaultBaseUrl: "http://localhost:8080/v1",
7195
+ apiKeyPlaceholder: "Bearer token or API key",
7196
+ apiKeyHint: "Optional — only if your endpoint requires authentication"
7197
+ }
7198
+ };
7099
7199
  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>&times;</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=settings-field><label class=settings-label for=chat-provider>Provider</label><select id=chat-provider class="settings-input settings-select">`), _tmpl$6$1 = /* @__PURE__ */ template(`<span class=settings-label-optional> (optional)`), _tmpl$7 = /* @__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$8 = /* @__PURE__ */ template(`<p class=settings-hint>If your endpoint requires authentication, enter the API key or bearer token here.`), _tmpl$9 = /* @__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$0 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$1 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$10 = /* @__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$11 = /* @__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$12 = /* @__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$13 = /* @__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$14 = /* @__PURE__ */ template(`<span class=vault-premium-badge>Premium`), _tmpl$15 = /* @__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$16 = /* @__PURE__ */ template(`<div class=vault-entries>`), _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(`<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=mcp-port>MCP Port</label><input id=mcp-port class=settings-input placeholder=3100><p class=settings-hint>External harnesses connect to Vessel at <code>http://127.0.0.1:&lt;port&gt;/mcp</code>. Changing this value restarts the MCP server immediately.</p></div><div class=settings-field><label class=settings-label for=max-tool-iterations>Max Tool Iterations</label><p class=settings-hint></p></div><div class=settings-field><label class=settings-label for=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-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-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-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$20 = /* @__PURE__ */ template(`<style>
7100
7200
  .settings-panel {
7101
7201
  width: min(440px, calc(100vw - 32px));
@@ -7631,81 +7731,16 @@ var _tmpl$$2 = /* @__PURE__ */ template(`<div class=welcome-banner-actions><butt
7631
7731
  margin-top: 4px;
7632
7732
  }
7633
7733
  `), _tmpl$21 = /* @__PURE__ */ template(`<div class="settings-input settings-input-disabled"title="Upgrade to Vessel Premium for unlimited tool iterations">50`), _tmpl$22 = /* @__PURE__ */ template(`<div class=settings-health-issues>`), _tmpl$23 = /* @__PURE__ */ template(`<div class=settings-health><div class=settings-callout-title>Runtime Health</div><p class=settings-hint>MCP status: <strong></strong> `), _tmpl$24 = /* @__PURE__ */ template(`<p class=settings-hint>Active endpoint: <code>`), _tmpl$25 = /* @__PURE__ */ template(`<div class=settings-health-issue><strong></strong><div>`), _tmpl$26 = /* @__PURE__ */ template(`<div>`), _tmpl$27 = /* @__PURE__ */ template(`<option>`), _tmpl$28 = /* @__PURE__ */ template(`<input id=chat-model class=settings-input style=flex:1>`), _tmpl$29 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--accent-primary)>`), _tmpl$30 = /* @__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$31 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$32 = /* @__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$33 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$34 = /* @__PURE__ */ template(`<p class=settings-hint>Securely store credentials for agent-driven logins. Upgrade to Premium to unlock the Agent Credential Vault.`), _tmpl$35 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; </span></div><button class=vault-entry-remove title="Remove credential">&times;`);
7634
- const CHAT_PROVIDERS = [{
7635
- id: "anthropic",
7636
- name: "Anthropic",
7637
- requiresKey: true,
7638
- needsBaseUrl: false,
7639
- keyPlaceholder: "sk-ant-...",
7640
- defaultModel: "claude-sonnet-4-20250514",
7641
- models: ["claude-sonnet-4-20250514", "claude-opus-4-20250514", "claude-haiku-4-20250506"]
7642
- }, {
7643
- id: "openai",
7644
- name: "OpenAI",
7645
- requiresKey: true,
7646
- needsBaseUrl: false,
7647
- keyPlaceholder: "sk-...",
7648
- defaultModel: "gpt-4o",
7649
- models: ["gpt-4o", "gpt-4o-mini", "gpt-4.1", "gpt-4.1-mini", "o3-mini"]
7650
- }, {
7651
- id: "openrouter",
7652
- name: "OpenRouter",
7653
- requiresKey: true,
7654
- needsBaseUrl: false,
7655
- keyPlaceholder: "sk-or-...",
7656
- defaultModel: "anthropic/claude-sonnet-4",
7657
- models: ["anthropic/claude-sonnet-4", "openai/gpt-4o", "google/gemini-2.5-pro"]
7658
- }, {
7659
- id: "ollama",
7660
- name: "Ollama (Local)",
7661
- requiresKey: false,
7662
- needsBaseUrl: false,
7663
- keyPlaceholder: "",
7664
- defaultModel: "",
7665
- models: []
7666
- }, {
7667
- id: "llama_cpp",
7668
- name: "llama.cpp (Local)",
7669
- requiresKey: false,
7670
- needsBaseUrl: true,
7671
- defaultBaseUrl: "http://localhost:8080/v1",
7672
- keyPlaceholder: "",
7673
- defaultModel: "",
7674
- models: []
7675
- }, {
7676
- id: "mistral",
7677
- name: "Mistral AI",
7678
- requiresKey: true,
7679
- needsBaseUrl: false,
7680
- keyPlaceholder: "sk-...",
7681
- defaultModel: "mistral-large-latest",
7682
- models: ["mistral-large-latest", "mistral-small-latest", "codestral-latest"]
7683
- }, {
7684
- id: "xai",
7685
- name: "xAI (Grok)",
7686
- requiresKey: true,
7687
- needsBaseUrl: false,
7688
- keyPlaceholder: "xai-...",
7689
- defaultModel: "grok-3",
7690
- models: ["grok-3", "grok-3-mini"]
7691
- }, {
7692
- id: "google",
7693
- name: "Google Gemini",
7694
- requiresKey: true,
7695
- needsBaseUrl: false,
7696
- keyPlaceholder: "AI...",
7697
- defaultModel: "gemini-2.5-pro",
7698
- models: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.0-flash"]
7699
- }, {
7700
- id: "custom",
7701
- name: "Custom (OAI-Compatible)",
7702
- requiresKey: false,
7703
- needsBaseUrl: true,
7704
- defaultBaseUrl: "http://localhost:8080/v1",
7705
- keyPlaceholder: "Bearer token or API key",
7706
- defaultModel: "",
7707
- models: []
7708
- }];
7734
+ const CHAT_PROVIDERS = Object.values(PROVIDERS).map((p) => ({
7735
+ id: p.id,
7736
+ name: p.name,
7737
+ requiresKey: p.requiresApiKey,
7738
+ needsBaseUrl: p.id === "llama_cpp" || p.id === "custom",
7739
+ defaultBaseUrl: p.defaultBaseUrl,
7740
+ keyPlaceholder: p.apiKeyPlaceholder,
7741
+ defaultModel: p.defaultModel,
7742
+ models: p.models
7743
+ }));
7709
7744
  const Settings = () => {
7710
7745
  const {
7711
7746
  settingsOpen: settingsOpen2,
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:;" />
7
7
  <title>Vessel</title>
8
- <script type="module" crossorigin src="./assets/index-Do7e0spR.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-hRUKGdgt.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="./assets/index-eS3ccAls.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@quanta-intellect/vessel-browser",
3
3
  "mcpName": "io.github.unmodeled-tyler/vessel-browser",
4
- "version": "0.1.46",
4
+ "version": "0.1.48",
5
5
  "description": "AI-native web browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {
@@ -16,7 +16,7 @@
16
16
  "README.md"
17
17
  ],
18
18
  "scripts": {
19
- "dev": "ELECTRON_DISABLE_SANDBOX=1 electron-vite dev",
19
+ "dev": "env -u ELECTRON_RUN_AS_NODE ELECTRON_DISABLE_SANDBOX=1 electron-vite dev",
20
20
  "build": "electron-vite build",
21
21
  "build:icon:mac": "scripts/build-macos-icon.sh",
22
22
  "dist": "npm run build && electron-builder --config electron-builder.config.cjs --linux --publish never",
@@ -26,7 +26,7 @@
26
26
  "dist:mac:dir": "npm run build:icon:mac && npm run build && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --config electron-builder.config.cjs --mac dir --publish never",
27
27
  "dist:mac:signed": "npm run build:icon:mac && npm run build && electron-builder --config electron-builder.config.cjs --mac dmg zip --publish never",
28
28
  "dist:mac:dir:signed": "npm run build:icon:mac && npm run build && electron-builder --config electron-builder.config.cjs --mac dir --publish never",
29
- "preview": "electron-vite preview",
29
+ "preview": "env -u ELECTRON_RUN_AS_NODE electron-vite preview",
30
30
  "typecheck": "tsc --noEmit",
31
31
  "prepublishOnly": "npm run build",
32
32
  "test:navigation-regression": "env -u ELECTRON_RUN_AS_NODE ELECTRON_DISABLE_SANDBOX=1 electron --no-sandbox --disable-setuid-sandbox scripts/run-navigation-regression.mjs",
@@ -65,6 +65,7 @@
65
65
  "electron": "^40.8.3",
66
66
  "electron-builder": "^26.8.1",
67
67
  "electron-vite": "^5.0.0",
68
+ "lucide-solid": "^1.7.0",
68
69
  "solid-js": "^1.9.11",
69
70
  "tsx": "^4.21.0",
70
71
  "typescript": "^5.9.3",
@@ -75,8 +76,6 @@
75
76
  "@modelcontextprotocol/sdk": "^1.27.1",
76
77
  "@mozilla/readability": "^0.6.0",
77
78
  "dompurify": "^3.3.3",
78
- "linkedom": "^0.18.12",
79
- "lucide-solid": "^1.7.0",
80
79
  "openai": "^6.32.0",
81
80
  "zod": "^4.3.6"
82
81
  }