Skip to content

Commit f9ea884

Browse files
committed
Prioritize the spec ones over the meta ones
1 parent a2aa5ba commit f9ea884

2 files changed

Lines changed: 24 additions & 31 deletions

File tree

src/CodexAcpClient.ts

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,8 @@ export class CodexAcpClient {
205205
}
206206

207207
async resumeSession(request: acp.ResumeSessionRequest, onSubscribed?: () => void): Promise<SessionMetadata> {
208-
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories);
209-
await this.refreshSkills(request.cwd, additionalDirectories, request._meta);
208+
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
209+
await this.refreshSkills(request.cwd, additionalDirectories);
210210

211211
const response = await this.codexClient.threadResume({
212212
config: await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []),
@@ -227,8 +227,8 @@ export class CodexAcpClient {
227227
}
228228

229229
async loadSession(request: acp.LoadSessionRequest, onSubscribed?: () => void): Promise<SessionMetadataWithThread> {
230-
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories);
231-
await this.refreshSkills(request.cwd, additionalDirectories, request._meta);
230+
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
231+
await this.refreshSkills(request.cwd, additionalDirectories);
232232

233233
const response = await this.codexClient.threadResume({
234234
config: await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []),
@@ -250,8 +250,8 @@ export class CodexAcpClient {
250250
}
251251

252252
async newSession(request: acp.NewSessionRequest): Promise<SessionMetadata> {
253-
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories);
254-
await this.refreshSkills(request.cwd, additionalDirectories, request._meta);
253+
const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
254+
await this.refreshSkills(request.cwd, additionalDirectories);
255255

256256
const response = await this.codexClient.threadStart({
257257
config: await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers),
@@ -365,23 +365,19 @@ export class CodexAcpClient {
365365

366366
private async refreshSkills(
367367
cwd: string,
368-
additionalDirectories: string[],
369-
meta?: Record<string, unknown> | null
368+
additionalRoots: string[]
370369
): Promise<void> {
371370
if (!cwd) {
372371
return;
373372
}
374373

375-
const additionalRoots = uniqueStrings([
376-
...readAdditionalRoots(meta),
377-
...additionalDirectories,
378-
]).map(root => path.join(root, ".agents", "skills"));
379-
if (!arraysEqual(this.skillExtraRoots, additionalRoots)) {
380-
await this.codexClient.skillsExtraRootsSet({ extraRoots: additionalRoots });
381-
this.skillExtraRoots = additionalRoots;
374+
const skillExtraRoots = additionalRoots.map(root => path.join(root, ".agents", "skills"));
375+
if (!arraysEqual(this.skillExtraRoots, skillExtraRoots)) {
376+
await this.codexClient.skillsExtraRootsSet({ extraRoots: skillExtraRoots });
377+
this.skillExtraRoots = skillExtraRoots;
382378
}
383379
await this.codexClient.listSkills({
384-
cwds: [cwd, ...additionalDirectories],
380+
cwds: [cwd, ...additionalRoots],
385381
forceReload: true,
386382
});
387383
}
@@ -493,8 +489,7 @@ export class CodexAcpClient {
493489
): Promise<TurnCompletedNotification | null> {
494490
const input = buildPromptItems(request.prompt);
495491
const effort = modelId.effort as ReasoningEffort | null; //TODO remove unsafe conversion
496-
497-
await this.refreshSkills(cwd, additionalDirectories, request._meta);
492+
await this.refreshSkills(cwd, additionalDirectories);
498493
if (shouldCancel?.()) {
499494
return null;
500495
}
@@ -740,10 +735,10 @@ interface GatewayConfig {
740735
}
741736
}
742737

743-
function readAdditionalRoots(meta: Record<string, unknown> | null | undefined): string[] {
738+
function readMetaAdditionalRoots(meta?: Record<string, unknown> | null): string[] | undefined {
744739
const rawRoots = meta?.["additionalRoots"];
745740
if (!Array.isArray(rawRoots)) {
746-
return [];
741+
return undefined;
747742
}
748743

749744
return uniqueStrings(rawRoots
@@ -752,16 +747,11 @@ function readAdditionalRoots(meta: Record<string, unknown> | null | undefined):
752747
.filter(value => value.length > 0));
753748
}
754749

755-
function readAdditionalDirectories(cwd: string, rawDirectories: unknown): string[] {
756-
if (rawDirectories === undefined) {
750+
function readAdditionalDirectories(cwd: string, additionalDirectories?: string[], meta?: Record<string, unknown> | null): string[] {
751+
const rawDirectories = additionalDirectories ?? readMetaAdditionalRoots(meta);
752+
if (!rawDirectories) {
757753
return [];
758754
}
759-
if (rawDirectories === null) {
760-
throw RequestError.invalidParams(undefined, "additionalDirectories must be an array");
761-
}
762-
if (!Array.isArray(rawDirectories)) {
763-
throw RequestError.invalidParams(undefined, "additionalDirectories must be an array");
764-
}
765755

766756
const directories: string[] = [];
767757
const seen = new Set<string>([cwd]);

src/__tests__/CodexACPAgent/CodexAcpClient.test.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,13 @@ describe('ACP server test', { timeout: 40_000 }, () => {
262262
});
263263

264264
expect(listSkillsSpy).toHaveBeenCalledWith({
265-
cwds: ["/workspace"],
265+
cwds: ["/workspace", "/skills/one", "/skills/two"],
266266
forceReload: true,
267267
});
268268
expect(listSkillsSpy.mock.invocationCallOrder[0]!).toBeLessThan(threadStartSpy.mock.invocationCallOrder[0]!);
269269
});
270270

271-
it('applies ACP additional directories to new session config and skill discovery', async () => {
271+
it('prefers ACP additional directories over legacy meta roots for new session skill discovery', async () => {
272272
const mockFixture = createCodexMockTestFixture();
273273
const codexAcpClient = mockFixture.getCodexAcpClient();
274274
const codexAppServerClient = mockFixture.getCodexAppServerClient();
@@ -290,6 +290,9 @@ describe('ACP server test', { timeout: 40_000 }, () => {
290290
cwd: "/workspace",
291291
additionalDirectories: ["/workspace/extra", "/workspace", "/workspace/extra"],
292292
mcpServers: [],
293+
_meta: {
294+
additionalRoots: ["/skills/one", "/workspace/extra", "/workspace"],
295+
},
293296
});
294297

295298
expect(session.additionalDirectories).toEqual(["/workspace/extra"]);
@@ -559,7 +562,7 @@ describe('ACP server test', { timeout: 40_000 }, () => {
559562
await codexAcpAgent.prompt(promptRequest);
560563

561564
expect(listSkillsSpy).toHaveBeenCalledWith({
562-
cwds: ["/workspace"],
565+
cwds: ["/workspace", "/skills/one", "/skills/two"],
563566
forceReload: true,
564567
});
565568
expect(listSkillsSpy.mock.invocationCallOrder[0]!).toBeLessThan(turnStartSpy.mock.invocationCallOrder[0]!);

0 commit comments

Comments
 (0)