Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ef3f28e
refactor: rename BotBrowserConsole to BotBrowserLauncher
mykola-zalizniak Jan 31, 2026
c1ea18c
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 1, 2026
3da0fcc
feat: add kernel management, proxy management, and setup scripts
mykola-zalizniak Feb 1, 2026
f088283
Merge remote-tracking branch 'refs/remotes/origin/main'
mykola-zalizniak Feb 1, 2026
36763df
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 6, 2026
b5afba0
fix: enable macOS native Edit menu for Cmd+C/V/X/A keyboard shortcuts
mykola-zalizniak Feb 6, 2026
743b86a
chore: upgrade Neutralino runtime to 6.4.0
mykola-zalizniak Feb 6, 2026
1f84af1
chore: remove Neutralino binaries from repo, download via neu update
mykola-zalizniak Feb 6, 2026
d6cdb4d
fix: improve macOS clipboard support with JS fallback for Cmd+V paste
mykola-zalizniak Feb 6, 2026
d937de1
fix: expand macOS clipboard fallback to Cmd+C/X, auto-download Neutra…
mykola-zalizniak Feb 6, 2026
a979a8d
chore: upgrade Neutralino to 6.5.0 and simplify setup scripts
mykola-zalizniak Feb 6, 2026
8554ca8
fix: fix PowerShell setup script ZIP download corruption
mykola-zalizniak Feb 6, 2026
66c0367
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 7, 2026
c577211
feat: enhance proxy workflow with IP check, quick change, and reusabl…
mykola-zalizniak Feb 7, 2026
781d6f9
Merge remote-tracking branch 'refs/remotes/origin/main'
mykola-zalizniak Feb 7, 2026
d95b21a
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 7, 2026
9cc1f00
fix: correct checkbox color override and setup script stdin handling
mykola-zalizniak Feb 7, 2026
e50e1c4
Merge remote-tracking branch 'refs/remotes/origin/main'
mykola-zalizniak Feb 7, 2026
5a95bee
feat: improve profile deletion with auto-stop, group WebRTC settings,…
mykola-zalizniak Feb 11, 2026
10c2f9f
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 11, 2026
c718a92
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 24, 2026
b46ea50
feat: add port protection toggle, fix kernel auto-update cleanup and …
mykola-zalizniak Feb 24, 2026
e1fc4aa
fix: detect kernel assets by file extension to support renamed Window…
mykola-zalizniak Feb 25, 2026
de7b2d5
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 25, 2026
6b13cf2
Merge branch 'botswin:main' into main
mykola-zalizniak Feb 28, 2026
eaf8fc7
fix: handle non-browser process exits, add crash detection, validate …
mykola-zalizniak Feb 28, 2026
76b3ac4
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 3, 2026
50e572d
docs: add --bot-time-seed documentation, changelog 2026-03-03, value …
MSTU0 Mar 4, 2026
42e21da
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 4, 2026
0d89219
feat: add proxy save/check, improve table layout and kernel date display
mykola-zalizniak Mar 4, 2026
dc0e4e8
feat: redesign profile editor with left nav, advanced config modes, a…
mykola-zalizniak Mar 4, 2026
f780ec7
Merge remote-tracking branch 'upstream/main'
mykola-zalizniak Mar 4, 2026
9ecfc86
Merge remote-tracking branch 'upstream/main'
mykola-zalizniak Mar 4, 2026
2bc2251
fix: replace Save IP with Save to proxy list, unify dropdown option l…
mykola-zalizniak Mar 4, 2026
a24a963
fix: include username and password in proxy duplicate detection
mykola-zalizniak Mar 5, 2026
2b07c86
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 8, 2026
1404673
fix: prevent editing running profiles and remove auto-save IP on prox…
mykola-zalizniak Mar 8, 2026
48bd48d
feat(launcher): add automatic self-update with GitHub commit tracking
mykola-zalizniak Mar 8, 2026
fce219a
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 9, 2026
efb7035
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 9, 2026
5cfcd11
feat(launcher): improve table UX, add new CLI flags, and proxy input …
mykola-zalizniak Mar 9, 2026
19f9414
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 11, 2026
0bc06ed
fix(launcher): auto-highlight new profiles/proxies and default noise …
mykola-zalizniak Mar 12, 2026
a960d3a
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 12, 2026
5c6c2c5
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 16, 2026
f15cc18
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 23, 2026
ad7f00e
feat(launcher): add new CLI flags, clear user data, and unsaved chang…
mykola-zalizniak Mar 23, 2026
5bbe3fe
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 26, 2026
6ab531d
feat(launcher): reorganize flag categories, add CLI preview, new 2026…
mykola-zalizniak Mar 26, 2026
fe35a9e
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 27, 2026
e6ea29e
fix(launcher): prevent kernel update corruption and improve extraction
mykola-zalizniak Mar 27, 2026
3b675c5
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 28, 2026
433e85e
Merge branch 'botswin:main' into main
mykola-zalizniak Mar 28, 2026
9126915
refactor(launcher): add ShellService, fix UI feedback patterns
mykola-zalizniak Mar 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 18 additions & 11 deletions launcher/src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import { BrowserProfileService } from './shared/browser-profile.service';
import { ConfirmDialogComponent } from './shared/confirm-dialog.component';
import { UpdateService } from './shared/update.service';
import { KernelService } from './shared/kernel.service';
import { ShellService } from './shared/shell.service';
import { StopPropagationDirective } from './shared/stop-propagation.directive';
import { compressFolder, decompressZip, formatDateTime, formatProxyDisplay } from './utils';
import { WarmupComponent } from './warmup.component';
Expand Down Expand Up @@ -65,6 +66,7 @@ export type NavItem = 'profiles' | 'proxies' | 'kernels';
})
export class AppComponent implements AfterViewInit {
readonly #browserProfileService = inject(BrowserProfileService);
readonly #shell = inject(ShellService);
readonly browserLauncherService = inject(BrowserLauncherService);
readonly kernelService = inject(KernelService);
readonly updateService = inject(UpdateService);
Expand Down Expand Up @@ -196,7 +198,7 @@ export class AppComponent implements AfterViewInit {
});

