修复版本1.0.7的若干问题 (#11)

* fix/ 0:00 audio ui

* fix/ persist memoir image state and collapse voice history

Keep generated chapter images from staying in processing after successful uploads, and restore segmented voice recordings as a single audio message when reopening conversations.

Made-with: Cursor

* fix/ persist local conversation state and stabilize voice UI

Keep CreateMemory conversations driven by Room so recent text and audio survive page exits, and prevent stale 0:00 voice bubbles while list ordering follows the latest local message time.

Made-with: Cursor

* fix/ server-side root cause for conversation list time and message timestamps

- Add Conversation.last_message_at column with migration and index
- Update last_message_at on text message, audio segment, and AI response
- Sort conversation list by COALESCE(last_message_at, started_at) DESC
- Return real per-message timestamps from Redis history instead of now()
- Pass user_message_timestamp through agent pipeline to avoid LLM delay skew
- Remove all debug logging from server, client, and CI workflow
- Restore import json in conversation_agent (was broken by debug removal)
- Client: remove DebugRuntimeLogger, stop sending transcript as text message

Made-with: Cursor

---------

Co-authored-by: Kevin <kevin@brighteng.org>
This commit is contained in:
Sully
2026-03-14 23:58:46 +08:00
committed by GitHub
parent 9636c059d0
commit c2ce4c61f1
29 changed files with 1041 additions and 216 deletions

View File

@@ -210,6 +210,7 @@ class WebSocketBaselineTest(unittest.IsolatedAsyncioTestCase):
self.assertEqual(len(segments), 1)
self.assertEqual(segments[0].transcript_text, "你好")
self.assertIsNone(segments[0].audio_url)
self.assertIsNotNone(conversation.last_message_at)
fake_manager.background_runner.queue_message.assert_awaited_once()
process_user_message_mock.assert_awaited_once()
@@ -269,6 +270,7 @@ class WebSocketBaselineTest(unittest.IsolatedAsyncioTestCase):
self.assertEqual(len(segments), 1)
self.assertEqual(segments[0].transcript_text, "这是转写结果")
self.assertEqual(segments[0].audio_url, "audio:12s")
self.assertIsNotNone(conversation.last_message_at)
transcript_msgs = [
item["message"]