fix/extensions: rule-enforcer — setInterval gegen uncaught exceptions härten

Pis Loader (loader.js:298-311) kapselt nur die synchrone Factory-Ausführung.
Das 30s-setInterval feuert später und läge außerhalb dieses Schutzes — eine
Exception dort wäre uncaught und könnte den Pi-Prozess beenden. Daher: gesamter
Intervall-Rumpf in try/catch.

Empirisch verifiziert (Pi-SDK createAgentSession, agentDir=~/.pi/agent):
- rule-enforcer.ts lädt mit 0 Fehlern (10/10 Extensions geladen)
- absichtlich kaputte Test-Extension crasht Pi NICHT — Fehler isoliert, gesunde
  Extensions laden weiter, Session startet normal
This commit is contained in:
Raimund Bauer 2026-06-02 18:40:44 +02:00
parent 115cc61627
commit 6371fb9f60

View file

@ -212,7 +212,12 @@ export default function (pi: ExtensionAPI) {
}
// ── 30s Background-Check: Invariante erzwingen ───────────────────────────
// WICHTIG: Der gesamte Rumpf ist in try/catch gekapselt. Pis Loader umschließt
// nur die synchrone Factory-Ausführung (loader.js:298-311); dieses Intervall
// feuert später und läge sonst AUSSERHALB von Pis Schutz — eine Exception hier
// wäre uncaught und könnte den Pi-Prozess beenden. Darum: niemals werfen.
const interval = setInterval(() => {
try {
const subagenten = laufendeSubagenten();
if (subagenten.length === 0) return; // kein laufender Subagent ⇒ idle ist erlaubt
@ -268,6 +273,9 @@ export default function (pi: ExtensionAPI) {
`→ Nimm die watch_subagents-Überwachung sofort wieder auf und halte sie, bis ALLE Subagenten fertig sind.`,
);
} catch {}
} catch {
// Defensive Notbremse: Das Intervall darf den Pi-Prozess NIE crashen.
}
}, CHECK_INTERVAL_MS);
pi.on("session_shutdown", async () => {