feat: single active project lock — warns if another project already connected to Discord
This commit is contained in:
@@ -2715,6 +2715,57 @@ async function activate(context) {
|
|||||||
bridgePath = configPath || path.join(os.homedir(), '.gemini', 'antigravity', 'bridge');
|
bridgePath = configPath || path.join(os.homedir(), '.gemini', 'antigravity', 'bridge');
|
||||||
ensureBridgeDir();
|
ensureBridgeDir();
|
||||||
console.log(`Gravity Bridge: bridge path: ${bridgePath}`);
|
console.log(`Gravity Bridge: bridge path: ${bridgePath}`);
|
||||||
|
// ── Single Active Project Lock ──
|
||||||
|
const lockFile = path.join(bridgePath, 'active_project.lock');
|
||||||
|
let bridgeDisabled = false;
|
||||||
|
try {
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
const lockData = JSON.parse(fs.readFileSync(lockFile, 'utf-8'));
|
||||||
|
// Check if lock holder is still alive
|
||||||
|
let lockAlive = false;
|
||||||
|
if (lockData.pid) {
|
||||||
|
try {
|
||||||
|
process.kill(lockData.pid, 0);
|
||||||
|
lockAlive = true;
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
lockAlive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lockAlive && lockData.project !== projectName) {
|
||||||
|
vscode.window.showWarningMessage(`⚠️ Discord Bridge: "${lockData.project}"가 이미 활성 중 (PID ${lockData.pid}). 이 프로젝트(${projectName})는 Discord에 연결되지 않습니다.`, '무시하고 연결').then(choice => {
|
||||||
|
if (choice === '무시하고 연결') {
|
||||||
|
// Overwrite lock
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Force-acquired lock (was: ${lockData.project})`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
bridgeDisabled = true;
|
||||||
|
logToFile(`[LOCK] Another project active: ${lockData.project} (PID ${lockData.pid}) — bridge disabled`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Stale lock or same project — overwrite
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Acquired lock (stale/same project)`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Created lock for ${projectName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (lockErr) {
|
||||||
|
logToFile(`[LOCK] Error: ${lockErr.message}`);
|
||||||
|
}
|
||||||
// Status bar
|
// Status bar
|
||||||
statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
|
statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
|
||||||
statusBar.text = '$(sync~spin) Bridge';
|
statusBar.text = '$(sync~spin) Bridge';
|
||||||
@@ -2832,6 +2883,18 @@ async function activate(context) {
|
|||||||
isActive = true;
|
isActive = true;
|
||||||
}
|
}
|
||||||
function deactivate() {
|
function deactivate() {
|
||||||
|
// Release active project lock
|
||||||
|
try {
|
||||||
|
const lockFile = path.join(bridgePath, 'active_project.lock');
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
const lockData = JSON.parse(fs.readFileSync(lockFile, 'utf-8'));
|
||||||
|
if (lockData.pid === process.pid) {
|
||||||
|
fs.unlinkSync(lockFile);
|
||||||
|
logToFile(`[LOCK] Released lock for ${projectName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
if (sdk) {
|
if (sdk) {
|
||||||
try {
|
try {
|
||||||
sdk.dispose();
|
sdk.dispose();
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -2652,6 +2652,52 @@ export async function activate(context: vscode.ExtensionContext) {
|
|||||||
ensureBridgeDir();
|
ensureBridgeDir();
|
||||||
console.log(`Gravity Bridge: bridge path: ${bridgePath}`);
|
console.log(`Gravity Bridge: bridge path: ${bridgePath}`);
|
||||||
|
|
||||||
|
// ── Single Active Project Lock ──
|
||||||
|
const lockFile = path.join(bridgePath, 'active_project.lock');
|
||||||
|
let bridgeDisabled = false;
|
||||||
|
try {
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
const lockData = JSON.parse(fs.readFileSync(lockFile, 'utf-8'));
|
||||||
|
// Check if lock holder is still alive
|
||||||
|
let lockAlive = false;
|
||||||
|
if (lockData.pid) {
|
||||||
|
try { process.kill(lockData.pid, 0); lockAlive = true; } catch { lockAlive = false; }
|
||||||
|
}
|
||||||
|
if (lockAlive && lockData.project !== projectName) {
|
||||||
|
vscode.window.showWarningMessage(
|
||||||
|
`⚠️ Discord Bridge: "${lockData.project}"가 이미 활성 중 (PID ${lockData.pid}). 이 프로젝트(${projectName})는 Discord에 연결되지 않습니다.`,
|
||||||
|
'무시하고 연결'
|
||||||
|
).then(choice => {
|
||||||
|
if (choice === '무시하고 연결') {
|
||||||
|
// Overwrite lock
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Force-acquired lock (was: ${lockData.project})`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
bridgeDisabled = true;
|
||||||
|
logToFile(`[LOCK] Another project active: ${lockData.project} (PID ${lockData.pid}) — bridge disabled`);
|
||||||
|
} else {
|
||||||
|
// Stale lock or same project — overwrite
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Acquired lock (stale/same project)`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync(lockFile, JSON.stringify({
|
||||||
|
project: projectName, pid: process.pid,
|
||||||
|
since: new Date().toISOString(), hostname: os.hostname()
|
||||||
|
}), 'utf-8');
|
||||||
|
logToFile(`[LOCK] Created lock for ${projectName}`);
|
||||||
|
}
|
||||||
|
} catch (lockErr: any) {
|
||||||
|
logToFile(`[LOCK] Error: ${lockErr.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
// Status bar
|
// Status bar
|
||||||
statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
|
statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
|
||||||
statusBar.text = '$(sync~spin) Bridge';
|
statusBar.text = '$(sync~spin) Bridge';
|
||||||
@@ -2773,6 +2819,17 @@ export async function activate(context: vscode.ExtensionContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function deactivate() {
|
export function deactivate() {
|
||||||
|
// Release active project lock
|
||||||
|
try {
|
||||||
|
const lockFile = path.join(bridgePath, 'active_project.lock');
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
const lockData = JSON.parse(fs.readFileSync(lockFile, 'utf-8'));
|
||||||
|
if (lockData.pid === process.pid) {
|
||||||
|
fs.unlinkSync(lockFile);
|
||||||
|
logToFile(`[LOCK] Released lock for ${projectName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch { }
|
||||||
if (sdk) {
|
if (sdk) {
|
||||||
try { sdk.dispose(); } catch { }
|
try { sdk.dispose(); } catch { }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user