atlas-browser 0.2.0

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.
Files changed (56) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +16 -0
  4. package/CONTRIBUTING.md +63 -0
  5. package/LICENSE +21 -0
  6. package/PRIVACY.md +37 -0
  7. package/README.md +163 -0
  8. package/SECURITY.md +29 -0
  9. package/assets/logo.png +0 -0
  10. package/bin/cli.js +142 -0
  11. package/dist-electron/main/blocker.js +109 -0
  12. package/dist-electron/main/blocker.js.map +1 -0
  13. package/dist-electron/main/bookmark-manager.js +121 -0
  14. package/dist-electron/main/bookmark-manager.js.map +1 -0
  15. package/dist-electron/main/download-manager.js +118 -0
  16. package/dist-electron/main/download-manager.js.map +1 -0
  17. package/dist-electron/main/index.js +116 -0
  18. package/dist-electron/main/index.js.map +1 -0
  19. package/dist-electron/main/ipc-handlers.js +303 -0
  20. package/dist-electron/main/ipc-handlers.js.map +1 -0
  21. package/dist-electron/main/menu.js +229 -0
  22. package/dist-electron/main/menu.js.map +1 -0
  23. package/dist-electron/main/security-analyzer.js +71 -0
  24. package/dist-electron/main/security-analyzer.js.map +1 -0
  25. package/dist-electron/main/settings-manager.js +105 -0
  26. package/dist-electron/main/settings-manager.js.map +1 -0
  27. package/dist-electron/main/tab-manager.js +205 -0
  28. package/dist-electron/main/tab-manager.js.map +1 -0
  29. package/dist-electron/main/tor-manager.js +59 -0
  30. package/dist-electron/main/tor-manager.js.map +1 -0
  31. package/dist-electron/preload/preload.js +73 -0
  32. package/dist-electron/preload/preload.js.map +1 -0
  33. package/install.sh +120 -0
  34. package/package.json +67 -0
  35. package/src/main/blocker.ts +121 -0
  36. package/src/main/bookmark-manager.ts +99 -0
  37. package/src/main/download-manager.ts +103 -0
  38. package/src/main/index.ts +93 -0
  39. package/src/main/ipc-handlers.ts +283 -0
  40. package/src/main/menu.ts +192 -0
  41. package/src/main/security-analyzer.ts +97 -0
  42. package/src/main/settings-manager.ts +84 -0
  43. package/src/main/tab-manager.ts +249 -0
  44. package/src/main/tor-manager.ts +59 -0
  45. package/src/preload/preload.ts +85 -0
  46. package/src/renderer/bookmarks.html +84 -0
  47. package/src/renderer/browser-ui.js +427 -0
  48. package/src/renderer/downloads.html +94 -0
  49. package/src/renderer/history.html +111 -0
  50. package/src/renderer/index.html +152 -0
  51. package/src/renderer/internet-map.html +313 -0
  52. package/src/renderer/network-map.js +131 -0
  53. package/src/renderer/security-panel.js +13 -0
  54. package/src/renderer/settings.html +138 -0
  55. package/src/renderer/styles.css +688 -0
  56. package/tsconfig.json +18 -0
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SettingsManager = void 0;
37
+ const electron_1 = require("electron");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const DEFAULT_SETTINGS = {
41
+ homepage: 'http://128.140.66.108:3080',
42
+ searchEngine: 'Search Angel',
43
+ clearDataOnExit: true,
44
+ blockTrackers: true,
45
+ showBookmarksBar: true,
46
+ defaultZoom: 100,
47
+ torProxyUrl: 'socks5://128.140.66.108:9050',
48
+ autoConnectTor: false,
49
+ downloadPath: '',
50
+ askBeforeDownload: false,
51
+ referrerPolicy: 'no-referrer',
52
+ fingerprintProtection: true,
53
+ };
54
+ function getStorePath() {
55
+ try {
56
+ return path.join(electron_1.app.getPath('userData'), 'settings.json');
57
+ }
58
+ catch {
59
+ return path.join(process.env.HOME || '/tmp', '.atlas-browser-settings.json');
60
+ }
61
+ }
62
+ class SettingsManager {
63
+ cache = null;
64
+ read() {
65
+ if (this.cache)
66
+ return this.cache;
67
+ try {
68
+ const data = JSON.parse(fs.readFileSync(getStorePath(), 'utf8'));
69
+ this.cache = { ...DEFAULT_SETTINGS, ...data };
70
+ return this.cache;
71
+ }
72
+ catch {
73
+ this.cache = { ...DEFAULT_SETTINGS };
74
+ return this.cache;
75
+ }
76
+ }
77
+ write(data) {
78
+ this.cache = data;
79
+ try {
80
+ fs.writeFileSync(getStorePath(), JSON.stringify(data, null, 2));
81
+ }
82
+ catch { /* ignore write errors during early startup */ }
83
+ }
84
+ getAll() {
85
+ return { ...this.read() };
86
+ }
87
+ get(key) {
88
+ return this.read()[key];
89
+ }
90
+ set(key, value) {
91
+ const all = this.read();
92
+ all[key] = value;
93
+ this.write(all);
94
+ }
95
+ setMultiple(updates) {
96
+ const all = this.read();
97
+ Object.assign(all, updates);
98
+ this.write(all);
99
+ }
100
+ reset() {
101
+ this.write({ ...DEFAULT_SETTINGS });
102
+ }
103
+ }
104
+ exports.SettingsManager = SettingsManager;
105
+ //# sourceMappingURL=settings-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/main/settings-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAA+B;AAC/B,uCAAyB;AACzB,2CAA6B;AAiB7B,MAAM,gBAAgB,GAAoB;IACxC,QAAQ,EAAE,4BAA4B;IACtC,YAAY,EAAE,cAAc;IAC5B,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,WAAW,EAAE,GAAG;IAChB,WAAW,EAAE,8BAA8B;IAC3C,cAAc,EAAE,KAAK;IACrB,YAAY,EAAE,EAAE;IAChB,iBAAiB,EAAE,KAAK;IACxB,cAAc,EAAE,aAAa;IAC7B,qBAAqB,EAAE,IAAI;CAC5B,CAAC;AAEF,SAAS,YAAY;IACnB,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;IAAC,CAAC;IACnE,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAAC,CAAC;AACzF,CAAC;AAED,MAAa,eAAe;IAClB,KAAK,GAA2B,IAAI,CAAC;IAErC,IAAI;QACV,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAM,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAqB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC;YAAC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACxE,MAAM,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5B,CAAC;IAED,GAAG,CAAkC,GAAM;QACzC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAkC,GAAM,EAAE,KAAyB;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,WAAW,CAAC,OAAiC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;IACtC,CAAC;CACF;AA5CD,0CA4CC"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TabManager = void 0;
4
+ const electron_1 = require("electron");
5
+ const ipc_handlers_1 = require("./ipc-handlers");
6
+ const CHROME_HEIGHT = 82; // Tab bar + address bar height
7
+ class TabManager {
8
+ tabs = new Map();
9
+ activeTabId = 0;
10
+ nextId = 1;
11
+ window;
12
+ homeUrl;
13
+ blocker;
14
+ security;
15
+ constructor(window, homeUrl, blocker, security) {
16
+ this.window = window;
17
+ this.homeUrl = homeUrl;
18
+ this.blocker = blocker;
19
+ this.security = security;
20
+ }
21
+ createTab(url) {
22
+ const id = this.nextId++;
23
+ const targetUrl = url || this.homeUrl;
24
+ const view = new electron_1.BrowserView({
25
+ webPreferences: {
26
+ nodeIntegration: false,
27
+ contextIsolation: true,
28
+ sandbox: true,
29
+ },
30
+ });
31
+ const tab = {
32
+ id,
33
+ view,
34
+ title: 'New Tab',
35
+ url: targetUrl,
36
+ isLoading: true,
37
+ blockedCount: 0,
38
+ };
39
+ this.tabs.set(id, tab);
40
+ // Setup view event listeners
41
+ view.webContents.on('did-start-loading', () => {
42
+ tab.isLoading = true;
43
+ this.notifyTabUpdate(tab);
44
+ });
45
+ view.webContents.on('did-stop-loading', () => {
46
+ tab.isLoading = false;
47
+ this.notifyTabUpdate(tab);
48
+ });
49
+ view.webContents.on('page-title-updated', (_e, title) => {
50
+ tab.title = title;
51
+ this.notifyTabUpdate(tab);
52
+ });
53
+ view.webContents.on('did-navigate', (_e, url) => {
54
+ tab.url = url;
55
+ tab.blockedCount = 0;
56
+ this.notifyUrlChange(tab);
57
+ (0, ipc_handlers_1.addHistoryItem)(tab.title, url);
58
+ // Analyze security for new page
59
+ this.security.analyze(view.webContents, url).then(info => {
60
+ this.window.webContents.send('security-update', info);
61
+ });
62
+ });
63
+ view.webContents.on('did-navigate-in-page', (_e, url) => {
64
+ tab.url = url;
65
+ this.notifyUrlChange(tab);
66
+ });
67
+ // Track blocked requests for this tab
68
+ this.blocker.onBlocked(view.webContents.id, () => {
69
+ tab.blockedCount++;
70
+ this.window.webContents.send('blocked-count-update', {
71
+ tabId: id,
72
+ count: tab.blockedCount,
73
+ });
74
+ });
75
+ // Open links in new tab instead of new window
76
+ view.webContents.setWindowOpenHandler(({ url }) => {
77
+ this.createTab(url);
78
+ return { action: 'deny' };
79
+ });
80
+ // Load the URL
81
+ view.webContents.loadURL(targetUrl);
82
+ // Switch to this tab
83
+ this.switchTab(id);
84
+ // Notify renderer about new tab
85
+ this.window.webContents.send('tab-created', {
86
+ id,
87
+ title: tab.title,
88
+ url: tab.url,
89
+ });
90
+ return id;
91
+ }
92
+ switchTab(id) {
93
+ const tab = this.tabs.get(id);
94
+ if (!tab)
95
+ return;
96
+ // Remove current BrowserView
97
+ const currentViews = this.window.getBrowserViews();
98
+ for (const v of currentViews) {
99
+ this.window.removeBrowserView(v);
100
+ }
101
+ // Add new view
102
+ this.window.addBrowserView(tab.view);
103
+ this.activeTabId = id;
104
+ // Resize to fit
105
+ this.resizeActiveTab();
106
+ // Notify renderer
107
+ this.window.webContents.send('tab-activated', id);
108
+ this.notifyUrlChange(tab);
109
+ }
110
+ closeTab(id) {
111
+ const tab = this.tabs.get(id);
112
+ if (!tab)
113
+ return;
114
+ // Destroy the view
115
+ tab.view.webContents.close();
116
+ this.tabs.delete(id);
117
+ // If we closed the active tab, switch to another
118
+ if (id === this.activeTabId) {
119
+ const remaining = Array.from(this.tabs.keys());
120
+ if (remaining.length > 0) {
121
+ this.switchTab(remaining[remaining.length - 1]);
122
+ }
123
+ else {
124
+ // No tabs left, create a new one
125
+ this.createTab();
126
+ }
127
+ }
128
+ this.window.webContents.send('tab-closed', id);
129
+ }
130
+ navigateTo(url) {
131
+ const tab = this.tabs.get(this.activeTabId);
132
+ if (!tab)
133
+ return;
134
+ // If not a URL, search with Search Angel
135
+ if (!url.includes('://') && !url.includes('.')) {
136
+ url = `${this.homeUrl}/search?q=${encodeURIComponent(url)}&mode=standard`;
137
+ }
138
+ else if (!url.startsWith('http')) {
139
+ url = 'https://' + url;
140
+ }
141
+ tab.url = url;
142
+ tab.blockedCount = 0;
143
+ tab.view.webContents.loadURL(url);
144
+ }
145
+ goBack() {
146
+ const tab = this.tabs.get(this.activeTabId);
147
+ if (tab?.view.webContents.canGoBack()) {
148
+ tab.view.webContents.goBack();
149
+ }
150
+ }
151
+ goForward() {
152
+ const tab = this.tabs.get(this.activeTabId);
153
+ if (tab?.view.webContents.canGoForward()) {
154
+ tab.view.webContents.goForward();
155
+ }
156
+ }
157
+ reload() {
158
+ const tab = this.tabs.get(this.activeTabId);
159
+ tab?.view.webContents.reload();
160
+ }
161
+ goHome() {
162
+ this.navigateTo(this.homeUrl);
163
+ }
164
+ resizeActiveTab() {
165
+ const tab = this.tabs.get(this.activeTabId);
166
+ if (!tab)
167
+ return;
168
+ const bounds = this.window.getBounds();
169
+ tab.view.setBounds({
170
+ x: 0,
171
+ y: CHROME_HEIGHT,
172
+ width: bounds.width,
173
+ height: bounds.height - CHROME_HEIGHT,
174
+ });
175
+ }
176
+ getActiveTab() {
177
+ return this.tabs.get(this.activeTabId);
178
+ }
179
+ getAllTabs() {
180
+ return Array.from(this.tabs.values()).map(t => ({
181
+ id: t.id,
182
+ title: t.title,
183
+ url: t.url,
184
+ isActive: t.id === this.activeTabId,
185
+ }));
186
+ }
187
+ notifyTabUpdate(tab) {
188
+ this.window.webContents.send('tab-updated', {
189
+ id: tab.id,
190
+ title: tab.title,
191
+ url: tab.url,
192
+ isLoading: tab.isLoading,
193
+ });
194
+ }
195
+ notifyUrlChange(tab) {
196
+ this.window.webContents.send('url-changed', {
197
+ tabId: tab.id,
198
+ url: tab.url,
199
+ canGoBack: tab.view.webContents.canGoBack(),
200
+ canGoForward: tab.view.webContents.canGoForward(),
201
+ });
202
+ }
203
+ }
204
+ exports.TabManager = TabManager;
205
+ //# sourceMappingURL=tab-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-manager.js","sourceRoot":"","sources":["../../src/main/tab-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TorManager = void 0;
4
+ const electron_1 = require("electron");
5
+ class TorManager {
6
+ isEnabled = false;
7
+ // Our server's Tor SOCKS5 proxy
8
+ // The browser connects to our server which runs a Tor proxy container
9
+ proxyUrl = 'socks5://128.140.66.108:9050';
10
+ async enable() {
11
+ try {
12
+ await electron_1.session.defaultSession.setProxy({
13
+ proxyRules: this.proxyUrl,
14
+ proxyBypassRules: 'localhost,127.0.0.1',
15
+ });
16
+ this.isEnabled = true;
17
+ console.log('[TOR] Enabled - routing through', this.proxyUrl);
18
+ return true;
19
+ }
20
+ catch (err) {
21
+ console.error('[TOR] Failed to enable:', err);
22
+ return false;
23
+ }
24
+ }
25
+ async disable() {
26
+ await electron_1.session.defaultSession.setProxy({ proxyRules: '' });
27
+ this.isEnabled = false;
28
+ console.log('[TOR] Disabled - direct connection');
29
+ }
30
+ async toggle() {
31
+ if (this.isEnabled) {
32
+ await this.disable();
33
+ }
34
+ else {
35
+ await this.enable();
36
+ }
37
+ return this.isEnabled;
38
+ }
39
+ get enabled() {
40
+ return this.isEnabled;
41
+ }
42
+ async getCircuitInfo() {
43
+ if (!this.isEnabled) {
44
+ return { nodes: [], isActive: false };
45
+ }
46
+ return {
47
+ isActive: true,
48
+ nodes: [
49
+ 'Your Device (encrypted)',
50
+ 'Tor Guard Node',
51
+ 'Tor Relay Node',
52
+ 'Tor Exit Node',
53
+ 'Search Angel Server',
54
+ ],
55
+ };
56
+ }
57
+ }
58
+ exports.TorManager = TorManager;
59
+ //# sourceMappingURL=tor-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tor-manager.js","sourceRoot":"","sources":["../../src/main/tor-manager.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AAEnC,MAAa,UAAU;IACb,SAAS,GAAY,KAAK,CAAC;IAEnC,gCAAgC;IAChC,sEAAsE;IAC9D,QAAQ,GAAW,8BAA8B,CAAC;IAE1D,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,kBAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;gBACpC,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,gBAAgB,EAAE,qBAAqB;aACxC,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,kBAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE;gBACL,yBAAyB;gBACzB,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,qBAAqB;aACtB;SACF,CAAC;IACJ,CAAC;CACF;AAxDD,gCAwDC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const electron_1 = require("electron");
4
+ electron_1.contextBridge.exposeInMainWorld('browserAPI', {
5
+ // ── Tab management ────────────────────────────────────────
6
+ newTab: (url) => electron_1.ipcRenderer.send('new-tab', url),
7
+ closeTab: (tabId) => electron_1.ipcRenderer.send('close-tab', tabId),
8
+ switchTab: (tabId) => electron_1.ipcRenderer.send('switch-tab', tabId),
9
+ getTabs: () => electron_1.ipcRenderer.invoke('get-tabs'),
10
+ // ── Navigation ────────────────────────────────────────────
11
+ navigate: (url) => electron_1.ipcRenderer.send('navigate', url),
12
+ goBack: () => electron_1.ipcRenderer.send('go-back'),
13
+ goForward: () => electron_1.ipcRenderer.send('go-forward'),
14
+ reload: () => electron_1.ipcRenderer.send('reload'),
15
+ goHome: () => electron_1.ipcRenderer.send('go-home'),
16
+ openPage: (page) => electron_1.ipcRenderer.send('open-page', page),
17
+ // ── Blocker ───────────────────────────────────────────────
18
+ toggleBlocker: () => electron_1.ipcRenderer.invoke('toggle-blocker'),
19
+ getBlockerStats: () => electron_1.ipcRenderer.invoke('get-blocker-stats'),
20
+ // ── Tor ───────────────────────────────────────────────────
21
+ toggleTor: () => electron_1.ipcRenderer.invoke('toggle-tor'),
22
+ getTorStatus: () => electron_1.ipcRenderer.invoke('get-tor-status'),
23
+ getTorCircuit: () => electron_1.ipcRenderer.invoke('get-tor-circuit'),
24
+ // ── Sidebar ───────────────────────────────────────────────
25
+ toggleSidebar: () => electron_1.ipcRenderer.send('toggle-sidebar'),
26
+ getSecurityInfo: () => electron_1.ipcRenderer.invoke('get-security-info'),
27
+ // ── Bookmarks ─────────────────────────────────────────────
28
+ getBookmarks: () => electron_1.ipcRenderer.invoke('get-bookmarks'),
29
+ getBarBookmarks: () => electron_1.ipcRenderer.invoke('get-bar-bookmarks'),
30
+ addBookmark: (title, url, favicon) => electron_1.ipcRenderer.invoke('add-bookmark', title, url, favicon),
31
+ removeBookmark: (id) => electron_1.ipcRenderer.invoke('remove-bookmark', id),
32
+ isBookmarked: (url) => electron_1.ipcRenderer.invoke('is-bookmarked', url),
33
+ toggleBookmark: (title, url) => electron_1.ipcRenderer.invoke('toggle-bookmark', title, url),
34
+ // ── Downloads ─────────────────────────────────────────────
35
+ getDownloads: () => electron_1.ipcRenderer.invoke('get-downloads'),
36
+ clearDownloads: () => electron_1.ipcRenderer.invoke('clear-downloads'),
37
+ openDownload: (path) => electron_1.ipcRenderer.send('open-download', path),
38
+ showDownload: (path) => electron_1.ipcRenderer.send('show-download', path),
39
+ // ── Settings ──────────────────────────────────────────────
40
+ getSettings: () => electron_1.ipcRenderer.invoke('get-settings'),
41
+ setSetting: (key, value) => electron_1.ipcRenderer.invoke('set-setting', key, value),
42
+ resetSettings: () => electron_1.ipcRenderer.invoke('reset-settings'),
43
+ // ── Zoom ──────────────────────────────────────────────────
44
+ zoomIn: () => electron_1.ipcRenderer.invoke('zoom-in'),
45
+ zoomOut: () => electron_1.ipcRenderer.invoke('zoom-out'),
46
+ zoomReset: () => electron_1.ipcRenderer.invoke('zoom-reset'),
47
+ getZoom: () => electron_1.ipcRenderer.invoke('get-zoom'),
48
+ // ── History ────────────────────────────────────────────────
49
+ getHistory: () => electron_1.ipcRenderer.invoke('get-history'),
50
+ clearHistory: () => electron_1.ipcRenderer.invoke('clear-history'),
51
+ deleteHistoryItem: (id) => electron_1.ipcRenderer.invoke('delete-history-item', id),
52
+ // ── Phantom Mode ──────────────────────────────────────────
53
+ phantomStart: () => electron_1.ipcRenderer.invoke('phantom-start'),
54
+ phantomEnd: (sessionId) => electron_1.ipcRenderer.invoke('phantom-end', sessionId),
55
+ phantomStatus: (sessionId) => electron_1.ipcRenderer.invoke('phantom-status', sessionId),
56
+ // ── DNS / Internet Map ────────────────────────────────────
57
+ dnsLookup: (domain) => electron_1.ipcRenderer.invoke('dns-lookup', domain),
58
+ // ── Events ────────────────────────────────────────────────
59
+ onTabCreated: (cb) => electron_1.ipcRenderer.on('tab-created', (_e, d) => cb(d)),
60
+ onTabUpdated: (cb) => electron_1.ipcRenderer.on('tab-updated', (_e, d) => cb(d)),
61
+ onTabActivated: (cb) => electron_1.ipcRenderer.on('tab-activated', (_e, id) => cb(id)),
62
+ onTabClosed: (cb) => electron_1.ipcRenderer.on('tab-closed', (_e, id) => cb(id)),
63
+ onUrlChanged: (cb) => electron_1.ipcRenderer.on('url-changed', (_e, d) => cb(d)),
64
+ onBlockedCountUpdate: (cb) => electron_1.ipcRenderer.on('blocked-count-update', (_e, d) => cb(d)),
65
+ onSecurityUpdate: (cb) => electron_1.ipcRenderer.on('security-update', (_e, d) => cb(d)),
66
+ onFocusAddressBar: (cb) => electron_1.ipcRenderer.on('focus-address-bar', () => cb()),
67
+ onSidebarToggled: (cb) => electron_1.ipcRenderer.on('sidebar-toggled', (_e, v) => cb(v)),
68
+ onTorStatusChanged: (cb) => electron_1.ipcRenderer.on('tor-status-changed', (_e, v) => cb(v)),
69
+ onDownloadStarted: (cb) => electron_1.ipcRenderer.on('download-started', (_e, d) => cb(d)),
70
+ onDownloadProgress: (cb) => electron_1.ipcRenderer.on('download-progress', (_e, d) => cb(d)),
71
+ onDownloadDone: (cb) => electron_1.ipcRenderer.on('download-done', (_e, d) => cb(d)),
72
+ });
73
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/preload/preload.ts"],"names":[],"mappings":"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"}
package/install.sh ADDED
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env bash
2
+ # ═══════════════════════════════════════════════════════════════
3
+ # Atlas Browser - One-Line Installer for macOS
4
+ #
5
+ # Usage:
6
+ # curl -sL https://raw.githubusercontent.com/intergalacticuser/atlas-browser/main/install.sh | bash
7
+ #
8
+ # Or with wget:
9
+ # wget -qO- https://raw.githubusercontent.com/intergalacticuser/atlas-browser/main/install.sh | bash
10
+ # ═══════════════════════════════════════════════════════════════
11
+ set -euo pipefail
12
+
13
+ REPO="intergalacticuser/atlas-browser"
14
+ APP_NAME="Atlas Browser"
15
+ DMG_NAME="Atlas-Browser.dmg"
16
+ INSTALL_DIR="/Applications"
17
+
18
+ # Colors
19
+ CYAN='\033[0;36m'
20
+ GREEN='\033[0;32m'
21
+ RED='\033[0;31m'
22
+ DIM='\033[2m'
23
+ BOLD='\033[1m'
24
+ NC='\033[0m'
25
+
26
+ echo ""
27
+ echo -e "${CYAN}${BOLD} ╔══════════════════════════════════════╗${NC}"
28
+ echo -e "${CYAN}${BOLD} ║ Atlas Browser Installer ║${NC}"
29
+ echo -e "${CYAN}${BOLD} ║ Privacy-First Web Browser ║${NC}"
30
+ echo -e "${CYAN}${BOLD} ╚══════════════════════════════════════╝${NC}"
31
+ echo ""
32
+
33
+ # Check macOS
34
+ if [[ "$(uname)" != "Darwin" ]]; then
35
+ echo -e "${RED}Error: Atlas Browser is currently macOS only.${NC}"
36
+ echo "Windows and Linux support coming soon."
37
+ exit 1
38
+ fi
39
+
40
+ # Check architecture
41
+ ARCH=$(uname -m)
42
+ if [[ "$ARCH" != "arm64" ]]; then
43
+ echo -e "${RED}Error: This release is for Apple Silicon (M1/M2/M3) only.${NC}"
44
+ echo "Intel Mac support coming soon."
45
+ exit 1
46
+ fi
47
+
48
+ # Get latest release URL
49
+ echo -e "${DIM}> Fetching latest release...${NC}"
50
+ DOWNLOAD_URL=$(curl -sL "https://api.github.com/repos/$REPO/releases/latest" | grep "browser_download_url.*\.dmg" | head -1 | cut -d '"' -f 4)
51
+
52
+ if [[ -z "$DOWNLOAD_URL" ]]; then
53
+ echo -e "${RED}Error: Could not find download URL.${NC}"
54
+ echo "Visit https://github.com/$REPO/releases manually."
55
+ exit 1
56
+ fi
57
+
58
+ # Download
59
+ TEMP_DIR=$(mktemp -d)
60
+ DMG_PATH="$TEMP_DIR/$DMG_NAME"
61
+ echo -e "${DIM}> Downloading Atlas Browser...${NC}"
62
+ curl -sL "$DOWNLOAD_URL" -o "$DMG_PATH"
63
+ echo -e "${GREEN} Downloaded $(du -h "$DMG_PATH" | cut -f1)${NC}"
64
+
65
+ # Mount DMG
66
+ echo -e "${DIM}> Mounting disk image...${NC}"
67
+ MOUNT_POINT=$(hdiutil attach "$DMG_PATH" -nobrowse -quiet | grep "/Volumes" | cut -f3)
68
+
69
+ if [[ -z "$MOUNT_POINT" ]]; then
70
+ echo -e "${RED}Error: Failed to mount DMG.${NC}"
71
+ exit 1
72
+ fi
73
+
74
+ # Install
75
+ echo -e "${DIM}> Installing to $INSTALL_DIR...${NC}"
76
+ APP_PATH="$MOUNT_POINT/$APP_NAME.app"
77
+
78
+ if [[ ! -d "$APP_PATH" ]]; then
79
+ # Try alternative name
80
+ APP_PATH=$(find "$MOUNT_POINT" -maxdepth 1 -name "*.app" | head -1)
81
+ fi
82
+
83
+ if [[ -z "$APP_PATH" || ! -d "$APP_PATH" ]]; then
84
+ echo -e "${RED}Error: App not found in DMG.${NC}"
85
+ hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null
86
+ exit 1
87
+ fi
88
+
89
+ # Remove old version if exists
90
+ if [[ -d "$INSTALL_DIR/$APP_NAME.app" ]]; then
91
+ echo -e "${DIM}> Removing previous version...${NC}"
92
+ rm -rf "$INSTALL_DIR/$APP_NAME.app"
93
+ fi
94
+
95
+ cp -R "$APP_PATH" "$INSTALL_DIR/"
96
+
97
+ # Cleanup
98
+ hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null
99
+ rm -rf "$TEMP_DIR"
100
+
101
+ # Remove quarantine (unsigned app)
102
+ xattr -rd com.apple.quarantine "$INSTALL_DIR/$APP_NAME.app" 2>/dev/null || true
103
+
104
+ echo ""
105
+ echo -e "${GREEN}${BOLD} ✓ Atlas Browser installed successfully!${NC}"
106
+ echo ""
107
+ echo -e " ${DIM}Location:${NC} $INSTALL_DIR/$APP_NAME.app"
108
+ echo -e " ${DIM}Launch:${NC} open -a '$APP_NAME'"
109
+ echo ""
110
+ echo -e "${CYAN} Privacy: Zero tracking. Zero cookies. Zero profiling.${NC}"
111
+ echo -e "${DIM} Search: https://sa.atlasiant.com${NC}"
112
+ echo ""
113
+
114
+ # Offer to launch
115
+ read -p " Launch Atlas Browser now? [Y/n] " -n 1 -r
116
+ echo ""
117
+ if [[ $REPLY =~ ^[Yy]?$ ]]; then
118
+ open -a "$APP_NAME"
119
+ echo -e " ${GREEN}Launching...${NC}"
120
+ fi
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "atlas-browser",
3
+ "version": "0.2.0",
4
+ "description": "Privacy-first web browser for macOS with built-in Search Angel engine, Tor integration, tracker blocking, and Internet Map visualization",
5
+ "main": "dist-electron/main/index.js",
6
+ "bin": {
7
+ "atlas-browser": "./bin/cli.js"
8
+ },
9
+ "scripts": {
10
+ "dev": "electron .",
11
+ "build:ts": "tsc",
12
+ "start": "npm run build:ts && electron .",
13
+ "build": "npm run build:ts && electron-builder --mac",
14
+ "clean": "rm -rf dist dist-electron"
15
+ },
16
+ "keywords": [
17
+ "browser",
18
+ "privacy",
19
+ "electron",
20
+ "tor",
21
+ "search-engine",
22
+ "tracker-blocker",
23
+ "macos",
24
+ "open-source",
25
+ "duckduckgo",
26
+ "anonymous",
27
+ "secure",
28
+ "no-tracking"
29
+ ],
30
+ "author": "Daniel V. <intergalacticuser@users.noreply.github.com>",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/intergalacticuser/atlas-browser.git"
35
+ },
36
+ "homepage": "https://github.com/intergalacticuser/atlas-browser",
37
+ "bugs": {
38
+ "url": "https://github.com/intergalacticuser/atlas-browser/issues"
39
+ },
40
+ "engines": {
41
+ "node": ">=20"
42
+ },
43
+ "os": ["darwin"],
44
+ "devDependencies": {
45
+ "electron": "^33.0.0",
46
+ "electron-builder": "^25.1.0",
47
+ "typescript": "^5.7.0"
48
+ },
49
+ "dependencies": {},
50
+ "build": {
51
+ "appId": "com.atlasiant.browser",
52
+ "productName": "Atlas Browser",
53
+ "mac": {
54
+ "category": "public.app-category.productivity",
55
+ "icon": "assets/logo.png",
56
+ "target": ["dmg", "zip"]
57
+ },
58
+ "files": [
59
+ "dist-electron/**/*",
60
+ "src/renderer/**/*",
61
+ "assets/**/*"
62
+ ],
63
+ "directories": {
64
+ "output": "dist"
65
+ }
66
+ }
67
+ }