Visitar URL original
fix(workspace-fs): allow viewing symlinks outside workspace root by Kitenite · Pull Request #7897 · ParadevAI/Paradev · GitHub
Skip to content

fix(workspace-fs): allow viewing symlinks outside workspace root - #7897

Merged
Kitenite merged 2 commits into
mainfrom
file-viewer-path-change-68a992ae
Sep 27, 2026
Merged

Kitenite merged 2 commits into
mainfrom
file-viewer-path-change-68a992ae

Conversation

@Kitenite

@Kitenite Kitenite commented Sep 27, 2026 •

Copy link
Copy Markdown
Member

What & why

Opening a workspace symlink whose target is outside the workspace currently fails with “Path resolves outside workspace root.” Allow the shared filesystem read operation to follow these links, matching its existing support for directly opening external files. This covers symlinked files and files under symlinked directories. Write restrictions remain in place.

How I tested it

  • Filesystem unit tests: 42 passed, including reading an external file through a workspace symlink.
  • Host-service integration tests: 35 passed across bug-hunt.integration.test.ts and bug-hunt-2.integration.test.ts, covering external file/directory symlink reads and rejecting writes through them.
  • CI identified one additional old rejection expectation in bug-hunt.integration.test.ts; updated it to the intended read behavior and verified all 17 tests in that file pass.
  • bun run lint: passed.
  • bun run typecheck: passed (42 tasks).
  • bun run check:plugins: passed.
  • Full bun run test: failed in the desktop suite (7,651 passed, 34 failed), including git/worktree and shell-environment tests. The full run is not green; the failures have not been isolated against the base branch.
  • Desktop UI was not manually verified.

Checklist

  • PR title follows conventional commits (type(scope): subject)
  • bun run lint and bun run typecheck pass (CI fails on lint warnings too)
  • "Allow edits from maintainers" is checked on fork PRs (not applicable; same-repository branch)

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 50caa051-3def-40ca-be15-17285ced53e7

📥 Commits

Reviewing files that changed from the base of the PR and between 46eb661 and af97f35.

📒 Files selected for processing (3)
  • packages/host-service/test/integration/bug-hunt-2.integration.test.ts
  • packages/workspace-fs/src/fs.test.ts
  • packages/workspace-fs/src/fs.ts
💤 Files with no reviewable changes (1)
  • packages/workspace-fs/src/fs.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

readFile no longer accepts rootPath or checks whether a normalized target resolves within the workspace root. Symlink tests now expect reads from outside-root targets to return their contents.

Changes

Workspace symlink reads

Layer / File(s) Summary
Update readFile path handling
packages/workspace-fs/src/fs.ts
readFile no longer accepts rootPath or checks the normalized target against the workspace root before opening it.
Update symlink read expectations
packages/workspace-fs/src/fs.test.ts, packages/host-service/test/integration/bug-hunt-2.integration.test.ts
Tests now expect reads through outside-root symlinks to return the target content. The expected contents are "secret" and "PII".

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to af97f

External symlink reads behave as intended, with no confirmed issue blocking merge.

Architecture Summary

Architecture risk: 🔵 Low · up to af97f

The change affects 2 systems.

Changed systems: packages/workspace-fs, packages/host-service

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — packages/workspace-fs (library) was modified; 2 changed files map to changed impact.
  • observed — packages/host-service (library) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in packages/host-service/test/integration/bug-hunt-2.integration.test.ts: The test now expects reading through a symlink to an outside directory to succeed; it renames the symlink from evil-link to external-link. Previously, the test expected the read to reject.
  • observed — Modified behavior in packages/host-service/test/integration/bug-hunt-2.integration.test.ts: The read assertion now expects a text result containing "PII" instead of expecting an error.
  • observed — Modified behavior in packages/workspace-fs/src/fs.test.ts: The symlink test changes from asserting that readFile rejects an in-root link resolving outside the workspace root to asserting that it returns text content "secret".
  • observed — Modified behavior in packages/workspace-fs/src/fs.ts: The readFile options no longer include rootPath.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title uses the required conventional commit format and clearly describes the main change: allowing workspace filesystem reads through symlinks that target paths outside the workspace root.
Description check ✅ Passed The description includes complete What & why, How I tested it, and Checklist sections. It explains the behavior change, test coverage, passed checks, known full-suite failures, and lack of manual desk…
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

🚀 Preview Deployment

🔗 Preview Links

Service Status Link
Neon Database (Neon) ✅ View Branch
Vercel API (Vercel) ✅ Open Preview
Vercel Web (Vercel) ✅ Open Preview
Vercel Marketing (Vercel) ✅ Open Preview
Vercel Admin (Vercel) ✅ Open Preview
Vercel Docs (Vercel) ✅ Open Preview

Preview updates automatically with new commits

