8 Commits
Author SHA1 Message Date
Илья Глазунов 76d6fc2749 Refactor Windows audio capture setup to streamline processing and remove redundant logging
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 20:45:34 +03:00
Илья Глазунов 2f013b4751 Bump version to 0.5.8 and add silence detection timer for audio processing
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 20:21:06 +03:00
Илья Глазунов 66dce4415a Update author information in package.json 2026-01-15 19:48:41 +03:00
Илья Глазунов 6460349fc7 Bump version to 0.5.7 and update screen capture handler to use system picker
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 19:47:44 +03:00
Илья Глазунов 6926c27f20 похуй
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 19:37:13 +03:00
Илья Глазунов cbf82f9317 Refactor screen capture handler to use system picker across all platforms
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 19:28:45 +03:00
Илья Глазунов bf9ec15912 Bump version to 0.5.3 and enhance Windows audio capture using loopback
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 19:20:34 +03:00
Илья Глазунов 01b8415a02 Bump version to 0.5.2 and enhance logging for renderer and audio processing
Build and Release / build (x64, ubuntu-latest, linux) (push) Has been skipped
Build and Release / build (arm64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, macos-latest, darwin) (push) Has been cancelled
Build and Release / build (x64, windows-latest, win32) (push) Has been cancelled
Build and Release / release (push) Has been cancelled
2026-01-15 19:03:54 +03:00
6 changed files with 78 additions and 67 deletions
+13 -9
View File
@@ -30,15 +30,15 @@ module.exports = {
],
// use `security find-identity -v -p codesigning` to find your identity
// for macos signing
// Use ad-hoc signing with entitlements for local development
osxSign: {
identity: '-', // ad-hoc signing (no Apple Developer account needed)
optionsForFile: (filePath) => {
return {
entitlements: 'entitlements.plist',
};
},
},
// Disabled for local builds - ad-hoc signing causes issues
// osxSign: {
// identity: '-', // ad-hoc signing (no Apple Developer account needed)
// optionsForFile: (filePath) => {
// return {
// entitlements: 'entitlements.plist',
// };
// },
// },
// notarize is off - requires Apple Developer account
// osxNotarize: {
// appleId: 'your apple id',
@@ -61,6 +61,10 @@ module.exports = {
{
name: '@electron-forge/maker-dmg',
platforms: ['darwin'],
config: {
name: 'CheatingDaddy',
format: 'ULFO',
},
},
{
name: '@reforged/maker-appimage',
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "cheating-daddy",
"productName": "cheating-daddy",
"version": "0.5.0",
"version": "0.5.9",
"description": "cheating daddy",
"main": "src/index.js",
"scripts": {
@@ -19,8 +19,8 @@
"cheating daddy ai assistant for interviews"
],
"author": {
"name": "sohzm",
"email": "sohambharambe9@gmail.com"
"name": "ShiftyX1",
"email": "lead@pyserve.org"
},
"license": "GPL-3.0",
"dependencies": {
+8
View File
@@ -39,6 +39,14 @@ app.whenReady().then(async () => {
// Add handler to get log path from renderer
ipcMain.handle('get-log-path', () => getLogPath());
// Add handler for renderer logs (so they go to the log file)
ipcMain.on('renderer-log', (event, { level, message }) => {
const prefix = '[RENDERER]';
if (level === 'error') console.error(prefix, message);
else if (level === 'warn') console.warn(prefix, message);
else console.log(prefix, message);
});
});
app.on('window-all-closed', () => {
+15 -2
View File
@@ -281,6 +281,7 @@ async function sendImageMessage(base64Image, prompt) {
let audioChunks = [];
let lastAudioTime = 0;
const SILENCE_THRESHOLD_MS = 1500; // 1.5 seconds of silence
let silenceCheckTimer = null;
async function processAudioChunk(base64Audio, mimeType) {
if (!openaiClient) {
@@ -294,8 +295,20 @@ async function processAudioChunk(base64Audio, mimeType) {
audioChunks.push(buffer);
lastAudioTime = now;
// Check for silence (no new audio for SILENCE_THRESHOLD_MS)
// This is a simple approach - in production you'd want proper VAD
// Clear existing timer
if (silenceCheckTimer) {
clearTimeout(silenceCheckTimer);
}
// Set timer to check for silence
silenceCheckTimer = setTimeout(async () => {
const silenceDuration = Date.now() - lastAudioTime;
if (silenceDuration >= SILENCE_THRESHOLD_MS && audioChunks.length > 0) {
console.log('Silence detected, flushing audio for transcription...');
await flushAudioAndTranscribe();
}
}, SILENCE_THRESHOLD_MS);
return { success: true, buffering: true };
}
+31
View File
@@ -18,6 +18,23 @@ let currentImageQuality = 'medium'; // Store current image quality for manual sc
const isLinux = process.platform === 'linux';
const isMacOS = process.platform === 'darwin';
const isWindows = process.platform === 'win32';
// Send logs to main process for file logging
function logToMain(level, ...args) {
const message = args.map(arg => {
if (typeof arg === 'object') {
try { return JSON.stringify(arg); } catch { return String(arg); }
}
return String(arg);
}).join(' ');
ipcRenderer.send('renderer-log', { level, message });
// Also log to console
if (level === 'error') console.error(...args);
else if (level === 'warn') console.warn(...args);
else console.log(...args);
}
// ============ STORAGE API ============
// Wrapper for IPC-based storage access
@@ -294,6 +311,20 @@ async function startCapture(screenshotIntervalSeconds = 5, imageQuality = 'mediu
});
console.log('Windows capture started with loopback audio');
const audioTracks = mediaStream.getAudioTracks();
const videoTracks = mediaStream.getVideoTracks();
logToMain('info', 'Windows capture result:', {
hasVideo: videoTracks.length > 0,
hasAudio: audioTracks.length > 0,
audioTrackInfo: audioTracks.map(t => ({
label: t.label,
enabled: t.enabled,
muted: t.muted,
readyState: t.readyState,
settings: t.getSettings()
})),
});
// Setup audio processing for Windows loopback audio only
setupWindowsLoopbackProcessing();
+8 -53
View File
@@ -33,59 +33,14 @@ function createWindow(sendToRenderer, geminiSessionRef) {
});
const { session, desktopCapturer } = require('electron');
// Setup display media request handler for screen capture
// On macOS, use system picker for better UX
if (process.platform === 'darwin') {
session.defaultSession.setDisplayMediaRequestHandler(
async (request, callback) => {
try {
const sources = await desktopCapturer.getSources({
types: ['screen'],
thumbnailSize: { width: 0, height: 0 } // Skip thumbnail generation for speed
});
if (sources.length === 0) {
console.error('No screen sources available');
callback(null);
return;
}
// On macOS, directly use the first screen (system already granted permission)
console.log('Screen capture source:', sources[0].name);
callback({ video: sources[0], audio: 'loopback' });
} catch (error) {
console.error('Error getting screen sources:', error);
callback(null);
}
},
{ useSystemPicker: false } // Disable system picker, use our source directly
);
} else {
// On other platforms, use the system picker
session.defaultSession.setDisplayMediaRequestHandler(
async (request, callback) => {
try {
const sources = await desktopCapturer.getSources({
types: ['screen'],
thumbnailSize: { width: 0, height: 0 }
});
if (sources.length === 0) {
console.error('No screen sources available');
callback(null);
return;
}
callback({ video: sources[0], audio: 'loopback' });
} catch (error) {
console.error('Error getting screen sources:', error);
callback(null);
}
},
{ useSystemPicker: true }
);
}
session.defaultSession.setDisplayMediaRequestHandler(
(request, callback) => {
desktopCapturer.getSources({ types: ['screen'] }).then(sources => {
callback({ video: sources[0], audio: 'loopback' });
});
},
{ useSystemPicker: true }
);
mainWindow.setResizable(false);
mainWindow.setContentProtection(true);