@quanta-intellect/vessel-browser 0.1.73 → 0.1.76

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.
@@ -61,6 +61,8 @@ const Channels = {
61
61
  BOOKMARK_REMOVE: "bookmarks:remove",
62
62
  BOOKMARKS_EXPORT_HTML: "bookmarks:export-html",
63
63
  BOOKMARKS_EXPORT_JSON: "bookmarks:export-json",
64
+ BOOKMARKS_IMPORT_HTML: "bookmarks:import-html",
65
+ BOOKMARKS_IMPORT_JSON: "bookmarks:import-json",
64
66
  BOOKMARK_ADD_CONTEXT_TO_CHAT: "bookmarks:add-context-to-chat",
65
67
  FOLDER_CREATE: "bookmarks:folder-create",
66
68
  FOLDER_REMOVE: "bookmarks:folder-remove",
@@ -84,6 +86,11 @@ const Channels = {
84
86
  TAB_ZOOM_IN: "tab:zoom-in",
85
87
  TAB_ZOOM_OUT: "tab:zoom-out",
86
88
  TAB_ZOOM_RESET: "tab:zoom-reset",
89
+ // Security indicator
90
+ SECURITY_STATE_UPDATE: "security:state-update",
91
+ SECURITY_SHOW_DETAILS: "security:show-details",
92
+ SECURITY_PROCEED_ANYWAY: "security:proceed-anyway",
93
+ SECURITY_GO_BACK_TO_SAFETY: "security:go-back-to-safety",
87
94
  // Closed tabs / duplication
88
95
  TAB_REOPEN_CLOSED: "tab:reopen-closed",
89
96
  TAB_DUPLICATE: "tab:duplicate",
@@ -118,6 +125,9 @@ const Channels = {
118
125
  HISTORY_SEARCH: "history:search",
119
126
  HISTORY_CLEAR: "history:clear",
120
127
  HISTORY_UPDATE: "history:update",
128
+ HISTORY_EXPORT_HTML: "history:export-html",
129
+ HISTORY_EXPORT_JSON: "history:export-json",
130
+ HISTORY_IMPORT: "history:import",
121
131
  // Downloads
122
132
  DOWNLOAD_STARTED: "download:started",
123
133
  DOWNLOAD_PROGRESS: "download:progress",
@@ -142,6 +152,13 @@ const Channels = {
142
152
  VAULT_UPDATE: "vault:update",
143
153
  VAULT_REMOVE: "vault:remove",
144
154
  VAULT_AUDIT_LOG: "vault:audit-log",
155
+ // Human Password Manager
156
+ HUMAN_VAULT_LIST: "human-vault:list",
157
+ HUMAN_VAULT_GET: "human-vault:get",
158
+ HUMAN_VAULT_SAVE: "human-vault:save",
159
+ HUMAN_VAULT_UPDATE: "human-vault:update",
160
+ HUMAN_VAULT_REMOVE: "human-vault:remove",
161
+ HUMAN_VAULT_AUDIT_LOG: "human-vault:audit-log",
145
162
  // Automation kits
146
163
  AUTOMATION_GET_INSTALLED: "automation:get-installed",
147
164
  AUTOMATION_INSTALL_FROM_FILE: "automation:install-from-file",
@@ -164,7 +181,12 @@ const Channels = {
164
181
  AUTOFILL_FILL: "autofill:fill",
165
182
  PAGE_CHANGED: "page:changed",
166
183
  PAGE_DIFF_GET: "page:diff-get",
167
- PAGE_DIFF_HISTORY: "page:diff-history"
184
+ PAGE_DIFF_HISTORY: "page:diff-history",
185
+ // Clear browsing data
186
+ CLEAR_BROWSING_DATA: "browsing-data:clear",
187
+ CLEAR_BROWSING_DATA_OPEN: "browsing-data:open",
188
+ // Picture-in-Picture
189
+ TAB_TOGGLE_PIP: "tab:toggle-pip"
168
190
  };
169
191
  const api = {
170
192
  tabs: {
@@ -337,6 +359,8 @@ const api = {
337
359
  removeBookmark: (id) => electron.ipcRenderer.invoke(Channels.BOOKMARK_REMOVE, id),
338
360
  exportHtml: (options) => electron.ipcRenderer.invoke(Channels.BOOKMARKS_EXPORT_HTML, options),
339
361
  exportJson: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_EXPORT_JSON),
362
+ importHtml: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_IMPORT_HTML),
363
+ importJson: () => electron.ipcRenderer.invoke(Channels.BOOKMARKS_IMPORT_JSON),
340
364
  createFolder: (name) => electron.ipcRenderer.invoke(Channels.FOLDER_CREATE, name),
341
365
  createFolderWithSummary: (name, summary) => electron.ipcRenderer.invoke(Channels.FOLDER_CREATE, name, summary),
342
366
  removeFolder: (id, deleteContents) => electron.ipcRenderer.invoke(Channels.FOLDER_REMOVE, id, deleteContents),
@@ -378,6 +402,9 @@ const api = {
378
402
  get: () => electron.ipcRenderer.invoke(Channels.HISTORY_GET),
379
403
  search: (query) => electron.ipcRenderer.invoke(Channels.HISTORY_SEARCH, query),
380
404
  clear: () => electron.ipcRenderer.invoke(Channels.HISTORY_CLEAR),
405
+ exportHtml: () => electron.ipcRenderer.invoke(Channels.HISTORY_EXPORT_HTML),
406
+ exportJson: () => electron.ipcRenderer.invoke(Channels.HISTORY_EXPORT_JSON),
407
+ importFile: () => electron.ipcRenderer.invoke(Channels.HISTORY_IMPORT),
381
408
  onUpdate: (cb) => {
382
409
  const handler = (_, state) => cb(state);
383
410
  electron.ipcRenderer.on(Channels.HISTORY_UPDATE, handler);
@@ -416,6 +443,14 @@ const api = {
416
443
  remove: (id) => electron.ipcRenderer.invoke(Channels.VAULT_REMOVE, id),
417
444
  auditLog: (limit) => electron.ipcRenderer.invoke(Channels.VAULT_AUDIT_LOG, limit)
418
445
  },
446
+ humanVault: {
447
+ list: (domain) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_LIST, domain),
448
+ get: (id) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_GET, id),
449
+ save: (entry) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_SAVE, entry),
450
+ update: (id, updates) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_UPDATE, id, updates),
451
+ remove: (id) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_REMOVE, id),
452
+ auditLog: (limit) => electron.ipcRenderer.invoke(Channels.HUMAN_VAULT_AUDIT_LOG, limit)
453
+ },
419
454
  automation: {
420
455
  getInstalled: () => electron.ipcRenderer.invoke(Channels.AUTOMATION_GET_INSTALLED),
421
456
  installFromFile: () => electron.ipcRenderer.invoke(Channels.AUTOMATION_INSTALL_FROM_FILE),
@@ -469,6 +504,27 @@ const api = {
469
504
  },
470
505
  get: () => electron.ipcRenderer.invoke(Channels.PAGE_DIFF_GET),
471
506
  getHistory: () => electron.ipcRenderer.invoke(Channels.PAGE_DIFF_HISTORY)
507
+ },
508
+ security: {
509
+ onStateUpdate: (cb) => {
510
+ const handler = (_, data) => cb(data.tabId, data.state);
511
+ electron.ipcRenderer.on(Channels.SECURITY_STATE_UPDATE, handler);
512
+ return () => electron.ipcRenderer.removeListener(Channels.SECURITY_STATE_UPDATE, handler);
513
+ },
514
+ showDetails: (state) => electron.ipcRenderer.invoke(Channels.SECURITY_SHOW_DETAILS, state),
515
+ proceedAnyway: (tabId) => electron.ipcRenderer.invoke(Channels.SECURITY_PROCEED_ANYWAY, tabId),
516
+ goBackToSafety: (tabId) => electron.ipcRenderer.invoke(Channels.SECURITY_GO_BACK_TO_SAFETY, tabId)
517
+ },
518
+ browsingData: {
519
+ clear: (options) => electron.ipcRenderer.invoke(Channels.CLEAR_BROWSING_DATA, options),
520
+ onOpenDialog: (cb) => {
521
+ const handler = () => cb();
522
+ electron.ipcRenderer.on(Channels.CLEAR_BROWSING_DATA_OPEN, handler);
523
+ return () => electron.ipcRenderer.removeListener(Channels.CLEAR_BROWSING_DATA_OPEN, handler);
524
+ }
525
+ },
526
+ pip: {
527
+ toggle: () => electron.ipcRenderer.invoke(Channels.TAB_TOGGLE_PIP)
472
528
  }
473
529
  };
474
530
  electron.contextBridge.exposeInMainWorld("vessel", api);
@@ -1654,6 +1654,283 @@
1654
1654
  background: var(--status-warning-bg);
1655
1655
  color: var(--status-warning);
1656
1656
  }