@Kitenite
Kitenite merged commit 3b60241 into main Sep 27, 2026
17 of 18 checks passed
saddlepaddle added a commit that referenced this pull request Sep 30, 2026
The editor can open any file on the host since #7897, but saving one outside
the workspace root (or through an in-root symlink that resolves outside) threw
"Path is outside workspace root". writeFile now follows the read policy: the
same caller can already read any file and run any command in a terminal, so
confining edits was not a real boundary. Create, delete, move and copy stay
confined to the root.
Kitenite added a commit that referenced this pull request Oct 1, 2026
* docs: weekly update for PRs merged 2026-09-23 to 2026-09-30

Source of truth: live Notion SOP "Weekly Docs Update (automation SOP)".
Window: merged:>=2026-09-23 (139 PRs). PRs through the morning of 09-23
were covered by #7771.

Changes
- Pages: no auto-open on publish (#7790); page links and URL links split
  into their own settings (#7916, #7962, #7946); Listening agents menu with
  per-row stop and Add listening agent (#7724, #7820, #7919); globe on the
  Share button (#7766); Report on public pages (#7886); agents offer a page
  (#7759). Files: pages.mdx, cli/cli-reference.mdx.
- Settings moves: Links replaced by Browser and Files & Editor (#7916,
  #7962). Files: editor.mdx, terminal-integration.mdx, customization.mdx.
- Editor: inline rename and drag to move (#7692), Auto Save (#7693, #7916),
  open and save files outside the workspace (#7897, #7982), Copy as Markdown
  (#7591), per-pane error screen (#7983). File: editor.mdx.
- Terminal copy follows Ghostty's whitespace rules (#7868).
  File: terminal-integration.mdx.
- Agents: UFO (#7898); GPT-6 Astra, Sonnet 5.5, retiring GPT-5.5, retired
  GPT-5.4/5.3 Codex (#7783, #7894, #7935). Files: agent-integration.mdx,
  cli/cli-reference.mdx.
- Host: superset start --daemon --auto-update and update-lock permission
  errors (#7735, #7952). Files: cli/host-server.mdx, cli/cli-reference.mdx.
- Removed the mcp CLI section and the Connected Service Plugins section:
  #7776 made plugins/mcp internal, the Plugins page is staff-flagged, and
  apps/docs/AGENTS.md keeps internal commands out. Files: skills.mdx,
  cli/cli-reference.mdx.
- Slack page unfurls and details panel (#7817, #7821, #7914, #7957).
  File: use-with-slack.mdx.
- Workspaces: instant creation with background naming (#7518); recoverable
  project deletion (#7896). File: workspaces.mdx.
- Shortcuts: prev/next workspace includes Pinned and wraps (#7851); ⌘B
  collapses the sidebar to a rail (#7964). File: keyboard-shortcuts.mdx.
- Ship controls and open-in button moved to the right sidebar strip (#7958).
  Files: diff-viewer.mdx, use-with-ide.mdx.

Deliberately skipped
- Cloud workspaces/environments/sandboxes (flag-gated, AGENTS.md rule):
  #7784 #7795 #7824 #7840 #7844 #7845 #7847 #7849 #7850 #7858 #7861 #7863
  #7874 #7911 #7913 #7918 #7922 #7931 #7932 #7937 #7956 #7961 #7969 #7981
  #7637 #7794 #7789 #7838 (its CLI docs already shipped in the PR).
- Staff-only plugins: #7912 Sentry plugin, #7716, #7727, #7955.
- Already documented in their own PRs: #7917, #7921.
- Removed feature never documented: #7796 Google Calendar triggers.
- Agents chip remove/revert/default-off, never documented: #7870 #7871 #7872.
- Billing/backend policy with no docs surface: #7947, #7812, #7786, #7792,
  #7798, #7761, #7948, #7949, #7951, #7827.
- Reverted security trio: #7828 #7829 #7830 (reverted by #7834).
- Fixes restoring expected behavior: #7683 #7696 #7707 #7743 #7751 #7756
  #7764 #7765 #7781 #7788 #7791 #7823 #7825 #7833 #7837 #7852 #7857 #7860
  #7864 #7865 #7869 #7873 #7897-covered #7903 #7938 #7980 #7943 #7964-chrome.
- Mobile (no docs page): #7746 #7747 #7748 #7749 #7750 #7782 #7793 #7810
  #7814 #7816 #7889 #7968.
- Marketing, internal docs, CI, version bumps: #7651 #7744 #7752 #7771 #7774
  #7776-infra #7777 #7785 #7811 #7818 #7822 #7826 #7834 #7884 #7885 #7895
  #7909 #7933 #7934 #7942 #7944 #7965 #7966.

Validation: bun run --cwd apps/docs typecheck, bun run lint:fix,
bun run lint (exit 0), Vale on 13 changed files (0 errors, 0 warnings),
git diff --check.

* chore: log weekly docs update follow-ups

* docs: tighten review findings in the weekly update

Only the page creator can stop or add listening agents. On focus change also
saves on window blur, and Auto Save pauses on conflicts. Taken-down pages do
not unfurl. Model picker coverage matches agent-models.ts.

This branch was previously deployed

1 inactive deployment
preview — 1d33048f Deployed Sep 27, 2026 by Kitenite via Deploy Web #10476
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant