ui: Refactor Built-In Tools naming (Server/Browser) (#27271)

* server: rename built-in tools to server tools

* ui: rename built-in tools to server/browser tools
This commit is contained in:
Aleksander Grygier
2026-08-17 22:23:22 +02:00
committed by GitHub
parent 058df671b2
commit 0021a77de0
49 changed files with 315 additions and 286 deletions
+67 -54
View File
@@ -16,7 +16,7 @@ import { describe, expect, it } from 'vitest';
function makeSection(
overrides: Partial<AgenticSection> = {},
toolName = BuiltInTool.READ_FILE
toolName = BuiltInTool.SERVER_READ_FILE
): AgenticSection {
return {
content: '',
@@ -115,15 +115,18 @@ describe('formatCwdMessage / parseCwdMessage', () => {
describe('parseToolArgs (shared)', () => {
it('returns null when the section has no toolArgs', () => {
const result = parseToolArgs(BuiltInTool.READ_FILE, makeSection({ toolArgs: undefined }));
const result = parseToolArgs(
BuiltInTool.SERVER_READ_FILE,
makeSection({ toolArgs: undefined })
);
expect(result).toBeNull();
});
it('returns null when the tool name does not match', () => {
const result = parseToolArgs(
BuiltInTool.READ_FILE,
makeSection({ toolArgs: '{"path":"/x"}' }, BuiltInTool.WRITE_FILE)
BuiltInTool.SERVER_READ_FILE,
makeSection({ toolArgs: '{"path":"/x"}' }, BuiltInTool.SERVER_WRITE_FILE)
);
expect(result).toBeNull();
@@ -131,7 +134,7 @@ describe('parseToolArgs (shared)', () => {
it('returns null when args are not valid final JSON (partial: false)', () => {
const result = parseToolArgs(
BuiltInTool.READ_FILE,
BuiltInTool.SERVER_READ_FILE,
makeSection({ toolArgs: '{"path": "/foo.tx' })
);
@@ -140,7 +143,7 @@ describe('parseToolArgs (shared)', () => {
it('returns parsed args when valid final JSON', () => {
const result = parseToolArgs(
BuiltInTool.READ_FILE,
BuiltInTool.SERVER_READ_FILE,
makeSection({ toolArgs: '{"path":"/foo.txt"}' })
);
@@ -149,7 +152,7 @@ describe('parseToolArgs (shared)', () => {
it('accepts partial JSON when partial: true', () => {
const result = parseToolArgs(
BuiltInTool.READ_FILE,
BuiltInTool.SERVER_READ_FILE,
makeSection({ toolArgs: '{"path": "/foo.tx' }),
{ partial: true }
);
@@ -162,7 +165,10 @@ describe('parseWriteFileMeta', () => {
it('returns null for sections with a different tool name', () => {
expect(
parseWriteFileMeta(
makeSection({ toolArgs: '{"path":"/x","content":"y"}', toolName: BuiltInTool.READ_FILE })
makeSection({
toolArgs: '{"path":"/x","content":"y"}',
toolName: BuiltInTool.SERVER_READ_FILE
})
)
).toBeNull();
});
@@ -170,14 +176,14 @@ describe('parseWriteFileMeta', () => {
it('returns null when args have no path-like field', () => {
expect(
parseWriteFileMeta(
makeSection({ toolArgs: '{"content":"x"}', toolName: BuiltInTool.WRITE_FILE })
makeSection({ toolArgs: '{"content":"x"}', toolName: BuiltInTool.SERVER_WRITE_FILE })
)
).toBeNull();
});
it('accepts partial args (renders incrementally as content streams in)', () => {
const meta = parseWriteFileMeta(
makeSection({ toolArgs: '{"path":"/foo.t', toolName: BuiltInTool.WRITE_FILE })
makeSection({ toolArgs: '{"path":"/foo.t', toolName: BuiltInTool.SERVER_WRITE_FILE })
);
expect(meta?.filePath).toBe('/foo.t');
@@ -188,10 +194,10 @@ describe('parseWriteFileMeta', () => {
makeSection(
{
toolArgs: '{"path":"/foo.ts","content":"x"}',
toolName: BuiltInTool.WRITE_FILE,
toolName: BuiltInTool.SERVER_WRITE_FILE,
toolResult: '{"result":"wrote","bytes":42}'
},
BuiltInTool.WRITE_FILE
BuiltInTool.SERVER_WRITE_FILE
)
);
@@ -208,7 +214,7 @@ describe('parseWriteFileMeta', () => {
const meta = parseWriteFileMeta(
makeSection({
toolArgs: '{"path":"/foo","content":"x"}',
toolName: BuiltInTool.WRITE_FILE,
toolName: BuiltInTool.SERVER_WRITE_FILE,
toolResult: '{"error":"permission denied"}'
})
);
@@ -223,10 +229,10 @@ describe('parseEditFileMeta', () => {
{
toolArgs:
'{"path":"/foo.ts","edits":[{"old_text":"a","new_text":"b"},{"old_text":"c","new_text":"d"}]}',
toolName: BuiltInTool.EDIT_FILE,
toolName: BuiltInTool.SERVER_EDIT_FILE,
toolResult: '{"result":"ok","edits_applied":2}'
},
BuiltInTool.EDIT_FILE
BuiltInTool.SERVER_EDIT_FILE
);
const meta = parseEditFileMeta(section);
@@ -242,9 +248,9 @@ describe('parseEditFileMeta', () => {
const section = makeSection(
{
toolArgs: '{"path":"/foo","edits":[{"old_text":""},{"old_text":"a","new_text":""}]}',
toolName: BuiltInTool.EDIT_FILE
toolName: BuiltInTool.SERVER_EDIT_FILE
},
BuiltInTool.EDIT_FILE
BuiltInTool.SERVER_EDIT_FILE
);
const meta = parseEditFileMeta(section);
@@ -257,10 +263,10 @@ describe('parseEditFileMeta', () => {
const section = makeSection(
{
toolArgs: '{"path":"/foo"}',
toolName: BuiltInTool.EDIT_FILE,
toolName: BuiltInTool.SERVER_EDIT_FILE,
toolResult: '{"error":"bad path","result":"ok"}'
},
BuiltInTool.EDIT_FILE
BuiltInTool.SERVER_EDIT_FILE
);
const meta = parseEditFileMeta(section);
@@ -272,7 +278,7 @@ describe('parseEditFileMeta', () => {
describe('parseReadFileMeta', () => {
it('parses file name alone (no range)', () => {
const meta = parseReadFileMeta(
makeSection({ toolArgs: '{"path":"/foo.txt"}' }, BuiltInTool.READ_FILE)
makeSection({ toolArgs: '{"path":"/foo.txt"}' }, BuiltInTool.SERVER_READ_FILE)
);
expect(meta?.fileName).toBe('foo.txt');
@@ -283,7 +289,7 @@ describe('parseReadFileMeta', () => {
const meta = parseReadFileMeta(
makeSection(
{ toolArgs: '{"path":"/foo.ts","start_line":10,"end_line":20}' },
BuiltInTool.READ_FILE
BuiltInTool.SERVER_READ_FILE
)
);
@@ -294,7 +300,7 @@ describe('parseReadFileMeta', () => {
const meta = parseReadFileMeta(
makeSection(
{ toolArgs: '{"path":"/foo.ts","start_line":10,"line_count":5}' },
BuiltInTool.READ_FILE
BuiltInTool.SERVER_READ_FILE
)
);
@@ -302,7 +308,9 @@ describe('parseReadFileMeta', () => {
});
it('returns null when args cannot be parsed', () => {
expect(parseReadFileMeta(makeSection({ toolArgs: '{bad' }, BuiltInTool.READ_FILE))).toBeNull();
expect(
parseReadFileMeta(makeSection({ toolArgs: '{bad' }, BuiltInTool.SERVER_READ_FILE))
).toBeNull();
});
});
@@ -310,12 +318,12 @@ describe('parseGrepSearchMeta', () => {
it('returns null when path or pattern is missing', () => {
expect(
parseGrepSearchMeta(
makeSection({ toolArgs: '{"pattern":"foo"}', toolName: BuiltInTool.GREP_SEARCH })
makeSection({ toolArgs: '{"pattern":"foo"}', toolName: BuiltInTool.SERVER_GREP_SEARCH })
)
).toBeNull();
expect(
parseGrepSearchMeta(
makeSection({ toolArgs: '{"path":"/x"}', toolName: BuiltInTool.GREP_SEARCH })
makeSection({ toolArgs: '{"path":"/x"}', toolName: BuiltInTool.SERVER_GREP_SEARCH })
)
).toBeNull();
});
@@ -325,10 +333,10 @@ describe('parseGrepSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x","pattern":"foo"}',
toolName: BuiltInTool.GREP_SEARCH,
toolName: BuiltInTool.SERVER_GREP_SEARCH,
toolResult: JSON.stringify({ plain_text_response: 'a.ts:hello\nb.ts:world' })
},
BuiltInTool.GREP_SEARCH
BuiltInTool.SERVER_GREP_SEARCH
)
);
@@ -341,10 +349,10 @@ describe('parseGrepSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x","pattern":"foo"}',
toolName: BuiltInTool.GREP_SEARCH,
toolName: BuiltInTool.SERVER_GREP_SEARCH,
toolResult: 'a.ts:hello\nb.ts:world'
},
BuiltInTool.GREP_SEARCH
BuiltInTool.SERVER_GREP_SEARCH
)
);
@@ -356,10 +364,10 @@ describe('parseGrepSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x","pattern":"foo","return_line_numbers":true}',
toolName: BuiltInTool.GREP_SEARCH,
toolName: BuiltInTool.SERVER_GREP_SEARCH,
toolResult: 'a.ts:12:hello'
},
BuiltInTool.GREP_SEARCH
BuiltInTool.SERVER_GREP_SEARCH
)
);
@@ -374,10 +382,10 @@ describe('parseFileGlobSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x"}',
toolName: BuiltInTool.FILE_GLOB_SEARCH,
toolName: BuiltInTool.SERVER_FILE_GLOB_SEARCH,
toolResult: 'a.ts\nb.ts'
},
BuiltInTool.FILE_GLOB_SEARCH
BuiltInTool.SERVER_FILE_GLOB_SEARCH
)
);
@@ -389,10 +397,10 @@ describe('parseFileGlobSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x"}',
toolName: BuiltInTool.FILE_GLOB_SEARCH,
toolName: BuiltInTool.SERVER_FILE_GLOB_SEARCH,
toolResult: JSON.stringify({ plain_text_response: 'a.ts\nb.ts' })
},
BuiltInTool.FILE_GLOB_SEARCH
BuiltInTool.SERVER_FILE_GLOB_SEARCH
)
);
@@ -404,10 +412,10 @@ describe('parseFileGlobSearchMeta', () => {
makeSection(
{
toolArgs: '{"path":"/x"}',
toolName: BuiltInTool.FILE_GLOB_SEARCH,
toolName: BuiltInTool.SERVER_FILE_GLOB_SEARCH,
toolResult: JSON.stringify({ error: 'permission denied' })
},
BuiltInTool.FILE_GLOB_SEARCH
BuiltInTool.SERVER_FILE_GLOB_SEARCH
)
);
@@ -418,15 +426,20 @@ describe('parseFileGlobSearchMeta', () => {
describe('parseRunJavascriptMeta', () => {
it('returns null when code is missing', () => {
expect(
parseRunJavascriptMeta(makeSection({ toolArgs: '{}', toolName: BuiltInTool.RUN_JAVASCRIPT }))
parseRunJavascriptMeta(
makeSection({ toolArgs: '{}', toolName: BuiltInTool.BROWSER_RUN_JAVASCRIPT })
)
).toBeNull();
});
it('reads code and timeout', () => {
const meta = parseRunJavascriptMeta(
makeSection(
{ toolArgs: '{"code":"Math.PI","timeout_ms":5000}', toolName: BuiltInTool.RUN_JAVASCRIPT },
BuiltInTool.RUN_JAVASCRIPT
{
toolArgs: '{"code":"Math.PI","timeout_ms":5000}',
toolName: BuiltInTool.BROWSER_RUN_JAVASCRIPT
},
BuiltInTool.BROWSER_RUN_JAVASCRIPT
)
);
@@ -439,10 +452,10 @@ describe('parseRunJavascriptMeta', () => {
makeSection(
{
toolArgs: '{"code":"throw new Error()"}',
toolName: BuiltInTool.RUN_JAVASCRIPT,
toolName: BuiltInTool.BROWSER_RUN_JAVASCRIPT,
toolResult: JSON.stringify({ error: 'undefined is not a function' })
},
BuiltInTool.RUN_JAVASCRIPT
BuiltInTool.BROWSER_RUN_JAVASCRIPT
)
);
@@ -457,10 +470,10 @@ describe('parseRunJavascriptMeta', () => {
makeSection(
{
toolArgs: '{"code":"[1,2,3]"}',
toolName: BuiltInTool.RUN_JAVASCRIPT,
toolName: BuiltInTool.BROWSER_RUN_JAVASCRIPT,
toolResult: '[1,2,3]'
},
BuiltInTool.RUN_JAVASCRIPT
BuiltInTool.BROWSER_RUN_JAVASCRIPT
)
);
@@ -472,10 +485,10 @@ describe('parseRunJavascriptMeta', () => {
makeSection(
{
toolArgs: '{"code":"foo"}',
toolName: BuiltInTool.RUN_JAVASCRIPT,
toolName: BuiltInTool.BROWSER_RUN_JAVASCRIPT,
toolResult: 'Error: undefined is not a function\n at <anonymous>:1:1'
},
BuiltInTool.RUN_JAVASCRIPT
BuiltInTool.BROWSER_RUN_JAVASCRIPT
)
);
@@ -487,8 +500,8 @@ describe('parseExecShellCommandMeta', () => {
it('reads command from the args', () => {
const meta = parseExecShellCommandMeta(
makeSection(
{ toolArgs: '{"command":"ls -la"}', toolName: BuiltInTool.EXEC_SHELL_COMMAND },
BuiltInTool.EXEC_SHELL_COMMAND
{ toolArgs: '{"command":"ls -la"}', toolName: BuiltInTool.SERVER_EXEC_SHELL_COMMAND },
BuiltInTool.SERVER_EXEC_SHELL_COMMAND
)
);
@@ -499,16 +512,16 @@ describe('parseExecShellCommandMeta', () => {
expect(
parseExecShellCommandMeta(
makeSection(
{ toolArgs: '{"cmd":"ls"}', toolName: BuiltInTool.EXEC_SHELL_COMMAND },
BuiltInTool.EXEC_SHELL_COMMAND
{ toolArgs: '{"cmd":"ls"}', toolName: BuiltInTool.SERVER_EXEC_SHELL_COMMAND },
BuiltInTool.SERVER_EXEC_SHELL_COMMAND
)
)?.command
).toBe('ls');
expect(
parseExecShellCommandMeta(
makeSection(
{ toolArgs: '{"shell_command":"ls"}', toolName: BuiltInTool.EXEC_SHELL_COMMAND },
BuiltInTool.EXEC_SHELL_COMMAND
{ toolArgs: '{"shell_command":"ls"}', toolName: BuiltInTool.SERVER_EXEC_SHELL_COMMAND },
BuiltInTool.SERVER_EXEC_SHELL_COMMAND
)
)?.command
).toBe('ls');
@@ -518,8 +531,8 @@ describe('parseExecShellCommandMeta', () => {
expect(
parseExecShellCommandMeta(
makeSection(
{ toolArgs: '{"cwd":"/x"}', toolName: BuiltInTool.EXEC_SHELL_COMMAND },
BuiltInTool.EXEC_SHELL_COMMAND
{ toolArgs: '{"cwd":"/x"}', toolName: BuiltInTool.SERVER_EXEC_SHELL_COMMAND },
BuiltInTool.SERVER_EXEC_SHELL_COMMAND
)
)
).toBeNull();