feat: Support experimental additionalDirectories field (#684)

This commit is contained in:
Ben Brandt
2026-05-18 12:51:45 +02:00
committed by GitHub
parent 2162d5af62
commit f37e9a0d47
2 changed files with 42 additions and 3 deletions

View File

@@ -628,11 +628,12 @@ export class ClaudeAcpAgent implements Agent {
},
loadSession: true,
sessionCapabilities: {
additionalDirectories: {},
close: {},
delete: {},
fork: {},
list: {},
resume: {},
close: {},
delete: {},
},
},
agentInfo: {
@@ -664,6 +665,7 @@ export class ClaudeAcpAgent implements Agent {
{
cwd: params.cwd,
mcpServers: params.mcpServers ?? [],
additionalDirectories: params.additionalDirectories,
_meta: params._meta,
},
{
@@ -1775,6 +1777,7 @@ export class ClaudeAcpAgent implements Agent {
sessionId: string;
cwd: string;
mcpServers?: NewSessionRequest["mcpServers"];
additionalDirectories?: NewSessionRequest["additionalDirectories"];
_meta?: NewSessionRequest["_meta"];
}): Promise<NewSessionResponse> {
const existingSession = this.sessions[params.sessionId];
@@ -1799,6 +1802,7 @@ export class ClaudeAcpAgent implements Agent {
{
cwd: params.cwd,
mcpServers: params.mcpServers ?? [],
additionalDirectories: params.additionalDirectories,
_meta: params._meta,
},
{
@@ -2020,9 +2024,15 @@ export class ClaudeAcpAgent implements Agent {
abortController,
};
// Prefer the official ACP `additionalDirectories` field. Fall back to the
// legacy `_meta.additionalRoots` extension for clients that haven't been
// updated yet. Either source is merged with directories supplied via
// `_meta.claudeCode.options.additionalDirectories` (SDK pass-through).
const acpAdditionalDirectories =
params.additionalDirectories ?? sessionMeta?.additionalRoots ?? [];
options.additionalDirectories = [
...(userProvidedOptions?.additionalDirectories ?? []),
...(sessionMeta?.additionalRoots ?? []),
...acpAdditionalDirectories,
];
if (creationOpts?.resume === undefined || creationOpts?.forkSession) {

View File

@@ -76,4 +76,33 @@ describe("additionalRoots", () => {
});
expect(capturedOptions!.additionalDirectories).toEqual(["/workspace/shared", "", root]);
});
it("prefers the official ACP additionalDirectories field over _meta.additionalRoots", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
additionalDirectories: ["/from/official"],
_meta: { additionalRoots: ["/from/meta"] },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/official"]);
});
it("merges official ACP additionalDirectories with claudeCode SDK additionalDirectories", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
additionalDirectories: ["/from/official"],
_meta: { claudeCode: { options: { additionalDirectories: ["/from/sdk"] } } },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/sdk", "/from/official"]);
});
it("falls back to _meta.additionalRoots when the official field is omitted", async () => {
await agent.newSession({
cwd: "/test",
mcpServers: [],
_meta: { additionalRoots: ["/from/meta"] },
});
expect(capturedOptions!.additionalDirectories).toEqual(["/from/meta"]);
});
});