From 5890d16b3a2017e910eecd5d920c86e8714147d6 Mon Sep 17 00:00:00 2001 From: DoSun Date: Mon, 11 May 2026 17:16:25 +0800 Subject: [PATCH] feat(server): emit session.updated on title generation with fallback --- src/server/sessionHandle.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/server/sessionHandle.ts b/src/server/sessionHandle.ts index bb30301a3..933f3e309 100644 --- a/src/server/sessionHandle.ts +++ b/src/server/sessionHandle.ts @@ -66,6 +66,8 @@ export class SessionHandle { private _prompting = false private _lastMessageUuid: string | null = null private _controlChannel = new ControlChannel() + private _titleGenerationAttempted = false + private _firstPromptContent?: string get status(): SessionState { return this._status @@ -420,6 +422,19 @@ export class SessionHandle { this.promptResolve = null this.promptReject = null } + if (this._firstPromptContent && !this._titleGenerationAttempted) { + this._titleGenerationAttempted = true + const content = this._firstPromptContent + void this.sendControlRequest( + { subtype: 'generate_session_title', description: content, persist: true }, + 30_000, + ).then((res) => { + const title = (res.title as string) || content.slice(0, 100) + this.setTitle(title) + }).catch(() => { + this.setTitle(content.slice(0, 100)) + }) + } }, emitEvent: (event, data) => this.emitEvent(event, data), emitOpencodeEvent: (event, props) => this.emitOpencodeEvent(event, props), @@ -431,6 +446,7 @@ export class SessionHandle { setTitle(title: string): void { this._title = title + this.emitEvent('ready', this.getInfo()) } async sendControlRequest( @@ -509,6 +525,10 @@ export class SessionHandle { this.writeStdin(userMsg) + if (!this._title && !this._titleGenerationAttempted) { + this._firstPromptContent = content + } + return new Promise((resolve, reject) => { this.promptResolve = (value) => { this._prompting = false