@quanta-intellect/vessel-browser 0.1.101 → 0.1.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/out/main/index.js CHANGED
@@ -4801,7 +4801,14 @@ const TELEMETRY_PROPERTY_ALLOWLIST = {
4801
4801
  bookmark_action: /* @__PURE__ */ new Set(["action"]),
4802
4802
  vault_action: /* @__PURE__ */ new Set(["action"]),
4803
4803
  extraction_failed: /* @__PURE__ */ new Set(["reason"]),
4804
- premium_funnel: /* @__PURE__ */ new Set(["step", "status", "reason"])
4804
+ premium_funnel: /* @__PURE__ */ new Set([
4805
+ "step",
4806
+ "status",
4807
+ "reason",
4808
+ "source",
4809
+ "previous_status",
4810
+ "new_status"
4811
+ ])
4805
4812
  };
4806
4813
  function getDeviceIdPath() {
4807
4814
  return path.join(electron.app.getPath("userData"), ".vessel-device-id");
@@ -27266,6 +27273,14 @@ const PREMIUM_TRACKABLE_STEPS = [
27266
27273
  ];
27267
27274
  const premiumApiOrigin = process.env.VESSEL_PREMIUM_API ? new URL(process.env.VESSEL_PREMIUM_API).origin : "https://vesselpremium.quantaintellect.com";
27268
27275
  function registerPremiumHandlers(tabManager, sendToRendererViews) {
27276
+ const trackPremiumStatusChange = (previousStatus, nextStatus, source) => {
27277
+ if (previousStatus === nextStatus) return;
27278
+ trackPremiumFunnel("premium_status_changed", {
27279
+ previous_status: previousStatus,
27280
+ new_status: nextStatus,
27281
+ source
27282
+ });
27283
+ };
27269
27284
  const watchPremiumCheckoutTab = (tabId) => {
27270
27285
  const tab = tabManager.getTab(tabId);
27271
27286
  const wc = tab?.view.webContents;
@@ -27303,13 +27318,26 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27303
27318
  return;
27304
27319
  }
27305
27320
  trackPremiumFunnel("auto_activation_attempted");
27321
+ trackPremiumFunnel("premium_verify_started", {
27322
+ source: "checkout_auto"
27323
+ });
27324
+ const previousStatus = getPremiumState().status;
27306
27325
  const state2 = await verifySubscription(sessionId);
27307
27326
  if (isPremiumActiveState(state2)) {
27308
27327
  sendToRendererViews(Channels.PREMIUM_UPDATE, state2);
27328
+ trackPremiumFunnel("premium_verify_succeeded", {
27329
+ status: state2.status,
27330
+ source: "checkout_auto"
27331
+ });
27332
+ trackPremiumStatusChange(previousStatus, state2.status, "checkout_auto");
27309
27333
  trackPremiumFunnel("auto_activation_succeeded", {
27310
27334
  status: state2.status
27311
27335
  });
27312
27336
  } else {
27337
+ trackPremiumFunnel("premium_verify_failed", {
27338
+ status: state2.status,
27339
+ source: "checkout_auto"
27340
+ });
27313
27341
  trackPremiumFunnel("auto_activation_failed", {
27314
27342
  status: state2.status
27315
27343
  });
@@ -27342,9 +27370,19 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27342
27370
  return errorResult("Invalid email format");
27343
27371
  }
27344
27372
  trackPremiumFunnel("activation_attempted");
27373
+ trackPremiumFunnel("activation_code_requested", {
27374
+ source: "settings"
27375
+ });
27345
27376
  const result = await requestActivationCode(email);
27346
27377
  if (!result.ok) {
27378
+ trackPremiumFunnel("activation_code_failed", {
27379
+ source: "settings"
27380
+ });
27347
27381
  trackPremiumFunnel("activation_failed");
27382
+ } else {
27383
+ trackPremiumFunnel("activation_code_sent", {
27384
+ source: "settings"
27385
+ });
27348
27386
  }
27349
27387
  return result;
27350
27388
  });
@@ -27361,13 +27399,30 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27361
27399
  });
27362
27400
  }
