@quanta-intellect/vessel-browser 0.1.13 → 0.1.14

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.
@@ -2805,15 +2805,15 @@ function isTableBlock(text2) {
2805
2805
  const lines = text2.split("\n").filter((l) => l.trim());
2806
2806
  if (lines.length < 2) return false;
2807
2807
  const hasPipes = lines.every((l) => l.trim().includes("|"));
2808
- const hasSeparator = lines.some((l) => /^\|?\s*[-:]+[-|\s:]*$/.test(l.trim()));
2808
+ const hasSeparator = lines.some(
2809
+ (l) => /^\|?\s*[-:]+[-|\s:]*$/.test(l.trim())
2810
+ );
2809
2811
  return hasPipes && hasSeparator;
2810
2812
  }
2811
2813
  function renderTable(block) {
2812
2814
  const lines = block.split("\n").map((l) => l.trim()).filter(Boolean);
2813
2815
  const parseRow = (line) => line.replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
2814
- const sepIndex = lines.findIndex(
2815
- (l) => /^\|?\s*[-:]+[-|\s:]*$/.test(l)
2816
- );
2816
+ const sepIndex = lines.findIndex((l) => /^\|?\s*[-:]+[-|\s:]*$/.test(l));
2817
2817
  const headerRows = sepIndex > 0 ? lines.slice(0, sepIndex) : [lines[0]];
2818
2818
  const bodyRows = lines.slice(sepIndex + 1);
2819
2819
  const sepCells = sepIndex >= 0 ? parseRow(lines[sepIndex]) : [];
@@ -2828,10 +2828,14 @@ function renderTable(block) {
2828
2828
  return align && align !== "left" ? ` style="text-align:${align}"` : "";
2829
2829
  };
2830
2830
  const thead = headerRows.map(
2831
- (row) => `<tr>${parseRow(row).map((cell, i) => `<th${alignAttr(i)}>${applyInlineMarkdown(cell)}</th>`).join("")}</tr>`
2831
+ (row) => `<tr>${parseRow(row).map(
2832
+ (cell, i) => `<th${alignAttr(i)}>${applyInlineMarkdown(cell)}</th>`
2833
+ ).join("")}</tr>`
2832
2834
  ).join("");
2833
2835
  const tbody = bodyRows.map(
2834
- (row) => `<tr>${parseRow(row).map((cell, i) => `<td${alignAttr(i)}>${applyInlineMarkdown(cell)}</td>`).join("")}</tr>`
2836
+ (row) => `<tr>${parseRow(row).map(
2837
+ (cell, i) => `<td${alignAttr(i)}>${applyInlineMarkdown(cell)}</td>`
2838
+ ).join("")}</tr>`
2835
2839
  ).join("");
2836
2840
  return `<table><thead>${thead}</thead><tbody>${tbody}</tbody></table>`;
2837
2841
  }
@@ -2877,9 +2881,11 @@ function renderBlock(block) {
2877
2881
  const tableBlock = tableEndIdx > 0 ? tableLines.slice(0, tableEndIdx).join("\n") : tableLines.join("\n");
2878
2882
  const afterTable = tableEndIdx > 0 ? tableLines.slice(tableEndIdx).join("\n").trim() : "";
2879
2883
  let result = "";
2880
- if (beforeTable) result += `<p>${applyInlineMarkdown(beforeTable).replace(/\n/g, "<br>")}</p>`;
2884
+ if (beforeTable)
2885
+ result += `<p>${applyInlineMarkdown(beforeTable).replace(/\n/g, "<br>")}</p>`;
2881
2886
  result += renderTable(tableBlock);
2882
- if (afterTable) result += `<p>${applyInlineMarkdown(afterTable).replace(/\n/g, "<br>")}</p>`;
2887
+ if (afterTable)
2888
+ result += `<p>${applyInlineMarkdown(afterTable).replace(/\n/g, "<br>")}</p>`;
2883
2889
  return result;
2884
2890
  }
