Skip to content

Commit 742ad6b

Browse files
Samiya CaurDevtools-frontend LUCI CQ
authored andcommitted
[DrJones] Explicitly call requestContentData to make sure file content is available for Files AI Assistant.
Bug: 381071361 Change-Id: I844b0b4d9c29ff452b0392896158dfe481da9176 Fixed: 381071361 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6051598 Reviewed-by: Alex Rudenko <[email protected]> Commit-Queue: Samiya Caur <[email protected]>
1 parent a224c32 commit 742ad6b

File tree

3 files changed

+99
-60
lines changed

3 files changed

+99
-60
lines changed

front_end/panels/freestyler/AiAgent.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ export abstract class ConversationContext<T> {
148148
// https://html.spec.whatwg.org/#ascii-serialisation-of-an-origin.
149149
return this.getOrigin() === agentOrigin;
150150
}
151+
152+
/**
153+
* This method is called at the start of `AiAgent.run`.
154+
* It will be overriden in subclasses to fetch data related to the context item.
155+
*/
156+
async refresh(): Promise<void> {
157+
return;
158+
}
151159
}
152160

153161
export abstract class AiAgent<T> {
@@ -408,6 +416,8 @@ STOP`;
408416
throw new Error('History entries are read-only.');
409417
}
410418

419+
await options.selected?.refresh();
420+
411421
// First context set on the agent determines its origin from now on.
412422
if (options.selected && this.#origin === undefined && options.selected) {
413423
this.#origin = options.selected.getOrigin();

front_end/panels/freestyler/DrJonesFileAgent.test.ts

Lines changed: 83 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ describeWithMockConnection('DrJonesFileAgent', () => {
137137
mimeType?: string,
138138
url?: Platform.DevToolsPath.UrlString,
139139
resourceType?: Common.ResourceType.ResourceType,
140+
requestContentData?: boolean,
140141
}): Promise<Workspace.UISourceCode.UISourceCode> {
141142
const url = options?.url ?? 'http://example.test/script.js' as Platform.DevToolsPath.UrlString;
142143
const {project} = createContentProviderUISourceCodes({
@@ -152,98 +153,118 @@ describeWithMockConnection('DrJonesFileAgent', () => {
152153
});
153154

154155
const uiSourceCode = project.uiSourceCodeForURL(url);
155-
156156
if (!uiSourceCode) {
157157
throw new Error('Failed to create a test uiSourceCode');
158158
}
159-
await uiSourceCode.requestContentData();
159+
if (!uiSourceCode.contentType().isTextType()) {
160+
uiSourceCode?.setContent('binary', true);
161+
}
162+
if (options?.requestContentData) {
163+
await uiSourceCode.requestContentData();
164+
}
160165
return uiSourceCode;
161166
}
162167

163168
describe('run', () => {
164-
it('generates an answer', async () => {
165-
async function* generateAnswer() {
166-
yield {
167-
explanation: 'This is the answer',
168-
metadata: {
169-
rpcGlobalId: 123,
170-
},
171-
completed: true,
172-
};
173-
}
169+
const testArguments = [
170+
{
171+
name: 'content loaded',
172+
requestContentData: true,
173+
},
174+
{
175+
name: 'content not loaded',
176+
requestContentData: false,
177+
},
178+
];
174179

175-
const agent = new DrJonesFileAgent({
176-
aidaClient: mockAidaClient(generateAnswer),
177-
});
180+
testArguments.forEach(args => {
181+
it('generates an answer ' + args.name, async () => {
182+
async function* generateAnswer() {
183+
yield {
184+
explanation: 'This is the answer',
185+
metadata: {
186+
rpcGlobalId: 123,
187+
},
188+
completed: true,
189+
};
190+
}
178191

179-
const uiSourceCode = await createUISourceCode();
180-
const responses =
181-
await Array.fromAsync(agent.run('test', {selected: uiSourceCode ? new FileContext(uiSourceCode) : null}));
192+
const agent = new DrJonesFileAgent({
193+
aidaClient: mockAidaClient(generateAnswer),
194+
});
182195

183-
assert.deepStrictEqual(responses, [
184-
{
185-
type: ResponseType.USER_QUERY,
186-
query: 'test',
187-
},
188-
{
189-
type: ResponseType.CONTEXT,
190-
title: 'Analyzing file',
191-
details: [
192-
{
193-
title: 'Selected file',
194-
text: `File name: script.js
196+
const uiSourceCode = await createUISourceCode({
197+
requestContentData: args.requestContentData,
198+
content: 'content',
199+
});
200+
const responses =
201+
await Array.fromAsync(agent.run('test', {selected: uiSourceCode ? new FileContext(uiSourceCode) : null}));
202+
203+
assert.deepStrictEqual(responses, [
204+
{
205+
type: ResponseType.USER_QUERY,
206+
query: 'test',
207+
},
208+
{
209+
type: ResponseType.CONTEXT,
210+
title: 'Analyzing file',
211+
details: [
212+
{
213+
title: 'Selected file',
214+
text: `File name: script.js
195215
URL: http://example.test/script.js
196216
File content:
197217
\`\`\`
198-
218+
content
199219
\`\`\``,
200-
},
201-
],
202-
},
203-
{
204-
type: ResponseType.QUERYING,
205-
query: `# Selected file
220+
},
221+
],
222+
},
223+
{
224+
type: ResponseType.QUERYING,
225+
query: `# Selected file
206226
File name: script.js
207227
URL: http://example.test/script.js
208228
File content:
209229
\`\`\`
210-
230+
content
211231
\`\`\`
212232
213233
# User request
214234
215235
test`,
216-
},
217-
{
218-
type: ResponseType.ANSWER,
219-
text: 'This is the answer',
220-
suggestions: undefined,
221-
rpcId: 123,
222-
},
223-
]);
236+
},
237+
{
238+
type: ResponseType.ANSWER,
239+
text: 'This is the answer',
240+
suggestions: undefined,
241+
rpcId: 123,
242+
},
243+
]);
224244

