diff --git a/backend/app/api/gateways.py b/backend/app/api/gateways.py index f6b328e3..2a37a362 100644 --- a/backend/app/api/gateways.py +++ b/backend/app/api/gateways.py @@ -41,6 +41,7 @@ INCLUDE_MAIN_QUERY = Query(default=True) RESET_SESSIONS_QUERY = Query(default=False) ROTATE_TOKENS_QUERY = Query(default=False) FORCE_BOOTSTRAP_QUERY = Query(default=False) +LEAD_ONLY_QUERY = Query(default=False) BOARD_ID_QUERY = Query(default=None) _RUNTIME_TYPE_REFERENCES = (UUID,) @@ -48,6 +49,7 @@ _RUNTIME_TYPE_REFERENCES = (UUID,) def _template_sync_query( *, include_main: bool = INCLUDE_MAIN_QUERY, + lead_only: bool = LEAD_ONLY_QUERY, reset_sessions: bool = RESET_SESSIONS_QUERY, rotate_tokens: bool = ROTATE_TOKENS_QUERY, force_bootstrap: bool = FORCE_BOOTSTRAP_QUERY, @@ -55,6 +57,7 @@ def _template_sync_query( ) -> GatewayTemplateSyncQuery: return GatewayTemplateSyncQuery( include_main=include_main, + lead_only=lead_only, reset_sessions=reset_sessions, rotate_tokens=rotate_tokens, force_bootstrap=force_bootstrap, diff --git a/backend/app/services/openclaw/admin_service.py b/backend/app/services/openclaw/admin_service.py index 56557001..587703d5 100644 --- a/backend/app/services/openclaw/admin_service.py +++ b/backend/app/services/openclaw/admin_service.py @@ -343,6 +343,7 @@ class GatewayAdminLifecycleService(OpenClawDBService): GatewayTemplateSyncOptions( user=auth.user, include_main=query.include_main, + lead_only=query.lead_only, reset_sessions=query.reset_sessions, rotate_tokens=query.rotate_tokens, force_bootstrap=query.force_bootstrap, diff --git a/backend/app/services/openclaw/provisioning_db.py b/backend/app/services/openclaw/provisioning_db.py index 1ab172e0..e44163e5 100644 --- a/backend/app/services/openclaw/provisioning_db.py +++ b/backend/app/services/openclaw/provisioning_db.py @@ -109,6 +109,7 @@ class GatewayTemplateSyncOptions: user: User | None include_main: bool = True + lead_only: bool = False reset_sessions: bool = False rotate_tokens: bool = False force_bootstrap: bool = False @@ -246,6 +247,7 @@ class OpenClawProvisioningService(OpenClawDBService): options = GatewayTemplateSyncOptions( user=template_user, include_main=options.include_main, + lead_only=options.lead_only, reset_sessions=options.reset_sessions, rotate_tokens=options.rotate_tokens, force_bootstrap=options.force_bootstrap, @@ -288,11 +290,12 @@ class OpenClawProvisioningService(OpenClawDBService): return result paused_board_ids = await _paused_board_ids(self.session, list(boards_by_id.keys())) if boards_by_id: - agents = await ( - Agent.objects.by_field_in("board_id", list(boards_by_id.keys())) - .order_by(col(Agent.created_at).asc()) - .all(self.session) + query = Agent.objects.by_field_in("board_id", list(boards_by_id.keys())).order_by( + col(Agent.created_at).asc(), ) + if options.lead_only: + query = query.filter(col(Agent.is_board_lead).is_(True)) + agents = await query.all(self.session) else: agents = [] diff --git a/backend/app/services/openclaw/session_service.py b/backend/app/services/openclaw/session_service.py index 67aee61f..627a9967 100644 --- a/backend/app/services/openclaw/session_service.py +++ b/backend/app/services/openclaw/session_service.py @@ -44,6 +44,7 @@ class GatewayTemplateSyncQuery: """Sync options parsed from query args for gateway template operations.""" include_main: bool + lead_only: bool reset_sessions: bool rotate_tokens: bool force_bootstrap: bool diff --git a/backend/scripts/sync_gateway_templates.py b/backend/scripts/sync_gateway_templates.py index 2542ceac..91266c24 100644 --- a/backend/scripts/sync_gateway_templates.py +++ b/backend/scripts/sync_gateway_templates.py @@ -29,6 +29,11 @@ def _parse_args() -> argparse.Namespace: default=True, help="Also sync the gateway main agent (default: true)", ) + parser.add_argument( + "--lead-only", + action="store_true", + help="Sync only board lead agents", + ) parser.add_argument( "--reset-sessions", action="store_true", @@ -72,6 +77,7 @@ async def _run() -> int: GatewayTemplateSyncOptions( user=None, include_main=bool(args.include_main), + lead_only=bool(args.lead_only), reset_sessions=bool(args.reset_sessions), rotate_tokens=bool(args.rotate_tokens), force_bootstrap=bool(args.force_bootstrap),