Skip to content

Commit af3d933

Browse files
committed
fix(agents): remap dot-prefixed context paths
1 parent cd42df4 commit af3d933

3 files changed

Lines changed: 19 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Docs: https://docs.openclaw.ai
1515
- iOS: restore first-use Contacts, Calendar, and Reminders permission prompts and add Privacy & Access status/actions in Settings. Thanks @BunsDev.
1616
- Canvas: return not found for malformed percent-encoded Canvas/A2UI/document asset paths and keep decoded parent traversal blocked before path normalization.
1717
- Telegram: allow trusted local Bot API media files whose filenames start with dots instead of falling back to remote download.
18+
- Agents: remap injected context files under dot-dot-prefixed workspace directories when a run switches to an effective sandbox workspace.
1819
- Agents: allow dot-dot-prefixed filenames such as `..note.txt` through sandbox FS bridge, remote sandbox reads, and apply_patch summaries without mistaking the name for parent traversal.
1920
- CLI/migrate: hide per-item source/plugin hints on non-conflicting Codex skill and plugin selection prompts, keeping the hint text reserved for rows that actually need attention. Thanks @sjf.
2021
- Codex harness: treat high-confidence app-server OAuth refresh invalidation as a terminal auth-profile failure, stopping repeated raw token-refresh errors without turning entitlement or usage-limit payloads into re-auth prompts.

src/agents/pi-embedded-runner/run/attempt.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,10 @@ describe("remapInjectedContextFilesToWorkspace", () => {
622622
path: "/real/workspace/nested/TOOLS.md",
623623
content: "tools",
624624
},
625+
{
626+
path: "/real/workspace/..context/USER.md",
627+
content: "dot-prefixed context",
628+
},
625629
{
626630
path: "/outside/README.md",
627631
content: "outside",
@@ -639,6 +643,10 @@ describe("remapInjectedContextFilesToWorkspace", () => {
639643
path: "/sandbox/workspace/nested/TOOLS.md",
640644
content: "tools",
641645
},
646+
{
647+
path: "/sandbox/workspace/..context/USER.md",
648+
content: "dot-prefixed context",
649+
},
642650
{
643651
path: "/outside/README.md",
644652
content: "outside",

src/agents/pi-embedded-runner/run/attempt.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,15 @@ export function isPrimaryBootstrapRun(sessionKey?: string): boolean {
537537
return !isSubagentSessionKey(sessionKey) && !isAcpSessionKey(sessionKey);
538538
}
539539

540+
function isRelativePathInsideOrEqual(relativePath: string): boolean {
541+
return (
542+
relativePath === "" ||
543+
(relativePath !== ".." &&
544+
!relativePath.startsWith(`..${path.sep}`) &&
545+
!path.isAbsolute(relativePath))
546+
);
547+
}
548+
540549
export function remapInjectedContextFilesToWorkspace(params: {
541550
files: EmbeddedContextFile[];
542551
sourceWorkspaceDir: string;
@@ -547,7 +556,7 @@ export function remapInjectedContextFilesToWorkspace(params: {
547556
}
548557
return params.files.map((file) => {
549558
const relative = path.relative(params.sourceWorkspaceDir, file.path);
550-
const canRemap = relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
559+
const canRemap = isRelativePathInsideOrEqual(relative);
551560
return canRemap
552561
? {
553562
...file,

0 commit comments

Comments
 (0)