const browserProfilePath = await this.#browserProfileService.getBrowserProfilePath(browserProfile);
await compressFolder(browserProfilePath, entry);
await compressFolder(browserProfilePath, entry, this.#shell);
}

async warmupProfile(browserProfile: BrowserProfile): Promise<void> {
Expand All @@ -219,7 +221,7 @@ export class AppComponent implements AfterViewInit {
if (!entry?.[0]) return;

const browserProfilePath = await this.#browserProfileService.getBasePath();
await decompressZip(entry[0], browserProfilePath);
await decompressZip(entry[0], browserProfilePath, this.#shell);
await this.refreshProfiles();
}

Expand Down Expand Up @@ -419,16 +421,20 @@ export class AppComponent implements AfterViewInit {
.writeFile(filePath, csvContent)
.then(() => {
console.log(`CSV file saved successfully at ${filePath}`);
Neutralino.os.showMessageBox('Success', 'CSV file has been successfully exported!');
this.#snackBar.open('CSV file exported successfully', '', { duration: 3000 });
})
.catch((err) => {
console.error('Failed to save CSV file:', err);
Neutralino.os.showMessageBox('Error', 'Failed to export CSV file. Please check the logs!');
this.#dialog.open(AlertDialogComponent, {
data: { message: 'Failed to export CSV file. Please check the logs.' },
});
});
})
.catch((err) => {
console.error('Failed to show save dialog:', err);
Neutralino.os.showMessageBox('Error', 'Unable to display the save dialog. Please check the logs!');
this.#dialog.open(AlertDialogComponent, {
data: { message: 'Unable to display the save dialog. Please check the logs.' },
});
});
}

Expand All @@ -450,10 +456,9 @@ export class AppComponent implements AfterViewInit {

if (lines.length <= 1) {
console.warn('CSV file is empty or only contains headers.');
Neutralino.os.showMessageBox(
'Warning',
'The CSV file is empty or only contains headers. Please check the file content!'
);
this.#dialog.open(AlertDialogComponent, {
data: { message: 'The CSV file is empty or only contains headers. Please check the file content.' },
});
return;
}

Expand Down Expand Up @@ -506,10 +511,12 @@ export class AppComponent implements AfterViewInit {
resolvedProfiles.map((profile) => this.#browserProfileService.saveBrowserProfile(profile))
);
await this.refreshProfiles();
Neutralino.os.showMessageBox('Success', 'CSV file has been successfully imported!');
this.#snackBar.open('CSV file imported successfully', '', { duration: 3000 });
} catch (error) {
console.error('Failed to import profiles from CSV:', error);
Neutralino.os.showMessageBox('Error', 'Failed to import CSV file. Please check the logs!');
this.#dialog.open(AlertDialogComponent, {
data: { message: 'Failed to import CSV file. Please check the logs.' },
});
}
}

Expand Down
4 changes: 3 additions & 1 deletion launcher/src/app/shared/browser-launcher.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { extractMajorVersion } from '../data/bot-profile';
import { BrowserProfileStatus, getBrowserProfileStatusText, type BrowserProfile } from '../data/browser-profile';
import { SimpleCDP } from '../simple-cdp';
import { createDirectoryIfNotExists, sleep } from '../utils';
import { ShellService } from './shell.service';
import { AlertDialogComponent } from './alert-dialog.component';
import { BrowserProfileService } from './browser-profile.service';
import { KernelService } from './kernel.service';
Expand All @@ -25,6 +26,7 @@ export interface RunningInfo {
export class BrowserLauncherService {
readonly #browserProfileService = inject(BrowserProfileService);
readonly #kernelService = inject(KernelService);
readonly #shell = inject(ShellService);
readonly #runningStatuses = new Map<string, RunningInfo>();
readonly #dialog = inject(MatDialog);

Expand Down Expand Up @@ -456,7 +458,7 @@ export class BrowserLauncherService {

// If no known name found, try to find the first executable in Contents/MacOS
try {
const result = await Neutralino.os.execCommand(`ls "${appPath}/Contents/MacOS" 2>/dev/null | head -1`);
const result = await this.#shell.run(`ls "${appPath}/Contents/MacOS" 2>/dev/null | head -1`);
const mainExec = result.stdOut.trim();
if (mainExec) {
return await Neutralino.filesystem.getJoinedPath(appPath, 'Contents', 'MacOS', mainExec);
Expand Down
Loading