225-
assert.deepStrictEqual(agent.chatHistoryForTesting, [
226-
{
227-
role: 1,
228-
parts: [{
229-
text: `# Selected file
245+
assert.deepStrictEqual(agent.chatHistoryForTesting, [
246+
{
247+
role: 1,
248+
parts: [{
249+
text: `# Selected file
230250
File name: script.js
231251
URL: http://example.test/script.js
232252
File content:
233253
\`\`\`
234-
254+
content
235255
\`\`\`
236256
237257
# User request
238258
239259
test`,
240-
}],
241-
},
242-
{
243-
role: 2,
244-
parts: [{text: 'This is the answer'}],
245-
},
246-
]);
260+
}],
261+
},
262+
{
263+
role: 2,
264+
parts: [{text: 'This is the answer'}],
265+
},
266+
]);
267+
});
247268
});
248269
});
249270

@@ -267,6 +288,7 @@ test`,
267288
it('formats file content', async () => {
268289
const uiSourceCode = await createUISourceCode({
269290
content: 'lorem ipsum',
291+
requestContentData: true,
270292
});
271293
assert.strictEqual(formatFile(uiSourceCode), `File name: script.js
272294
URL: http://example.test/script.js
@@ -281,6 +303,7 @@ lorem ipsum
281303
resourceType: Common.ResourceType.resourceTypes.Image,
282304
mimeType: 'application/png',
283305
url: 'http://example.test/test.png' as Platform.DevToolsPath.UrlString,
306+
requestContentData: true,
284307
});
285308
assert.strictEqual(formatFile(uiSourceCode), `File name: test.png
286309
URL: http://example.test/test.png
@@ -293,6 +316,7 @@ File content:
293316
it('truncates long file content', async () => {
294317
const uiSourceCode = await createUISourceCode({
295318
content: 'lorem ipsum'.repeat(10_000),
319+
requestContentData: true,
296320
});
297321
assert.strictEqual(formatFile(uiSourceCode), `File name: script.js
298322
URL: http://example.test/script.js

front_end/panels/freestyler/DrJonesFileAgent.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ export class FileContext extends ConversationContext<Workspace.UISourceCode.UISo
9494
override getTitle(): string {
9595
return this.#file.displayName();
9696
}
97+
98+
override async refresh(): Promise<void> {
99+
await this.#file.requestContentData();
100+
}
97101
}
98102

99103
/**
@@ -171,7 +175,8 @@ ${formatFileContent(selectedFile)}`,
171175
}
172176

173177
function formatFileContent(selectedFile: Workspace.UISourceCode.UISourceCode): string {
174-
const content = selectedFile.contentType().isTextType() ? selectedFile.content() : '<binary data>';
178+
const contentData = selectedFile.workingCopyContentData();
179+
const content = contentData.isTextContent ? contentData.text : '<binary data>';
175180
const truncated = content.length > MAX_FILE_SIZE ? content.slice(0, MAX_FILE_SIZE) + '...' : content;
176181
return `\`\`\`
177182
${truncated}

0 commit comments

Comments
 (0)