12
12
label ="Score "
13
13
size ="large "
14
14
[total] ="overview.totalPoints "
15
- [max] ="overview.maxOverallPoints " />
15
+ [max] ="overview.maxOverallPoints "
16
+ />
16
17
</ div >
17
18
< div >
18
19
< h2 > {{ overview.displayName }}</ h2 >
@@ -31,31 +32,29 @@ <h2>{{ overview.displayName }}</h2>
31
32
< div class ="summary-grid ">
32
33
< div >
33
34
< h3 > Model</ h3 >
34
- < provider-label
35
- [id] ="overview.model "
36
- [label] ="overview.model "/>
35
+ < provider-label [id] ="overview.model " [label] ="overview.model " />
37
36
</ div >
38
37
@if (fw) {
39
38
< div >
40
39
< h3 > Framework</ h3 >
41
40
< div class ="framework-info ">
42
41
< provider-label
43
42
[id] ="fw.fullStackFramework.id "
44
- [label] ="fw.fullStackFramework.displayName "/>
43
+ [label] ="fw.fullStackFramework.displayName "
44
+ />
45
45
@if (fw.clientSideFramework.id !== fw.fullStackFramework.id) {
46
46
< provider-label
47
47
[id] ="fw.clientSideFramework.id "
48
- [label] ="fw.clientSideFramework.displayName "/>
48
+ [label] ="fw.clientSideFramework.displayName "
49
+ />
49
50
}
50
51
</ div >
51
52
</ div >
52
53
}
53
54
@if (runner) {
54
55
< div >
55
56
< h3 > Runner</ h3 >
56
- < provider-label
57
- [id] ="runner.id "
58
- [label] ="runner.displayName "/>
57
+ < provider-label [id] ="runner.id " [label] ="runner.displayName " />
59
58
</ div >
60
59
}
61
60
</ div >
@@ -113,7 +112,9 @@ <h3 class="chart-title">
113
112
</ h3 >
114
113
< div class ="summary-card-item ">
115
114
< stacked-bar-chart
116
- [data] ="accessibilityStatsAsGraphData(overview.stats.accessibility)! "
115
+ [data] ="
116
+ accessibilityStatsAsGraphData(overview.stats.accessibility)!
117
+ "
117
118
[compact] ="true "
118
119
/>
119
120
</ div >
@@ -124,21 +125,27 @@ <h3 class="chart-title">
124
125
@if (details) {
125
126
< h3 > Usage Details</ h3 >
126
127
< ul class ="status-badge-group ">
127
- < li class ="status-badge neutral "> Input tokens: {{ details.summary.usage.inputTokens | number }}</ li >
128
- < li class ="status-badge neutral "> Output tokens: {{ details.summary.usage.outputTokens | number }}</ li >
128
+ < li class ="status-badge neutral ">
129
+ Input tokens: {{ details.summary.usage.inputTokens | number }}
130
+ </ li >
131
+ < li class ="status-badge neutral ">
132
+ Output tokens: {{ details.summary.usage.outputTokens | number }}
133
+ </ li >
129
134
130
135
@if (details.summary.usage.totalTokens != null) {
131
- < li class ="status-badge neutral "> Total tokens: {{ details.summary.usage.totalTokens | number }}</ li >
136
+ < li class ="status-badge neutral ">
137
+ Total tokens: {{ details.summary.usage.totalTokens | number }}
138
+ </ li >
132
139
}
133
140
</ ul >
134
141
}
135
142
</ div >
136
143
</ section >
137
144
138
145
@if (isLoading()) {
139
- < message-spinner message ="Loading full report "/>
146
+ < message-spinner message ="Loading full report " />
140
147
} @else if (error()) {
141
- < pre class ="callout error code "> {{error()?.stack}}</ pre >
148
+ < pre class ="callout error code "> {{ error()?.stack }}</ pre >
142
149
} @else if (report) {
143
150
@let details = report.details;
144
151
@@ -151,12 +158,18 @@ <h3>Usage Details</h3>
151
158
@if (details.systemInstructionsPrompt || details.bestPracticesPrompt) {
152
159
<!-- Legacy code path for older reports. -->
153
160
< h4 > System Prompt</ h4 >
154
- < pre class ="callout neutral code "> {{ details.systemInstructionsPrompt }}</ pre >
161
+ < pre class ="callout neutral code "> {{
162
+ details.systemInstructionsPrompt
163
+ }}</ pre >
155
164
< h4 > Best Practices Prompt</ h4 >
156
- < pre class ="callout neutral code "> {{ details.bestPracticesPrompt }}</ pre >
165
+ < pre class ="callout neutral code "> {{
166
+ details.bestPracticesPrompt
167
+ }}</ pre >
157
168
} @else {
158
169
< h4 > Generation System Prompt</ h4 >
159
- < pre class ="callout neutral code "> {{ details.systemPromptGeneration }}</ pre >
170
+ < pre class ="callout neutral code "> {{
171
+ details.systemPromptGeneration
172
+ }}</ pre >
160
173
< h4 > Repair System Prompt</ h4 >
161
174
< pre class ="callout neutral code "> {{ details.systemPromptRepair }}</ pre >
162
175
}
@@ -219,7 +232,9 @@ <h4>Logs</h4>
219
232
< h2 > Generated applications</ h2 >
220
233
@if (allFailedChecks().length > 0) {
221
234
< details class ="filter-dropdown " #dropdown >
222
- < summary > Filter by failed checks ({{ selectedChecks().size }} selected)</ summary >
235
+ < summary >
236
+ Filter by failed checks ({{ selectedChecks().size }} selected)
237
+ </ summary >
223
238
< div class ="dropdown-content ">
224
239
< failed-checks-filter
225
240
[allFailedChecks] ="allFailedChecks() "
@@ -236,14 +251,17 @@ <h2>Generated applications</h2>
236
251
< score
237
252
size ="small "
238
253
[total] ="result.score.totalPoints "
239
- [max] ="result.score.maxOverallPoints " />
254
+ [max] ="result.score.maxOverallPoints "
255
+ />
240
256
< div class ="app-header ">
241
257
{{ result.promptDef.name }}
242
258
243
259
< div class ="status-badge-group ">
244
260
@let initialBuild = result.attemptDetails[0].buildResult;
245
261
@let repairBuild =
246
- result.attemptDetails.length > 1 ? result.attemptDetails[1].buildResult : null;
262
+ result.attemptDetails.length > 1
263
+ ? result.attemptDetails[1].buildResult
264
+ : null;
247
265
@let finalBuild = repairBuild ?? initialBuild;
248
266
249
267
@if (finalBuild.runtimeErrors) {
@@ -259,7 +277,6 @@ <h2>Generated applications</h2>
259
277
}
260
278
</ div >
261
279
</ div >
262
-
263
280
</ expansion-panel-header >
264
281
265
282
@if (appPanel.opened()) {
@@ -273,7 +290,9 @@ <h4>Prompt</h4>
273
290
< h4 > Results</ h4 >
274
291
@for (category of result.score.categories; track category.id) {
275
292
< h5 >
276
- {{ category.name }} ({{ category.points }}/{{ category.maxPoints }}
293
+ {{ category.name }} ({{ category.points }}/{{
294
+ category.maxPoints
295
+ }}
277
296
points)
278
297
</ h5 >
279
298
@@ -283,16 +302,24 @@ <h5>
283
302
@if (isSkippedAssessment(check)) {
284
303
< span class ="status "> ➖</ span >
285
304
< span class ="name "> {{ check.name }}</ span >
286
- < span class ="status-text points "> Skipped: {{ check.message }}</ span >
305
+ < span class ="status-text points "
306
+ > Skipped: {{ check.message }}</ span
307
+ >
287
308
} @else {
288
309
@let isMax = check.successPercentage === 1;
289
- < span class ="status status-text " [class.success] ="isMax " [class.error] ="!isMax "> {{
290
- isMax ? '✔' : '✘'
291
- }}</ span >
310
+ < span
311
+ class ="status status-text "
312
+ [class.success] ="isMax "
313
+ [class.error] ="!isMax "
314
+ > {{ isMax ? '✔' : '✘' }}</ span
315
+ >
292
316
< span class ="name "> {{ check.name }}</ span >
293
- < span class ="status-text points " [class.success] ="isMax " [class.error] ="!isMax "> {{
294
- check.message
295
- }}</ span >
317
+ < span
318
+ class ="status-text points "
319
+ [class.success] ="isMax "
320
+ [class.error] ="!isMax "
321
+ > {{ check.message }}</ span
322
+ >
296
323
}
297
324
</ div >
298
325
} @empty {
@@ -302,15 +329,21 @@ <h5>
302
329
}
303
330
<!-- Total score section -->
304
331
< div class ="check-details total ">
305
- @let totalPercent = formatScore(result.score.totalPoints, result.score.maxOverallPoints);
332
+ @let totalPercent =
333
+ formatScore(
334
+ result.score.totalPoints,
335
+ result.score.maxOverallPoints
336
+ );
306
337
< span class ="status "> </ span >
307
338
< span class ="name "> Total: </ span >
308
339
< span
309
340
class ="status-text points "
310
341
[class.success] ="totalPercent >= 90 "
311
342
[class.warn] ="totalPercent < 90 && totalPercent >= 80 "
312
- [class.error] ="totalPercent < 80 ">
313
- {{ result.score.totalPoints }} / {{ result.score.maxOverallPoints }} points ({{
343
+ [class.error] ="totalPercent < 80 "
344
+ >
345
+ {{ result.score.totalPoints }} /
346
+ {{ result.score.maxOverallPoints }} points ({{
314
347
totalPercent
315
348
}})
316
349
</ span >
@@ -322,33 +355,46 @@ <h4>Additional info</h4>
322
355
@for (attempt of result.attemptDetails; track attempt) {
323
356
@let isBuilt = attempt.buildResult.status === 'success';
324
357
@let axeViolations = attempt.buildResult.axeViolations;
325
- @let hasAxeViolations = axeViolations && axeViolations.length > 0;
358
+ @let hasAxeViolations =
359
+ axeViolations && axeViolations.length > 0;
326
360
327
361
< expansion-panel #expansionPanel >
328
362
< expansion-panel-header >
329
- {{ $index === 0 ? 'Initial response' : `Repair attempt #${$index}` }}
363
+ {{
364
+ $index === 0
365
+ ? 'Initial response'
366
+ : `Repair attempt #${$index}`
367
+ }}
330
368
@if (!isBuilt) {
331
- < span
332
- class =" status-badge "
333
- [class.error] =" !isBuilt " > Build </ span >
369
+ < span class =" status-badge " [class.error] =" !isBuilt "
370
+ > Build </ span
371
+ >
334
372
}
335
373
@if (hasAxeViolations) {
336
- < span
337
- class ="status-badge "
338
- [class.error] ="hasAxeViolations "> A11y</ span >
374
+ < span
375
+ class ="status-badge "
376
+ [class.error] ="hasAxeViolations "
377
+ > A11y</ span
378
+ >
339
379
}
340
380
</ expansion-panel-header >
341
381
342
382
@if (expansionPanel.opened()) {
343
383
@if (attempt.reasoning) {
344
384
< details class ="thoughts-button ">
345
- < summary class ="neutral-button "> See LLM Thoughts</ summary >
346
- < pre class ="callout neutral code "> {{ attempt.reasoning }}</ pre >
385
+ < summary class ="neutral-button ">
386
+ See LLM Thoughts
387
+ </ summary >
388
+ < pre class ="callout neutral code "> {{
389
+ attempt.reasoning
390
+ }}</ pre >
347
391
</ details >
348
392
}
349
393
@if (!isBuilt) {
350
394
< h4 > Build Message</ h4 >
351
- < pre class ="callout warn code "> {{ attempt.buildResult.message }}</ pre >
395
+ < pre class ="callout warn code "> {{
396
+ attempt.buildResult.message
397
+ }}</ pre >
352
398
}
353
399
354
400
@if (hasAxeViolations) {
@@ -381,17 +427,26 @@ <h4>Generated Code</h4>
381
427
Format source code
382
428
</ button >
383
429
</ div >
384
- < app-code-viewer [code] ="formatted().get(file) ?? file.code " />
430
+ < app-code-viewer
431
+ [code] ="formatted().get(file) ?? file.code "
432
+ />
385
433
}
386
434
}
387
435
</ expansion-panel >
388
436
}
389
437
390
- @if (result.userJourneys && result.userJourneys.result.length > 0) {
438
+ @if (
439
+ result.userJourneys && result.userJourneys.result.length > 0
440
+ ) {
391
441
< expansion-panel >
392
- < expansion-panel-header > User Journeys</ expansion-panel-header >
393
- @for (journey of result.userJourneys.result; track journey.name) {
394
- < h4 > {{journey.name}}</ h4 >
442
+ < expansion-panel-header
443
+ > User Journeys</ expansion-panel-header
444
+ >
445
+ @for (
446
+ journey of result.userJourneys.result;
447
+ track journey.name
448
+ ) {
449
+ < h4 > {{ journey.name }}</ h4 >
395
450
396
451
< ol >
397
452
@for (step of journey.steps; track $index) {
@@ -408,32 +463,39 @@ <h4>Debugging Tools</h4>
408
463
< button
409
464
class ="neutral-button "
410
465
title ="Download a ZIP for debugging. You can upload the ZIP to AI Studio for further analysis of a specific app. "
411
- (click) ="downloadDebuggingZip(result) ">
466
+ (click) ="downloadDebuggingZip(result) "
467
+ >
412
468
Download ZIP for debugging
413
469
</ button >
414
470
@if (result.toolLogs && result.toolLogs.length > 0) {
415
471
< expansion-panel >
416
472
< expansion-panel-header > Tool Logs</ expansion-panel-header >
417
473
< ul class ="tool-logs-list ">
418
- @for (log of result.toolLogs; track $index) {
419
- < li >
420
- < details class ="details mcp-log-entry ">
421
- @let name = log.request.name;
422
- < summary >
423
- Log Entry #{{ $index + 1
424
- }}{{ name ? ' - ' + name : '' }}
425
- </ summary >
426
- < div class ="mcp-log-content ">
427
- < h5 > Request</ h5 >
428
- < ngx-json-viewer [json] ="log.request " [expanded] ="false "> </ ngx-json-viewer >
429
- < h5 > Response</ h5 >
430
- < ngx-json-viewer [json] ="log.response " [expanded] ="false "> </ ngx-json-viewer >
431
- </ div >
432
- </ details >
433
- </ li >
434
- } @empty {
435
- < li > No MCP logs were recorded for this run.</ li >
436
- }
474
+ @for (log of result.toolLogs; track $index) {
475
+ < li >
476
+ < details class ="details mcp-log-entry ">
477
+ @let name = log.request.name;
478
+ < summary >
479
+ Log Entry #{{ $index + 1
480
+ }}{{ name ? ' - ' + name : '' }}
481
+ </ summary >
482
+ < div class ="mcp-log-content ">
483
+ < h5 > Request</ h5 >
484
+ < ngx-json-viewer
485
+ [json] ="log.request "
486
+ [expanded] ="false "
487
+ > </ ngx-json-viewer >
488
+ < h5 > Response</ h5 >
489
+ < ngx-json-viewer
490
+ [json] ="log.response "
491
+ [expanded] ="false "
492
+ > </ ngx-json-viewer >
493
+ </ div >
494
+ </ details >
495
+ </ li >
496
+ } @empty {
497
+ < li > No MCP logs were recorded for this run.</ li >
498
+ }
437
499
</ ul >
438
500
</ expansion-panel >
439
501
}
@@ -442,7 +504,9 @@ <h5>Response</h5>
442
504
@if (finalBuild.runtimeErrors) {
443
505
< div class ="app-details-section ">
444
506
< h4 > Runtime errors</ h4 >
445
- < pre class ="callout warn code "> {{ finalBuild.runtimeErrors }}</ pre >
507
+ < pre class ="callout warn code "> {{
508
+ finalBuild.runtimeErrors
509
+ }}</ pre >
446
510
</ div >
447
511
}
448
512
@@ -451,7 +515,7 @@ <h4>Runtime errors</h4>
451
515
@if (screenshot) {
452
516
< div class ="app-details-section ">
453
517
< h4 > Screenshot</ h4 >
454
- < img class ="screenshot " [src] ="screenshot "/>
518
+ < img class ="screenshot " [src] ="screenshot " />
455
519
</ div >
456
520
}
457
521
</ div >
0 commit comments