1657
+
1658
+ /* ═══════════════════════════════════════
1659
+ Security indicator
1660
+ ═══════════════════════════════════════ */
1661
+
1662
+ .security-indicator-wrapper {
1663
+ position: relative;
1664
+ display: flex;
1665
+ align-items: center;
1666
+ }
1667
+
1668
+ .security-indicator {
1669
+ display: flex;
1670
+ align-items: center;
1671
+ justify-content: center;
1672
+ width: 24px;
1673
+ height: 24px;
1674
+ border: none;
1675
+ background: transparent;
1676
+ color: #9ca3af;
1677
+ cursor: pointer;
1678
+ border-radius: 4px;
1679
+ transition: background 0.15s;
1680
+ }
1681
+
1682
+ .security-indicator:hover {
1683
+ background: rgba(255, 255, 255, 0.08);
1684
+ }
1685
+
1686
+ .security-indicator.secure {
1687
+ color: #4ade80;
1688
+ }
1689
+
1690
+ .security-indicator.insecure {
1691
+ color: #9ca3af;
1692
+ }
1693
+
1694
+ .security-indicator.error {
1695
+ color: #f87171;
1696
+ }
1697
+
1698
+ .security-popup {
1699
+ position: absolute;
1700
+ top: calc(100% + 6px);
1701
+ left: 0;
1702
+ background: #1e1e24;
1703
+ border: 1px solid rgba(255, 255, 255, 0.08);
1704
+ border-radius: 8px;
1705
+ padding: 12px 16px;
1706
+ min-width: 220px;
1707
+ z-index: 100;
1708
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1709
+ }
1710
+
1711
+ .security-popup-content {
1712
+ display: flex;
1713
+ flex-direction: column;
1714
+ gap: 8px;
1715
+ }
1716
+
1717
+ .security-popup-text {
1718
+ font-size: 12px;
1719
+ color: #e0e0e0;
1720
+ line-height: 1.5;
1721
+ margin: 0;
1722
+ }
1723
+
1724
+ .security-popup-link {
1725
+ font-size: 12px;
1726
+ color: #60a5fa;
1727
+ background: none;
1728
+ border: none;
1729
+ cursor: pointer;
1730
+ padding: 0;
1731
+ text-align: left;
1732
+ text-decoration: underline;
1733
+ }
1734
+
1735
+ .security-popup-link:hover {
1736
+ color: #93c5fd;
1737
+ }
1738
+
1739
+ .security-popup-actions {
1740
+ display: flex;
1741
+ gap: 8px;
1742
+ margin-top: 4px;
1743
+ }
1744
+
1745
+ .security-popup-action-proceed {
1746
+ font-size: 11px;
1747
+ color: #fbbf24;
1748
+ background: rgba(251, 191, 36, 0.1);
1749
+ border: 1px solid rgba(251, 191, 36, 0.3);
1750
+ border-radius: 4px;
1751
+ cursor: pointer;
1752
+ padding: 4px 8px;
1753
+ }
1754
+
1755
+ .security-popup-action-proceed:hover {
1756
+ background: rgba(251, 191, 36, 0.2);
1757
+ }
1758
+
1759
+ .security-popup-action-back {
1760
+ font-size: 11px;
1761
+ color: #9ca3af;
1762
+ background: rgba(156, 163, 175, 0.1);
1763
+ border: 1px solid rgba(156, 163, 175, 0.2);
1764
+ border-radius: 4px;
1765
+ cursor: pointer;
1766
+ padding: 4px 8px;
1767
+ }
1768
+
1769
+ .security-popup-action-back:hover {
1770
+ background: rgba(156, 163, 175, 0.2);
1771
+ }
1772
+
1773
+ .clear-data-overlay {
1774
+ position: fixed;
1775
+ inset: 0;
1776
+ background: rgba(0, 0, 0, 0.5);
1777
+ display: flex;
1778
+ align-items: center;
1779
+ justify-content: center;
1780
+ z-index: 200;
1781
+ }
1782
+
1783
+ .clear-data-dialog {
1784
+ background: var(--bg-secondary);
1785
+ border: 1px solid var(--border-visible);
1786
+ border-radius: var(--radius-lg);
1787
+ padding: 24px;
1788
+ min-width: 380px;
1789
+ max-width: 440px;
1790
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
1791
+ }
1792
+
1793
+ .clear-data-header {
1794
+ display: flex;
1795
+ align-items: center;
1796
+ justify-content: space-between;
1797
+ margin-bottom: 20px;
1798
+ }
1799
+
1800
+ .clear-data-header h3 {
1801
+ margin: 0;
1802
+ font-size: 15px;
1803
+ font-weight: 600;
1804
+ color: var(--text-primary);
1805
+ }
1806
+
1807
+ .clear-data-close {
1808
+ background: none;
1809
+ border: none;
1810
+ color: var(--text-muted);
1811
+ cursor: pointer;
1812
+ padding: 4px;
1813
+ border-radius: var(--radius-sm);
1814
+ display: flex;
1815
+ align-items: center;
1816
+ justify-content: center;
1817
+ }
1818
+
1819
+ .clear-data-close:hover {
1820
+ color: var(--text-primary);
1821
+ background: var(--surface-hover);
1822
+ }
1823
+
1824
+ .clear-data-range {
1825
+ margin-bottom: 16px;
1826
+ }
1827
+
1828
+ .clear-data-range label {
1829
+ display: block;
1830
+ font-size: 12px;
1831
+ color: var(--text-secondary);
1832
+ margin-bottom: 6px;
1833
+ }
1834
+
1835
+ .clear-data-select {
1836
+ width: 100%;
1837
+ padding: 6px 10px;
1838
+ font-size: 13px;
1839
+ background: var(--bg-tertiary);
1840
+ color: var(--text-primary);
1841
+ border: 1px solid var(--border-visible);
1842
+ border-radius: var(--radius-sm);
1843
+ outline: none;
1844
+ cursor: pointer;
1845
+ appearance: auto;
1846
+ }
1847
+
1848
+ .clear-data-select:focus {
1849
+ border-color: var(--accent-primary);
1850
+ }
1851
+
1852
+ .clear-data-checks {
1853
+ display: flex;
1854
+ flex-direction: column;
1855
+ gap: 10px;
1856
+ margin-bottom: 20px;
1857
+ padding: 12px;
1858
+ background: var(--bg-tertiary);
1859
+ border-radius: var(--radius-md);
1860
+ }
1861
+
1862
+ .clear-data-check {
1863
+ display: flex;
1864
+ align-items: center;
1865
+ gap: 10px;
1866
+ font-size: 13px;
1867
+ color: var(--text-primary);
1868
+ cursor: pointer;
1869
+ }
1870
+
1871
+ .clear-data-check input[type="checkbox"] {
1872
+ accent-color: var(--accent-primary);
1873
+ width: 16px;
1874
+ height: 16px;
1875
+ cursor: pointer;
1876
+ }
1877
+
1878
+ .clear-data-actions {
1879
+ display: flex;
1880
+ justify-content: flex-end;
1881
+ gap: 10px;
1882
+ }
1883
+
1884
+ .clear-data-error {
1885
+ margin: -4px 0 14px;
1886
+ font-size: 12px;
1887
+ color: var(--error);
1888
+ }
1889
+
1890
+ .clear-data-cancel {
1891
+ padding: 7px 16px;
1892
+ font-size: 13px;
1893
+ background: var(--bg-tertiary);
1894
+ color: var(--text-secondary);
1895
+ border: 1px solid var(--border-visible);
1896
+ border-radius: var(--radius-sm);
1897
+ cursor: pointer;
1898
+ }
1899
+
1900
+ .clear-data-cancel:hover {
1901
+ background: var(--bg-elevated);
1902
+ color: var(--text-primary);
1903
+ }
1904
+
1905
+ .clear-data-confirm {
1906
+ padding: 7px 16px;
1907
+ font-size: 13px;
1908
+ background: var(--error);
1909
+ color: #fff;
1910
+ border: none;
1911
+ border-radius: var(--radius-sm);
1912
+ cursor: pointer;
1913
+ font-weight: 500;
1914
+ }
1915
+
1916
+ .clear-data-confirm:hover:not(:disabled) {
1917
+ opacity: 0.9;
1918
+ }
1919
+
1920
+ .clear-data-confirm:disabled {
1921
+ opacity: 0.4;
1922
+ cursor: not-allowed;
1923
+ }
1924
+
1925
+ .clear-data-done {
1926
+ display: flex;
1927
+ align-items: center;
1928
+ justify-content: center;
1929
+ gap: 10px;
1930
+ padding: 20px;
1931
+ font-size: 14px;
1932
+ color: var(--accent-secondary);
1933
+ }
1657
1934
  /* ═══════════════════════════════════════
1658
1935
  Command bar overlay — cinematic entrance
1659
1936
  ═══════════════════════════════════════ */
@@ -4688,6 +4965,13 @@
4688
4965
  border-bottom: 1px solid var(--border-subtle);
4689
4966
  }
4690
4967
 
4968
+ .history-panel-actions {
4969
+ display: flex;
4970
+ gap: 6px;
4971
+ flex-wrap: wrap;
4972
+ justify-content: flex-end;
4973
+ }
4974
+
4691
4975
  .history-panel-title {
4692
4976
  font-size: 12px;
4693
4977
  font-weight: 600;