From 7bd46e8ab97fa33e0b009e3ad095ac29b9882a75 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:29:45 -0500 Subject: [PATCH 01/10] fix(pi): normalize session command RPC errors --- packages/contracts/src/provider.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/contracts/src/provider.ts b/packages/contracts/src/provider.ts index 8a97b2a24ffb..38751077aab1 100644 --- a/packages/contracts/src/provider.ts +++ b/packages/contracts/src/provider.ts @@ -149,10 +149,14 @@ export type ProviderSessionCommandResult = typeof ProviderSessionCommandResult.T export class ProviderSessionCommandError extends Schema.TaggedError()( "ProviderSessionCommandError", - { threadId: ThreadId, detail: Schema.String }, + { + threadId: ThreadId, + command: Schema.Literals(["copy", "export", "share"]), + cause: Schema.optional(Schema.Defect()), + }, ) { override get message(): string { - return this.detail; + return `Failed to ${this.command} provider session.`; } } From a8db92a03e65585273e67d3b636d0acf656a48d5 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:29:48 -0500 Subject: [PATCH 02/10] fix(pi): preserve session command failure as cause --- apps/server/src/ws.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index d019aba9790f..818bff7cc183 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -2452,7 +2452,8 @@ const makeWsRpcLayer = ( (cause) => new ProviderSessionCommandError({ threadId: input.threadId, - detail: cause.message, + command: input.command, + cause, }), ), ), From 4681ec47c38df53853d22d8baf0fbe6836a9a2cd Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:29:51 -0500 Subject: [PATCH 03/10] fix(pi): keep gh stderr out of public errors --- apps/server/src/provider/PiSessionCommands.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/server/src/provider/PiSessionCommands.ts b/apps/server/src/provider/PiSessionCommands.ts index 0b19d5c12a46..8a3903a60739 100644 --- a/apps/server/src/provider/PiSessionCommands.ts +++ b/apps/server/src/provider/PiSessionCommands.ts @@ -68,10 +68,11 @@ export const runPiSessionCommand = Effect.fn("runPiSessionCommand")(function* ( }), ).pipe(Effect.timeout("60 seconds")); if (result.code !== 0) { + const stderr = result.stderr.trim(); return yield* new PiRpcError({ operation: "share", - detail: - result.stderr.trim() || "GitHub CLI sharing failed. Run 'gh auth login' on the server.", + detail: "GitHub CLI sharing failed.", + ...(stderr.length > 0 ? { cause: new Error(stderr) } : {}), }); } const match = /^https:\/\/gist\.github\.com\/(?:[^/\s]+\/)?([\da-f]+)\/?$/i.exec( From 26f3bbe59435a9097df106c9157069c49b7cd190 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:29:53 -0500 Subject: [PATCH 04/10] test(pi): prove share stderr stays private --- apps/server/src/provider/PiSessionCommands.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/server/src/provider/PiSessionCommands.test.ts b/apps/server/src/provider/PiSessionCommands.test.ts index be7654df171b..4b480e644701 100644 --- a/apps/server/src/provider/PiSessionCommands.test.ts +++ b/apps/server/src/provider/PiSessionCommands.test.ts @@ -183,7 +183,9 @@ describe("Pi session utilities", () => { Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, harness.spawner), Effect.flip, ); - assert.include(error.message, "gh auth login"); + assert.equal(error.message, "Pi RPC share failed: GitHub CLI sharing failed.."); + assert.notInclude(error.message, "gh auth login"); + assert.isDefined(error.cause); assert.isFalse(yield* fs.exists(harness.exportPath())); }).pipe(Effect.provide(NodeServices.layer)), ); From 6af09d6a57f3a382e63c4ad7c3576faa13ea5c27 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:29:56 -0500 Subject: [PATCH 05/10] test(pi): keep command RPC errors structural --- apps/server/src/server.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/server/src/server.test.ts b/apps/server/src/server.test.ts index f6cc3e5af013..a36219c3a943 100644 --- a/apps/server/src/server.test.ts +++ b/apps/server/src/server.test.ts @@ -6340,7 +6340,12 @@ it.layer(NodeServices.layer)("server router seam", (it) => { ), ); assert.strictEqual(error._tag, "ProviderSessionCommandError"); - assert.include(error.message, "gh auth login on the server"); + if (error._tag === "ProviderSessionCommandError") { + assert.strictEqual(error.command, "share"); + assert.strictEqual(error.message, "Failed to share provider session."); + assert.notInclude(error.message, "gh auth login on the server"); + assert.isDefined(error.cause); + } }).pipe(Effect.provide(NodeHttpServer.layerTest)), ); From a3bc5005321ef435e3d7d23b2fb78db31b79985d Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:30:10 -0500 Subject: [PATCH 06/10] fix(pi): normalize share failure punctuation --- apps/server/src/provider/PiSessionCommands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/provider/PiSessionCommands.ts b/apps/server/src/provider/PiSessionCommands.ts index 8a3903a60739..4c60db40271a 100644 --- a/apps/server/src/provider/PiSessionCommands.ts +++ b/apps/server/src/provider/PiSessionCommands.ts @@ -71,7 +71,7 @@ export const runPiSessionCommand = Effect.fn("runPiSessionCommand")(function* ( const stderr = result.stderr.trim(); return yield* new PiRpcError({ operation: "share", - detail: "GitHub CLI sharing failed.", + detail: "GitHub CLI sharing failed", ...(stderr.length > 0 ? { cause: new Error(stderr) } : {}), }); } From 81748157fc0f1b7049e4f9a546de5233b8e4ef0d Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:30:12 -0500 Subject: [PATCH 07/10] fix(pi): normalize share failure punctuation --- apps/server/src/provider/PiSessionCommands.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/provider/PiSessionCommands.test.ts b/apps/server/src/provider/PiSessionCommands.test.ts index 4b480e644701..f4a6d97edd79 100644 --- a/apps/server/src/provider/PiSessionCommands.test.ts +++ b/apps/server/src/provider/PiSessionCommands.test.ts @@ -183,7 +183,7 @@ describe("Pi session utilities", () => { Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, harness.spawner), Effect.flip, ); - assert.equal(error.message, "Pi RPC share failed: GitHub CLI sharing failed.."); + assert.equal(error.message, "Pi RPC share failed: GitHub CLI sharing failed."); assert.notInclude(error.message, "gh auth login"); assert.isDefined(error.cause); assert.isFalse(yield* fs.exists(harness.exportPath())); From e052354edf4caf7ccfa3b6cf9c05fcccfc6030c5 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:39:20 -0500 Subject: [PATCH 08/10] fix(pi): keep provider command causes off the wire --- packages/contracts/src/provider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/contracts/src/provider.ts b/packages/contracts/src/provider.ts index 38751077aab1..bd690c6c0098 100644 --- a/packages/contracts/src/provider.ts +++ b/packages/contracts/src/provider.ts @@ -152,7 +152,6 @@ export class ProviderSessionCommandError extends Schema.TaggedError Date: Tue, 29 Sep 2026 02:39:24 -0500 Subject: [PATCH 09/10] fix(pi): drop provider command cause at rpc boundary --- apps/server/src/ws.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index 818bff7cc183..d7a2e334627f 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -2453,7 +2453,6 @@ const makeWsRpcLayer = ( new ProviderSessionCommandError({ threadId: input.threadId, command: input.command, - cause, }), ), ), From 953b989c50b4775b7037331fc3eb86246c736831 Mon Sep 17 00:00:00 2001 From: Kevin Rajan <7121943+kvnloo@users.noreply.github.com> Date: Tue, 29 Sep 2026 02:39:27 -0500 Subject: [PATCH 10/10] test(pi): prove session command cause is not serialized --- apps/server/src/server.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/server.test.ts b/apps/server/src/server.test.ts index a36219c3a943..4294b5a91065 100644 --- a/apps/server/src/server.test.ts +++ b/apps/server/src/server.test.ts @@ -6344,7 +6344,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => { assert.strictEqual(error.command, "share"); assert.strictEqual(error.message, "Failed to share provider session."); assert.notInclude(error.message, "gh auth login on the server"); - assert.isDefined(error.cause); + assert.notProperty(error, "cause"); } }).pipe(Effect.provide(NodeHttpServer.layerTest)), );