@quanta-intellect/vessel-browser 0.1.118 → 0.1.121

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
@@ -343,8 +343,43 @@ function setSetting(key2, value) {
343
343
  function flushPersist$5() {
344
344
  return saveDirty ? persistNow() : Promise.resolve();
345
345
  }
346
+ function isAirGapped() {
347
+ const hasAirGapSwitch = typeof electron.app?.commandLine?.hasSwitch === "function" && electron.app.commandLine.hasSwitch("air-gapped");
348
+ return hasAirGapSwitch || process.env.VESSEL_AIR_GAPPED === "1";
349
+ }
350
+ const LOCAL_PROVIDER_IDS = /* @__PURE__ */ new Set(["ollama", "llama_cpp"]);
351
+ function isLocalProvider(providerId) {
352
+ return LOCAL_PROVIDER_IDS.has(providerId);
353
+ }
354
+ function isLocalHostname(hostname) {
355
+ const normalized = hostname.toLowerCase();
356
+ return normalized === "localhost" || normalized === "127.0.0.1" || normalized === "::1" || normalized === "[::1]";
357
+ }
358
+ function isLocalBaseUrl(baseUrl) {
359
+ if (!baseUrl) return false;
360
+ try {
361
+ return isLocalHostname(new URL(baseUrl).hostname);
362
+ } catch {
363
+ return false;
364
+ }
365
+ }
366
+ function getAirGapBlockReason(url) {
367
+ if (!isAirGapped()) return null;
368
+ let parsed;
369
+ try {
370
+ parsed = new URL(url);
371
+ } catch {
372
+ return null;
373
+ }
374
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
375
+ return null;
376
+ }
377
+ return isLocalHostname(parsed.hostname) ? null : `Air-gapped mode blocked network access to ${parsed.hostname}.`;
378
+ }
346
379
  function checkDomainPolicy(url) {
347
380
  if (!url || url.startsWith("about:")) return null;
381
+ const airGapBlockReason = getAirGapBlockReason(url);
382
+ if (airGapBlockReason) return airGapBlockReason;
348
383
  const settings2 = loadSettings();
349
384
  const policy = settings2.domainPolicy;
350
385
  if (policy.allowedDomains.length === 0 && policy.blockedDomains.length === 0) {
@@ -3396,7 +3431,7 @@ class TabManager {
3396
3431
  }
3397
3432
  }
3398
3433
  }
