Skip to content

Commit 2553631

Browse files
committed
fix(sandbox): preserve custom backend prompt fallback
1 parent bb7fa7e commit 2553631

2 files changed

Lines changed: 48 additions & 49 deletions

File tree

src/auto-reply/reply/commands-system-prompt.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ describe("resolveCommandsSystemPromptBundle", () => {
331331
}
332332
});
333333

334-
it("omits sandbox skills when a custom backend has no declared workdir", async () => {
334+
it("preserves host skill snapshots for custom backends without a declared workdir", async () => {
335335
const params = makeParams();
336336
vi.mocked(resolveSandboxRuntimeStatus).mockReturnValue({
337337
sandboxed: true,
@@ -346,7 +346,7 @@ describe("resolveCommandsSystemPromptBundle", () => {
346346
const result = await resolveCommandsSystemPromptBundle(params);
347347

348348
expect(result.skillsPrompt).toBe("");
349-
expect(vi.mocked(resolveReusableWorkspaceSkillSnapshot)).not.toHaveBeenCalled();
349+
expect(vi.mocked(resolveReusableWorkspaceSkillSnapshot)).toHaveBeenCalledOnce();
350350
});
351351

352352
it("uses config-backed prompt settings for the target agent", async () => {

src/auto-reply/reply/commands-system-prompt.ts

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -88,54 +88,53 @@ async function resolveCommandSkillsPrompt(params: {
8888
if (!sandboxWorkspace) {
8989
return "";
9090
}
91-
if (!sandboxWorkspace.containerWorkdir) {
92-
// Prompt inspection cannot safely advertise host skill paths when a
93-
// custom backend has not declared its runtime workdir.
94-
return "";
91+
if (sandboxWorkspace.containerWorkdir) {
92+
const {
93+
skillsEligibility,
94+
skillsPromptWorkspaceDir,
95+
skillsSnapshot: skillsSnapshotForRun,
96+
skillsWorkspaceDir,
97+
workspaceOnly,
98+
} = resolveSandboxSkillRuntimeInputs({
99+
sandbox: {
100+
enabled: true,
101+
containerWorkdir: sandboxWorkspace.containerWorkdir,
102+
...(sandboxWorkspace.skillsEligibility
103+
? { skillsEligibility: sandboxWorkspace.skillsEligibility }
104+
: {}),
105+
...(sandboxWorkspace.skillsWorkspaceDir
106+
? { skillsWorkspaceDir: sandboxWorkspace.skillsWorkspaceDir }
107+
: {}),
108+
...(sandboxWorkspace.workspaceAccess
109+
? { workspaceAccess: sandboxWorkspace.workspaceAccess }
110+
: {}),
111+
},
112+
effectiveWorkspace: sandboxWorkspace.workspaceDir,
113+
});
114+
const { shouldLoadSkillEntries, skillEntries } = resolveEmbeddedRunSkillEntries({
115+
workspaceDir: skillsWorkspaceDir,
116+
config: params.config,
117+
agentId: params.agentId,
118+
eligibility: skillsEligibility,
119+
skillsSnapshot: skillsSnapshotForRun,
120+
workspaceOnly,
121+
});
122+
const promptSkillEntries = mapSandboxSkillEntriesForPrompt({
123+
entries: shouldLoadSkillEntries ? skillEntries : undefined,
124+
skillsWorkspaceDir,
125+
skillsPromptWorkspaceDir,
126+
});
127+
return resolveSkillsPromptForRun({
128+
skillsSnapshot: skillsSnapshotForRun,
129+
entries: promptSkillEntries,
130+
config: params.config,
131+
workspaceDir: skillsPromptWorkspaceDir,
132+
agentId: params.agentId,
133+
eligibility: skillsEligibility,
134+
});
95135
}
96-
const {
97-
skillsEligibility,
98-
skillsPromptWorkspaceDir,
99-
skillsSnapshot: skillsSnapshotForRun,
100-
skillsWorkspaceDir,
101-
workspaceOnly,
102-
} = resolveSandboxSkillRuntimeInputs({
103-
sandbox: {
104-
enabled: true,
105-
containerWorkdir: sandboxWorkspace.containerWorkdir,
106-
...(sandboxWorkspace.skillsEligibility
107-
? { skillsEligibility: sandboxWorkspace.skillsEligibility }
108-
: {}),
109-
...(sandboxWorkspace.skillsWorkspaceDir
110-
? { skillsWorkspaceDir: sandboxWorkspace.skillsWorkspaceDir }
111-
: {}),
112-
...(sandboxWorkspace.workspaceAccess
113-
? { workspaceAccess: sandboxWorkspace.workspaceAccess }
114-
: {}),
115-
},
116-
effectiveWorkspace: sandboxWorkspace.workspaceDir,
117-
});
118-
const { shouldLoadSkillEntries, skillEntries } = resolveEmbeddedRunSkillEntries({
119-
workspaceDir: skillsWorkspaceDir,
120-
config: params.config,
121-
agentId: params.agentId,
122-
eligibility: skillsEligibility,
123-
skillsSnapshot: skillsSnapshotForRun,
124-
workspaceOnly,
125-
});
126-
const promptSkillEntries = mapSandboxSkillEntriesForPrompt({
127-
entries: shouldLoadSkillEntries ? skillEntries : undefined,
128-
skillsWorkspaceDir,
129-
skillsPromptWorkspaceDir,
130-
});
131-
return resolveSkillsPromptForRun({
132-
skillsSnapshot: skillsSnapshotForRun,
133-
entries: promptSkillEntries,
134-
config: params.config,
135-
workspaceDir: skillsPromptWorkspaceDir,
136-
agentId: params.agentId,
137-
eligibility: skillsEligibility,
138-
});
136+
// Existing third-party backends may not expose the optional workdir
137+
// resolver yet. Preserve their previous host-snapshot inspection path.
139138
} catch {
140139
return "";
141140
}

0 commit comments

Comments
 (0)