diff --git a/GEMINI.md b/GEMINI.md index d3378e9..40efc73 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -23,25 +23,34 @@ I am the **primary orchestrator and main helper** for the development of the **U ## Session Summary & Progress (Jan 8, 2026) - This session focused on debugging, task management, and communication protocols within the Aether AI Agent network. * **Task Management Bug Resolved:** The `add_task` tool bug (duplicate IDs) was identified, reported, and fixed by the Manager/Coordinator agent. The fix introduced microsecond precision for IDs in task management. * **Agent Bridge Restoration Verified:** `app/routers/agent_bridge.py` was inspected; `psutil` handling was confirmed robust. Docker container logs for FastAPI (green/red) showed no crashes related to `agent_bridge.py` or `psutil`. The task was marked as Done. * **Docker Registry Sync Audit Completed:** An audit of `ae_api_dev_green` and `ae_api_dev_red` against `docker-compose.yml` confirmed consistency in environment variables, volumes, ports, images, and extra hosts. No critical configuration drift was identified. The task was marked as Done. * **Frontend Interface Validation Successful:** The `frontend` agent confirmed full validation and successful unified type migration for 59 TypeScript interfaces. The task was marked as Done. +* **AE Person Creation Fixes:** + * Identified that `given_name` was failing due to `null` values violating database `NOT NULL` constraints. + * Added Pydantic validators to `Person_Base` to default `given_name` to `""` and `allow_auth_key` to `True` if `None` is provided. + * Modified `app/routers/api_crud_v3.py` to strip virtual `*_id_random` fields (like `account_id_random`) from payloads before database insertion/update. This prevents "Unknown column" errors when the frontend sends convenience lookup fields. * **`ae_obj_info` Dependency Resolved:** * Initial investigation confirmed `pytz` was installed in the Workstation's host venv, contradicting an `mcp_agent` message. * Further clarification revealed `OSIT_dev` is not synced between Workstation and Laptop, causing environment discrepancies. * The `mcp_agent` provided a traceback from the Laptop, confirming `pytz` was indeed missing from the *Laptop's* host venv. * User (Scott Idem) confirmed manual installation of `pytz` in the Laptop's host venv, resolving the issue. The task was marked as Done. -* **New MCP Tool Announcements:** `read_reference` tool introduced for technical stubs. + * The source code for `ae_obj_info` is confirmed to be at `agents_sync/scripts/ae_object_info.py`. +* **New MCP Tool Announcements:** + * `read_reference` tool introduced for technical stubs. + * `delete_task` and `git_smart_commit` tools are now live, enhancing task management and version control. +* **Codebase Investigator Report:** The report for Aether extension and journal management is pending `gemini_cli`'s instruction; further review is blocked until notification. Task `155435511` is completed for this phase. + ## Current To-Do List ### 1. High Priority & Urgent (UE-AE-01 Orchestration) - [ ] **Review codebase investigator report for Aether extension and journal management.** (ID: 155435511) - In Progress (awaiting report from codebase_investigator via gemini_cli). +- [x] **Fix AE Person Creation (Backend/API)** - Completed (Validators added and router filtering implemented). ### 2. Infrastructure & Technical Debt - [ ] **Psutil Container Update**: Rebuilding the API image with C-build tools (GCC) to support native system monitoring. (Deferred / Paused) diff --git a/app/models/person_models.py b/app/models/person_models.py index e3a9b1c..cc16cad 100644 --- a/app/models/person_models.py +++ b/app/models/person_models.py @@ -216,10 +216,22 @@ class Person_Base(BaseModel): log.debug(locals()) if isinstance(v, int) and v > 0: return v - elif id_random := values.get('user_id_random'): + elif id_random := values.get('id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='user') return None + @validator('given_name', always=True) + def given_name_validator(cls, v): + if v is None: + return "" + return v + + @validator('allow_auth_key', always=True) + def allow_auth_key_validator(cls, v): + if v is None: + return True + return v + class Config: underscore_attrs_are_private = True allow_population_by_field_name = True diff --git a/app/routers/api_crud_v3.py b/app/routers/api_crud_v3.py index 868b0cb..f598451 100644 --- a/app/routers/api_crud_v3.py +++ b/app/routers/api_crud_v3.py @@ -427,6 +427,11 @@ async def post_obj( data_to_insert = validated_obj.dict(exclude_unset=True) + # Filter out virtual _id_random fields (e.g., account_id_random) that are not in the DB table + keys_to_remove = [k for k in data_to_insert.keys() if k.endswith('_id_random') and k != 'id_random'] + for k in keys_to_remove: + del data_to_insert[k] + if sql_insert_result := sql_insert(data=data_to_insert, table_name=table_name_insert): new_obj_id = sql_insert_result new_obj_id_random = get_id_random(record_id=new_obj_id, table_name=obj_name) @@ -479,6 +484,11 @@ async def patch_obj( else: return mk_resp(data=False, status_code=404, response=response, status_message=f"Object with ID '{obj_id}' not found in database.") + # Filter out virtual _id_random fields (e.g., account_id_random) that are not in the DB table + keys_to_remove = [k for k in obj_data.keys() if k.endswith('_id_random') and k != 'id_random'] + for k in keys_to_remove: + del obj_data[k] + if sql_update(data=obj_data, table_name=table_name_update, record_id=record_id): if return_obj: if sql_select_result := sql_select(table_name=table_name_select, record_id=record_id):