@quanta-intellect/vessel-browser 0.1.56 → 0.1.58

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
@@ -1376,6 +1376,10 @@ async function highlightBatchOnPage(wc, entries) {
1376
1376
  }
1377
1377
  const HIGHLIGHT_SELECTOR = "'.__vessel-highlight, .__vessel-highlight-text'";
1378
1378
  async function getHighlightCount(wc) {
1379
+ if (wc.isDestroyed()) return 0;
1380
+ if (wc.isLoading()) return 0;
1381
+ const currentUrl = wc.getURL();
1382
+ if (!currentUrl || currentUrl === "about:blank") return 0;
1379
1383
  return wc.executeJavaScript(
1380
1384
  `document.querySelectorAll(${HIGHLIGHT_SELECTOR}).length`
1381
1385
  );
@@ -2615,7 +2619,9 @@ const Channels = {
2615
2619
  TAB_BACK: "tab:back",
2616
2620
  TAB_FORWARD: "tab:forward",
2617
2621
  TAB_RELOAD: "tab:reload",
2622
+ TAB_STATE_GET: "tab:state-get",
2618
2623
  TAB_STATE_UPDATE: "tab:state-update",
2624
+ RENDERER_VIEW_READY: "renderer:view-ready",
2619
2625
  // AI
2620
2626
  AI_QUERY: "ai:query",
2621
2627
  AI_STREAM_START: "ai:stream-start",
@@ -5518,9 +5524,9 @@ function layoutViews(state2) {
5518
5524
  if (uiState.sidebarOpen) {
5519
5525
  sidebarView.setBounds({
5520
5526
  x: width - sidebarWidth - resizeHandleOverlap,
5521
- y: 0,
5527
+ y: chromeHeight,
5522
5528
  width: sidebarWidth + resizeHandleOverlap,
5523
- height
5529
+ height: height - chromeHeight
5524
5530
  });
5525
5531
  } else {
5526
5532
  sidebarView.setBounds({ x: width, y: 0, width: 0, height: 0 });
@@ -22938,6 +22944,10 @@ function registerIpcHandlers(windowState, runtime2) {
22938
22944
  electron.ipcMain.handle(Channels.TAB_RELOAD, (_, id) => {
22939
22945
  tabManager.reloadTab(id);
22940
22946
  });
22947
+ electron.ipcMain.handle(Channels.TAB_STATE_GET, () => ({
22948
+ tabs: tabManager.getAllStates(),
22949
+ activeId: tabManager.getActiveTabId() || ""
22950
+ }));
22941
22951
  electron.ipcMain.handle(Channels.AI_QUERY, async (_, query, history) => {
22942
22952
  const settings2 = loadSettings();
22943
22953
  const chatConfig = settings2.chatProvider;
@@ -23049,6 +23059,16 @@ function registerIpcHandlers(windowState, runtime2) {
23049
23059
  setSetting("sidebarWidth", windowState.uiState.sidebarWidth);
23050
23060
  layoutViews(windowState);
23051
23061
  });
23062
+ electron.ipcMain.on(
23063
+ Channels.RENDERER_VIEW_READY,
23064
+ (_event, view) => {
23065
+ if (view !== "sidebar") return;
23066
+ if (!windowState.uiState.sidebarOpen) {
23067
+ windowState.uiState.sidebarOpen = true;
23068
+ layoutViews(windowState);
23069
+ }
23070
+ }
23071
+ );
23052
23072
  electron.ipcMain.handle(Channels.FOCUS_MODE_TOGGLE, () => {
23053
23073
  windowState.uiState.focusMode = !windowState.uiState.focusMode;
23054
23074
  layoutViews(windowState);
@@ -24750,6 +24770,7 @@ async function bootstrap() {
24750
24770
  windowState.mainWindow.show();
24751
24771
  closeSplash(splash, 0);
24752
24772
  };
24773
+ let didInitializeChromeRenderer = false;
24753
24774
  const splashTimeout = setTimeout(() => {
24754
24775
  console.warn("[bootstrap] Renderer did not finish loading before splash timeout");
24755
24776
  revealMainWindow();
@@ -24776,8 +24797,9 @@ async function bootstrap() {
24776
24797
  installDownloadHandler(chromeView);
24777
24798
  startBackgroundRevalidation();
24778
24799
  startTelemetry();
24779
- loadRenderers(chromeView, sidebarView, devtoolsPanelView);
24780
- chromeView.webContents.once("did-finish-load", () => {
24800
+ const initializeChromeRenderer = () => {
24801
+ if (didInitializeChromeRenderer) return;
24802
+ didInitializeChromeRenderer = true;
24781
24803
  const savedSession = runtime.getState().session;
24782
24804
  if (settings2.autoRestoreSession && savedSession?.tabs.length) {
24783
24805
  runtime.restoreSession(savedSession);
@@ -24790,6 +24812,12 @@ async function bootstrap() {
24790
24812
  clearTimeout(splashTimeout);
24791
24813
  revealMainWindow();
24792
24814
  void maybeShowStartupHealthDialog(windowState);
24815
+ };
24816
+ chromeView.webContents.once("dom-ready", () => {
24817
+ initializeChromeRenderer();
24818
+ });
24819
+ chromeView.webContents.once("did-finish-load", () => {
24820
+ initializeChromeRenderer();
24793
24821
  });
24794
24822
  chromeView.webContents.once(
24795
24823
  "did-fail-load",
@@ -24805,6 +24833,7 @@ async function bootstrap() {
24805
24833
  revealMainWindow();
24806
24834
  }
24807
24835
  );
24836
+ loadRenderers(chromeView, sidebarView, devtoolsPanelView);
24808
24837
  startMcpServer(tabManager, runtime, settings2.mcpPort).catch((err) => {
24809
24838
  console.error("[bootstrap] MCP server failed to start:", err);
24810
24839
  });
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  const electron = require("electron");
3
- const channels = require("./chunks/channels-Dfv8z3Ui.js");
4
3
  var Readability = { exports: {} };
5
4
  var hasRequiredReadability$1;
6
5
  function requireReadability$1() {
@@ -2187,11 +2186,11 @@ function emitPageDiffDirty() {
2187
2186
  const nextSignature = getPageDiffSignature();
2188
2187
  if (!nextSignature || nextSignature === lastPageDiffSignature) return;
2189
2188
  lastPageDiffSignature = nextSignature;
2190
- electron.ipcRenderer.send(channels.Channels.PAGE_DIFF_DIRTY);
2189
+ electron.ipcRenderer.send("page:diff-dirty");
2191
2190
  }
2192
2191
  function notifyPageDiffActivity() {
2193
2192
  if (pageDiffActivityThrottleTimer) return;
2194
- electron.ipcRenderer.send(channels.Channels.PAGE_DIFF_ACTIVITY);
2193
+ electron.ipcRenderer.send("page:diff-activity");
2195
2194
  pageDiffActivityThrottleTimer = setTimeout(() => {
2196
2195
  pageDiffActivityThrottleTimer = null;
2197
2196
  }, PAGE_DIFF_ACTIVITY_THROTTLE_MS);
@@ -1,241 +1,362 @@
1
1
  "use strict";
2
2
  const electron = require("electron");
3
- const channels = require("./chunks/channels-Dfv8z3Ui.js");
3
+ const Channels = {
4
+ // Tab management
5
+ TAB_CREATE: "tab:create",
6
+ TAB_CLOSE: "tab:close",
7
+ TAB_SWITCH: "tab:switch",
8
+ TAB_NAVIGATE: "tab:navigate",
9
+ TAB_BACK: "tab:back",
10
+ TAB_FORWARD: "tab:forward",
11
+ TAB_RELOAD: "tab:reload",
12
+ TAB_STATE_GET: "tab:state-get",
13
+ TAB_STATE_UPDATE: "tab:state-update",
14
+ RENDERER_VIEW_READY: "renderer:view-ready",
15
+ // AI
16
+ AI_QUERY: "ai:query",
17
+ AI_STREAM_START: "ai:stream-start",
18
+ AI_STREAM_CHUNK: "ai:stream-chunk",
19
+ AI_STREAM_END: "ai:stream-end",
20
+ AI_STREAM_IDLE: "ai:stream-idle",
21
+ AUTOMATION_ACTIVITY_START: "automation:activity-start",
22
+ AUTOMATION_ACTIVITY_CHUNK: "automation:activity-chunk",
23
+ AUTOMATION_ACTIVITY_END: "automation:activity-end",
24
+ AI_CANCEL: "ai:cancel",
25
+ AI_FETCH_MODELS: "ai:fetch-models",
26
+ AGENT_RUNTIME_GET: "agent-runtime:get",
27
+ AGENT_RUNTIME_UPDATE: "agent-runtime:update",
28
+ AGENT_PAUSE: "agent:pause",
29
+ AGENT_RESUME: "agent:resume",
30
+ AGENT_SET_APPROVAL_MODE: "agent:set-approval-mode",
31
+ AGENT_APPROVAL_RESOLVE: "agent:approval-resolve",
32
+ AGENT_CHECKPOINT_CREATE: "agent:checkpoint-create",
33
+ AGENT_CHECKPOINT_RESTORE: "agent:checkpoint-restore",
34
+ AGENT_SESSION_CAPTURE: "agent:session-capture",
35
+ AGENT_SESSION_RESTORE: "agent:session-restore",
36
+ // Content
37
+ CONTENT_EXTRACT: "content:extract",
38
+ READER_MODE_TOGGLE: "reader:toggle",
39
+ // UI state
40
+ SIDEBAR_TOGGLE: "ui:sidebar-toggle",
41
+ SIDEBAR_RESIZE: "ui:sidebar-resize",
42
+ SIDEBAR_RESIZE_START: "ui:sidebar-resize-start",
43
+ SIDEBAR_RESIZE_COMMIT: "ui:sidebar-resize-commit",
44
+ SIDEBAR_CONTEXT_MENU: "ui:sidebar-context-menu",
45
+ FOCUS_MODE_TOGGLE: "ui:focus-mode-toggle",
46
+ SETTINGS_VISIBILITY: "ui:settings-visibility",
47
+ // Settings
48
+ SETTINGS_GET: "settings:get",
49
+ SETTINGS_SET: "settings:set",
50
+ SETTINGS_UPDATE: "settings:update",
51
+ SETTINGS_HEALTH_GET: "settings:health:get",
52
+ SETTINGS_HEALTH_UPDATE: "settings:health:update",
53
+ // Bookmarks
54
+ BOOKMARKS_GET: "bookmarks:get",
55
+ BOOKMARKS_UPDATE: "bookmarks:update",
56
+ BOOKMARK_SAVE: "bookmarks:save",
57
+ BOOKMARK_REMOVE: "bookmarks:remove",
58
+ BOOKMARK_ADD_CONTEXT_TO_CHAT: "bookmarks:add-context-to-chat",
59
+ FOLDER_CREATE: "bookmarks:folder-create",
60
+ FOLDER_REMOVE: "bookmarks:folder-remove",
61
+ FOLDER_RENAME: "bookmarks:folder-rename",
62
+ // Highlights
63
+ HIGHLIGHT_CAPTURE: "highlights:capture",
64
+ HIGHLIGHT_CAPTURE_RESULT: "highlights:capture-result",
65
+ HIGHLIGHT_NAV_COUNT: "highlights:nav-count",
66
+ HIGHLIGHT_COUNT_UPDATE: "highlights:count-update",
67
+ HIGHLIGHT_NAV_SCROLL: "highlights:nav-scroll",
68
+ HIGHLIGHT_NAV_REMOVE: "highlights:nav-remove",
69
+ HIGHLIGHT_NAV_CLEAR: "highlights:nav-clear",
70
+ SIDEBAR_HIGHLIGHT_ACTION: "highlights:sidebar-action",
71
+ // DevTools panel
72
+ DEVTOOLS_PANEL_TOGGLE: "devtools-panel:toggle",
73
+ DEVTOOLS_PANEL_STATE: "devtools-panel:state",
74
+ DEVTOOLS_PANEL_RESIZE: "devtools-panel:resize",
75
+ // Find in page
76
+ FIND_IN_PAGE_START: "find:start",
77
+ FIND_IN_PAGE_NEXT: "find:next",
78
+ FIND_IN_PAGE_STOP: "find:stop",
79
+ FIND_IN_PAGE_RESULT: "find:result",
80
+ // Browsing history
81
+ HISTORY_GET: "history:get",
82
+ HISTORY_SEARCH: "history:search",
83
+ HISTORY_CLEAR: "history:clear",
84
+ HISTORY_UPDATE: "history:update",
85
+ // Premium
86
+ PREMIUM_GET_STATE: "premium:get-state",
87
+ PREMIUM_ACTIVATION_START: "premium:activation-start",
88
+ PREMIUM_ACTIVATION_VERIFY: "premium:activation-verify",
89
+ PREMIUM_CHECKOUT: "premium:checkout",
90
+ PREMIUM_PORTAL: "premium:portal",
91
+ PREMIUM_RESET: "premium:reset",
92
+ PREMIUM_TRACK_CONTEXT: "premium:track-context",
93
+ PREMIUM_UPDATE: "premium:update",
94
+ // Agent Credential Vault
95
+ VAULT_LIST: "vault:list",
96
+ VAULT_ADD: "vault:add",
97
+ VAULT_UPDATE: "vault:update",
98
+ VAULT_REMOVE: "vault:remove",
99
+ VAULT_AUDIT_LOG: "vault:audit-log",
100
+ // Automation kits
101
+ AUTOMATION_GET_INSTALLED: "automation:get-installed",
102
+ AUTOMATION_INSTALL_FROM_FILE: "automation:install-from-file",
103
+ AUTOMATION_UNINSTALL: "automation:uninstall",
104
+ // Scheduled jobs
105
+ SCHEDULE_GET_ALL: "schedule:get-all",
106
+ SCHEDULE_CREATE: "schedule:create",
107
+ SCHEDULE_UPDATE: "schedule:update",
108
+ SCHEDULE_DELETE: "schedule:delete",
109
+ SCHEDULE_JOBS_UPDATE: "schedule:jobs-update",
110
+ // Window controls
111
+ WINDOW_MINIMIZE: "window:minimize",
112
+ WINDOW_MAXIMIZE: "window:maximize",
113
+ WINDOW_CLOSE: "window:close",
114
+ // Autofill
115
+ AUTOFILL_LIST: "autofill:list",
116
+ AUTOFILL_ADD: "autofill:add",
117
+ AUTOFILL_UPDATE: "autofill:update",
118
+ AUTOFILL_DELETE: "autofill:delete",
119
+ AUTOFILL_FILL: "autofill:fill",
120
+ PAGE_CHANGED: "page:changed",
121
+ PAGE_DIFF_GET: "page:diff-get"
122
+ };
4
123
  const api = {
5
124
  tabs: {
6
- create: (url) => electron.ipcRenderer.invoke(channels.Channels.TAB_CREATE, url),
7
- close: (id) => electron.ipcRenderer.invoke(channels.Channels.TAB_CLOSE, id),
8
- switch: (id) => electron.ipcRenderer.invoke(channels.Channels.TAB_SWITCH, id),
9
- navigate: (id, url, postBody) => electron.ipcRenderer.invoke(channels.Channels.TAB_NAVIGATE, id, url, postBody),
10
- back: (id) => electron.ipcRenderer.invoke(channels.Channels.TAB_BACK, id),
11
- forward: (id) => electron.ipcRenderer.invoke(channels.Channels.TAB_FORWARD, id),
12
- reload: (id) => electron.ipcRenderer.invoke(channels.Channels.TAB_RELOAD, id),
125
+ create: (url) => electron.ipcRenderer.invoke(Channels.TAB_CREATE, url),
126
+ close: (id) => electron.ipcRenderer.invoke(Channels.TAB_CLOSE, id),
127
+ switch: (id) => electron.ipcRenderer.invoke(Channels.TAB_SWITCH, id),
128
+ navigate: (id, url, postBody) => electron.ipcRenderer.invoke(Channels.TAB_NAVIGATE, id, url, postBody),
129
+ back: (id) => electron.ipcRenderer.invoke(Channels.TAB_BACK, id),
130
+ forward: (id) => electron.ipcRenderer.invoke(Channels.TAB_FORWARD, id),
131
+ reload: (id) => electron.ipcRenderer.invoke(Channels.TAB_RELOAD, id),
132
+ getState: () => electron.ipcRenderer.invoke(Channels.TAB_STATE_GET),
13
133
  onStateUpdate: (cb) => {
14
134
  const handler = (_, tabs, activeId) => cb(tabs, activeId);
15
- electron.ipcRenderer.on(channels.Channels.TAB_STATE_UPDATE, handler);
16
- return () => electron.ipcRenderer.removeListener(channels.Channels.TAB_STATE_UPDATE, handler);
135
+ electron.ipcRenderer.on(Channels.TAB_STATE_UPDATE, handler);
136
+ return () => electron.ipcRenderer.removeListener(Channels.TAB_STATE_UPDATE, handler);
17
137
  }
18
138
  },
19
139
  ai: {
20
- query: (prompt, history) => electron.ipcRenderer.invoke(channels.Channels.AI_QUERY, prompt, history),
140
+ query: (prompt, history) => electron.ipcRenderer.invoke(Channels.AI_QUERY, prompt, history),
21
141
  onStreamStart: (cb) => {
22
142
  const handler = (_, prompt) => cb(prompt);
23
- electron.ipcRenderer.on(channels.Channels.AI_STREAM_START, handler);
24
- return () => electron.ipcRenderer.removeListener(channels.Channels.AI_STREAM_START, handler);
143
+ electron.ipcRenderer.on(Channels.AI_STREAM_START, handler);
144
+ return () => electron.ipcRenderer.removeListener(Channels.AI_STREAM_START, handler);
25
145
  },
26
146
  onStreamChunk: (cb) => {
27
147
  const handler = (_, chunk) => cb(chunk);
28
- electron.ipcRenderer.on(channels.Channels.AI_STREAM_CHUNK, handler);
29
- return () => electron.ipcRenderer.removeListener(channels.Channels.AI_STREAM_CHUNK, handler);
148
+ electron.ipcRenderer.on(Channels.AI_STREAM_CHUNK, handler);
149
+ return () => electron.ipcRenderer.removeListener(Channels.AI_STREAM_CHUNK, handler);
30
150
  },
31
151
  onStreamEnd: (cb) => {
32
152
  const handler = (_, status = "completed") => cb(status);
33
- electron.ipcRenderer.on(channels.Channels.AI_STREAM_END, handler);
34
- return () => electron.ipcRenderer.removeListener(channels.Channels.AI_STREAM_END, handler);
153
+ electron.ipcRenderer.on(Channels.AI_STREAM_END, handler);
154
+ return () => electron.ipcRenderer.removeListener(Channels.AI_STREAM_END, handler);
35
155
  },
36
156
  onStreamIdle: (cb) => {
37
157
  const handler = () => cb();
38
- electron.ipcRenderer.on(channels.Channels.AI_STREAM_IDLE, handler);
39
- return () => electron.ipcRenderer.removeListener(channels.Channels.AI_STREAM_IDLE, handler);
158
+ electron.ipcRenderer.on(Channels.AI_STREAM_IDLE, handler);
159
+ return () => electron.ipcRenderer.removeListener(Channels.AI_STREAM_IDLE, handler);
40
160
  },
41
161
  onAutomationActivityStart: (cb) => {
42
162
  const handler = (_, entry) => cb(entry);
43
- electron.ipcRenderer.on(channels.Channels.AUTOMATION_ACTIVITY_START, handler);
44
- return () => electron.ipcRenderer.removeListener(channels.Channels.AUTOMATION_ACTIVITY_START, handler);
163
+ electron.ipcRenderer.on(Channels.AUTOMATION_ACTIVITY_START, handler);
164
+ return () => electron.ipcRenderer.removeListener(Channels.AUTOMATION_ACTIVITY_START, handler);
45
165
  },
46
166
  onAutomationActivityChunk: (cb) => {
47
167
  const handler = (_, payload) => cb(payload);
48
- electron.ipcRenderer.on(channels.Channels.AUTOMATION_ACTIVITY_CHUNK, handler);
49
- return () => electron.ipcRenderer.removeListener(channels.Channels.AUTOMATION_ACTIVITY_CHUNK, handler);
168
+ electron.ipcRenderer.on(Channels.AUTOMATION_ACTIVITY_CHUNK, handler);
169
+ return () => electron.ipcRenderer.removeListener(Channels.AUTOMATION_ACTIVITY_CHUNK, handler);
50
170
  },
51
171
  onAutomationActivityEnd: (cb) => {
52
172
  const handler = (_, payload) => cb(payload);
53
- electron.ipcRenderer.on(channels.Channels.AUTOMATION_ACTIVITY_END, handler);
54
- return () => electron.ipcRenderer.removeListener(channels.Channels.AUTOMATION_ACTIVITY_END, handler);
173
+ electron.ipcRenderer.on(Channels.AUTOMATION_ACTIVITY_END, handler);
174
+ return () => electron.ipcRenderer.removeListener(Channels.AUTOMATION_ACTIVITY_END, handler);
55
175
  },
56
- cancel: () => electron.ipcRenderer.invoke(channels.Channels.AI_CANCEL),
57
- fetchModels: (config) => electron.ipcRenderer.invoke(channels.Channels.AI_FETCH_MODELS, config),
58
- getRuntime: () => electron.ipcRenderer.invoke(channels.Channels.AGENT_RUNTIME_GET),
176
+ cancel: () => electron.ipcRenderer.invoke(Channels.AI_CANCEL),
177
+ fetchModels: (config) => electron.ipcRenderer.invoke(Channels.AI_FETCH_MODELS, config),
178
+ getRuntime: () => electron.ipcRenderer.invoke(Channels.AGENT_RUNTIME_GET),
59
179
  onRuntimeUpdate: (cb) => {
60
180
  const handler = (_, state) => cb(state);
61
- electron.ipcRenderer.on(channels.Channels.AGENT_RUNTIME_UPDATE, handler);
62
- return () => electron.ipcRenderer.removeListener(channels.Channels.AGENT_RUNTIME_UPDATE, handler);
181
+ electron.ipcRenderer.on(Channels.AGENT_RUNTIME_UPDATE, handler);
182
+ return () => electron.ipcRenderer.removeListener(Channels.AGENT_RUNTIME_UPDATE, handler);
63
183
  },
64
- pause: () => electron.ipcRenderer.invoke(channels.Channels.AGENT_PAUSE),
65
- resume: () => electron.ipcRenderer.invoke(channels.Channels.AGENT_RESUME),
66
- setApprovalMode: (mode) => electron.ipcRenderer.invoke(channels.Channels.AGENT_SET_APPROVAL_MODE, mode),
67
- resolveApproval: (approvalId, approved) => electron.ipcRenderer.invoke(channels.Channels.AGENT_APPROVAL_RESOLVE, approvalId, approved),
68
- createCheckpoint: (name, note) => electron.ipcRenderer.invoke(channels.Channels.AGENT_CHECKPOINT_CREATE, name, note),
69
- restoreCheckpoint: (checkpointId) => electron.ipcRenderer.invoke(channels.Channels.AGENT_CHECKPOINT_RESTORE, checkpointId),
70
- captureSession: (note) => electron.ipcRenderer.invoke(channels.Channels.AGENT_SESSION_CAPTURE, note),
71
- restoreSession: (snapshot) => electron.ipcRenderer.invoke(channels.Channels.AGENT_SESSION_RESTORE, snapshot)
184
+ pause: () => electron.ipcRenderer.invoke(Channels.AGENT_PAUSE),
185
+ resume: () => electron.ipcRenderer.invoke(Channels.AGENT_RESUME),
186
+ setApprovalMode: (mode) => electron.ipcRenderer.invoke(Channels.AGENT_SET_APPROVAL_MODE, mode),
187
+ resolveApproval: (approvalId, approved) => electron.ipcRenderer.invoke(Channels.AGENT_APPROVAL_RESOLVE, approvalId, approved),
188
+ createCheckpoint: (name, note) => electron.ipcRenderer.invoke(Channels.AGENT_CHECKPOINT_CREATE, name, note),
189
+ restoreCheckpoint: (checkpointId) => electron.ipcRenderer.invoke(Channels.AGENT_CHECKPOINT_RESTORE, checkpointId),
190
+ captureSession: (note) => electron.ipcRenderer.invoke(Channels.AGENT_SESSION_CAPTURE, note),
191
+ restoreSession: (snapshot) => electron.ipcRenderer.invoke(Channels.AGENT_SESSION_RESTORE, snapshot)
72
192
  },
73
193
  content: {
74
- extract: () => electron.ipcRenderer.invoke(channels.Channels.CONTENT_EXTRACT),
75
- toggleReader: () => electron.ipcRenderer.invoke(channels.Channels.READER_MODE_TOGGLE)
194
+ extract: () => electron.ipcRenderer.invoke(Channels.CONTENT_EXTRACT),
195
+ toggleReader: () => electron.ipcRenderer.invoke(Channels.READER_MODE_TOGGLE)
76
196
  },
77
197
  highlights: {
78
- capture: () => electron.ipcRenderer.invoke(channels.Channels.HIGHLIGHT_CAPTURE),
198
+ capture: () => electron.ipcRenderer.invoke(Channels.HIGHLIGHT_CAPTURE),
79
199
  onCaptureResult: (cb) => {
80
200
  const handler = (_, result) => cb(result);
81
- electron.ipcRenderer.on(channels.Channels.HIGHLIGHT_CAPTURE_RESULT, handler);
82
- return () => electron.ipcRenderer.removeListener(channels.Channels.HIGHLIGHT_CAPTURE_RESULT, handler);
201
+ electron.ipcRenderer.on(Channels.HIGHLIGHT_CAPTURE_RESULT, handler);
202
+ return () => electron.ipcRenderer.removeListener(Channels.HIGHLIGHT_CAPTURE_RESULT, handler);
83
203
  },
84
- getCount: () => electron.ipcRenderer.invoke(channels.Channels.HIGHLIGHT_NAV_COUNT),
204
+ getCount: () => electron.ipcRenderer.invoke(Channels.HIGHLIGHT_NAV_COUNT),
85
205
  onCountUpdate: (cb) => {
86
206
  const handler = (_, count) => cb(count);
87
- electron.ipcRenderer.on(channels.Channels.HIGHLIGHT_COUNT_UPDATE, handler);
88
- return () => electron.ipcRenderer.removeListener(channels.Channels.HIGHLIGHT_COUNT_UPDATE, handler);
207
+ electron.ipcRenderer.on(Channels.HIGHLIGHT_COUNT_UPDATE, handler);
208
+ return () => electron.ipcRenderer.removeListener(Channels.HIGHLIGHT_COUNT_UPDATE, handler);
89
209
  },
90
- scrollTo: (index) => electron.ipcRenderer.invoke(channels.Channels.HIGHLIGHT_NAV_SCROLL, index),
91
- remove: (index) => electron.ipcRenderer.invoke(channels.Channels.HIGHLIGHT_NAV_REMOVE, index),
92
- clearAll: () => electron.ipcRenderer.invoke(channels.Channels.HIGHLIGHT_NAV_CLEAR),
210
+ scrollTo: (index) => electron.ipcRenderer.invoke(Channels.HIGHLIGHT_NAV_SCROLL, index),
211
+ remove: (index) => electron.ipcRenderer.invoke(Channels.HIGHLIGHT_NAV_REMOVE, index),
212
+ clearAll: () => electron.ipcRenderer.invoke(Channels.HIGHLIGHT_NAV_CLEAR),
93
213
  onSidebarAction: (cb) => {
94
214
  const handler = (_, action) => cb(action);
95
- electron.ipcRenderer.on(channels.Channels.SIDEBAR_HIGHLIGHT_ACTION, handler);
96
- return () => electron.ipcRenderer.removeListener(channels.Channels.SIDEBAR_HIGHLIGHT_ACTION, handler);
215
+ electron.ipcRenderer.on(Channels.SIDEBAR_HIGHLIGHT_ACTION, handler);
216
+ return () => electron.ipcRenderer.removeListener(Channels.SIDEBAR_HIGHLIGHT_ACTION, handler);
97
217
  }
98
218
  },
99
219
  ui: {
100
- toggleSidebar: () => electron.ipcRenderer.invoke(channels.Channels.SIDEBAR_TOGGLE),
101
- startSidebarResize: () => electron.ipcRenderer.invoke(channels.Channels.SIDEBAR_RESIZE_START),
102
- resizeSidebar: (width) => electron.ipcRenderer.invoke(channels.Channels.SIDEBAR_RESIZE, width),
103
- commitSidebarResize: () => electron.ipcRenderer.invoke(channels.Channels.SIDEBAR_RESIZE_COMMIT),
220
+ toggleSidebar: () => electron.ipcRenderer.invoke(Channels.SIDEBAR_TOGGLE),
221
+ startSidebarResize: () => electron.ipcRenderer.invoke(Channels.SIDEBAR_RESIZE_START),
222
+ resizeSidebar: (width) => electron.ipcRenderer.invoke(Channels.SIDEBAR_RESIZE, width),
223
+ commitSidebarResize: () => electron.ipcRenderer.invoke(Channels.SIDEBAR_RESIZE_COMMIT),
224
+ rendererReady: (view) => electron.ipcRenderer.send(Channels.RENDERER_VIEW_READY, view),
104
225
  onSidebarContextMenu: (cb) => {
105
226
  const handler = (_, position) => cb(position);
106
- electron.ipcRenderer.on(channels.Channels.SIDEBAR_CONTEXT_MENU, handler);
107
- return () => electron.ipcRenderer.removeListener(channels.Channels.SIDEBAR_CONTEXT_MENU, handler);
227
+ electron.ipcRenderer.on(Channels.SIDEBAR_CONTEXT_MENU, handler);
228
+ return () => electron.ipcRenderer.removeListener(Channels.SIDEBAR_CONTEXT_MENU, handler);
108
229
  },
109
- toggleFocusMode: () => electron.ipcRenderer.invoke(channels.Channels.FOCUS_MODE_TOGGLE),
110
- setSettingsVisibility: (open) => electron.ipcRenderer.invoke(channels.Channels.SETTINGS_VISIBILITY, open)
230
+ toggleFocusMode: () => electron.ipcRenderer.invoke(Channels.FOCUS_MODE_TOGGLE),
231
+ setSettingsVisibility: (open) => electron.ipcRenderer.invoke(Channels.SETTINGS_VISIBILITY, open)
111
232
  },
112
233
  settings: {
113
- get: () => electron.ipcRenderer.invoke(channels.Channels.SETTINGS_GET),
114
- getHealth: () => electron.ipcRenderer.invoke(channels.Channels.SETTINGS_HEALTH_GET),
234
+ get: () => electron.ipcRenderer.invoke(Channels.SETTINGS_GET),
235
+ getHealth: () => electron.ipcRenderer.invoke(Channels.SETTINGS_HEALTH_GET),
115
236
  onHealthUpdate: (cb) => {
116
237
  const handler = (_, health) => cb(health);
117
- electron.ipcRenderer.on(channels.Channels.SETTINGS_HEALTH_UPDATE, handler);
118
- return () => electron.ipcRenderer.removeListener(channels.Channels.SETTINGS_HEALTH_UPDATE, handler);
238
+ electron.ipcRenderer.on(Channels.SETTINGS_HEALTH_UPDATE, handler);
239
+ return () => electron.ipcRenderer.removeListener(Channels.SETTINGS_HEALTH_UPDATE, handler);
119
240
  },
120
- set: (key, value) => electron.ipcRenderer.invoke(channels.Channels.SETTINGS_SET, key, value),
241
+ set: (key, value) => electron.ipcRenderer.invoke(Channels.SETTINGS_SET, key, value),
121
242
  onUpdate: (cb) => {
122
243
  const handler = (_, settings) => cb(settings);
123
- electron.ipcRenderer.on(channels.Channels.SETTINGS_UPDATE, handler);
124
- return () => electron.ipcRenderer.removeListener(channels.Channels.SETTINGS_UPDATE, handler);
244
+ electron.ipcRenderer.on(Channels.SETTINGS_UPDATE, handler);
245
+ return () => electron.ipcRenderer.removeListener(Channels.SETTINGS_UPDATE, handler);
125
246
  }
126
247
  },
127
248
  bookmarks: {
128
- get: () => electron.ipcRenderer.invoke(channels.Channels.BOOKMARKS_GET),
129
- saveBookmark: (url, title, folderId, note) => electron.ipcRenderer.invoke(channels.Channels.BOOKMARK_SAVE, url, title, folderId, note),
130
- removeBookmark: (id) => electron.ipcRenderer.invoke(channels.Channels.BOOKMARK_REMOVE, id),
131
- createFolder: (name) => electron.ipcRenderer.invoke(channels.Channels.FOLDER_CREATE, name),
132
- createFolderWithSummary: (name, summary) => electron.ipcRenderer.invoke(channels.Channels.FOLDER_CREATE, name, summary),
133
- removeFolder: (id, deleteContents) => electron.ipcRenderer.invoke(channels.Channels.FOLDER_REMOVE, id, deleteContents),
134
- renameFolder: (id, newName, summary) => electron.ipcRenderer.invoke(channels.Channels.FOLDER_RENAME, id, newName, summary),
249
+ get: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_GET),
250
+ saveBookmark: (url, title, folderId, note) => electron.ipcRenderer.invoke(Channels.BOOKMARK_SAVE, url, title, folderId, note),
251
+ removeBookmark: (id) => electron.ipcRenderer.invoke(Channels.BOOKMARK_REMOVE, id),
252
+ createFolder: (name) => electron.ipcRenderer.invoke(Channels.FOLDER_CREATE, name),
253
+ createFolderWithSummary: (name, summary) => electron.ipcRenderer.invoke(Channels.FOLDER_CREATE, name, summary),
254
+ removeFolder: (id, deleteContents) => electron.ipcRenderer.invoke(Channels.FOLDER_REMOVE, id, deleteContents),
255
+ renameFolder: (id, newName, summary) => electron.ipcRenderer.invoke(Channels.FOLDER_RENAME, id, newName, summary),
135
256
  onAddContextToChat: (cb) => {
136
257
  const handler = (_, bookmarkId) => cb(bookmarkId);
137
- electron.ipcRenderer.on(channels.Channels.BOOKMARK_ADD_CONTEXT_TO_CHAT, handler);
258
+ electron.ipcRenderer.on(Channels.BOOKMARK_ADD_CONTEXT_TO_CHAT, handler);
138
259
  return () => electron.ipcRenderer.removeListener(
139
- channels.Channels.BOOKMARK_ADD_CONTEXT_TO_CHAT,
260
+ Channels.BOOKMARK_ADD_CONTEXT_TO_CHAT,
140
261
  handler
141
262
  );
142
263
  },
143
264
  onUpdate: (cb) => {
144
265
  const handler = (_, state) => cb(state);
145
- electron.ipcRenderer.on(channels.Channels.BOOKMARKS_UPDATE, handler);
146
- return () => electron.ipcRenderer.removeListener(channels.Channels.BOOKMARKS_UPDATE, handler);
266
+ electron.ipcRenderer.on(Channels.BOOKMARKS_UPDATE, handler);
267
+ return () => electron.ipcRenderer.removeListener(Channels.BOOKMARKS_UPDATE, handler);
147
268
  }
148
269
  },
149
270
  devtoolsPanel: {
150
- toggle: () => electron.ipcRenderer.invoke(channels.Channels.DEVTOOLS_PANEL_TOGGLE),
151
- resize: (height) => electron.ipcRenderer.invoke(channels.Channels.DEVTOOLS_PANEL_RESIZE, height),
271
+ toggle: () => electron.ipcRenderer.invoke(Channels.DEVTOOLS_PANEL_TOGGLE),
272
+ resize: (height) => electron.ipcRenderer.invoke(Channels.DEVTOOLS_PANEL_RESIZE, height),
152
273
  onStateUpdate: (cb) => {
153
274
  const handler = (_, state) => cb(state);
154
- electron.ipcRenderer.on(channels.Channels.DEVTOOLS_PANEL_STATE, handler);
155
- return () => electron.ipcRenderer.removeListener(channels.Channels.DEVTOOLS_PANEL_STATE, handler);
275
+ electron.ipcRenderer.on(Channels.DEVTOOLS_PANEL_STATE, handler);
276
+ return () => electron.ipcRenderer.removeListener(Channels.DEVTOOLS_PANEL_STATE, handler);
156
277
  }
157
278
  },
158
279
  find: {
159
- start: (text, options) => electron.ipcRenderer.invoke(channels.Channels.FIND_IN_PAGE_START, text, options),
160
- next: (forward) => electron.ipcRenderer.invoke(channels.Channels.FIND_IN_PAGE_NEXT, forward),
161
- stop: (action) => electron.ipcRenderer.invoke(channels.Channels.FIND_IN_PAGE_STOP, action),
280
+ start: (text, options) => electron.ipcRenderer.invoke(Channels.FIND_IN_PAGE_START, text, options),
281
+ next: (forward) => electron.ipcRenderer.invoke(Channels.FIND_IN_PAGE_NEXT, forward),
282
+ stop: (action) => electron.ipcRenderer.invoke(Channels.FIND_IN_PAGE_STOP, action),
162
283
  onResult: (cb) => {
163
284
  const handler = (_, result) => cb(result);
164
- electron.ipcRenderer.on(channels.Channels.FIND_IN_PAGE_RESULT, handler);
165
- return () => electron.ipcRenderer.removeListener(channels.Channels.FIND_IN_PAGE_RESULT, handler);
285
+ electron.ipcRenderer.on(Channels.FIND_IN_PAGE_RESULT, handler);
286
+ return () => electron.ipcRenderer.removeListener(Channels.FIND_IN_PAGE_RESULT, handler);
166
287
  }
167
288
  },
168
289
  history: {
169
- get: () => electron.ipcRenderer.invoke(channels.Channels.HISTORY_GET),
170
- search: (query) => electron.ipcRenderer.invoke(channels.Channels.HISTORY_SEARCH, query),
171
- clear: () => electron.ipcRenderer.invoke(channels.Channels.HISTORY_CLEAR),
290
+ get: () => electron.ipcRenderer.invoke(Channels.HISTORY_GET),
291
+ search: (query) => electron.ipcRenderer.invoke(Channels.HISTORY_SEARCH, query),
292
+ clear: () => electron.ipcRenderer.invoke(Channels.HISTORY_CLEAR),
172
293
  onUpdate: (cb) => {
173
294
  const handler = (_, state) => cb(state);
174
- electron.ipcRenderer.on(channels.Channels.HISTORY_UPDATE, handler);
175
- return () => electron.ipcRenderer.removeListener(channels.Channels.HISTORY_UPDATE, handler);
295
+ electron.ipcRenderer.on(Channels.HISTORY_UPDATE, handler);
296
+ return () => electron.ipcRenderer.removeListener(Channels.HISTORY_UPDATE, handler);
176
297
  }
177
298
  },
178
299
  premium: {
179
- getState: () => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_GET_STATE),
180
- requestCode: (email) => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_ACTIVATION_START, email),
300
+ getState: () => electron.ipcRenderer.invoke(Channels.PREMIUM_GET_STATE),
301
+ requestCode: (email) => electron.ipcRenderer.invoke(Channels.PREMIUM_ACTIVATION_START, email),
181
302
  verifyCode: (email, code, challengeToken) => electron.ipcRenderer.invoke(
182
- channels.Channels.PREMIUM_ACTIVATION_VERIFY,
303
+ Channels.PREMIUM_ACTIVATION_VERIFY,
183
304
  email,
184
305
  code,
185
306
  challengeToken
186
307
  ),
187
- checkout: (email) => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_CHECKOUT, email),
188
- portal: () => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_PORTAL),
189
- reset: () => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_RESET),
190
- trackContext: (step) => electron.ipcRenderer.invoke(channels.Channels.PREMIUM_TRACK_CONTEXT, step),
308
+ checkout: (email) => electron.ipcRenderer.invoke(Channels.PREMIUM_CHECKOUT, email),
309
+ portal: () => electron.ipcRenderer.invoke(Channels.PREMIUM_PORTAL),
310
+ reset: () => electron.ipcRenderer.invoke(Channels.PREMIUM_RESET),
311
+ trackContext: (step) => electron.ipcRenderer.invoke(Channels.PREMIUM_TRACK_CONTEXT, step),
191
312
  onUpdate: (cb) => {
192
313
  const handler = (_, state) => cb(state);
193
- electron.ipcRenderer.on(channels.Channels.PREMIUM_UPDATE, handler);
194
- return () => electron.ipcRenderer.removeListener(channels.Channels.PREMIUM_UPDATE, handler);
314
+ electron.ipcRenderer.on(Channels.PREMIUM_UPDATE, handler);
315
+ return () => electron.ipcRenderer.removeListener(Channels.PREMIUM_UPDATE, handler);
195
316
  }
196
317
  },
197
318
  vault: {
198
- list: () => electron.ipcRenderer.invoke(channels.Channels.VAULT_LIST),
199
- add: (entry) => electron.ipcRenderer.invoke(channels.Channels.VAULT_ADD, entry),
200
- update: (id, updates) => electron.ipcRenderer.invoke(channels.Channels.VAULT_UPDATE, id, updates),
201
- remove: (id) => electron.ipcRenderer.invoke(channels.Channels.VAULT_REMOVE, id),
202
- auditLog: (limit) => electron.ipcRenderer.invoke(channels.Channels.VAULT_AUDIT_LOG, limit)
319
+ list: () => electron.ipcRenderer.invoke(Channels.VAULT_LIST),
320
+ add: (entry) => electron.ipcRenderer.invoke(Channels.VAULT_ADD, entry),
321
+ update: (id, updates) => electron.ipcRenderer.invoke(Channels.VAULT_UPDATE, id, updates),
322
+ remove: (id) => electron.ipcRenderer.invoke(Channels.VAULT_REMOVE, id),
323
+ auditLog: (limit) => electron.ipcRenderer.invoke(Channels.VAULT_AUDIT_LOG, limit)
203
324
  },
204
325
  automation: {
205
- getInstalled: () => electron.ipcRenderer.invoke(channels.Channels.AUTOMATION_GET_INSTALLED),
206
- installFromFile: () => electron.ipcRenderer.invoke(channels.Channels.AUTOMATION_INSTALL_FROM_FILE),
207
- uninstall: (id) => electron.ipcRenderer.invoke(channels.Channels.AUTOMATION_UNINSTALL, id)
326
+ getInstalled: () => electron.ipcRenderer.invoke(Channels.AUTOMATION_GET_INSTALLED),
327
+ installFromFile: () => electron.ipcRenderer.invoke(Channels.AUTOMATION_INSTALL_FROM_FILE),
328
+ uninstall: (id) => electron.ipcRenderer.invoke(Channels.AUTOMATION_UNINSTALL, id)
208
329
  },
209
330
  schedule: {
210
- getAll: () => electron.ipcRenderer.invoke(channels.Channels.SCHEDULE_GET_ALL),
211
- create: (job) => electron.ipcRenderer.invoke(channels.Channels.SCHEDULE_CREATE, job),
212
- update: (id, updates) => electron.ipcRenderer.invoke(channels.Channels.SCHEDULE_UPDATE, id, updates),
213
- delete: (id) => electron.ipcRenderer.invoke(channels.Channels.SCHEDULE_DELETE, id),
331
+ getAll: () => electron.ipcRenderer.invoke(Channels.SCHEDULE_GET_ALL),
332
+ create: (job) => electron.ipcRenderer.invoke(Channels.SCHEDULE_CREATE, job),
333
+ update: (id, updates) => electron.ipcRenderer.invoke(Channels.SCHEDULE_UPDATE, id, updates),
334
+ delete: (id) => electron.ipcRenderer.invoke(Channels.SCHEDULE_DELETE, id),
214
335
  onJobsUpdate: (cb) => {
215
336
  const handler = (_, updatedJobs) => cb(updatedJobs);
216
- electron.ipcRenderer.on(channels.Channels.SCHEDULE_JOBS_UPDATE, handler);
217
- return () => electron.ipcRenderer.removeListener(channels.Channels.SCHEDULE_JOBS_UPDATE, handler);
337
+ electron.ipcRenderer.on(Channels.SCHEDULE_JOBS_UPDATE, handler);
338
+ return () => electron.ipcRenderer.removeListener(Channels.SCHEDULE_JOBS_UPDATE, handler);
218
339
  }
219
340
  },
220
341
  window: {
221
- minimize: () => electron.ipcRenderer.invoke(channels.Channels.WINDOW_MINIMIZE),
222
- maximize: () => electron.ipcRenderer.invoke(channels.Channels.WINDOW_MAXIMIZE),
223
- close: () => electron.ipcRenderer.invoke(channels.Channels.WINDOW_CLOSE)
342
+ minimize: () => electron.ipcRenderer.invoke(Channels.WINDOW_MINIMIZE),
343
+ maximize: () => electron.ipcRenderer.invoke(Channels.WINDOW_MAXIMIZE),
344
+ close: () => electron.ipcRenderer.invoke(Channels.WINDOW_CLOSE)
224
345
  },
225
346
  autofill: {
226
- list: () => electron.ipcRenderer.invoke(channels.Channels.AUTOFILL_LIST),
227
- add: (profile) => electron.ipcRenderer.invoke(channels.Channels.AUTOFILL_ADD, profile),
228
- update: (id, updates) => electron.ipcRenderer.invoke(channels.Channels.AUTOFILL_UPDATE, id, updates),
229
- delete: (id) => electron.ipcRenderer.invoke(channels.Channels.AUTOFILL_DELETE, id),
230
- fill: (profileId) => electron.ipcRenderer.invoke(channels.Channels.AUTOFILL_FILL, profileId)
347
+ list: () => electron.ipcRenderer.invoke(Channels.AUTOFILL_LIST),
348
+ add: (profile) => electron.ipcRenderer.invoke(Channels.AUTOFILL_ADD, profile),
349
+ update: (id, updates) => electron.ipcRenderer.invoke(Channels.AUTOFILL_UPDATE, id, updates),
350
+ delete: (id) => electron.ipcRenderer.invoke(Channels.AUTOFILL_DELETE, id),
351
+ fill: (profileId) => electron.ipcRenderer.invoke(Channels.AUTOFILL_FILL, profileId)
231
352
  },
232
353
  pageDiff: {
233
354
  onChanged: (cb) => {
234
355
  const handler = (_, diff) => cb(diff);
235
- electron.ipcRenderer.on(channels.Channels.PAGE_CHANGED, handler);
236
- return () => electron.ipcRenderer.removeListener(channels.Channels.PAGE_CHANGED, handler);
356
+ electron.ipcRenderer.on(Channels.PAGE_CHANGED, handler);
357
+ return () => electron.ipcRenderer.removeListener(Channels.PAGE_CHANGED, handler);
237
358
  },
238
- get: () => electron.ipcRenderer.invoke(channels.Channels.PAGE_DIFF_GET)
359
+ get: () => electron.ipcRenderer.invoke(Channels.PAGE_DIFF_GET)
239
360
  }
240
361
  };
241
362
  electron.contextBridge.exposeInMainWorld("vessel", api);
@@ -1511,7 +1511,7 @@
1511
1511
 
1512
1512
  .sidebar-tab {
1513
1513
  position: relative;
1514
- padding: 9px 12px 10px;
1514
+ padding: 9px 8px 10px;
1515
1515
  font-size: 11.5px;
1516
1516
  white-space: nowrap;
1517
1517
  flex-shrink: 0;
@@ -4767,6 +4767,7 @@ button:active:not(:disabled) {
4767
4767
 
4768
4768
  .chrome {
4769
4769
  position: relative;
4770
+ -webkit-app-region: no-drag;
4770
4771
  }
4771
4772
 
4772
4773
  .loading-bar {
@@ -1489,15 +1489,30 @@ delegateEvents(["click"]);
1489
1489
  const [tabs, setTabs] = createSignal([]);
1490
1490
  const [activeTabId, setActiveTabId] = createSignal("");
1491
1491
  let initialized$3 = false;
1492
+ let initPromise$2 = null;
1492
1493
  function init$3() {
1494
+ if (initPromise$2) return initPromise$2;
1493
1495
  if (initialized$3) return;
1494
1496
  initialized$3 = true;
1495
- window.vessel.tabs.onStateUpdate(
1496
- (newTabs, newActiveId) => {
1497
- setTabs(newTabs);
1498
- setActiveTabId(newActiveId);
1497
+ initPromise$2 = (async () => {
1498
+ try {
1499
+ window.vessel.tabs.onStateUpdate(
1500
+ (newTabs, newActiveId) => {
1501
+ setTabs(newTabs);
1502
+ setActiveTabId(newActiveId);
1503
+ }
1504
+ );
1505
+ const initialState = await window.vessel.tabs.getState();
1506
+ setTabs(initialState.tabs);
1507
+ setActiveTabId(initialState.activeId);
1508
+ } catch (error) {
1509
+ initialized$3 = false;
1510
+ console.error("Failed to initialize tabs store", error);
1511
+ } finally {
1512
+ initPromise$2 = null;
1499
1513
  }
1500
- );
1514
+ })();
1515
+ return initPromise$2;
1501
1516
  }
1502
1517
  function useTabs() {
1503
1518
  init$3();
@@ -9447,6 +9462,7 @@ const App = () => {
9447
9462
  }
9448
9463
  };
9449
9464
  onMount(() => {
9465
+ window.vessel.ui.rendererReady(view);
9450
9466
  if (view !== "chrome") return;
9451
9467
  const cleanupKeys = setupKeybindings({
9452
9468
  openCommandBar,
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:;" />
7
7
  <title>Vessel</title>
8
- <script type="module" crossorigin src="./assets/index-DRVDsSQe.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-DRj77a_O.css">
8
+ <script type="module" crossorigin src="./assets/index-DGIC7Iij.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-Bn4ixapT.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@quanta-intellect/vessel-browser",
3
3
  "mcpName": "io.github.unmodeled-tyler/vessel-browser",
4
- "version": "0.1.56",
4
+ "version": "0.1.58",
5
5
  "description": "AI-native web browser runtime for autonomous agents with human supervision",
6
6
  "main": "./out/main/index.js",
7
7
  "bin": {
@@ -1,123 +0,0 @@
1
- "use strict";
2
- const Channels = {
3
- // Tab management
4
- TAB_CREATE: "tab:create",
5
- TAB_CLOSE: "tab:close",
6
- TAB_SWITCH: "tab:switch",
7
- TAB_NAVIGATE: "tab:navigate",
8
- TAB_BACK: "tab:back",
9
- TAB_FORWARD: "tab:forward",
10
- TAB_RELOAD: "tab:reload",
11
- TAB_STATE_UPDATE: "tab:state-update",
12
- // AI
13
- AI_QUERY: "ai:query",
14
- AI_STREAM_START: "ai:stream-start",
15
- AI_STREAM_CHUNK: "ai:stream-chunk",
16
- AI_STREAM_END: "ai:stream-end",
17
- AI_STREAM_IDLE: "ai:stream-idle",
18
- AUTOMATION_ACTIVITY_START: "automation:activity-start",
19
- AUTOMATION_ACTIVITY_CHUNK: "automation:activity-chunk",
20
- AUTOMATION_ACTIVITY_END: "automation:activity-end",
21
- AI_CANCEL: "ai:cancel",
22
- AI_FETCH_MODELS: "ai:fetch-models",
23
- AGENT_RUNTIME_GET: "agent-runtime:get",
24
- AGENT_RUNTIME_UPDATE: "agent-runtime:update",
25
- AGENT_PAUSE: "agent:pause",
26
- AGENT_RESUME: "agent:resume",
27
- AGENT_SET_APPROVAL_MODE: "agent:set-approval-mode",
28
- AGENT_APPROVAL_RESOLVE: "agent:approval-resolve",
29
- AGENT_CHECKPOINT_CREATE: "agent:checkpoint-create",
30
- AGENT_CHECKPOINT_RESTORE: "agent:checkpoint-restore",
31
- AGENT_SESSION_CAPTURE: "agent:session-capture",
32
- AGENT_SESSION_RESTORE: "agent:session-restore",
33
- // Content
34
- CONTENT_EXTRACT: "content:extract",
35
- READER_MODE_TOGGLE: "reader:toggle",
36
- // UI state
37
- SIDEBAR_TOGGLE: "ui:sidebar-toggle",
38
- SIDEBAR_RESIZE: "ui:sidebar-resize",
39
- SIDEBAR_RESIZE_START: "ui:sidebar-resize-start",
40
- SIDEBAR_RESIZE_COMMIT: "ui:sidebar-resize-commit",
41
- SIDEBAR_CONTEXT_MENU: "ui:sidebar-context-menu",
42
- FOCUS_MODE_TOGGLE: "ui:focus-mode-toggle",
43
- SETTINGS_VISIBILITY: "ui:settings-visibility",
44
- // Settings
45
- SETTINGS_GET: "settings:get",
46
- SETTINGS_SET: "settings:set",
47
- SETTINGS_UPDATE: "settings:update",
48
- SETTINGS_HEALTH_GET: "settings:health:get",
49
- SETTINGS_HEALTH_UPDATE: "settings:health:update",
50
- // Bookmarks
51
- BOOKMARKS_GET: "bookmarks:get",
52
- BOOKMARKS_UPDATE: "bookmarks:update",
53
- BOOKMARK_SAVE: "bookmarks:save",
54
- BOOKMARK_REMOVE: "bookmarks:remove",
55
- BOOKMARK_ADD_CONTEXT_TO_CHAT: "bookmarks:add-context-to-chat",
56
- FOLDER_CREATE: "bookmarks:folder-create",
57
- FOLDER_REMOVE: "bookmarks:folder-remove",
58
- FOLDER_RENAME: "bookmarks:folder-rename",
59
- // Highlights
60
- HIGHLIGHT_CAPTURE: "highlights:capture",
61
- HIGHLIGHT_CAPTURE_RESULT: "highlights:capture-result",
62
- HIGHLIGHT_NAV_COUNT: "highlights:nav-count",
63
- HIGHLIGHT_COUNT_UPDATE: "highlights:count-update",
64
- HIGHLIGHT_NAV_SCROLL: "highlights:nav-scroll",
65
- HIGHLIGHT_NAV_REMOVE: "highlights:nav-remove",
66
- HIGHLIGHT_NAV_CLEAR: "highlights:nav-clear",
67
- SIDEBAR_HIGHLIGHT_ACTION: "highlights:sidebar-action",
68
- // DevTools panel
69
- DEVTOOLS_PANEL_TOGGLE: "devtools-panel:toggle",
70
- DEVTOOLS_PANEL_STATE: "devtools-panel:state",
71
- DEVTOOLS_PANEL_RESIZE: "devtools-panel:resize",
72
- // Find in page
73
- FIND_IN_PAGE_START: "find:start",
74
- FIND_IN_PAGE_NEXT: "find:next",
75
- FIND_IN_PAGE_STOP: "find:stop",
76
- FIND_IN_PAGE_RESULT: "find:result",
77
- // Browsing history
78
- HISTORY_GET: "history:get",
79
- HISTORY_SEARCH: "history:search",
80
- HISTORY_CLEAR: "history:clear",
81
- HISTORY_UPDATE: "history:update",
82
- // Premium
83
- PREMIUM_GET_STATE: "premium:get-state",
84
- PREMIUM_ACTIVATION_START: "premium:activation-start",
85
- PREMIUM_ACTIVATION_VERIFY: "premium:activation-verify",
86
- PREMIUM_CHECKOUT: "premium:checkout",
87
- PREMIUM_PORTAL: "premium:portal",
88
- PREMIUM_RESET: "premium:reset",
89
- PREMIUM_TRACK_CONTEXT: "premium:track-context",
90
- PREMIUM_UPDATE: "premium:update",
91
- // Agent Credential Vault
92
- VAULT_LIST: "vault:list",
93
- VAULT_ADD: "vault:add",
94
- VAULT_UPDATE: "vault:update",
95
- VAULT_REMOVE: "vault:remove",
96
- VAULT_AUDIT_LOG: "vault:audit-log",
97
- // Automation kits
98
- AUTOMATION_GET_INSTALLED: "automation:get-installed",
99
- AUTOMATION_INSTALL_FROM_FILE: "automation:install-from-file",
100
- AUTOMATION_UNINSTALL: "automation:uninstall",
101
- // Scheduled jobs
102
- SCHEDULE_GET_ALL: "schedule:get-all",
103
- SCHEDULE_CREATE: "schedule:create",
104
- SCHEDULE_UPDATE: "schedule:update",
105
- SCHEDULE_DELETE: "schedule:delete",
106
- SCHEDULE_JOBS_UPDATE: "schedule:jobs-update",
107
- // Window controls
108
- WINDOW_MINIMIZE: "window:minimize",
109
- WINDOW_MAXIMIZE: "window:maximize",
110
- WINDOW_CLOSE: "window:close",
111
- // Autofill
112
- AUTOFILL_LIST: "autofill:list",
113
- AUTOFILL_ADD: "autofill:add",
114
- AUTOFILL_UPDATE: "autofill:update",
115
- AUTOFILL_DELETE: "autofill:delete",
116
- AUTOFILL_FILL: "autofill:fill",
117
- // Page snapshots / What Changed
118
- PAGE_DIFF_ACTIVITY: "page:diff-activity",
119
- PAGE_CHANGED: "page:changed",
120
- PAGE_DIFF_GET: "page:diff-get",
121
- PAGE_DIFF_DIRTY: "page:diff-dirty"
122
- };
123
- exports.Channels = Channels;