pi.on("session_before_metadata_change", async (event, ctx) => { // event.name is the proposed name return { name: event.name.toUpperCase() }; // transform it // or: return { cancel: true }; // reject it});private _isSettingSessionName = false;
setSessionName(name: string): void { if (this._isSettingSessionName) return; // Silently ignore reentrant calls const trimmed = name.trim(); const previousName = this.sessionManager.getSessionName(); this.sessionManager.appendSessionInfo(trimmed);
if (previousName !== trimmed && this._extensionRunner?.hasHandlers("session_metadata_change")) { this._isSettingSessionName = true; void this._extensionRunner.emit({ type: "session_metadata_change", update: { name: trimmed }, }).finally(() => { this._isSettingSessionName = false; }); }}// Allow extensions to transform/cancelconst result = await this._extensionRunner.emit({ type: "session_before_metadata_change", proposedName: trimmed,});if (result?.cancel) return;const finalName = result?.name ?? trimmed;this.sessionManager.appendSessionInfo(finalName);// Then emit session_metadata_change as notificationprivate _isSettingSessionName = false;
setSessionName(name: string): void { if (this._isSettingSessionName) return; this._isSettingSessionName = true; try { const trimmed = name.trim(); const previousName = this.sessionManager.getSessionName(); this.sessionManager.appendSessionInfo(trimmed);
if (previousName !== trimmed && this._extensionRunner?.hasHandlers("session_metadata_change")) { void this._extensionRunner.emit({ type: "session_metadata_change", update: { name: trimmed }, }).finally(() => { this._isSettingSessionName = false; }); return; // Flag cleared in finally } } finally { // Only clear if we didn't start an async emit if (!this._extensionRunner?.hasHandlers("session_metadata_change")) { this._isSettingSessionName = false; } }}private _isSettingSessionName = false;
setSessionName(name: string): void { if (this._isSettingSessionName) return; const trimmed = name.trim(); const previousName = this.sessionManager.getSessionName(); this.sessionManager.appendSessionInfo(trimmed);
if (previousName !== trimmed && this._extensionRunner?.hasHandlers("session_metadata_change")) { this._isSettingSessionName = true; this._extensionRunner.emit({ type: "session_metadata_change", update: { name: trimmed }, }).finally(() => { this._isSettingSessionName = false; }); }}/** * Set the session display name and emit a metadata change event. */setSessionName(name: string): void { const trimmed = name.trim(); const previousName = this.sessionManager.getSessionName(); this.sessionManager.appendSessionInfo(trimmed);
if (previousName !== trimmed && this._extensionRunner?.hasHandlers("session_metadata_change")) { void this._extensionRunner.emit({ type: "session_metadata_change", update: { name: trimmed, }, }); }}// Before:setSessionName: (name) => { this.sessionManager.appendSessionInfo(name);},
// After:setSessionName: (name) => { this.setSessionName(name);},