feat(copilot): use stream event instead of hardcoded list for long-running tools

Replace hardcoded LONG_RUNNING_TOOLS list with event-based detection.
Frontend now listens for 'long-running-start' stream events from backend.

Changes:
- Update ToolWrapper to accept message prop and check for long-running-start events
- Pass message to all ToolWrapper instances in ChatMessagesContainer
- Remove long-running-tools.ts (hardcoded list)
- Check if any message part has type 'long-running-start' with matching toolCallId
- Update comments to be more generic ("UI feedback" instead of "mini-game")

Benefits:
- Single source of truth (backend is_long_running property)
- No list synchronization needed between backend and frontend
- More flexible - backend can decide at runtime
- Cleaner architecture using existing streaming infrastructure
This commit is contained in:
Zamil Majdy
2026-02-21 18:12:36 +07:00
parent c08ba6a818
commit 89785c88f9
4 changed files with 93 additions and 31 deletions

View File

@@ -1887,3 +1887,67 @@
2026-02-21 18:10:37,638 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:37,652 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:37,653 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:39,649 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:39,655 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:39,656 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:41,613 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:41,620 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:41,620 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:43,632 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:43,640 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:43,641 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:45,740 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:45,755 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:45,757 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:47,621 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:47,625 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:47,626 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:49,629 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:49,635 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:49,636 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:51,629 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:51,634 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:51,634 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:53,626 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:53,629 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:53,630 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:55,634 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:55,639 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:55,640 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:57,645 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:57,655 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:57,656 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:10:59,633 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:10:59,638 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:10:59,639 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:01,633 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:01,640 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:01,641 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:03,642 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:03,648 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:03,648 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:05,644 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:05,647 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:05,648 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:07,653 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:07,662 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:07,663 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:09,639 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:09,645 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:09,646 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:11,645 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:11,650 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:11,651 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:13,627 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:13,632 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:13,633 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:15,683 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:15,698 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:15,700 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:17,627 INFO Loading session 076672b7-4096-4dc8-a1b5-cf54ce3a4544 from cache: message_count=49, roles=['user', 'assistant', 'tool', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'user', 'user', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'user', 'assistant', 'tool', 'assistant', 'user', 'assistant', 'tool', 'tool', 'assistant', 'tool', 'assistant']
2026-02-21 18:11:17,632 INFO [GET_SESSION] session=076672b7-4096-4dc8-a1b5-cf54ce3a4544, active_task=False, msg_count=49, last_role=assistant
2026-02-21 18:11:17,633 INFO 127.0.0.1:53386 - "GET /api/chat/sessions/076672b7-4096-4dc8-a1b5-cf54ce3a4544 HTTP/1.1" 200
2026-02-21 18:11:25,345 INFO 127.0.0.1:55247 - "GET /api/chat/sessions?limit=50 HTTP/1.1" 200
2026-02-21 18:12:34,235 INFO Running job "report_late_executions (trigger: interval[0:05:00], next run at: 2026-02-21 11:17:34 UTC)" (scheduled at 2026-02-21 11:12:34.213789+00:00)
2026-02-21 18:12:34,275 INFO Job "report_late_executions (trigger: interval[0:05:00], next run at: 2026-02-21 11:17:34 UTC)" executed successfully
2026-02-21 18:12:34,276 INFO [Scheduler] Job report_late_executions completed successfully.

View File

@@ -212,6 +212,8 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
message={message}
>
<FindBlocksTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -222,6 +224,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<FindAgentsTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -232,6 +235,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<SearchDocsTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -241,6 +245,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<RunBlockTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -251,6 +256,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<RunAgentTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -260,6 +266,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<CreateAgentTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -269,6 +276,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<EditAgentTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -278,6 +286,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<ViewAgentOutputTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -287,9 +296,11 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<SearchFeatureRequestsTool
part={part as ToolUIPart}
message={message}
/>
</ToolWrapper>
);
@@ -298,6 +309,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<CreateFeatureRequestTool part={part as ToolUIPart} />
</ToolWrapper>
@@ -310,6 +322,7 @@ export const ChatMessagesContainer = ({
<ToolWrapper
key={`${message.id}-${i}`}
part={part as ToolUIPart}
message={message}
>
<GenericTool part={part as ToolUIPart} />
</ToolWrapper>

View File

@@ -1,28 +1,33 @@
import type { ToolUIPart } from "ai";
import { isLongRunningTool } from "../../tools/long-running-tools";
import type { ToolUIPart, UIDataTypes, UIMessage, UITools } from "ai";
import { LongRunningToolDisplay } from "../LongRunningToolDisplay/LongRunningToolDisplay";
interface Props {
part: ToolUIPart;
message: UIMessage<unknown, UIDataTypes, UITools>;
children: React.ReactNode;
}
/**
* Wrapper for all tool components. Automatically shows mini-game
* for long-running tools by checking LONG_RUNNING_TOOLS list.
* Wrapper for all tool components. Automatically shows UI feedback (e.g., mini-game)
* for long-running tools by detecting StreamLongRunningStart events from the backend.
*/
export function ToolWrapper({ part, children }: Props) {
// Extract tool name from part.type (e.g., "tool-create_agent" -> "create_agent")
const toolName = part.type.replace(/^tool-/, "");
export function ToolWrapper({ part, message, children }: Props) {
const isStreaming =
part.state === "input-streaming" || part.state === "input-available";
// Check if this tool has a long-running-start event in the message
const isLongRunning = message.parts.some(
(p) =>
p.type === "long-running-start" &&
"toolCallId" in p &&
"toolCallId" in part &&
p.toolCallId === part.toolCallId,
);
return (
<>
{/* Automatically show mini-game if tool is long-running and streaming */}
{isLongRunningTool(toolName) && (
<LongRunningToolDisplay isStreaming={isStreaming} />
)}
{/* Show UI feedback if tool is long-running and streaming */}
{isLongRunning && <LongRunningToolDisplay isStreaming={isStreaming} />}
{/* Render the actual tool component */}
{children}
</>

View File

@@ -1,20 +0,0 @@
/**
* Tools that take a long time to execute (several minutes).
* These tools will automatically show the mini-game while executing.
*
* This list matches the backend tools where is_long_running=True.
*/
export const LONG_RUNNING_TOOLS = [
"create_agent",
"edit_agent",
"customize_agent",
] as const;
export type LongRunningToolName = (typeof LONG_RUNNING_TOOLS)[number];
/**
* Check if a tool is marked as long-running.
*/
export function isLongRunningTool(toolName: string): boolean {
return LONG_RUNNING_TOOLS.includes(toolName as LongRunningToolName);
}