Skip to content

Commit a7511d7

Browse files
committed
feat(chat): expose get_diff tool in Ask agent
Register get_diff in the Ask agent toolset and render its output in the details panel so chat workflows can compare refs directly. Made-with: Cursor
1 parent f401c24 commit a7511d7

4 files changed

Lines changed: 44 additions & 1 deletion

File tree

packages/web/src/features/chat/agent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ const createPrompt = ({
271271
The user has explicitly selected the following repositories for analysis:
272272
${repos.map(repo => `- ${repo}`).join('\n')}
273273
274-
When calling tools that accept a \`repo\` parameter (e.g. \`read_file\`, \`list_commits\`, \`list_tree\`, \`grep\`), use these repository names exactly as listed above, including the full host prefix (e.g. \`github.com/org/repo\`).
274+
When calling tools that accept a \`repo\` parameter (e.g. \`read_file\`, \`list_commits\`, \`list_tree\`, \`get_diff\`, \`grep\`), use these repository names exactly as listed above, including the full host prefix (e.g. \`github.com/org/repo\`).
275275
276276
When using \`grep\` to search across ALL selected repositories (e.g. "which repos have X?"), omit the \`repo\` parameter entirely — the tool will automatically search across all selected repositories in a single call. Do NOT call \`grep\` once per repository when a single broad search would suffice.
277277
</selected_repositories>

packages/web/src/features/chat/components/chatThread/detailsCard.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { FindSymbolDefinitionsToolComponent } from './tools/findSymbolDefinition
1919
import { FindSymbolReferencesToolComponent } from './tools/findSymbolReferencesToolComponent';
2020
import { GlobToolComponent } from './tools/globToolComponent';
2121
import { GrepToolComponent } from './tools/grepToolComponent';
22+
import { GetDiffToolComponent } from './tools/getDiffToolComponent';
2223
import { ListCommitsToolComponent } from './tools/listCommitsToolComponent';
2324
import { ListReposToolComponent } from './tools/listReposToolComponent';
2425
import { ListTreeToolComponent } from './tools/listTreeToolComponent';
@@ -289,6 +290,15 @@ export const StepPartRenderer = ({ part }: { part: SBChatMessagePart }) => {
289290
{(output) => <ListCommitsToolComponent {...output} />}
290291
</ToolOutputGuard>
291292
)
293+
case 'tool-get_diff':
294+
return (
295+
<ToolOutputGuard
296+
part={part}
297+
loadingText="Comparing revisions..."
298+
>
299+
{(output) => <GetDiffToolComponent {...output} />}
300+
</ToolOutputGuard>
301+
)
292302
case 'tool-list_tree':
293303
return (
294304
<ToolOutputGuard
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use client';
2+
3+
import { Separator } from '@/components/ui/separator';
4+
import { GetDiffMetadata, ToolResult } from '@/features/tools';
5+
6+
export const GetDiffToolComponent = ({ metadata }: ToolResult<GetDiffMetadata>) => {
7+
const fileCount = metadata.files.length;
8+
9+
return (
10+
<div className="flex items-center gap-2 select-none cursor-default text-sm text-muted-foreground">
11+
<span className="flex-shrink-0">Compared</span>
12+
<span className="text-xs font-mono bg-muted px-1.5 py-0.5 rounded text-foreground">
13+
{metadata.base}
14+
</span>
15+
<span className="flex-shrink-0">to</span>
16+
<span className="text-xs font-mono bg-muted px-1.5 py-0.5 rounded text-foreground">
17+
{metadata.head}
18+
</span>
19+
<span className="flex-shrink-0">in</span>
20+
<span className="text-xs font-mono bg-muted px-1.5 py-0.5 rounded text-foreground truncate">
21+
{metadata.repo}
22+
</span>
23+
<span className="flex-1" />
24+
<span className="text-xs flex-shrink-0">
25+
{fileCount} changed {fileCount === 1 ? 'file' : 'files'}
26+
</span>
27+
<Separator orientation="vertical" className="h-3 flex-shrink-0" />
28+
</div>
29+
);
30+
};

packages/web/src/features/chat/tools.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
readFileDefinition,
44
listCommitsDefinition,
55
listReposDefinition,
6+
getDiffDefinition,
67
grepDefinition,
78
globDefinition,
89
findSymbolReferencesDefinition,
@@ -17,6 +18,7 @@ export const createTools = (context: ToolContext) => ({
1718
[readFileDefinition.name]: toVercelAITool(readFileDefinition, context),
1819
[listCommitsDefinition.name]: toVercelAITool(listCommitsDefinition, context),
1920
[listReposDefinition.name]: toVercelAITool(listReposDefinition, context),
21+
[getDiffDefinition.name]: toVercelAITool(getDiffDefinition, context),
2022
[grepDefinition.name]: toVercelAITool(grepDefinition, context),
2123
[globDefinition.name]: toVercelAITool(globDefinition, context),
2224
[findSymbolReferencesDefinition.name]: toVercelAITool(findSymbolReferencesDefinition, context),
@@ -27,6 +29,7 @@ export const createTools = (context: ToolContext) => ({
2729
export type ReadFileToolUIPart = ToolUIPart<{ read_file: SBChatMessageToolTypes['read_file'] }>;
2830
export type ListCommitsToolUIPart = ToolUIPart<{ list_commits: SBChatMessageToolTypes['list_commits'] }>;
2931
export type ListReposToolUIPart = ToolUIPart<{ list_repos: SBChatMessageToolTypes['list_repos'] }>;
32+
export type GetDiffToolUIPart = ToolUIPart<{ get_diff: SBChatMessageToolTypes['get_diff'] }>;
3033
export type GrepToolUIPart = ToolUIPart<{ grep: SBChatMessageToolTypes['grep'] }>;
3134
export type GlobToolUIPart = ToolUIPart<{ glob: SBChatMessageToolTypes['glob'] }>;
3235
export type FindSymbolReferencesToolUIPart = ToolUIPart<{ find_symbol_references: SBChatMessageToolTypes['find_symbol_references'] }>;

0 commit comments

Comments
 (0)