fix(collector): multi-project command polling via bridge/register/ discovery

This commit is contained in:
Variet Worker
2026-03-12 20:37:23 +09:00
parent 71f2a269f0
commit ae51d28857

View File

@@ -185,18 +185,48 @@ class CollectorBridge:
# ─── Poll Gateway commands → local ─── # ─── Poll Gateway commands → local ───
def _discover_local_projects(self) -> set[str]:
"""Discover all project names registered by local Extension instances.
Reads bridge/register/*.json files, which are written by each AG window's
Extension with {conversation_id, project_name}. Returns unique project names
found, always including self.project_name as a fallback.
"""
projects = {self.project_name}
register_dir = self.local.bridge_dir / "register"
if not register_dir.exists():
return projects
for f in register_dir.glob("*.json"):
try:
data = json.loads(f.read_text(encoding="utf-8-sig"))
p = data.get("project_name", "")
if p:
projects.add(p)
except (json.JSONDecodeError, OSError):
pass
return projects
async def _poll_commands_loop(self): async def _poll_commands_loop(self):
"""Poll Gateway for commands and write them locally for Extension.""" """Poll Gateway for commands for ALL local projects.
Discovers projects from bridge/register/ (written by each AG Extension)
and polls commands for each. Extension-side filtering (project_name check)
ensures each AG window only processes its own commands.
"""
while self._running: while self._running:
try: try:
# Skip cycle if rate-limited # Skip cycle if rate-limited
if not self.remote.is_rate_limited: if not self.remote.is_rate_limited:
commands = await self.remote.apoll_commands(self.project_name) projects = self._discover_local_projects()
for cmd in commands: for project in projects:
cmd_id = cmd.get("id", str(int(time.time() * 1000))) if self.remote.is_rate_limited:
fname = f"{cmd_id}.json" break # Stop mid-cycle if rate-limited
self.local.write_json("commands", fname, cmd) commands = await self.remote.apoll_commands(project)
logger.info(f"[COLLECTOR] ← Gateway: command {cmd.get('text', '?')[:30]}") for cmd in commands:
cmd_id = cmd.get("id", str(int(time.time() * 1000)))
fname = f"{cmd_id}.json"
self.local.write_json("commands", fname, cmd)
logger.info(f"[COLLECTOR] ← Gateway: command [{project}] {cmd.get('text', '?')[:30]}")
except Exception as e: except Exception as e:
logger.error(f"[COLLECTOR] poll_commands error: {e}") logger.error(f"[COLLECTOR] poll_commands error: {e}")