diff --git a/apps/mobile/src/features/threads/thread-handoff-row.tsx b/apps/mobile/src/features/threads/thread-handoff-row.tsx
index 4b05662595f8f0fccc917781de352660f72aced0..cc36efe1dad07183ff99c612892d70300c27c340 100644
--- a/apps/mobile/src/features/threads/thread-handoff-row.tsx
+++ b/apps/mobile/src/features/threads/thread-handoff-row.tsx
@@ -9,7 +9,7 @@ import type {
ServerProvider,
} from "@t3tools/contracts";
import { Atom } from "effect/reactivity";
-import { Fragment, useMemo } from "react";
+import { useMemo } from "react";
import { Alert, Pressable, View, type ColorValue } from "react-native";
import { AppText as Text } from "../../components/AppText";
import { SymbolView } from "../../components/AppSymbol";
@@ -76,14 +76,17 @@ export function ThreadHandoffDivider(props: {
>
{endpoints.from.map((endpoint, index) => (
-
- {index > 0 ? (
+
+
+ {index < endpoints.from.length - 1 ? (
,
) : null}
-
-
+
))}
{endpoints.from.length > 0 ? (
diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx
index acd68260b9ad5bcc41c382f38c22e29a60bafdc0..ae891d75193ea69b3ecc58b86c8c66512564d430 100644
--- a/apps/web/src/components/ChatView.tsx
+++ b/apps/web/src/components/ChatView.tsx
@@ -7472,10 +7472,13 @@ export default function ChatView(props: ChatViewProps) {
: `${childThreadInputs.length} subagents need input`,
description: childThreadInputs.map((child, index) => (
- {index > 0 ? ", " : null}
- onOpenRelatedThread(child.id)}>
- {child.title}
-
+ {index > 0 ? " " : null}
+
+ onOpenRelatedThread(child.id)}>
+ {child.title}
+
+ {index < childThreadInputs.length - 1 ? "," : null}
+
)),
actions: (
@@ -7643,19 +7646,26 @@ export default function ChatView(props: ChatViewProps) {
? undefined
: presentation.items.map((item, index) => {
const childThreadId = item.childThreadId;
+ const separator = index < presentation.items.length - 1 ? "," : null;
return (
- {index > 0 ? ", " : null}
+ {index > 0 ? " " : null}
{childThreadId === undefined ? (
- item.label
- ) : (
- onOpenRelatedThread(childThreadId)}
- >
+ <>
{item.label}
-
+ {separator}
+ >
+ ) : (
+
+ onOpenRelatedThread(childThreadId)}
+ >
+ {item.label}
+
+ {separator}
+
)}
);
diff --git a/apps/web/src/components/chat/V2LifecycleRow.tsx b/apps/web/src/components/chat/V2LifecycleRow.tsx
index 40421a34e3b77fcbf40c0fafe821e4f032502e72..5206d33acde022fa8c42990743b613dd440b4ed0 100644
--- a/apps/web/src/components/chat/V2LifecycleRow.tsx
+++ b/apps/web/src/components/chat/V2LifecycleRow.tsx
@@ -15,7 +15,6 @@ import {
type HandoffEndpoints,
type HandoffTimelineRun,
} from "@t3tools/client-runtime/handoff";
-import { Fragment } from "react";
import { formatSubagentDisplayTitle } from "@t3tools/client-runtime/state/subagent-display";
import {
ProviderDriverKind,
@@ -562,18 +561,21 @@ export function HandoffRow(props: {
detail={
{fromEndpoints.map((endpoint, index) => (
-
- {index > 0 ? (
-
- ,
-
- ) : null}
+
-
+ {index < fromEndpoints.length - 1 ? (
+
+ ,
+
+ ) : null}
+
))}
{fromEndpoints.length > 0 ? (