Skip to content

Commit 5514f7f

Browse files
wolfibDevtools-frontend LUCI CQ
authored andcommitted
Move PromptBuilder from 'panels/explain' to 'panels/console'
A `ConsoleInsightTeaser.ts` will be added to the console panel. The teaser will depend on PromptBuilder which in turn imports the console panel. To prevent this dependency cycle, move PromptBuilder into the same module. Bypass-Check-License: only moving file Bug: 443618746 Change-Id: I5858f73887efff25902ee4a9a834f54bb3095b07 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7032001 Auto-Submit: Wolfgang Beyer <[email protected]> Reviewed-by: Alex Rudenko <[email protected]> Commit-Queue: Alex Rudenko <[email protected]>
1 parent 58eeec4 commit 5514f7f

File tree

14 files changed

+110
-96
lines changed

14 files changed

+110
-96
lines changed

config/gni/devtools_grd_files.gni

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,6 +1452,7 @@ grd_files_unbundled_sources = [
14521452
"front_end/panels/console/ConsoleViewMessage.js",
14531453
"front_end/panels/console/ConsoleViewport.js",
14541454
"front_end/panels/console/ErrorStackParser.js",
1455+
"front_end/panels/console/PromptBuilder.js",
14551456
"front_end/panels/console/consoleContextSelector.css.js",
14561457
"front_end/panels/console/consolePinPane.css.js",
14571458
"front_end/panels/console/consolePrompt.css.js",
@@ -1574,7 +1575,6 @@ grd_files_unbundled_sources = [
15741575
"front_end/panels/event_listeners/EventListenersView.js",
15751576
"front_end/panels/event_listeners/eventListenersView.css.js",
15761577
"front_end/panels/explain/ActionDelegate.js",
1577-
"front_end/panels/explain/PromptBuilder.js",
15781578
"front_end/panels/explain/components/ConsoleInsight.js",
15791579
"front_end/panels/explain/components/consoleInsight.css.js",
15801580
"front_end/panels/explain/components/consoleInsightSourcesList.css.js",

front_end/BUILD.gn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ group("unittests") {
179179
"panels/elements:unittests",
180180
"panels/emulation:unittests",
181181
"panels/event_listeners:unittests",
182-
"panels/explain:unittests",
182+
"panels/explain/components:unittests",
183183
"panels/issues:unittests",
184184
"panels/layer_viewer:unittests",
185185
"panels/layers:unittests",

front_end/models/ai_assistance/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ devtools_entrypoint("bundle") {
6666
":*",
6767
"../../entrypoints/main/*",
6868
"../../panels/ai_assistance/*",
69+
"../../panels/console/*",
6970
"../../panels/settings/*",
7071
"../../panels/timeline/*",
7172
"../ai_code_completion",

front_end/panels/console/BUILD.gn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ devtools_module("console") {
3131
"ConsoleViewMessage.ts",
3232
"ConsoleViewport.ts",
3333
"ErrorStackParser.ts",
34+
"PromptBuilder.ts",
3435
]
3536

3637
deps = [
@@ -41,6 +42,7 @@ devtools_module("console") {
4142
"../../core/platform:bundle",
4243
"../../core/root:bundle",
4344
"../../core/sdk:bundle",
45+
"../../models/ai_assistance:bundle",
4446
"../../models/ai_code_completion:bundle",
4547
"../../models/bindings:bundle",
4648
"../../models/issues_manager:bundle",
@@ -108,6 +110,7 @@ ts_library("unittests") {
108110
"ConsoleViewMessage.test.ts",
109111
"ConsoleViewport.test.ts",
110112
"ErrorStackParser.test.ts",
113+
"PromptBuilder.test.ts",
111114
]
112115

113116
deps = [

front_end/panels/explain/PromptBuilder.test.ts renamed to front_end/panels/console/PromptBuilder.test.ts

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,30 @@ import {createTarget, describeWithLocale} from '../../testing/EnvironmentHelpers
1717
import {describeWithMockConnection} from '../../testing/MockConnection.js';
1818
import {MockProtocolBackend} from '../../testing/MockScopeChain.js';
1919

20-
import * as Explain from './explain.js';
20+
import * as Console from './console.js';
2121

2222
const {urlString} = Platform.DevToolsPath;
2323

2424
describeWithLocale('PromptBuilder', () => {
2525
describe('allowHeader', () => {
2626
it('disallows cookie headers', () => {
27-
assert.isNotOk(Explain.allowHeader({name: 'Cookie', value: ''}));
28-
assert.isNotOk(Explain.allowHeader({name: 'cookiE', value: ''}));
29-
assert.isNotOk(Explain.allowHeader({name: 'cookie', value: ''}));
30-
assert.isNotOk(Explain.allowHeader({name: 'set-cookie', value: ''}));
31-
assert.isNotOk(Explain.allowHeader({name: 'Set-cOokie', value: ''}));
27+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'Cookie', value: ''}));
28+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'cookiE', value: ''}));
29+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'cookie', value: ''}));
30+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'set-cookie', value: ''}));
31+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'Set-cOokie', value: ''}));
3232
});
3333

