Compare commits
4 Commits
main
...
review-fix
| Author | SHA1 | Date | |
|---|---|---|---|
| d60eff31fe | |||
| d8d792a6e9 | |||
| c93ec2792d | |||
| ab4a185248 |
@@ -101,7 +101,7 @@ async def _process_chat(user_msg: str) -> dict | JSONResponse:
|
|||||||
try:
|
try:
|
||||||
response_text = await agent_chat(
|
response_text = await agent_chat(
|
||||||
_build_context_prefix() + user_msg,
|
_build_context_prefix() + user_msg,
|
||||||
session_id="mobile",
|
session_id=body.get("session_id", "mobile"),
|
||||||
)
|
)
|
||||||
message_log.append(role="user", content=user_msg, timestamp=timestamp, source="api")
|
message_log.append(role="user", content=user_msg, timestamp=timestamp, source="api")
|
||||||
message_log.append(role="agent", content=response_text, timestamp=timestamp, source="api")
|
message_log.append(role="agent", content=response_text, timestamp=timestamp, source="api")
|
||||||
@@ -165,6 +165,11 @@ async def api_upload(file: UploadFile = File(...)):
|
|||||||
if not str(resolved).startswith(str(upload_root)):
|
if not str(resolved).startswith(str(upload_root)):
|
||||||
raise HTTPException(status_code=400, detail="Invalid file name")
|
raise HTTPException(status_code=400, detail="Invalid file name")
|
||||||
|
|
||||||
|
# Validate MIME type
|
||||||
|
allowed_types = ["image/png", "image/jpeg", "image/gif", "application/pdf", "text/plain"]
|
||||||
|
if file.content_type not in allowed_types:
|
||||||
|
raise HTTPException(status_code=400, detail=f"File type {file.content_type} not allowed")
|
||||||
|
|
||||||
contents = await file.read()
|
contents = await file.read()
|
||||||
if len(contents) > _MAX_UPLOAD_SIZE:
|
if len(contents) > _MAX_UPLOAD_SIZE:
|
||||||
raise HTTPException(status_code=413, detail="File too large (max 50 MB)")
|
raise HTTPException(status_code=413, detail="File too large (max 50 MB)")
|
||||||
|
|||||||
@@ -60,7 +60,12 @@ class MessageLog:
|
|||||||
self._conn: sqlite3.Connection | None = None
|
self._conn: sqlite3.Connection | None = None
|
||||||
|
|
||||||
# Lazy connection — opened on first use, not at import time.
|
# Lazy connection — opened on first use, not at import time.
|
||||||
def _ensure_conn(self) -> sqlite3.Connection:
|
@contextmanager
|
||||||
|
def _get_conn(self) -> Generator[sqlite3.Connection, None, None]:
|
||||||
|
path = self._db_path or DB_PATH
|
||||||
|
with closing(sqlite3.connect(str(path), check_same_thread=False)) as conn:
|
||||||
|
conn.row_factory = sqlite3.Row
|
||||||
|
yield conn
|
||||||
if self._conn is None:
|
if self._conn is None:
|
||||||
# Open a persistent connection for the class instance
|
# Open a persistent connection for the class instance
|
||||||
path = self._db_path or DB_PATH
|
path = self._db_path or DB_PATH
|
||||||
|
|||||||
@@ -79,7 +79,17 @@ class WebSocketManager:
|
|||||||
message = ws_event.to_json()
|
message = ws_event.to_json()
|
||||||
disconnected = []
|
disconnected = []
|
||||||
|
|
||||||
for ws in self._connections:
|
import asyncio
|
||||||
|
tasks = [ws.send_text(message) for ws in self._connections]
|
||||||
|
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||||
|
|
||||||
|
disconnected = []
|
||||||
|
for ws, result in zip(self._connections, results):
|
||||||
|
if isinstance(result, Exception):
|
||||||
|
logger.warning(f"WebSocket send error: {result}")
|
||||||
|
disconnected.append(ws)
|
||||||
|
|
||||||
|
# Skip the old loop
|
||||||
try:
|
try:
|
||||||
await ws.send_text(message)
|
await ws.send_text(message)
|
||||||
except ConnectionError:
|
except ConnectionError:
|
||||||
|
|||||||
Reference in New Issue
Block a user