3399
- const Channels = {
3434
+ const Channels$1 = {
3400
3435
  // Tab management
3401
3436
  TAB_CREATE: "tab:create",
3402
3437
  TAB_CLOSE: "tab:close",
@@ -3441,6 +3476,9 @@ const Channels = {
3441
3476
  SIDEBAR_RESIZE: "ui:sidebar-resize",
3442
3477
  SIDEBAR_RESIZE_START: "ui:sidebar-resize-start",
3443
3478
  SIDEBAR_RESIZE_COMMIT: "ui:sidebar-resize-commit",
3479
+ SIDEBAR_POPOUT: "ui:sidebar-popout",
3480
+ SIDEBAR_DOCK: "ui:sidebar-dock",
3481
+ SIDEBAR_STATE_UPDATE: "ui:sidebar-state-update",
3444
3482
  SIDEBAR_CONTEXT_MENU: "ui:sidebar-context-menu",
3445
3483
  FOCUS_MODE_TOGGLE: "ui:focus-mode-toggle",
3446
3484
  SETTINGS_VISIBILITY: "ui:settings-visibility",
@@ -4691,6 +4729,9 @@ function assertFeatureUnlocked(featureName, featureLabel = featureName) {
4691
4729
  }
4692
4730
  }
4693
4731
  async function getCheckoutUrl(email) {
4732
+ if (isAirGapped()) {
4733
+ return errorResult("Checkout is unavailable in air-gapped mode.");
4734
+ }
4694
4735
  try {
4695
4736
  const params = new URLSearchParams();
4696
4737
  if (email) params.set("email", email);
@@ -4709,6 +4750,9 @@ async function getCheckoutUrl(email) {
4709
4750
  }
4710
4751
  }
4711
4752
  async function getPortalUrl() {
4753
+ if (isAirGapped()) {
4754
+ return errorResult("Billing portal is unavailable in air-gapped mode.");
4755
+ }
4712
4756
  const current = loadSettings().premium;
4713
4757
  const identifier = current.verificationToken;
4714
4758
  if (!identifier) {
@@ -4736,6 +4780,9 @@ async function getPortalUrl() {
4736
4780
  }
4737
4781
  }
4738
4782
  async function verifySubscription$1(identifier) {
4783
+ if (isAirGapped()) {
4784
+ return loadSettings().premium;
4785
+ }
4739
4786
  const current = loadSettings().premium;
4740
4787
  const verificationIdentifier = identifier || current.verificationToken || current.customerId;
4741
4788
  if (!verificationIdentifier) {
@@ -4773,6 +4820,9 @@ async function verifySubscription$1(identifier) {
4773
4820
  }
4774
4821
  }
4775
4822
  async function requestActivationCode(email) {
4823
+ if (isAirGapped()) {
4824
+ return errorResult("Activation codes are unavailable in air-gapped mode.");
4825
+ }
4776
4826
  const normalizedEmail = email.trim().toLowerCase();
4777
4827
  if (!normalizedEmail) {
4778
4828
  return errorResult("Email is required");
@@ -4796,6 +4846,11 @@ async function requestActivationCode(email) {
4796
4846
  }
4797
4847
  }
4798
4848
  async function verifyActivationCode(email, code, challengeToken) {
4849
+ if (isAirGapped()) {
4850
+ return errorResult("Activation codes are unavailable in air-gapped mode.", {
4851
+ state: getPremiumState()
4852
+ });
4853
+ }
4799
4854
  const normalizedEmail = email.trim().toLowerCase();
4800
4855
  const trimmedCode = code.trim();
4801
4856
  if (!normalizedEmail) {
@@ -4844,6 +4899,7 @@ async function verifyActivationCode(email, code, challengeToken) {
4844
4899
  let revalidationTimer = null;
4845
4900
  function startBackgroundRevalidation() {
4846
4901
  if (revalidationTimer) return;
4902
+ if (isAirGapped()) return;
4847
4903
  const { premium } = loadSettings();
4848
4904
  const identifier = premium.verificationToken || premium.customerId;
4849
4905
  if (identifier) {
@@ -4919,6 +4975,7 @@ let eventQueue = [];
4919
4975
  let flushTimer = null;
4920
4976
  let sessionStartedAt = null;
4921
4977
  function isEnabled() {
4978
+ if (isAirGapped()) return false;
4922
4979
  if (POSTHOG_API_KEY === "YOUR_POSTHOG_KEY_HERE") return false;
4923
4980
  if (process.env.VESSEL_DEV === "1") return false;
4924
4981
  return loadSettings().telemetryEnabled !== false;
@@ -6512,7 +6569,7 @@ async function capturePageSnapshot(url, wc, sendToRendererViews) {
6512
6569
  if (diff.hasChanges) {
6513
6570
  const enrichedDiff = enrichWithBurstHistory(key2, diff);
6514
6571
  latestPageDiffs.set(key2, enrichedDiff);
6515
- sendToRendererViews(Channels.PAGE_CHANGED, enrichedDiff);
6572
+ sendToRendererViews(Channels$1.PAGE_CHANGED, enrichedDiff);
6516
6573
  } else {
6517
6574
  latestPageDiffs.delete(key2);
6518
6575
  }
@@ -6577,6 +6634,131 @@ function schedulePageSnapshotCapture(wc, sendToRendererViews, delayMs = 0, optio
6577
6634
  }
6578
6635
  scheduleTimerAt(wc, sendToRendererViews, nextDueAt, options);
6579
6636
  }
6637
+ const DETACHED_WINDOW_MIN_WIDTH = 360;
6638
+ const DETACHED_WINDOW_MIN_HEIGHT = 480;
6639
+ const DETACHED_WINDOW_DEFAULT_WIDTH = 420;
6640
+ const DETACHED_WINDOW_DEFAULT_HEIGHT = 760;
6641
+ function getSidebarPanelState(state2) {
6642
+ return {
6643
+ open: state2.uiState.sidebarPanelMode !== "closed",
6644
+ width: state2.uiState.sidebarWidth,
6645
+ detached: state2.uiState.sidebarPanelMode === "detached"
6646
+ };
6647
+ }
6648
+ function emitSidebarPanelState(state2) {
6649
+ const panelState = getSidebarPanelState(state2);
6650
+ if (!state2.chromeView.webContents.isDestroyed()) {
6651
+ state2.chromeView.webContents.send(Channels$1.SIDEBAR_STATE_UPDATE, panelState);
6652
+ }
6653
+ if (!state2.sidebarView.webContents.isDestroyed()) {
6654
+ state2.sidebarView.webContents.send(
6655
+ Channels$1.SIDEBAR_STATE_UPDATE,
6656
+ panelState
6657
+ );
6658
+ }
6659
+ return panelState;
6660
+ }
6661
+ function isSidebarAttached(state2) {
6662
+ return state2.uiState.sidebarPanelMode === "docked";
6663
+ }
6664
+ function isSidebarDetached(state2) {
6665
+ return state2.uiState.sidebarPanelMode === "detached";
6666
+ }
6667
+ function closeSidebar(state2, relayout) {
6668
+ const sidebarWindow = state2.sidebarWindow;
6669
+ if (sidebarWindow) {
6670
+ state2.sidebarWindow = null;
6671
+ sidebarWindow.contentView.removeChildView(state2.sidebarView);
6672
+ state2.mainWindow.contentView.addChildView(state2.sidebarView);
6673
+ state2.sidebarWindowClosing = true;
6674
+ sidebarWindow.once("closed", () => {
6675
+ state2.sidebarWindowClosing = false;
6676
+ });
6677
+ sidebarWindow.close();
6678
+ }
6679
+ state2.uiState.sidebarPanelMode = "closed";
6680
+ relayout();
6681
+ return emitSidebarPanelState(state2);
6682
+ }
6683
+ function openDockedSidebar(state2, relayout) {
6684
+ state2.uiState.sidebarPanelMode = "docked";
6685
+ relayout();
6686
+ return emitSidebarPanelState(state2);
6687
+ }
6688
+ function toggleDockedSidebar(state2, relayout) {
6689
+ if (isSidebarDetached(state2)) {
6690
+ state2.sidebarWindow?.focus();
6691
+ return getSidebarPanelState(state2);
6692
+ }
6693
+ state2.uiState.sidebarPanelMode = state2.uiState.sidebarPanelMode === "docked" ? "closed" : "docked";
6694
+ relayout();
6695
+ return emitSidebarPanelState(state2);
6696
+ }
6697
+ function layoutDetachedSidebar(state2) {
6698
+ if (!state2.sidebarWindow) return;
6699
+ const [width, height] = state2.sidebarWindow.getContentSize();
6700
+ state2.sidebarView.setBounds({ x: 0, y: 0, width, height });
6701
+ }
6702
+ function detachSidebar(state2, hooks) {
6703
+ if (state2.sidebarWindow) {
6704
+ state2.sidebarWindow.focus();
6705
+ return getSidebarPanelState(state2);
6706
+ }
6707
+ const sidebarWindow = new electron.BaseWindow({
6708
+ width: Math.max(DETACHED_WINDOW_DEFAULT_WIDTH, state2.uiState.sidebarWidth),
6709
+ height: DETACHED_WINDOW_DEFAULT_HEIGHT,
6710
+ minWidth: DETACHED_WINDOW_MIN_WIDTH,
6711
+ minHeight: DETACHED_WINDOW_MIN_HEIGHT,
6712
+ frame: true,
6713
+ show: false,
6714
+ backgroundColor: "#1a1a1e",
6715
+ title: "Vessel Agent",
6716
+ icon: hooks.getWindowIconPath()
6717
+ });
6718
+ state2.mainWindow.contentView.removeChildView(state2.sidebarView);
6719
+ sidebarWindow.contentView.addChildView(state2.sidebarView);
6720
+ state2.sidebarWindow = sidebarWindow;
6721
+ state2.uiState.sidebarPanelMode = "detached";
6722
+ sidebarWindow.on("resize", () => layoutDetachedSidebar(state2));
6723
+ sidebarWindow.on("close", (event) => {
6724
+ if (state2.sidebarWindowClosing) return;
6725
+ event.preventDefault();
6726
+ dockSidebar(state2, hooks);
6727
+ });
6728
+ sidebarWindow.on("closed", () => {
6729
+ if (state2.sidebarWindow !== sidebarWindow) return;
6730
+ state2.sidebarWindow = null;
6731
+ state2.uiState.sidebarPanelMode = "docked";
6732
+ state2.mainWindow.contentView.addChildView(state2.sidebarView);
6733
+ hooks.relayout();
6734
+ emitSidebarPanelState(state2);
6735
+ });
6736
+ hooks.relayout();
6737
+ layoutDetachedSidebar(state2);
6738
+ sidebarWindow.show();
6739
+ sidebarWindow.focus();
6740
+ return emitSidebarPanelState(state2);
6741
+ }
6742
+ function dockSidebar(state2, hooks) {
6743
+ const sidebarWindow = state2.sidebarWindow;
6744
+ if (!sidebarWindow) {
6745
+ state2.uiState.sidebarPanelMode = "docked";
6746
+ hooks.relayout();
6747
+ return emitSidebarPanelState(state2);
6748
+ }
6749
+ state2.sidebarWindow = null;
6750
+ state2.uiState.sidebarPanelMode = "docked";
6751
+ sidebarWindow.contentView.removeChildView(state2.sidebarView);
6752
+ state2.mainWindow.contentView.addChildView(state2.sidebarView);
6753
+ hooks.relayout();
6754
+ state2.sidebarWindowClosing = true;
6755
+ sidebarWindow.once("closed", () => {
6756
+ state2.sidebarWindowClosing = false;
6757
+ });
6758
+ sidebarWindow.close();
6759
+ state2.mainWindow.focus();
6760
+ return emitSidebarPanelState(state2);
6761
+ }
6580
6762
  function enableClipboardShortcuts(view) {
6581
6763
  view.webContents.on("before-input-event", (event, input) => {
6582
6764
  if (!input.control && !input.meta) return;
@@ -6757,10 +6939,6 @@ function createMainWindow(onTabStateChange) {
6757
6939
  }
6758
6940
  });
6759
6941
  sidebarView.setBackgroundColor("#00000000");
6760
- sidebarView.webContents.on("context-menu", (event, params) => {
6761
- event.preventDefault();
6762
- void showSidebarContextMenu(mainWindow, sidebarView, params);
6763
- });
6764
6942
  mainWindow.contentView.addChildView(sidebarView);
6765
6943
  const devtoolsPanelView = new electron.WebContentsView({
6766
6944
  webPreferences: {
@@ -6778,7 +6956,7 @@ function createMainWindow(onTabStateChange) {
6778
6956
  enableClipboardShortcuts(devtoolsPanelView);
6779
6957
  const settings2 = loadSettings();
6780
6958
  const uiState = {
6781
- sidebarOpen: true,
6959
+ sidebarPanelMode: "docked",
6782
6960
  sidebarWidth: settings2.sidebarWidth,
6783
6961
  focusMode: false,
6784
6962
  settingsOpen: false,
@@ -6797,6 +6975,8 @@ function createMainWindow(onTabStateChange) {
6797
6975
  });
6798
6976
  const state2 = {
6799
6977
  mainWindow,
6978
+ sidebarWindow: null,
6979
+ sidebarWindowClosing: false,
6800
6980
  chromeView,
6801
6981
  sidebarView,
6802
6982
  devtoolsPanelView,
@@ -6806,6 +6986,21 @@ function createMainWindow(onTabStateChange) {
6806
6986
  mainWindow.on("resize", () => layoutViews(state2));
6807
6987
  mainWindow.on("show", () => layoutViews(state2));
6808
6988
  mainWindow.on("focus", () => layoutViews(state2));
6989
+ mainWindow.on("closed", () => {
6990
+ const sidebarWindow = state2.sidebarWindow;
6991
+ if (!sidebarWindow) return;
6992
+ state2.sidebarWindow = null;
6993
+ state2.sidebarWindowClosing = true;
6994
+ sidebarWindow.close();
6995
+ });
6996
+ sidebarView.webContents.on("context-menu", (event, params) => {
6997
+ event.preventDefault();
6998
+ void showSidebarContextMenu(
6999
+ state2.sidebarWindow ?? state2.mainWindow,
7000
+ sidebarView,
7001
+ params
7002
+ );
7003
+ });
6809
7004
  layoutViews(state2);
6810
7005
  return state2;
6811
7006
  }
@@ -6820,7 +7015,8 @@ function layoutViews(state2) {
6820
7015
  } = state2;
6821
7016
  const [width, height] = mainWindow.getContentSize();
6822
7017
  const chromeHeight = uiState.focusMode ? 0 : CHROME_HEIGHT;
6823
- const sidebarWidth = uiState.sidebarOpen ? uiState.sidebarWidth : 0;
7018
+ const sidebarAttached = isSidebarAttached(state2);
7019
+ const sidebarWidth = sidebarAttached ? uiState.sidebarWidth : 0;
6824
7020
  const devtoolsHeight = uiState.devtoolsPanelOpen ? uiState.devtoolsPanelHeight : 0;
6825
7021
  const chromeNeedsFullHeight = uiState.settingsOpen;
6826
7022
  if (chromeNeedsFullHeight) {
@@ -6829,14 +7025,14 @@ function layoutViews(state2) {
6829
7025
  chromeView.setBounds({ x: 0, y: 0, width, height: chromeHeight });
6830
7026
  }
6831
7027
  const resizeHandleOverlap = 6;
6832
- if (uiState.sidebarOpen) {
7028
+ if (sidebarAttached) {
6833
7029
  sidebarView.setBounds({
6834
7030
  x: width - sidebarWidth - resizeHandleOverlap,
6835
7031
  y: chromeHeight,
6836
7032
  width: sidebarWidth + resizeHandleOverlap,
6837
7033
  height: height - chromeHeight
6838
7034
  });
6839
- } else {
7035
+ } else if (uiState.sidebarPanelMode === "closed") {
6840
7036
  sidebarView.setBounds({ x: width, y: 0, width: 0, height: 0 });
6841
7037
  }
6842
7038
  const contentWidth = width - sidebarWidth;
@@ -6852,8 +7048,10 @@ function layoutViews(state2) {
6852
7048
  }
6853
7049
  mainWindow.contentView.removeChildView(chromeView);
6854
7050
  mainWindow.contentView.addChildView(chromeView);
6855
- mainWindow.contentView.removeChildView(sidebarView);
6856
- mainWindow.contentView.addChildView(sidebarView);
7051
+ if (uiState.sidebarPanelMode !== "detached") {
7052
+ mainWindow.contentView.removeChildView(sidebarView);
7053
+ mainWindow.contentView.addChildView(sidebarView);
7054
+ }
6857
7055
  mainWindow.contentView.removeChildView(devtoolsPanelView);
6858
7056
  mainWindow.contentView.addChildView(devtoolsPanelView);
6859
7057
  const activeTab = tabManager.getActiveTab();
@@ -6870,16 +7068,18 @@ function resizeSidebarViews(state2) {
6870
7068
  const { mainWindow, sidebarView, devtoolsPanelView, tabManager, uiState } = state2;
6871
7069
  const [width, height] = mainWindow.getContentSize();
6872
7070
  const chromeHeight = uiState.focusMode ? 0 : CHROME_HEIGHT;
6873
- const sidebarWidth = uiState.sidebarOpen ? uiState.sidebarWidth : 0;
7071
+ const sidebarWidth = isSidebarAttached(state2) ? uiState.sidebarWidth : 0;
6874
7072
  const devtoolsHeight = uiState.devtoolsPanelOpen ? uiState.devtoolsPanelHeight : 0;
6875
7073
  const resizeHandleOverlap = 6;
6876
7074
  const contentWidth = width - sidebarWidth;
6877
- sidebarView.setBounds({
6878
- x: width - sidebarWidth - resizeHandleOverlap,
6879
- y: chromeHeight,
6880
- width: sidebarWidth + resizeHandleOverlap,
6881
- height: height - chromeHeight
6882
- });
7075
+ if (uiState.sidebarPanelMode !== "detached") {
7076
+ sidebarView.setBounds({
7077
+ x: width - sidebarWidth - resizeHandleOverlap,
7078
+ y: chromeHeight,
7079
+ width: sidebarWidth + resizeHandleOverlap,
7080
+ height: height - chromeHeight
7081
+ });
7082
+ }
6883
7083
  if (uiState.devtoolsPanelOpen) {
6884
7084
  devtoolsPanelView.setBounds({
6885
7085
  x: 0,
@@ -7020,6 +7220,7 @@ const state$3 = {
7020
7220
  userDataPath: "",
7021
7221
  settingsPath: "",
7022
7222
  startupIssues: [],
7223
+ airGapped: isAirGapped(),
7023
7224
  mcp: {
7024
7225
  configuredPort: 3100,
7025
7226
  activePort: null,
@@ -7047,6 +7248,7 @@ function getRuntimeHealth() {
7047
7248
  userDataPath: state$3.userDataPath,
7048
7249
  settingsPath: state$3.settingsPath,
7049
7250
  startupIssues: state$3.startupIssues.map((issue) => ({ ...issue })),
7251
+ airGapped: state$3.airGapped,
7050
7252
  mcp: { ...state$3.mcp }
7051
7253
  };
7052
7254
  }
@@ -7577,8 +7779,8 @@ function isLoopbackBaseUrl(baseUrl) {
7577
7779
  }
7578
7780
  function resolveAgentToolProfile(config) {
7579
7781
  const providerId = config.id;
7580
- const isLocalProvider = providerId === "ollama" || providerId === "llama_cpp" || providerId === "custom" && isLoopbackBaseUrl(config.baseUrl);
7581
- if (!isLocalProvider) return "default";
7782
+ const isLocalProvider2 = providerId === "ollama" || providerId === "llama_cpp" || providerId === "custom" && isLoopbackBaseUrl(config.baseUrl);
7783
+ if (!isLocalProvider2) return "default";
7582
7784
  const sizeInBillions = parseModelSizeInBillions(config.model);
7583
7785
  if (sizeInBillions === null) {
7584
7786
  return "compact";
@@ -9379,6 +9581,15 @@ function validateProviderConnection(config, options = { requireModel: true }) {
9379
9581
  if (!meta) {
9380
9582
  return "Selected AI provider is not supported.";
9381
9583
  }
9584
+ if (isAirGapped()) {
9585
+ if (meta.id === "custom") {
9586
+ if (!isLocalBaseUrl(normalized.baseUrl)) {
9587
+ return "Air-gapped mode only allows local AI providers. Use a localhost base URL for custom providers.";
9588
+ }
9589
+ } else if (!isLocalProvider(meta.id)) {
9590
+ return `Air-gapped mode only allows local AI providers (Ollama, llama.cpp). ${meta.name} requires internet access.`;
9591
+ }
9592
+ }
9382
9593
  if (meta.type !== "codex_oauth" && meta.requiresApiKey && !normalized.apiKey) {
9383
9594
  return `${meta.name} requires an API key. Open settings (Ctrl+,) to add one.`;
9384
9595
  }
@@ -11820,7 +12031,7 @@ const TOOL_DEFINITIONS = [
11820
12031
  {
11821
12032
  name: "select_option",
11822
12033
  title: "Select Option",
11823
- description: "Select an option in a <select> dropdown by visible label or option value. Only works on <select> elements for checkboxes or radio buttons use click instead.",
12034
+ description: "Select an option in a <select> dropdown by visible label or option value. Only works on <select> elements. For checkboxes or radio buttons use click instead.",
11824
12035
  inputSchema: {
11825
12036
  index: zod.z.number().optional().describe("The select element index number"),
11826
12037
  selector: zod.z.string().optional().describe("CSS selector as fallback"),
@@ -11945,7 +12156,7 @@ const TOOL_DEFINITIONS = [
11945
12156
  "full",
11946
12157
  "debug"
11947
12158
  ]).optional().describe(
11948
- "Read mode: glance (fastest viewport snapshot, no JS extraction, ideal for heavy pages), visible_only/results_only/forms_only/summary/text_only for narrow reads, full/debug for the complete page dump"
12159
+ "Read mode: glance (fastest: viewport snapshot, no JS extraction, ideal for heavy pages), visible_only/results_only/forms_only/summary/text_only for narrow reads, full/debug for the complete page dump"
11949
12160
  )
11950
12161
  },
11951
12162
  tier: 0
@@ -11953,7 +12164,7 @@ const TOOL_DEFINITIONS = [
11953
12164
  {
11954
12165
  name: "screenshot",
11955
12166
  title: "Screenshot",
11956
- description: "Take a screenshot of the current page — see exactly what the user sees. Returns the image for visual analysis. Use when you need to verify visual layout, check what's actually rendered on screen, or when text extraction fails on heavy pages.",
12167
+ description: "Take a screenshot of the current page. Returns the image for visual analysis. Use when you need to verify visual layout, check what's actually rendered on screen, or when text extraction fails on heavy pages.",
11957
12168
  inputSchema: {},
11958
12169
  tier: 1
11959
12170
  },
@@ -12287,7 +12498,7 @@ const TOOL_DEFINITIONS = [
12287
12498
  inputSchema: {
12288
12499
  index: zod.z.number().optional().describe("Element index of the table to extract"),
12289
12500
  selector: zod.z.string().optional().describe(
12290
- "CSS selector for the table (auto-detected if omitted uses first table)"
12501
+ "CSS selector for the table (auto-detected if omitted; uses first table)"
12291
12502
  )
12292
12503
  },
12293
12504
  tier: 1,
@@ -24628,13 +24839,13 @@ async function fireJob(job, windowState, runtime2) {
24628
24839
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
24629
24840
  output: ""
24630
24841
  };
24631
- send(Channels.AUTOMATION_ACTIVITY_START, entry);
24842
+ send(Channels$1.AUTOMATION_ACTIVITY_START, entry);
24632
24843
  };
24633
24844
  const appendActivity = (chunk) => {
24634
- send(Channels.AUTOMATION_ACTIVITY_CHUNK, { id: activityId, chunk });
24845
+ send(Channels$1.AUTOMATION_ACTIVITY_CHUNK, { id: activityId, chunk });
24635
24846
  };
24636
24847
  const finishActivity = (status) => {
24637
- send(Channels.AUTOMATION_ACTIVITY_END, {
24848
+ send(Channels$1.AUTOMATION_ACTIVITY_END, {
24638
24849
  id: activityId,
24639
24850
  status,
24640
24851
  finishedAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -24701,7 +24912,7 @@ function tick(windowState, runtime2) {
24701
24912
  job.nextRunAt = computeNextRun(job.schedule, firedAt).toISOString();
24702
24913
  }
24703
24914
  saveJobs();
24704
- broadcastFn?.(Channels.SCHEDULE_JOBS_UPDATE, jobs);
24915
+ broadcastFn?.(Channels$1.SCHEDULE_JOBS_UPDATE, jobs);
24705
24916
  void fireJob(job, windowState, runtime2).catch((err) => {
24706
24917
  logger$b.warn("Unexpected error firing job:", err);
24707
24918
  }).finally(fireNext);
@@ -24723,11 +24934,11 @@ function registerScheduleHandlers(windowState, runtime2, sendToAll) {
24723
24934
  tick(windowState, runtime2);
24724
24935
  pollInterval = setInterval(() => tick(windowState, runtime2), 6e4);
24725
24936
  }, msToNextMinute);
24726
- electron.ipcMain.handle(Channels.SCHEDULE_GET_ALL, (event) => {
24937
+ electron.ipcMain.handle(Channels$1.SCHEDULE_GET_ALL, (event) => {
24727
24938
  assertTrustedIpcSender(event);
24728
24939
  return jobs;
24729
24940
  });
24730
- electron.ipcMain.handle(Channels.SCHEDULE_CREATE, (event, rawJob) => {
24941
+ electron.ipcMain.handle(Channels$1.SCHEDULE_CREATE, (event, rawJob) => {
24731
24942
  assertTrustedIpcSender(event);
24732
24943
  if (!isValidJobData(rawJob)) {
24733
24944
  throw new Error(
@@ -24742,10 +24953,10 @@ function registerScheduleHandlers(windowState, runtime2, sendToAll) {
24742
24953
  };
24743
24954
  jobs.push(newJob);
24744
24955
  saveJobs();
24745
- sendToAll(Channels.SCHEDULE_JOBS_UPDATE, jobs);
24956
+ sendToAll(Channels$1.SCHEDULE_JOBS_UPDATE, jobs);
24746
24957
  return newJob;
24747
24958
  });
24748
- electron.ipcMain.handle(Channels.SCHEDULE_UPDATE, (event, id, updates) => {
24959
+ electron.ipcMain.handle(Channels$1.SCHEDULE_UPDATE, (event, id, updates) => {
24749
24960
  assertTrustedIpcSender(event);
24750
24961
  if (typeof id !== "string") throw new Error("id must be a string");
24751
24962
  const job = jobs.find((j) => j.id === id);
@@ -24769,17 +24980,17 @@ function registerScheduleHandlers(windowState, runtime2, sendToAll) {
24769
24980
  }
24770
24981
  }
24771
24982
  saveJobs();
24772
- sendToAll(Channels.SCHEDULE_JOBS_UPDATE, jobs);
24983
+ sendToAll(Channels$1.SCHEDULE_JOBS_UPDATE, jobs);
24773
24984
  return job;
24774
24985
  });
24775
- electron.ipcMain.handle(Channels.SCHEDULE_DELETE, (event, id) => {
24986
+ electron.ipcMain.handle(Channels$1.SCHEDULE_DELETE, (event, id) => {
24776
24987
  assertTrustedIpcSender(event);
24777
24988
  if (typeof id !== "string") throw new Error("id must be a string");
24778
24989
  const before = jobs.length;
24779
24990
  jobs = jobs.filter((j) => j.id !== id);
24780
24991
  if (jobs.length === before) return false;
24781
24992
  saveJobs();
24782
- sendToAll(Channels.SCHEDULE_JOBS_UPDATE, jobs);
24993
+ sendToAll(Channels$1.SCHEDULE_JOBS_UPDATE, jobs);
24783
24994
  return true;
24784
24995
  });
24785
24996
  }
@@ -25136,28 +25347,28 @@ function sanitizeAutofillUpdates(value) {
25136
25347
  return updates;
25137
25348
  }
25138
25349
  function registerAutofillHandlers(windowState) {
25139
- electron.ipcMain.handle(Channels.AUTOFILL_LIST, (event) => {
25350
+ electron.ipcMain.handle(Channels$1.AUTOFILL_LIST, (event) => {
25140
25351
  assertTrustedIpcSender(event);
25141
25352
  return listProfiles();
25142
25353
  });
25143
25354
  electron.ipcMain.handle(
25144
- Channels.AUTOFILL_ADD,
25355
+ Channels$1.AUTOFILL_ADD,
25145
25356
  (event, profile) => {
25146
25357
  assertTrustedIpcSender(event);
25147
25358
  return addProfile(sanitizeAutofillProfile(profile));
25148
25359
  }
25149
25360
  );
25150
- electron.ipcMain.handle(Channels.AUTOFILL_UPDATE, (event, id, updates) => {
25361
+ electron.ipcMain.handle(Channels$1.AUTOFILL_UPDATE, (event, id, updates) => {
25151
25362
  assertTrustedIpcSender(event);
25152
25363
  assertString(id, "id");
25153
25364
  return updateProfile(id, sanitizeAutofillUpdates(updates));
25154
25365
  });
25155
- electron.ipcMain.handle(Channels.AUTOFILL_DELETE, (event, id) => {
25366
+ electron.ipcMain.handle(Channels$1.AUTOFILL_DELETE, (event, id) => {
25156
25367
  assertTrustedIpcSender(event);
25157
25368
  assertString(id, "id");
25158
25369
  return deleteProfile(id);
25159
25370
  });
25160
- electron.ipcMain.handle(Channels.AUTOFILL_FILL, async (event, profileId) => {
25371
+ electron.ipcMain.handle(Channels$1.AUTOFILL_FILL, async (event, profileId) => {
25161
25372
  assertTrustedIpcSender(event);
25162
25373
  assertString(profileId, "profileId");
25163
25374
  const profile = getProfile(profileId);
@@ -25205,14 +25416,14 @@ function registerPageDiffHandlers(windowState, sendToRendererViews) {
25205
25416
  bucket.count += 1;
25206
25417
  return bucket.count <= 20;
25207
25418
  };
25208
- electron.ipcMain.handle(Channels.PAGE_DIFF_GET, (event) => {
25419
+ electron.ipcMain.handle(Channels$1.PAGE_DIFF_GET, (event) => {
25209
25420
  assertTrustedIpcSender(event);
25210
25421
  const activeTab = windowState.tabManager.getActiveTab();
25211
25422
  const wc = activeTab?.view.webContents;
25212
25423
  if (!wc) return null;
25213
25424
  return getLatestPageDiff(wc.getURL());
25214
25425
  });
25215
- electron.ipcMain.handle(Channels.PAGE_DIFF_HISTORY, (event) => {
25426
+ electron.ipcMain.handle(Channels$1.PAGE_DIFF_HISTORY, (event) => {
25216
25427
  assertTrustedIpcSender(event);
25217
25428
  try {
25218
25429
  if (!isPremiumActiveState(getPremiumState())) {
@@ -25226,7 +25437,7 @@ function registerPageDiffHandlers(windowState, sendToRendererViews) {
25226
25437
  return [];
25227
25438
  }
25228
25439
  });
25229
- electron.ipcMain.on(Channels.PAGE_DIFF_ACTIVITY, (event) => {
25440
+ electron.ipcMain.on(Channels$1.PAGE_DIFF_ACTIVITY, (event) => {
25230
25441
  const wc = event.sender;
25231
25442
  if (!wc || wc.isDestroyed()) return;
25232
25443
  if (!isManagedTabIpcSender(event, windowState.tabManager)) return;
@@ -25236,7 +25447,7 @@ function registerPageDiffHandlers(windowState, sendToRendererViews) {
25236
25447
  isActive: () => isActiveWebContents(wc.id)
25237
25448
  });
25238
25449
  });
25239
- electron.ipcMain.on(Channels.PAGE_DIFF_DIRTY, (event) => {
25450
+ electron.ipcMain.on(Channels$1.PAGE_DIFF_DIRTY, (event) => {
25240
25451
  const wc = event.sender;
25241
25452
  if (!wc || wc.isDestroyed()) return;
25242
25453
  if (!isManagedTabIpcSender(event, windowState.tabManager)) return;
@@ -25307,11 +25518,11 @@ function renderReportAsMarkdown(report, traces) {
25307
25518
  }
25308
25519
  const logger$a = createLogger("ResearchIPC");
25309
25520
  function registerResearchHandlers(getOrchestrator) {
25310
- electron.ipcMain.handle(Channels.RESEARCH_STATE_GET, () => {
25521
+ electron.ipcMain.handle(Channels$1.RESEARCH_STATE_GET, () => {
25311
25522
  return getOrchestrator().getState();
25312
25523
  });
25313
25524
  electron.ipcMain.handle(
25314
- Channels.RESEARCH_START_BRIEF,
25525
+ Channels$1.RESEARCH_START_BRIEF,
25315
25526
  async (_event, query) => {
25316
25527
  try {
25317
25528
  const trimmedQuery = query.trim();
@@ -25329,7 +25540,7 @@ function registerResearchHandlers(getOrchestrator) {
25329
25540
  }
25330
25541
  }
25331
25542
  );
25332
- electron.ipcMain.handle(Channels.RESEARCH_CONFIRM_BRIEF, () => {
25543
+ electron.ipcMain.handle(Channels$1.RESEARCH_CONFIRM_BRIEF, () => {
25333
25544
  try {
25334
25545
  if (isToolGated("research_confirm_brief")) {
25335
25546
  return { accepted: false, reason: "premium" };
@@ -25346,7 +25557,7 @@ function registerResearchHandlers(getOrchestrator) {
25346
25557
  }
25347
25558
  });
25348
25559
  electron.ipcMain.handle(
25349
- Channels.RESEARCH_APPROVE_OBJECTIVES,
25560
+ Channels$1.RESEARCH_APPROVE_OBJECTIVES,
25350
25561
  (_event, options) => {
25351
25562
  try {
25352
25563
  if (isToolGated("research_approve_objectives")) {
@@ -25372,24 +25583,24 @@ function registerResearchHandlers(getOrchestrator) {
25372
25583
  }
25373
25584
  );
25374
25585
  electron.ipcMain.handle(
25375
- Channels.RESEARCH_SET_MODE,
25586
+ Channels$1.RESEARCH_SET_MODE,
25376
25587
  (_event, mode) => {
25377
25588
  getOrchestrator().setSupervisionMode(mode);
25378
25589
  }
25379
25590
  );
25380
25591
  electron.ipcMain.handle(
25381
- Channels.RESEARCH_SET_TRACES,
25592
+ Channels$1.RESEARCH_SET_TRACES,
25382
25593
  (_event, include) => {
25383
25594
  getOrchestrator().setIncludeTraces(include);
25384
25595
  }
25385
25596
  );
25386
- electron.ipcMain.handle(Channels.RESEARCH_CANCEL, () => {
25597
+ electron.ipcMain.handle(Channels$1.RESEARCH_CANCEL, () => {
25387
25598
  getOrchestrator().cancel();
25388
25599
  });
25389
- electron.ipcMain.handle(Channels.RESEARCH_STOP_AND_SYNTHESIZE, () => {
25600
+ electron.ipcMain.handle(Channels$1.RESEARCH_STOP_AND_SYNTHESIZE, () => {
25390
25601
  getOrchestrator().stopAndSynthesizeCurrentFindings();
25391
25602
  });
25392
- electron.ipcMain.handle(Channels.RESEARCH_EXPORT_REPORT, async () => {
25603
+ electron.ipcMain.handle(Channels$1.RESEARCH_EXPORT_REPORT, async () => {
25393
25604
  try {
25394
25605
  if (isToolGated("research_export_report")) {
25395
25606
  return { accepted: false, reason: "premium" };
@@ -26208,13 +26419,13 @@ function assertVaultUnlocked() {
26208
26419
  assertFeatureUnlocked("vault", "Agent Credential Vault");
26209
26420
  }
26210
26421
  function registerVaultHandlers() {
26211
- electron.ipcMain.handle(Channels.VAULT_LIST, (event) => {
26422
+ electron.ipcMain.handle(Channels$1.VAULT_LIST, (event) => {
26212
26423
  assertTrustedIpcSender(event);
26213
26424
  assertVaultUnlocked();
26214
26425
  return listEntries$1();
26215
26426
  });
26216
26427
  electron.ipcMain.handle(
26217
- Channels.VAULT_ADD,
26428
+ Channels$1.VAULT_ADD,
26218
26429
  (event, entry) => {
26219
26430
  assertTrustedIpcSender(event);
26220
26431
  assertVaultUnlocked();
@@ -26241,7 +26452,7 @@ function registerVaultHandlers() {
26241
26452
  }
26242
26453
  );
26243
26454
  electron.ipcMain.handle(
26244
- Channels.VAULT_UPDATE,
26455
+ Channels$1.VAULT_UPDATE,
26245
26456
  (event, id, updates) => {
26246
26457
  assertTrustedIpcSender(event);
26247
26458
  assertVaultUnlocked();
@@ -26252,14 +26463,14 @@ function registerVaultHandlers() {
26252
26463
  return updateEntry$1(id, updates) !== null;
26253
26464
  }
26254
26465
  );
26255
- electron.ipcMain.handle(Channels.VAULT_REMOVE, (event, id) => {
26466
+ electron.ipcMain.handle(Channels$1.VAULT_REMOVE, (event, id) => {
26256
26467
  assertTrustedIpcSender(event);
26257
26468
  assertVaultUnlocked();
26258
26469
  assertString(id, "id");
26259
26470
  trackVaultAction("credential_removed");
26260
26471
  return removeEntry$1(id);
26261
26472
  });
26262
- electron.ipcMain.handle(Channels.VAULT_AUDIT_LOG, (event, limit) => {
26473
+ electron.ipcMain.handle(Channels$1.VAULT_AUDIT_LOG, (event, limit) => {
26263
26474
  assertTrustedIpcSender(event);
26264
26475
  assertVaultUnlocked();
26265
26476
  return readAuditLog$1(limit);
@@ -26283,20 +26494,20 @@ function assertHumanVaultUnlocked() {
26283
26494
  assertFeatureUnlocked("human_vault", "Passwords");
26284
26495
  }
26285
26496
  function registerHumanVaultHandlers() {
26286
- electron.ipcMain.handle(Channels.HUMAN_VAULT_LIST, (event, domain) => {
26497
+ electron.ipcMain.handle(Channels$1.HUMAN_VAULT_LIST, (event, domain) => {
26287
26498
  assertTrustedIpcSender(event);
26288
26499
  assertHumanVaultUnlocked();
26289
26500
  if (domain !== void 0) assertString(domain, "domain");
26290
26501
  return domain ? findForDomain(domain) : listEntries();
26291
26502
  });
26292
- electron.ipcMain.handle(Channels.HUMAN_VAULT_GET, (event, id) => {
26503
+ electron.ipcMain.handle(Channels$1.HUMAN_VAULT_GET, (event, id) => {
26293
26504
  assertTrustedIpcSender(event);
26294
26505
  assertHumanVaultUnlocked();
26295
26506
  assertString(id, "id");
26296
26507
  return getEntrySafe(id);
26297
26508
  });
26298
26509
  electron.ipcMain.handle(
26299
- Channels.HUMAN_VAULT_SAVE,
26510
+ Channels$1.HUMAN_VAULT_SAVE,
26300
26511
  (event, input) => {
26301
26512
  assertTrustedIpcSender(event);
26302
26513
  assertHumanVaultUnlocked();
@@ -26328,7 +26539,7 @@ function registerHumanVaultHandlers() {
26328
26539
  }
26329
26540
  );
26330
26541
  electron.ipcMain.handle(
26331
- Channels.HUMAN_VAULT_UPDATE,
26542
+ Channels$1.HUMAN_VAULT_UPDATE,
26332
26543
  (event, id, updates) => {
26333
26544
  assertTrustedIpcSender(event);
26334
26545
  assertHumanVaultUnlocked();
@@ -26373,24 +26584,24 @@ function registerHumanVaultHandlers() {
26373
26584
  return safe;
26374
26585
  }
26375
26586
  );
26376
- electron.ipcMain.handle(Channels.HUMAN_VAULT_REMOVE, (event, id) => {
26587
+ electron.ipcMain.handle(Channels$1.HUMAN_VAULT_REMOVE, (event, id) => {
26377
26588
  assertTrustedIpcSender(event);
26378
26589
  assertHumanVaultUnlocked();
26379
26590
  assertString(id, "id");
26380
26591
  return removeEntry(id);
26381
26592
  });
26382
- electron.ipcMain.handle(Channels.HUMAN_VAULT_AUDIT_LOG, (event, limit) => {
26593
+ electron.ipcMain.handle(Channels$1.HUMAN_VAULT_AUDIT_LOG, (event, limit) => {
26383
26594
  assertTrustedIpcSender(event);
26384
26595
  assertHumanVaultUnlocked();
26385
26596
  return readAuditLog(limit);
26386
26597
  });
26387
26598
  }
26388
26599
  function registerWindowControlHandlers(mainWindow) {
26389
- electron.ipcMain.handle(Channels.WINDOW_MINIMIZE, (event) => {
26600
+ electron.ipcMain.handle(Channels$1.WINDOW_MINIMIZE, (event) => {
26390
26601
  assertTrustedIpcSender(event);
26391
26602
  mainWindow.minimize();
26392
26603
  });
26393
- electron.ipcMain.handle(Channels.WINDOW_MAXIMIZE, (event) => {
26604
+ electron.ipcMain.handle(Channels$1.WINDOW_MAXIMIZE, (event) => {
26394
26605
  assertTrustedIpcSender(event);
26395
26606
  if (mainWindow.isMaximized()) {
26396
26607
  mainWindow.unmaximize();
@@ -26398,7 +26609,7 @@ function registerWindowControlHandlers(mainWindow) {
26398
26609
  mainWindow.maximize();
26399
26610
  }
26400
26611
  });
26401
- electron.ipcMain.handle(Channels.WINDOW_CLOSE, (event) => {
26612
+ electron.ipcMain.handle(Channels$1.WINDOW_CLOSE, (event) => {
26402
26613
  assertTrustedIpcSender(event);
26403
26614
  mainWindow.close();
26404
26615
  });
@@ -26500,6 +26711,12 @@ function getAdBlockDecision(details) {
26500
26711
  }
26501
26712
  let installed = false;
26502
26713
  const defaultSessionTabManagers = /* @__PURE__ */ new Set();
26714
+ function getRequestFilterDecision(details, adBlockingEnabled) {
26715
+ if (getAirGapBlockReason(details.url)) {
26716
+ return { cancel: true };
26717
+ }
26718
+ return adBlockingEnabled ? getAdBlockDecision(details) : null;
26719
+ }
26503
26720
  function installAdBlocking(tabManager) {
26504
26721
  defaultSessionTabManagers.add(tabManager);
26505
26722
  if (installed) return;
@@ -26507,17 +26724,18 @@ function installAdBlocking(tabManager) {
26507
26724
  electron.session.defaultSession.webRequest.onBeforeRequest((details, callback) => {
26508
26725
  const webContentsId = typeof details.webContentsId === "number" ? details.webContentsId : null;
26509
26726
  if (webContentsId == null) {
26510
- callback({});
26727
+ callback(getRequestFilterDecision(details, false) ?? {});
26511
26728
  return;
26512
26729
  }
26513
26730
  const manager = [...defaultSessionTabManagers].find(
26514
26731
  (candidate) => candidate.findTabByWebContentsId(webContentsId)
26515
26732
  );
26516
- if (!manager?.isAdBlockingEnabledForWebContents(webContentsId)) {
26517
- callback({});
26518
- return;
26519
- }
26520
- callback(getAdBlockDecision(details));
26733
+ callback(
26734
+ getRequestFilterDecision(
26735
+ details,
26736
+ manager?.isAdBlockingEnabledForWebContents(webContentsId) ?? false
26737
+ ) ?? {}
26738
+ );
26521
26739
  });
26522
26740
  }
26523
26741
  function unregisterAdBlockingTabManager(tabManager) {
@@ -26527,14 +26745,15 @@ function installAdBlockingForSession(ses, tabManager) {
26527
26745
  ses.webRequest.onBeforeRequest((details, callback) => {
26528
26746
  const webContentsId = typeof details.webContentsId === "number" ? details.webContentsId : null;
26529
26747
  if (webContentsId == null) {
26530
- callback({});
26748
+ callback(getRequestFilterDecision(details, false) ?? {});
26531
26749
  return;
26532
26750
  }
26533
- if (!tabManager.isAdBlockingEnabledForWebContents(webContentsId)) {
26534
- callback({});
26535
- return;
26536
- }
26537
- callback(getAdBlockDecision(details));
26751
+ callback(
26752
+ getRequestFilterDecision(
26753
+ details,
26754
+ tabManager.isAdBlockingEnabledForWebContents(webContentsId)
26755
+ ) ?? {}
26756
+ );
26538
26757
  });
26539
26758
  }
26540
26759
  const filePath$1 = () => path$1.join(electron.app.getPath("userData"), "vessel-downloads.json");
@@ -26582,7 +26801,7 @@ function persist() {
26582
26801
  persistence$1.schedule();
26583
26802
  }
26584
26803
  function emit$1() {
26585
- broadcaster$1?.(Channels.DOWNLOADS_UPDATE, listDownloads());
26804
+ broadcaster$1?.(Channels$1.DOWNLOADS_UPDATE, listDownloads());
26586
26805
  }
26587
26806
  function setDownloadBroadcaster(fn) {
26588
26807
  broadcaster$1 = fn;
@@ -26682,19 +26901,19 @@ function installDownloadHandlerForSession(targetSession, chromeView) {
26682
26901
  state: "progressing"
26683
26902
  };
26684
26903
  const record = upsertDownload(info);
26685
- send(Channels.DOWNLOAD_STARTED, { ...info, id: record.id, startedAt: record.startedAt, updatedAt: record.updatedAt });
26904
+ send(Channels$1.DOWNLOAD_STARTED, { ...info, id: record.id, startedAt: record.startedAt, updatedAt: record.updatedAt });
26686
26905
  item.on("updated", (_event2, state2) => {
26687
26906
  info.receivedBytes = item.getReceivedBytes();
26688
26907
  info.totalBytes = item.getTotalBytes();
26689
26908
  info.state = state2 === "progressing" ? "progressing" : "interrupted";
26690
26909
  const record2 = upsertDownload(info);
26691
- send(Channels.DOWNLOAD_PROGRESS, { ...info, id: record2.id, startedAt: record2.startedAt, updatedAt: record2.updatedAt });
26910
+ send(Channels$1.DOWNLOAD_PROGRESS, { ...info, id: record2.id, startedAt: record2.startedAt, updatedAt: record2.updatedAt });
26692
26911
  });
26693
26912
  item.once("done", (_event2, state2) => {
26694
26913
  info.receivedBytes = item.getReceivedBytes();
26695
26914
  info.state = state2 === "completed" ? "completed" : "cancelled";
26696
26915
  const record2 = upsertDownload(info);
26697
- send(Channels.DOWNLOAD_DONE, { ...info, id: record2.id, startedAt: record2.startedAt, updatedAt: record2.updatedAt });
26916
+ send(Channels$1.DOWNLOAD_DONE, { ...info, id: record2.id, startedAt: record2.startedAt, updatedAt: record2.updatedAt });
26698
26917
  });
26699
26918
  });
26700
26919
  }
@@ -26886,7 +27105,7 @@ function createFindInPageBridge(tabManager, chromeView) {
26886
27105
  if (wc.isDestroyed()) return;
26887
27106
  const listener = (_event, result) => {
26888
27107
  if (!chromeView.webContents.isDestroyed()) {
26889
- chromeView.webContents.send(Channels.FIND_IN_PAGE_RESULT, result);
27108
+ chromeView.webContents.send(Channels$1.FIND_IN_PAGE_RESULT, result);
26890
27109
  }
26891
27110
  };
26892
27111
  findResultListener = listener;
@@ -26963,136 +27182,136 @@ function registerPrivateIpcHandlers(state2) {
26963
27182
  const { chromeView, tabManager } = state2;
26964
27183
  const ipc = chromeView.webContents.ipc;
26965
27184
  const findBridge = createFindInPageBridge(tabManager, chromeView);
26966
- ipc.handle(Channels.TAB_CREATE, (_e, url) => {
27185
+ ipc.handle(Channels$1.TAB_CREATE, (_e, url) => {
26967
27186
  return tabManager.createTab(url);
26968
27187
  });
26969
- ipc.handle(Channels.TAB_CLOSE, (_e, id) => {
27188
+ ipc.handle(Channels$1.TAB_CLOSE, (_e, id) => {
26970
27189
  tabManager.closeTab(id);
26971
27190
  layoutPrivateViews(state2);
26972
27191
  });
26973
- ipc.handle(Channels.TAB_SWITCH, (_e, id) => {
27192
+ ipc.handle(Channels$1.TAB_SWITCH, (_e, id) => {
26974
27193
  tabManager.switchTab(id);
26975
27194
  layoutPrivateViews(state2);
26976
27195
  });
26977
- ipc.handle(Channels.TAB_NAVIGATE, (_e, id, url) => {
27196
+ ipc.handle(Channels$1.TAB_NAVIGATE, (_e, id, url) => {
26978
27197
  return tabManager.navigateTab(id, url);
26979
27198
  });
26980
- ipc.handle(Channels.TAB_BACK, (_e, id) => {
27199
+ ipc.handle(Channels$1.TAB_BACK, (_e, id) => {
26981
27200
  tabManager.goBack(id);
26982
27201
  });
26983
- ipc.handle(Channels.TAB_FORWARD, (_e, id) => {
27202
+ ipc.handle(Channels$1.TAB_FORWARD, (_e, id) => {
26984
27203
  tabManager.goForward(id);
26985
27204
  });
26986
- ipc.handle(Channels.TAB_RELOAD, (_e, id) => {
27205
+ ipc.handle(Channels$1.TAB_RELOAD, (_e, id) => {
26987
27206
  tabManager.reloadTab(id);
26988
27207
  });
26989
- ipc.handle(Channels.TAB_TOGGLE_AD_BLOCK, (_e, id) => {
27208
+ ipc.handle(Channels$1.TAB_TOGGLE_AD_BLOCK, (_e, id) => {
26990
27209
  const tab = tabManager.getTab(id);
26991
27210
  if (!tab) return null;
26992
27211
  const newState = !tab.state.adBlockingEnabled;
26993
27212
  tab.setAdBlockingEnabled(newState);
26994
27213
  return newState;
26995
27214
  });
26996
- ipc.handle(Channels.TAB_ZOOM_IN, (_e, id) => {
27215
+ ipc.handle(Channels$1.TAB_ZOOM_IN, (_e, id) => {
26997
27216
  tabManager.zoomIn(id);
26998
27217
  });
26999
- ipc.handle(Channels.TAB_ZOOM_OUT, (_e, id) => {
27218
+ ipc.handle(Channels$1.TAB_ZOOM_OUT, (_e, id) => {
27000
27219
  tabManager.zoomOut(id);
27001
27220
  });
27002
- ipc.handle(Channels.TAB_ZOOM_RESET, (_e, id) => {
27221
+ ipc.handle(Channels$1.TAB_ZOOM_RESET, (_e, id) => {
27003
27222
  tabManager.zoomReset(id);
27004
27223
  });
27005
- ipc.handle(Channels.TAB_STATE_GET, () => ({
27224
+ ipc.handle(Channels$1.TAB_STATE_GET, () => ({
27006
27225
  tabs: tabManager.getAllStates(),
27007
27226
  activeId: tabManager.getActiveTabId() || ""
27008
27227
  }));
27009
- ipc.handle(Channels.TAB_REOPEN_CLOSED, () => {
27228
+ ipc.handle(Channels$1.TAB_REOPEN_CLOSED, () => {
27010
27229
  const id = tabManager.reopenClosedTab();
27011
27230
  if (id) layoutPrivateViews(state2);
27012
27231
  return id;
27013
27232
  });
27014
- ipc.handle(Channels.TAB_DUPLICATE, (_e, id) => {
27233
+ ipc.handle(Channels$1.TAB_DUPLICATE, (_e, id) => {
27015
27234
  const newId = tabManager.duplicateTab(id);
27016
27235
  if (newId) layoutPrivateViews(state2);
27017
27236
  return newId;
27018
27237
  });
27019
- ipc.handle(Channels.TAB_PIN, (_e, id) => {
27238
+ ipc.handle(Channels$1.TAB_PIN, (_e, id) => {
27020
27239
  tabManager.pinTab(id);
27021
27240
  });
27022
- ipc.handle(Channels.TAB_UNPIN, (_e, id) => {
27241
+ ipc.handle(Channels$1.TAB_UNPIN, (_e, id) => {
27023
27242
  tabManager.unpinTab(id);
27024
27243
  });
27025
- ipc.handle(Channels.TAB_GROUP_CREATE, (_e, id) => {
27244
+ ipc.handle(Channels$1.TAB_GROUP_CREATE, (_e, id) => {
27026
27245
  return tabManager.createGroupFromTab(id);
27027
27246
  });
27028
- ipc.handle(Channels.TAB_GROUP_ADD_TAB, (_e, id, groupId) => {
27247
+ ipc.handle(Channels$1.TAB_GROUP_ADD_TAB, (_e, id, groupId) => {
27029
27248
  tabManager.assignTabToGroup(id, groupId);
27030
27249
  });
27031
- ipc.handle(Channels.TAB_GROUP_REMOVE_TAB, (_e, id) => {
27250
+ ipc.handle(Channels$1.TAB_GROUP_REMOVE_TAB, (_e, id) => {
27032
27251
  tabManager.removeTabFromGroup(id);
27033
27252
  });
27034
- ipc.handle(Channels.TAB_GROUP_TOGGLE_COLLAPSED, (_e, groupId) => {
27253
+ ipc.handle(Channels$1.TAB_GROUP_TOGGLE_COLLAPSED, (_e, groupId) => {
27035
27254
  return tabManager.toggleGroupCollapsed(groupId);
27036
27255
  });
27037
27256
  ipc.handle(
27038
- Channels.TAB_GROUP_SET_COLOR,
27257
+ Channels$1.TAB_GROUP_SET_COLOR,
27039
27258
  (_e, groupId, color) => {
27040
27259
  tabManager.setGroupColor(groupId, color);
27041
27260
  }
27042
27261
  );
27043
- ipc.handle(Channels.TAB_TOGGLE_MUTE, (_e, id) => {
27262
+ ipc.handle(Channels$1.TAB_TOGGLE_MUTE, (_e, id) => {
27044
27263
  return tabManager.toggleMuted(id);
27045
27264
  });
27046
- ipc.handle(Channels.TAB_PRINT, (_e, id) => {
27265
+ ipc.handle(Channels$1.TAB_PRINT, (_e, id) => {
27047
27266
  tabManager.printTab(id);
27048
27267
  });
27049
- ipc.handle(Channels.TAB_PRINT_TO_PDF, (_e, id) => {
27268
+ ipc.handle(Channels$1.TAB_PRINT_TO_PDF, (_e, id) => {
27050
27269
  return tabManager.saveTabAsPdf(id);
27051
27270
  });
27052
- ipc.on(Channels.TAB_CONTEXT_MENU, (_e, id) => {
27271
+ ipc.on(Channels$1.TAB_CONTEXT_MENU, (_e, id) => {
27053
27272
  showTabContextMenu(tabManager, id, state2.window, () => layoutPrivateViews(state2));
27054
27273
  });
27055
- ipc.on(Channels.TAB_GROUP_CONTEXT_MENU, (_e, groupId) => {
27274
+ ipc.on(Channels$1.TAB_GROUP_CONTEXT_MENU, (_e, groupId) => {
27056
27275
  showGroupContextMenu(tabManager, groupId, state2.window);
27057
27276
  });
27058
- ipc.handle(Channels.IS_PRIVATE_MODE, () => true);
27059
- ipc.handle(Channels.OPEN_PRIVATE_WINDOW, () => {
27277
+ ipc.handle(Channels$1.IS_PRIVATE_MODE, () => true);
27278
+ ipc.handle(Channels$1.OPEN_PRIVATE_WINDOW, () => {
27060
27279
  createPrivateWindow();
27061
27280
  });
27062
- ipc.handle(Channels.OPEN_NEW_WINDOW, () => {
27281
+ ipc.handle(Channels$1.OPEN_NEW_WINDOW, () => {
27063
27282
  const { createSecondaryWindow: createSecondaryWindow2 } = require("../secondary/window");
27064
27283
  createSecondaryWindow2();
27065
27284
  });
27066
- ipc.handle(Channels.WINDOW_MINIMIZE, () => {
27285
+ ipc.handle(Channels$1.WINDOW_MINIMIZE, () => {
27067
27286
  state2.window.minimize();
27068
27287
  });
27069
- ipc.handle(Channels.WINDOW_MAXIMIZE, () => {
27288
+ ipc.handle(Channels$1.WINDOW_MAXIMIZE, () => {
27070
27289
  if (state2.window.isMaximized()) {
27071
27290
  state2.window.unmaximize();
27072
27291
  } else {
27073
27292
  state2.window.maximize();
27074
27293
  }
27075
27294
  });
27076
- ipc.handle(Channels.WINDOW_CLOSE, () => {
27295
+ ipc.handle(Channels$1.WINDOW_CLOSE, () => {
27077
27296
  state2.window.close();
27078
27297
  });
27079
- ipc.handle(Channels.SETTINGS_VISIBILITY, () => {
27298
+ ipc.handle(Channels$1.SETTINGS_VISIBILITY, () => {
27080
27299
  return false;
27081
27300
  });
27082
- ipc.handle(Channels.FOCUS_MODE_TOGGLE, () => false);
27083
- ipc.handle(Channels.SIDEBAR_TOGGLE, () => ({ open: false, width: 0 }));
27084
- ipc.handle(Channels.DEVTOOLS_PANEL_TOGGLE, () => ({ open: false }));
27301
+ ipc.handle(Channels$1.FOCUS_MODE_TOGGLE, () => false);
27302
+ ipc.handle(Channels$1.SIDEBAR_TOGGLE, () => ({ open: false, width: 0 }));
27303
+ ipc.handle(Channels$1.DEVTOOLS_PANEL_TOGGLE, () => ({ open: false }));
27085
27304
  ipc.handle(
27086
- Channels.FIND_IN_PAGE_START,
27305
+ Channels$1.FIND_IN_PAGE_START,
27087
27306
  (_e, text, options) => {
27088
27307
  return findBridge.start(text, options);
27089
27308
  }
27090
27309
  );
27091
- ipc.handle(Channels.FIND_IN_PAGE_NEXT, (_e, forward) => {
27310
+ ipc.handle(Channels$1.FIND_IN_PAGE_NEXT, (_e, forward) => {
27092
27311
  return findBridge.next(forward);
27093
27312
  });
27094
27313
  ipc.handle(
27095
- Channels.FIND_IN_PAGE_STOP,
27314
+ Channels$1.FIND_IN_PAGE_STOP,
27096
27315
  (_e, action) => {
27097
27316
  findBridge.stop(action);
27098
27317
  }
@@ -27126,7 +27345,7 @@ function createPrivateWindow() {
27126
27345
  win,
27127
27346
  (tabs, activeId) => {
27128
27347
  if (!chromeView.webContents.isDestroyed()) {
27129
- chromeView.webContents.send(Channels.TAB_STATE_UPDATE, tabs, activeId);
27348
+ chromeView.webContents.send(Channels$1.TAB_STATE_UPDATE, tabs, activeId);
27130
27349
  }
27131
27350
  layoutPrivateViews(state2);
27132
27351
  },
@@ -27198,113 +27417,113 @@ function registerSecondaryIpcHandlers(state2) {
27198
27417
  const { chromeView, tabManager } = state2;
27199
27418
  const ipc = chromeView.webContents.ipc;
27200
27419
  const findBridge = createFindInPageBridge(tabManager, chromeView);
27201
- ipc.handle(Channels.TAB_CREATE, (_e, url) => {
27420
+ ipc.handle(Channels$1.TAB_CREATE, (_e, url) => {
27202
27421
  return tabManager.createTab(url || loadSettings().defaultUrl);
27203
27422
  });
27204
- ipc.handle(Channels.TAB_CLOSE, (_e, id) => {
27423
+ ipc.handle(Channels$1.TAB_CLOSE, (_e, id) => {
27205
27424
  tabManager.closeTab(id);
27206
27425
  layoutSecondaryViews(state2);
27207
27426
  });
27208
- ipc.handle(Channels.TAB_SWITCH, (_e, id) => {
27427
+ ipc.handle(Channels$1.TAB_SWITCH, (_e, id) => {
27209
27428
  tabManager.switchTab(id);
27210
27429
  layoutSecondaryViews(state2);
27211
27430
  });
27212
- ipc.handle(Channels.TAB_NAVIGATE, (_e, id, url) => {
27431
+ ipc.handle(Channels$1.TAB_NAVIGATE, (_e, id, url) => {
27213
27432
  return tabManager.navigateTab(id, url);
27214
27433
  });
27215
- ipc.handle(Channels.TAB_BACK, (_e, id) => tabManager.goBack(id));
27216
- ipc.handle(Channels.TAB_FORWARD, (_e, id) => tabManager.goForward(id));
27217
- ipc.handle(Channels.TAB_RELOAD, (_e, id) => tabManager.reloadTab(id));
27218
- ipc.handle(Channels.TAB_TOGGLE_AD_BLOCK, (_e, id) => {
27434
+ ipc.handle(Channels$1.TAB_BACK, (_e, id) => tabManager.goBack(id));
27435
+ ipc.handle(Channels$1.TAB_FORWARD, (_e, id) => tabManager.goForward(id));
27436
+ ipc.handle(Channels$1.TAB_RELOAD, (_e, id) => tabManager.reloadTab(id));
27437
+ ipc.handle(Channels$1.TAB_TOGGLE_AD_BLOCK, (_e, id) => {
27219
27438
  const tab = tabManager.getTab(id);
27220
27439
  if (!tab) return null;
27221
27440
  const enabled = !tab.state.adBlockingEnabled;
27222
27441
  tab.setAdBlockingEnabled(enabled);
27223
27442
  return enabled;
27224
27443
  });
27225
- ipc.handle(Channels.TAB_ZOOM_IN, (_e, id) => tabManager.zoomIn(id));
27226
- ipc.handle(Channels.TAB_ZOOM_OUT, (_e, id) => tabManager.zoomOut(id));
27227
- ipc.handle(Channels.TAB_ZOOM_RESET, (_e, id) => tabManager.zoomReset(id));
27228
- ipc.handle(Channels.TAB_REOPEN_CLOSED, () => {
27444
+ ipc.handle(Channels$1.TAB_ZOOM_IN, (_e, id) => tabManager.zoomIn(id));
27445
+ ipc.handle(Channels$1.TAB_ZOOM_OUT, (_e, id) => tabManager.zoomOut(id));
27446
+ ipc.handle(Channels$1.TAB_ZOOM_RESET, (_e, id) => tabManager.zoomReset(id));
27447
+ ipc.handle(Channels$1.TAB_REOPEN_CLOSED, () => {
27229
27448
  const id = tabManager.reopenClosedTab();
27230
27449
  if (id) layoutSecondaryViews(state2);
27231
27450
  return id;
27232
27451
  });
27233
- ipc.handle(Channels.TAB_DUPLICATE, (_e, id) => {
27452
+ ipc.handle(Channels$1.TAB_DUPLICATE, (_e, id) => {
27234
27453
  const newId = tabManager.duplicateTab(id);
27235
27454
  if (newId) layoutSecondaryViews(state2);
27236
27455
  return newId;
27237
27456
  });
27238
- ipc.handle(Channels.TAB_PIN, (_e, id) => tabManager.pinTab(id));
27239
- ipc.handle(Channels.TAB_UNPIN, (_e, id) => tabManager.unpinTab(id));
27457
+ ipc.handle(Channels$1.TAB_PIN, (_e, id) => tabManager.pinTab(id));
27458
+ ipc.handle(Channels$1.TAB_UNPIN, (_e, id) => tabManager.unpinTab(id));
27240
27459
  ipc.handle(
27241
- Channels.TAB_GROUP_CREATE,
27460
+ Channels$1.TAB_GROUP_CREATE,
27242
27461
  (_e, id) => tabManager.createGroupFromTab(id)
27243
27462
  );
27244
27463
  ipc.handle(
27245
- Channels.TAB_GROUP_ADD_TAB,
27464
+ Channels$1.TAB_GROUP_ADD_TAB,
27246
27465
  (_e, id, groupId) => tabManager.assignTabToGroup(id, groupId)
27247
27466
  );
27248
27467
  ipc.handle(
27249
- Channels.TAB_GROUP_REMOVE_TAB,
27468
+ Channels$1.TAB_GROUP_REMOVE_TAB,
27250
27469
  (_e, id) => tabManager.removeTabFromGroup(id)
27251
27470
  );
27252
27471
  ipc.handle(
27253
- Channels.TAB_GROUP_TOGGLE_COLLAPSED,
27472
+ Channels$1.TAB_GROUP_TOGGLE_COLLAPSED,
27254
27473
  (_e, groupId) => tabManager.toggleGroupCollapsed(groupId)
27255
27474
  );
27256
27475
  ipc.handle(
27257
- Channels.TAB_GROUP_SET_COLOR,
27476
+ Channels$1.TAB_GROUP_SET_COLOR,
27258
27477
  (_e, groupId, color) => tabManager.setGroupColor(groupId, color)
27259
27478
  );
27260
27479
  ipc.handle(
27261
- Channels.TAB_TOGGLE_MUTE,
27480
+ Channels$1.TAB_TOGGLE_MUTE,
27262
27481
  (_e, id) => tabManager.toggleMuted(id)
27263
27482
  );
27264
- ipc.handle(Channels.TAB_PRINT, (_e, id) => tabManager.printTab(id));
27483
+ ipc.handle(Channels$1.TAB_PRINT, (_e, id) => tabManager.printTab(id));
27265
27484
  ipc.handle(
27266
- Channels.TAB_PRINT_TO_PDF,
27485
+ Channels$1.TAB_PRINT_TO_PDF,
27267
27486
  (_e, id) => tabManager.saveTabAsPdf(id)
27268
27487
  );
27269
- ipc.handle(Channels.TAB_STATE_GET, () => ({
27488
+ ipc.handle(Channels$1.TAB_STATE_GET, () => ({
27270
27489
  tabs: tabManager.getAllStates(),
27271
27490
  activeId: tabManager.getActiveTabId() || ""
27272
27491
  }));
27273
27492
  ipc.on(
27274
- Channels.TAB_CONTEXT_MENU,
27493
+ Channels$1.TAB_CONTEXT_MENU,
27275
27494
  (_e, id) => showTabContextMenu(state2.tabManager, id, state2.window, () => layoutSecondaryViews(state2))
27276
27495
  );
27277
27496
  ipc.on(
27278
- Channels.TAB_GROUP_CONTEXT_MENU,
27497
+ Channels$1.TAB_GROUP_CONTEXT_MENU,
27279
27498
  (_e, groupId) => showGroupContextMenu(state2.tabManager, groupId, state2.window)
27280
27499
  );
27281
- ipc.handle(Channels.OPEN_NEW_WINDOW, () => createSecondaryWindow());
27282
- ipc.handle(Channels.OPEN_PRIVATE_WINDOW, () => {
27500
+ ipc.handle(Channels$1.OPEN_NEW_WINDOW, () => createSecondaryWindow());
27501
+ ipc.handle(Channels$1.OPEN_PRIVATE_WINDOW, () => {
27283
27502
  const { createPrivateWindow: createPrivateWindow2 } = require("../private/window");
27284
27503
  createPrivateWindow2();
27285
27504
  });
27286
- ipc.handle(Channels.IS_PRIVATE_MODE, () => false);
27287
- ipc.handle(Channels.WINDOW_MINIMIZE, () => state2.window.minimize());
27288
- ipc.handle(Channels.WINDOW_MAXIMIZE, () => {
27505
+ ipc.handle(Channels$1.IS_PRIVATE_MODE, () => false);
27506
+ ipc.handle(Channels$1.WINDOW_MINIMIZE, () => state2.window.minimize());
27507
+ ipc.handle(Channels$1.WINDOW_MAXIMIZE, () => {
27289
27508
  if (state2.window.isMaximized()) state2.window.unmaximize();
27290
27509
  else state2.window.maximize();
27291
27510
  });
27292
- ipc.handle(Channels.WINDOW_CLOSE, () => state2.window.close());
27293
- ipc.handle(Channels.SETTINGS_VISIBILITY, () => false);
27294
- ipc.handle(Channels.FOCUS_MODE_TOGGLE, () => false);
27295
- ipc.handle(Channels.SIDEBAR_TOGGLE, () => ({ open: false, width: 0 }));
27296
- ipc.handle(Channels.DEVTOOLS_PANEL_TOGGLE, () => ({ open: false }));
27511
+ ipc.handle(Channels$1.WINDOW_CLOSE, () => state2.window.close());
27512
+ ipc.handle(Channels$1.SETTINGS_VISIBILITY, () => false);
27513
+ ipc.handle(Channels$1.FOCUS_MODE_TOGGLE, () => false);
27514
+ ipc.handle(Channels$1.SIDEBAR_TOGGLE, () => ({ open: false, width: 0 }));
27515
+ ipc.handle(Channels$1.DEVTOOLS_PANEL_TOGGLE, () => ({ open: false }));
27297
27516
  ipc.handle(
27298
- Channels.FIND_IN_PAGE_START,
27517
+ Channels$1.FIND_IN_PAGE_START,
27299
27518
  (_e, text, options) => {
27300
27519
  return findBridge.start(text, options);
27301
27520
  }
27302
27521
  );
27303
- ipc.handle(Channels.FIND_IN_PAGE_NEXT, (_e, forward) => {
27522
+ ipc.handle(Channels$1.FIND_IN_PAGE_NEXT, (_e, forward) => {
27304
27523
  return findBridge.next(forward);
27305
27524
  });
27306
27525
  ipc.handle(
27307
- Channels.FIND_IN_PAGE_STOP,
27526
+ Channels$1.FIND_IN_PAGE_STOP,
27308
27527
  (_e, action) => {
27309
27528
  findBridge.stop(action);
27310
27529
  }
@@ -27333,7 +27552,7 @@ function createSecondaryWindow() {
27333
27552
  win.contentView.addChildView(chromeView);
27334
27553
  const tabManager = new TabManager(win, (tabs, activeId) => {
27335
27554
  if (!chromeView.webContents.isDestroyed()) {
27336
- chromeView.webContents.send(Channels.TAB_STATE_UPDATE, tabs, activeId);
27555
+ chromeView.webContents.send(Channels$1.TAB_STATE_UPDATE, tabs, activeId);
27337
27556
  }
27338
27557
  layoutSecondaryViews(state2);
27339
27558
  });
@@ -27363,12 +27582,12 @@ function getSafeBookmarkExportName(name) {
27363
27582
  return safeName || "folder";
27364
27583
  }
27365
27584
  function registerBookmarkHandlers() {
27366
- electron.ipcMain.handle(Channels.BOOKMARKS_GET, (event) => {
27585
+ electron.ipcMain.handle(Channels$1.BOOKMARKS_GET, (event) => {
27367
27586
  assertTrustedIpcSender(event);
27368
27587
  return getState();
27369
27588
  });
27370
27589
  electron.ipcMain.handle(
27371
- Channels.FOLDER_CREATE,
27590
+ Channels$1.FOLDER_CREATE,
27372
27591
  (event, name, summary) => {
27373
27592
  assertTrustedIpcSender(event);
27374
27593
  trackBookmarkAction("folder_create");
@@ -27376,7 +27595,7 @@ function registerBookmarkHandlers() {
27376
27595
  }
27377
27596
  );
27378
27597
  electron.ipcMain.handle(
27379
- Channels.BOOKMARK_SAVE,
27598
+ Channels$1.BOOKMARK_SAVE,
27380
27599
  (event, url, title, folderId, note, intent, expectedContent, keyFields, agentHints) => {
27381
27600
  assertTrustedIpcSender(event);
27382
27601
  trackBookmarkAction("save");
@@ -27398,20 +27617,20 @@ function registerBookmarkHandlers() {
27398
27617
  }
27399
27618
  );
27400
27619
  electron.ipcMain.handle(
27401
- Channels.BOOKMARK_UPDATE,
27620
+ Channels$1.BOOKMARK_UPDATE,
27402
27621
  (event, id, updates) => {
27403
27622
  assertTrustedIpcSender(event);
27404
27623
  trackBookmarkAction("save");
27405
27624
  return updateBookmark(id, updates);
27406
27625
  }
27407
27626
  );
27408
- electron.ipcMain.handle(Channels.BOOKMARK_REMOVE, (event, id) => {
27627
+ electron.ipcMain.handle(Channels$1.BOOKMARK_REMOVE, (event, id) => {
27409
27628
  assertTrustedIpcSender(event);
27410
27629
  trackBookmarkAction("remove");
27411
27630
  return removeBookmark(id);
27412
27631
  });
27413
27632
  electron.ipcMain.handle(
27414
- Channels.BOOKMARKS_EXPORT_HTML,
27633
+ Channels$1.BOOKMARKS_EXPORT_HTML,
27415
27634
  async (event, options) => {
27416
27635
  assertTrustedIpcSender(event);
27417
27636
  const { canceled, filePath: filePath2 } = await electron.dialog.showSaveDialog({
@@ -27431,7 +27650,7 @@ function registerBookmarkHandlers() {
27431
27650
  };
27432
27651
  }
27433
27652
  );
27434
- electron.ipcMain.handle(Channels.BOOKMARKS_EXPORT_JSON, async (event) => {
27653
+ electron.ipcMain.handle(Channels$1.BOOKMARKS_EXPORT_JSON, async (event) => {
27435
27654
  assertTrustedIpcSender(event);
27436
27655
  const { canceled, filePath: filePath2 } = await electron.dialog.showSaveDialog({
27437
27656
  title: "Export Vessel Bookmark Archive",
@@ -27448,7 +27667,7 @@ function registerBookmarkHandlers() {
27448
27667
  };
27449
27668
  });
27450
27669
  electron.ipcMain.handle(
27451
- Channels.FOLDER_EXPORT_HTML,
27670
+ Channels$1.FOLDER_EXPORT_HTML,
27452
27671
  async (event, folderId, options) => {
27453
27672
  assertTrustedIpcSender(event);
27454
27673
  const folder = getFolder(folderId);
@@ -27471,7 +27690,7 @@ function registerBookmarkHandlers() {
27471
27690
  };
27472
27691
  }
27473
27692
  );
27474
- electron.ipcMain.handle(Channels.BOOKMARKS_IMPORT_HTML, async (event) => {
27693
+ electron.ipcMain.handle(Channels$1.BOOKMARKS_IMPORT_HTML, async (event) => {
27475
27694
  assertTrustedIpcSender(event);
27476
27695
  const { canceled, filePaths } = await electron.dialog.showOpenDialog({
27477
27696
  title: "Import Bookmarks",
@@ -27485,7 +27704,7 @@ function registerBookmarkHandlers() {
27485
27704
  trackBookmarkAction("import");
27486
27705
  return importBookmarksFromHtml(content);
27487
27706
  });
27488
- electron.ipcMain.handle(Channels.BOOKMARKS_IMPORT_JSON, async (event) => {
27707
+ electron.ipcMain.handle(Channels$1.BOOKMARKS_IMPORT_JSON, async (event) => {
27489
27708
  assertTrustedIpcSender(event);
27490
27709
  const { canceled, filePaths } = await electron.dialog.showOpenDialog({
27491
27710
  title: "Import Bookmarks",
@@ -27499,13 +27718,13 @@ function registerBookmarkHandlers() {
27499
27718
  trackBookmarkAction("import");
27500
27719
  return importBookmarksFromJson(content);
27501
27720
  });
27502
- electron.ipcMain.handle(Channels.FOLDER_REMOVE, (event, id, deleteContents) => {
27721
+ electron.ipcMain.handle(Channels$1.FOLDER_REMOVE, (event, id, deleteContents) => {
27503
27722
  assertTrustedIpcSender(event);
27504
27723
  trackBookmarkAction("folder_remove");
27505
27724
  return removeFolder(id, deleteContents ?? false);
27506
27725
  });
27507
27726
  electron.ipcMain.handle(
27508
- Channels.FOLDER_RENAME,
27727
+ Channels$1.FOLDER_RENAME,
27509
27728
  (event, id, newName, summary) => {
27510
27729
  assertTrustedIpcSender(event);
27511
27730
  return renameFolder(id, newName, summary);
@@ -27513,23 +27732,23 @@ function registerBookmarkHandlers() {
27513
27732
  );
27514
27733
  }
27515
27734
  function registerHistoryHandlers() {
27516
- electron.ipcMain.handle(Channels.HISTORY_GET, (event) => {
27735
+ electron.ipcMain.handle(Channels$1.HISTORY_GET, (event) => {
27517
27736
  assertTrustedIpcSender(event);
27518
27737
  return getState$1();
27519
27738
  });
27520
- electron.ipcMain.handle(Channels.HISTORY_LIST, (event, offset, limit) => {
27739
+ electron.ipcMain.handle(Channels$1.HISTORY_LIST, (event, offset, limit) => {
27521
27740
  assertTrustedIpcSender(event);
27522
27741
  return listEntries$2(offset, limit);
27523
27742
  });
27524
- electron.ipcMain.handle(Channels.HISTORY_SEARCH, (event, query) => {
27743
+ electron.ipcMain.handle(Channels$1.HISTORY_SEARCH, (event, query) => {
27525
27744
  assertTrustedIpcSender(event);
27526
27745
  return search(query);
27527
27746
  });
27528
- electron.ipcMain.handle(Channels.HISTORY_CLEAR, (event) => {
27747
+ electron.ipcMain.handle(Channels$1.HISTORY_CLEAR, (event) => {
27529
27748
  assertTrustedIpcSender(event);
27530
27749
  clearAll$1();
27531
27750
  });
27532
- electron.ipcMain.handle(Channels.HISTORY_EXPORT_HTML, async (event) => {
27751
+ electron.ipcMain.handle(Channels$1.HISTORY_EXPORT_HTML, async (event) => {
27533
27752
  assertTrustedIpcSender(event);
27534
27753
  const { canceled, filePath: filePath2 } = await electron.dialog.showSaveDialog({
27535
27754
  title: "Export History",
@@ -27541,7 +27760,7 @@ function registerHistoryHandlers() {
27541
27760
  await fs.promises.writeFile(filePath2, content, "utf-8");
27542
27761
  return { filePath: filePath2, count: getState$1().entries.length };
27543
27762
  });
27544
- electron.ipcMain.handle(Channels.HISTORY_EXPORT_JSON, async (event) => {
27763
+ electron.ipcMain.handle(Channels$1.HISTORY_EXPORT_JSON, async (event) => {
27545
27764
  assertTrustedIpcSender(event);
27546
27765
  const { canceled, filePath: filePath2 } = await electron.dialog.showSaveDialog({
27547
27766
  title: "Export History",
@@ -27553,7 +27772,7 @@ function registerHistoryHandlers() {
27553
27772
  await fs.promises.writeFile(filePath2, content, "utf-8");
27554
27773
  return { filePath: filePath2, count: getState$1().entries.length };
27555
27774
  });
27556
- electron.ipcMain.handle(Channels.HISTORY_IMPORT, async (event) => {
27775
+ electron.ipcMain.handle(Channels$1.HISTORY_IMPORT, async (event) => {
27557
27776
  assertTrustedIpcSender(event);
27558
27777
  const { canceled, filePaths } = await electron.dialog.showOpenDialog({
27559
27778
  title: "Import History",
@@ -27633,7 +27852,7 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27633
27852
  const previousStatus = getPremiumState().status;
27634
27853
  const state2 = await verifySubscription(sessionId);
27635
27854
  if (isPremiumActiveState(state2)) {
27636
- sendToRendererViews(Channels.PREMIUM_UPDATE, state2);
27855
+ sendToRendererViews(Channels$1.PREMIUM_UPDATE, state2);
27637
27856
  trackPremiumFunnel("premium_verify_succeeded", {
27638
27857
  status: state2.status,
27639
27858
  source: "checkout_auto"
@@ -27668,11 +27887,11 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27668
27887
  void handleUrl(currentUrl);
27669
27888
  }
27670
27889
  };
27671
- electron.ipcMain.handle(Channels.PREMIUM_GET_STATE, (event) => {
27890
+ electron.ipcMain.handle(Channels$1.PREMIUM_GET_STATE, (event) => {
27672
27891
  assertTrustedIpcSender(event);
27673
27892
  return getPremiumState();
27674
27893
  });
27675
- electron.ipcMain.handle(Channels.PREMIUM_ACTIVATION_START, async (event, email) => {
27894
+ electron.ipcMain.handle(Channels$1.PREMIUM_ACTIVATION_START, async (event, email) => {
27676
27895
  assertTrustedIpcSender(event);
27677
27896
  assertString(email, "email");
27678
27897
  if (!isValidEmail$1(email)) {
@@ -27696,7 +27915,7 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27696
27915
  return result;
27697
27916
  });
27698
27917
  electron.ipcMain.handle(
27699
- Channels.PREMIUM_ACTIVATION_VERIFY,
27918
+ Channels$1.PREMIUM_ACTIVATION_VERIFY,
27700
27919
  async (event, email, code, challengeToken) => {
27701
27920
  assertTrustedIpcSender(event);
27702
27921
  assertString(email, "email");
@@ -27726,7 +27945,7 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27726
27945
  result.state.status,
27727
27946
  "settings_code"
27728
27947
  );
27729
- sendToRendererViews(Channels.PREMIUM_UPDATE, result.state);
27948
+ sendToRendererViews(Channels$1.PREMIUM_UPDATE, result.state);
27730
27949
  } else {
27731
27950
  trackPremiumFunnel("premium_verify_failed", {
27732
27951
  status: result.state.status,
@@ -27737,7 +27956,7 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27737
27956
  return result;
27738
27957
  }
27739
27958
  );
27740
- electron.ipcMain.handle(Channels.PREMIUM_CHECKOUT, async (event, email) => {
27959
+ electron.ipcMain.handle(Channels$1.PREMIUM_CHECKOUT, async (event, email) => {
27741
27960
  assertTrustedIpcSender(event);
27742
27961
  trackPremiumFunnel("checkout_clicked");
27743
27962
  const result = await getCheckoutUrl(email);
@@ -27749,21 +27968,21 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27749
27968
  }
27750
27969
  return result;
27751
27970
  });
27752
- electron.ipcMain.handle(Channels.PREMIUM_RESET, (event) => {
27971
+ electron.ipcMain.handle(Channels$1.PREMIUM_RESET, (event) => {
27753
27972
  assertTrustedIpcSender(event);
27754
27973
  trackPremiumFunnel("reset");
27755
27974
  const state2 = resetPremium();
27756
- sendToRendererViews(Channels.PREMIUM_UPDATE, state2);
27975
+ sendToRendererViews(Channels$1.PREMIUM_UPDATE, state2);
27757
27976
  return state2;
27758
27977
  });
27759
- electron.ipcMain.handle(Channels.PREMIUM_TRACK_CONTEXT, (event, step) => {
27978
+ electron.ipcMain.handle(Channels$1.PREMIUM_TRACK_CONTEXT, (event, step) => {
27760
27979
  assertTrustedIpcSender(event);
27761
27980
  assertString(step, "step");
27762
27981
  if (PREMIUM_TRACKABLE_STEPS.includes(step)) {
27763
27982
  trackPremiumFunnel(step);
27764
27983
  }
27765
27984
  });
27766
- electron.ipcMain.handle(Channels.PREMIUM_PORTAL, async (event) => {
27985
+ electron.ipcMain.handle(Channels$1.PREMIUM_PORTAL, async (event) => {
27767
27986
  assertTrustedIpcSender(event);
27768
27987
  trackPremiumFunnel("portal_opened");
27769
27988
  const result = await getPortalUrl();
@@ -27774,21 +27993,21 @@ function registerPremiumHandlers(tabManager, sendToRendererViews) {
27774
27993
  });
27775
27994
  }
27776
27995
  function registerSessionHandlers(tabManager) {
27777
- electron.ipcMain.handle(Channels.SESSION_LIST, (event) => {
27996
+ electron.ipcMain.handle(Channels$1.SESSION_LIST, (event) => {
27778
27997
  assertTrustedIpcSender(event);
27779
27998
  return listNamedSessions();
27780
27999
  });
27781
- electron.ipcMain.handle(Channels.SESSION_SAVE, async (event, name) => {
28000
+ electron.ipcMain.handle(Channels$1.SESSION_SAVE, async (event, name) => {
27782
28001
  assertTrustedIpcSender(event);
27783
28002
  assertString(name, "name");
27784
28003
  return await saveNamedSession(tabManager, name);
27785
28004
  });
27786
- electron.ipcMain.handle(Channels.SESSION_LOAD, async (event, name) => {
28005
+ electron.ipcMain.handle(Channels$1.SESSION_LOAD, async (event, name) => {
27787
28006
  assertTrustedIpcSender(event);
27788
28007
  assertString(name, "name");
27789
28008
  return await loadNamedSession(tabManager, name);
27790
28009
  });
27791
- electron.ipcMain.handle(Channels.SESSION_DELETE, (event, name) => {
28010
+ electron.ipcMain.handle(Channels$1.SESSION_DELETE, (event, name) => {
27792
28011
  assertTrustedIpcSender(event);
27793
28012
  assertString(name, "name");
27794
28013
  return deleteNamedSession(name);
@@ -27826,7 +28045,7 @@ function buildCertificateDetailsHtml(state2) {
27826
28045
  </html>`;
27827
28046
  }
27828
28047
  function registerSecurityHandlers(tabManager) {
27829
- electron.ipcMain.handle(Channels.SECURITY_SHOW_DETAILS, async (event, state2) => {
28048
+ electron.ipcMain.handle(Channels$1.SECURITY_SHOW_DETAILS, async (event, state2) => {
27830
28049
  assertTrustedIpcSender(event);
27831
28050
  const domain = (() => {
27832
28051
  try {
@@ -27850,12 +28069,12 @@ function registerSecurityHandlers(tabManager) {
27850
28069
  });
27851
28070
  void loadInternalDataURL(win.webContents, `data:text/html;charset=utf-8,${encodeURIComponent(content)}`);
27852
28071
  });
27853
- electron.ipcMain.handle(Channels.SECURITY_PROCEED_ANYWAY, (event, tabId) => {
28072
+ electron.ipcMain.handle(Channels$1.SECURITY_PROCEED_ANYWAY, (event, tabId) => {
27854
28073
  assertTrustedIpcSender(event);
27855
28074
  assertString(tabId, "tabId");
27856
28075
  tabManager.proceedAnyway(tabId);
27857
28076
  });
27858
- electron.ipcMain.handle(Channels.SECURITY_GO_BACK_TO_SAFETY, (event, tabId) => {
28077
+ electron.ipcMain.handle(Channels$1.SECURITY_GO_BACK_TO_SAFETY, (event, tabId) => {
27859
28078
  assertTrustedIpcSender(event);
27860
28079
  assertString(tabId, "tabId");
27861
28080
  tabManager.goBackToSafety(tabId);
@@ -27863,8 +28082,14 @@ function registerSecurityHandlers(tabManager) {
27863
28082
  }
27864
28083
  const logger$7 = createLogger("CodexIPC");
27865
28084
  function registerCodexHandlers() {
27866
- electron.ipcMain.handle(Channels.CODEX_START_AUTH, async (event) => {
28085
+ electron.ipcMain.handle(Channels$1.CODEX_START_AUTH, async (event) => {
27867
28086
  assertTrustedIpcSender(event);
28087
+ if (isAirGapped()) {
28088
+ return {
28089
+ ok: false,
28090
+ error: "Codex authentication is unavailable in air-gapped mode."
28091
+ };
28092
+ }
27868
28093
  const wc = event.sender;
27869
28094
  if (!wc || wc.isDestroyed()) {
27870
28095
  return {
@@ -27874,7 +28099,7 @@ function registerCodexHandlers() {
27874
28099
  }
27875
28100
  const sendStatus = (status, error) => {
27876
28101
  try {
27877
- wc.send(Channels.CODEX_AUTH_STATUS, { status, error: error || null });
28102
+ wc.send(Channels$1.CODEX_AUTH_STATUS, { status, error: error || null });
27878
28103
  } catch {
27879
28104
  logger$7.warn("Codex auth status send failed — window may be closed");
27880
28105
  }
@@ -27895,12 +28120,12 @@ function registerCodexHandlers() {
27895
28120
  };
27896
28121
  }
27897
28122
  });
27898
- electron.ipcMain.handle(Channels.CODEX_CANCEL_AUTH, (event) => {
28123
+ electron.ipcMain.handle(Channels$1.CODEX_CANCEL_AUTH, (event) => {
27899
28124
  assertTrustedIpcSender(event);
27900
28125
  cancelCodexOAuth();
27901
28126
  return { ok: true };
27902
28127
  });
27903
- electron.ipcMain.handle(Channels.CODEX_DISCONNECT, (event) => {
28128
+ electron.ipcMain.handle(Channels$1.CODEX_DISCONNECT, (event) => {
27904
28129
  assertTrustedIpcSender(event);
27905
28130
  clearStoredCodexTokens();
27906
28131
  return { ok: true };
@@ -27973,8 +28198,14 @@ function cancelOpenRouterOAuth() {
27973
28198
  }
27974
28199
  const logger$5 = createLogger("OpenRouterIPC");
27975
28200
  function registerOpenRouterHandlers(applySettingChange) {
27976
- electron.ipcMain.handle(Channels.OPENROUTER_START_AUTH, async (event) => {
28201
+ electron.ipcMain.handle(Channels$1.OPENROUTER_START_AUTH, async (event) => {
27977
28202
  assertTrustedIpcSender(event);
28203
+ if (isAirGapped()) {
28204
+ return {
28205
+ ok: false,
28206
+ error: "OpenRouter authentication is unavailable in air-gapped mode."
28207
+ };
28208
+ }
27978
28209
  const wc = event.sender;
27979
28210
  if (!wc || wc.isDestroyed()) {
27980
28211
  return {
@@ -27984,7 +28215,7 @@ function registerOpenRouterHandlers(applySettingChange) {
27984
28215
  }
27985
28216
  const sendStatus = (status, error) => {
27986
28217
  try {
27987
- wc.send(Channels.OPENROUTER_AUTH_STATUS, { status, error: error || null });
28218
+ wc.send(Channels$1.OPENROUTER_AUTH_STATUS, { status, error: error || null });
27988
28219
  } catch {
27989
28220
  logger$5.warn("OpenRouter auth status send failed - window may be closed");
27990
28221
  }
@@ -28013,12 +28244,124 @@ function registerOpenRouterHandlers(applySettingChange) {
28013
28244
  };
28014
28245
  }
28015
28246
  });
28016
- electron.ipcMain.handle(Channels.OPENROUTER_CANCEL_AUTH, (event) => {
28247
+ electron.ipcMain.handle(Channels$1.OPENROUTER_CANCEL_AUTH, (event) => {
28017
28248
  assertTrustedIpcSender(event);
28018
28249
  cancelOpenRouterOAuth();
28019
28250
  return { ok: true };
28020
28251
  });
28021
28252
  }
28253
+ function registerSidebarHandlers(windowState, requireTrusted) {
28254
+ let sidebarResizeRecoveryTimer = null;
28255
+ let sidebarResizeActive = false;
28256
+ const relayout = () => layoutViews(windowState);
28257
+ const clearSidebarResizeRecoveryTimer = () => {
28258
+ if (!sidebarResizeRecoveryTimer) return;
28259
+ clearTimeout(sidebarResizeRecoveryTimer);
28260
+ sidebarResizeRecoveryTimer = null;
28261
+ };
28262
+ const stopSidebarResize = () => {
28263
+ sidebarResizeActive = false;
28264
+ clearSidebarResizeRecoveryTimer();
28265
+ };
28266
+ const restoreSidebarLayoutAfterResize = () => {
28267
+ clearSidebarResizeRecoveryTimer();
28268
+ if (!sidebarResizeActive) return;
28269
+ sidebarResizeActive = false;
28270
+ relayout();
28271
+ };
28272
+ const scheduleSidebarResizeRecovery = () => {
28273
+ clearSidebarResizeRecoveryTimer();
28274
+ sidebarResizeRecoveryTimer = setTimeout(() => {
28275
+ restoreSidebarLayoutAfterResize();
28276
+ }, 1200);
28277
+ };
28278
+ electron.ipcMain.handle(Channels$1.SIDEBAR_TOGGLE, (event) => {
28279
+ requireTrusted(event);
28280
+ return toggleDockedSidebar(windowState, relayout);
28281
+ });
28282
+ electron.ipcMain.handle(Channels$1.SIDEBAR_NAVIGATE, (event, tab) => {
28283
+ requireTrusted(event);
28284
+ assertString(tab, "tab");
28285
+ if (windowState.uiState.sidebarPanelMode === "closed") {
28286
+ openDockedSidebar(windowState, relayout);
28287
+ }
28288
+ if (!windowState.sidebarView.webContents.isDestroyed()) {
28289
+ windowState.sidebarView.webContents.send(Channels$1.SIDEBAR_NAVIGATE, tab);
28290
+ }
28291
+ windowState.sidebarWindow?.focus();
28292
+ return emitSidebarPanelState(windowState);
28293
+ });
28294
+ electron.ipcMain.handle(Channels$1.SIDEBAR_RESIZE_START, (event) => {
28295
+ requireTrusted(event);
28296
+ if (isSidebarDetached(windowState)) return;
28297
+ sidebarResizeActive = true;
28298
+ clearSidebarResizeRecoveryTimer();
28299
+ const [width, height] = windowState.mainWindow.getContentSize();
28300
+ const chromeHeight = windowState.uiState.focusMode ? 0 : CHROME_HEIGHT;
28301
+ const sidebarWidth = windowState.uiState.sidebarWidth;
28302
+ const resizeHandleOverlap = 6;
28303
+ windowState.sidebarView.setBounds({
28304
+ x: width - sidebarWidth - resizeHandleOverlap,
28305
+ y: chromeHeight,
28306
+ width: sidebarWidth + resizeHandleOverlap,
28307
+ height: height - chromeHeight
28308
+ });
28309
+ scheduleSidebarResizeRecovery();
28310
+ });
28311
+ electron.ipcMain.handle(Channels$1.SIDEBAR_RESIZE, (event, width) => {
28312
+ requireTrusted(event);
28313
+ assertNumber(width, "width");
28314
+ if (isSidebarDetached(windowState)) {
28315
+ return windowState.uiState.sidebarWidth;
28316
+ }
28317
+ const clamped = Math.max(240, Math.min(800, Math.round(width)));
28318
+ windowState.uiState.sidebarWidth = clamped;
28319
+ resizeSidebarViews(windowState);
28320
+ emitSidebarPanelState(windowState);
28321
+ return clamped;
28322
+ });
28323
+ electron.ipcMain.handle(Channels$1.SIDEBAR_RESIZE_COMMIT, (event) => {
28324
+ requireTrusted(event);
28325
+ if (isSidebarDetached(windowState)) return;
28326
+ stopSidebarResize();
28327
+ setSetting("sidebarWidth", windowState.uiState.sidebarWidth);
28328
+ relayout();
28329
+ });
28330
+ electron.ipcMain.handle(Channels$1.SIDEBAR_POPOUT, (event) => {
28331
+ requireTrusted(event);
28332
+ stopSidebarResize();
28333
+ return detachSidebar(windowState, {
28334
+ relayout,
28335
+ getWindowIconPath
28336
+ });
28337
+ });
28338
+ electron.ipcMain.handle(Channels$1.SIDEBAR_DOCK, (event) => {
28339
+ requireTrusted(event);
28340
+ stopSidebarResize();
28341
+ return dockSidebar(windowState, { relayout });
28342
+ });
28343
+ electron.ipcMain.on(
28344
+ Channels$1.RENDERER_VIEW_READY,
28345
+ (event, view) => {
28346
+ requireTrusted(event);
28347
+ if (view !== "sidebar") return;
28348
+ if (windowState.uiState.sidebarPanelMode === "closed") {
28349
+ openDockedSidebar(windowState, relayout);
28350
+ }
28351
+ }
28352
+ );
28353
+ electron.ipcMain.handle(Channels$1.SETTINGS_VISIBILITY, (event, open) => {
28354
+ requireTrusted(event);
28355
+ windowState.uiState.settingsOpen = open;
28356
+ if (open) {
28357
+ closeSidebar(windowState, relayout);
28358
+ } else {
28359
+ relayout();
28360
+ emitSidebarPanelState(windowState);
28361
+ }
28362
+ return windowState.uiState.settingsOpen;
28363
+ });
28364
+ }
28022
28365
  const SUPPORT_API = process.env.VESSEL_SUPPORT_API || process.env.VESSEL_PREMIUM_API || "https://vesselpremium.quantaintellect.com";
28023
28366
  const MAX_FEEDBACK_MESSAGE_LENGTH = 5e3;
28024
28367
  const FEEDBACK_REQUEST_TIMEOUT_MS = 15e3;
@@ -28026,6 +28369,9 @@ function isValidEmail(email) {
28026
28369
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
28027
28370
  }
28028
28371
  async function submitFeedback(payload) {
28372
+ if (isAirGapped()) {
28373
+ return errorResult("Feedback submission is disabled in air-gapped mode.");
28374
+ }
28029
28375
  const email = payload.email.trim().toLowerCase();
28030
28376
  const message = payload.message.trim();
28031
28377
  if (!isValidEmail(email)) {
@@ -28099,7 +28445,7 @@ function snapshot() {
28099
28445
  return records.map((record) => ({ ...record }));
28100
28446
  }
28101
28447
  function emit() {
28102
- broadcaster?.(Channels.PERMISSIONS_GET, snapshot());
28448
+ broadcaster?.(Channels$1.PERMISSIONS_GET, snapshot());
28103
28449
  }
28104
28450
  function getDecision(origin, permission) {
28105
28451
  const existing = records.find((r) => r.origin === origin && r.permission === permission);
@@ -28222,6 +28568,15 @@ function compareVersions(a, b) {
28222
28568
  async function checkForUpdates() {
28223
28569
  const currentVersion = electron.app.getVersion();
28224
28570
  const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
28571
+ if (isAirGapped()) {
28572
+ return {
28573
+ currentVersion,
28574
+ latestVersion: null,
28575
+ updateAvailable: false,
28576
+ checkedAt,
28577
+ error: "Update checks are disabled in air-gapped mode."
28578
+ };
28579
+ }
28225
28580
  try {
28226
28581
  const response = await fetch(GITHUB_LATEST_RELEASE_API_URL, {
28227
28582
  headers: { accept: "application/vnd.github+json", "user-agent": `Vessel/${currentVersion}` }
@@ -28252,6 +28607,9 @@ async function checkForUpdates() {
28252
28607
  }
28253
28608
  }
28254
28609
  async function openUpdateDownload() {
28610
+ if (isAirGapped()) {
28611
+ throw new Error("Update downloads are unavailable in air-gapped mode.");
28612
+ }
28255
28613
  await openExternalAllowlisted(RELEASES_URL, { hosts: ["github.com"] });
28256
28614
  }
28257
28615
  let activeChatProvider = null;
@@ -28300,56 +28658,37 @@ function registerIpcHandlers(windowState, runtime2) {
28300
28658
  const provider = settings2.chatProvider ? createProvider(settings2.chatProvider) : null;
28301
28659
  researchOrchestrator = new ResearchOrchestrator(provider, tabManager, runtime2);
28302
28660
  researchOrchestrator.setUpdateListener((state2) => {
28303
- sendToRendererViews(Channels.RESEARCH_STATE_UPDATE, state2);
28661
+ sendToRendererViews(Channels$1.RESEARCH_STATE_UPDATE, state2);
28304
28662
  });
28305
28663
  }
28306
28664
  return researchOrchestrator;
28307
28665
  };
28308
- electron.ipcMain.handle(Channels.OPEN_PRIVATE_WINDOW, (event) => {
28666
+ electron.ipcMain.handle(Channels$1.OPEN_PRIVATE_WINDOW, (event) => {
28309
28667
  requireTrusted(event);
28310
28668
  createPrivateWindow();
28311
28669
  });
28312
- electron.ipcMain.handle(Channels.OPEN_NEW_WINDOW, (event) => {
28670
+ electron.ipcMain.handle(Channels$1.OPEN_NEW_WINDOW, (event) => {
28313
28671
  requireTrusted(event);
28314
28672
  createSecondaryWindow();
28315
28673
  });
28316
- electron.ipcMain.handle(Channels.IS_PRIVATE_MODE, (event) => {
28674
+ electron.ipcMain.handle(Channels$1.IS_PRIVATE_MODE, (event) => {
28317
28675
  requireTrusted(event);
28318
28676
  return false;
28319
28677
  });
28320
- let sidebarResizeRecoveryTimer = null;
28321
- let sidebarResizeActive = false;
28322
28678
  let runtimeUpdateTimer = null;
28323
28679
  let pendingRuntimeState = null;
28324
- const clearSidebarResizeRecoveryTimer = () => {
28325
- if (!sidebarResizeRecoveryTimer) return;
28326
- clearTimeout(sidebarResizeRecoveryTimer);
28327
- sidebarResizeRecoveryTimer = null;
28328
- };
28329
- const restoreSidebarLayoutAfterResize = () => {
28330
- clearSidebarResizeRecoveryTimer();
28331
- if (!sidebarResizeActive) return;
28332
- sidebarResizeActive = false;
28333
- layoutViews(windowState);
28334
- };
28335
- const scheduleSidebarResizeRecovery = () => {
28336
- clearSidebarResizeRecoveryTimer();
28337
- sidebarResizeRecoveryTimer = setTimeout(() => {
28338
- restoreSidebarLayoutAfterResize();
28339
- }, 1200);
28340
- };
28341
28680
  const flushRuntimeUpdate = () => {
28342
28681
  runtimeUpdateTimer = null;
28343
28682
  if (!pendingRuntimeState) return;
28344
28683
  if (!chromeView.webContents.isDestroyed()) {
28345
28684
  chromeView.webContents.send(
28346
- Channels.AGENT_RUNTIME_UPDATE,
28685
+ Channels$1.AGENT_RUNTIME_UPDATE,
28347
28686
  pendingRuntimeState
28348
28687
  );
28349
28688
  }
28350
28689
  if (!sidebarView.webContents.isDestroyed()) {
28351
28690
  sidebarView.webContents.send(
28352
- Channels.AGENT_RUNTIME_UPDATE,
28691
+ Channels$1.AGENT_RUNTIME_UPDATE,
28353
28692
  pendingRuntimeState
28354
28693
  );
28355
28694
  }
@@ -28386,7 +28725,7 @@ function registerIpcHandlers(windowState, runtime2) {
28386
28725
  };
28387
28726
  const emitHighlightCount = async () => {
28388
28727
  const count = await getActiveHighlightCountSafe();
28389
- sendToRendererViews(Channels.HIGHLIGHT_COUNT_UPDATE, count);
28728
+ sendToRendererViews(Channels$1.HIGHLIGHT_COUNT_UPDATE, count);
28390
28729
  };
28391
28730
  const applySettingChange = async (key2, value) => {
28392
28731
  const updatedSettings = setSetting(key2, value);
@@ -28405,36 +28744,36 @@ function registerIpcHandlers(windowState, runtime2) {
28405
28744
  }
28406
28745
  }
28407
28746
  const rendererSettings = getRendererSettings();
28408
- sendToRendererViews(Channels.SETTINGS_UPDATE, rendererSettings);
28747
+ sendToRendererViews(Channels$1.SETTINGS_UPDATE, rendererSettings);
28409
28748
  return rendererSettings;
28410
28749
  };
28411
28750
  runtime2.setUpdateListener((state2) => {
28412
28751
  scheduleRuntimeUpdate(state2);
28413
28752
  });
28414
28753
  onRuntimeHealthChange((health) => {
28415
- sendToRendererViews(Channels.SETTINGS_HEALTH_UPDATE, health);
28754
+ sendToRendererViews(Channels$1.SETTINGS_HEALTH_UPDATE, health);
28416
28755
  });
28417
28756
  onAIStreamIdle(() => {
28418
- sendToRendererViews(Channels.AI_STREAM_IDLE);
28757
+ sendToRendererViews(Channels$1.AI_STREAM_IDLE);
28419
28758
  });
28420
- electron.ipcMain.handle(Channels.TAB_CREATE, (event, url) => {
28759
+ electron.ipcMain.handle(Channels$1.TAB_CREATE, (event, url) => {
28421
28760
  requireTrusted(event);
28422
28761
  const id = tabManager.createTab(url || loadSettings().defaultUrl);
28423
28762
  layoutViews(windowState);
28424
28763
  return id;
28425
28764
  });
28426
- electron.ipcMain.handle(Channels.TAB_CLOSE, (event, id) => {
28765
+ electron.ipcMain.handle(Channels$1.TAB_CLOSE, (event, id) => {
28427
28766
  requireTrusted(event);
28428
28767
  tabManager.closeTab(id);
28429
28768
  layoutViews(windowState);
28430
28769
  });
28431
- electron.ipcMain.handle(Channels.TAB_SWITCH, (event, id) => {
28770
+ electron.ipcMain.handle(Channels$1.TAB_SWITCH, (event, id) => {
28432
28771
  requireTrusted(event);
28433
28772
  tabManager.switchTab(id);
28434
28773
  layoutViews(windowState);
28435
28774
  });
28436
28775
  electron.ipcMain.handle(
28437
- Channels.TAB_NAVIGATE,
28776
+ Channels$1.TAB_NAVIGATE,
28438
28777
  (event, id, url, postBody) => {
28439
28778
  requireTrusted(event);
28440
28779
  assertString(id, "tabId");
@@ -28442,19 +28781,19 @@ function registerIpcHandlers(windowState, runtime2) {
28442
28781
  return tabManager.navigateTab(id, url, postBody);
28443
28782
  }
28444
28783
  );
28445
- electron.ipcMain.handle(Channels.TAB_BACK, (event, id) => {
28784
+ electron.ipcMain.handle(Channels$1.TAB_BACK, (event, id) => {
28446
28785
  requireTrusted(event);
28447
28786
  tabManager.goBack(id);
28448
28787
  });
28449
- electron.ipcMain.handle(Channels.TAB_FORWARD, (event, id) => {
28788
+ electron.ipcMain.handle(Channels$1.TAB_FORWARD, (event, id) => {
28450
28789
  requireTrusted(event);
28451
28790
  tabManager.goForward(id);
28452
28791
  });
28453
- electron.ipcMain.handle(Channels.TAB_RELOAD, (event, id) => {
28792
+ electron.ipcMain.handle(Channels$1.TAB_RELOAD, (event, id) => {
28454
28793
  requireTrusted(event);
28455
28794
  tabManager.reloadTab(id);
28456
28795
  });
28457
- electron.ipcMain.handle(Channels.TAB_TOGGLE_AD_BLOCK, (event, id) => {
28796
+ electron.ipcMain.handle(Channels$1.TAB_TOGGLE_AD_BLOCK, (event, id) => {
28458
28797
  requireTrusted(event);
28459
28798
  assertString(id, "id");
28460
28799
  const tab = tabManager.getTab(id);
@@ -28463,67 +28802,67 @@ function registerIpcHandlers(windowState, runtime2) {
28463
28802
  tab.setAdBlockingEnabled(newState);
28464
28803
  return newState;
28465
28804
  });
28466
- electron.ipcMain.handle(Channels.TAB_ZOOM_IN, (event, id) => {
28805
+ electron.ipcMain.handle(Channels$1.TAB_ZOOM_IN, (event, id) => {
28467
28806
  requireTrusted(event);
28468
28807
  assertString(id, "id");
28469
28808
  tabManager.zoomIn(id);
28470
28809
  });
28471
- electron.ipcMain.handle(Channels.TAB_ZOOM_OUT, (event, id) => {
28810
+ electron.ipcMain.handle(Channels$1.TAB_ZOOM_OUT, (event, id) => {
28472
28811
  requireTrusted(event);
28473
28812
  assertString(id, "id");
28474
28813
  tabManager.zoomOut(id);
28475
28814
  });
28476
- electron.ipcMain.handle(Channels.TAB_ZOOM_RESET, (event, id) => {
28815
+ electron.ipcMain.handle(Channels$1.TAB_ZOOM_RESET, (event, id) => {
28477
28816
  requireTrusted(event);
28478
28817
  assertString(id, "id");
28479
28818
  tabManager.zoomReset(id);
28480
28819
  });
28481
- electron.ipcMain.handle(Channels.TAB_REOPEN_CLOSED, (event) => {
28820
+ electron.ipcMain.handle(Channels$1.TAB_REOPEN_CLOSED, (event) => {
28482
28821
  requireTrusted(event);
28483
28822
  const id = tabManager.reopenClosedTab();
28484
28823
  if (id) layoutViews(windowState);
28485
28824
  return id;
28486
28825
  });
28487
- electron.ipcMain.handle(Channels.TAB_DUPLICATE, (event, id) => {
28826
+ electron.ipcMain.handle(Channels$1.TAB_DUPLICATE, (event, id) => {
28488
28827
  requireTrusted(event);
28489
28828
  assertString(id, "id");
28490
28829
  const newId = tabManager.duplicateTab(id);
28491
28830
  if (newId) layoutViews(windowState);
28492
28831
  return newId;
28493
28832
  });
28494
- electron.ipcMain.handle(Channels.TAB_PIN, (event, id) => {
28833
+ electron.ipcMain.handle(Channels$1.TAB_PIN, (event, id) => {
28495
28834
  requireTrusted(event);
28496
28835
  assertString(id, "id");
28497
28836
  tabManager.pinTab(id);
28498
28837
  });
28499
- electron.ipcMain.handle(Channels.TAB_UNPIN, (event, id) => {
28838
+ electron.ipcMain.handle(Channels$1.TAB_UNPIN, (event, id) => {
28500
28839
  requireTrusted(event);
28501
28840
  assertString(id, "id");
28502
28841
  tabManager.unpinTab(id);
28503
28842
  });
28504
- electron.ipcMain.handle(Channels.TAB_GROUP_CREATE, (event, id) => {
28843
+ electron.ipcMain.handle(Channels$1.TAB_GROUP_CREATE, (event, id) => {
28505
28844
  requireTrusted(event);
28506
28845
  assertString(id, "id");
28507
28846
  return tabManager.createGroupFromTab(id);
28508
28847
  });
28509
- electron.ipcMain.handle(Channels.TAB_GROUP_ADD_TAB, (event, id, groupId) => {
28848
+ electron.ipcMain.handle(Channels$1.TAB_GROUP_ADD_TAB, (event, id, groupId) => {
28510
28849
  requireTrusted(event);
28511
28850
  assertString(id, "id");
28512
28851
  assertString(groupId, "groupId");
28513
28852
  tabManager.assignTabToGroup(id, groupId);
28514
28853
  });
28515
- electron.ipcMain.handle(Channels.TAB_GROUP_REMOVE_TAB, (event, id) => {
28854
+ electron.ipcMain.handle(Channels$1.TAB_GROUP_REMOVE_TAB, (event, id) => {
28516
28855
  requireTrusted(event);
28517
28856
  assertString(id, "id");
28518
28857
  tabManager.removeTabFromGroup(id);
28519
28858
  });
28520
- electron.ipcMain.handle(Channels.TAB_GROUP_TOGGLE_COLLAPSED, (event, groupId) => {
28859
+ electron.ipcMain.handle(Channels$1.TAB_GROUP_TOGGLE_COLLAPSED, (event, groupId) => {
28521
28860
  requireTrusted(event);
28522
28861
  assertString(groupId, "groupId");
28523
28862
  return tabManager.toggleGroupCollapsed(groupId);
28524
28863
  });
28525
28864
  electron.ipcMain.handle(
28526
- Channels.TAB_GROUP_SET_COLOR,
28865
+ Channels$1.TAB_GROUP_SET_COLOR,
28527
28866
  (event, groupId, color) => {
28528
28867
  requireTrusted(event);
28529
28868
  assertString(groupId, "groupId");
@@ -28531,55 +28870,55 @@ function registerIpcHandlers(windowState, runtime2) {
28531
28870
  tabManager.setGroupColor(groupId, color);
28532
28871
  }
28533
28872
  );
28534
- electron.ipcMain.handle(Channels.TAB_TOGGLE_MUTE, (event, id) => {
28873
+ electron.ipcMain.handle(Channels$1.TAB_TOGGLE_MUTE, (event, id) => {
28535
28874
  requireTrusted(event);
28536
28875
  assertString(id, "id");
28537
28876
  return tabManager.toggleMuted(id);
28538
28877
  });
28539
- electron.ipcMain.handle(Channels.TAB_PRINT, (event, id) => {
28878
+ electron.ipcMain.handle(Channels$1.TAB_PRINT, (event, id) => {
28540
28879
  requireTrusted(event);
28541
28880
  assertString(id, "id");
28542
28881
  tabManager.printTab(id);
28543
28882
  });
28544
- electron.ipcMain.handle(Channels.TAB_PRINT_TO_PDF, (event, id) => {
28883
+ electron.ipcMain.handle(Channels$1.TAB_PRINT_TO_PDF, (event, id) => {
28545
28884
  requireTrusted(event);
28546
28885
  assertString(id, "id");
28547
28886
  return tabManager.saveTabAsPdf(id);
28548
28887
  });
28549
- electron.ipcMain.on(Channels.TAB_CONTEXT_MENU, (event, id) => {
28888
+ electron.ipcMain.on(Channels$1.TAB_CONTEXT_MENU, (event, id) => {
28550
28889
  requireTrusted(event);
28551
28890
  assertString(id, "id");
28552
28891
  showTabContextMenu(tabManager, id, mainWindow, () => layoutViews(windowState));
28553
28892
  });
28554
- electron.ipcMain.on(Channels.TAB_GROUP_CONTEXT_MENU, (event, groupId) => {
28893
+ electron.ipcMain.on(Channels$1.TAB_GROUP_CONTEXT_MENU, (event, groupId) => {
28555
28894
  requireTrusted(event);
28556
28895
  assertString(groupId, "groupId");
28557
28896
  showGroupContextMenu(tabManager, groupId, mainWindow);
28558
28897
  });
28559
- electron.ipcMain.handle(Channels.TAB_STATE_GET, (event) => {
28898
+ electron.ipcMain.handle(Channels$1.TAB_STATE_GET, (event) => {
28560
28899
  requireTrusted(event);
28561
28900
  return {
28562
28901
  tabs: tabManager.getAllStates(),
28563
28902
  activeId: tabManager.getActiveTabId() || ""
28564
28903
  };
28565
28904
  });
28566
- electron.ipcMain.handle(Channels.AI_QUERY, async (event, query, history) => {
28905
+ electron.ipcMain.handle(Channels$1.AI_QUERY, async (event, query, history) => {
28567
28906
  requireTrusted(event);
28568
28907
  const settings2 = loadSettings();
28569
28908
  const chatConfig = settings2.chatProvider;
28570
28909
  if (!chatConfig) {
28571
- sendToRendererViews(Channels.AI_STREAM_START, query);
28910
+ sendToRendererViews(Channels$1.AI_STREAM_START, query);
28572
28911
  sendToRendererViews(
28573
- Channels.AI_STREAM_CHUNK,
28912
+ Channels$1.AI_STREAM_CHUNK,
28574
28913
  "Chat provider not configured. Open Settings (Ctrl+,) to choose a provider."
28575
28914
  );
28576
- sendToRendererViews(Channels.AI_STREAM_END, "failed");
28915
+ sendToRendererViews(Channels$1.AI_STREAM_END, "failed");
28577
28916
  return { accepted: true };
28578
28917
  }
28579
28918
  if (!tryBeginAIStream("manual")) {
28580
28919
  return { accepted: false, reason: "busy" };
28581
28920
  }
28582
- sendToRendererViews(Channels.AI_STREAM_START, query);
28921
+ sendToRendererViews(Channels$1.AI_STREAM_START, query);
28583
28922
  (async () => {
28584
28923
  try {
28585
28924
  activeChatProvider = createProvider(chatConfig);
@@ -28589,8 +28928,8 @@ function registerIpcHandlers(windowState, runtime2) {
28589
28928
  query,
28590
28929
  activeChatProvider,
28591
28930
  activeTab?.view.webContents,
28592
- (chunk) => sendToRendererViews(Channels.AI_STREAM_CHUNK, chunk),
28593
- () => sendToRendererViews(Channels.AI_STREAM_END, "completed"),
28931
+ (chunk) => sendToRendererViews(Channels$1.AI_STREAM_CHUNK, chunk),
28932
+ () => sendToRendererViews(Channels$1.AI_STREAM_END, "completed"),
28594
28933
  tabManager,
28595
28934
  runtime2,
28596
28935
  compactProviderHistory(history),
@@ -28598,9 +28937,9 @@ function registerIpcHandlers(windowState, runtime2) {
28598
28937
  );
28599
28938
  } catch (err) {
28600
28939
  const msg = err instanceof Error ? err.message : "Unknown error";
28601
- sendToRendererViews(Channels.AI_STREAM_CHUNK, `
28940
+ sendToRendererViews(Channels$1.AI_STREAM_CHUNK, `
28602
28941
  [Error: ${msg}]`);
28603
- sendToRendererViews(Channels.AI_STREAM_END, "failed");
28942
+ sendToRendererViews(Channels$1.AI_STREAM_END, "failed");
28604
28943
  } finally {
28605
28944
  activeChatProvider = null;
28606
28945
  endAIStream("manual");
@@ -28608,11 +28947,11 @@ function registerIpcHandlers(windowState, runtime2) {
28608
28947
  })();
28609
28948
  return { accepted: true };
28610
28949
  });
28611
- electron.ipcMain.handle(Channels.AI_CANCEL, (event) => {
28950
+ electron.ipcMain.handle(Channels$1.AI_CANCEL, (event) => {
28612
28951
  requireTrusted(event);
28613
28952
  activeChatProvider?.cancel();
28614
28953
  });
28615
- electron.ipcMain.handle(Channels.AI_FETCH_MODELS, async (event, config) => {
28954
+ electron.ipcMain.handle(Channels$1.AI_FETCH_MODELS, async (event, config) => {
28616
28955
  requireTrusted(event);
28617
28956
  try {
28618
28957
  if (!config || typeof config !== "object" || !("id" in config)) {
@@ -28625,13 +28964,13 @@ function registerIpcHandlers(windowState, runtime2) {
28625
28964
  return errorResult(getErrorMessage(err), { models: [] });
28626
28965
  }
28627
28966
  });
28628
- electron.ipcMain.handle(Channels.CONTENT_EXTRACT, async (event) => {
28967
+ electron.ipcMain.handle(Channels$1.CONTENT_EXTRACT, async (event) => {
28629
28968
  requireTrusted(event);
28630
28969
  const activeTab = tabManager.getActiveTab();
28631
28970
  if (!activeTab) return null;
28632
28971
  return extractContent(activeTab.view.webContents);
28633
28972
  });
28634
- electron.ipcMain.handle(Channels.READER_MODE_TOGGLE, async (event) => {
28973
+ electron.ipcMain.handle(Channels$1.READER_MODE_TOGGLE, async (event) => {
28635
28974
  requireTrusted(event);
28636
28975
  const activeTab = tabManager.getActiveTab();
28637
28976
  if (!activeTab) return;
@@ -28652,106 +28991,31 @@ function registerIpcHandlers(windowState, runtime2) {
28652
28991
  );
28653
28992
  }
28654
28993
  });
28655
- electron.ipcMain.handle(Channels.SIDEBAR_TOGGLE, (event) => {
28656
- requireTrusted(event);
28657
- windowState.uiState.sidebarOpen = !windowState.uiState.sidebarOpen;
28658
- layoutViews(windowState);
28659
- return {
28660
- open: windowState.uiState.sidebarOpen,
28661
- width: windowState.uiState.sidebarWidth
28662
- };
28663
- });
28664
- electron.ipcMain.handle(Channels.SIDEBAR_NAVIGATE, (event, tab) => {
28665
- requireTrusted(event);
28666
- assertString(tab, "tab");
28667
- if (!windowState.uiState.sidebarOpen) {
28668
- windowState.uiState.sidebarOpen = true;
28669
- layoutViews(windowState);
28670
- }
28671
- if (!sidebarView.webContents.isDestroyed()) {
28672
- sidebarView.webContents.send(Channels.SIDEBAR_NAVIGATE, tab);
28673
- }
28674
- return {
28675
- open: windowState.uiState.sidebarOpen,
28676
- width: windowState.uiState.sidebarWidth
28677
- };
28678
- });
28679
- electron.ipcMain.handle(Channels.SIDEBAR_RESIZE_START, (event) => {
28680
- requireTrusted(event);
28681
- sidebarResizeActive = true;
28682
- clearSidebarResizeRecoveryTimer();
28683
- const [width, height] = windowState.mainWindow.getContentSize();
28684
- const chromeHeight = windowState.uiState.focusMode ? 0 : CHROME_HEIGHT;
28685
- const sidebarWidth = windowState.uiState.sidebarWidth;
28686
- const resizeHandleOverlap = 6;
28687
- windowState.sidebarView.setBounds({
28688
- x: width - sidebarWidth - resizeHandleOverlap,
28689
- y: chromeHeight,
28690
- width: sidebarWidth + resizeHandleOverlap,
28691
- height: height - chromeHeight
28692
- });
28693
- scheduleSidebarResizeRecovery();
28694
- });
28695
- electron.ipcMain.handle(Channels.SIDEBAR_RESIZE, (event, width) => {
28696
- requireTrusted(event);
28697
- assertNumber(width, "width");
28698
- const clamped = Math.max(240, Math.min(800, Math.round(width)));
28699
- windowState.uiState.sidebarWidth = clamped;
28700
- resizeSidebarViews(windowState);
28701
- return clamped;
28702
- });
28703
- electron.ipcMain.handle(Channels.SIDEBAR_RESIZE_COMMIT, (event) => {
28704
- requireTrusted(event);
28705
- sidebarResizeActive = false;
28706
- clearSidebarResizeRecoveryTimer();
28707
- setSetting("sidebarWidth", windowState.uiState.sidebarWidth);
28708
- layoutViews(windowState);
28709
- });
28710
- electron.ipcMain.on(
28711
- Channels.RENDERER_VIEW_READY,
28712
- (event, view) => {
28713
- requireTrusted(event);
28714
- if (view !== "sidebar") return;
28715
- if (!windowState.uiState.sidebarOpen) {
28716
- windowState.uiState.sidebarOpen = true;
28717
- layoutViews(windowState);
28718
- }
28719
- }
28720
- );
28721
- electron.ipcMain.handle(Channels.FOCUS_MODE_TOGGLE, (event) => {
28994
+ electron.ipcMain.handle(Channels$1.FOCUS_MODE_TOGGLE, (event) => {
28722
28995
  requireTrusted(event);
28723
28996
  windowState.uiState.focusMode = !windowState.uiState.focusMode;
28724
28997
  layoutViews(windowState);
28725
28998
  return windowState.uiState.focusMode;
28726
28999
  });
28727
- electron.ipcMain.handle(Channels.SETTINGS_VISIBILITY, (event, open) => {
28728
- requireTrusted(event);
28729
- windowState.uiState.settingsOpen = open;
28730
- if (open) {
28731
- windowState.uiState.sidebarOpen = false;
28732
- }
28733
- layoutViews(windowState);
28734
- return windowState.uiState.settingsOpen;
28735
- });
28736
- electron.ipcMain.handle(Channels.SETTINGS_GET, (event) => {
29000
+ electron.ipcMain.handle(Channels$1.SETTINGS_GET, (event) => {
28737
29001
  requireTrusted(event);
28738
29002
  return getRendererSettings();
28739
29003
  });
28740
- electron.ipcMain.handle(Channels.SETTINGS_HEALTH_GET, (event) => {
29004
+ electron.ipcMain.handle(Channels$1.SETTINGS_HEALTH_GET, (event) => {
28741
29005
  requireTrusted(event);
28742
29006
  return getRuntimeHealth();
28743
29007
  });
28744
- electron.ipcMain.handle(Channels.MCP_REGENERATE_TOKEN, (event) => {
29008
+ electron.ipcMain.handle(Channels$1.MCP_REGENERATE_TOKEN, (event) => {
28745
29009
  requireTrusted(event);
28746
29010
  return regenerateMcpAuthToken();
28747
29011
  });
28748
- electron.ipcMain.handle(Channels.SUPPORT_SUBMIT_FEEDBACK, async (event, email, message) => {
29012
+ electron.ipcMain.handle(Channels$1.SUPPORT_SUBMIT_FEEDBACK, async (event, email, message) => {
28749
29013
  requireTrusted(event);
28750
29014
  assertString(email, "email");
28751
29015
  assertString(message, "message");
28752
29016
  return submitFeedback({ email, message, source: "settings_account" });
28753
29017
  });
28754
- electron.ipcMain.handle(Channels.SETTINGS_SET, async (event, key2, value) => {
29018
+ electron.ipcMain.handle(Channels$1.SETTINGS_SET, async (event, key2, value) => {
28755
29019
  requireTrusted(event);
28756
29020
  assertString(key2, "key");
28757
29021
  if (!SETTABLE_KEYS.has(key2)) {
@@ -28760,20 +29024,20 @@ function registerIpcHandlers(windowState, runtime2) {
28760
29024
  const settingsKey = key2;
28761
29025
  return applySettingChange(settingsKey, value);
28762
29026
  });
28763
- electron.ipcMain.handle(Channels.AGENT_RUNTIME_GET, (event) => {
29027
+ electron.ipcMain.handle(Channels$1.AGENT_RUNTIME_GET, (event) => {
28764
29028
  requireTrusted(event);
28765
29029
  return runtime2.getState();
28766
29030
  });
28767
- electron.ipcMain.handle(Channels.AGENT_PAUSE, (event) => {
29031
+ electron.ipcMain.handle(Channels$1.AGENT_PAUSE, (event) => {
28768
29032
  requireTrusted(event);
28769
29033
  return runtime2.pause();
28770
29034
  });
28771
- electron.ipcMain.handle(Channels.AGENT_RESUME, (event) => {
29035
+ electron.ipcMain.handle(Channels$1.AGENT_RESUME, (event) => {
28772
29036
  requireTrusted(event);
28773
29037
  return runtime2.resume();
28774
29038
  });
28775
29039
  electron.ipcMain.handle(
28776
- Channels.AGENT_SET_APPROVAL_MODE,
29040
+ Channels$1.AGENT_SET_APPROVAL_MODE,
28777
29041
  (event, mode) => {
28778
29042
  requireTrusted(event);
28779
29043
  assertString(mode, "mode");
@@ -28786,44 +29050,44 @@ function registerIpcHandlers(windowState, runtime2) {
28786
29050
  }
28787
29051
  );
28788
29052
  electron.ipcMain.handle(
28789
- Channels.AGENT_APPROVAL_RESOLVE,
29053
+ Channels$1.AGENT_APPROVAL_RESOLVE,
28790
29054
  (event, approvalId, approved) => {
28791
29055
  requireTrusted(event);
28792
29056
  return runtime2.resolveApproval(approvalId, approved);
28793
29057
  }
28794
29058
  );
28795
29059
  electron.ipcMain.handle(
28796
- Channels.AGENT_CHECKPOINT_CREATE,
29060
+ Channels$1.AGENT_CHECKPOINT_CREATE,
28797
29061
  (event, name, note) => {
28798
29062
  requireTrusted(event);
28799
29063
  return runtime2.createCheckpoint(name, note);
28800
29064
  }
28801
29065
  );
28802
- electron.ipcMain.handle(Channels.AGENT_CHECKPOINT_RESTORE, (event, checkpointId) => {
29066
+ electron.ipcMain.handle(Channels$1.AGENT_CHECKPOINT_RESTORE, (event, checkpointId) => {
28803
29067
  requireTrusted(event);
28804
29068
  return runtime2.restoreCheckpoint(checkpointId);
28805
29069
  });
28806
- electron.ipcMain.handle(Channels.AGENT_CHECKPOINT_UPDATE_NOTE, (event, checkpointId, note) => {
29070
+ electron.ipcMain.handle(Channels$1.AGENT_CHECKPOINT_UPDATE_NOTE, (event, checkpointId, note) => {
28807
29071
  requireTrusted(event);
28808
29072
  return runtime2.updateCheckpointNote(checkpointId, note || "");
28809
29073
  });
28810
- electron.ipcMain.handle(Channels.AGENT_UNDO_LAST_ACTION, (event) => {
29074
+ electron.ipcMain.handle(Channels$1.AGENT_UNDO_LAST_ACTION, (event) => {
28811
29075
  requireTrusted(event);
28812
29076
  return runtime2.undoLastAction();
28813
29077
  });
28814
- electron.ipcMain.handle(Channels.AGENT_SESSION_CAPTURE, (event, note) => {
29078
+ electron.ipcMain.handle(Channels$1.AGENT_SESSION_CAPTURE, (event, note) => {
28815
29079
  requireTrusted(event);
28816
29080
  return runtime2.captureSession(note);
28817
29081
  });
28818
29082
  electron.ipcMain.handle(
28819
- Channels.AGENT_SESSION_RESTORE,
29083
+ Channels$1.AGENT_SESSION_RESTORE,
28820
29084
  (event, snapshot2) => {
28821
29085
  requireTrusted(event);
28822
29086
  return runtime2.restoreSession(snapshot2);
28823
29087
  }
28824
29088
  );
28825
29089
  registerBookmarkHandlers();
28826
- electron.ipcMain.handle(Channels.HIGHLIGHT_CAPTURE, async (event) => {
29090
+ electron.ipcMain.handle(Channels$1.HIGHLIGHT_CAPTURE, async (event) => {
28827
29091
  requireTrusted(event);
28828
29092
  try {
28829
29093
  const activeTab = tabManager.getActiveTab();
@@ -28849,10 +29113,10 @@ function registerIpcHandlers(windowState, runtime2) {
28849
29113
  void emitHighlightCount();
28850
29114
  }
28851
29115
  if (!chromeView.webContents.isDestroyed()) {
28852
- chromeView.webContents.send(Channels.HIGHLIGHT_CAPTURE_RESULT, result);
29116
+ chromeView.webContents.send(Channels$1.HIGHLIGHT_CAPTURE_RESULT, result);
28853
29117
  }
28854
29118
  });
28855
- electron.ipcMain.on(Channels.HIGHLIGHT_SELECTION, (event, text) => {
29119
+ electron.ipcMain.on(Channels$1.HIGHLIGHT_SELECTION, (event, text) => {
28856
29120
  try {
28857
29121
  const wc = event.sender;
28858
29122
  if (wc.isDestroyed()) return;
@@ -28861,18 +29125,18 @@ function registerIpcHandlers(windowState, runtime2) {
28861
29125
  void persistAndMarkHighlight(wc, text).then((result) => {
28862
29126
  if (result.success && !chromeView.webContents.isDestroyed()) {
28863
29127
  void emitHighlightCount();
28864
- chromeView.webContents.send(Channels.HIGHLIGHT_CAPTURE_RESULT, result);
29128
+ chromeView.webContents.send(Channels$1.HIGHLIGHT_CAPTURE_RESULT, result);
28865
29129
  }
28866
29130
  });
28867
29131
  } catch (err) {
28868
29132
  logger$4.warn("Failed to persist auto-highlight selection:", err);
28869
29133
  }
28870
29134
  });
28871
- electron.ipcMain.handle(Channels.HIGHLIGHT_NAV_COUNT, (event) => {
29135
+ electron.ipcMain.handle(Channels$1.HIGHLIGHT_NAV_COUNT, (event) => {
28872
29136
  requireTrusted(event);
28873
29137
  return getActiveHighlightCountSafe();
28874
29138
  });
28875
- electron.ipcMain.handle(Channels.HIGHLIGHT_NAV_SCROLL, (event, index) => {
29139
+ electron.ipcMain.handle(Channels$1.HIGHLIGHT_NAV_SCROLL, (event, index) => {
28876
29140
  requireTrusted(event);
28877
29141
  const info = getActiveTabInfo(tabManager);
28878
29142
  if (!info) return false;
@@ -28883,7 +29147,7 @@ function registerIpcHandlers(windowState, runtime2) {
28883
29147
  return false;
28884
29148
  }
28885
29149
  });
28886
- electron.ipcMain.handle(Channels.HIGHLIGHT_NAV_REMOVE, async (event, index) => {
29150
+ electron.ipcMain.handle(Channels$1.HIGHLIGHT_NAV_REMOVE, async (event, index) => {
28887
29151
  requireTrusted(event);
28888
29152
  const info = getActiveTabInfo(tabManager);
28889
29153
  if (!info) return false;
@@ -28898,7 +29162,7 @@ function registerIpcHandlers(windowState, runtime2) {
28898
29162
  return false;
28899
29163
  }
28900
29164
  });
28901
- electron.ipcMain.handle(Channels.HIGHLIGHT_NAV_CLEAR, async (event) => {
29165
+ electron.ipcMain.handle(Channels$1.HIGHLIGHT_NAV_CLEAR, async (event) => {
28902
29166
  requireTrusted(event);
28903
29167
  const info = getActiveTabInfo(tabManager);
28904
29168
  if (!info) return false;
@@ -28914,26 +29178,26 @@ function registerIpcHandlers(windowState, runtime2) {
28914
29178
  }
28915
29179
  });
28916
29180
  const findBridge = createFindInPageBridge(tabManager, chromeView);
28917
- electron.ipcMain.handle(Channels.FIND_IN_PAGE_START, (event, text, options) => {
29181
+ electron.ipcMain.handle(Channels$1.FIND_IN_PAGE_START, (event, text, options) => {
28918
29182
  requireTrusted(event);
28919
29183
  return findBridge.start(text, options);
28920
29184
  });
28921
- electron.ipcMain.handle(Channels.FIND_IN_PAGE_NEXT, (event, forward) => {
29185
+ electron.ipcMain.handle(Channels$1.FIND_IN_PAGE_NEXT, (event, forward) => {
28922
29186
  requireTrusted(event);
28923
29187
  return findBridge.next(forward);
28924
29188
  });
28925
- electron.ipcMain.handle(Channels.FIND_IN_PAGE_STOP, (event, action) => {
29189
+ electron.ipcMain.handle(Channels$1.FIND_IN_PAGE_STOP, (event, action) => {
28926
29190
  requireTrusted(event);
28927
29191
  findBridge.stop(action);
28928
29192
  });
28929
29193
  registerHistoryHandlers();
28930
- electron.ipcMain.handle(Channels.DEVTOOLS_PANEL_TOGGLE, (event) => {
29194
+ electron.ipcMain.handle(Channels$1.DEVTOOLS_PANEL_TOGGLE, (event) => {
28931
29195
  requireTrusted(event);
28932
29196
  windowState.uiState.devtoolsPanelOpen = !windowState.uiState.devtoolsPanelOpen;
28933
29197
  layoutViews(windowState);
28934
29198
  return { open: windowState.uiState.devtoolsPanelOpen };
28935
29199
  });
28936
- electron.ipcMain.handle(Channels.DEVTOOLS_PANEL_RESIZE, (event, height) => {
29200
+ electron.ipcMain.handle(Channels$1.DEVTOOLS_PANEL_RESIZE, (event, height) => {
28937
29201
  requireTrusted(event);
28938
29202
  const clamped = Math.max(MIN_DEVTOOLS_PANEL, Math.min(MAX_DEVTOOLS_PANEL, Math.round(height)));
28939
29203
  windowState.uiState.devtoolsPanelHeight = clamped;
@@ -28948,15 +29212,16 @@ function registerIpcHandlers(windowState, runtime2) {
28948
29212
  registerWindowControlHandlers(mainWindow);
28949
29213
  registerCodexHandlers();
28950
29214
  registerOpenRouterHandlers(applySettingChange);
28951
- electron.ipcMain.handle(Channels.AUTOMATION_GET_INSTALLED, (event) => {
29215
+ registerSidebarHandlers(windowState, requireTrusted);
29216
+ electron.ipcMain.handle(Channels$1.AUTOMATION_GET_INSTALLED, (event) => {
28952
29217
  requireTrusted(event);
28953
29218
  return getInstalledKits();
28954
29219
  });
28955
- electron.ipcMain.handle(Channels.AUTOMATION_INSTALL_FROM_FILE, async (event) => {
29220
+ electron.ipcMain.handle(Channels$1.AUTOMATION_INSTALL_FROM_FILE, async (event) => {
28956
29221
  requireTrusted(event);
28957
29222
  return await installKitFromFile();
28958
29223
  });
28959
- electron.ipcMain.handle(Channels.AUTOMATION_UNINSTALL, (event, id) => {
29224
+ electron.ipcMain.handle(Channels$1.AUTOMATION_UNINSTALL, (event, id) => {
28960
29225
  requireTrusted(event);
28961
29226
  assertString(id, "id");
28962
29227
  return uninstallKit(id, getScheduledKitIds());
@@ -28965,7 +29230,7 @@ function registerIpcHandlers(windowState, runtime2) {
28965
29230
  registerAutofillHandlers(windowState);
28966
29231
  registerPageDiffHandlers(windowState, sendToRendererViews);
28967
29232
  registerResearchHandlers(() => getResearchOrchestrator());
28968
- electron.ipcMain.handle(Channels.CLEAR_BROWSING_DATA, async (event, options) => {
29233
+ electron.ipcMain.handle(Channels$1.CLEAR_BROWSING_DATA, async (event, options) => {
28969
29234
  requireTrusted(event);
28970
29235
  const { cache, cookies, history, localStorage: clearLs, timeRange } = options;
28971
29236
  if (cache) {
@@ -28983,46 +29248,46 @@ function registerIpcHandlers(windowState, runtime2) {
28983
29248
  });
28984
29249
  setDownloadBroadcaster(sendToRendererViews);
28985
29250
  setPermissionBroadcaster(sendToRendererViews);
28986
- electron.ipcMain.handle(Channels.DOWNLOADS_GET, (event) => {
29251
+ electron.ipcMain.handle(Channels$1.DOWNLOADS_GET, (event) => {
28987
29252
  requireTrusted(event);
28988
29253
  return listDownloads();
28989
29254
  });
28990
- electron.ipcMain.handle(Channels.DOWNLOADS_CLEAR, (event) => {
29255
+ electron.ipcMain.handle(Channels$1.DOWNLOADS_CLEAR, (event) => {
28991
29256
  requireTrusted(event);
28992
29257
  clearDownloads();
28993
29258
  return true;
28994
29259
  });
28995
- electron.ipcMain.handle(Channels.DOWNLOADS_OPEN, (event, id) => {
29260
+ electron.ipcMain.handle(Channels$1.DOWNLOADS_OPEN, (event, id) => {
28996
29261
  requireTrusted(event);
28997
29262
  return openDownload(id);
28998
29263
  });
28999
- electron.ipcMain.handle(Channels.DOWNLOADS_SHOW_IN_FOLDER, (event, id) => {
29264
+ electron.ipcMain.handle(Channels$1.DOWNLOADS_SHOW_IN_FOLDER, (event, id) => {
29000
29265
  requireTrusted(event);
29001
29266
  return showDownloadInFolder(id);
29002
29267
  });
29003
- electron.ipcMain.handle(Channels.PERMISSIONS_GET, (event) => {
29268
+ electron.ipcMain.handle(Channels$1.PERMISSIONS_GET, (event) => {
29004
29269
  requireTrusted(event);
29005
29270
  return listPermissions();
29006
29271
  });
29007
- electron.ipcMain.handle(Channels.PERMISSIONS_CLEAR, (event) => {
29272
+ electron.ipcMain.handle(Channels$1.PERMISSIONS_CLEAR, (event) => {
29008
29273
  requireTrusted(event);
29009
29274
  clearPermissions();
29010
29275
  return true;
29011
29276
  });
29012
- electron.ipcMain.handle(Channels.PERMISSIONS_CLEAR_ORIGIN, (event, origin) => {
29277
+ electron.ipcMain.handle(Channels$1.PERMISSIONS_CLEAR_ORIGIN, (event, origin) => {
29013
29278
  requireTrusted(event);
29014
29279
  clearPermissionsForOrigin(origin);
29015
29280
  return true;
29016
29281
  });
29017
- electron.ipcMain.handle(Channels.UPDATES_CHECK, (event) => {
29282
+ electron.ipcMain.handle(Channels$1.UPDATES_CHECK, (event) => {
29018
29283
  requireTrusted(event);
29019
29284
  return checkForUpdates();
29020
29285
  });
29021
- electron.ipcMain.handle(Channels.UPDATES_OPEN_DOWNLOAD, (event) => {
29286
+ electron.ipcMain.handle(Channels$1.UPDATES_OPEN_DOWNLOAD, (event) => {
29022
29287
  requireTrusted(event);
29023
29288
  return openUpdateDownload();
29024
29289
  });
29025
- electron.ipcMain.handle(Channels.TAB_TOGGLE_PIP, async (event) => {
29290
+ electron.ipcMain.handle(Channels$1.TAB_TOGGLE_PIP, async (event) => {
29026
29291
  requireTrusted(event);
29027
29292
  return togglePictureInPicture(tabManager);
29028
29293
  });
@@ -30364,21 +30629,21 @@ async function bootstrap() {
30364
30629
  }
30365
30630
  }
30366
30631
  if (!state2.chromeView.webContents.isDestroyed()) {
30367
- state2.chromeView.webContents.send(Channels.HIGHLIGHT_COUNT_UPDATE, count);
30632
+ state2.chromeView.webContents.send(Channels$1.HIGHLIGHT_COUNT_UPDATE, count);
30368
30633
  }
30369
30634
  if (!state2.sidebarView.webContents.isDestroyed()) {
30370
- state2.sidebarView.webContents.send(Channels.HIGHLIGHT_COUNT_UPDATE, count);
30635
+ state2.sidebarView.webContents.send(Channels$1.HIGHLIGHT_COUNT_UPDATE, count);
30371
30636
  }
30372
30637
  if (!state2.devtoolsPanelView.webContents.isDestroyed()) {
30373
30638
  state2.devtoolsPanelView.webContents.send(
30374
- Channels.HIGHLIGHT_COUNT_UPDATE,
30639
+ Channels$1.HIGHLIGHT_COUNT_UPDATE,
30375
30640
  count
30376
30641
  );
30377
30642
  }
30378
30643
  };
30379
30644
  const windowState = createMainWindow((tabs, activeId, meta) => {
30380
30645
  windowState.chromeView.webContents.send(
30381
- Channels.TAB_STATE_UPDATE,
30646
+ Channels$1.TAB_STATE_UPDATE,
30382
30647
  tabs,
30383
30648
  activeId
30384
30649
  );
@@ -30405,16 +30670,16 @@ async function bootstrap() {
30405
30670
  installAdBlocking(tabManager);
30406
30671
  setDevToolsPanelListener((state2) => {
30407
30672
  if (!devtoolsPanelView.webContents.isDestroyed()) {
30408
- devtoolsPanelView.webContents.send(Channels.DEVTOOLS_PANEL_STATE, state2);
30673
+ devtoolsPanelView.webContents.send(Channels$1.DEVTOOLS_PANEL_STATE, state2);
30409
30674
  }
30410
30675
  });
30411
30676
  registerIpcHandlers(windowState, runtime);
30412
30677
  tabManager.onSecurityStateChange((tabId, state2) => {
30413
30678
  if (!chromeView.webContents.isDestroyed()) {
30414
- chromeView.webContents.send(Channels.SECURITY_STATE_UPDATE, { tabId, state: state2 });
30679
+ chromeView.webContents.send(Channels$1.SECURITY_STATE_UPDATE, { tabId, state: state2 });
30415
30680
  }
30416
30681
  if (!sidebarView.webContents.isDestroyed()) {
30417
- sidebarView.webContents.send(Channels.SECURITY_STATE_UPDATE, { tabId, state: state2 });
30682
+ sidebarView.webContents.send(Channels$1.SECURITY_STATE_UPDATE, { tabId, state: state2 });
30418
30683
  }
30419
30684
  });
30420
30685
  registerHighlightShortcut(windowState.mainWindow, tabManager);
@@ -30450,7 +30715,7 @@ async function bootstrap() {
30450
30715
  },
30451
30716
  clearBrowsingData: () => {
30452
30717
  if (!chromeView.webContents.isDestroyed()) {
30453
- chromeView.webContents.send(Channels.CLEAR_BROWSING_DATA_OPEN);
30718
+ chromeView.webContents.send(Channels$1.CLEAR_BROWSING_DATA_OPEN);
30454
30719
  }
30455
30720
  },
30456
30721
  togglePictureInPicture: () => {
@@ -30458,12 +30723,12 @@ async function bootstrap() {
30458
30723
  }
30459
30724
  });
30460
30725
  subscribe((state2) => {
30461
- chromeView.webContents.send(Channels.BOOKMARKS_UPDATE, state2);
30462
- sidebarView.webContents.send(Channels.BOOKMARKS_UPDATE, state2);
30726
+ chromeView.webContents.send(Channels$1.BOOKMARKS_UPDATE, state2);
30727
+ sidebarView.webContents.send(Channels$1.BOOKMARKS_UPDATE, state2);
30463
30728
  });
30464
30729
  subscribe$1((state2) => {
30465
- chromeView.webContents.send(Channels.HISTORY_UPDATE, state2);
30466
- sidebarView.webContents.send(Channels.HISTORY_UPDATE, state2);
30730
+ chromeView.webContents.send(Channels$1.HISTORY_UPDATE, state2);
30731
+ sidebarView.webContents.send(Channels$1.HISTORY_UPDATE, state2);
30467
30732
  });
30468
30733
  installDownloadHandler(chromeView);
30469
30734
  installPermissionHandler();