From 5ade9841d2d8a6568c7d00a4eea9dc29b9883bb1 Mon Sep 17 00:00:00 2001 From: dd3xp Date: Fri, 5 Jun 2026 22:37:43 +0800 Subject: [PATCH] feat(desktop): bridge auto-starts non-IM services on boot (L4 cron) The reflect/scheduler.py service drives the L4 archive cron every 12h, but was only registered in the catalog and never auto-started. The UI panel also wasn't surfacing it (WS snapshot filters to IM only), so there was effectively no user-facing way to turn L4 archiving on. Net effect: every GA deployment (local Tauri, Squishy, kw, etc.) had L4_raw_sessions/ permanently empty. compress_session.py never ran. Fix: on bridge startup, autostart everything in _catalog that isn't an IM service. Currently that's just reflect/scheduler.py. IM services stay manual because they need mykey.py config + explicit user opt-in. After this lands: - bridge boots -> scheduler subprocess spawned - ~2 min later -> first L4 archive runs (since _l4_t starts at 0) - every 12h thereafter -> next L4 archive cycle - users get L4 with zero config --- frontends/desktop_bridge.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontends/desktop_bridge.py b/frontends/desktop_bridge.py index 166542ca..3b2c119a 100644 --- a/frontends/desktop_bridge.py +++ b/frontends/desktop_bridge.py @@ -875,6 +875,18 @@ class ServiceManager: return {"ok": False, "error": item["lastError"] or "start_failed", "service": item} return {"ok": True, "service": item} + def autostart_extras(self) -> None: + """Auto-start non-IM services on bridge boot. Currently: + - reflect/scheduler.py (drives L4 archive cron every 12h). + IM services stay manual (need explicit mykey.py config + user opt-in).""" + for sid in sorted(set(self._catalog) - set(self._im_catalog)): + try: + res = self.start_service(sid) + tag = "ok" if res.get("ok") else f"fail: {res.get('error')}" + except Exception as e: + tag = f"exception {type(e).__name__}: {e}" + print(f"[autostart] {sid}: {tag}", file=sys.stderr) + def stop_service(self, sid: str) -> dict: if sid not in self._catalog: raise KeyError(sid) @@ -1508,6 +1520,7 @@ def create_app(): async def on_startup(app): hub.loop = asyncio.get_running_loop() + services.autostart_extras() app.on_startup.append(on_startup) return app