From 2c07b510db7b6e4c43238cb60dfb44382f9aa3d5 Mon Sep 17 00:00:00 2001 From: Harshit Agarwal Date: Mon, 23 Mar 2026 21:30:49 +0530 Subject: [PATCH] Load Claude filesystem setting sources --- .../src/provider/Layers/ClaudeAdapter.test.ts | 21 +++++++++++++++++++ .../src/provider/Layers/ClaudeAdapter.ts | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.test.ts b/apps/server/src/provider/Layers/ClaudeAdapter.test.ts index f60b2b1e9..e23148973 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.test.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.test.ts @@ -272,6 +272,7 @@ describe("ClaudeAdapterLive", () => { }); const createInput = harness.getLastCreateQueryInput(); + assert.deepEqual(createInput?.options.settingSources, ["user", "project", "local"]); assert.equal(createInput?.options.permissionMode, "bypassPermissions"); assert.equal(createInput?.options.allowDangerouslySkipPermissions, true); }).pipe( @@ -280,6 +281,26 @@ describe("ClaudeAdapterLive", () => { ); }); + it.effect("loads Claude filesystem settings sources for SDK sessions", () => { + const harness = makeHarness(); + return Effect.gen(function* () { + const adapter = yield* ClaudeAdapter; + yield* adapter.startSession({ + threadId: THREAD_ID, + provider: "claudeAgent", + runtimeMode: "approval-required", + }); + + const createInput = harness.getLastCreateQueryInput(); + assert.deepEqual(createInput?.options.settingSources, ["user", "project", "local"]); + assert.equal(createInput?.options.permissionMode, undefined); + assert.equal(createInput?.options.allowDangerouslySkipPermissions, undefined); + }).pipe( + Effect.provideService(Random.Random, makeDeterministicRandomService()), + Effect.provide(harness.layer), + ); + }); + it.effect("keeps explicit claude permission mode over runtime-derived defaults", () => { const harness = makeHarness(); return Effect.gen(function* () { diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.ts b/apps/server/src/provider/Layers/ClaudeAdapter.ts index 6fbe6d43b..acbee8605 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.ts @@ -15,6 +15,7 @@ import { type PermissionUpdate, type SDKMessage, type SDKResultMessage, + type SettingSource, type SDKUserMessage, } from "@anthropic-ai/claude-agent-sdk"; import { @@ -426,6 +427,11 @@ const SUPPORTED_CLAUDE_IMAGE_MIME_TYPES = new Set([ "image/png", "image/webp", ]); +const CLAUDE_SETTING_SOURCES = [ + "user", + "project", + "local", +] as const satisfies ReadonlyArray; function buildPromptText(input: ProviderSendTurnInput): string { const requestedEffort = resolveReasoningEffortForProvider( @@ -2562,6 +2568,7 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) { ...(input.cwd ? { cwd: input.cwd } : {}), ...(input.model ? { model: input.model } : {}), pathToClaudeCodeExecutable: providerOptions?.binaryPath ?? "claude", + settingSources: [...CLAUDE_SETTING_SOURCES], ...(effectiveEffort ? { effort: effectiveEffort } : {}), ...(permissionMode ? { permissionMode } : {}), ...(permissionMode === "bypassPermissions"