From 7bf4f21e78ee93fc1f7dfee6be2846d746e06688 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 19 Oct 2026 03:57:34 +0000 Subject: [PATCH 1/2] fix(pi): accept persisted sessions in RPC launch Port launch support from #12506 into provider-pi. Co-authored-by: Julian Rustig --- packages/provider-pi/src/server/mcpInjection.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/provider-pi/src/server/mcpInjection.ts b/packages/provider-pi/src/server/mcpInjection.ts index ccb9eecfde78..288f9f847497 100644 --- a/packages/provider-pi/src/server/mcpInjection.ts +++ b/packages/provider-pi/src/server/mcpInjection.ts @@ -245,6 +245,13 @@ export function buildPiRpcLaunch(input: { readonly environment: NodeJS.ProcessEnv; readonly mcpSession: McpProviderSessionConfig | undefined; readonly extensionPath: string | undefined; + /** + * Persisted pi session file to attach at spawn. Resuming this way avoids the + * post-spawn `switch_session`, which replaces the session and invalidates + * every extension context loaded against the default one. Ignored for + * ephemeral sessions, which never have a persisted file. + */ + readonly sessionPath?: string | undefined; readonly ephemeral?: boolean; readonly disableExtensions?: boolean; readonly disableTools?: boolean; @@ -262,10 +269,14 @@ export function buildPiRpcLaunch(input: { : input.launchArgs; const launchArgs = input.disableTools === true ? withoutToolSelectionArgs(extensionSafeArgs) : extensionSafeArgs; + const ephemeral = input.ephemeral === true; const args = [ "--mode", "rpc", - ...(input.ephemeral === true ? ["--no-session"] : []), + // `--session` and `--no-session` are mutually exclusive; an ephemeral + // session has no persisted file to attach to. + ...(!ephemeral && input.sessionPath !== undefined ? ["--session", input.sessionPath] : []), + ...(ephemeral ? ["--no-session"] : []), ...launchArgs, // Restrictions follow user launch args so a configured --tools or // --extension cannot silently re-enable unattended text-generation code. From e02ed9b1c3b507cf1ea13cce66c3d546ee193cba Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 19 Oct 2026 04:04:13 +0000 Subject: [PATCH 2/2] fix(pi): keep ephemeral launches independent of persisted sessions Co-authored-by: Julian Rustig --- .../provider-pi/src/server/mcpInjection.test.ts | 1 + packages/provider-pi/src/server/mcpInjection.ts | 16 +++++----------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/provider-pi/src/server/mcpInjection.test.ts b/packages/provider-pi/src/server/mcpInjection.test.ts index 50d21afd32b4..dacd4610decb 100644 --- a/packages/provider-pi/src/server/mcpInjection.test.ts +++ b/packages/provider-pi/src/server/mcpInjection.test.ts @@ -121,6 +121,7 @@ describe("pi T3 MCP injection", () => { environment: {}, mcpSession, extensionPath: "/tmp/cache/pi-t3-mcp-extension.ts", + sessionPath: "/fake/persisted.jsonl", ephemeral: true, disableExtensions: true, disableTools: true, diff --git a/packages/provider-pi/src/server/mcpInjection.ts b/packages/provider-pi/src/server/mcpInjection.ts index 288f9f847497..2ba0e3dca3b0 100644 --- a/packages/provider-pi/src/server/mcpInjection.ts +++ b/packages/provider-pi/src/server/mcpInjection.ts @@ -245,12 +245,6 @@ export function buildPiRpcLaunch(input: { readonly environment: NodeJS.ProcessEnv; readonly mcpSession: McpProviderSessionConfig | undefined; readonly extensionPath: string | undefined; - /** - * Persisted pi session file to attach at spawn. Resuming this way avoids the - * post-spawn `switch_session`, which replaces the session and invalidates - * every extension context loaded against the default one. Ignored for - * ephemeral sessions, which never have a persisted file. - */ readonly sessionPath?: string | undefined; readonly ephemeral?: boolean; readonly disableExtensions?: boolean; @@ -269,14 +263,14 @@ export function buildPiRpcLaunch(input: { : input.launchArgs; const launchArgs = input.disableTools === true ? withoutToolSelectionArgs(extensionSafeArgs) : extensionSafeArgs; - const ephemeral = input.ephemeral === true; const args = [ "--mode", "rpc", - // `--session` and `--no-session` are mutually exclusive; an ephemeral - // session has no persisted file to attach to. - ...(!ephemeral && input.sessionPath !== undefined ? ["--session", input.sessionPath] : []), - ...(ephemeral ? ["--no-session"] : []), + ...(input.ephemeral === true + ? ["--no-session"] + : input.sessionPath !== undefined + ? ["--session", input.sessionPath] + : []), ...launchArgs, // Restrictions follow user launch args so a configured --tools or // --extension cannot silently re-enable unattended text-generation code.