diff --git a/extensions/pi-remote-control/index.ts b/extensions/pi-remote-control/index.ts index 86703ee..dd6b9f8 100644 --- a/extensions/pi-remote-control/index.ts +++ b/extensions/pi-remote-control/index.ts @@ -74,6 +74,11 @@ export default function remoteControl(pi: ExtensionAPI) { updateStatus(ctx); }); + pi.on("session_switch", async (_event, ctx) => { + server?.sync(ctx); + updateStatus(ctx); + }); + pi.on("session_shutdown", async () => { if (server) { await server.stop(); diff --git a/extensions/pi-remote-control/messages.ts b/extensions/pi-remote-control/messages.ts index e65a8dd..549ba6a 100644 --- a/extensions/pi-remote-control/messages.ts +++ b/extensions/pi-remote-control/messages.ts @@ -79,3 +79,25 @@ export function getBranchMessages(ctx: ExtensionContext): RenderMsg[] { } return out; } + +export function buildSyncMessage(ctx: ExtensionContext): { + type: "sync"; + messages: RenderMsg[]; + state: { + isStreaming: boolean; + model: string | undefined; + cwd: string; + sessionName: string | undefined; + }; +} { + return { + type: "sync", + messages: getBranchMessages(ctx), + state: { + isStreaming: !ctx.isIdle(), + model: ctx.model?.id, + cwd: ctx.cwd, + sessionName: ctx.sessionManager.getSessionName(), + }, + }; +} diff --git a/extensions/pi-remote-control/server.ts b/extensions/pi-remote-control/server.ts index 1560173..e28c760 100644 --- a/extensions/pi-remote-control/server.ts +++ b/extensions/pi-remote-control/server.ts @@ -16,7 +16,7 @@ import { generateSessionId, parseCookies, } from "./auth.js"; -import { getBranchMessages } from "./messages.js"; +import { buildSyncMessage } from "./messages.js"; import { buildHTML } from "./html.js"; // Load ws (bundled with pi) without needing @types/ws installed locally @@ -29,6 +29,7 @@ const { WebSocketServer, OPEN } = wsModule; export interface RemoteServer { broadcast: (msg: object) => void; + sync: (ctx: ExtensionContext) => void; stop: () => Promise; clientCount: () => number; onClientChange: (cb: () => void) => void; @@ -79,6 +80,10 @@ export function startServer(pi: ExtensionAPI, ctx: ExtensionContext): Promise { const url = new URL(req.url ?? "/", "http://localhost"); const pathname = url.pathname; @@ -160,18 +165,7 @@ export function startServer(pi: ExtensionAPI, ctx: ExtensionContext): Promise { resolve({ broadcast, + sync, stop: () => new Promise((res) => { // Forcefully kill all WebSocket clients — terminate() sends no