feat: improve diff tool display and token efficiency#1146
feat: improve diff tool display and token efficiency#1146brendan-kellam merged 5 commits intomainfrom
Conversation
- Truncate full commit SHAs to 7 characters for compact display - Use RepoBadge component for consistent repository rendering - Convert JSON output to git-diff format for better token efficiency Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughConverts the diff tool output from JSON to git-unified diff text, enriches tool metadata with resolved repoInfo, truncates commit SHAs to 7 chars in the UI, and replaces inline repo text with a RepoBadge component. Adds a formatter utility and tests; throws if repo lookup fails. Changes
Sequence Diagram(s)sequenceDiagram
participant User as Client/UI
participant Component as Diff UI Component
participant Tool as get_diff Tool (Server)
participant Repo as Repo Service
participant DiffSvc as Diff Service
Component->>Tool: request diff(repo, base, head)
Tool->>Repo: getRepoInfoByName(repo)
Repo-->>Tool: repoInfo (or not found)
alt repo found
Tool->>DiffSvc: fetch structured diff
DiffSvc-->>Tool: getDiffResponseSchema JSON
Tool->>Tool: formatDiffAsGitDiff(response) -> git-unified diff
Tool-->>Component: { diffText, metadata: { repoInfo, base, head, ... } }
Component->>Component: render RepoBadge(repoInfo) and truncated SHAs
Component-->>User: display git-unified diff and badges
else repo not found
Tool-->>Component: throw "Repository \"<repo>\" not found."
Component-->>User: show error
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
Co-authored-by: Brendan Kellam <brendan@sourcebot.dev>
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
packages/web/src/features/tools/getDiff.ts (1)
71-74: Redundant null check.
getRepoInfoByNameis wrapped withsew()and returnsT | ServiceError— it never resolves tonull/undefined. The!repoInfoResultbranch is dead code;isServiceErroralone is sufficient.- if (isServiceError(repoInfoResult) || !repoInfoResult) { + if (isServiceError(repoInfoResult)) { throw new Error(`Repository "${repo}" not found.`); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/features/tools/getDiff.ts` around lines 71 - 74, The null/undefined guard after calling getRepoInfoByName is redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo info or a ServiceError; remove the "!repoInfoResult" check and keep only the isServiceError(repoInfoResult) branch, throwing the same Error when isServiceError(...) is true so that the repository-not-found path is driven solely by isServiceError; update the repository retrieval block around getRepoInfoByName and repoInfoResult accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/web/src/features/tools/getDiff.test.ts`:
- Around line 86-91: The test expectations in getDiff.test.ts currently assert
non-standard paths like "+++ b//dev/null" and "--- a//dev/null"; update the
expected diff strings (the `expected` variables around the blocks at lines
shown) to use the corrected `/dev/null` form without the `a/` or `b/` prefix and
without the double slash (i.e., change "+++ b//dev/null" -> "+++ /dev/null" and
"--- a//dev/null" -> "--- /dev/null"), so the assertions match the fixed
formatter output from getDiff.ts.
- Around line 5-35: The test duplicates the implementation of
formatDiffAsGitDiff; instead export the canonical function from getDiff.ts and
import it in getDiff.test.ts so tests use the single source of truth. Remove the
local formatDiffAsGitDiff from packages/web/src/features/tools/getDiff.test.ts,
add an export of formatDiffAsGitDiff in
packages/web/src/features/tools/getDiff.ts (or ensure it is exported), then
update the test to import { formatDiffAsGitDiff } from the getDiff module and
use that imported function in assertions.
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 26-31: The diff headers currently produce `--- a//dev/null` and
`+++ b//dev/null` when oldPath/newPath are nullish; update the loop in getDiff
(the block that defines oldPath/newPath and appends the `---`/`+++` lines) so
that if file.oldPath or file.newPath is nullish you print `--- /dev/null` or
`+++ /dev/null` (no a/ or b/ prefix), otherwise continue to print `---
a/${oldPath}` and `+++ b/${newPath}`; adjust the variables used to build the two
header lines (the oldPath/newPath handling and the output += lines) accordingly.
- Around line 23-53: The helper function formatDiffAsGitDiff is not exported,
causing tests to copy-paste its body instead of using the real implementation;
export the function (retain its signature and GetDiffResult type) from
packages/web/src/features/tools/getDiff.ts so production code and tests share
the same implementation, then update the companion test (getDiff.test.ts) to
import formatDiffAsGitDiff from that module instead of duplicating the function
body.
---
Nitpick comments:
In `@packages/web/src/features/tools/getDiff.ts`:
- Around line 71-74: The null/undefined guard after calling getRepoInfoByName is
redundant because getRepoInfoByName (wrapped by sew) returns either a valid repo
info or a ServiceError; remove the "!repoInfoResult" check and keep only the
isServiceError(repoInfoResult) branch, throwing the same Error when
isServiceError(...) is true so that the repository-not-found path is driven
solely by isServiceError; update the repository retrieval block around
getRepoInfoByName and repoInfoResult accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: a902810e-371d-43b9-9647-19f6c727aec5
📒 Files selected for processing (4)
CHANGELOG.mdpackages/web/src/features/chat/components/chatThread/tools/getDiffToolComponent.tsxpackages/web/src/features/tools/getDiff.test.tspackages/web/src/features/tools/getDiff.ts
This PR implements the feedback from the Slack thread on the diff tool:
read_file,list_commits, etc.Changes
getDiff.tsto format the API response into git-diff format and fetch repo infogetDiffToolComponent.tsxto truncate SHAs and use RepoBadgeGetDiffRepoInfotype to metadata for repository informationSlack Thread
Summary by CodeRabbit
New Features
Improvements
Tests