diff --git a/.changeset/fix-remote-session-reload.md b/.changeset/fix-remote-session-reload.md new file mode 100644 index 0000000..d282e53 --- /dev/null +++ b/.changeset/fix-remote-session-reload.md @@ -0,0 +1,5 @@ +--- +"@jmfederico/pi-web": patch +--- + +Fix remote session reloads so they proxy through the web/API instead of returning the app shell as JSON. diff --git a/src/client/src/api/federatedRouteContract.test.ts b/src/client/src/api/federatedRouteContract.test.ts index 3173515..99e71d5 100644 --- a/src/client/src/api/federatedRouteContract.test.ts +++ b/src/client/src/api/federatedRouteContract.test.ts @@ -61,6 +61,7 @@ describe("federated route contract", () => { ignoreParseFailure(sessionsApi.archiveWithDescendants(session, machineId)), ignoreParseFailure(sessionsApi.restore(session, machineId)), ignoreParseFailure(sessionsApi.deleteArchived(session, machineId)), + ignoreParseFailure(sessionsApi.reloadSession(session, machineId)), ignoreParseFailure(sessionsApi.detachParent(session, machineId)), ignoreParseFailure(sessionsApi.authProviders({ mode: "login", authType: "oauth", machineId })), ignoreParseFailure(sessionsApi.saveApiKey("openai", "key", machineId)), diff --git a/src/server/app.test.ts b/src/server/app.test.ts index 85714a2..fc1533c 100644 --- a/src/server/app.test.ts +++ b/src/server/app.test.ts @@ -210,6 +210,23 @@ describe("buildApp", () => { expect(request).toHaveBeenCalledWith("POST", "/api/projects/p1/workspaces/w1/terminal-command-runs", createBody); }); + it("proxies remote session reloads through the selected machine", async () => { + const addResponse = await app.inject({ method: "POST", url: "/api/machines", payload: { name: "Remote", baseUrl: "https://remote.example.test/" } }); + const remote = addResponse.json<{ id: string }>(); + const request = vi.fn(() => Promise.resolve({ + statusCode: 200, + headers: { "content-type": "application/json" }, + body: Readable.from([JSON.stringify({ reloaded: true })]), + })); + remoteClient = fakeRemoteClient({ request }); + + const response = await app.inject({ method: "POST", url: `/api/machines/${remote.id}/sessions/s1/reload`, payload: { cwd: "/repo" } }); + + expect(response.statusCode).toBe(200); + expect(response.json()).toEqual({ reloaded: true }); + expect(request).toHaveBeenCalledWith("POST", "/api/sessions/s1/reload", { cwd: "/repo" }); + }); + it("forwards remote JSON request bodies and normalizes remote timeouts", async () => { const addResponse = await app.inject({ method: "POST", url: "/api/machines", payload: { name: "Remote", baseUrl: "https://remote.example.test/" } }); const remote = addResponse.json<{ id: string }>(); diff --git a/src/shared/federatedRoutes.ts b/src/shared/federatedRoutes.ts index 938193f..a8fed23 100644 --- a/src/shared/federatedRoutes.ts +++ b/src/shared/federatedRoutes.ts @@ -52,6 +52,7 @@ export const FEDERATED_HTTP_ROUTES = [ { method: "POST", path: "/sessions/:sessionId/archive-tree" }, { method: "POST", path: "/sessions/:sessionId/restore" }, { method: "DELETE", path: "/sessions/:sessionId" }, + { method: "POST", path: "/sessions/:sessionId/reload" }, { method: "POST", path: "/sessions/:sessionId/detach-parent" }, { method: "GET", path: "/auth/providers" }, { method: "POST", path: "/auth/api-key" },