From d6a99c136a78ea919b63a466e00d067d01093c6a Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 16 Jun 2026 16:46:37 -0700 Subject: [PATCH 1/3] send claude effort to cloud runs without plugins --- .../agent/src/server/agent-server.test.ts | 35 ++++++++++++++++ packages/agent/src/server/agent-server.ts | 40 +++++++++++++------ 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/packages/agent/src/server/agent-server.test.ts b/packages/agent/src/server/agent-server.test.ts index efa55a17b5..863648f067 100644 --- a/packages/agent/src/server/agent-server.test.ts +++ b/packages/agent/src/server/agent-server.test.ts @@ -213,6 +213,9 @@ interface TestableServer { ): string | { append: string }; buildCodexInstructions(systemPrompt: string | { append: string }): string; getRuntimeAdapter(): "claude" | "codex"; + buildClaudeCodeSessionMeta( + runtimeAdapter: "claude" | "codex", + ): { claudeCode: { options: Record } } | undefined; } let nextTestPort = 20000; @@ -1140,6 +1143,38 @@ describe("AgentServer HTTP Mode", () => { }); }); + describe("buildClaudeCodeSessionMeta", () => { + it("sends claude reasoning effort even when no plugins are configured", () => { + const s = createServer({ reasoningEffort: "high" }); + + const meta = (s as unknown as TestableServer).buildClaudeCodeSessionMeta( + "claude", + ); + + expect(meta?.claudeCode.options).toEqual({ effort: "high" }); + }); + + it("does not send claudeCode effort for codex runs", () => { + const s = createServer({ reasoningEffort: "high" }); + + const meta = (s as unknown as TestableServer).buildClaudeCodeSessionMeta( + "codex", + ); + + expect(meta).toBeUndefined(); + }); + + it("returns undefined when neither plugins nor effort are set", () => { + const s = createServer(); + + const meta = (s as unknown as TestableServer).buildClaudeCodeSessionMeta( + "claude", + ); + + expect(meta).toBeUndefined(); + }); + }); + describe("detectedPrUrl tracking", () => { it("stores PR URL when gh pr create produces it", () => { const s = createServer(); diff --git a/packages/agent/src/server/agent-server.ts b/packages/agent/src/server/agent-server.ts index 4d164b0808..2b1a57a20f 100644 --- a/packages/agent/src/server/agent-server.ts +++ b/packages/agent/src/server/agent-server.ts @@ -1067,19 +1067,7 @@ export class AgentServer { jsonSchema: preTask?.json_schema ?? null, permissionMode: initialPermissionMode, ...(this.config.baseBranch && { baseBranch: this.config.baseBranch }), - ...(this.config.claudeCode?.plugins?.length && { - claudeCode: { - options: { - ...(this.config.claudeCode?.plugins?.length && { - plugins: this.config.claudeCode.plugins, - }), - ...(runtimeAdapter === "claude" && - this.config.reasoningEffort && { - effort: this.config.reasoningEffort, - }), - }, - }, - }), + ...this.buildClaudeCodeSessionMeta(runtimeAdapter), }, }); @@ -1670,6 +1658,32 @@ export class AgentServer { : systemPrompt.append; } + /** + * Builds the optional `claudeCode` session meta. Reasoning effort and plugins + * are independent: effort must reach Claude even when no plugins are set, so + * it cannot sit behind a plugins guard. + */ + private buildClaudeCodeSessionMeta( + runtimeAdapter: "claude" | "codex", + ): { claudeCode: { options: Record } } | undefined { + const plugins = this.config.claudeCode?.plugins; + const effort = + runtimeAdapter === "claude" ? this.config.reasoningEffort : undefined; + + if (!plugins?.length && !effort) { + return undefined; + } + + const options: Record = {}; + if (plugins?.length) { + options.plugins = plugins; + } + if (effort) { + options.effort = effort; + } + return { claudeCode: { options } }; + } + private getCloudInteractionOrigin(): string | undefined { return ( process.env.POSTHOG_CODE_INTERACTION_ORIGIN ?? From fc573cebd144a48ba19408b605f3ac6138d96b37 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 16 Jun 2026 22:28:13 -0700 Subject: [PATCH 2/3] test claude effort and plugins combination --- packages/agent/src/server/agent-server.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/agent/src/server/agent-server.test.ts b/packages/agent/src/server/agent-server.test.ts index 863648f067..ff4c0be18e 100644 --- a/packages/agent/src/server/agent-server.test.ts +++ b/packages/agent/src/server/agent-server.test.ts @@ -1173,6 +1173,22 @@ describe("AgentServer HTTP Mode", () => { expect(meta).toBeUndefined(); }); + + it("includes both plugins and effort for claude runs", () => { + const s = createServer({ + reasoningEffort: "medium", + claudeCode: { plugins: [{ type: "local", path: "/tmp/plugin" }] }, + }); + + const meta = (s as unknown as TestableServer).buildClaudeCodeSessionMeta( + "claude", + ); + + expect(meta?.claudeCode.options).toEqual({ + plugins: [{ type: "local", path: "/tmp/plugin" }], + effort: "medium", + }); + }); }); describe("detectedPrUrl tracking", () => { From e43a5765855e821b6e7624fc431203209f842c19 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 16 Jun 2026 22:59:02 -0700 Subject: [PATCH 3/3] test plugins-only claude session meta --- packages/agent/src/server/agent-server.test.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/agent/src/server/agent-server.test.ts b/packages/agent/src/server/agent-server.test.ts index ff4c0be18e..32c60f5f3a 100644 --- a/packages/agent/src/server/agent-server.test.ts +++ b/packages/agent/src/server/agent-server.test.ts @@ -1189,6 +1189,20 @@ describe("AgentServer HTTP Mode", () => { effort: "medium", }); }); + + it("returns only plugins when effort is not set", () => { + const s = createServer({ + claudeCode: { plugins: [{ type: "local", path: "/tmp/plugin" }] }, + }); + + const meta = (s as unknown as TestableServer).buildClaudeCodeSessionMeta( + "claude", + ); + + expect(meta?.claudeCode.options).toEqual({ + plugins: [{ type: "local", path: "/tmp/plugin" }], + }); + }); }); describe("detectedPrUrl tracking", () => {