Plugin: Backend automatisch starten wenn nicht verfügbar (daemon spawning) #142

Closed
opened 2026-01-24 09:51:52 +00:00 by jack · 1 comment
Owner

Problem

In packages/hooks/src/plugin-entry.ts gibt es ein offenes TODO (Zeile 53):

} catch {
  // Backend not responding - try to start it
  console.error('Backend not available. Please start the backend service.');
  // For now, just exit - TODO: implement daemon spawning
}

Aktuell wird nur eine Fehlermeldung ausgegeben wenn das Backend nicht erreichbar ist. Der Benutzer muss das Backend manuell starten.

Gewünschtes Verhalten

Wenn das Backend nicht verfügbar ist, sollte das Plugin es automatisch als Daemon starten:

  1. Backend-Prozess im Hintergrund spawnen
  2. Warten bis Backend ready ist (Health-Check)
  3. Dann normal fortfahren

Implementierungsvorschlag

} catch {
  // Backend not responding - try to start it
  console.error('Backend not available, attempting to start...');
  
  try {
    // Spawn backend as daemon
    const backendPath = getBackendBinaryPath();
    spawn('node', [backendPath], {
      detached: true,
      stdio: 'ignore',
    }).unref();
    
    // Wait for backend to be ready
    await waitForBackendReady(5000);
    console.error('Backend started successfully');
  } catch (spawnError) {
    console.error('Failed to start backend:', spawnError);
    process.exit(1);
  }
}

Überlegungen

  • PID-File für Daemon-Management
  • Graceful shutdown bei Plugin-Ende?
  • Oder Backend läuft unabhängig weiter (preferred)
  • Konflikt-Erkennung wenn Backend bereits läuft

Betroffene Datei

packages/hooks/src/plugin-entry.ts - Zeile 50-55

## Problem In `packages/hooks/src/plugin-entry.ts` gibt es ein offenes TODO (Zeile 53): ```typescript } catch { // Backend not responding - try to start it console.error('Backend not available. Please start the backend service.'); // For now, just exit - TODO: implement daemon spawning } ``` Aktuell wird nur eine Fehlermeldung ausgegeben wenn das Backend nicht erreichbar ist. Der Benutzer muss das Backend manuell starten. ## Gewünschtes Verhalten Wenn das Backend nicht verfügbar ist, sollte das Plugin es automatisch als Daemon starten: 1. Backend-Prozess im Hintergrund spawnen 2. Warten bis Backend ready ist (Health-Check) 3. Dann normal fortfahren ## Implementierungsvorschlag ```typescript } catch { // Backend not responding - try to start it console.error('Backend not available, attempting to start...'); try { // Spawn backend as daemon const backendPath = getBackendBinaryPath(); spawn('node', [backendPath], { detached: true, stdio: 'ignore', }).unref(); // Wait for backend to be ready await waitForBackendReady(5000); console.error('Backend started successfully'); } catch (spawnError) { console.error('Failed to start backend:', spawnError); process.exit(1); } } ``` ## Überlegungen - PID-File für Daemon-Management - Graceful shutdown bei Plugin-Ende? - Oder Backend läuft unabhängig weiter (preferred) - Konflikt-Erkennung wenn Backend bereits läuft ## Betroffene Datei `packages/hooks/src/plugin-entry.ts` - Zeile 50-55
Author
Owner

Implementiert in Branch feat/142-daemon-spawning.

Änderungen in packages/hooks/src/plugin-entry.ts:

  1. detectBackendPath() - Sucht nach dem Backend-Binary in verschiedenen möglichen Pfaden (Development, Plugin-Bundle)

  2. waitForBackendReady(timeoutMs) - Pollt den Health-Endpoint alle 200ms bis das Backend ready ist oder der Timeout erreicht wird

  3. spawnBackendDaemon(backendPath) - Spawnt das Backend als detached Daemon-Prozess mit:

    • detached: true - Prozess läuft unabhängig vom Parent
    • stdio: 'ignore' - Keine Pipe zum Parent
    • windowsHide: true - Kein Terminal-Fenster auf Windows
    • unref() - Parent kann beendet werden ohne auf das Kind zu warten
  4. ensureBackend() erweitert:

    • Zuerst wird geprüft, ob Backend bereits läuft
    • Falls nicht, wird nach dem Binary gesucht
    • Falls gefunden, wird der Daemon gespawnt
    • Dann wird bis zu 10 Sekunden auf Readiness gewartet

Verhalten:

  • Bei start Command wird automatisch versucht, das Backend zu starten
  • Benutzer sieht Info-Messages über den Startup-Prozess
  • Backend läuft als unabhängiger Daemon weiter (auch nach Plugin-Ende)
Implementiert in Branch `feat/142-daemon-spawning`. **Änderungen in `packages/hooks/src/plugin-entry.ts`:** 1. **`detectBackendPath()`** - Sucht nach dem Backend-Binary in verschiedenen möglichen Pfaden (Development, Plugin-Bundle) 2. **`waitForBackendReady(timeoutMs)`** - Pollt den Health-Endpoint alle 200ms bis das Backend ready ist oder der Timeout erreicht wird 3. **`spawnBackendDaemon(backendPath)`** - Spawnt das Backend als detached Daemon-Prozess mit: - `detached: true` - Prozess läuft unabhängig vom Parent - `stdio: 'ignore'` - Keine Pipe zum Parent - `windowsHide: true` - Kein Terminal-Fenster auf Windows - `unref()` - Parent kann beendet werden ohne auf das Kind zu warten 4. **`ensureBackend()`** erweitert: - Zuerst wird geprüft, ob Backend bereits läuft - Falls nicht, wird nach dem Binary gesucht - Falls gefunden, wird der Daemon gespawnt - Dann wird bis zu 10 Sekunden auf Readiness gewartet **Verhalten:** - Bei `start` Command wird automatisch versucht, das Backend zu starten - Benutzer sieht Info-Messages über den Startup-Prozess - Backend läuft als unabhängiger Daemon weiter (auch nach Plugin-Ende)
jack closed this issue 2026-01-24 18:08:09 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
customable/claude-mem#142
No description provided.