2885
2891
  if (trimmed.split("\n").every((line) => /^[-*+]\s+/.test(line))) {
@@ -2916,6 +2922,7 @@ const TOOL_ICONS = {
2916
2922
  flow_status: "◈",
2917
2923
  flow_end: "■",
2918
2924
  dismiss_popup: "✕",
2925
+ clear_overlays: "✕",
2919
2926
  wait_for: "◴",
2920
2927
  create_tab: "+",
2921
2928
  switch_tab: "⇥",
@@ -4529,7 +4536,7 @@ const DevToolsPanel = () => {
4529
4536
  })();
4530
4537
  };
4531
4538
  delegateEvents(["click", "input"]);
4532
- var _tmpl$$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$2$1 = /* @__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$3 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$4 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$5 = /* @__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$6 = /* @__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$7 = /* @__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=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><input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200><p class=settings-hint>Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000.</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-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$8 = /* @__PURE__ */ template(`<style>
4539
+ var _tmpl$$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$2$1 = /* @__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$3 = /* @__PURE__ */ template(`<select id=chat-model class="settings-input settings-select"style=flex:1>`), _tmpl$4 = /* @__PURE__ */ template(`<p class=settings-hint style=color:var(--error)>Could not fetch models — check your API key and connection.`), _tmpl$5 = /* @__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$6 = /* @__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$7 = /* @__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><input id=max-tool-iterations class=settings-input type=number min=10 max=1000 placeholder=200><p class=settings-hint>Maximum number of tool calls the AI agent can make per conversation turn before pausing. Higher values let the agent complete longer multi-step workflows without stopping. Range: 10–1000.</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-actions><button class=settings-save>Save</button><button class=settings-close>Close`), _tmpl$8 = /* @__PURE__ */ template(`<style>
4533
4540
  .settings-panel {
4534
4541
  width: min(440px, calc(100vw - 32px));
4535
4542
  max-height: calc(100vh - 48px);
@@ -4833,6 +4840,7 @@ const Settings = () => {
4833
4840
  const [maxToolIterations, setMaxToolIterations] = createSignal("200");
4834
4841
  const [agentTranscriptMode, setAgentTranscriptMode] = createSignal("summary");
4835
4842
  const [health, setHealth] = createSignal(null);
4843
+ const [defaultUrl, setDefaultUrl] = createSignal("https://start.duckduckgo.com");
4836
4844
  const [status, setStatus] = createSignal(null);
4837
4845
  const [chatEnabled, setChatEnabled] = createSignal(false);
4838
4846
  const [chatProviderId, setChatProviderId] = createSignal("anthropic");
@@ -4890,6 +4898,7 @@ const Settings = () => {
4890
4898
  const loadState = async () => {
4891
4899
  const settings = await window.vessel.settings.get();
4892
4900
  const runtimeHealth = await window.vessel.settings.getHealth();
4901
+ setDefaultUrl(settings.defaultUrl ?? "https://start.duckduckgo.com");
4893
4902
  setAutoRestoreSession(settings.autoRestoreSession ?? true);
4894
4903
  setClearBookmarksOnLaunch(settings.clearBookmarksOnLaunch ?? false);
4895
4904
  setObsidianVaultPath(settings.obsidianVaultPath ?? "");
@@ -4924,6 +4933,7 @@ const Settings = () => {
4924
4933
  });
4925
4934
  return;
4926
4935
  }
4936
+ await window.vessel.settings.set("defaultUrl", defaultUrl().trim() || "https://start.duckduckgo.com");
4927
4937
  await window.vessel.settings.set("autoRestoreSession", autoRestoreSession());
4928
4938
  await window.vessel.settings.set("clearBookmarksOnLaunch", clearBookmarksOnLaunch());
4929
4939
  await window.vessel.settings.set("obsidianVaultPath", obsidianVaultPath());
@@ -4959,83 +4969,85 @@ const Settings = () => {
4959
4969
  },
4960
4970
  get children() {
4961
4971
  return [(() => {
4962
- var _el$ = _tmpl$7(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$5.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$8.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$12.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.firstChild, _el$21 = _el$18.nextSibling, _el$22 = _el$21.nextSibling, _el$23 = _el$22.firstChild, _el$24 = _el$23.firstChild, _el$40 = _el$22.nextSibling, _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling;
4972
+ var _el$ = _tmpl$7(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling, _el$8 = _el$5.nextSibling, _el$9 = _el$8.firstChild, _el$0 = _el$9.nextSibling, _el$1 = _el$8.nextSibling, _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$1.nextSibling, _el$13 = _el$12.firstChild, _el$14 = _el$13.nextSibling, _el$15 = _el$12.nextSibling, _el$16 = _el$15.firstChild, _el$17 = _el$16.nextSibling, _el$18 = _el$15.nextSibling, _el$19 = _el$18.firstChild, _el$20 = _el$19.firstChild, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild, _el$23 = _el$22.firstChild, _el$24 = _el$21.nextSibling, _el$25 = _el$24.nextSibling, _el$26 = _el$25.firstChild, _el$27 = _el$26.firstChild, _el$43 = _el$25.nextSibling, _el$44 = _el$43.firstChild, _el$45 = _el$44.nextSibling;
4963
4973
  addEventListener(_el$, "click", closeSettings);
4964
4974
  _el$2.$$keydown = handleKeyDown;
4965
4975
  _el$2.$$click = (e) => e.stopPropagation();
4966
- _el$7.$$input = (e) => setMcpPort(e.currentTarget.value);
4976
+ _el$7.$$input = (e) => setDefaultUrl(e.currentTarget.value);
4967
4977
  setAttribute(_el$7, "spellcheck", false);
4968
- _el$0.$$input = (e) => setMaxToolIterations(e.currentTarget.value);
4978
+ _el$0.$$input = (e) => setMcpPort(e.currentTarget.value);
4979
+ setAttribute(_el$0, "spellcheck", false);
4980
+ _el$11.$$input = (e) => setMaxToolIterations(e.currentTarget.value);
4969
4981
  insert(_el$2, createComponent(Show, {
4970
4982
  get when() {
4971
4983
  return health();
4972
4984
  },
4973
4985
  children: (currentHealth) => (() => {
4974
- var _el$44 = _tmpl$0(), _el$45 = _el$44.firstChild, _el$46 = _el$45.nextSibling, _el$47 = _el$46.firstChild, _el$49 = _el$47.nextSibling;
4975
- _el$49.nextSibling;
4976
- insert(_el$49, () => currentHealth().mcp.status);
4977
- insert(_el$46, () => currentHealth().mcp.message, null);
4978
- insert(_el$44, createComponent(Show, {
4986
+ var _el$47 = _tmpl$0(), _el$48 = _el$47.firstChild, _el$49 = _el$48.nextSibling, _el$50 = _el$49.firstChild, _el$52 = _el$50.nextSibling;
4987
+ _el$52.nextSibling;
4988
+ insert(_el$52, () => currentHealth().mcp.status);
4989
+ insert(_el$49, () => currentHealth().mcp.message, null);
4990
+ insert(_el$47, createComponent(Show, {
4979
4991
  get when() {
4980
4992
  return currentHealth().mcp.endpoint;
4981
4993
  },
4982
4994
  children: (endpoint) => (() => {
4983
- var _el$52 = _tmpl$1(), _el$53 = _el$52.firstChild, _el$54 = _el$53.nextSibling;
4984
- insert(_el$54, endpoint);
4985
- return _el$52;
4995
+ var _el$55 = _tmpl$1(), _el$56 = _el$55.firstChild, _el$57 = _el$56.nextSibling;
4996
+ insert(_el$57, endpoint);
4997
+ return _el$55;
4986
4998
  })()
4987
4999
  }), null);
4988
- insert(_el$44, createComponent(Show, {
5000
+ insert(_el$47, createComponent(Show, {
4989
5001
  get when() {
4990
5002
  return currentHealth().startupIssues.length > 0;
4991
5003
  },
4992
5004
  get children() {
4993
- var _el$51 = _tmpl$9();
4994
- insert(_el$51, () => currentHealth().startupIssues.map((issue) => (() => {
4995
- var _el$55 = _tmpl$10(), _el$56 = _el$55.firstChild, _el$57 = _el$56.nextSibling;
4996
- insert(_el$56, () => issue.title);
4997
- insert(_el$57, () => issue.detail);
4998
- insert(_el$55, createComponent(Show, {
5005
+ var _el$54 = _tmpl$9();
5006
+ insert(_el$54, () => currentHealth().startupIssues.map((issue) => (() => {
5007
+ var _el$58 = _tmpl$10(), _el$59 = _el$58.firstChild, _el$60 = _el$59.nextSibling;
5008
+ insert(_el$59, () => issue.title);
5009
+ insert(_el$60, () => issue.detail);
5010
+ insert(_el$58, createComponent(Show, {
4999
5011
  get when() {
5000
5012
  return issue.action;
5001
5013
  },
5002
5014
  children: (action) => (() => {
5003
- var _el$58 = _tmpl$11();
5004
- insert(_el$58, action);
5005
- return _el$58;
5015
+ var _el$61 = _tmpl$11();
5016
+ insert(_el$61, action);
5017
+ return _el$61;
5006
5018
  })()
5007
5019
  }), null);
5008
5020
  createRenderEffect((_p$) => {
5009
5021
  var _v$7 = !!(issue.severity === "warning"), _v$8 = !!(issue.severity === "error");
5010
- _v$7 !== _p$.e && _el$55.classList.toggle("warning", _p$.e = _v$7);
5011
- _v$8 !== _p$.t && _el$55.classList.toggle("error", _p$.t = _v$8);
5022
+ _v$7 !== _p$.e && _el$58.classList.toggle("warning", _p$.e = _v$7);
5023
+ _v$8 !== _p$.t && _el$58.classList.toggle("error", _p$.t = _v$8);
5012
5024
  return _p$;
5013
5025
  }, {
5014
5026
  e: void 0,
5015
5027
  t: void 0
5016
5028
  });
5017
- return _el$55;
5029
+ return _el$58;
5018
5030
  })()));
5019
- return _el$51;
5031
+ return _el$54;
5020
5032
  }
5021
5033
  }), null);
5022
- return _el$44;
5034
+ return _el$47;
5023
5035
  })()
5024
- }), _el$1);
5025
- _el$11.$$input = (e) => setObsidianVaultPath(e.currentTarget.value);
5026
- setAttribute(_el$11, "spellcheck", false);
5027
- _el$14.addEventListener("change", (e) => setAgentTranscriptMode(e.currentTarget.value));
5028
- _el$17.$$click = () => setAutoRestoreSession(!autoRestoreSession());
5029
- _el$20.$$click = () => setClearBookmarksOnLaunch(!clearBookmarksOnLaunch());
5030
- _el$24.$$click = () => setChatEnabled(!chatEnabled());
5036
+ }), _el$12);
5037
+ _el$14.$$input = (e) => setObsidianVaultPath(e.currentTarget.value);
5038
+ setAttribute(_el$14, "spellcheck", false);
5039
+ _el$17.addEventListener("change", (e) => setAgentTranscriptMode(e.currentTarget.value));
5040
+ _el$20.$$click = () => setAutoRestoreSession(!autoRestoreSession());
5041
+ _el$23.$$click = () => setClearBookmarksOnLaunch(!clearBookmarksOnLaunch());
5042
+ _el$27.$$click = () => setChatEnabled(!chatEnabled());
5031
5043
  insert(_el$2, createComponent(Show, {
5032
5044
  get when() {
5033
5045
  return chatEnabled();
5034
5046
  },
5035
5047
  get children() {
5036
5048
  return [(() => {
5037
- var _el$25 = _tmpl$$1(), _el$26 = _el$25.firstChild, _el$27 = _el$26.nextSibling;
5038
- _el$27.addEventListener("change", (e) => {
5049
+ var _el$28 = _tmpl$$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling;
5050
+ _el$30.addEventListener("change", (e) => {
5039
5051
  const id = e.currentTarget.value;
5040
5052
  setChatProviderId(id);
5041
5053
  setChatModel("");
@@ -5044,65 +5056,65 @@ const Settings = () => {
5044
5056
  setProviderModels([]);
5045
5057
  setModelFetchState("idle");
5046
5058
  });
5047
- insert(_el$27, createComponent(For, {
5059
+ insert(_el$30, createComponent(For, {
5048
5060
  each: CHAT_PROVIDERS,
5049
5061
  children: (p) => (() => {
5050
- var _el$59 = _tmpl$12();
5051
- insert(_el$59, () => p.name);
5052
- createRenderEffect(() => _el$59.value = p.id);
5053
- return _el$59;
5062
+ var _el$62 = _tmpl$12();
5063
+ insert(_el$62, () => p.name);
5064
+ createRenderEffect(() => _el$62.value = p.id);
5065
+ return _el$62;
5054
5066
  })()
5055
5067
  }));
5056
- createRenderEffect(() => _el$27.value = chatProviderId());
5057
- return _el$25;
5068
+ createRenderEffect(() => _el$30.value = chatProviderId());
5069
+ return _el$28;
5058
5070
  })(), createComponent(Show, {
5059
5071
  get when() {
5060
5072
  return chatProviderMeta().requiresKey;
5061
5073
  },
5062
5074
  get children() {
5063
- var _el$28 = _tmpl$2$1(), _el$29 = _el$28.firstChild, _el$30 = _el$29.nextSibling;
5064
- _el$30.$$input = (e) => setChatApiKey(e.currentTarget.value);
5065
- setAttribute(_el$30, "spellcheck", false);
5066
- createRenderEffect(() => setAttribute(_el$30, "placeholder", chatProviderMeta().keyPlaceholder));
5067
- createRenderEffect(() => _el$30.value = chatApiKey());
5068
- return _el$28;
5075
+ var _el$31 = _tmpl$2$1(), _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling;
5076
+ _el$33.$$input = (e) => setChatApiKey(e.currentTarget.value);
5077
+ setAttribute(_el$33, "spellcheck", false);
5078
+ createRenderEffect(() => setAttribute(_el$33, "placeholder", chatProviderMeta().keyPlaceholder));
5079
+ createRenderEffect(() => _el$33.value = chatApiKey());
5080
+ return _el$31;
5069
5081
  }
5070
5082
  }), (() => {
5071
- var _el$31 = _tmpl$5(), _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$35 = _el$33.firstChild;
5072
- insert(_el$33, createComponent(Show, {
5083
+ var _el$34 = _tmpl$5(), _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling, _el$38 = _el$36.firstChild;
5084
+ insert(_el$36, createComponent(Show, {
5073
5085
  get when() {
5074
5086
  return providerModels().length > 0;
5075
5087
  },
5076
5088
  get fallback() {
5077
5089
  return (() => {
5078
- var _el$60 = _tmpl$13();
5079
- _el$60.$$input = (e) => setChatModel(e.currentTarget.value);
5080
- setAttribute(_el$60, "spellcheck", false);
5081
- createRenderEffect(() => setAttribute(_el$60, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
5082
- createRenderEffect(() => _el$60.value = chatModel());
5083
- return _el$60;
5090
+ var _el$63 = _tmpl$13();
5091
+ _el$63.$$input = (e) => setChatModel(e.currentTarget.value);
5092
+ setAttribute(_el$63, "spellcheck", false);
5093
+ createRenderEffect(() => setAttribute(_el$63, "placeholder", modelFetchState() === "loading" ? "Fetching models…" : chatProviderMeta().requiresKey && !chatApiKey().trim() ? "Enter API key to load models" : chatProviderMeta().defaultModel || "model name"));
5094
+ createRenderEffect(() => _el$63.value = chatModel());
5095
+ return _el$63;
5084
5096
  })();
5085
5097
  },
5086
5098
  get children() {
5087
- var _el$34 = _tmpl$3();
5088
- _el$34.addEventListener("change", (e) => setChatModel(e.currentTarget.value));
5089
- insert(_el$34, createComponent(For, {
5099
+ var _el$37 = _tmpl$3();
5100
+ _el$37.addEventListener("change", (e) => setChatModel(e.currentTarget.value));
5101
+ insert(_el$37, createComponent(For, {
5090
5102
  get each() {
5091
5103
  return providerModels();
5092
5104
  },
5093
5105
  children: (m) => (() => {
5094
- var _el$61 = _tmpl$12();
5095
- _el$61.value = m;
5096
- insert(_el$61, m);
5097
- return _el$61;
5106
+ var _el$64 = _tmpl$12();
5107
+ _el$64.value = m;
5108
+ insert(_el$64, m);
5109
+ return _el$64;
5098
5110
  })()
5099
5111
  }));
5100
- createRenderEffect(() => _el$34.value = chatModel());
5101
- return _el$34;
5112
+ createRenderEffect(() => _el$37.value = chatModel());
5113
+ return _el$37;
5102
5114
  }
5103
- }), _el$35);
5104
- _el$35.$$click = doFetchModels;
5105
- insert(_el$31, createComponent(Show, {
5115
+ }), _el$38);
5116
+ _el$38.$$click = doFetchModels;
5117
+ insert(_el$34, createComponent(Show, {
5106
5118
  get when() {
5107
5119
  return modelFetchState() === "error";
5108
5120
  },
@@ -5110,52 +5122,52 @@ const Settings = () => {
5110
5122
  return _tmpl$4();
5111
5123
  }
5112
5124
  }), null);
5113
- createRenderEffect(() => _el$35.disabled = modelFetchState() === "loading");
5114
- return _el$31;
5125
+ createRenderEffect(() => _el$38.disabled = modelFetchState() === "loading");
5126
+ return _el$34;
5115
5127
  })(), createComponent(Show, {
5116
5128
  get when() {
5117
5129
  return chatProviderMeta().needsBaseUrl || chatProviderId() === "custom";
5118
5130
  },
5119
5131
  get children() {
5120
- var _el$37 = _tmpl$6(), _el$38 = _el$37.firstChild, _el$39 = _el$38.nextSibling;
5121
- _el$39.$$input = (e) => setChatBaseUrl(e.currentTarget.value);
5122
- setAttribute(_el$39, "spellcheck", false);
5123
- createRenderEffect(() => setAttribute(_el$39, "placeholder", chatProviderMeta().defaultBaseUrl ?? "https://..."));
5124
- createRenderEffect(() => _el$39.value = chatBaseUrl());
5125
- return _el$37;
5132
+ var _el$40 = _tmpl$6(), _el$41 = _el$40.firstChild, _el$42 = _el$41.nextSibling;
5133
+ _el$42.$$input = (e) => setChatBaseUrl(e.currentTarget.value);
5134
+ setAttribute(_el$42, "spellcheck", false);
5135
+ createRenderEffect(() => setAttribute(_el$42, "placeholder", chatProviderMeta().defaultBaseUrl ?? "https://..."));
5136
+ createRenderEffect(() => _el$42.value = chatBaseUrl());
5137
+ return _el$40;
5126
5138
  }
5127
5139
  })];
5128
5140
  }
5129
- }), _el$40);
5130
- _el$41.$$click = handleSave;
5131
- addEventListener(_el$42, "click", closeSettings);
5141
+ }), _el$43);
5142
+ _el$44.$$click = handleSave;
5143
+ addEventListener(_el$45, "click", closeSettings);
5132
5144
  insert(_el$2, createComponent(Show, {
5133
5145
  get when() {
5134
5146
  return status();
5135
5147
  },
5136
5148
  children: (currentStatus) => (() => {
5137
- var _el$62 = _tmpl$14();
5138
- insert(_el$62, () => currentStatus().text);
5149
+ var _el$65 = _tmpl$14();
5150
+ insert(_el$65, () => currentStatus().text);
5139
5151
  createRenderEffect((_p$) => {
5140
5152
  var _v$9 = !!(currentStatus().kind === "success"), _v$0 = !!(currentStatus().kind === "error");
5141
- _v$9 !== _p$.e && _el$62.classList.toggle("success", _p$.e = _v$9);
5142
- _v$0 !== _p$.t && _el$62.classList.toggle("error", _p$.t = _v$0);
5153
+ _v$9 !== _p$.e && _el$65.classList.toggle("success", _p$.e = _v$9);
5154
+ _v$0 !== _p$.t && _el$65.classList.toggle("error", _p$.t = _v$0);
5143
5155
  return _p$;
5144
5156
  }, {
5145
5157
  e: void 0,
5146
5158
  t: void 0
5147
5159
  });
5148
- return _el$62;
5160
+ return _el$65;
5149
5161
  })()
5150
5162
  }), null);
5151
5163
  createRenderEffect((_p$) => {
5152
5164
  var _v$ = !!autoRestoreSession(), _v$2 = autoRestoreSession(), _v$3 = !!clearBookmarksOnLaunch(), _v$4 = clearBookmarksOnLaunch(), _v$5 = !!chatEnabled(), _v$6 = chatEnabled();
5153
- _v$ !== _p$.e && _el$17.classList.toggle("on", _p$.e = _v$);
5154
- _v$2 !== _p$.t && setAttribute(_el$17, "aria-checked", _p$.t = _v$2);
5155
- _v$3 !== _p$.a && _el$20.classList.toggle("on", _p$.a = _v$3);
5156
- _v$4 !== _p$.o && setAttribute(_el$20, "aria-checked", _p$.o = _v$4);
5157
- _v$5 !== _p$.i && _el$24.classList.toggle("on", _p$.i = _v$5);
5158
- _v$6 !== _p$.n && setAttribute(_el$24, "aria-checked", _p$.n = _v$6);
5165
+ _v$ !== _p$.e && _el$20.classList.toggle("on", _p$.e = _v$);
5166
+ _v$2 !== _p$.t && setAttribute(_el$20, "aria-checked", _p$.t = _v$2);
5167
+ _v$3 !== _p$.a && _el$23.classList.toggle("on", _p$.a = _v$3);
5168
+ _v$4 !== _p$.o && setAttribute(_el$23, "aria-checked", _p$.o = _v$4);
5169
+ _v$5 !== _p$.i && _el$27.classList.toggle("on", _p$.i = _v$5);
5170
+ _v$6 !== _p$.n && setAttribute(_el$27, "aria-checked", _p$.n = _v$6);
5159
5171
  return _p$;
5160
5172
  }, {
5161
5173
  e: void 0,
@@ -5165,10 +5177,11 @@ const Settings = () => {
5165
5177
  i: void 0,
5166
5178
  n: void 0
5167
5179
  });
5168
- createRenderEffect(() => _el$7.value = mcpPort());
5169
- createRenderEffect(() => _el$0.value = maxToolIterations());
5170
- createRenderEffect(() => _el$11.value = obsidianVaultPath());
5171
- createRenderEffect(() => _el$14.value = agentTranscriptMode());
5180
+ createRenderEffect(() => _el$7.value = defaultUrl());
5181
+ createRenderEffect(() => _el$0.value = mcpPort());
5182
+ createRenderEffect(() => _el$11.value = maxToolIterations());
5183
+ createRenderEffect(() => _el$14.value = obsidianVaultPath());
5184
+ createRenderEffect(() => _el$17.value = agentTranscriptMode());
5172
5185
  return _el$;
5173
5186
  })(), _tmpl$8()];
5174
5187
  }
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Vessel</title>
7
- <script type="module" crossorigin src="./assets/index-DiB_DxLD.js"></script>
7
+ <script type="module" crossorigin src="./assets/index-CvRVBELV.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="./assets/index-DMd-y6tm.css">
9
9
  </head>
10
10
  <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.13",
4
+ "version": "0.1.14",
5
5
  "description": "AI-native web browser for Linux — persistent browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {