Skip to content

Commit 1204343

Browse files
improve search tool by changing it's interface to look like grep
1 parent 5839591 commit 1204343

20 files changed

+306
-196
lines changed

packages/web/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
"escape-string-regexp": "^5.0.0",
145145
"fast-deep-equal": "^3.1.3",
146146
"fuse.js": "^7.0.0",
147+
"glob-to-regexp": "^0.4.1",
147148
"google-auth-library": "^10.1.0",
148149
"graphql": "^16.9.0",
149150
"http-status-codes": "^2.3.0",
@@ -202,6 +203,7 @@
202203
"@tanstack/eslint-plugin-query": "^5.74.7",
203204
"@testing-library/dom": "^10.4.1",
204205
"@testing-library/react": "^16.3.0",
206+
"@types/glob-to-regexp": "^0.4.4",
205207
"@types/micromatch": "^4.0.9",
206208
"@types/node": "^20",
207209
"@types/nodemailer": "^6.4.17",

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { ANSWER_TAG, FILE_REFERENCE_PREFIX } from "./constants";
1818
import { findSymbolReferencesDefinition } from "@/features/tools/findSymbolReferences";
1919
import { findSymbolDefinitionsDefinition } from "@/features/tools/findSymbolDefinitions";
2020
import { readFileDefinition } from "@/features/tools/readFile";
21-
import { searchCodeDefinition } from "@/features/tools/searchCode";
21+
import { grepDefinition } from "@/features/tools/grep";
2222
import { Source } from "./types";
2323
import { addLineNumbers, fileReferenceToString } from "./utils";
2424
import { tools } from "./tools";
@@ -229,7 +229,7 @@ const createAgentStream = async ({
229229
revision: output.metadata.revision,
230230
name: output.metadata.path.split('/').pop() ?? output.metadata.path,
231231
});
232-
} else if (toolName === searchCodeDefinition.name) {
232+
} else if (toolName === grepDefinition.name) {
233233
output.metadata.files.forEach((file) => {
234234
onWriteSource({
235235
type: 'file',
@@ -308,8 +308,7 @@ const createPrompt = ({
308308
The user has explicitly selected the following repositories for analysis:
309309
${repos.map(repo => `- ${repo}`).join('\n')}
310310
311-
When calling tools that accept a \`repo\` parameter (e.g. \`read_file\`, \`list_commits\`, \`list_tree\`), use these repository names directly.
312-
When calling the \`search_code\` tool, pass these repositories as \`filterByRepos\` to scope results to the selected repositories.
311+
When calling tools that accept a \`repo\` parameter (e.g. \`read_file\`, \`list_commits\`, \`list_tree\`, \`grep\`), use these repository names directly.
313312
</selected_repositories>
314313
` : ''}
315314

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { MarkdownRenderer } from './markdownRenderer';
1313
import { FindSymbolDefinitionsToolComponent } from './tools/findSymbolDefinitionsToolComponent';
1414
import { FindSymbolReferencesToolComponent } from './tools/findSymbolReferencesToolComponent';
1515
import { ReadFileToolComponent } from './tools/readFileToolComponent';
16-
import { SearchCodeToolComponent } from './tools/searchCodeToolComponent';
16+
import { GrepToolComponent } from './tools/grepToolComponent';
1717
import { ListReposToolComponent } from './tools/listReposToolComponent';
1818
import { ListCommitsToolComponent } from './tools/listCommitsToolComponent';
1919
import { ListTreeToolComponent } from './tools/listTreeToolComponent';
@@ -174,9 +174,9 @@ const DetailsCardComponent = ({
174174
part={part}
175175
/>
176176
)
177-
case 'tool-search_code':
177+
case 'tool-grep':
178178
return (
179-
<SearchCodeToolComponent
179+
<GrepToolComponent
180180
key={index}
181181
part={part}
182182
/>

packages/web/src/features/chat/components/chatThread/tools/findSymbolDefinitionsToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ export const FindSymbolDefinitionsToolComponent = ({ part }: { part: FindSymbolD
2525
}
2626
}, [part]);
2727

28-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
29-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
30-
: undefined;
31-
3228
return (
3329
<div className="my-4">
3430
<ToolHeader
@@ -38,7 +34,8 @@ export const FindSymbolDefinitionsToolComponent = ({ part }: { part: FindSymbolD
3834
label={label}
3935
Icon={BookOpenIcon}
4036
onExpand={setIsExpanded}
41-
onCopy={onCopy}
37+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
38+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4239
/>
4340
{part.state === 'output-available' && isExpanded && (
4441
<>

packages/web/src/features/chat/components/chatThread/tools/findSymbolReferencesToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ export const FindSymbolReferencesToolComponent = ({ part }: { part: FindSymbolRe
2525
}
2626
}, [part]);
2727

28-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
29-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
30-
: undefined;
31-
3228
return (
3329
<div className="my-4">
3430
<ToolHeader
@@ -38,7 +34,8 @@ export const FindSymbolReferencesToolComponent = ({ part }: { part: FindSymbolRe
3834
label={label}
3935
Icon={BookOpenIcon}
4036
onExpand={setIsExpanded}
41-
onCopy={onCopy}
37+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
38+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4239
/>
4340
{part.state === 'output-available' && isExpanded && (
4441
<>

packages/web/src/features/chat/components/chatThread/tools/searchCodeToolComponent.tsx renamed to packages/web/src/features/chat/components/chatThread/tools/grepToolComponent.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
'use client';
22

3-
import { SearchCodeToolUIPart } from "@/features/chat/tools";
3+
import { GrepToolUIPart } from "@/features/chat/tools";
44
import { isServiceError } from "@/lib/utils";
55
import { useMemo, useState } from "react";
66
import { FileListItem, ToolHeader, TreeList } from "./shared";
77
import { CodeSnippet } from "@/app/components/codeSnippet";
88
import { Separator } from "@/components/ui/separator";
99
import { SearchIcon } from "lucide-react";
1010

11-
export const SearchCodeToolComponent = ({ part }: { part: SearchCodeToolUIPart }) => {
11+
export const GrepToolComponent = ({ part }: { part: GrepToolUIPart }) => {
1212
const [isExpanded, setIsExpanded] = useState(false);
1313

1414
const displayQuery = useMemo(() => {
1515
if (part.state !== 'input-available' && part.state !== 'output-available') {
1616
return '';
1717
}
1818

19-
return part.input.query;
19+
return part.input.pattern;
2020
}, [part]);
2121

2222
const label = useMemo(() => {
@@ -31,10 +31,6 @@ export const SearchCodeToolComponent = ({ part }: { part: SearchCodeToolUIPart }
3131
}
3232
}, [part, displayQuery]);
3333

34-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
35-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
36-
: undefined;
37-
3834
return (
3935
<div className="my-4">
4036
<ToolHeader
@@ -44,7 +40,8 @@ export const SearchCodeToolComponent = ({ part }: { part: SearchCodeToolUIPart }
4440
label={label}
4541
Icon={SearchIcon}
4642
onExpand={setIsExpanded}
47-
onCopy={onCopy}
43+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
44+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4845
/>
4946
{part.state === 'output-available' && isExpanded && (
5047
<>

packages/web/src/features/chat/components/chatThread/tools/listCommitsToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ export const ListCommitsToolComponent = ({ part }: { part: ListCommitsToolUIPart
2323
}
2424
}, [part]);
2525

26-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
27-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
28-
: undefined;
29-
3026
return (
3127
<div className="my-4">
3228
<ToolHeader
@@ -36,7 +32,8 @@ export const ListCommitsToolComponent = ({ part }: { part: ListCommitsToolUIPart
3632
label={label}
3733
Icon={GitCommitVerticalIcon}
3834
onExpand={setIsExpanded}
39-
onCopy={onCopy}
35+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
36+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4037
/>
4138
{part.state === 'output-available' && isExpanded && (
4239
<>

packages/web/src/features/chat/components/chatThread/tools/listReposToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ export const ListReposToolComponent = ({ part }: { part: ListReposToolUIPart })
2323
}
2424
}, [part]);
2525

26-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
27-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
28-
: undefined;
29-
3026
return (
3127
<div className="my-4">
3228
<ToolHeader
@@ -36,7 +32,8 @@ export const ListReposToolComponent = ({ part }: { part: ListReposToolUIPart })
3632
label={label}
3733
Icon={FolderOpenIcon}
3834
onExpand={setIsExpanded}
39-
onCopy={onCopy}
35+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
36+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4037
/>
4138
{part.state === 'output-available' && isExpanded && (
4239
<>

packages/web/src/features/chat/components/chatThread/tools/listTreeToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ export const ListTreeToolComponent = ({ part }: { part: ListTreeToolUIPart }) =>
2323
}
2424
}, [part]);
2525

26-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
27-
? () => { navigator.clipboard.writeText(part.output.output); return true; }
28-
: undefined;
29-
3026
return (
3127
<div className="my-4">
3228
<ToolHeader
@@ -36,7 +32,8 @@ export const ListTreeToolComponent = ({ part }: { part: ListTreeToolUIPart }) =>
3632
label={label}
3733
Icon={FolderIcon}
3834
onExpand={setIsExpanded}
39-
onCopy={onCopy}
35+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
36+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4037
/>
4138
{part.state === 'output-available' && isExpanded && (
4239
<>

packages/web/src/features/chat/components/chatThread/tools/readFileToolComponent.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ import { FileListItem, ToolHeader, TreeList } from "./shared";
1111
export const ReadFileToolComponent = ({ part }: { part: ReadFileToolUIPart }) => {
1212
const [isExpanded, setIsExpanded] = useState(false);
1313

14-
const onCopy = part.state === 'output-available' && !isServiceError(part.output)
15-
? () => { navigator.clipboard.writeText((part.output as { output: string }).output); return true; }
16-
: undefined;
17-
1814
const label = useMemo(() => {
1915
switch (part.state) {
2016
case 'input-streaming':
@@ -43,7 +39,8 @@ export const ReadFileToolComponent = ({ part }: { part: ReadFileToolUIPart }) =>
4339
label={label}
4440
Icon={EyeIcon}
4541
onExpand={setIsExpanded}
46-
onCopy={onCopy}
42+
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
43+
output={part.state === 'output-available' && !isServiceError(part.output) ? part.output.output : undefined}
4744
/>
4845
{part.state === 'output-available' && isExpanded && (
4946
<>

0 commit comments

Comments
 (0)