27363
27401
  trackPremiumFunnel("activation_attempted");
27402
+ trackPremiumFunnel("premium_verify_started", {
27403
+ source: "settings_code"
27404
+ });
27405
+ const previousStatus = getPremiumState().status;
27364
27406
  const result = await verifyActivationCode(email, code, challengeToken);
27365
27407
  if (result.ok) {
27408
+ trackPremiumFunnel("premium_verify_succeeded", {
27409
+ status: result.state.status,
27410
+ source: "settings_code"
27411
+ });
27366
27412
  trackPremiumFunnel("activation_succeeded", {
27367
27413
  status: result.state.status
27368
27414
  });
27415
+ trackPremiumStatusChange(
27416
+ previousStatus,
27417
+ result.state.status,
27418
+ "settings_code"
27419
+ );
27369
27420
  sendToRendererViews(Channels.PREMIUM_UPDATE, result.state);
27370
27421
  } else {
27422
+ trackPremiumFunnel("premium_verify_failed", {
27423
+ status: result.state.status,
27424
+ source: "settings_code"
27425
+ });
27371
27426
  trackPremiumFunnel("activation_failed", { status: result.state.status });
27372
27427
  }
27373
27428
  return result;
@@ -27380,6 +27435,8 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27380
27435
  if (result.ok && result.url) {
27381
27436
  const tabId = tabManager.createTab(result.url);
27382
27437
  watchPremiumCheckoutTab(tabId);
27438
+ } else {
27439
+ trackPremiumFunnel("checkout_open_failed");
27383
27440
  }
27384
27441
  return result;
27385
27442
  });
@@ -11515,7 +11515,7 @@ const SettingsPrivacy = (props) => {
11515
11515
  })();
11516
11516
  };
11517
11517
  delegateEvents(["input", "click"]);
