Skip to content

fix(files): only highlight accessible workspace file links - #11090

Open
cryppadotta wants to merge 3 commits into
paperclipai:masterfrom
cryppadotta:fix/workspace-file-link-availability
Open

fix(files): only highlight accessible workspace file links#11090
cryppadotta wants to merge 3 commits into
paperclipai:masterfrom
cryppadotta:fix/workspace-file-link-availability

Conversation

@cryppadotta

@cryppadotta cryppadotta commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Thinking Path

  • Paperclip is the open source app people use to manage AI agents for work.
  • Task comments can contain references to files in project and execution workspaces.
  • Paperclip detected path-shaped inline code and showed it as an actionable file chip.
  • The UI did not first confirm that the current board session could open the file.
  • Missing, denied, ambiguous, remote, and unsupported files therefore looked actionable and failed after a click.
  • This pull request adds an issue-scoped availability check and promotes only confirmed files to chips.
  • The benefit is that the task thread shows a file action only when that action can succeed.

Linked Issues or Issue Description

What happened?

Task comments promoted path-shaped inline code to file chips before Paperclip checked the file. A chip could point to a missing, denied, ambiguous, remote, or non-previewable file. The action then failed after the user selected it.

Expected behavior

Paperclip must show a file chip only after the server confirms that the current board session can open the exact file reference. All other path-shaped text must stay ordinary inline code.

Steps to reproduce

  1. Add a task comment that contains inline code with a missing or inaccessible workspace path.
  2. Open the task thread as a board user.
  3. Observe that the path looks like an actionable file chip.
  4. Select the chip and observe that the file cannot open.

Paperclip version or commit

19be4cf927 and earlier.

Deployment mode

Local dev and self-hosted server.

Access context

Board user.

What Changed

  • Added shared request, response, and validation contracts for batched workspace-file availability checks.
  • Added an issue-scoped server endpoint that resolves file references with company, issue, workspace, and preview-access checks.
  • Added bounded batch concurrency and tests for missing, denied, ambiguous, remote, unsupported, and available files.
  • Added an issue-scoped UI availability registry that deduplicates, batches, caches, and invalidates file checks.
  • Changed task-comment markdown rendering so only confirmed files get chip styling and file-viewer behavior.
  • Bound each chip to the exact workspace target that passed the availability check.

Verification

  • pnpm exec vitest run packages/shared/src/workspace-file-resource.test.ts server/src/__tests__/file-resources.test.ts ui/src/components/MarkdownBody.test.tsx ui/src/components/WorkspaceFileMarkdownBody.availability.test.tsx ui/src/lib/remark-workspace-file-refs.test.ts ui/src/lib/workspace-file-availability.test.ts — 93 passed, 35 skipped.
  • pnpm check:token-gates — clean.
  • pnpm -r typecheck — passed.
  • pnpm build — passed.
  • pnpm test:run — all server and UI groups passed. One unchanged CLI test saw the run-injected static AWS credentials and expected only its local AWS_PROFILE. The same test passed, 8 of 8, after removing only AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from its process environment.

Risks

  • File chips now appear after an asynchronous availability check, so path-shaped text can briefly render as inline code.
  • Availability results use the existing 30-second file-resource cache window. File-resource invalidation forces a new check.
  • The endpoint limits each request to 100 references and the client chunks larger sets.

For core feature work, check ROADMAP.md first and discuss it in #dev before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See CONTRIBUTING.md.

Model Used

  • OpenAI Codex with GPT-5. The service did not expose a more specific model ID or context-window size. The agent used high-reasoning mode, repository tools, command execution, and test execution.

Checklist

  • I have included a thinking path that traces from project context to this change
  • I have specified the model used (with version and capability details)
  • I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work
  • I have searched GitHub for duplicate or related PRs and linked them above
  • I have either (a) linked existing issues with Fixes: # / Closes # / Refs # OR (b) described the issue in-PR following the relevant issue template
  • I have not referenced internal/instance-local Paperclip issues or links (only public GitHub #NNN / github.com/paperclipai/paperclip URLs)
  • My branch name describes the change (e.g. docs/..., fix/...) and contains no internal Paperclip ticket id or instance-derived details
  • I have run tests locally and they pass
  • I have added or updated tests where applicable
  • I have updated relevant documentation to reflect my changes
  • I have considered and documented any risks above
  • All Paperclip CI gates are green
  • Greptile is 5/5 with no open P2s, recommendations, or follow-ups
  • I will address all Greptile and reviewer comments before requesting merge

cryppadotta and others added 3 commits August 8, 2026 07:19
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Auto-detected workspace file paths in task comments were promoted to
file-viewer chips purely on path shape, so missing, denied, ambiguous,
remote, and non-previewable references looked actionable and failed on
click.

Chips now render only after the server confirms the current board session
can open that exact reference:

- Add an issue-scoped availability registry on the file-viewer provider.
  References found while rendering markdown are deduplicated by
  [workspace, projectId, workspaceId, path] (matching the server's dedup
  key), coalesced into one request per event-loop burst, chunked only
  above the 100-query cap, and never re-requested once cached or pending.
- Cache batches on the shared issue file-resource query key with the
  viewer's existing 30s stale window, so invalidating the issue's file
  resources forces a recheck; new comments check only unseen references.
- Turn remarkWorkspaceFileRefs into a factory taking a resolver. Pending,
  unavailable, denied, unsupported, remote, ambiguous, unmatched, and
  batch-error references fail closed to ordinary inline code with no
  icon, chip styling, button role, tooltip, or provisional link. Explicit
  markdown links stay ordinary links.
- Bind openable chips to the resolved workspace selector and, for project
  workspaces, the resolved project/workspace IDs, so the click reuses the
  target that passed preflight instead of repeating auto discovery.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Paperclip <noreply@paperclip.ing>
@cryppadotta

Copy link
Copy Markdown
Contributor Author

@greptile review

1 similar comment
@cryppadotta

Copy link
Copy Markdown
Contributor Author

@greptile review

@cryppadotta

Copy link
Copy Markdown
Contributor Author

@greptileai review this

@cryppadotta

Copy link
Copy Markdown
Contributor Author

@greptile-apps review

@cryppadotta

Copy link
Copy Markdown
Contributor Author

@greptile review

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