@@ -43,15 +43,6 @@ SPDX-License-Identifier: AGPL-3.0-or-later
4343 let promptGroups = $derived (groups .filter ((group ) => group .kind === ' user' ));
4444 let assistantGroups = $derived (groups .filter ((group ) => group .kind === ' assistant' ));
4545 let latestAssistantId = $derived (assistantGroups .at (- 1 )?.id );
46- let hasActiveAssistant = $derived (
47- Boolean (
48- activeTurnId &&
49- assistantGroups .some (
50- (group ) =>
51- group .turnId === activeTurnId || (! group .turnId && group .id === latestAssistantId ),
52- ),
53- ),
54- );
5546 let unassignedInteractions = $derived (
5647 interactions .filter (
5748 (interaction ) =>
@@ -75,11 +66,25 @@ SPDX-License-Identifier: AGPL-3.0-or-later
7566 activity .turnId ? activity .turnId === group .turnId : group .id === latestAssistantId ,
7667 );
7768 }
78- function currentActivities(): HistoryActivity [] {
79- return activities .filter ((activity ) =>
80- activity .turnId ? activity .turnId === activeTurnId : true ,
69+ function assistantOwnsActivity(activity : HistoryActivity ): boolean {
70+ return activity .turnId
71+ ? assistantGroups .some ((group ) => group .turnId === activity .turnId )
72+ : Boolean (latestAssistantId );
73+ }
74+ function activityPromptOwnerId(activity : HistoryActivity ): string | null {
75+ if (! activity .turnId || assistantOwnsActivity (activity )) return null ;
76+ return promptGroups .findLast ((group ) => group .turnId === activity .turnId )?.id ?? null ;
77+ }
78+ function promptActivities(group : (typeof groups )[number ]): HistoryActivity [] {
79+ if (group .kind !== ' user' ) return [];
80+ return activities .filter ((activity ) => activityPromptOwnerId (activity ) === group .id );
81+ }
82+ function detachedActivities(): HistoryActivity [] {
83+ return activities .filter (
84+ (activity ) => ! assistantOwnsActivity (activity ) && ! activityPromptOwnerId (activity ),
8185 );
8286 }
87+ let detached = $derived (detachedActivities ());
8388 function regularActivities(items : HistoryActivity []): HistoryActivity [] {
8489 return items .filter (
8590 (activity ) => ! activity .label .toLowerCase ().replaceAll (' ' , ' ' ).startsWith (' filechange' ),
@@ -99,6 +104,11 @@ SPDX-License-Identifier: AGPL-3.0-or-later
99104 (group .turnId === activeTurnId || (! group .turnId && group .id === latestAssistantId )),
100105 );
101106 }
107+ function isPromptLive(group : (typeof groups )[number ]): boolean {
108+ return Boolean (
109+ group .kind === ' user' && activeTurnId && (group .turnId === activeTurnId || ! group .turnId ),
110+ );
111+ }
102112 </script >
103113
104114{#snippet inline (parts : CommentaryPart [])}
@@ -164,6 +174,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
164174 {#each groups as group , index (group .id )}
165175 <li class ={group .kind === ' user' ? ' prompt-turn' : ' answer-item' }>
166176 {#if group .kind === ' user' }
177+ {@const ownedActivities = promptActivities (group )}
167178 <div class =" entry-heading" >
168179 <strong >prompt</strong >
169180 {#if group .occurredAt }
@@ -185,6 +196,17 @@ SPDX-License-Identifier: AGPL-3.0-or-later
185196 {ondecision }
186197 {onretry }
187198 />
199+ {#if ownedActivities .length }
200+ <section class ={isPromptLive (group ) ? ' progress-turn' : ' orphan-activity-turn' }>
201+ {#if isPromptLive (group )}
202+ <div class =" entry-heading" ><strong >working</strong ></div >
203+ <ActivityList activities ={regularActivities (ownedActivities )} variant =" live" />
204+ {:else }
205+ <ActivityList activities ={regularActivities (ownedActivities )} />
206+ {/if }
207+ {@render changedFiles (ownedActivities )}
208+ </section >
209+ {/if }
188210 {:else if group .answer !== null }
189211 {@const ownedActivities = turnActivities (group )}
190212 <section class =" answer-turn" >
@@ -267,12 +289,16 @@ SPDX-License-Identifier: AGPL-3.0-or-later
267289 />
268290 </li >
269291 {/if }
270- {#if activeTurnId && ! hasActiveAssistant && currentActivities () .length }
292+ {#if detached .length }
271293 <li class =" progress-item" >
272- <section class =" progress-turn" >
273- <div class =" entry-heading" ><strong >working</strong ></div >
274- <ActivityList activities ={regularActivities (currentActivities ())} variant =" live" />
275- {@render changedFiles (currentActivities ())}
294+ <section class ={activeTurnId ? ' progress-turn' : ' orphan-activity-turn' }>
295+ {#if activeTurnId }
296+ <div class =" entry-heading" ><strong >working</strong ></div >
297+ <ActivityList activities ={regularActivities (detached )} variant =" live" />
298+ {:else }
299+ <ActivityList activities ={regularActivities (detached )} />
300+ {/if }
301+ {@render changedFiles (detached )}
276302 </section >
277303 </li >
278304 {/if }
@@ -311,6 +337,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
311337 }
312338
313339 .commentary-turn ,
340+ .orphan-activity-turn ,
314341 .progress-turn ,
315342 .commentary-content {
316343 padding : 0.5rem 0.625rem ;
0 commit comments