11518
- var _tmpl$$4 = /* @__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$2$4 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$3$3 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Vessel Premium</label></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`), _tmpl$4$3 = /* @__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$5$2 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$6$2 = /* @__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$7$2 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; <!> cookies &middot; <!> 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">&times;`);
11518
+ var _tmpl$$4 = /* @__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$2$4 = /* @__PURE__ */ template(`<div class=vault-entries>`), _tmpl$3$3 = /* @__PURE__ */ template(`<div class=settings-category-panel><div class=settings-field><label class=settings-label>Vessel Premium</label></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`), _tmpl$4$3 = /* @__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$5$2 = /* @__PURE__ */ template(`<button class="premium-btn premium-btn-reset">Clear Saved Email`), _tmpl$6$2 = /* @__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">`), _tmpl$7$2 = /* @__PURE__ */ template(`<p class=settings-status>`), _tmpl$8$1 = /* @__PURE__ */ template(`<div class=vault-entry><div class=vault-entry-info><span class=vault-entry-label></span><span class=vault-entry-detail> &middot; <!> cookies &middot; <!> 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">&times;`);
11519
11519
  const SettingsAccount = (props) => {
11520
11520
  const p = props.premium;
11521
11521
  const s = props.sessions;
@@ -11620,6 +11620,7 @@ const SettingsAccount = (props) => {
11620
11620
  _el$24.$$click = () => {
11621
11621
  p.startCheckout();
11622
11622
  };
11623
+ insert(_el$24, () => p.loading() ? "Opening Checkout..." : "Subscribe to Premium — $5.99/mo after 7-day free trial");
11623
11624
  insert(_el$16, createComponent(Show, {
11624
11625
  get when() {
11625
11626
  return p.message();
@@ -11628,9 +11629,9 @@ const SettingsAccount = (props) => {
11628
11629
  var _el$26 = _tmpl$7$2();
11629
11630
  insert(_el$26, () => msg().text);
11630
11631
  createRenderEffect((_p$) => {
11631
- var _v$ = !!(msg().kind === "success"), _v$2 = !!(msg().kind === "error");
11632
- _v$ !== _p$.e && _el$26.classList.toggle("success", _p$.e = _v$);
11633
- _v$2 !== _p$.t && _el$26.classList.toggle("error", _p$.t = _v$2);
11632
+ var _v$3 = !!(msg().kind === "success"), _v$4 = !!(msg().kind === "error");
11633
+ _v$3 !== _p$.e && _el$26.classList.toggle("success", _p$.e = _v$3);
11634
+ _v$4 !== _p$.t && _el$26.classList.toggle("error", _p$.t = _v$4);
11634
11635
  return _p$;
11635
11636
  }, {
11636
11637
  e: void 0,
@@ -11655,7 +11656,15 @@ const SettingsAccount = (props) => {
11655
11656
  return _el$25;
11656
11657
  }
11657
11658
  }), null);
11658
- createRenderEffect(() => _el$20.disabled = p.loading() || !p.email().trim());
11659
+ createRenderEffect((_p$) => {
11660
+ var _v$ = p.loading() || !p.email().trim(), _v$2 = p.loading();
11661
+ _v$ !== _p$.e && (_el$20.disabled = _p$.e = _v$);
11662
+ _v$2 !== _p$.t && (_el$24.disabled = _p$.t = _v$2);
11663
+ return _p$;
11664
+ }, {
11665
+ e: void 0,
11666
+ t: void 0
11667
+ });
11659
11668
  createRenderEffect(() => _el$19.value = p.email());
11660
11669
  return _el$16;
11661
11670
  })();
@@ -11706,9 +11715,9 @@ const SettingsAccount = (props) => {
11706
11715
  var _el$27 = _tmpl$7$2();
11707
11716
  insert(_el$27, () => msg().text);
11708
11717
  createRenderEffect((_p$) => {
11709
- var _v$3 = !!(msg().kind === "success"), _v$4 = !!(msg().kind === "error");
11710
- _v$3 !== _p$.e && _el$27.classList.toggle("success", _p$.e = _v$3);
11711
- _v$4 !== _p$.t && _el$27.classList.toggle("error", _p$.t = _v$4);
11718
+ var _v$5 = !!(msg().kind === "success"), _v$6 = !!(msg().kind === "error");
11719
+ _v$5 !== _p$.e && _el$27.classList.toggle("success", _p$.e = _v$5);
11720
+ _v$6 !== _p$.t && _el$27.classList.toggle("error", _p$.t = _v$6);
11712
11721
  return _p$;
11713
11722
  }, {
11714
11723
  e: void 0,
@@ -12807,8 +12816,30 @@ const Settings = () => {
12807
12816
  const trackPremiumContext = (step) => window.vessel.premium.trackContext(step).catch((err) => {
12808
12817
  logger.warn("Failed to track premium context:", err);
12809
12818
  });
12810
- const startPremiumCheckout = () => {
12811
- void window.vessel.premium.checkout(premiumEmail().trim() || void 0);
12819
+ const startPremiumCheckout = async () => {
12820
+ setPremiumLoading(true);
12821
+ setPremiumMessage(null);
12822
+ try {
12823
+ const result = await window.vessel.premium.checkout(premiumEmail().trim() || void 0);
12824
+ if (result.ok) {
12825
+ setPremiumMessage({
12826
+ kind: "success",
12827
+ text: "Checkout opened. This screen will update when Premium activates."
12828
+ });
12829
+ } else {
12830
+ setPremiumMessage({
12831
+ kind: "error",
12832
+ text: result.error || "Could not open checkout."
12833
+ });
12834
+ }
12835
+ } catch (err) {
12836
+ setPremiumMessage({
12837
+ kind: "error",
12838
+ text: err instanceof Error ? err.message : "Could not open checkout."
12839
+ });
12840
+ } finally {
12841
+ setPremiumLoading(false);
12842
+ }
12812
12843
  };
12813
12844
  const resetPremiumActivationFlow = () => {
12814
12845
  setPremiumCode("");
@@ -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'; base-uri 'none'; object-src 'none'; frame-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; form-action 'self';" />
7
7
  <title>Vessel</title>
8
- <script type="module" crossorigin src="./assets/index-CfezqyLr.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-D3ABnKy4.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="./assets/index-BF_JrL2V.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.101",
4
+ "version": "0.1.103",
5
5
  "description": "AI-native web browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {