diff --git a/backend/backend.log b/backend/backend.log new file mode 100644 index 0000000..455ebec --- /dev/null +++ b/backend/backend.log @@ -0,0 +1,2084 @@ +INFO: Started server process [87444] +INFO: Waiting for application startup. +2026-03-21 22:31:35,982 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing .connector at 0x0000025AB470F480> +2026-03-21 22:31:35,987 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation .connector at 0x0000025AB470F480> completed +2026-03-21 22:31:35,988 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) +2026-03-21 22:31:35,988 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) completed +2026-03-21 22:31:35,988 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'floor', 1, , deterministic=True) +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'floor', 1, , deterministic=True) completed +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA read_uncommitted', []) +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA read_uncommitted', []) completed +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,989 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,989 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:35,989 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:35,990 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("users") +2026-03-21 22:31:35,990 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("users") +2026-03-21 22:31:35,990 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,990 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,990 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,990 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,990 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("users")', ()) +2026-03-21 22:31:35,990 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("users")', ()) completed +2026-03-21 22:31:35,990 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,991 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("documents") +2026-03-21 22:31:35,991 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("documents") +2026-03-21 22:31:35,991 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,991 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,991 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("documents")', ()) +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("documents")', ()) completed +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,992 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("document_chunks") +2026-03-21 22:31:35,992 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("document_chunks") +2026-03-21 22:31:35,992 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,992 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("document_chunks")', ()) +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("document_chunks")', ()) completed +2026-03-21 22:31:35,992 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,993 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("tasks") +2026-03-21 22:31:35,993 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("tasks") +2026-03-21 22:31:35,993 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,993 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,993 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("tasks")', ()) +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("tasks")', ()) completed +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,994 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("task_histories") +2026-03-21 22:31:35,994 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("task_histories") +2026-03-21 22:31:35,994 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,994 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,994 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("task_histories")', ()) +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("task_histories")', ()) completed +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,995 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("forum_posts") +2026-03-21 22:31:35,995 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("forum_posts") +2026-03-21 22:31:35,995 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,995 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,995 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("forum_posts")', ()) +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("forum_posts")', ()) completed +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,996 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("forum_replies") +2026-03-21 22:31:35,996 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("forum_replies") +2026-03-21 22:31:35,996 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,996 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,996 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("forum_replies")', ()) +2026-03-21 22:31:35,997 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("forum_replies")', ()) completed +2026-03-21 22:31:35,997 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,997 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,997 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,997 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,997 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("agents") +2026-03-21 22:31:35,997 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("agents") +2026-03-21 22:31:35,998 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,998 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("agents")', ()) +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("agents")', ()) completed +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,998 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,998 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("agent_messages") +2026-03-21 22:31:35,998 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("agent_messages") +2026-03-21 22:31:35,998 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,998 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("agent_messages")', ()) +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("agent_messages")', ()) completed +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,999 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("conversations") +2026-03-21 22:31:35,999 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("conversations") +2026-03-21 22:31:35,999 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:35,999 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:35,999 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("conversations")', ()) +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("conversations")', ()) completed +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,000 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("messages") +2026-03-21 22:31:36,000 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("messages") +2026-03-21 22:31:36,000 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,000 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("messages")', ()) +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("messages")', ()) completed +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,000 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,000 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("kg_nodes") +2026-03-21 22:31:36,000 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("kg_nodes") +2026-03-21 22:31:36,001 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,001 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("kg_nodes")', ()) +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("kg_nodes")', ()) completed +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,001 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("kg_edges") +2026-03-21 22:31:36,001 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("kg_edges") +2026-03-21 22:31:36,001 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,001 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,001 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("kg_edges")', ()) +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("kg_edges")', ()) completed +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,002 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("memory_summaries") +2026-03-21 22:31:36,002 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("memory_summaries") +2026-03-21 22:31:36,002 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,002 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,002 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("memory_summaries")', ()) +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("memory_summaries")', ()) completed +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,003 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("user_memories") +2026-03-21 22:31:36,003 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("user_memories") +2026-03-21 22:31:36,003 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,003 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("user_memories")', ()) +2026-03-21 22:31:36,003 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("user_memories")', ()) completed +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,004 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("daily_todos") +2026-03-21 22:31:36,004 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("daily_todos") +2026-03-21 22:31:36,004 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,004 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,004 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("daily_todos")', ()) +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("daily_todos")', ()) completed +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,005 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("logs") +2026-03-21 22:31:36,005 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("logs") +2026-03-21 22:31:36,005 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,005 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("logs")', ()) +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("logs")', ()) completed +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,005 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,006 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("skills") +2026-03-21 22:31:36,006 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("skills") +2026-03-21 22:31:36,006 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,006 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("skills")', ()) +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("skills")', ()) completed +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,006 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("folders") +2026-03-21 22:31:36,006 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA main.table_info("folders") +2026-03-21 22:31:36,006 INFO sqlalchemy.engine.Engine [raw sql] () +2026-03-21 22:31:36,006 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [raw sql] () +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,006 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA main.table_info("folders")', ()) +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA main.table_info("folders")', ()) completed +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,007 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,008 INFO sqlalchemy.engine.Engine PRAGMA table_info(logs) +2026-03-21 22:31:36,008 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | PRAGMA table_info(logs) +2026-03-21 22:31:36,008 INFO sqlalchemy.engine.Engine [generated in 0.00013s] () +2026-03-21 22:31:36,008 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [generated in 0.00013s] () +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'PRAGMA table_info(logs)', ()) +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'PRAGMA table_info(logs)', ()) completed +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,008 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:36,008 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | COMMIT +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,008 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,023 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,023 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,023 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:36,024 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:36,024 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,024 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,024 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,024 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,025 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:36,025 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:36,026 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:36,026 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:36,026 INFO sqlalchemy.engine.Engine [generated in 0.00022s] ('info', 'system', None, None, None, None, None, None, 'app.startup', 'application_started', '{"version": "0.1.0"}', 'app', None, '7392bcf3-41ed-4c86-a520-655d1577eca9', '2026-03-21 14:31:36.026139', '2026-03-21 14:31:36.026143') +2026-03-21 22:31:36,026 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [generated in 0.00022s] ('info', 'system', None, None, None, None, None, None, 'app.startup', 'application_started', '{"version": "0.1.0"}', 'app', None, '7392bcf3-41ed-4c86-a520-655d1577eca9', '2026-03-21 14:31:36.026139', '2026-03-21 14:31:36.026143') +2026-03-21 22:31:36,026 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,026 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,026 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, None, None, None, None, None, 'app.startup', 'application_started', '{"version": "0.1.0"}', 'app', None, '7392bcf3-41ed-4c86-a520-655d1577eca9', '2026-03-21 14:31:36.026139', '2026-03-21 14:31:36.026143')) +2026-03-21 22:31:36,028 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, None, None, None, None, None, 'app.startup', 'application_started', '{"version": "0.1.0"}', 'app', None, '7392bcf3-41ed-4c86-a520-655d1577eca9', '2026-03-21 14:31:36.026139', '2026-03-21 14:31:36.026143')) completed +2026-03-21 22:31:36,028 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,028 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,028 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:36,028 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | COMMIT +2026-03-21 22:31:36,028 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,032 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,032 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,032 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,033 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,033 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:36,033 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:36,034 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:36,034 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:36,035 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('7392bcf3-41ed-4c86-a520-655d1577eca9',) +2026-03-21 22:31:36,035 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | [generated in 0.00011s] ('7392bcf3-41ed-4c86-a520-655d1577eca9',) +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('7392bcf3-41ed-4c86-a520-655d1577eca9',)) +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('7392bcf3-41ed-4c86-a520-655d1577eca9',)) completed +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,035 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,036 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:36,036 | INFO | sqlalchemy.engine.Engine | request_id=- | user=anonymous | - - | status=- | duration=- | ROLLBACK +2026-03-21 22:31:36,036 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,036 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,036 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:36,036 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:36,036 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Adding job tentatively -- it will be properly scheduled when the scheduler starts +2026-03-21 22:31:36,036 | DEBUG | tzlocal | request_id=- | user=anonymous | - - | status=- | duration=- | Looking up time zone info from registry +2026-03-21 22:31:36,037 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Adding job tentatively -- it will be properly scheduled when the scheduler starts +2026-03-21 22:31:36,037 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Adding job tentatively -- it will be properly scheduled when the scheduler starts +2026-03-21 22:31:36,037 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Adding job tentatively -- it will be properly scheduled when the scheduler starts +2026-03-21 22:31:36,037 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Adding job tentatively -- it will be properly scheduled when the scheduler starts +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Added job "每日任务分析" to job store "default" +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Added job "论坛指令扫描" to job store "default" +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Added job "知识图谱重建" to job store "default" +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Added job "每日标签生成" to job store "default" +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Added job "每日待办生成" to job store "default" +2026-03-21 22:31:36,038 | INFO | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Scheduler started +2026-03-21 22:31:36,038 | INFO | app.services.scheduler_service | request_id=- | user=anonymous | - - | status=- | duration=- | [Scheduler] 定时任务调度器已启动 +2026-03-21 22:31:36,038 | DEBUG | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Looking for jobs to run +2026-03-21 22:31:36,038 | DEBUG | apscheduler.scheduler | request_id=- | user=anonymous | - - | status=- | duration=- | Next wakeup is due at 2026-03-21 23:31:36.037238+08:00 (in 3599.998498 seconds) +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:9527 (Press CTRL+C to quit) +2026-03-21 22:31:39,118 | INFO | jarvis.request | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | request_started +2026-03-21 22:31:39,119 | INFO | jarvis.request | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=200 | duration=0 | request_completed +2026-03-21 22:31:39,120 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,120 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,120 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,121 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:39,121 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:39,121 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:39,121 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:39,121 INFO sqlalchemy.engine.Engine [cached since 3.096s ago] ('info', 'system', None, 'd1f4d760-4dde-4ac2-bdaf-119766daaa98', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'bea8e985-9530-448b-8c90-ca70c25c1935', '2026-03-21 14:31:39.121705', '2026-03-21 14:31:39.121709') +2026-03-21 22:31:39,121 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | [cached since 3.096s ago] ('info', 'system', None, 'd1f4d760-4dde-4ac2-bdaf-119766daaa98', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'bea8e985-9530-448b-8c90-ca70c25c1935', '2026-03-21 14:31:39.121705', '2026-03-21 14:31:39.121709') +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,121 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'd1f4d760-4dde-4ac2-bdaf-119766daaa98', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'bea8e985-9530-448b-8c90-ca70c25c1935', '2026-03-21 14:31:39.121705', '2026-03-21 14:31:39.121709')) +2026-03-21 22:31:39,123 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'd1f4d760-4dde-4ac2-bdaf-119766daaa98', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'bea8e985-9530-448b-8c90-ca70c25c1935', '2026-03-21 14:31:39.121705', '2026-03-21 14:31:39.121709')) completed +2026-03-21 22:31:39,123 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,123 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,123 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:39,123 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | COMMIT +2026-03-21 22:31:39,123 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:39,127 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,128 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:39,128 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:39,128 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:39,128 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:39,128 INFO sqlalchemy.engine.Engine [cached since 3.094s ago] ('bea8e985-9530-448b-8c90-ca70c25c1935',) +2026-03-21 22:31:39,128 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | [cached since 3.094s ago] ('bea8e985-9530-448b-8c90-ca70c25c1935',) +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,128 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('bea8e985-9530-448b-8c90-ca70c25c1935',)) +2026-03-21 22:31:39,129 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('bea8e985-9530-448b-8c90-ca70c25c1935',)) completed +2026-03-21 22:31:39,129 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,129 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,129 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,129 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:39,129 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,129 | INFO | sqlalchemy.engine.Engine | request_id=d1f4d760-4dde-4ac2-bdaf-119766daaa98 | user=anonymous | GET /api/health | status=- | duration=- | ROLLBACK +2026-03-21 22:31:39,130 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,130 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:39,130 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:39,130 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,236 | INFO | jarvis.request | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | request_started +2026-03-21 22:31:52,237 | INFO | jarvis.request | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=200 | duration=0 | request_completed +2026-03-21 22:31:52,237 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,237 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,237 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,237 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,238 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,238 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,238 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,238 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,238 INFO sqlalchemy.engine.Engine [cached since 16.21s ago] ('info', 'system', None, 'ebffad48-9f23-47c9-8e84-162ab2150856', '/api/auth/me', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'd95f0a0d-e555-4a9e-83d7-fb48d6f53809', '2026-03-21 14:31:52.238646', '2026-03-21 14:31:52.238650') +2026-03-21 22:31:52,238 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | [cached since 16.21s ago] ('info', 'system', None, 'ebffad48-9f23-47c9-8e84-162ab2150856', '/api/auth/me', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'd95f0a0d-e555-4a9e-83d7-fb48d6f53809', '2026-03-21 14:31:52.238646', '2026-03-21 14:31:52.238650') +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,238 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'ebffad48-9f23-47c9-8e84-162ab2150856', '/api/auth/me', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'd95f0a0d-e555-4a9e-83d7-fb48d6f53809', '2026-03-21 14:31:52.238646', '2026-03-21 14:31:52.238650')) +2026-03-21 22:31:52,241 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'ebffad48-9f23-47c9-8e84-162ab2150856', '/api/auth/me', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'd95f0a0d-e555-4a9e-83d7-fb48d6f53809', '2026-03-21 14:31:52.238646', '2026-03-21 14:31:52.238650')) completed +2026-03-21 22:31:52,241 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,241 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,242 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:52,242 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | COMMIT +2026-03-21 22:31:52,242 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,246 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,247 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,247 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,247 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,247 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,248 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,248 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,248 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,248 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,248 INFO sqlalchemy.engine.Engine [cached since 16.21s ago] ('d95f0a0d-e555-4a9e-83d7-fb48d6f53809',) +2026-03-21 22:31:52,248 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | [cached since 16.21s ago] ('d95f0a0d-e555-4a9e-83d7-fb48d6f53809',) +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,248 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('d95f0a0d-e555-4a9e-83d7-fb48d6f53809',)) +2026-03-21 22:31:52,249 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('d95f0a0d-e555-4a9e-83d7-fb48d6f53809',)) completed +2026-03-21 22:31:52,249 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,249 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,249 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,250 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,250 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,250 | INFO | sqlalchemy.engine.Engine | request_id=ebffad48-9f23-47c9-8e84-162ab2150856 | user=anonymous | OPTIONS /api/auth/me | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,250 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,250 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,250 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,250 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,252 | INFO | jarvis.request | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | request_started +2026-03-21 22:31:52,252 | INFO | jarvis.request | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=200 | duration=0 | request_completed +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,253 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,254 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,254 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,254 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,254 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,254 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,254 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,254 INFO sqlalchemy.engine.Engine [cached since 16.23s ago] ('info', 'system', None, 'a4f4fe42-df29-448c-bfa9-609b3a119744', '/api/folders', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '2f185e76-0241-400e-a9ea-2b7c10e9d4e5', '2026-03-21 14:31:52.254443', '2026-03-21 14:31:52.254447') +2026-03-21 22:31:52,254 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | [cached since 16.23s ago] ('info', 'system', None, 'a4f4fe42-df29-448c-bfa9-609b3a119744', '/api/folders', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '2f185e76-0241-400e-a9ea-2b7c10e9d4e5', '2026-03-21 14:31:52.254443', '2026-03-21 14:31:52.254447') +2026-03-21 22:31:52,254 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,254 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,254 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'a4f4fe42-df29-448c-bfa9-609b3a119744', '/api/folders', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '2f185e76-0241-400e-a9ea-2b7c10e9d4e5', '2026-03-21 14:31:52.254443', '2026-03-21 14:31:52.254447')) +2026-03-21 22:31:52,256 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'a4f4fe42-df29-448c-bfa9-609b3a119744', '/api/folders', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '2f185e76-0241-400e-a9ea-2b7c10e9d4e5', '2026-03-21 14:31:52.254443', '2026-03-21 14:31:52.254447')) completed +2026-03-21 22:31:52,256 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,256 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,256 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:52,256 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | COMMIT +2026-03-21 22:31:52,257 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,260 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,260 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,260 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,261 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,261 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,261 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,261 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,261 INFO sqlalchemy.engine.Engine [cached since 16.23s ago] ('2f185e76-0241-400e-a9ea-2b7c10e9d4e5',) +2026-03-21 22:31:52,261 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | [cached since 16.23s ago] ('2f185e76-0241-400e-a9ea-2b7c10e9d4e5',) +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,261 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('2f185e76-0241-400e-a9ea-2b7c10e9d4e5',)) +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('2f185e76-0241-400e-a9ea-2b7c10e9d4e5',)) completed +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,262 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,262 | INFO | sqlalchemy.engine.Engine | request_id=a4f4fe42-df29-448c-bfa9-609b3a119744 | user=anonymous | OPTIONS /api/folders | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,262 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,263 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,263 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,266 | INFO | jarvis.request | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | request_started +2026-03-21 22:31:52,272 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,272 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,273 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,273 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,273 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,274 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:52,274 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:52,275 INFO sqlalchemy.engine.Engine [generated in 0.00034s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,275 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | [generated in 0.00034s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,275 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,275 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,275 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:52,276 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:52,276 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,276 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,276 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,276 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,279 | INFO | jarvis.request | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=200 | duration=13 | request_completed +2026-03-21 22:31:52,280 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing .connector at 0x0000025AF7C77530> +2026-03-21 22:31:52,281 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation .connector at 0x0000025AF7C77530> completed +2026-03-21 22:31:52,281 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) +2026-03-21 22:31:52,281 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) completed +2026-03-21 22:31:52,281 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'floor', 1, , deterministic=True) +2026-03-21 22:31:52,281 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'floor', 1, , deterministic=True) completed +2026-03-21 22:31:52,282 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,282 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,282 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,282 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,282 INFO sqlalchemy.engine.Engine [cached since 16.26s ago] ('info', 'system', None, '29d55a66-b3a4-44cd-92b2-a53ccbaff313', '/api/auth/me', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 13, 'f225dda1-47d5-4708-b6c9-cce67286bb8c', '2026-03-21 14:31:52.282335', '2026-03-21 14:31:52.282342') +2026-03-21 22:31:52,282 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | [cached since 16.26s ago] ('info', 'system', None, '29d55a66-b3a4-44cd-92b2-a53ccbaff313', '/api/auth/me', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 13, 'f225dda1-47d5-4708-b6c9-cce67286bb8c', '2026-03-21 14:31:52.282335', '2026-03-21 14:31:52.282342') +2026-03-21 22:31:52,282 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,282 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,282 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '29d55a66-b3a4-44cd-92b2-a53ccbaff313', '/api/auth/me', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 13, 'f225dda1-47d5-4708-b6c9-cce67286bb8c', '2026-03-21 14:31:52.282335', '2026-03-21 14:31:52.282342')) +2026-03-21 22:31:52,284 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '29d55a66-b3a4-44cd-92b2-a53ccbaff313', '/api/auth/me', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 13, 'f225dda1-47d5-4708-b6c9-cce67286bb8c', '2026-03-21 14:31:52.282335', '2026-03-21 14:31:52.282342')) completed +2026-03-21 22:31:52,285 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,285 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,285 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:52,285 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | COMMIT +2026-03-21 22:31:52,286 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,289 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,290 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,290 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,290 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,291 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,291 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,291 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,292 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,292 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,292 INFO sqlalchemy.engine.Engine [cached since 16.26s ago] ('f225dda1-47d5-4708-b6c9-cce67286bb8c',) +2026-03-21 22:31:52,292 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | [cached since 16.26s ago] ('f225dda1-47d5-4708-b6c9-cce67286bb8c',) +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('f225dda1-47d5-4708-b6c9-cce67286bb8c',)) +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('f225dda1-47d5-4708-b6c9-cce67286bb8c',)) completed +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,292 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,293 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,293 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,293 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,293 | INFO | sqlalchemy.engine.Engine | request_id=29d55a66-b3a4-44cd-92b2-a53ccbaff313 | user=anonymous | GET /api/auth/me | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,293 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,294 | INFO | jarvis.request | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | request_started +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,296 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,297 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,297 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,297 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,297 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,297 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:52,297 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:52,297 INFO sqlalchemy.engine.Engine [cached since 0.02279s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,297 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | [cached since 0.02279s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,297 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,297 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,297 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:52,298 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:52,298 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,298 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,298 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,298 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,299 INFO sqlalchemy.engine.Engine SELECT folders.user_id, folders.name, folders.parent_id, folders.id, folders.created_at, folders.updated_at +FROM folders +WHERE folders.user_id = ? +2026-03-21 22:31:52,299 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | SELECT folders.user_id, folders.name, folders.parent_id, folders.id, folders.created_at, folders.updated_at +FROM folders +WHERE folders.user_id = ? +2026-03-21 22:31:52,299 INFO sqlalchemy.engine.Engine [generated in 0.00010s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,299 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | [generated in 0.00010s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT folders.user_id, folders.name, folders.parent_id, folders.id, folders.created_at, folders.updated_at \nFROM folders \nWHERE folders.user_id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT folders.user_id, folders.name, folders.parent_id, folders.id, folders.created_at, folders.updated_at \nFROM folders \nWHERE folders.user_id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,299 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,300 | INFO | jarvis.request | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=200 | duration=5 | request_completed +2026-03-21 22:31:52,300 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,300 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,300 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,300 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,300 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,301 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,301 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,301 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,301 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:52,301 INFO sqlalchemy.engine.Engine [cached since 16.28s ago] ('info', 'system', None, 'fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231', '/api/folders', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 5, 'ce15e339-0d7f-4874-8e68-b041c51d9637', '2026-03-21 14:31:52.301377', '2026-03-21 14:31:52.301380') +2026-03-21 22:31:52,301 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | [cached since 16.28s ago] ('info', 'system', None, 'fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231', '/api/folders', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 5, 'ce15e339-0d7f-4874-8e68-b041c51d9637', '2026-03-21 14:31:52.301377', '2026-03-21 14:31:52.301380') +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,301 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231', '/api/folders', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 5, 'ce15e339-0d7f-4874-8e68-b041c51d9637', '2026-03-21 14:31:52.301377', '2026-03-21 14:31:52.301380')) +2026-03-21 22:31:52,303 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231', '/api/folders', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 5, 'ce15e339-0d7f-4874-8e68-b041c51d9637', '2026-03-21 14:31:52.301377', '2026-03-21 14:31:52.301380')) completed +2026-03-21 22:31:52,303 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,303 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,304 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:52,304 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | COMMIT +2026-03-21 22:31:52,304 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,307 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,307 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,308 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,309 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:52,309 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:52,309 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,309 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:52,309 INFO sqlalchemy.engine.Engine [cached since 16.27s ago] ('ce15e339-0d7f-4874-8e68-b041c51d9637',) +2026-03-21 22:31:52,309 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | [cached since 16.27s ago] ('ce15e339-0d7f-4874-8e68-b041c51d9637',) +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('ce15e339-0d7f-4874-8e68-b041c51d9637',)) +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('ce15e339-0d7f-4874-8e68-b041c51d9637',)) completed +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,309 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,310 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,310 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,310 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:52,310 | INFO | sqlalchemy.engine.Engine | request_id=fb5bfb19-7f67-4ff9-8cd3-c86e9f3dd231 | user=anonymous | GET /api/folders | status=- | duration=- | ROLLBACK +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:52,310 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,716 | INFO | jarvis.request | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | request_started +2026-03-21 22:31:53,716 | INFO | jarvis.request | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | request_started +2026-03-21 22:31:53,716 | INFO | jarvis.request | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=200 | duration=0 | request_completed +2026-03-21 22:31:53,717 | INFO | jarvis.request | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=200 | duration=0 | request_completed +2026-03-21 22:31:53,717 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,717 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,718 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine [cached since 17.69s ago] ('info', 'system', None, 'f44bb830-16a1-4bfc-9b56-49fe788943d0', '/api/conversations', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'c13fd798-8f86-4015-b5d8-89b8771b2a0d', '2026-03-21 14:31:53.719586', '2026-03-21 14:31:53.719591') +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | [cached since 17.69s ago] ('info', 'system', None, 'f44bb830-16a1-4bfc-9b56-49fe788943d0', '/api/conversations', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'c13fd798-8f86-4015-b5d8-89b8771b2a0d', '2026-03-21 14:31:53.719586', '2026-03-21 14:31:53.719591') +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,719 INFO sqlalchemy.engine.Engine [cached since 17.69s ago] ('info', 'system', None, '9c6f90bf-f1b2-446e-9175-3937f4aa7141', '/api/settings', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '3cbaec52-ed9a-4796-8154-c416a83137da', '2026-03-21 14:31:53.719841', '2026-03-21 14:31:53.719843') +2026-03-21 22:31:53,719 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,719 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | [cached since 17.69s ago] ('info', 'system', None, '9c6f90bf-f1b2-446e-9175-3937f4aa7141', '/api/settings', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '3cbaec52-ed9a-4796-8154-c416a83137da', '2026-03-21 14:31:53.719841', '2026-03-21 14:31:53.719843') +2026-03-21 22:31:53,720 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,720 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,720 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'f44bb830-16a1-4bfc-9b56-49fe788943d0', '/api/conversations', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'c13fd798-8f86-4015-b5d8-89b8771b2a0d', '2026-03-21 14:31:53.719586', '2026-03-21 14:31:53.719591')) +2026-03-21 22:31:53,720 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,720 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '9c6f90bf-f1b2-446e-9175-3937f4aa7141', '/api/settings', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '3cbaec52-ed9a-4796-8154-c416a83137da', '2026-03-21 14:31:53.719841', '2026-03-21 14:31:53.719843')) +2026-03-21 22:31:53,725 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '9c6f90bf-f1b2-446e-9175-3937f4aa7141', '/api/settings', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '3cbaec52-ed9a-4796-8154-c416a83137da', '2026-03-21 14:31:53.719841', '2026-03-21 14:31:53.719843')) completed +2026-03-21 22:31:53,725 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,725 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,725 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:53,725 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | COMMIT +2026-03-21 22:31:53,725 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,728 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,729 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,729 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,729 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,730 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,730 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,730 INFO sqlalchemy.engine.Engine [cached since 17.7s ago] ('3cbaec52-ed9a-4796-8154-c416a83137da',) +2026-03-21 22:31:53,730 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | [cached since 17.7s ago] ('3cbaec52-ed9a-4796-8154-c416a83137da',) +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('3cbaec52-ed9a-4796-8154-c416a83137da',)) +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('3cbaec52-ed9a-4796-8154-c416a83137da',)) completed +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,730 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,731 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,731 | INFO | sqlalchemy.engine.Engine | request_id=9c6f90bf-f1b2-446e-9175-3937f4aa7141 | user=anonymous | OPTIONS /api/settings | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,731 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,731 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,731 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,731 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,732 | INFO | jarvis.request | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | request_started +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,734 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,734 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,734 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,734 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,734 INFO sqlalchemy.engine.Engine [cached since 1.46s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,734 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | [cached since 1.46s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,734 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,735 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,735 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,735 INFO sqlalchemy.engine.Engine [cached since 1.461s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,735 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | [cached since 1.461s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,735 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,736 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,736 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,736 INFO sqlalchemy.engine.Engine [cached since 17.71s ago] ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'settings.get', '加载用户设置', '{"llm_config": {"chat": {"count": 1, "items": [{"name": "Minimax", "provider": "openai", "model": "MiniMax-M2.7-highspeed", "has_base_url": true, "has_api_key": true, "enabled": true}]}, "vlm": {"count": 0, "items": []}, "embedding": {"count": 0, "items": []}, "rerank": {"count": 0, "items": []}}}', 'settings', None, 'e33570fd-4321-49a8-a0c0-78c08cfab294', '2026-03-21 14:31:53.736734', '2026-03-21 14:31:53.736737') +2026-03-21 22:31:53,736 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | [cached since 17.71s ago] ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'settings.get', '加载用户设置', '{"llm_config": {"chat": {"count": 1, "items": [{"name": "Minimax", "provider": "openai", "model": "MiniMax-M2.7-highspeed", "has_base_url": true, "has_api_key": true, "enabled": true}]}, "vlm": {"count": 0, "items": []}, "embedding": {"count": 0, "items": []}, "rerank": {"count": 0, "items": []}}}', 'settings', None, 'e33570fd-4321-49a8-a0c0-78c08cfab294', '2026-03-21 14:31:53.736734', '2026-03-21 14:31:53.736737') +2026-03-21 22:31:53,736 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,737 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,737 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'settings.get', '加载用户设置', '{"llm_config": {"chat": {"count": 1, "items": [{"name": "Minimax", "provider": "openai", "model": "MiniMax-M2.7-highspeed", "has_base_url": true, "has_api_key": true, "enabled": true}]}, "vlm": {"count": 0, "items": []}, "embedding": {"count": 0, "items": []}, "rerank": {"count": 0, "items": []}}}', 'settings', None, 'e33570fd-4321-49a8-a0c0-78c08cfab294', '2026-03-21 14:31:53.736734', '2026-03-21 14:31:53.736737')) +2026-03-21 22:31:53,738 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'settings.get', '加载用户设置', '{"llm_config": {"chat": {"count": 1, "items": [{"name": "Minimax", "provider": "openai", "model": "MiniMax-M2.7-highspeed", "has_base_url": true, "has_api_key": true, "enabled": true}]}, "vlm": {"count": 0, "items": []}, "embedding": {"count": 0, "items": []}, "rerank": {"count": 0, "items": []}}}', 'settings', None, 'e33570fd-4321-49a8-a0c0-78c08cfab294', '2026-03-21 14:31:53.736734', '2026-03-21 14:31:53.736737')) completed +2026-03-21 22:31:53,739 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,739 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:53,739 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,739 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | COMMIT +2026-03-21 22:31:53,739 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,742 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,743 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,743 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,743 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,743 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,744 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,744 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,744 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,744 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,744 INFO sqlalchemy.engine.Engine [cached since 17.71s ago] ('e33570fd-4321-49a8-a0c0-78c08cfab294',) +2026-03-21 22:31:53,744 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | [cached since 17.71s ago] ('e33570fd-4321-49a8-a0c0-78c08cfab294',) +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('e33570fd-4321-49a8-a0c0-78c08cfab294',)) +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('e33570fd-4321-49a8-a0c0-78c08cfab294',)) completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,744 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,745 | INFO | jarvis.request | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=200 | duration=12 | request_completed +2026-03-21 22:31:53,746 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing .connector at 0x0000025AF7CA52D0> +2026-03-21 22:31:53,746 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation .connector at 0x0000025AF7CA52D0> completed +2026-03-21 22:31:53,747 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) +2026-03-21 22:31:53,747 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'regexp', 2, .regexp at 0x0000025AB72EEE50>, deterministic=True) completed +2026-03-21 22:31:53,747 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'floor', 1, , deterministic=True) +2026-03-21 22:31:53,747 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'floor', 1, , deterministic=True) completed +2026-03-21 22:31:53,747 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,747 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,747 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,747 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,747 INFO sqlalchemy.engine.Engine [cached since 17.72s ago] ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 12, '0e21db21-4907-453e-9173-d3cdc2c78e69', '2026-03-21 14:31:53.747832', '2026-03-21 14:31:53.747835') +2026-03-21 22:31:53,747 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | [cached since 17.72s ago] ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 12, '0e21db21-4907-453e-9173-d3cdc2c78e69', '2026-03-21 14:31:53.747832', '2026-03-21 14:31:53.747835') +2026-03-21 22:31:53,747 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,748 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,748 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 12, '0e21db21-4907-453e-9173-d3cdc2c78e69', '2026-03-21 14:31:53.747832', '2026-03-21 14:31:53.747835')) +2026-03-21 22:31:53,750 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '69a5d77f-b6d0-4c49-9bd9-e0fd64513047', '/api/settings', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 12, '0e21db21-4907-453e-9173-d3cdc2c78e69', '2026-03-21 14:31:53.747832', '2026-03-21 14:31:53.747835')) completed +2026-03-21 22:31:53,750 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,750 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,750 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:53,750 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | COMMIT +2026-03-21 22:31:53,750 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,753 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,754 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,754 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,755 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,755 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,755 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,755 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,755 INFO sqlalchemy.engine.Engine [cached since 17.72s ago] ('0e21db21-4907-453e-9173-d3cdc2c78e69',) +2026-03-21 22:31:53,755 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | [cached since 17.72s ago] ('0e21db21-4907-453e-9173-d3cdc2c78e69',) +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('0e21db21-4907-453e-9173-d3cdc2c78e69',)) +2026-03-21 22:31:53,755 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('0e21db21-4907-453e-9173-d3cdc2c78e69',)) completed +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,756 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,756 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=3fcb0909-8572-4ce5-8df0-907b0e35915d | GET /api/settings | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,756 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,757 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,757 | INFO | sqlalchemy.engine.Engine | request_id=69a5d77f-b6d0-4c49-9bd9-e0fd64513047 | user=anonymous | GET /api/settings | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,757 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,757 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,757 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,757 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,770 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'f44bb830-16a1-4bfc-9b56-49fe788943d0', '/api/conversations', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'c13fd798-8f86-4015-b5d8-89b8771b2a0d', '2026-03-21 14:31:53.719586', '2026-03-21 14:31:53.719591')) completed +2026-03-21 22:31:53,770 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,770 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,771 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:53,771 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | COMMIT +2026-03-21 22:31:53,771 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,774 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,774 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,774 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,774 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,774 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,775 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,775 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,775 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,775 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,775 INFO sqlalchemy.engine.Engine [cached since 17.74s ago] ('c13fd798-8f86-4015-b5d8-89b8771b2a0d',) +2026-03-21 22:31:53,775 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | [cached since 17.74s ago] ('c13fd798-8f86-4015-b5d8-89b8771b2a0d',) +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('c13fd798-8f86-4015-b5d8-89b8771b2a0d',)) +2026-03-21 22:31:53,775 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('c13fd798-8f86-4015-b5d8-89b8771b2a0d',)) completed +2026-03-21 22:31:53,776 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,776 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,776 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,776 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,776 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,776 | INFO | sqlalchemy.engine.Engine | request_id=f44bb830-16a1-4bfc-9b56-49fe788943d0 | user=anonymous | OPTIONS /api/conversations | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,776 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,777 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,777 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,777 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,778 | INFO | jarvis.request | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | request_started +2026-03-21 22:31:53,779 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,779 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,779 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,779 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,780 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,780 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,780 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,780 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:53,780 INFO sqlalchemy.engine.Engine [cached since 1.506s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,780 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | [cached since 1.506s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,780 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,782 INFO sqlalchemy.engine.Engine SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at +FROM conversations +WHERE conversations.user_id = ? ORDER BY conversations.updated_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:31:53,782 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at +FROM conversations +WHERE conversations.user_id = ? ORDER BY conversations.updated_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:31:53,783 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', 50, 0) +2026-03-21 22:31:53,783 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | [generated in 0.00011s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', 50, 0) +2026-03-21 22:31:53,783 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,783 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,783 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at \nFROM conversations \nWHERE conversations.user_id = ? ORDER BY conversations.updated_at DESC\n LIMIT ? OFFSET ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', 50, 0)) +2026-03-21 22:31:53,783 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at \nFROM conversations \nWHERE conversations.user_id = ? ORDER BY conversations.updated_at DESC\n LIMIT ? OFFSET ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', 50, 0)) completed +2026-03-21 22:31:53,783 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,784 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,784 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,785 | INFO | jarvis.request | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=200 | duration=6 | request_completed +2026-03-21 22:31:53,785 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,786 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,786 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,786 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,786 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,786 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,787 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,787 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,787 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,787 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,787 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,788 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,788 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:53,788 INFO sqlalchemy.engine.Engine [cached since 17.76s ago] ('info', 'system', None, '57a2fb18-723c-4b18-933a-55605532992b', '/api/conversations', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 6, '6a56eb35-83cf-4f30-a452-23fbc4565485', '2026-03-21 14:31:53.788016', '2026-03-21 14:31:53.788021') +2026-03-21 22:31:53,788 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | [cached since 17.76s ago] ('info', 'system', None, '57a2fb18-723c-4b18-933a-55605532992b', '/api/conversations', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 6, '6a56eb35-83cf-4f30-a452-23fbc4565485', '2026-03-21 14:31:53.788016', '2026-03-21 14:31:53.788021') +2026-03-21 22:31:53,788 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,788 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,788 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '57a2fb18-723c-4b18-933a-55605532992b', '/api/conversations', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 6, '6a56eb35-83cf-4f30-a452-23fbc4565485', '2026-03-21 14:31:53.788016', '2026-03-21 14:31:53.788021')) +2026-03-21 22:31:53,790 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '57a2fb18-723c-4b18-933a-55605532992b', '/api/conversations', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 6, '6a56eb35-83cf-4f30-a452-23fbc4565485', '2026-03-21 14:31:53.788016', '2026-03-21 14:31:53.788021')) completed +2026-03-21 22:31:53,790 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,790 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,791 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:53,791 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | COMMIT +2026-03-21 22:31:53,791 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,795 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,795 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,795 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,796 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,797 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,797 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:53,797 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:53,797 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,797 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:53,797 INFO sqlalchemy.engine.Engine [cached since 17.76s ago] ('6a56eb35-83cf-4f30-a452-23fbc4565485',) +2026-03-21 22:31:53,797 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | [cached since 17.76s ago] ('6a56eb35-83cf-4f30-a452-23fbc4565485',) +2026-03-21 22:31:53,797 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,797 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,797 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('6a56eb35-83cf-4f30-a452-23fbc4565485',)) +2026-03-21 22:31:53,798 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('6a56eb35-83cf-4f30-a452-23fbc4565485',)) completed +2026-03-21 22:31:53,798 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,798 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,798 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,798 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,799 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,799 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,799 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,799 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,799 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,799 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,799 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:53,799 | INFO | sqlalchemy.engine.Engine | request_id=57a2fb18-723c-4b18-933a-55605532992b | user=anonymous | GET /api/conversations | status=- | duration=- | ROLLBACK +2026-03-21 22:31:53,799 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,800 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:53,800 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:53,800 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,858 | INFO | jarvis.request | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | request_started +2026-03-21 22:31:59,859 | INFO | jarvis.request | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=200 | duration=0 | request_completed +2026-03-21 22:31:59,859 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,859 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,859 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,860 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:59,860 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:59,860 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,860 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,860 INFO sqlalchemy.engine.Engine [cached since 23.83s ago] ('info', 'system', None, 'c74d4e54-848e-41f8-863a-0a2e0eff91c0', '/api/conversations/chat', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '4396af52-3f98-46cb-8a35-512d5f565239', '2026-03-21 14:31:59.860636', '2026-03-21 14:31:59.860642') +2026-03-21 22:31:59,860 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | [cached since 23.83s ago] ('info', 'system', None, 'c74d4e54-848e-41f8-863a-0a2e0eff91c0', '/api/conversations/chat', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '4396af52-3f98-46cb-8a35-512d5f565239', '2026-03-21 14:31:59.860636', '2026-03-21 14:31:59.860642') +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,860 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'c74d4e54-848e-41f8-863a-0a2e0eff91c0', '/api/conversations/chat', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '4396af52-3f98-46cb-8a35-512d5f565239', '2026-03-21 14:31:59.860636', '2026-03-21 14:31:59.860642')) +2026-03-21 22:31:59,865 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'c74d4e54-848e-41f8-863a-0a2e0eff91c0', '/api/conversations/chat', 'OPTIONS', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, '4396af52-3f98-46cb-8a35-512d5f565239', '2026-03-21 14:31:59.860636', '2026-03-21 14:31:59.860642')) completed +2026-03-21 22:31:59,866 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,866 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,866 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:59,866 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | COMMIT +2026-03-21 22:31:59,866 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,870 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,870 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,870 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,871 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,871 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:59,871 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:59,872 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:59,872 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:31:59,872 INFO sqlalchemy.engine.Engine [cached since 23.84s ago] ('4396af52-3f98-46cb-8a35-512d5f565239',) +2026-03-21 22:31:59,872 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | [cached since 23.84s ago] ('4396af52-3f98-46cb-8a35-512d5f565239',) +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('4396af52-3f98-46cb-8a35-512d5f565239',)) +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('4396af52-3f98-46cb-8a35-512d5f565239',)) completed +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,872 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,873 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,873 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:59,873 | INFO | sqlalchemy.engine.Engine | request_id=c74d4e54-848e-41f8-863a-0a2e0eff91c0 | user=anonymous | OPTIONS /api/conversations/chat | status=- | duration=- | ROLLBACK +2026-03-21 22:31:59,873 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,873 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,873 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,873 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,874 | INFO | jarvis.request | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | request_started +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,876 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:59,876 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:59,876 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:59,876 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:31:59,876 INFO sqlalchemy.engine.Engine [cached since 7.602s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:59,876 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [cached since 7.602s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,876 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,877 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,878 INFO sqlalchemy.engine.Engine INSERT INTO conversations (user_id, title, message_count, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,878 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | INSERT INTO conversations (user_id, title, message_count, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,878 INFO sqlalchemy.engine.Engine [generated in 0.00023s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '你好', 0, '53a2b966-c82b-4b23-b710-3eb4b9ad4b59', '2026-03-21 14:31:59.878497', '2026-03-21 14:31:59.878500') +2026-03-21 22:31:59,878 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [generated in 0.00023s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '你好', 0, '53a2b966-c82b-4b23-b710-3eb4b9ad4b59', '2026-03-21 14:31:59.878497', '2026-03-21 14:31:59.878500') +2026-03-21 22:31:59,878 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,878 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,879 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO conversations (user_id, title, message_count, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '你好', 0, '53a2b966-c82b-4b23-b710-3eb4b9ad4b59', '2026-03-21 14:31:59.878497', '2026-03-21 14:31:59.878500')) +2026-03-21 22:31:59,880 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO conversations (user_id, title, message_count, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '你好', 0, '53a2b966-c82b-4b23-b710-3eb4b9ad4b59', '2026-03-21 14:31:59.878497', '2026-03-21 14:31:59.878500')) completed +2026-03-21 22:31:59,880 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,880 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,881 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:31:59,881 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | COMMIT +2026-03-21 22:31:59,881 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,885 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,885 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,886 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,887 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,887 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,887 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:31:59,887 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:31:59,887 INFO sqlalchemy.engine.Engine SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at +FROM conversations +WHERE conversations.id = ? +2026-03-21 22:31:59,887 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at +FROM conversations +WHERE conversations.id = ? +2026-03-21 22:31:59,887 INFO sqlalchemy.engine.Engine [generated in 0.00012s] ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59',) +2026-03-21 22:31:59,887 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [generated in 0.00012s] ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59',) +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at \nFROM conversations \nWHERE conversations.id = ?', ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59',)) +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT conversations.user_id, conversations.title, conversations.message_count, conversations.id, conversations.created_at, conversations.updated_at \nFROM conversations \nWHERE conversations.id = ?', ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59',)) completed +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,888 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,889 INFO sqlalchemy.engine.Engine INSERT INTO messages (conversation_id, role, content, model, tokens_used, attachments, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,889 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | INSERT INTO messages (conversation_id, role, content, model, tokens_used, attachments, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:31:59,889 INFO sqlalchemy.engine.Engine [generated in 0.00019s] ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59', 'user', '你好', None, None, 'null', '24cf1a4b-d7b0-48e9-92af-a92dc76b972a', '2026-03-21 14:31:59.889818', '2026-03-21 14:31:59.889822') +2026-03-21 22:31:59,889 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [generated in 0.00019s] ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59', 'user', '你好', None, None, 'null', '24cf1a4b-d7b0-48e9-92af-a92dc76b972a', '2026-03-21 14:31:59.889818', '2026-03-21 14:31:59.889822') +2026-03-21 22:31:59,890 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,890 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,890 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO messages (conversation_id, role, content, model, tokens_used, attachments, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59', 'user', '你好', None, None, 'null', '24cf1a4b-d7b0-48e9-92af-a92dc76b972a', '2026-03-21 14:31:59.889818', '2026-03-21 14:31:59.889822')) +2026-03-21 22:31:59,890 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | returning exception table messages has no column named attachments +2026-03-21 22:31:59,890 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:31:59,890 | INFO | sqlalchemy.engine.Engine | request_id=85afe0ba-8c68-4d0f-9b31-1ccc4c5927b7 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | ROLLBACK +2026-03-21 22:31:59,890 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,891 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,891 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:31:59,891 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:31:59,916 | ERROR | jarvis.request | request_id=- | user=anonymous | - - | status=500 | duration=- | unhandled_exception +ERROR: Exception in ASGI application +Traceback (most recent call last): + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1967, in _exec_single_context + self.dialect.do_execute( + ~~~~~~~~~~~~~~~~~~~~~~~^ + cursor, str_statement, effective_parameters, context + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\default.py", line 952, in do_execute + cursor.execute(statement, parameters) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 182, in execute + self._adapt_connection._handle_exception(error) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 342, in _handle_exception + raise error + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 164, in execute + self.await_(_cursor.execute(operation, parameters)) + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\cursor.py", line 40, in execute + await self._execute(self._cursor.execute, sql, parameters) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\cursor.py", line 32, in _execute + return await self._conn._execute(fn, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\core.py", line 160, in _execute + return await future + ^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\core.py", line 63, in _connection_worker_thread + result = function() +sqlite3.OperationalError: table messages has no column named attachments + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\uvicorn\protocols\http\httptools_impl.py", line 416, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + self.scope, self.receive, self.send + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\applications.py", line 1160, in __call__ + await super().__call__(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\applications.py", line 107, in __call__ + await self.middleware_stack(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\errors.py", line 186, in __call__ + raise exc + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\base.py", line 191, in __call__ + with recv_stream, send_stream, collapse_excgroups(): + ~~~~~~~~~~~~~~~~~~^^ + File "C:\Python314\Lib\contextlib.py", line 162, in __exit__ + self.gen.throw(value) + ~~~~~~~~~~~~~~^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\_utils.py", line 87, in collapse_excgroups + raise exc + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\base.py", line 193, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Code\Project\Jarvis\backend\app\logging_utils.py", line 165, in request_logging_middleware + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\base.py", line 168, in call_next + raise app_exc from app_exc.__cause__ or app_exc.__context__ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\base.py", line 144, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\cors.py", line 95, in __call__ + await self.simple_response(scope, receive, send, request_headers=headers) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\cors.py", line 153, in simple_response + await self.app(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\middleware\exceptions.py", line 63, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + raise exc + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__ + await self.app(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\routing.py", line 716, in __call__ + await self.middleware_stack(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\routing.py", line 736, in app + await route.handle(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\routing.py", line 290, in handle + await self.app(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\routing.py", line 130, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app + raise exc + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\routing.py", line 116, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\routing.py", line 670, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<3 lines>... + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\fastapi\routing.py", line 324, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Code\Project\Jarvis\backend\app\routers\conversation.py", line 95, in chat + conv_id, msg_id, content, model_name = await agent_svc.chat_simple( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ...<5 lines>... + ) + ^ + File "D:\Code\Project\Jarvis\backend\app\services\agent_service.py", line 277, in chat_simple + await self.db.commit() + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\ext\asyncio\session.py", line 1000, in commit + await greenlet_spawn(self.sync_session.commit) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 203, in greenlet_spawn + result = context.switch(value) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 2030, in commit + trans.commit(_to_root=True) + ~~~~~~~~~~~~^^^^^^^^^^^^^^^ + File "", line 2, in commit + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go + ret_value = fn(self, *arg, **kw) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 1311, in commit + self._prepare_impl() + ~~~~~~~~~~~~~~~~~~^^ + File "", line 2, in _prepare_impl + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go + ret_value = fn(self, *arg, **kw) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 1286, in _prepare_impl + self.session.flush() + ~~~~~~~~~~~~~~~~~~^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 4331, in flush + self._flush(objects) + ~~~~~~~~~~~^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 4466, in _flush + with util.safe_reraise(): + ~~~~~~~~~~~~~~~~~^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\langhelpers.py", line 121, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\session.py", line 4427, in _flush + flush_context.execute() + ~~~~~~~~~~~~~~~~~~~~~^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\unitofwork.py", line 466, in execute + rec.execute(self) + ~~~~~~~~~~~^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\unitofwork.py", line 642, in execute + util.preloaded.orm_persistence.save_obj( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + self.mapper, + ^^^^^^^^^^^^ + uow.states_for_mapper_hierarchy(self.mapper, False, False), + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + uow, + ^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\persistence.py", line 93, in save_obj + _emit_insert_statements( + ~~~~~~~~~~~~~~~~~~~~~~~^ + base_mapper, + ^^^^^^^^^^^^ + ...<3 lines>... + insert, + ^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\orm\persistence.py", line 1233, in _emit_insert_statements + result = connection.execute( + statement, + params, + execution_options=execution_options, + ) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1419, in execute + return meth( + self, + distilled_parameters, + execution_options or NO_OPTIONS, + ) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\sql\elements.py", line 527, in _execute_on_connection + return connection._execute_clauseelement( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + self, distilled_params, execution_options + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1641, in _execute_clauseelement + ret = self._execute_context( + dialect, + ...<8 lines>... + cache_hit=cache_hit, + ) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1846, in _execute_context + return self._exec_single_context( + ~~~~~~~~~~~~~~~~~~~~~~~~~^ + dialect, context, statement, parameters + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1986, in _exec_single_context + self._handle_dbapi_exception( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + e, str_statement, effective_parameters, cursor, context + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 2363, in _handle_dbapi_exception + raise sqlalchemy_exception.with_traceback(exc_info[2]) from e + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\base.py", line 1967, in _exec_single_context + self.dialect.do_execute( + ~~~~~~~~~~~~~~~~~~~~~~~^ + cursor, str_statement, effective_parameters, context + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + ^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\engine\default.py", line 952, in do_execute + cursor.execute(statement, parameters) + ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 182, in execute + self._adapt_connection._handle_exception(error) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 342, in _handle_exception + raise error + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\dialects\sqlite\aiosqlite.py", line 164, in execute + self.await_(_cursor.execute(operation, parameters)) + ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\cursor.py", line 40, in execute + await self._execute(self._cursor.execute, sql, parameters) + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\cursor.py", line 32, in _execute + return await self._conn._execute(fn, *args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\core.py", line 160, in _execute + return await future + ^^^^^^^^^^^^ + File "C:\Users\caoxiaozhu\AppData\Roaming\Python\Python314\site-packages\aiosqlite\core.py", line 63, in _connection_worker_thread + result = function() +sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table messages has no column named attachments +[SQL: INSERT INTO messages (conversation_id, role, content, model, tokens_used, attachments, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)] +[parameters: ('53a2b966-c82b-4b23-b710-3eb4b9ad4b59', 'user', '你好', None, None, 'null', '24cf1a4b-d7b0-48e9-92af-a92dc76b972a', '2026-03-21 14:31:59.889818', '2026-03-21 14:31:59.889822')] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-03-21 22:32:17,443 | INFO | jarvis.request | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | request_started +2026-03-21 22:32:17,443 | INFO | jarvis.request | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=200 | duration=0 | request_completed +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,444 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,445 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,445 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:17,445 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:17,445 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:32:17,445 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:32:17,445 INFO sqlalchemy.engine.Engine [cached since 41.42s ago] ('info', 'system', None, 'c517ccde-19f8-418c-83c7-b76b68a532d7', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'ff4e8cb2-0ad0-47d8-bc57-7d894a386af9', '2026-03-21 14:32:17.445475', '2026-03-21 14:32:17.445480') +2026-03-21 22:32:17,445 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | [cached since 41.42s ago] ('info', 'system', None, 'c517ccde-19f8-418c-83c7-b76b68a532d7', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'ff4e8cb2-0ad0-47d8-bc57-7d894a386af9', '2026-03-21 14:32:17.445475', '2026-03-21 14:32:17.445480') +2026-03-21 22:32:17,445 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,445 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,445 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'c517ccde-19f8-418c-83c7-b76b68a532d7', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'ff4e8cb2-0ad0-47d8-bc57-7d894a386af9', '2026-03-21 14:32:17.445475', '2026-03-21 14:32:17.445480')) +2026-03-21 22:32:17,448 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, 'c517ccde-19f8-418c-83c7-b76b68a532d7', '/api/health', 'GET', 200, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'ff4e8cb2-0ad0-47d8-bc57-7d894a386af9', '2026-03-21 14:32:17.445475', '2026-03-21 14:32:17.445480')) completed +2026-03-21 22:32:17,448 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,448 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,448 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:32:17,448 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | COMMIT +2026-03-21 22:32:17,448 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,459 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,459 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,459 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,460 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,460 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:17,460 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:17,461 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:32:17,461 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:32:17,461 INFO sqlalchemy.engine.Engine [cached since 41.43s ago] ('ff4e8cb2-0ad0-47d8-bc57-7d894a386af9',) +2026-03-21 22:32:17,461 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | [cached since 41.43s ago] ('ff4e8cb2-0ad0-47d8-bc57-7d894a386af9',) +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('ff4e8cb2-0ad0-47d8-bc57-7d894a386af9',)) +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('ff4e8cb2-0ad0-47d8-bc57-7d894a386af9',)) completed +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,461 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,462 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:32:17,462 | INFO | sqlalchemy.engine.Engine | request_id=c517ccde-19f8-418c-83c7-b76b68a532d7 | user=anonymous | GET /api/health | status=- | duration=- | ROLLBACK +2026-03-21 22:32:17,462 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,462 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:17,462 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:17,462 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,495 | INFO | jarvis.request | request_id=4f397011-0872-43fb-868b-38710d872696 | user=anonymous | OPTIONS /api/logs | status=- | duration=- | request_started +2026-03-21 22:32:43,496 | INFO | jarvis.request | request_id=4f397011-0872-43fb-868b-38710d872696 | user=anonymous | OPTIONS /api/logs | status=200 | duration=0 | request_completed +2026-03-21 22:32:43,497 | INFO | jarvis.request | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | request_started +2026-03-21 22:32:43,498 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,499 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:43,499 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:43,499 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:32:43,499 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:32:43,499 INFO sqlalchemy.engine.Engine [cached since 51.23s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:32:43,499 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | [cached since 51.23s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:32:43,499 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,500 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,503 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:32:43,503 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,503 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:32:43,503 INFO sqlalchemy.engine.Engine [generated in 0.00021s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:32:43,503 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | [generated in 0.00021s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:32:43,503 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,503 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,503 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) +2026-03-21 22:32:43,504 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) completed +2026-03-21 22:32:43,504 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,504 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,504 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,504 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,506 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:32:43,506 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:32:43,506 INFO sqlalchemy.engine.Engine [generated in 0.00017s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0) +2026-03-21 22:32:43,506 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | [generated in 0.00017s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0) +2026-03-21 22:32:43,506 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,506 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,506 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC\n LIMIT ? OFFSET ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0)) +2026-03-21 22:32:43,507 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC\n LIMIT ? OFFSET ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0)) completed +2026-03-21 22:32:43,507 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,507 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,507 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,507 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,509 | INFO | jarvis.request | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=200 | duration=12 | request_completed +2026-03-21 22:32:43,510 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:32:43,510 | INFO | sqlalchemy.engine.Engine | request_id=b1c64593-0580-49c9-bdcb-a5a516499bf9 | user=anonymous | GET /api/logs | status=- | duration=- | ROLLBACK +2026-03-21 22:32:43,510 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,510 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,510 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,510 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,511 | INFO | jarvis.request | request_id=4cc4cb4d-dfb8-4030-9614-2440a39d97e2 | user=anonymous | OPTIONS /api/logs/stats | status=- | duration=- | request_started +2026-03-21 22:32:43,511 | INFO | jarvis.request | request_id=4cc4cb4d-dfb8-4030-9614-2440a39d97e2 | user=anonymous | OPTIONS /api/logs/stats | status=200 | duration=0 | request_completed +2026-03-21 22:32:43,513 | INFO | jarvis.request | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | request_started +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,514 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,515 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:43,515 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:43,515 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:32:43,515 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:32:43,515 INFO sqlalchemy.engine.Engine [cached since 51.24s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:32:43,515 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 51.24s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:32:43,515 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:32:43,516 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,516 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,516 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,516 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,517 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:32:43,517 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:32:43,517 INFO sqlalchemy.engine.Engine [cached since 0.01419s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:32:43,517 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.01419s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:32:43,517 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,517 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,517 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) +2026-03-21 22:32:43,517 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) completed +2026-03-21 22:32:43,518 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,518 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,518 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,518 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,519 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,519 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,519 INFO sqlalchemy.engine.Engine [generated in 0.00030s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent') +2026-03-21 22:32:43,519 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [generated in 0.00030s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent') +2026-03-21 22:32:43,519 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,519 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent')) +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent')) completed +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,520 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,521 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,521 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,521 INFO sqlalchemy.engine.Engine [cached since 0.002281s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system') +2026-03-21 22:32:43,521 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.002281s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system') +2026-03-21 22:32:43,521 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,521 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,521 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system')) +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system')) completed +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,522 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,522 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:32:43,522 INFO sqlalchemy.engine.Engine [cached since 0.003512s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:32:43,522 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.003512s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:32:43,522 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) completed +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,523 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,524 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,524 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,524 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'debug') +2026-03-21 22:32:43,524 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [generated in 0.00015s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'debug') +2026-03-21 22:32:43,524 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,524 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'debug')) +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'debug')) completed +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,525 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,526 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,526 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,527 INFO sqlalchemy.engine.Engine [cached since 0.00248s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'info') +2026-03-21 22:32:43,527 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.00248s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'info') +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'info')) +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'info')) completed +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,527 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,528 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,528 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,528 INFO sqlalchemy.engine.Engine [cached since 0.003746s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'warning') +2026-03-21 22:32:43,528 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.003746s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'warning') +2026-03-21 22:32:43,528 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,528 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,528 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'warning')) +2026-03-21 22:32:43,528 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'warning')) completed +2026-03-21 22:32:43,529 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,529 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,529 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,529 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,529 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,529 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ? +2026-03-21 22:32:43,529 INFO sqlalchemy.engine.Engine [cached since 0.005318s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'error') +2026-03-21 22:32:43,529 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.005318s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'error') +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'error')) +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'error')) completed +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,530 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,531 | INFO | jarvis.request | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=200 | duration=17 | request_completed +2026-03-21 22:32:43,531 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:32:43,531 | INFO | sqlalchemy.engine.Engine | request_id=4120c4d7-4748-4b0b-8597-76986ae1136f | user=anonymous | GET /api/logs/stats | status=- | duration=- | ROLLBACK +2026-03-21 22:32:43,531 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,531 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:43,531 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:43,531 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,390 | INFO | jarvis.request | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | request_started +2026-03-21 22:32:51,390 | WARNING | jarvis.request | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=401 | duration=- | http_exception +2026-03-21 22:32:51,390 | INFO | jarvis.request | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=401 | duration=0 | request_completed +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,391 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,392 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:51,392 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:51,392 INFO sqlalchemy.engine.Engine INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:32:51,392 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2026-03-21 22:32:51,392 INFO sqlalchemy.engine.Engine [cached since 75.37s ago] ('info', 'system', None, '9b30e4de-1ead-4e5f-893a-2de9a11595e0', '/api/conversations/chat', 'POST', 401, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'b0a7c33e-9d67-4c28-9b4f-b70af5caf803', '2026-03-21 14:32:51.392320', '2026-03-21 14:32:51.392325') +2026-03-21 22:32:51,392 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [cached since 75.37s ago] ('info', 'system', None, '9b30e4de-1ead-4e5f-893a-2de9a11595e0', '/api/conversations/chat', 'POST', 401, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'b0a7c33e-9d67-4c28-9b4f-b70af5caf803', '2026-03-21 14:32:51.392320', '2026-03-21 14:32:51.392325') +2026-03-21 22:32:51,392 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,392 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,392 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '9b30e4de-1ead-4e5f-893a-2de9a11595e0', '/api/conversations/chat', 'POST', 401, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'b0a7c33e-9d67-4c28-9b4f-b70af5caf803', '2026-03-21 14:32:51.392320', '2026-03-21 14:32:51.392325')) +2026-03-21 22:32:51,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'INSERT INTO logs (level, type, user_id, request_id, route, method, status_code, error_type, operation, message, details, source, duration_ms, id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', ('info', 'system', None, '9b30e4de-1ead-4e5f-893a-2de9a11595e0', '/api/conversations/chat', 'POST', 401, None, 'http.request', 'request_completed', '{"query": {}, "client": "127.0.0.1"}', 'http', 0, 'b0a7c33e-9d67-4c28-9b4f-b70af5caf803', '2026-03-21 14:32:51.392320', '2026-03-21 14:32:51.392325')) completed +2026-03-21 22:32:51,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,397 INFO sqlalchemy.engine.Engine COMMIT +2026-03-21 22:32:51,397 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | COMMIT +2026-03-21 22:32:51,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,410 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:32:51,410 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:32:51,411 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:32:51,411 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.id = ? +2026-03-21 22:32:51,411 INFO sqlalchemy.engine.Engine [cached since 75.38s ago] ('b0a7c33e-9d67-4c28-9b4f-b70af5caf803',) +2026-03-21 22:32:51,411 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | [cached since 75.38s ago] ('b0a7c33e-9d67-4c28-9b4f-b70af5caf803',) +2026-03-21 22:32:51,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('b0a7c33e-9d67-4c28-9b4f-b70af5caf803',)) +2026-03-21 22:32:51,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.id = ?', ('b0a7c33e-9d67-4c28-9b4f-b70af5caf803',)) completed +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,412 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:32:51,412 | INFO | sqlalchemy.engine.Engine | request_id=9b30e4de-1ead-4e5f-893a-2de9a11595e0 | user=anonymous | POST /api/conversations/chat | status=- | duration=- | ROLLBACK +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:32:51,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,394 | INFO | jarvis.request | request_id=61b0a3ba-d022-4950-adff-b876aece73c4 | user=anonymous | OPTIONS /api/logs | status=- | duration=- | request_started +2026-03-21 22:33:04,394 | INFO | jarvis.request | request_id=61b0a3ba-d022-4950-adff-b876aece73c4 | user=anonymous | OPTIONS /api/logs | status=200 | duration=0 | request_completed +2026-03-21 22:33:04,395 | INFO | jarvis.request | request_id=925a9eec-cb9f-4351-9deb-4f1b61b8a994 | user=anonymous | OPTIONS /api/logs/stats | status=- | duration=- | request_started +2026-03-21 22:33:04,395 | INFO | jarvis.request | request_id=925a9eec-cb9f-4351-9deb-4f1b61b8a994 | user=anonymous | OPTIONS /api/logs/stats | status=200 | duration=0 | request_completed +2026-03-21 22:33:04,396 | INFO | jarvis.request | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | request_started +2026-03-21 22:33:04,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:33:04,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:33:04,397 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,398 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:33:04,398 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:33:04,398 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:33:04,398 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:33:04,398 INFO sqlalchemy.engine.Engine [cached since 72.12s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:33:04,398 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | [cached since 72.12s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:33:04,398 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:33:04,399 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,399 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,399 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,399 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,400 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:33:04,400 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? +2026-03-21 22:33:04,401 INFO sqlalchemy.engine.Engine [generated in 0.00013s] ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:33:04,401 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | [generated in 0.00013s] ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000') +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ?', ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000')) completed +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,401 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,402 INFO sqlalchemy.engine.Engine SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:33:04,402 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at +FROM logs +WHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC + LIMIT ? OFFSET ? +2026-03-21 22:33:04,402 INFO sqlalchemy.engine.Engine [generated in 0.00013s] ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0) +2026-03-21 22:33:04,402 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | [generated in 0.00013s] ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0) +2026-03-21 22:33:04,402 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC\n LIMIT ? OFFSET ?', ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0)) +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT logs.level, logs.type, logs.user_id, logs.request_id, logs.route, logs.method, logs.status_code, logs.error_type, logs.operation, logs.message, logs.details, logs.source, logs.duration_ms, logs.id, logs.created_at, logs.updated_at \nFROM logs \nWHERE logs.type = ? AND (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? ORDER BY logs.created_at DESC\n LIMIT ? OFFSET ?', ('chat', '3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 50, 0)) completed +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,403 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,404 | INFO | jarvis.request | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=200 | duration=7 | request_completed +2026-03-21 22:33:04,404 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:33:04,404 | INFO | sqlalchemy.engine.Engine | request_id=1b90cf0d-16b9-44f0-a291-7eeef06d438d | user=anonymous | GET /api/logs | status=- | duration=- | ROLLBACK +2026-03-21 22:33:04,404 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,404 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,404 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,404 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,405 | INFO | jarvis.request | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | request_started +2026-03-21 22:33:04,405 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,405 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT 1', []) +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT 1', []) completed +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,406 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-21 22:33:04,406 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | BEGIN (implicit) +2026-03-21 22:33:04,406 INFO sqlalchemy.engine.Engine SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:33:04,406 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at +FROM users +WHERE users.id = ? +2026-03-21 22:33:04,406 INFO sqlalchemy.engine.Engine [cached since 72.13s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:33:04,406 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 72.13s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d',) +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) +2026-03-21 22:33:04,406 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT users.email, users.hashed_password, users.full_name, users.is_active, users.is_superuser, users.llm_config, users.scheduler_config, users.id, users.created_at, users.updated_at \nFROM users \nWHERE users.id = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d',)) completed +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,407 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,407 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,407 INFO sqlalchemy.engine.Engine [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:33:04,407 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,407 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) completed +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,408 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,408 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,408 INFO sqlalchemy.engine.Engine [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent') +2026-03-21 22:33:04,408 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent') +2026-03-21 22:33:04,408 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent')) +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'agent')) completed +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,409 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,410 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,410 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,410 INFO sqlalchemy.engine.Engine [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system') +2026-03-21 22:33:04,410 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system') +2026-03-21 22:33:04,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,410 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system')) +2026-03-21 22:33:04,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'system')) completed +2026-03-21 22:33:04,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,411 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,412 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,412 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? +2026-03-21 22:33:04,412 INFO sqlalchemy.engine.Engine [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:33:04,412 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 20.89s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat') +2026-03-21 22:33:04,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) +2026-03-21 22:33:04,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat')) completed +2026-03-21 22:33:04,412 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,413 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,413 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,413 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,414 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,414 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,414 INFO sqlalchemy.engine.Engine [generated in 0.00017s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'debug') +2026-03-21 22:33:04,414 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [generated in 0.00017s] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'debug') +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'debug')) +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'debug')) completed +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,414 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,415 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,415 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,415 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,415 INFO sqlalchemy.engine.Engine [cached since 0.001511s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'info') +2026-03-21 22:33:04,415 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.001511s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'info') +2026-03-21 22:33:04,415 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,415 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,415 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'info')) +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'info')) completed +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,416 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,416 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,416 INFO sqlalchemy.engine.Engine [cached since 0.00266s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'warning') +2026-03-21 22:33:04,416 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.00266s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'warning') +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,416 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'warning')) +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'warning')) completed +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,417 INFO sqlalchemy.engine.Engine SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,417 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | SELECT count(logs.id) AS count_1 +FROM logs +WHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ? +2026-03-21 22:33:04,417 INFO sqlalchemy.engine.Engine [cached since 0.00366s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'error') +2026-03-21 22:33:04,417 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | [cached since 0.00366s ago] ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'error') +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,417 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'error')) +2026-03-21 22:33:04,418 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial(, 'SELECT count(logs.id) AS count_1 \nFROM logs \nWHERE (logs.user_id = ? OR logs.user_id IS NULL) AND logs.created_at >= ? AND logs.created_at <= ? AND logs.type = ? AND logs.level = ?', ('3fcb0909-8572-4ce5-8df0-907b0e35915d', '2026-03-20 14:32:00.000000', '2026-03-21 14:32:00.000000', 'chat', 'error')) completed +2026-03-21 22:33:04,418 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,418 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,418 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,418 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,418 | INFO | jarvis.request | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=200 | duration=13 | request_completed +2026-03-21 22:33:04,419 INFO sqlalchemy.engine.Engine ROLLBACK +2026-03-21 22:33:04,419 | INFO | sqlalchemy.engine.Engine | request_id=f66682ea-20a6-4697-9a05-b091e3a783a8 | user=anonymous | GET /api/logs/stats | status=- | duration=- | ROLLBACK +2026-03-21 22:33:04,419 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,419 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed +2026-03-21 22:33:04,419 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | executing functools.partial() +2026-03-21 22:33:04,419 | DEBUG | aiosqlite | request_id=- | user=anonymous | - - | status=- | duration=- | operation functools.partial() completed diff --git a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/data_level0.bin b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/data_level0.bin similarity index 93% rename from backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/data_level0.bin rename to backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/data_level0.bin index ea8182f..fe42c56 100644 Binary files a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/data_level0.bin and b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/data_level0.bin differ diff --git a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/header.bin b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/header.bin similarity index 100% rename from backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/header.bin rename to backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/header.bin diff --git a/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/length.bin b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/length.bin new file mode 100644 index 0000000..d9e99fd Binary files /dev/null and b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/length.bin differ diff --git a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/link_lists.bin b/backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/link_lists.bin similarity index 100% rename from backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/link_lists.bin rename to backend/data/chroma/28268fc9-fbac-4de4-b822-fb0faccd49ce/link_lists.bin diff --git a/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/data_level0.bin b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/data_level0.bin new file mode 100644 index 0000000..5424def Binary files /dev/null and b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/data_level0.bin differ diff --git a/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/header.bin b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/header.bin new file mode 100644 index 0000000..bb54792 Binary files /dev/null and b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/header.bin differ diff --git a/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/length.bin b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/length.bin new file mode 100644 index 0000000..14fc1ec Binary files /dev/null and b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/length.bin differ diff --git a/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/link_lists.bin b/backend/data/chroma/77cba8ed-c024-4f28-93f0-803cbd02e91b/link_lists.bin new file mode 100644 index 0000000..e69de29 diff --git a/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/data_level0.bin b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/data_level0.bin new file mode 100644 index 0000000..84d8ec9 Binary files /dev/null and b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/data_level0.bin differ diff --git a/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/header.bin b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/header.bin new file mode 100644 index 0000000..bb54792 Binary files /dev/null and b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/header.bin differ diff --git a/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/length.bin b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/length.bin new file mode 100644 index 0000000..d40341c Binary files /dev/null and b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/length.bin differ diff --git a/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/link_lists.bin b/backend/data/chroma/7e7df70e-ddab-483f-90b8-18ad218f6bec/link_lists.bin new file mode 100644 index 0000000..e69de29 diff --git a/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/data_level0.bin b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/data_level0.bin new file mode 100644 index 0000000..036dc80 Binary files /dev/null and b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/data_level0.bin differ diff --git a/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/header.bin b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/header.bin new file mode 100644 index 0000000..bb54792 Binary files /dev/null and b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/header.bin differ diff --git a/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/length.bin b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/length.bin new file mode 100644 index 0000000..e8d47c3 Binary files /dev/null and b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/length.bin differ diff --git a/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/link_lists.bin b/backend/data/chroma/b715402d-5f1a-4e5f-82d8-b003358963ec/link_lists.bin new file mode 100644 index 0000000..e69de29 diff --git a/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/data_level0.bin b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/data_level0.bin new file mode 100644 index 0000000..80808de Binary files /dev/null and b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/data_level0.bin differ diff --git a/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/header.bin b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/header.bin new file mode 100644 index 0000000..bb54792 Binary files /dev/null and b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/header.bin differ diff --git a/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/length.bin b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/length.bin new file mode 100644 index 0000000..0c724fa Binary files /dev/null and b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/length.bin differ diff --git a/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/link_lists.bin b/backend/data/chroma/c9cd2bad-04dd-4d27-bad8-a442a235491b/link_lists.bin new file mode 100644 index 0000000..e69de29 diff --git a/backend/data/chroma/chroma.sqlite3 b/backend/data/chroma/chroma.sqlite3 index edc1dd7..0fbc1e4 100644 Binary files a/backend/data/chroma/chroma.sqlite3 and b/backend/data/chroma/chroma.sqlite3 differ diff --git a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/length.bin b/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/length.bin deleted file mode 100644 index cd8ff7c..0000000 Binary files a/backend/data/chroma/f759e0b6-d062-4e67-9e53-b46dfaa9fa2a/length.bin and /dev/null differ diff --git a/backend/data/jarvis.db b/backend/data/jarvis.db index 302e2f0..4df1d7e 100644 Binary files a/backend/data/jarvis.db and b/backend/data/jarvis.db differ diff --git a/backend/data/uploads/1aa193ee-7f60-4dba-b8cf-03c5a21d7547.docx b/backend/data/uploads/1aa193ee-7f60-4dba-b8cf-03c5a21d7547.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/1aa193ee-7f60-4dba-b8cf-03c5a21d7547.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/1c1e2aaa-d588-4582-b14f-6e2b25933738.docx b/backend/data/uploads/1c1e2aaa-d588-4582-b14f-6e2b25933738.docx new file mode 100644 index 0000000..175d0dd Binary files /dev/null and b/backend/data/uploads/1c1e2aaa-d588-4582-b14f-6e2b25933738.docx differ diff --git a/backend/data/uploads/4eb88bb9-12e7-4239-a628-875e05a4fbc5.pdf b/backend/data/uploads/4eb88bb9-12e7-4239-a628-875e05a4fbc5.pdf new file mode 100644 index 0000000..68d53aa --- /dev/null +++ b/backend/data/uploads/4eb88bb9-12e7-4239-a628-875e05a4fbc5.pdf @@ -0,0 +1 @@ +%PDF-1.4 bad \ No newline at end of file diff --git a/backend/data/uploads/5b1081ac-e190-4d02-ba0c-2d3f6830fbb2.docx b/backend/data/uploads/5b1081ac-e190-4d02-ba0c-2d3f6830fbb2.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/5b1081ac-e190-4d02-ba0c-2d3f6830fbb2.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/65f4a975-fa8f-4832-869e-d44f02352bc0.docx b/backend/data/uploads/65f4a975-fa8f-4832-869e-d44f02352bc0.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/65f4a975-fa8f-4832-869e-d44f02352bc0.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/838d2878-50f9-4f29-bfbe-10d625ba5c86.docx b/backend/data/uploads/838d2878-50f9-4f29-bfbe-10d625ba5c86.docx new file mode 100644 index 0000000..175d0dd Binary files /dev/null and b/backend/data/uploads/838d2878-50f9-4f29-bfbe-10d625ba5c86.docx differ diff --git a/backend/data/uploads/83f23fad-0d31-4383-8416-9651244db1d3.pdf b/backend/data/uploads/83f23fad-0d31-4383-8416-9651244db1d3.pdf new file mode 100644 index 0000000..68d53aa --- /dev/null +++ b/backend/data/uploads/83f23fad-0d31-4383-8416-9651244db1d3.pdf @@ -0,0 +1 @@ +%PDF-1.4 bad \ No newline at end of file diff --git a/backend/data/uploads/84514070-b949-4fc8-9d23-f1c9aa66df93.pdf b/backend/data/uploads/84514070-b949-4fc8-9d23-f1c9aa66df93.pdf new file mode 100644 index 0000000..68d53aa --- /dev/null +++ b/backend/data/uploads/84514070-b949-4fc8-9d23-f1c9aa66df93.pdf @@ -0,0 +1 @@ +%PDF-1.4 bad \ No newline at end of file diff --git a/backend/data/uploads/973133b8-94ea-498e-95db-cfceec981e09.docx b/backend/data/uploads/973133b8-94ea-498e-95db-cfceec981e09.docx deleted file mode 100644 index 9075025..0000000 Binary files a/backend/data/uploads/973133b8-94ea-498e-95db-cfceec981e09.docx and /dev/null differ diff --git a/backend/data/uploads/a6d57f51-7de5-4e8b-b7af-9a00a64f1a08.docx b/backend/data/uploads/a6d57f51-7de5-4e8b-b7af-9a00a64f1a08.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/a6d57f51-7de5-4e8b-b7af-9a00a64f1a08.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/a7a26404-d785-468d-a59f-835fb443bcbd.docx b/backend/data/uploads/a7a26404-d785-468d-a59f-835fb443bcbd.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/a7a26404-d785-468d-a59f-835fb443bcbd.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/b3405365-1dd3-41ff-a928-758c0bef2c32.docx b/backend/data/uploads/b3405365-1dd3-41ff-a928-758c0bef2c32.docx new file mode 100644 index 0000000..44d6628 --- /dev/null +++ b/backend/data/uploads/b3405365-1dd3-41ff-a928-758c0bef2c32.docx @@ -0,0 +1 @@ +bad \ No newline at end of file diff --git a/backend/data/uploads/c53861cd-9eca-485c-9048-80e93cfee8b2.txt b/backend/data/uploads/c53861cd-9eca-485c-9048-80e93cfee8b2.txt deleted file mode 100644 index b60d951..0000000 --- a/backend/data/uploads/c53861cd-9eca-485c-9048-80e93cfee8b2.txt +++ /dev/null @@ -1,119 +0,0 @@ -杩滃厜杞欢鑲′唤鏈夐檺鍏徃绉戞妧椤圭洰鍙鎬х爺绌舵姤鍛 - -椤圭洰鍚嶇О锛氬ぇ妯″瀷寰皟鎶鏈爺绌朵笌搴旂敤 - -鐢宠閮ㄩ棬锛 - -璧锋鏃堕棿锛氬勾鑷冲勾 - -椤圭洰璐熻矗浜猴細 - -鑱旂郴鐢佃瘽锛 - -鐢宠鏃ユ湡锛氬勾 鏈 - -澶фā鍨嬪井璋冩妧鏈彲琛屾х爺绌舵姤鍛 - -杩滃厜杞欢鑲′唤鏈夐檺鍏徃绉戞妧椤圭洰鍙鎬х爺绌舵姤鍛 - -椤圭洰鍚嶇О锛 澶фā鍨嬪井璋冩妧鏈爺绌朵笌搴旂敤 - -鐢宠閮ㄩ棬锛 - -璧锋鏃堕棿锛 骞 鏈堣嚦 骞 鏈 - -椤圭洰璐熻矗浜猴細 - -鑱旂郴鐢佃瘽锛 - -鐢宠鏃ユ湡锛 骞 鏈 - -涓銆佺洰鐨勫拰鎰忎箟 - -1.1 椤圭洰鑳屾櫙涓庨渶姹 - -杩戝勾鏉ワ紝浠ユ繁搴﹀涔犱负鍩虹鐨勫ぇ鍨嬮璁粌璇█妯″瀷锛圠arge Language Models, -LLMs锛夊GPT绯诲垪銆丅ERT銆丩LaMA绛夊湪鑷劧璇█澶勭悊棰嗗煙鍙栧緱浜嗙獊鐮存ц繘灞曪紝閫氳繃娴烽噺鏁版嵁鐨勯璁粌鍜岃秴澶ц妯″弬鏁伴噺锛岃繖浜涙ā鍨嬪睍鐜板嚭寮哄ぇ鐨勯氱敤璇█鐞嗚В涓庣敓鎴愯兘鍔涳紝鍦ㄦ満鍣ㄧ炕璇戙佹枃鏈憳瑕併侀棶绛旂郴缁熴佸唴瀹瑰垱浣滅瓑浼楀浠诲姟涓〃鐜板嚭鑹诧紝寮曢浜嗕汉宸ユ櫤鑳芥妧鏈殑鏂版氮娼傜劧鑰岋紝杩欎簺閫氱敤澶фā鍨嬪湪闈㈠鐗瑰畾涓撲笟棰嗗煙浠诲姟鏃讹紝寰寰瀛樺湪鐭ヨ瘑瑕嗙洊涓嶈冻銆佷笓涓氭湳璇悊瑙e亸宸侀鍩熺壒瀹氶昏緫鎺ㄧ悊鑳藉姏娆犵己銆佽緭鍑洪鏍间笉绗﹀悎琛屼笟鐗圭偣绛夐棶棰橈紝闅句互鐩存帴婊¤冻鍨傜洿鍦烘櫙鐨勫簲鐢ㄩ渶姹傘 - -妯″瀷寰皟锛團ine-tuning锛夋妧鏈綔涓哄皢閫氱敤澶фā鍨嬮傞厤鍒扮壒瀹氬満鏅殑鍏抽敭鎵嬫锛岄氳繃鍦ㄩ鍩熺浉鍏虫暟鎹笂杩涗竴姝ヨ缁冩ā鍨嬪弬鏁帮紝浣挎ā鍨嬭兘澶熷惛鏀堕鍩熺煡璇嗐侀傚簲鐗瑰畾浠诲姟瑕佹眰锛屼粠鑰屾樉钁楁彁鍗囨ā鍨嬪湪鐩爣浠诲姟涓婄殑鎬ц兘琛ㄧ幇銆傞殢鐫澶фā鍨嬪弬鏁拌妯$殑涓嶆柇鎵╁ぇ锛屼紶缁熺殑鍏ㄥ弬鏁板井璋冩柟寮忛潰涓寸潃璁$畻璧勬簮娑堣楀ぇ銆佸瓨鍌ㄦ垚鏈珮銆佸鏄撲骇鐢熺伨闅炬ч仐蹇樼瓑鎸戞垬锛屽洜姝わ紝鍙傛暟楂樻晥寰皟锛圥arameter-Efficient -Fine-Tuning, -PEFT锛夋柟娉曞LoRA銆丄dapter銆丳refix-tuning绛夋妧鏈簲杩愯岀敓锛屼负浣庢垚鏈侀珮鏁堢巼鐨勫ぇ妯″瀷棰嗗煙閫傞厤鎻愪緵浜嗘柊鐨勬妧鏈矾寰勩 - -鏈」鐩棬鍦ㄦ帰绱㈤傚悎鐗瑰畾棰嗗煙鐗圭偣鐨勯珮鏁堝井璋冪瓥鐣ワ紝瑙e喅鏁版嵁绋缂烘с佷笓涓氭湳璇悊瑙c侀鍩熺煡璇嗚瀺鍚堢瓑鍏抽敭鎶鏈棶棰橈紝鎻愬崌妯″瀷鍦ㄧ壒瀹氬満鏅笅鐨勫噯纭с佸彲闈犳у拰瀹炵敤鎬с - -椤圭洰鎴愭灉灏嗗璇ョ幇鐘跺拰鎶鏈彂灞曠殑浣滅敤涓昏浣撶幇鍦ㄦ妧鏈帹鍔ㄤ綔鐢ㄥ拰搴旂敤钀藉湴鏀拺涓ゆ柟闈€ - -浜屻佸浗鍐呭鐮旂┒姘村钩缁艰堪 - -2.1 鎶鏈彂灞曞巻鍙茬畝瑕佸洖椤 - -澶фā鍨嬪井璋冩妧鏈殑鍙戝睍鍘嗙▼鍒嗕负鍥涗釜闃舵锛 - -绗竴闃舵锛2018骞村墠锛夛細浼犵粺杩佺Щ瀛︿範涓庡井璋冮洀褰㈤樁娈点傛ā鍨嬮傞厤澶氶噰鐢ㄤ紶缁熻縼绉诲涔犳濊矾锛屽皢閫氱敤鏁版嵁闆嗕笂璁粌鐨勫熀纭妯″瀷杩佺Щ鑷崇壒瀹氫换鍔″満鏅 - -绗簩闃舵锛2018-2020骞达級锛氶璁粌-寰皟鑼冨紡纭珛闃舵銆2018骞磋胺姝屾彁鍑築ERT妯″瀷锛岄娆℃瀯寤"棰勮缁冮氱敤鐭ヨ瘑+涓嬫父浠诲姟寰皟"鐨勬妧鏈鏋躲 - -绗笁闃舵锛2020-2022骞达級锛氶珮鏁堝井璋冩妧鏈垎鍙戦樁娈点侺oRA銆丵LoRA銆丄dapter绛夊弬鏁伴珮鏁堝井璋冩妧鏈浉缁у嚭鐜帮紝灏嗗井璋冨弬鏁拌妯″ぇ骞呴檷浣庛 - -绗洓闃舵锛2022骞磋嚦浠婏級锛氬瀭鐩撮鍩熸繁鍖栦笌鍗忓悓浼樺寲闃舵銆"鍩哄骇妯″瀷+棰嗗煙寰皟"鐨勬灦鏋勬垚涓轰富娴侊紝寰皟鎶鏈笌鐭ヨ瘑鍥捐氨杩涗竴姝ヨ瀺鍚堛 - -2.2 鍥藉唴澶栫爺绌舵按骞崇幇鐘跺拰鍙戝睍瓒嬪娍 - -鍥介檯灞傞潰锛孒ugging -Face銆丏eepSpeed绛夊紑婧愮ぞ鍖轰负鍙傛暟楂樻晥寰皟鎶鏈殑鏅強鎻愪緵浜嗛噸瑕佹敮鎾戙傚浗鍐呭眰闈紝闃块噷浜戝熀浜庨氫箟鍗冮棶杩涜璐㈢◣棰嗗煙瀹氬埗寰皟锛岄獙璇佷簡寰皟鎶鏈湪璐㈠姟棰嗗煙鐨勫簲鐢ㄤ环鍊笺 - -涓夈侀」鐩殑鐞嗚鍜屽疄璺典緷鎹 - -3.1 椤圭洰鐮旂┒鍐呭鍘熺悊绠杩 - -鏈」鐩噰鐢"鍩哄骇妯″瀷+棰嗗煙閫傞厤"鍒嗗眰寰皟鏋舵瀯锛岄夊彇寮婧愬熀搴фā鍨嬶紝閽堝璐㈠姟闂瓟鍦烘櫙鐗规ч噰鐢↙oRA鍙傛暟楂樻晥寰皟绛栫暐銆 - -3.2 椤圭洰鐮旂┒鍐呭鐞嗚鍜屽疄璺典緷鎹 - -鐞嗚渚濇嵁鍖呮嫭鍥藉鎴樼暐灞傞潰鐨勬斂绛栨敮鎸佸拰鎴愮啛鐨勬妧鏈悊璁轰綋绯汇傚疄璺典緷鎹寘鎷ぇ妯″瀷寰皟鎶鏈湪璐㈠姟绛夊瀭鐩撮鍩熺殑鎴愬姛妗堜緥銆 - -3.3 椤圭洰鐮旂┒鐨勫叧閿拰闅剧偣 - -鍏抽敭鐐瑰寘鎷珮璐ㄩ噺鏁版嵁闆嗘瀯寤恒侀珮鏁堝井璋冪瓥鐣ラ傞厤銆佺煡璇嗙簿鍑嗘敞鍏ヤ笌骞昏鎶戝埗銆佹晥鏋滆瘎浼颁綋绯诲缓璁俱傞毦鐐归泦涓湪鏁版嵁澶勭悊銆佸井璋冪瓥鐣ャ佺煡璇嗘敞鍏ュ拰璇勪及浣撶郴鍥涗釜鏂归潰銆 - -鍥涖侀」鐩爺绌跺唴瀹瑰拰瀹炴柦鏂规 - -4.1 椤圭洰鐮旂┒鍐呭璇︾粏璇存槑 - -鏈」鐩爺绌跺唴瀹瑰寘鎷暟鎹牸寮忕爺绌躲佸井璋冩鏋剁爺绌躲佹ā鍨嬪井璋冨悗璇勪及浣撶郴鐮旂┒涓変釜鏂归潰銆 - -4.2 鐞嗚鐮旂┒姝ラ鍜岃瘯楠岃鍒 - -鍖呮嫭鏁版嵁澶勭悊娴佺▼銆佽缁冩暟鎹敓鎴愭祦绋嬨佹暟鎹獙璇佹祦绋嬩笁涓富瑕佺幆鑺傘 - -4.3 椤圭洰缁勭粐鏂瑰紡鍜屽崗浣滃垎宸 - -鏈」鐩敱椤圭洰璐熻矗浜虹粺绛瑰崗璋冿紝涓嬭鏁版嵁缁勩佺畻娉曠粍銆佸簲鐢ㄧ粍涓変釜宸ヤ綔灏忕粍銆 - -浜斻侀鏈熺洰鏍囧拰鎴愭灉褰㈠紡 - -5.1 椤圭洰鐮旂┒棰勬湡杈惧埌鐨勭洰鏍 - -鎶鏈洰鏍囷細闂瓟鍑嗙‘鐜囪揪鍒85%浠ヤ笂銆傚簲鐢ㄧ洰鏍囷細寮鍙戣储鍔℃櫤鑳界煡璇嗛棶绛斿師鍨嬬郴缁熴傛晥鐩婄洰鏍囷細鏇夸唬璐㈠姟涓撳70%浠ヤ笂鐨勯噸澶嶆у挩璇㈠伐浣溿 - -5.2 鏄庣‘鍙欒堪鎻愰珮鐮旂┒鎴愭灉鐨勫舰寮 - -鍖呮嫭鎶鏈柟妗堟枃妗c佸師鍨嬬郴缁熴佽缁冩暟鎹泦銆佸井璋冩ā鍨嬨佹妧鏈鏂/鎶ュ憡绛夋垚鏋滃舰寮忋 - -鍏侀」鐩壙鎷呭洟闃熺殑鏉′欢 - -椤圭洰鍥㈤槦鍏峰浜哄伐鏅鸿兘銆佸ぇ鏁版嵁绛夐鍩熺殑鎶鏈儗鏅紝鍏峰璐㈠姟淇℃伅绯荤粺寮鍙戠粡楠岋紝鍏峰鍏呰冻鐨凣PU璁$畻璧勬簮鍜屽畬鍠勭殑寮鍙戞祴璇曠幆澧冦 - -涓冦侀」鐩繘搴﹀畨鎺 - -绗1-2鏈堬細椤圭洰鍚姩銆侀渶姹傚垎鏋愶紱绗3-4鏈堬細鏁版嵁鏀堕泦銆佹竻娲楋紱绗5-7鏈堬細鏁版嵁闆嗙敓鎴愶紱绗8-10鏈堬細妯″瀷璁粌锛涚11-12鏈堬細绯荤粺寮鍙戯紱绗13-14鏈堬細浼樺寲鏁寸悊锛涚15-16鏈堬細楠屾敹杞寲銆 - -鍏侀」鐩粡璐归绠 - -鏈」鐩粡璐归绠楁牴鎹疄闄呯爺绌跺伐浣滈渶瑕佺紪鍒讹紝鍖呮嫭浜哄伐璐广佽澶囦娇鐢ㄨ垂銆佷笟鍔¤垂銆佸満鍦颁娇鐢ㄨ垂銆佷笓瀹跺挩璇㈣垂绛夌鐩 - -鍒嗙棰嗗瀹℃牳鎰忚锛 - -锛堝缁忚垂棰勭畻鏄惁鍚堢悊锛屾湁鏃犲叾浠栫粡璐规潵婧愶紝鑳藉惁淇濊瘉鐮旂┒璁″垝瀹炴柦鎵闇鐨勪汉鍔涳紝宸ヤ綔鏃堕棿绛夊熀鏈潯浠舵彁鍑哄叿浣撴剰瑙侊級 - -鍒嗙棰嗗锛堢瀛楋級锛 骞 鏈 鏃 diff --git a/backend/data/uploads/e21928b2-18ab-495a-98c0-e5bc88a62922.pdf b/backend/data/uploads/e21928b2-18ab-495a-98c0-e5bc88a62922.pdf new file mode 100644 index 0000000..68d53aa --- /dev/null +++ b/backend/data/uploads/e21928b2-18ab-495a-98c0-e5bc88a62922.pdf @@ -0,0 +1 @@ +%PDF-1.4 bad \ No newline at end of file diff --git a/backend/data/uploads/e55607ca-2d0e-416a-8219-bb603055b354.pdf b/backend/data/uploads/e55607ca-2d0e-416a-8219-bb603055b354.pdf new file mode 100644 index 0000000..68d53aa --- /dev/null +++ b/backend/data/uploads/e55607ca-2d0e-416a-8219-bb603055b354.pdf @@ -0,0 +1 @@ +%PDF-1.4 bad \ No newline at end of file diff --git a/brain_phase1_blueprint.md b/brain_phase1_blueprint.md new file mode 100644 index 0000000..d987ff7 --- /dev/null +++ b/brain_phase1_blueprint.md @@ -0,0 +1,427 @@ +# Jarvis Knowledge Brain Phase 1 Blueprint + +## 1. Phase 1 Goal +Phase 1 establishes the first production-ready version of Jarvis's event-driven knowledge brain. The objective is not to finish the entire intelligence system, but to create the minimum architecture that lets Jarvis ingest key user actions from across the product, learn from them on a daily schedule, store only high-value knowledge, and retrieve that knowledge during future conversations. + +Phase 1 should make the brain real in six ways: +1. unify source events across core modules; +2. create an intermediate candidate-learning layer; +3. promote durable knowledge into long-term brain memory; +4. maintain tags and time-aware traceability; +5. expose APIs for inspection and management; +6. allow the chat system to retrieve brain knowledge during answers. + +--- + +## 2. Scope Boundaries + +### In scope +- New persistence models for brain events, candidates, memories, tags, and relationships. +- Ingestion of source signals from conversations, knowledge documents, todos, kanban tasks, and forum posts. +- A daily autonomous learning pipeline that tags, scores, deduplicates, and upgrades knowledge. +- Retrieval integration for future responses. +- Brain dashboard APIs. +- A new frontend brain module structure replacing the current graph-only mental model. + +### Out of scope for phase 1 +- Full graph-native reasoning engine. +- Fully autonomous suggestion orchestration across all screens. +- Complex reinforcement-learning style adaptation. +- Fine-grained user-tunable learning policy UI. +- Automatic deletion and archival heuristics beyond simple status transitions. + +--- + +## 3. Target Architecture +Phase 1 should introduce a four-layer brain pipeline: + +1. **Source Records** + Existing domain tables remain the source of truth: messages, documents/chunks, todos, tasks, forum posts/replies. + +2. **BrainEvent** + A normalized event layer representing meaningful user/system actions. This is the single intake format for downstream learning. + +3. **BrainCandidate** + AI-generated candidate knowledge distilled from one or more events. Candidates are scored, tagged, typed, and traced back to source events. + +4. **BrainMemory** + Durable long-term memory that Jarvis can retrieve during future interactions. This becomes the brain's core persistence layer. + +Graph visualization should be treated as a **projection layer**, not the primary storage model. In later phases, graph nodes and edges can be generated from BrainMemory records and their relationships. + +--- + +## 4. Data Model Additions + +### 4.1 BrainEvent +Purpose: normalized raw learning input. + +Recommended fields: +- `id` +- `user_id` +- `source_type` (`conversation`, `document`, `todo`, `task`, `forum_post`, `forum_reply`) +- `source_id` +- `event_type` (`created`, `updated`, `completed`, `mentioned`, `uploaded`, `resolved`, `marked_important`, etc.) +- `occurred_at` +- `event_date` +- `title` +- `content_summary` +- `raw_excerpt` +- `metadata_` (JSON; source-specific facts such as conversation_id, task status, folder path) +- `importance_signal` (numeric seed score) +- `is_user_pinned` +- `processed_at` +- `status` (`pending`, `processed`, `ignored`) + +Indexes: +- `(user_id, event_date)` +- `(user_id, source_type, source_id)` +- `(user_id, status, occurred_at)` + +### 4.2 BrainCandidate +Purpose: intermediate learned knowledge awaiting acceptance into durable memory. + +Recommended fields: +- `id` +- `user_id` +- `candidate_type` (`preference`, `habit`, `project_fact`, `decision`, `solution`, `topic`, `goal`, `temporary_focus`) +- `title` +- `summary` +- `importance_score` +- `confidence_score` +- `time_scope` (`short_term`, `phase`, `long_term`) +- `valid_from` +- `valid_to` +- `source_event_ids` (JSON array) +- `reasoning_trace` (short explanation of why the system extracted it) +- `status` (`new`, `promoted`, `rejected`, `merged`) +- `created_at` +- `reviewed_at` + +### 4.3 BrainMemory +Purpose: durable brain knowledge used at retrieval time. + +Recommended fields: +- `id` +- `user_id` +- `memory_type` (`preference`, `habit`, `goal`, `project_fact`, `decision`, `solution`, `topic_profile`) +- `title` +- `content` +- `importance` +- `confidence` +- `timeline_date` +- `first_learned_at` +- `last_reinforced_at` +- `reinforcement_count` +- `status` (`active`, `archived`, `deleted`) +- `origin_candidate_id` +- `origin_source_types` (JSON array) +- `metadata_` (JSON) + +### 4.4 BrainTag +Purpose: independent tagging layer for brain browsing, filtering, and scoring. + +Recommended fields: +- `id` +- `user_id` +- `name` +- `category` (`topic`, `value`, `time`, `source`) +- `priority` (`important`, `secondary`) +- `score` +- `last_seen_at` +- `created_at` + +### 4.5 Link Tables +Add many-to-many link tables: +- `brain_event_tags` +- `brain_candidate_tags` +- `brain_memory_tags` +- optional `brain_memory_events` for direct memory-to-event traceability beyond JSON arrays + +These link tables are critical because phase 1 needs tag filters and timeline tracing before advanced graph projection exists. + +--- + +## 5. Ingestion Strategy +Phase 1 should not rewrite existing modules. Instead, it should add thin ingestion hooks near existing write paths. + +### Conversation ingestion +Trigger points: +- after user message creation +- after assistant completion +- after memory extraction / summary creation + +Event examples: +- important user instruction +- explicit 鈥渞emember this鈥 request +- repeated topic cluster +- conversation-derived decision or unresolved goal + +### Document ingestion +Trigger points: +- after upload success +- after indexing completes +- after manual chunk edits + +Event examples: +- document uploaded +- document indexed +- high-value section discovered +- document summary available + +### Todo ingestion +Trigger points: +- todo created +- todo completed +- AI-generated todo created + +Event examples: +- planned work item +- recurring operational duty +- completion signal reflecting actual user focus + +### Task/Kanban ingestion +Trigger points: +- task created +- task status changed +- task completed +- priority changed + +Event examples: +- declared project goal +- active workstream +- resolved milestone + +### Forum ingestion +Trigger points: +- post created +- reply created +- forum instruction executed or referenced + +Event examples: +- public project decision +- repeated operational issue +- reusable explanation or solution + +Implementation note: source ingestion should create BrainEvent rows synchronously or via lightweight background tasks, but should not block the original user flow. + +--- + +## 6. Learning and Promotion Pipeline +Phase 1 should add a new daily scheduler workflow dedicated to the brain. + +### New scheduler job: `brain_daily_learning_task` +Suggested run: once daily after the bulk of user activity, for example 01:00 or configurable per user later. + +Pipeline steps: +1. collect unprocessed `BrainEvent` rows for the target date; +2. cluster by source, topic, and repeated patterns; +3. ask the LLM to produce candidate knowledge with tags and importance explanations; +4. deduplicate against existing `BrainMemory` by semantic and rule-based matching; +5. promote high-confidence candidates into `BrainMemory`; +6. mark low-value candidates rejected or retained as observation-only; +7. refresh tag scores and priority levels; +8. mark consumed events as processed. + +### Promotion rules for phase 1 +Promote automatically when any of these are true: +- user explicitly requested the system to remember something; +- the same topic appears across multiple sources; +- a solution/decision was formed and looks reusable; +- a stable preference or habit is seen repeatedly; +- a task/todo/forum thread confirms relevance with user action. + +Keep as candidate-only when: +- information is recent but not yet stable; +- importance is uncertain; +- it appears only once without reinforcement. + +Reject when: +- content is obviously transient; +- it is too generic to help future answers; +- it duplicates active memory without adding new value. + +--- + +## 7. Retrieval Integration +Phase 1 must let chat use the brain in a controlled way. + +### New retrieval service +Add a dedicated `brain_retrieval_service` or extend `memory_service` with brain-aware retrieval APIs. + +Responsibilities: +- retrieve top relevant `BrainMemory` rows by query, tags, time context, and importance; +- optionally retrieve recent `BrainEvent` summaries for recency-sensitive answers; +- merge existing `UserMemory` and `MemorySummary` into one retrieval result shape; +- support limits to avoid prompt bloat. + +### Retrieval policy +At answer time: +- always consider long-term `BrainMemory`; +- include recent event summaries only when the question appears time-sensitive or project-state-sensitive; +- cap injected brain context to a small curated set. + +Recommended first integration path: +- extend `build_memory_context()` to append a new `銆愮煡璇嗗ぇ鑴戙慲 block built from `BrainMemory` retrieval. +- keep existing conversation summary logic intact. + +This gives immediate product value without requiring a full prompt orchestration rewrite. + +--- + +## 8. Backend Services to Add or Refactor + +### New services +1. `brain_event_service.py` + - normalize incoming source data into BrainEvent rows + - provide source-specific helper constructors + +2. `brain_learning_service.py` + - run daily candidate extraction + - score, dedupe, and promote memories + +3. `brain_tag_service.py` + - manage tags, scoring, priority updates, and cleanup suggestions + +4. `brain_retrieval_service.py` + - retrieve relevant memories and recent events for chat and UI + +### Existing services to extend +- `memory_service.py`: integrate BrainMemory retrieval and possibly migrate `UserMemory` into the new model later +- `scheduler_service.py`: register brain daily learning job +- `agent_service.py`: inject retrieved brain context into chat pipeline +- `document_service.py`, `todo_service.py`, task/forum write paths: emit BrainEvent rows + +--- + +## 9. API Plan +Phase 1 should add a dedicated `/api/brain` router. + +### Read APIs +- `GET /api/brain/overview` + - counts: active memories, candidates, important tags, recent events + - today's learning summary + +- `GET /api/brain/memories` + - filters: tag, type, status, date range, source type + +- `GET /api/brain/candidates` + - filters: status, date, score threshold + +- `GET /api/brain/tags` + - segmented into important and secondary + +- `GET /api/brain/timeline` + - grouped by day/week; includes events, candidate promotions, reinforced memories + +- `GET /api/brain/memory/{id}` + - full traceability including linked events and tags + +### Write/management APIs +- `POST /api/brain/memory/{id}/promote` +- `POST /api/brain/memory/{id}/archive` +- `DELETE /api/brain/memory/{id}` +- `POST /api/brain/tag/{id}/promote` +- `POST /api/brain/tag/{id}/demote` +- `DELETE /api/brain/tag/{id}` +- `POST /api/brain/learn/run` + - manual trigger for daily learning pipeline + +### Compatibility note +Do not remove `/api/graph` in phase 1. Keep it as a legacy projection route while the new brain module is introduced. + +--- + +## 10. Frontend Module Structure +The current `鐭ヨ瘑澶ц剳` nav item should stop meaning 鈥済raph only鈥 and become a real brain dashboard. + +### Route strategy +Preferred phase 1 structure: +- `/brain` 鈫 new knowledge brain dashboard +- `/graph` 鈫 graph view tab or subview under the brain module, retained for relation visualization + +### Brain dashboard sections +1. **Overview header** + - total active memories + - today's learned items + - important tags count + - last learning run + +2. **Important tags panel** + - AI-ranked important tags + - click to filter related memories and timeline entries + +3. **Secondary tags panel** + - lower-priority tags with cleanup actions + +4. **Recent learned knowledge** + - newly promoted memories + - reasons and source badges + +5. **Timeline panel** + - daily grouped events and promotions + - support time-based backtracking + +6. **Graph subview** + - optional tab or secondary panel for relation projection + +### User actions in phase 1 +- delete memory +- archive memory +- promote/demote tag priority +- manually trigger learning run +- inspect why a memory exists + +This is enough to make the brain visible and manageable even before advanced graph reasoning exists. + +--- + +## 11. Suggested Delivery Breakdown + +### Step 1: Persistence foundation +- add brain models and migrations +- add SQLAlchemy registrations and schemas + +### Step 2: Event ingestion +- emit BrainEvent rows from conversation/document/todo/task/forum flows + +### Step 3: Learning workflow +- implement daily learning job and manual trigger API + +### Step 4: Retrieval integration +- wire BrainMemory into chat context assembly + +### Step 5: Brain dashboard backend +- add overview, memories, tags, timeline endpoints + +### Step 6: Brain dashboard frontend +- add `/brain` page and move graph into a subview or separate tab + +--- + +## 12. Risks and Guardrails + +### Main risks +- over-collection leading to noisy memories; +- prompt bloat from injecting too much brain context; +- duplicate memory creation across repeated daily runs; +- unclear distinction between candidate and durable memory; +- UI becoming graph-centric again instead of brain-centric. + +### Guardrails +- enforce candidate layer before promotion; +- cap retrieval size strictly; +- keep source traceability for every promoted memory; +- make tag cleanup explicit in UI; +- treat graph as a projection, not the source of truth. + +--- + +## 13. Phase 1 Success Criteria +Phase 1 is successful when all of the following are true: +- the system creates normalized BrainEvent rows from all five major source domains; +- a scheduled daily learning job produces candidates and promotes high-value memories; +- Jarvis can retrieve durable brain memories during future answers; +- the frontend exposes a real brain dashboard with tags, recent knowledge, and timeline; +- users can inspect and clean what the system learned; +- the old graph page is no longer the only visible representation of the brain. diff --git a/brain_phase1_task_breakdown.md b/brain_phase1_task_breakdown.md new file mode 100644 index 0000000..f76db9d --- /dev/null +++ b/brain_phase1_task_breakdown.md @@ -0,0 +1,555 @@ +# Jarvis Knowledge Brain Phase 1 Task Breakdown + +## Goal +Turn the phase-1 knowledge brain blueprint into an execution-ready development task list tied to the current codebase. + +--- + +## A. Backend Persistence Tasks + +### A1. Add new brain models +Create new SQLAlchemy models under `backend/app/models/`: +- `brain_event.py` +- `brain_candidate.py` +- `brain_memory.py` +- `brain_tag.py` +- optional link-table definitions in `brain_relations.py` or colocated within the above files + +Core entities to add: +- `BrainEvent` +- `BrainCandidate` +- `BrainMemory` +- `BrainTag` +- `BrainEventTag` +- `BrainCandidateTag` +- `BrainMemoryTag` +- optional `BrainMemoryEvent` + +Acceptance criteria: +- All models inherit from the project base model pattern. +- All required enums/status fields are defined. +- User ownership and timeline fields exist. +- Link tables support tag filtering and source traceability. + +### A2. Register models in model exports +Update: +- `backend/app/models/__init__.py` + +Acceptance criteria: +- New brain models are imported and available during metadata initialization. + +### A3. Add migration / schema evolution support +Depending on current project migration approach, add the required DB migration path for the new tables. + +Acceptance criteria: +- New tables can be created in local/dev environments without breaking existing tables. +- Indexes for `user_id`, status, and date-based access patterns are included. + +### A4. Add Pydantic schemas +Create new schema files under `backend/app/schemas/`: +- `brain.py` + +Schema groups to add: +- overview response +- memory list/detail response +- candidate list response +- tag response +- timeline response +- manual learning trigger response +- memory/tag management payloads + +Acceptance criteria: +- Schemas match the intended `/api/brain` response shapes. +- Timeline and traceability structures are explicit, not loosely typed blobs. + +--- + +## B. Backend Service Tasks + +### B1. Create brain event ingestion service +Add: +- `backend/app/services/brain_event_service.py` + +Responsibilities: +- normalize source records into `BrainEvent` +- expose helpers such as: + - `record_conversation_event(...)` + - `record_document_event(...)` + - `record_todo_event(...)` + - `record_task_event(...)` + - `record_forum_event(...)` + +Acceptance criteria: +- Each helper accepts current source-domain inputs without forcing those modules to understand brain internals. +- Event creation is idempotent enough to avoid obvious duplicate rows for the same source update. + +### B2. Create brain learning service +Add: +- `backend/app/services/brain_learning_service.py` + +Responsibilities: +- load pending `BrainEvent`s for a given date/user scope +- cluster related events +- call the LLM to create candidate knowledge +- score and dedupe candidates +- promote high-confidence candidates into `BrainMemory` +- mark processed events and candidate statuses + +Acceptance criteria: +- Service supports both manual run and scheduler run. +- Promotion/rejection decisions are explicit and testable. +- Source event traceability is preserved. + +### B3. Create brain tag service +Add: +- `backend/app/services/brain_tag_service.py` + +Responsibilities: +- attach and score tags +- split tags into important vs secondary +- update tag scores after learning runs +- support cleanup recommendations + +Acceptance criteria: +- Important/secondary classification is persisted, not only computed in the UI. +- Tag lookups support filtering memories and timeline entries. + +### B4. Create brain retrieval service +Add: +- `backend/app/services/brain_retrieval_service.py` + +Responsibilities: +- retrieve relevant `BrainMemory` records by query +- optionally retrieve recent events for recency-sensitive prompts +- format results for chat injection and API responses + +Acceptance criteria: +- Retrieval has strict limits to prevent prompt bloat. +- Results support filtering by tags, source type, and time range. + +### B5. Refactor or extend memory service +Update: +- `backend/app/services/memory_service.py` + +Tasks: +- keep existing summary and `UserMemory` behavior intact +- extend `build_memory_context()` to append a `銆愮煡璇嗗ぇ鑴戙慲 block from `BrainRetrievalService` +- keep memory context size bounded + +Acceptance criteria: +- Existing conversation summary behavior continues to work. +- Chat can consume `BrainMemory` without requiring a full prompt architecture rewrite. + +--- + +## C. Source Ingestion Integration Tasks + +### C1. Conversation 鈫 BrainEvent +Update likely files: +- `backend/app/services/agent_service.py` +- possibly `backend/app/services/memory_service.py` + +Hook points: +- after user message persistence +- after assistant response persistence +- after summary/memory extraction + +Acceptance criteria: +- Important conversation actions produce normalized `BrainEvent`s. +- Explicit 鈥渞emember this鈥 signals are captured as stronger events. + +### C2. Document 鈫 BrainEvent +Update likely files: +- `backend/app/routers/document.py` +- `backend/app/services/document_service.py` +- `backend/app/services/knowledge_service.py` + +Hook points: +- upload success +- indexing completion +- chunk edit / reindex + +Acceptance criteria: +- Document lifecycle milestones become `BrainEvent`s. +- Source metadata includes document identity and folder context. + +### C3. Todo 鈫 BrainEvent +Update likely files: +- `backend/app/routers/todo.py` +- `backend/app/services/todo_service.py` + +Hook points: +- todo creation +- completion +- AI-generated todo creation + +Acceptance criteria: +- Todo events reflect both planning and completion signals. +- AI-generated todos are distinguishable from manual ones. + +### C4. Task/Kanban 鈫 BrainEvent +Update likely files: +- `backend/app/routers/task.py` + +Hook points: +- task creation +- status change +- completion +- priority change + +Acceptance criteria: +- Task state changes create meaningful workstream events. +- Duplicate writes are avoided on no-op updates. + +### C5. Forum 鈫 BrainEvent +Update likely files: +- `backend/app/routers/forum.py` +- optionally `backend/app/services/scheduler_service.py` + +Hook points: +- post created +- reply created +- forum instruction execution + +Acceptance criteria: +- Forum posts/replies that matter to project state become brain events. +- Source traceability includes whether the event came from a post, reply, or executed instruction. + +--- + +## D. Scheduler and Daily Learning Tasks + +### D1. Add daily brain learning job +Update: +- `backend/app/services/scheduler_service.py` + +Add: +- `brain_daily_learning_task()` + +Responsibilities: +- run daily for pending events +- invoke `BrainLearningService` +- log promoted/rejected counts + +Acceptance criteria: +- Job is registered in `start_scheduler()`. +- Job can run safely when there are no pending events. + +### D2. Add manual trigger path +Update or add: +- `backend/app/routers/scheduler.py` or the new `backend/app/routers/brain.py` + +Acceptance criteria: +- Developers/users can manually run learning for testing. +- Trigger returns a useful summary, not only a started flag. + +### D3. Decide scheduler ownership model for phase 1 +Current scheduler is global. Decide whether phase 1 runs: +- for all users in one job, or +- per user loop inside one job + +Acceptance criteria: +- No hard-coded `user_id="default"` behavior remains in new brain learning flow. +- User iteration strategy is explicit. + +--- + +## E. Backend API Tasks + +### E1. Add brain router +Create: +- `backend/app/routers/brain.py` + +Register in: +- `backend/app/main.py` +- `backend/app/routers/__init__.py` if needed + +### E2. Implement overview endpoint +Endpoint: +- `GET /api/brain/overview` + +Should return: +- active memory count +- candidate count +- important tag count +- recent event count +- last learning run info +- today鈥檚 promoted/rejected summary + +### E3. Implement memory endpoints +Endpoints: +- `GET /api/brain/memories` +- `GET /api/brain/memory/{id}` +- `POST /api/brain/memory/{id}/archive` +- `DELETE /api/brain/memory/{id}` +- optional `POST /api/brain/memory/{id}/promote` if candidate-to-memory management is exposed here + +Acceptance criteria: +- Memory detail shows source traceability and tags. +- List endpoint supports pagination/filters needed by UI. + +### E4. Implement candidate endpoints +Endpoints: +- `GET /api/brain/candidates` +- optional promote/reject endpoints if candidates are user-manageable in phase 1 + +Acceptance criteria: +- Candidate status and scoring are inspectable. + +### E5. Implement tag endpoints +Endpoints: +- `GET /api/brain/tags` +- `POST /api/brain/tag/{id}/promote` +- `POST /api/brain/tag/{id}/demote` +- `DELETE /api/brain/tag/{id}` + +Acceptance criteria: +- API groups tags by important vs secondary. +- Manual cleanup actions are supported. + +### E6. Implement timeline endpoint +Endpoint: +- `GET /api/brain/timeline` + +Acceptance criteria: +- Timeline groups records by day or returns a structure easily grouped by day in UI. +- Includes event entries and memory promotion entries. + +### E7. Implement learning trigger endpoint +Endpoint: +- `POST /api/brain/learn/run` + +Acceptance criteria: +- Supports manual learning run for current user or all users, depending on phase-1 policy. +- Returns meaningful run stats. + +--- + +## F. Chat Integration Tasks + +### F1. Inject knowledge brain into chat context +Update: +- `backend/app/services/agent_service.py` +- `backend/app/services/memory_service.py` + +Acceptance criteria: +- Relevant `BrainMemory` items appear in prompt context. +- Context remains concise and bounded. +- Existing response flow remains stable. + +### F2. Add retrieval policy guardrails +Tasks: +- define per-query memory limits +- choose when to include recent events +- prefer important/high-confidence memories + +Acceptance criteria: +- Brain retrieval does not overwhelm standard conversation context. +- Time-sensitive answers can still include recent context when needed. + +--- + +## G. Frontend Route and Navigation Tasks + +### G1. Introduce a real brain route +Update likely files: +- `frontend/src/app/router/routes.ts` +- `frontend/src/app/navigation/nav.ts` + +Tasks: +- add `/brain` +- make `鐭ヨ瘑澶ц剳` point to `/brain` +- keep `/graph` available as a subview or secondary route + +Acceptance criteria: +- Brain is no longer represented only by the graph page. + +### G2. Define frontend brain API client +Add: +- `frontend/src/api/brain.ts` + +Methods: +- `getOverview` +- `getMemories` +- `getMemoryDetail` +- `getCandidates` +- `getTags` +- `getTimeline` +- `runLearning` +- memory/tag management actions + +Acceptance criteria: +- API client matches backend router contract. + +--- + +## H. Frontend Brain Dashboard Tasks + +### H1. Create new brain page +Add: +- `frontend/src/pages/brain/index.vue` + +Core page sections: +- overview header +- important tags panel +- secondary tags panel +- recent learned knowledge section +- timeline section +- graph tab/subview entry + +Acceptance criteria: +- Page is useful even before graph projection is upgraded. +- Dashboard reflects the brain, not just visualized relationships. + +### H2. Add page composable/state logic +Add: +- `frontend/src/pages/brain/composables/useBrainView.ts` + +Responsibilities: +- fetch overview/tags/memories/timeline +- manage filters and selected tags +- trigger manual learning run +- manage loading/error states + +Acceptance criteria: +- Page logic stays separate from template complexity. + +### H3. Add memory list/detail components +Suggested additions: +- `frontend/src/components/brain/BrainMemoryList.vue` +- `frontend/src/components/brain/BrainMemoryDetail.vue` +- `frontend/src/components/brain/BrainTagPanel.vue` +- `frontend/src/components/brain/BrainTimeline.vue` + +Acceptance criteria: +- User can inspect why a memory exists. +- User can archive/delete memories and promote/demote tags. + +### H4. Reposition graph as brain subview +Possible approaches: +- keep current `frontend/src/pages/graph/index.vue` but link it from `/brain` +- or wrap the graph page as one tab inside the brain page + +Acceptance criteria: +- Existing graph functionality remains accessible. +- Product framing changes from 鈥渂rain = graph鈥 to 鈥渂rain includes graph鈥. + +--- + +## I. Testing Tasks + +### I1. Backend model/service tests +Add tests for: +- event creation +- candidate generation status changes +- promotion into `BrainMemory` +- tag priority updates +- timeline aggregation + +Suggested locations: +- `backend/tests/backend/app/services/` +- `backend/tests/backend/app/routers/` + +### I2. Retrieval integration tests +Add tests for: +- memory context injection +- retrieval limits +- recency-sensitive event inclusion + +### I3. API tests +Add tests for: +- `/api/brain/overview` +- `/api/brain/memories` +- `/api/brain/tags` +- `/api/brain/timeline` +- `/api/brain/learn/run` + +### I4. Frontend tests +Add tests for: +- brain composable fetch flow +- filter behavior +- manual learning run UI flow +- tag grouping and memory rendering + +--- + +## J. Recommended Execution Order + +### Wave 1: Foundation +1. A1-A4 persistence and schemas +2. B1 brain event service +3. E1 add router skeleton + +### Wave 2: Ingestion +4. C1-C5 connect all source domains to `BrainEvent` + +### Wave 3: Learning +5. B2 brain learning service +6. B3 brain tag service +7. D1-D3 scheduler/manual learning + +### Wave 4: Retrieval +8. B4 brain retrieval service +9. B5 memory service integration +10. F1-F2 chat injection and guardrails + +### Wave 5: Product surface +11. E2-E7 complete `/api/brain` endpoints +12. G1-G2 routing + API client +13. H1-H4 dashboard and graph repositioning + +### Wave 6: Reliability +14. I1-I4 tests and refinement + +--- + +## K. Files Most Likely to Change in Phase 1 + +### Backend new files +- `backend/app/models/brain_event.py` +- `backend/app/models/brain_candidate.py` +- `backend/app/models/brain_memory.py` +- `backend/app/models/brain_tag.py` +- `backend/app/schemas/brain.py` +- `backend/app/services/brain_event_service.py` +- `backend/app/services/brain_learning_service.py` +- `backend/app/services/brain_tag_service.py` +- `backend/app/services/brain_retrieval_service.py` +- `backend/app/routers/brain.py` + +### Backend existing files +- `backend/app/models/__init__.py` +- `backend/app/main.py` +- `backend/app/services/memory_service.py` +- `backend/app/services/agent_service.py` +- `backend/app/services/scheduler_service.py` +- `backend/app/routers/document.py` +- `backend/app/routers/todo.py` +- `backend/app/routers/task.py` +- `backend/app/routers/forum.py` +- possibly `backend/app/services/document_service.py` +- possibly `backend/app/services/knowledge_service.py` + +### Frontend new files +- `frontend/src/api/brain.ts` +- `frontend/src/pages/brain/index.vue` +- `frontend/src/pages/brain/composables/useBrainView.ts` +- brain-related components under `frontend/src/components/brain/` + +### Frontend existing files +- `frontend/src/app/router/routes.ts` +- `frontend/src/app/navigation/nav.ts` +- optionally `frontend/src/pages/graph/index.vue` + +--- + +## L. Phase 1 鈥淒efinition of Done鈥 Checklist +- [ ] Brain persistence models exist and are queryable. +- [ ] All five core domains emit `BrainEvent`s. +- [ ] Daily learning creates `BrainCandidate`s and promotes durable `BrainMemory`s. +- [ ] Tag priority is stored and manageable. +- [ ] Chat can retrieve relevant brain knowledge. +- [ ] `/api/brain` endpoints support dashboard and management actions. +- [ ] `/brain` dashboard exists and is usable without relying on the graph page. +- [ ] Graph remains available as a secondary/projection view. +- [ ] Automated tests cover ingestion, promotion, retrieval, and UI basics. diff --git a/frontend/notes.md b/frontend/notes.md new file mode 100644 index 0000000..fc55097 --- /dev/null +++ b/frontend/notes.md @@ -0,0 +1,45 @@ +# Notes: Dual Telemetry Control Panel + +## Working Assumptions +- The chat page already has a persistent right-side `OrchestrationPanel`. +- Existing chat streaming already emits real `progress`, `chunk`, and `error`-style events. +- The user wants the panel to feel like an active system console, not a static status card. + +## Design Intent +- Upper telemetry block: real machine metrics with micro line charts +- Lower telemetry block: session activity waveform tied to current chat execution +- Keep the visual language in the current sci-fi / HUD style +- Avoid heavy chart libraries or full dashboard aesthetics + +## Constraints +- Do not invent fake system numbers +- Do not persist telemetry history into conversation history +- Keep the main chat surface dominant +- MVP should use the fewest new moving parts possible + +## Current Code Findings + +### `src/components/chat/OrchestrationPanel.vue` +- Already owns the visual shell for the right-side control panel +- Has logical places to insert additional stacked sections above the agent bus and event feed +- Current UI is text-forward and would benefit from live numeric/sparkline blocks + +### `src/pages/chat/composables/useChatView.ts` +- Already maintains transient orchestration state per request +- Is the right place to derive a session activity waveform from `progress`, `tool`, and `chunk` events +- Can own polling lifecycle for system metrics if we want chat page-local state + +### Backend status route +- No dedicated system metrics endpoint has been confirmed yet +- Minimal new backend contract can be a polling endpoint like `/api/system/status` +- Suggested payload: + - `cpu_percent` + - `memory_percent` + - `disk_percent` + - `timestamp` + +## Planning Implications +- Add a tiny backend router/service for system telemetry rather than overloading conversation APIs +- Add a reusable lightweight sparkline component in frontend for consistent rendering +- Keep system telemetry and session telemetry separate in state and UI +- Limit retained chart points (for example 20-30) to keep rendering simple and responsive diff --git a/frontend/orchestration_panel_plan.md b/frontend/orchestration_panel_plan.md new file mode 100644 index 0000000..5367741 --- /dev/null +++ b/frontend/orchestration_panel_plan.md @@ -0,0 +1,124 @@ +# AI Control Orchestration Panel Plan + +## Goal +Add a minimal viable right-side `JARVIS CONTROL` panel to the chat page that visualizes real-time agent orchestration from existing stream progress events while keeping the main conversation as the primary reading surface. + +## Scope +- Frontend-only V1 +- Reuse existing stream payload fields: `stage`, `agent`, `tool_name`, `step`, `steps` +- No persistence into conversation history +- Auto-open on send, auto-close shortly after success or error + +## Recommended implementation + +### 1. Add a dedicated orchestration panel component +Create a presentational component, e.g. `frontend/src/components/chat/OrchestrationPanel.vue`, responsible only for rendering: +- Header: `JARVIS CONTROL`, current phase, status chip (`ACTIVE`, `COMPLETE`, `ERROR`) +- Vertical agent bus: + - `JARVIS` + - `planner` + - `executor` + - `analyst` + - `librarian` +- Recent event feed limited to the latest 3-5 items + +Keep rendering logic out of `index.vue` as much as possible so the page stays manageable. + +### 2. Expand transient chat-view state in `useChatView.ts` +Replace the single `thinkingState`-only UX with a richer transient orchestration session owned by the composable. Suggested state shape: +- `thinkingState`: preserve current raw progress snapshot for compatibility +- `orchestrationPanelVisible: boolean` +- `orchestrationStatus: 'idle' | 'active' | 'complete' | 'error'` +- `activeAgent: string | null` +- `visitedAgents: string[]` +- `eventFeed: Array<{ id: string; label: string; kind: 'info' | 'tool' | 'success' | 'error' }>` +- `panelPhaseLabel: string` +- `closeTimer` handle for delayed auto-close + +This state should be reset at the start of each `sendMessage()` call and never written into the conversation store. + +### 3. Map existing stream events into panel state +Inside `conversationApi.chatStream(...).onProgress`: +- Open the panel on the first progress event if not already visible +- Update `thinkingState` as today +- Derive a display phase from `payload.stage` +- Set `activeAgent` from `payload.agent` +- Add `payload.agent` to `visitedAgents` if new +- Push short event-feed items using priority: + 1. `payload.step` + 2. `payload.tool_name` -> `璋冪敤宸ュ叿 路 {tool}` + 3. `payload.label` +- If `payload.steps` exists, only surface the first meaningful item as an event instead of dumping the whole list into the panel +- Trim event feed to latest 5 entries + +### 4. Change completion behavior +Current code clears `thinkingState` immediately after stream completion or error. For the new experience: +- On success: + - set panel status to `complete` + - add a final event like `鍝嶅簲宸茬敓鎴恅 + - append assistant message to store as today + - keep panel visible for ~1000-1500ms, then hide and reset transient panel state +- On error: + - set panel status to `error` + - add error event using the error message + - keep panel visible slightly longer (e.g. ~1600ms), then hide and reset + +This preserves the cinematic finish while keeping the panel ephemeral. + +### 5. Update page layout in `src/pages/chat/index.vue` +Restructure the main chat area so the central chat surface and right-side orchestration panel can coexist: +- Keep existing left session sidebar unchanged +- Wrap the current chat section and new panel in a horizontal content shell +- Mount `` to the right of the message/input area +- Only show the panel when `orchestrationPanelVisible` is true +- Keep the inline thinking bubble minimal or remove most of its detail once the side panel is active, so the UI does not duplicate orchestration information in two places + +### 6. Styling direction +V1 styling should match the approved 鈥淎I control center鈥 concept: +- narrow right panel (`~340px`) +- dark glass background, subtle cyan edge glow +- vertical bus with one large `JARVIS` node and four smaller agent nodes +- active node: bright border + pulse +- visited node: low residual glow +- event feed: compact short system phrases +- entrance/exit: slide + fade + +## File-level change plan + +### `frontend/src/pages/chat/composables/useChatView.ts` +- Add orchestration session state and reset helpers +- Add progress-to-panel mapping helper +- Add delayed close helper +- Preserve existing send/stream logic while extending transient UI state + +### `frontend/src/pages/chat/index.vue` +- Import panel component +- Bind panel props from `useChatView()` +- Adjust layout to support central chat + right panel +- Reduce duplication between inline thinking bubble and right-side orchestration UI + +### `frontend/src/components/chat/OrchestrationPanel.vue` +- New component for header, agent bus, event feed, and status visualization + +## Suggested event text mapping +- `thinking` -> `璇锋眰鎺ュ叆`, `璇箟瑙f瀽涓璥 +- `planning` -> `浠诲姟鎷嗚В涓璥, `鐢熸垚鎵ц璺緞` +- `tool` + tool name -> `璋冪敤宸ュ叿 路 {tool_name}` +- `responding` -> `姝e湪姹囨诲搷搴擿 +- success -> `鍝嶅簲宸茬敓鎴恅 +- error -> `浠诲姟鎵ц涓柇` + +## Risks and mitigations +- **Duplicate cognition with inline thinking bubble**: keep the bubble lightweight once panel exists +- **Too many events**: cap the feed to 5 and dedupe consecutive identical labels +- **Panel state leaking across conversation switches**: reset on `newConversation()` and `selectConversation()` when appropriate +- **Abrupt close**: use short delayed close timers and clear any existing timer before starting a new request + +## Verification checklist +1. Send a message and confirm the right panel slides in before the final assistant bubble appears. +2. Confirm active agent highlighting changes as stream progress changes. +3. Confirm event feed shows short orchestration phrases, not raw backend payload dumps. +4. Confirm the panel auto-closes shortly after success. +5. Confirm the panel shows error state briefly, then closes on failure. +6. Confirm switching conversations or starting a new one does not preserve the previous request's orchestration state. +7. Confirm the main chat remains the dominant reading surface and the panel does not push message content into unreadable widths. diff --git a/frontend/task_plan.md b/frontend/task_plan.md new file mode 100644 index 0000000..fe39803 --- /dev/null +++ b/frontend/task_plan.md @@ -0,0 +1,28 @@ +# Task Plan: Dual Telemetry Control Panel + +## Goal +Add a minimal viable dual telemetry module to the chat page right-side JARVIS CONTROL panel so it shows real system metric sparklines (CPU/MEM/DISK) and live session activity telemetry from chat progress events, while staying consistent with the current sci-fi UI. + +## Phases +- [x] Phase 1: Plan and setup +- [x] Phase 2: Research existing chat panel and data flow +- [ ] Phase 3: Define implementation approach and data contracts +- [ ] Phase 4: Review and deliver + +## Key Questions +1. Which metrics should be real machine telemetry versus session-derived telemetry? +2. What is the smallest backend contract needed to make the panel feel actually alive? +3. How should the new chart blocks fit into the current control panel without overwhelming the chat area? + +## Decisions Made +- Use a mixed telemetry model: system metrics from backend polling, session activity from existing stream events. +- Prefer lightweight SVG or custom-rendered sparklines instead of adding a charting library. +- Keep the current right-side control panel and insert telemetry blocks into it rather than creating a second dashboard. +- Make system metrics real: CPU, memory, and disk values must come from backend runtime state. +- Make session activity real: derive the waveform from actual progress, tool, and chunk events from the current chat stream. + +## Errors Encountered +- Existing plan file reflected the earlier orchestration-panel-only scope: replaced it with the new telemetry-focused plan so current goals stay in attention. + +## Status +**Currently in Phase 3** - Finalizing the implementation plan, file touch points, and minimal data contracts for the dual telemetry panel. diff --git a/knowledge_ingestion_plan.md b/knowledge_ingestion_plan.md new file mode 100644 index 0000000..451cff8 --- /dev/null +++ b/knowledge_ingestion_plan.md @@ -0,0 +1,210 @@ +# Knowledge Ingestion Normalization Plan + +## Goal +Introduce a unified structured-markdown ingestion pipeline for the knowledge center: MinerU for PDF, existing parsers for DOCX/XLSX/CSV/MD/TXT, persisted normalized content, and lightweight hierarchical chunk semantics. + +## Scope +- Backend document parsing and normalization flow +- Document persistence model updates +- Incremental retrieval/indexing integration +- Backfill/reindex strategy for existing documents +- Test strategy for parser, router, and migration behavior + +## Non-Goals +- Full parent-child chunk graph tables in this phase +- Rewriting all chunking logic to markdown-first immediately +- Replacing all non-PDF parsers with a new framework +- Solving every OCR/image-understanding case in the first pass + +## Architecture Decisions +- **PDF parser:** MinerU +- **Other parsers:** keep current implementations for DOCX/XLSX/CSV/MD/TXT +- **Canonical intermediate representation:** `ParsedDocument + structured_markdown` +- **Canonical persisted content:** add `normalized_content` to `documents` +- **Hierarchy model:** metadata-based lightweight semantics, not hard foreign-key parent-child chunk tables +- **Migration strategy:** additive schema change + on-demand rebuild/reindex + +## Target Flow +1. Upload file +2. Parse by type + - PDF -> MinerU -> normalize to ParsedDocument + - Other formats -> current parser -> ParsedDocument +3. Render `ParsedDocument` into `structured_markdown` +4. Persist document record including `normalized_content` +5. Build chunks (initially still from nodes, enriched with lightweight hierarchy metadata) +6. Index into vector store +7. Serve preview from `normalized_content` + +## Data Model Changes +### documents table +Add fields: +- `normalized_content TEXT NULL` +- `normalized_format VARCHAR(50) NULL` (value like `structured_markdown`) +- optional later: `normalization_version VARCHAR(50) NULL` + +### document_chunks metadata +Enrich chunk metadata with lightweight hierarchy keys: +- `chunk_level` +- `parent_key` +- `block_key` +- existing structural metadata remains (`section_path`, `section_title`, `page_number`, `sheet_name`, `row_start`, `row_end`, `content_type`) + +Rationale: +- Supports grouped retrieval and contextual reconstruction +- Avoids introducing a relational chunk tree prematurely + +## Backend Implementation Steps +### Phase 1: Schema and persistence +Files: +- `backend/app/models/document.py` +- `backend/app/database.py` +- `backend/app/schemas/document.py` +- tests under `backend/tests/backend/app` + +Changes: +- Add `normalized_content` and `normalized_format` to `Document` +- Extend `ensure_document_columns()` to backfill the new columns for existing databases +- Expose `normalized_content` only where needed for preview/read APIs (avoid broad API expansion if not required yet) + +### Phase 2: Introduce structured markdown renderer +Files: +- `backend/app/services/document_service.py` +- possibly a new helper module if the renderer gets too large, but prefer keeping it local initially + +Changes: +- Add `_render_structured_markdown(parsed: ParsedDocument) -> str` +- Keep current per-format parsing functions +- After parsing, render once and store into `document.normalized_content` +- Add `normalized_format='structured_markdown'` + +Rendering guidance: +- headings -> markdown headings +- paragraphs/text -> plain markdown paragraphs +- CSV/XLSX tables -> markdown table blocks or fenced structured table blocks when tables are too large/wide +- PDF page boundaries -> explicit page markers +- preserve contextual markers in metadata even if markdown cannot express everything perfectly + +### Phase 3: MinerU integration for PDF +Files: +- `backend/app/services/document_service.py` +- `backend/pyproject.toml` / lockfile if dependencies are added +- config if MinerU requires configurable paths/options + +Changes: +- Replace PDF branch with MinerU-backed parsing +- Map MinerU output into internal `ParsedNode`/`ParsedDocument` +- Preserve page and block order +- Represent image blocks as markdown placeholders plus metadata + +Image policy: +- First pass: extract image block references, page number, nearby text, and optional captions +- Do not perform full image understanding for every image in phase 1 +- Design metadata so high-value image understanding can be added later + +### Phase 4: Chunk metadata enrichment +Files: +- `backend/app/services/document_service.py` +- `backend/app/services/knowledge_service.py` +- tests + +Changes: +- Extend `_build_chunks()` to include lightweight hierarchy metadata: + - section headings become natural parent keys + - row batches / sheet blocks get stable block keys + - PDF page/section blocks preserve ordered grouping +- Keep current retrieval behavior, but let `_get_related_chunks()` benefit from richer metadata if helpful + +### Phase 5: Preview and rebuild behavior +Files: +- `backend/app/routers/document.py` +- `backend/app/services/document_service.py` + +Changes: +- `get_document_content()` should prefer `normalized_content` +- Fallback to legacy file reading only when normalized content is absent +- Rebuild/reindex paths should regenerate normalized content before chunk rebuild/indexing + +### Phase 6: Backfill strategy +Approach: +- Add a rebuild endpoint or reuse existing reindex flow to backfill `normalized_content` +- Existing documents can be migrated lazily: + - when opened + - when reindexed + - or via an admin/batch rebuild command later + +This avoids a risky one-shot migration. + +## Error Handling Changes +Current issue: +- Upload route can leak parser/dependency problems as generic 500s. + +Changes: +- Convert expected parser/business errors to explicit 4xx responses where appropriate +- For missing optional parser dependencies, return clear messages such as: + - `DOCX parsing dependency missing: python-docx` + - `PDF parsing dependency missing/configuration invalid` +- Keep true unexpected exceptions as 500s + +Files: +- `backend/app/routers/document.py` +- `backend/app/services/document_service.py` + +## Testing Plan +### Backend unit/integration tests +1. Schema migration test for new `documents` columns +2. Renderer tests: + - markdown headings preserved + - section paths retained in metadata + - xlsx/csv table blocks rendered predictably + - pdf page markers preserved from MinerU mapping +3. Upload tests: + - successful DOCX/XLSX/CSV/MD/TXT upload stores `normalized_content` + - PDF upload stores `normalized_content` + - missing dependency returns clear error instead of generic 500 where applicable +4. Rebuild/reindex tests: + - normalized content regenerated + - chunks rebuilt with hierarchy metadata +5. Retrieval tests: + - related chunk lookup still works with enriched metadata + +### Frontend tests +Only if the UI surfaces normalized preview directly in this phase: +- knowledge view preview prefers normalized content from API +- no regression in upload and refresh persistence behavior + +## Suggested Execution Order +1. Add schema fields + migration guard +2. Add structured markdown renderer for current parsers +3. Store normalized content on upload +4. Update content preview to read normalized content first +5. Enrich chunk metadata with lightweight hierarchy keys +6. Integrate MinerU for PDF +7. Add rebuild/backfill path +8. Expand tests + +## Risks and Mitigations +### Risk: MinerU integration complexity +Mitigation: +- isolate MinerU to PDF branch only +- keep internal ParsedDocument contract stable + +### Risk: markdown rendering loses structure +Mitigation: +- preserve critical structure in metadata +- use explicit block markers for page/sheet/table boundaries + +### Risk: broad retrieval regressions +Mitigation: +- keep chunking source node-based initially +- change one layer at a time + +### Risk: old documents lack normalized content +Mitigation: +- lazy backfill during preview/reindex + +## Deliverable Recommendation +Implement in small PR-sized slices: +1. schema + normalized renderer + preview fallback +2. hierarchy metadata enrichment +3. MinerU PDF integration +4. rebuild/backfill tooling diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..5b38616 --- /dev/null +++ b/notes.md @@ -0,0 +1,42 @@ +# Notes: Jarvis Knowledge Brain Blueprint + +## Current-State Findings +- Existing source domains already exist separately: conversations, documents, todos, tasks, forum posts. +- Current long-term memory only comes from conversation extraction via `UserMemory`. +- Current graph build path only uses indexed document chunks. +- Scheduler infrastructure already exists and can host daily brain-learning jobs. +- Frontend already exposes a `鐭ヨ瘑澶ц剳` navigation entry, but it currently points to the graph page. + +## Synthesized Findings + +### What can be reused +- `memory_service` as a seed for conversation extraction and recall. +- `scheduler_service` as the base for daily learning workflows. +- `tag_service` as an early foundation for brain tags. +- Existing business tables as authoritative raw source records. + +### What is missing +- Unified event layer across all source systems. +- Candidate memory layer between raw events and durable brain memory. +- Timeline-aware memory model with reinforcement / archival states. +- Retrieval path that combines long-term memory with recent relevant events. +- Brain-specific APIs and a dedicated frontend dashboard module. + +### Phase 1 objective +- Build the minimum architecture needed for a real event-driven brain: + - BrainEvent + - BrainCandidate + - BrainMemory + - BrainTag and link tables + - ingestion services + - daily learning job + - retrieval integration + - brain dashboard APIs + +## Additional Findings: Knowledge Parsing Normalization +- Current document ingestion parses each format separately and builds chunks directly from ParsedNode items. +- Current chunks already carry structural metadata, but there is no explicit parent-child chunk graph. +- The agreed direction is to use MinerU for PDF only, keep existing parsers for DOCX/XLSX/CSV/MD/TXT, and converge all outputs into structured markdown. +- normalized_content should be persisted on documents so preview, rebuild, and future chunking can reuse the same canonical text. +- Lightweight hierarchy should be represented in chunk metadata first, not in a new relational tree schema. +- Current DOCX upload failure in the running environment is caused by a missing python-docx installation in the active backend environment. diff --git a/task_plan.md b/task_plan.md new file mode 100644 index 0000000..0108e71 --- /dev/null +++ b/task_plan.md @@ -0,0 +1,27 @@ +# Task Plan: Jarvis Knowledge Brain Phase 1 Blueprint + +## Goal +Create a practical phase-1 implementation blueprint for the event-driven knowledge brain, covering backend models, services, scheduler jobs, retrieval integration, APIs, and frontend brain module structure. + +## Phases +- [x] Phase 1: Plan and setup +- [x] Phase 2: Research/gather information +- [x] Phase 3: Draft blueprint +- [x] Phase 4: Review and deliver + +## Key Questions +1. Which new persistence models are required for an event-driven knowledge brain? +2. How should existing conversation, document, todo, task, and forum data flow into the brain? +3. What should phase 1 include versus defer to later phases? +4. How should the frontend brain module be structured before full graph intelligence exists? + +## Decisions Made +- Use an event-driven brain architecture instead of extending the current graph-only flow. +- Keep the current graph as a projection/view layer, not the brain source of truth. +- Phase 1 should prioritize unified ingestion, candidate generation, long-term memory storage, and retrieval integration. + +## Errors Encountered +- None yet. + +## Status +**Completed** - Separate implementation plan drafted in `knowledge_ingestion_plan.md` and supporting notes updated.