diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx
index 75dada05f0..058bb5a0db 100644
--- a/packages/app/src/pages/layout/sidebar-items.tsx
+++ b/packages/app/src/pages/layout/sidebar-items.tsx
@@ -16,6 +16,7 @@ import { getAvatarColors, type LocalProject, useLayout } from "@/context/layout"
import { useNotification } from "@/context/notification"
import { usePermission } from "@/context/permission"
import { messageAgentColor } from "@/utils/agent"
+import { sessionTitle } from "@/utils/session-title"
import { sessionPermissionRequest } from "../session/composer/session-request-tree"
import { hasProjectPermissions } from "./helpers"
@@ -101,42 +102,46 @@ const SessionRow = (props: {
warmPress: () => void
warmFocus: () => void
cancelHoverPrefetch: () => void
-}): JSX.Element => (
- {
- props.setHoverSession(undefined)
- if (props.sidebarOpened()) return
- props.clearHoverProjectSoon()
- }}
- >
-
- {props.session.title}
-
-)
+
+
}>
+
+
+
+
+
+
+
+
+
+
0}>
+
+
+
+
+ {title()}
+
+ )
+}
const SessionHoverPreview = (props: {
mobile?: boolean
@@ -319,7 +324,7 @@ export const SessionItem = (props: SessionItemProps): JSX.Element => {
fallback={
diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx
index e1d6da1958..cbabbda72d 100644
--- a/packages/app/src/pages/session/message-timeline.tsx
+++ b/packages/app/src/pages/session/message-timeline.tsx
@@ -29,6 +29,7 @@ import { useSettings } from "@/context/settings"
import { useSDK } from "@/context/sdk"
import { useSync } from "@/context/sync"
import { messageAgentColor } from "@/utils/agent"
+import { sessionTitle } from "@/utils/session-title"
import { parseCommentNote, readCommentMetadata } from "@/utils/comment-note"
import { makeTimer } from "@solid-primitives/timer"
@@ -43,7 +44,6 @@ type MessageComment = {
const emptyMessages: MessageType[] = []
const idle = { type: "idle" as const }
-
type UserActions = {
fork?: (input: { sessionID: string; messageID: string }) => Promise | void
revert?: (input: { sessionID: string; messageID: string }) => Promise | void
@@ -291,6 +291,7 @@ export function MessageTimeline(props: {
return sync.session.get(id)
})
const titleValue = createMemo(() => info()?.title)
+ const titleLabel = createMemo(() => sessionTitle(titleValue()))
const shareUrl = createMemo(() => info()?.share?.url)
const shareEnabled = createMemo(() => sync.data.config.share !== "disabled")
const parentID = createMemo(() => info()?.parentID)
@@ -399,7 +400,7 @@ export function MessageTimeline(props: {
const openTitleEditor = () => {
if (!sessionID()) return
- setTitle({ editing: true, draft: titleValue() ?? "" })
+ setTitle({ editing: true, draft: titleLabel() ?? "" })
requestAnimationFrame(() => {
titleRef?.focus()
titleRef?.select()
@@ -417,7 +418,7 @@ export function MessageTimeline(props: {
if (titleMutation.isPending) return
const next = title.draft.trim()
- if (!next || next === (titleValue() ?? "")) {
+ if (!next || next === (titleLabel() ?? "")) {
setTitle("editing", false)
return
}
@@ -532,7 +533,9 @@ export function MessageTimeline(props: {
}
function DialogDeleteSession(props: { sessionID: string }) {
- const name = createMemo(() => sync.session.get(props.sessionID)?.title ?? language.t("command.session.new"))
+ const name = createMemo(
+ () => sessionTitle(sync.session.get(props.sessionID)?.title) ?? language.t("command.session.new"),
+ )
const handleDelete = async () => {
await deleteSession(props.sessionID)
dialog.close()
@@ -673,7 +676,7 @@ export function MessageTimeline(props: {
-
+
- {titleValue()}
+ {titleLabel()}
}
>
diff --git a/packages/app/src/utils/session-title.ts b/packages/app/src/utils/session-title.ts
new file mode 100644
index 0000000000..ca04c01047
--- /dev/null
+++ b/packages/app/src/utils/session-title.ts
@@ -0,0 +1,7 @@
+const pattern = /^(New session|Child session) - \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
+
+export function sessionTitle(title?: string) {
+ if (!title) return title
+ const match = title.match(pattern)
+ return match?.[1] ?? title
+}