3434
it('disallows authorization headers', () => {
35-
assert.isNotOk(Explain.allowHeader({name: 'AuthoRization', value: ''}));
36-
assert.isNotOk(Explain.allowHeader({name: 'authorization', value: ''}));
35+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'AuthoRization', value: ''}));
36+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'authorization', value: ''}));
3737
});
3838

3939
it('disallows custom headers', () => {
40-
assert.isNotOk(Explain.allowHeader({name: 'X-smth', value: ''}));
41-
assert.isNotOk(Explain.allowHeader({name: 'X-', value: ''}));
42-
assert.isNotOk(Explain.allowHeader({name: 'x-smth', value: ''}));
43-
assert.isNotOk(Explain.allowHeader({name: 'x-', value: ''}));
40+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'X-smth', value: ''}));
41+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'X-', value: ''}));
42+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'x-smth', value: ''}));
43+
assert.isNotOk(Console.PromptBuilder.allowHeader({name: 'x-', value: ''}));
4444
});
4545
});
4646

@@ -64,7 +64,7 @@ describeWithLocale('PromptBuilder', () => {
6464

6565
describe('format formatNetworkRequest', () => {
6666
it('formats a network request', () => {
67-
assert.strictEqual(Explain.formatNetworkRequest(NETWORK_REQUEST), `Request: https://example.com
67+
assert.strictEqual(Console.PromptBuilder.formatNetworkRequest(NETWORK_REQUEST), `Request: https://example.com
6868
6969
Request headers:
7070
Origin: https://example.com
@@ -79,7 +79,7 @@ Response status: 404 Not found`);
7979
describe('formatRelatedCode', () => {
8080
it('formats a single line code', () => {
8181
assert.strictEqual(
82-
Explain.formatRelatedCode(
82+
Console.PromptBuilder.formatRelatedCode(
8383
{
8484
text: '12345678901234567890',
8585
columnNumber: 10,
@@ -88,7 +88,7 @@ Response status: 404 Not found`);
8888
/* maxLength=*/ 5),
8989
'89012');
9090
assert.strictEqual(
91-
Explain.formatRelatedCode(
91+
Console.PromptBuilder.formatRelatedCode(
9292
{
9393
text: '12345678901234567890',
9494
columnNumber: 10,
@@ -97,7 +97,7 @@ Response status: 404 Not found`);
9797
/* maxLength=*/ 6),
9898
'890123');
9999
assert.strictEqual(
100-
Explain.formatRelatedCode(
100+
Console.PromptBuilder.formatRelatedCode(
101101
{
102102
text: '12345678901234567890',
103103
columnNumber: 10,
@@ -109,7 +109,7 @@ Response status: 404 Not found`);
109109

110110
it('formats a multiline code', () => {
111111
assert.strictEqual(
112-
Explain.formatRelatedCode(
112+
Console.PromptBuilder.formatRelatedCode(
113113
{
114114
text: '123\n456\n789\n123\n456\n789\n',
115115
columnNumber: 1,
@@ -118,7 +118,7 @@ Response status: 404 Not found`);
118118
/* maxLength=*/ 5),
119119
'456');
120120
assert.strictEqual(
121-
Explain.formatRelatedCode(
121+
Console.PromptBuilder.formatRelatedCode(
122122
{
123123
text: '123\n456\n789\n123\n456\n789\n',
124124
columnNumber: 1,
@@ -127,7 +127,7 @@ Response status: 404 Not found`);
127127
/* maxLength=*/ 10),
128128
'456\n789\n123');
129129
assert.strictEqual(
130-
Explain.formatRelatedCode(
130+
Console.PromptBuilder.formatRelatedCode(
131131
{
132132
text: '123\n456\n789\n123\n456\n789\n',
133133
columnNumber: 1,
@@ -172,38 +172,38 @@ function bigger() {
172172
export const y = "";
173173
`;
174174
assert.strictEqual(
175-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 233),
175+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 233),
176176
' // x\n if (true) {\n // y\n\n // zzzzzz\n }\n\n let y = x + 2;\n\n if (false) {\n // a\n\n f1();\n if (x == x) {\n // z\n }\n }',
177177
);
178178
assert.strictEqual(
179-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 232),
179+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 232),
180180
' // x\n if (true) {\n // y\n\n // zzzzzz\n }\n\n let y = x + 2;',
181181
);
182182
assert.strictEqual(
183-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 600),
183+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 600),
184184
text.trim(),
185185
);
186186
assert.strictEqual(
187-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 50),
187+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 50),
188188
' // x\n if (true) {\n // y\n\n // zzzzzz\n }',
189189
);
190190
assert.strictEqual(
191-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 40),
191+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 11}, /* maxLength=*/ 40),
192192
' // x',
193193
);
194194
assert.strictEqual(
195-
Explain.formatRelatedCode({text, columnNumber: 4, lineNumber: 18}, /* maxLength=*/ 50),
195+
Console.PromptBuilder.formatRelatedCode({text, columnNumber: 4, lineNumber: 18}, /* maxLength=*/ 50),
196196
' let y = x + 2;',
197197
);
198198
});
199199
});
200200

201201
it('Extracts expected whitespace from beginnings of lines', () => {
202-
assert.strictEqual(Explain.lineWhitespace(' a'), ' ');
203-
assert.strictEqual(Explain.lineWhitespace('a'), '');
204-
assert.isNull(Explain.lineWhitespace(' '));
205-
assert.isNull(Explain.lineWhitespace(''));
206-
assert.strictEqual(Explain.lineWhitespace('\t\ta'), '\t\t');
202+
assert.strictEqual(Console.PromptBuilder.lineWhitespace(' a'), ' ');
203+
assert.strictEqual(Console.PromptBuilder.lineWhitespace('a'), '');
204+
assert.isNull(Console.PromptBuilder.lineWhitespace(' '));
205+
assert.isNull(Console.PromptBuilder.lineWhitespace(''));
206+
assert.strictEqual(Console.PromptBuilder.lineWhitespace('\t\ta'), '\t\t');
207207
});
208208

209209
describeWithMockConnection('buildPrompt', () => {
@@ -239,7 +239,7 @@ export const y = "";
239239
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
240240
messageDetails);
241241
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
242-
const promptBuilder = new Explain.PromptBuilder(message);
242+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
243243
const {prompt, sources} = await promptBuilder.buildPrompt();
244244
assert.strictEqual(prompt, [
245245
PROMPT_PREFIX,
@@ -276,7 +276,7 @@ export const y = "";
276276
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
277277
messageDetails);
278278
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
279-
const promptBuilder = new Explain.PromptBuilder(message);
279+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
280280
const {prompt, sources} = await promptBuilder.buildPrompt();
281281
assert.strictEqual(prompt, [
282282
PROMPT_PREFIX,
@@ -321,7 +321,7 @@ export const y = "";
321321
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, Protocol.Log.LogEntryLevel.Error,
322322
ERROR_MESSAGE, messageDetails);
323323
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
324-
const promptBuilder = new Explain.PromptBuilder(message);
324+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
325325
const {prompt, sources} = await promptBuilder.buildPrompt();
326326
assert.strictEqual(prompt, [
327327
PROMPT_PREFIX,
@@ -388,7 +388,7 @@ export const y = "";
388388
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
389389
messageDetails);
390390
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
391-
const promptBuilder = new Explain.PromptBuilder(message);
391+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
392392
const {prompt, sources} = await promptBuilder.buildPrompt();
393393
assert.strictEqual(prompt, [
394394
PROMPT_PREFIX,
@@ -418,7 +418,7 @@ export const y = "";
418418
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
419419
messageDetails);
420420
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
421-
const promptBuilder = new Explain.PromptBuilder(message);
421+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
422422
const {prompt, sources} = await promptBuilder.buildPrompt();
423423
assert.strictEqual(prompt, [
424424
PROMPT_PREFIX,
@@ -453,7 +453,7 @@ export const y = "";
453453
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, Protocol.Log.LogEntryLevel.Error,
454454
ERROR_MESSAGE, messageDetails);
455455
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
456-
const promptBuilder = new Explain.PromptBuilder(message);
456+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
457457
const {prompt, sources} = await promptBuilder.buildPrompt();
458458
assert.strictEqual(prompt, [
459459
PROMPT_PREFIX,
@@ -504,7 +504,7 @@ export const y = "";
504504
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
505505
messageDetails);
506506
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
507-
const promptBuilder = new Explain.PromptBuilder(message);
507+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
508508
const {prompt, sources, isPageReloadRecommended} = await promptBuilder.buildPrompt();
509509
assert.strictEqual(prompt, [
510510
PROMPT_PREFIX,
@@ -539,10 +539,10 @@ export const y = "";
539539
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, /* level */ null, ERROR_MESSAGE,
540540
messageDetails);
541541
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
542-
const promptBuilder = new Explain.PromptBuilder(message);
542+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
543543
const {sources, isPageReloadRecommended} = await promptBuilder.buildPrompt();
544544
assert.isTrue(isPageReloadRecommended, 'PromptBuilder did not recommend reloading the page');
545-
assert.isNotTrue(sources.some(source => source.type === Explain.SourceType.NETWORK_REQUEST));
545+
assert.isNotTrue(sources.some(source => source.type === Console.PromptBuilder.SourceType.NETWORK_REQUEST));
546546
});
547547

548548
});
@@ -564,7 +564,7 @@ export const y = "";
564564
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, Protocol.Log.LogEntryLevel.Error,
565565
ERROR_MESSAGE, messageDetails);
566566
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
567-
const promptBuilder = new Explain.PromptBuilder(message);
567+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
568568
const query = await promptBuilder.getSearchQuery();
569569
assert.strictEqual(query, 'kaboom!');
570570
});
@@ -579,7 +579,7 @@ export const y = "";
579579
runtimeModel, Common.Console.FrontendMessageSource.ConsoleAPI, Protocol.Log.LogEntryLevel.Error,
580580
ERROR_MESSAGE, messageDetails);
581581
const {message} = createConsoleViewMessageWithStubDeps(rawMessage);
582-
const promptBuilder = new Explain.PromptBuilder(message);
582+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(message);
583583
const query = await promptBuilder.getSearchQuery();
584584
assert.strictEqual(query, 'Got an error: Error: fail');
585585
});

front_end/panels/explain/PromptBuilder.ts renamed to front_end/panels/console/PromptBuilder.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import * as Formatter from '../../models/formatter/formatter.js';
99
import * as Logs from '../../models/logs/logs.js';
1010
import * as TextUtils from '../../models/text_utils/text_utils.js';
1111
import * as Components from '../../ui/legacy/components/utils/utils.js';
12-
import type * as Console from '../console/console.js';
12+
13+
import type {ConsoleViewMessage} from './ConsoleViewMessage.js';
1314

1415
const MAX_MESSAGE_SIZE = 1000;
1516
const MAX_STACK_TRACE_SIZE = 1000;
@@ -28,9 +29,9 @@ export interface Source {
2829
}
2930

3031
export class PromptBuilder {
31-
#consoleMessage: Console.ConsoleViewMessage.ConsoleViewMessage;
32+
#consoleMessage: ConsoleViewMessage;
3233

33-
constructor(consoleMessage: Console.ConsoleViewMessage.ConsoleViewMessage) {
34+
constructor(consoleMessage: ConsoleViewMessage) {
3435
this.#consoleMessage = consoleMessage;
3536
}
3637

@@ -277,15 +278,15 @@ ${AiAssistanceModel.NetworkRequestFormatter.formatHeaders('Response headers:', r
277278
Response status: ${request.statusCode} ${request.statusText}`;
278279
}
279280

280-
export function formatConsoleMessage(message: Console.ConsoleViewMessage.ConsoleViewMessage): string {
281+
export function formatConsoleMessage(message: ConsoleViewMessage): string {
281282
return message.toMessageTextString().substr(0, MAX_MESSAGE_SIZE);
282283
}
283284

284285
/**
285286
* This formats the stacktrace from the console message which might or might not
286287
* match the content of stacktrace(s) in the console message arguments.
287288
*/
288-
export function formatStackTrace(message: Console.ConsoleViewMessage.ConsoleViewMessage): string {
289+
export function formatStackTrace(message: ConsoleViewMessage): string {
289290
const previewContainer = message.contentElement().querySelector('.stack-preview-container');
290291

291292
if (!previewContainer) {

front_end/panels/console/console.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import './ConsoleViewMessage.js';
1212
import './ConsolePrompt.js';
1313
import './ConsoleView.js';
1414
import './ConsolePanel.js';
15+
import './PromptBuilder.js';
1516

1617
import * as ConsoleContextSelector from './ConsoleContextSelector.js';
1718
import * as ConsoleFilter from './ConsoleFilter.js';
@@ -24,6 +25,7 @@ import * as ConsoleView from './ConsoleView.js';
2425
import * as ConsoleViewMessage from './ConsoleViewMessage.js';
2526
import * as ConsoleViewport from './ConsoleViewport.js';
2627
import * as ErrorStackParser from './ErrorStackParser.js';
28+
import * as PromptBuilder from './PromptBuilder.js';
2729

2830
export {
2931
ConsoleContextSelector,
@@ -37,4 +39,5 @@ export {
3739
ConsoleViewMessage,
3840
ConsoleViewport,
3941
ErrorStackParser,
42+
PromptBuilder,
4043
};

front_end/panels/explain/ActionDelegate.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type * as UI from '../../ui/legacy/legacy.js';
77
import * as Console from '../console/console.js';
88

99
import {ConsoleInsight} from './components/ConsoleInsight.js';
10-
import {PromptBuilder} from './PromptBuilder.js';
1110

1211
export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
1312
handleAction(context: UI.Context.Context, actionId: string): boolean {
@@ -24,7 +23,7 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
2423
} else if (actionId === 'explain.console-message.hover') {
2524
Host.userMetrics.actionTaken(Host.UserMetrics.Action.InsightRequestedViaHoverButton);
2625
}
27-
const promptBuilder = new PromptBuilder(consoleViewMessage);
26+
const promptBuilder = new Console.PromptBuilder.PromptBuilder(consoleViewMessage);
2827
const aidaClient = new Host.AidaClient.AidaClient();
2928
void ConsoleInsight.create(promptBuilder, aidaClient).then(insight => {
3029
consoleViewMessage.setInsight(insight);

0 commit comments

Comments
 (0)