authorgravatar for harshit9797@gmail.comHarshit Agarwal <harshit9797@gmail.com> 2026-03-23 22:39:29+05:30
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-03-23 10:09:29-07:00
log2b6640af1e6e058f2c7206409d92bf5332fc9e90
tree08b616fea8f7210e6d5b87aff4efa5d44a815980
parent9e29c9d72895022322da52d8e961b38702bad9cc
signature Signed by PGP key B5690EEEBB952194

fix(claude): load Claude SDK filesystem setting sources (#1334)


2 files changed, 28 insertions(+), 0 deletions(-)

apps/server/src/provider/Layers/ClaudeAdapter.test.ts+21
......@@ -272,6 +272,7 @@ describe("ClaudeAdapterLive", () => {
272272 });
273273
274274 const createInput = harness.getLastCreateQueryInput();
275 assert.deepEqual(createInput?.options.settingSources, ["user", "project", "local"]);
275276 assert.equal(createInput?.options.permissionMode, "bypassPermissions");
276277 assert.equal(createInput?.options.allowDangerouslySkipPermissions, true);
277278 }).pipe(
......@@ -280,6 +281,26 @@ describe("ClaudeAdapterLive", () => {
280281 );
281282 });
282283
284 it.effect("loads Claude filesystem settings sources for SDK sessions", () => {
285 const harness = makeHarness();
286 return Effect.gen(function* () {
287 const adapter = yield* ClaudeAdapter;
288 yield* adapter.startSession({
289 threadId: THREAD_ID,
290 provider: "claudeAgent",
291 runtimeMode: "approval-required",
292 });
293
294 const createInput = harness.getLastCreateQueryInput();
295 assert.deepEqual(createInput?.options.settingSources, ["user", "project", "local"]);
296 assert.equal(createInput?.options.permissionMode, undefined);
297 assert.equal(createInput?.options.allowDangerouslySkipPermissions, undefined);
298 }).pipe(
299 Effect.provideService(Random.Random, makeDeterministicRandomService()),
300 Effect.provide(harness.layer),
301 );
302 });
303
283304 it.effect("keeps explicit claude permission mode over runtime-derived defaults", () => {
284305 const harness = makeHarness();
285306 return Effect.gen(function* () {
apps/server/src/provider/Layers/ClaudeAdapter.ts+7
......@@ -15,6 +15,7 @@ import {
1515 type PermissionUpdate,
1616 type SDKMessage,
1717 type SDKResultMessage,
18 type SettingSource,
1819 type SDKUserMessage,
1920} from "@anthropic-ai/claude-agent-sdk";
2021import {
......@@ -426,6 +427,11 @@ const SUPPORTED_CLAUDE_IMAGE_MIME_TYPES = new Set([
426427 "image/png",
427428 "image/webp",
428429]);
430const CLAUDE_SETTING_SOURCES = [
431 "user",
432 "project",
433 "local",
434] as const satisfies ReadonlyArray<SettingSource>;
429435
430436function buildPromptText(input: ProviderSendTurnInput): string {
431437 const requestedEffort = resolveReasoningEffortForProvider(
......@@ -2562,6 +2568,7 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
25622568 ...(input.cwd ? { cwd: input.cwd } : {}),
25632569 ...(input.model ? { model: input.model } : {}),
25642570 pathToClaudeCodeExecutable: providerOptions?.binaryPath ?? "claude",
2571 settingSources: [...CLAUDE_SETTING_SOURCES],
25652572 ...(effectiveEffort ? { effort: effectiveEffort } : {}),
25662573 ...(permissionMode ? { permissionMode } : {}),
25672574 ...(permissionMode === "bypassPermissions"