Skip to content

Commit 68e06b9

Browse files
SunnyShu0925claudesteipete
authored
fix(gateway): include session label in deriveSessionTitle fallback chain (#98841)
* fix(gateway): include session label in deriveSessionTitle fallback chain When a session is renamed with /name, the user-provided label is persisted in sessions.json but was ignored by deriveSessionTitle. This caused the TUI session picker and other derived-title consumers to show auto-generated or UUID-based names instead of the user's label. Add entry.label to the deriveSessionTitle fallback chain after displayName and subject, before the auto-derived firstUserMessage and sessionId fallbacks. This aligns with the existing ACP translator precedence (derivedTitle ?? displayName ?? label ?? key). Related to #98742 Co-Authored-By: Claude Opus 4.8 <[email protected]> * test(gateway): tighten session label precedence coverage * fix(gateway): prioritize explicit session labels * fix(commands): preserve named-session suggestions --------- Co-authored-by: Claude Opus 4.8 <[email protected]> Co-authored-by: Peter Steinberger <[email protected]>
1 parent 76cf1b0 commit 68e06b9

4 files changed

Lines changed: 37 additions & 1 deletion

File tree

src/auto-reply/reply/commands-name.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,15 @@ describe("name command", () => {
170170
totalTokens: 0,
171171
totalTokensFresh: true,
172172
label: "Billing rework",
173+
displayName: "Dashboard session",
173174
},
174175
});
175176

176177
const params = buildNameParams("/name", storePath);
177178
const result = await handleNameCommand(params, true);
178179

179180
expect(result?.reply?.text).toContain("Current session name: Billing rework");
181+
expect(result?.reply?.text).toContain("Suggested name: Dashboard session");
180182
});
181183

182184
it("seeds a brand-new native session entry that is not yet persisted", async () => {

src/auto-reply/reply/commands-name.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ export const handleNameCommand: CommandHandler = async (params, allowTextCommand
8383
getSessionEntry({ sessionKey: params.sessionKey, storePath: params.storePath }) ??
8484
params.sessionEntry;
8585
const current = normalizeOptionalString(entry?.label);
86-
const suggestion = deriveSessionTitle(entry);
86+
const suggestionEntry = entry ? { ...entry, label: undefined } : undefined;
87+
const suggestion = deriveSessionTitle(suggestionEntry);
8788
const lines: string[] = [];
8889
lines.push(
8990
current ? `Current session name: ${current}` : "This session has no custom name yet.",

src/gateway/session-utils.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,6 +2510,34 @@ describe("deriveSessionTitle", () => {
25102510
} as SessionEntry;
25112511
expect(deriveSessionTitle(entry)).toBe("Actual Subject");
25122512
});
2513+
2514+
test.each([
2515+
{
2516+
name: "uses a label before the first user message",
2517+
fields: { label: "Label via /name" },
2518+
firstUserMessage: "Hello, what can you do?",
2519+
expected: "Label via /name",
2520+
},
2521+
{
2522+
name: "prefers an explicit label over display and group metadata",
2523+
fields: {
2524+
displayName: "Display Name",
2525+
subject: "Group Subject",
2526+
label: "Label via /name",
2527+
},
2528+
firstUserMessage: undefined,
2529+
expected: "Label via /name",
2530+
},
2531+
{
2532+
name: "ignores a blank label",
2533+
fields: { label: " " },
2534+
firstUserMessage: "Hello!",
2535+
expected: "Hello!",
2536+
},
2537+
])("$name", ({ fields, firstUserMessage, expected }) => {
2538+
const entry = { sessionId: "abc123", updatedAt: Date.now(), ...fields } as SessionEntry;
2539+
expect(deriveSessionTitle(entry, firstUserMessage)).toBe(expected);
2540+
});
25132541
});
25142542

25152543
describe("resolveGatewayModelSupportsImages", () => {

src/gateway/session-utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,11 @@ export function deriveSessionTitle(
244244
return undefined;
245245
}
246246

247+
const label = normalizeOptionalString(entry.label);
248+
if (label) {
249+
return label;
250+
}
251+
247252
if (normalizeOptionalString(entry.displayName)) {
248253
return normalizeOptionalString(entry.displayName);
249254
}

0 commit comments

Comments
 (0)