Skip to content

Commit 705e86a

Browse files
efecnccursoragent
andcommitted
feat(agent-ui): rename session title in list (A6.193)
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent a5eb023 commit 705e86a

5 files changed

Lines changed: 36 additions & 3 deletions

File tree

packages/agent-ui/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ consumption of shared panel shells:
308308
| A6.190 | Deleted session id blocklist ops |
309309
| A6.191 | Hydrate active session resolve |
310310
| A6.192 | Insert session after active tab |
311+
| A6.193 | Rename session title in list |
311312

312313
### A5 complete enough
313314

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { describe, expect, it } from "vitest";
2+
import { renameSessionInList } from "../lib/renameSessionInList.js";
3+
4+
describe("renameSessionInList", () => {
5+
it("renames and stamps updatedAt", () => {
6+
const out = renameSessionInList(
7+
[{ id: "a", title: "Old", updatedAt: 1 }],
8+
"a",
9+
"New",
10+
99,
11+
);
12+
expect(out).toEqual([{ id: "a", title: "New", updatedAt: 99 }]);
13+
});
14+
});

packages/agent-ui/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,8 @@ export {
893893
createUntitledSessionMeta,
894894
} from "./lib/resolveActiveSessionOnHydrate.js";
895895
export { insertSessionAfterActive } from "./lib/insertSessionAfterActive.js";
896+
export { renameSessionInList } from "./lib/renameSessionInList.js";
897+
export type { SessionTitleMeta } from "./lib/renameSessionInList.js";
896898
export type { SessionIdTitle } from "./lib/resolveActiveSessionOnHydrate.js";
897899
export type {
898900
UntitledSessionMeta,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Pure session title rename in a list (A6.193).
3+
*/
4+
5+
export type SessionTitleMeta = { id: string; title: string; updatedAt: number };
6+
7+
/** Rename one session and bump updatedAt; pure, no mutation of input. */
8+
export function renameSessionInList<T extends SessionTitleMeta>(
9+
sessions: readonly T[],
10+
id: string,
11+
title: string,
12+
now: number = Date.now(),
13+
): T[] {
14+
return sessions.map((s) =>
15+
s.id === id ? { ...s, title, updatedAt: now } : s,
16+
);
17+
}

src/modules/ai/store/chatStore.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
resolveActiveSessionOnHydrate,
66
createUntitledSessionMeta,
77
insertSessionAfterActive,
8+
renameSessionInList,
89
} from "@altai/agent-ui";
910
import type { UIMessage } from "ai";
1011
import { native } from "../lib/native";
@@ -1079,9 +1080,7 @@ export const useChatStore = create<StoreState>((set, get) => ({
10791080
},
10801081

10811082
renameSession: (id, title) => {
1082-
const next = get().sessions.map((s) =>
1083-
s.id === id ? { ...s, title, updatedAt: Date.now() } : s,
1084-
);
1083+
const next = renameSessionInList(get().sessions, id, title);
10851084
set({ sessions: next });
10861085
void saveSessionsList(next);
10871086
},

0 commit comments

Comments
 (0)