From a0338ab6a7607a12763890bdb7451468c9ca6f3d Mon Sep 17 00:00:00 2001 From: Federico Jaramillo Martinez Date: Fri, 8 May 2026 16:17:22 +0200 Subject: [PATCH] Broadcast submitted user prompts --- src/client/src/chatTranscript.ts | 1 + src/client/src/controllers/sessionController.ts | 1 - src/client/src/sessionSocket.ts | 2 +- src/server/sessions/piSessionService.ts | 5 +++++ src/shared/apiTypes.ts | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/client/src/chatTranscript.ts b/src/client/src/chatTranscript.ts index 04f6342..16c83c2 100644 --- a/src/client/src/chatTranscript.ts +++ b/src/client/src/chatTranscript.ts @@ -4,6 +4,7 @@ import { appendShellChunk, finalizeShellMessage, shellStartMessage } from "./she import type { SessionUiEvent } from "./sessionSocket"; export function applyTranscriptEvent(messages: ChatLine[], event: SessionUiEvent): ChatLine[] | undefined { + if (event.type === "message.append") return appendNormalized(messages, event.message); if (event.type === "assistant.delta") return appendText(messages, "assistant", event.text); if (event.type === "tool.start") return appendNormalized(messages, { role: "assistant", content: [{ type: "toolCall", name: event.toolName, arguments: event.args }] }); if (event.type === "tool.end") return appendNormalized(messages, { role: "toolResult", toolName: event.toolName, content: event.content ?? [{ type: "text", text: event.text }], isError: event.isError }); diff --git a/src/client/src/controllers/sessionController.ts b/src/client/src/controllers/sessionController.ts index 4fd3dfc..b98a06d 100644 --- a/src/client/src/controllers/sessionController.ts +++ b/src/client/src/controllers/sessionController.ts @@ -110,7 +110,6 @@ export class SessionController { if (isShellInput(text)) return this.runShell(text); const session = this.getState().selectedSession; if (!session || session.archived === true) return; - this.setState({ messages: [...this.getState().messages, textMessage("user", text)] }); try { await api.prompt(session.id, text, streamingBehavior); } catch (error) { diff --git a/src/client/src/sessionSocket.ts b/src/client/src/sessionSocket.ts index ef3d441..fcd5cc5 100644 --- a/src/client/src/sessionSocket.ts +++ b/src/client/src/sessionSocket.ts @@ -114,7 +114,7 @@ export class GlobalSessionSocket { function isSessionUiEvent(event: unknown): event is SessionUiEvent { const type = eventType(event); - return ["assistant.delta", "tool.start", "tool.end", "shell.start", "shell.chunk", "shell.end", "agent.start", "agent.end", "message.end", "status.update", "activity.update", "command.output", "session.error", "session.name", "pi.event"].includes(type); + return ["message.append", "assistant.delta", "tool.start", "tool.end", "shell.start", "shell.chunk", "shell.end", "agent.start", "agent.end", "message.end", "status.update", "activity.update", "command.output", "session.error", "session.name", "pi.event"].includes(type); } function isGlobalSessionEvent(event: unknown): event is GlobalSessionEvent { diff --git a/src/server/sessions/piSessionService.ts b/src/server/sessions/piSessionService.ts index 8d3f412..e63c098 100644 --- a/src/server/sessions/piSessionService.ts +++ b/src/server/sessions/piSessionService.ts @@ -160,6 +160,7 @@ export class PiSessionService { this.maybeGenerateSessionName(session, text); const behavior = session.isStreaming || session.isCompacting ? streamingBehavior ?? "followUp" : undefined; this.publishActivity(session, session.isCompacting ? "message queued during compaction" : behavior === "steer" ? "steering queued" : behavior === "followUp" ? "message queued" : "prompt accepted", "active"); + this.events.publish(sessionId, { type: "message.append", message: userTextMessage(text) }); void session.prompt(text, behavior === undefined ? undefined : { streamingBehavior: behavior }).catch((error: unknown) => { const message = error instanceof Error ? error.message : String(error); this.publishActivity(session, "error", "error", message); @@ -403,6 +404,10 @@ export class PiSessionService { } } +function userTextMessage(text: string): { role: "user"; content: string } { + return { role: "user", content: text }; +} + function historyMessages(session: AgentSession): unknown[] { const messages: unknown[] = []; for (const entry of session.sessionManager.getBranch()) { diff --git a/src/shared/apiTypes.ts b/src/shared/apiTypes.ts index 47eb8e7..bf29cc6 100644 --- a/src/shared/apiTypes.ts +++ b/src/shared/apiTypes.ts @@ -141,6 +141,7 @@ export type CommandResult = | { type: "unsupported"; message: string }; export type SessionUiEvent = + | { type: "message.append"; message: unknown } | { type: "assistant.delta"; text: string } | { type: "tool.start"; toolName: string; toolCallId: string; summary: string; args?: unknown } | { type: "tool.end"; toolName: string; toolCallId: string; text: string; isError: boolean; content?: unknown }