OpenCode titles a session from the conversation, but asynchronously — a finished turn of ours ended up called "Single color in oc-red2.png", better than anything we would generate. Until then the session is literally named "New session - 2026-08-10T15:44:17.178Z". That window is exactly when a session is most visible: /chat/live shows turns that are RUNNING, so the placeholder is what the panel catches, and a live row was being labelled with a timestamp string. Recognise it and treat it as untitled, so the good name arrives on its own. Passing --title on the run was the other option and is worse: it fixes the transient case by permanently replacing opencode own title with a truncated prompt, degrading it where it lasts longest. A pattern match rather than startsWith, because a genuine title is allowed to begin with those words. Two defects the tests caught while writing them: a whitespace-only title was not treated as unnamed, and the mapping let undefined through where a string was required. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
28 lines
1.5 KiB
TypeScript
28 lines
1.5 KiB
TypeScript
import { describe, expect, it } from 'bun:test';
|
|
import { isPlaceholderOpenCodeTitle } from './opencode-sessions';
|
|
|
|
// OpenCode names a session `New session - <ISO>` until it has titled it from the conversation, which it
|
|
// does asynchronously. The strings below are real ones observed on 1.18.16 — both the placeholder and
|
|
// the good title it was replaced by.
|
|
|
|
describe('isPlaceholderOpenCodeTitle', () => {
|
|
it('recognises the placeholder OpenCode uses before it has titled a session', () => {
|
|
expect(isPlaceholderOpenCodeTitle('New session - 2026-08-10T15:44:17.178Z')).toBe(true);
|
|
expect(isPlaceholderOpenCodeTitle('New session - 2026-08-10T12:41:02.757Z')).toBe(true);
|
|
});
|
|
|
|
it('treats an absent or empty title as unnamed too', () => {
|
|
expect(isPlaceholderOpenCodeTitle(undefined)).toBe(true);
|
|
expect(isPlaceholderOpenCodeTitle('')).toBe(true);
|
|
expect(isPlaceholderOpenCodeTitle(' ')).toBe(true);
|
|
});
|
|
|
|
it('keeps a real title, including one that merely mentions a session', () => {
|
|
// The title OpenCode actually gave a turn of ours, and the reason this is a pattern match rather
|
|
// than a `startsWith('New session')`: a genuine title is allowed to begin with those words.
|
|
expect(isPlaceholderOpenCodeTitle('Single color in oc-red2.png')).toBe(false);
|
|
expect(isPlaceholderOpenCodeTitle('New session handling in the runner')).toBe(false);
|
|
expect(isPlaceholderOpenCodeTitle('New session - what should it be called?')).toBe(false);
|
|
});
|
|
});
|