feat(backend): resume + venv PATH + end-to-end F1 smoke (fake-pi-rpc)

- Add PiProcessManager.resume(sessionId, tht): reads provider/model/thinking
  from tht.sessionShow() and calls spawnFor with those values
- Add POST /sessions/:id/resume route: calls mgr.resume then re-wires
  bridge.onClientEvent → hub.publish
- Confirm venv PATH already present in real spawn (no change needed)
- Add e2e test: POST /sessions → SSE receives ui_request via pendingWidget
  re-emit → POST /sessions/s1/response → 204 (all over real HTTP against
  fake-pi-rpc)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-27 21:37:24 +02:00
co-authored by Claude Sonnet 4.6
parent d630cac3ab
commit b16c94e30b
3 changed files with 65 additions and 0 deletions
+10
View File
@@ -3,6 +3,7 @@ import { join } from "node:path";
import type { AppConfig } from "../config.js";
import { RpcClient } from "../rpc/rpc-client.js";
import { SessionBridge } from "../bridge/session-bridge.js";
import type { ThtRunner } from "../tht/tht-runner.js";
export interface SessionRuntime {
rpc: RpcClient;
@@ -74,6 +75,15 @@ export class PiProcessManager {
return rt;
}
async resume(sessionId: string, tht: ThtRunner): Promise<SessionRuntime> {
const manifest = await tht.sessionShow(sessionId) as { provider?: string; model?: string; thinking?: string } | null;
return this.spawnFor(sessionId, {
provider: manifest?.provider,
model: manifest?.model,
thinking: manifest?.thinking,
});
}
teardown(id: string): void {
const rt = this.runtimes.get(id);
if (rt) {