From 6e04d8511c0cacb32373aa2a57bdcca14a1b9a55 Mon Sep 17 00:00:00 2001 From: daniel Date: Sat, 9 May 2026 13:32:36 -0500 Subject: [PATCH] fix: two-step DynamoDB update for google_accounts; live SM lookup in list_google_accounts --- agentclaw/app/agent_claw_main/main.py | 22 ++++++++++++++++++++++ src/lambdas/oauth-handler/handler.py | 12 +++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/agentclaw/app/agent_claw_main/main.py b/agentclaw/app/agent_claw_main/main.py index 72f4481..d77fdb1 100644 --- a/agentclaw/app/agent_claw_main/main.py +++ b/agentclaw/app/agent_claw_main/main.py @@ -110,6 +110,28 @@ def connect_google_account(label: str = 'primary') -> str: @tool def list_google_accounts() -> str: """List all connected Google accounts and their labels.""" + actor_id = _current_actor_id + if actor_id: + try: + safe_actor_id = actor_id.replace(':', '-') + prefix = f'agent-claw/google-credentials/{safe_actor_id}/' + sm = boto3.client('secretsmanager', region_name='us-east-1') + paginator = sm.get_paginator('list_secrets') + accounts = {} + for page in paginator.paginate(Filters=[{'Key': 'name', 'Values': [prefix]}]): + for s in page['SecretList']: + label = s['Name'][len(prefix):] + try: + import json as _json + val = _json.loads(sm.get_secret_value(SecretId=s['Name'])['SecretString']) + accounts[label] = val.get('email', s['Name']) + except Exception: + accounts[label] = s['Name'] + if accounts: + parts = [f'{label} ({email})' for label, email in accounts.items()] + return 'Connected Google accounts: ' + ', '.join(parts) + except Exception as e: + print(f'[list_google_accounts] SM lookup failed, falling back: {e}') accounts = _gws._current_google_accounts if not accounts: return 'No Google accounts connected. Use connect_google_account to add one.' diff --git a/src/lambdas/oauth-handler/handler.py b/src/lambdas/oauth-handler/handler.py index 3012b68..84daee8 100644 --- a/src/lambdas/oauth-handler/handler.py +++ b/src/lambdas/oauth-handler/handler.py @@ -205,11 +205,17 @@ def handle_callback(params: dict) -> dict: table_name = os.environ.get('USERS_TABLE_NAME', '') if table_name and actor_id: try: - get_ddb().Table(table_name).update_item( + table = get_ddb().Table(table_name) + table.update_item( Key={'actor_id': actor_id}, - UpdateExpression='SET google_accounts = if_not_exists(google_accounts, :empty), google_accounts.#label = :email', + UpdateExpression='SET google_accounts = if_not_exists(google_accounts, :empty)', + ExpressionAttributeValues={':empty': {}}, + ) + table.update_item( + Key={'actor_id': actor_id}, + UpdateExpression='SET google_accounts.#label = :email', ExpressionAttributeNames={'#label': label}, - ExpressionAttributeValues={':email': user_email, ':empty': {}}, + ExpressionAttributeValues={':email': user_email}, ) except Exception as e: print(f'[oauth] DynamoDB update failed: {e}')