@memberjunction/ng-core-entity-forms 2.78.0 → 2.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +6 -2
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +542 -141
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +19 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +69 -17
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +28 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +81 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +11 -3
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +76 -31
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +7 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +84 -18
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +5 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +205 -60
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js +6 -6
- package/dist/lib/generated/Entities/AIAgentRun/aiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js +82 -4
- package/dist/lib/generated/Entities/AIAgentRun/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js +19 -9
- package/dist/lib/generated/Entities/AIConfiguration/aiconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js +13 -3
- package/dist/lib/generated/Entities/AIModel/aimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIPrompt/aiprompt.form.component.js +6 -6
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js +60 -4
- package/dist/lib/generated/Entities/AIPromptRun/sections/details.component.js.map +1 -1
- package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js +13 -3
- package/dist/lib/generated/Entities/AIVendor/aivendor.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/User/user.form.component.js +6 -6
- package/dist/lib/generated/Entities/User/user.form.component.js.map +1 -1
- package/package.json +16 -16
|
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Component } from '@angular/core';
|
|
7
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
8
8
|
import { RegisterClass } from '@memberjunction/global';
|
|
9
9
|
import { BaseFormComponent } from '@memberjunction/ng-base-forms';
|
|
10
10
|
import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
|
|
@@ -314,16 +314,62 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Condition
|
|
|
314
314
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedResult);
|
|
315
315
|
i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
|
|
316
316
|
} }
|
|
317
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
318
|
+
i0.ɵɵelementStart(0, "p", 78)(1, "strong");
|
|
319
|
+
i0.ɵɵtext(2, "Status:");
|
|
320
|
+
i0.ɵɵelementEnd();
|
|
321
|
+
i0.ɵɵtext(3);
|
|
322
|
+
i0.ɵɵelementEnd();
|
|
323
|
+
} if (rf & 2) {
|
|
324
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
325
|
+
i0.ɵɵadvance(3);
|
|
326
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status, " ");
|
|
327
|
+
} }
|
|
328
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
329
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "h4");
|
|
330
|
+
i0.ɵɵtext(2, "Error Details");
|
|
331
|
+
i0.ɵɵelementEnd();
|
|
332
|
+
i0.ɵɵelement(3, "mj-code-editor", 81);
|
|
333
|
+
i0.ɵɵelementEnd();
|
|
334
|
+
} if (rf & 2) {
|
|
335
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
336
|
+
i0.ɵɵadvance(3);
|
|
337
|
+
i0.ɵɵproperty("ngModel", ctx_r1.formattedErrorDetails)("disabled", true)("language", "json")("lineWrapping", true);
|
|
338
|
+
} }
|
|
339
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
340
|
+
i0.ɵɵelementStart(0, "p", 80);
|
|
341
|
+
i0.ɵɵtext(1, " The prompt execution failed but no additional error information is available. ");
|
|
342
|
+
i0.ɵɵelementEnd();
|
|
343
|
+
} }
|
|
344
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
+
i0.ɵɵelementStart(0, "div", 77);
|
|
346
|
+
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_1_Template, 4, 1, "p", 78)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_2_Template, 4, 4, "div", 79)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Conditional_3_Template, 2, 0, "p", 80);
|
|
347
|
+
i0.ɵɵelementEnd();
|
|
348
|
+
} if (rf & 2) {
|
|
349
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
350
|
+
i0.ɵɵadvance();
|
|
351
|
+
i0.ɵɵconditional(ctx_r1.record.Status ? 1 : -1);
|
|
352
|
+
i0.ɵɵadvance();
|
|
353
|
+
i0.ɵɵconditional(ctx_r1.formattedErrorDetails ? 2 : -1);
|
|
354
|
+
i0.ɵɵadvance();
|
|
355
|
+
i0.ɵɵconditional(!ctx_r1.formattedErrorDetails ? 3 : -1);
|
|
356
|
+
} }
|
|
317
357
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
318
358
|
i0.ɵɵelementStart(0, "div", 51);
|
|
319
359
|
i0.ɵɵelement(1, "i", 76);
|
|
320
360
|
i0.ɵɵelementStart(2, "p");
|
|
321
361
|
i0.ɵɵtext(3, "No result data recorded");
|
|
322
|
-
i0.ɵɵelementEnd()
|
|
362
|
+
i0.ɵɵelementEnd();
|
|
363
|
+
i0.ɵɵtemplate(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Conditional_4_Template, 4, 3, "div", 77);
|
|
364
|
+
i0.ɵɵelementEnd();
|
|
365
|
+
} if (rf & 2) {
|
|
366
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
367
|
+
i0.ɵɵadvance(4);
|
|
368
|
+
i0.ɵɵconditional(ctx_r1.record.Status === "Failed" || ctx_r1.record.Success === false ? 4 : -1);
|
|
323
369
|
} }
|
|
324
370
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template(rf, ctx) { if (rf & 1) {
|
|
325
371
|
i0.ɵɵelementStart(0, "div", 49);
|
|
326
|
-
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template, 7, 1, "div", 72)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template, 6, 4, "div", 57)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template,
|
|
372
|
+
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_1_Template, 7, 1, "div", 72)(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_2_Template, 6, 4, "div", 57)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Conditional_3_Template, 5, 1, "div", 51);
|
|
327
373
|
i0.ɵɵelementEnd();
|
|
328
374
|
} if (rf & 2) {
|
|
329
375
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -334,12 +380,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template(
|
|
|
334
380
|
} }
|
|
335
381
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template(rf, ctx) { if (rf & 1) {
|
|
336
382
|
i0.ɵɵelementStart(0, "span", 47);
|
|
337
|
-
i0.ɵɵelement(1, "i",
|
|
383
|
+
i0.ɵɵelement(1, "i", 82);
|
|
338
384
|
i0.ɵɵtext(2, " Token Usage & Metrics ");
|
|
339
385
|
i0.ɵɵelementEnd();
|
|
340
386
|
} }
|
|
341
387
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
-
i0.ɵɵelementStart(0, "div",
|
|
388
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span");
|
|
343
389
|
i0.ɵɵtext(2);
|
|
344
390
|
i0.ɵɵelementEnd()();
|
|
345
391
|
} if (rf & 2) {
|
|
@@ -348,7 +394,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
348
394
|
i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensPromptRollup), "");
|
|
349
395
|
} }
|
|
350
396
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
351
|
-
i0.ɵɵelementStart(0, "div",
|
|
397
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span");
|
|
352
398
|
i0.ɵɵtext(2);
|
|
353
399
|
i0.ɵɵelementEnd()();
|
|
354
400
|
} if (rf & 2) {
|
|
@@ -357,7 +403,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
357
403
|
i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensCompletionRollup), "");
|
|
358
404
|
} }
|
|
359
405
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
360
|
-
i0.ɵɵelementStart(0, "div",
|
|
406
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span");
|
|
361
407
|
i0.ɵɵtext(2);
|
|
362
408
|
i0.ɵɵelementEnd()();
|
|
363
409
|
} if (rf & 2) {
|
|
@@ -366,7 +412,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
366
412
|
i0.ɵɵtextInterpolate1("Rollup: ", ctx_r1.formatTokens(ctx_r1.record.TokensUsedRollup), "");
|
|
367
413
|
} }
|
|
368
414
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
369
|
-
i0.ɵɵelementStart(0, "div",
|
|
415
|
+
i0.ɵɵelementStart(0, "div", 88)(1, "span");
|
|
370
416
|
i0.ɵɵtext(2);
|
|
371
417
|
i0.ɵɵelementEnd()();
|
|
372
418
|
} if (rf & 2) {
|
|
@@ -375,7 +421,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
375
421
|
i0.ɵɵtextInterpolate1("Total: ", ctx_r1.formatCost(ctx_r1.record.TotalCost), "");
|
|
376
422
|
} }
|
|
377
423
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
378
|
-
i0.ɵɵelementStart(0, "div",
|
|
424
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
379
425
|
i0.ɵɵtext(1);
|
|
380
426
|
i0.ɵɵelementEnd();
|
|
381
427
|
} if (rf & 2) {
|
|
@@ -383,8 +429,50 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
383
429
|
i0.ɵɵadvance();
|
|
384
430
|
i0.ɵɵtextInterpolate(ctx_r1.record.CostCurrency);
|
|
385
431
|
} }
|
|
432
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
433
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
|
|
434
|
+
i0.ɵɵelement(2, "i", 93);
|
|
435
|
+
i0.ɵɵelementStart(3, "h4");
|
|
436
|
+
i0.ɵɵtext(4, "Queue Time");
|
|
437
|
+
i0.ɵɵelementEnd()();
|
|
438
|
+
i0.ɵɵelementStart(5, "div", 87);
|
|
439
|
+
i0.ɵɵtext(6);
|
|
440
|
+
i0.ɵɵelementEnd()();
|
|
441
|
+
} if (rf & 2) {
|
|
442
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
443
|
+
i0.ɵɵadvance(6);
|
|
444
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.QueueTime));
|
|
445
|
+
} }
|
|
386
446
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
387
|
-
i0.ɵɵelementStart(0, "div",
|
|
447
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
|
|
448
|
+
i0.ɵɵelement(2, "i", 94);
|
|
449
|
+
i0.ɵɵelementStart(3, "h4");
|
|
450
|
+
i0.ɵɵtext(4, "Prompt Time");
|
|
451
|
+
i0.ɵɵelementEnd()();
|
|
452
|
+
i0.ɵɵelementStart(5, "div", 87);
|
|
453
|
+
i0.ɵɵtext(6);
|
|
454
|
+
i0.ɵɵelementEnd()();
|
|
455
|
+
} if (rf & 2) {
|
|
456
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
457
|
+
i0.ɵɵadvance(6);
|
|
458
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.PromptTime));
|
|
459
|
+
} }
|
|
460
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
461
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
|
|
462
|
+
i0.ɵɵelement(2, "i", 95);
|
|
463
|
+
i0.ɵɵelementStart(3, "h4");
|
|
464
|
+
i0.ɵɵtext(4, "Completion Time");
|
|
465
|
+
i0.ɵɵelementEnd()();
|
|
466
|
+
i0.ɵɵelementStart(5, "div", 87);
|
|
467
|
+
i0.ɵɵtext(6);
|
|
468
|
+
i0.ɵɵelementEnd()();
|
|
469
|
+
} if (rf & 2) {
|
|
470
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
471
|
+
i0.ɵɵadvance(6);
|
|
472
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(ctx_r1.record.CompletionTime));
|
|
473
|
+
} }
|
|
474
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
475
|
+
i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
|
|
388
476
|
i0.ɵɵtext(2, "Execution Order:");
|
|
389
477
|
i0.ɵɵelementEnd();
|
|
390
478
|
i0.ɵɵelementStart(3, "span", 28);
|
|
@@ -395,8 +483,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
395
483
|
i0.ɵɵadvance(4);
|
|
396
484
|
i0.ɵɵtextInterpolate(ctx_r1.record.ExecutionOrder);
|
|
397
485
|
} }
|
|
398
|
-
function
|
|
399
|
-
i0.ɵɵelementStart(0, "div",
|
|
486
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_40_Template(rf, ctx) { if (rf & 1) {
|
|
487
|
+
i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
|
|
400
488
|
i0.ɵɵtext(2, "Configuration:");
|
|
401
489
|
i0.ɵɵelementEnd();
|
|
402
490
|
i0.ɵɵelementStart(3, "span", 28);
|
|
@@ -407,15 +495,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
407
495
|
i0.ɵɵadvance(4);
|
|
408
496
|
i0.ɵɵtextInterpolate(ctx_r1.record.Configuration);
|
|
409
497
|
} }
|
|
410
|
-
function
|
|
498
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
411
499
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
412
|
-
i0.ɵɵelementStart(0, "div",
|
|
500
|
+
i0.ɵɵelementStart(0, "div", 92)(1, "span", 27);
|
|
413
501
|
i0.ɵɵtext(2, "Agent:");
|
|
414
502
|
i0.ɵɵelementEnd();
|
|
415
|
-
i0.ɵɵelementStart(3, "span",
|
|
416
|
-
i0.ɵɵlistener("click", function
|
|
503
|
+
i0.ɵɵelementStart(3, "span", 96);
|
|
504
|
+
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template_span_click_3_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
|
|
417
505
|
i0.ɵɵtext(4);
|
|
418
|
-
i0.ɵɵelement(5, "i",
|
|
506
|
+
i0.ɵɵelement(5, "i", 97);
|
|
419
507
|
i0.ɵɵelementEnd()();
|
|
420
508
|
} if (rf & 2) {
|
|
421
509
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -423,48 +511,50 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Condition
|
|
|
423
511
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent, " ");
|
|
424
512
|
} }
|
|
425
513
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(rf, ctx) { if (rf & 1) {
|
|
426
|
-
i0.ɵɵelementStart(0, "div", 49)(1, "div",
|
|
427
|
-
i0.ɵɵelement(4, "i",
|
|
514
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 83)(2, "div", 84)(3, "div", 85);
|
|
515
|
+
i0.ɵɵelement(4, "i", 86);
|
|
428
516
|
i0.ɵɵelementStart(5, "h4");
|
|
429
517
|
i0.ɵɵtext(6, "Prompt Tokens");
|
|
430
518
|
i0.ɵɵelementEnd()();
|
|
431
|
-
i0.ɵɵelementStart(7, "div",
|
|
519
|
+
i0.ɵɵelementStart(7, "div", 87);
|
|
432
520
|
i0.ɵɵtext(8);
|
|
433
521
|
i0.ɵɵelementEnd();
|
|
434
|
-
i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template, 3, 1, "div",
|
|
522
|
+
i0.ɵɵtemplate(9, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_9_Template, 3, 1, "div", 88);
|
|
435
523
|
i0.ɵɵelementEnd();
|
|
436
|
-
i0.ɵɵelementStart(10, "div",
|
|
437
|
-
i0.ɵɵelement(12, "i",
|
|
524
|
+
i0.ɵɵelementStart(10, "div", 84)(11, "div", 85);
|
|
525
|
+
i0.ɵɵelement(12, "i", 89);
|
|
438
526
|
i0.ɵɵelementStart(13, "h4");
|
|
439
527
|
i0.ɵɵtext(14, "Completion Tokens");
|
|
440
528
|
i0.ɵɵelementEnd()();
|
|
441
|
-
i0.ɵɵelementStart(15, "div",
|
|
529
|
+
i0.ɵɵelementStart(15, "div", 87);
|
|
442
530
|
i0.ɵɵtext(16);
|
|
443
531
|
i0.ɵɵelementEnd();
|
|
444
|
-
i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template, 3, 1, "div",
|
|
532
|
+
i0.ɵɵtemplate(17, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_17_Template, 3, 1, "div", 88);
|
|
445
533
|
i0.ɵɵelementEnd();
|
|
446
|
-
i0.ɵɵelementStart(18, "div",
|
|
534
|
+
i0.ɵɵelementStart(18, "div", 84)(19, "div", 85);
|
|
447
535
|
i0.ɵɵelement(20, "i", 29);
|
|
448
536
|
i0.ɵɵelementStart(21, "h4");
|
|
449
537
|
i0.ɵɵtext(22, "Total Tokens");
|
|
450
538
|
i0.ɵɵelementEnd()();
|
|
451
|
-
i0.ɵɵelementStart(23, "div",
|
|
539
|
+
i0.ɵɵelementStart(23, "div", 87);
|
|
452
540
|
i0.ɵɵtext(24);
|
|
453
541
|
i0.ɵɵelementEnd();
|
|
454
|
-
i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template, 3, 1, "div",
|
|
542
|
+
i0.ɵɵtemplate(25, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_25_Template, 3, 1, "div", 88);
|
|
455
543
|
i0.ɵɵelementEnd();
|
|
456
|
-
i0.ɵɵelementStart(26, "div",
|
|
544
|
+
i0.ɵɵelementStart(26, "div", 84)(27, "div", 85);
|
|
457
545
|
i0.ɵɵelement(28, "i", 30);
|
|
458
546
|
i0.ɵɵelementStart(29, "h4");
|
|
459
547
|
i0.ɵɵtext(30, "Cost");
|
|
460
548
|
i0.ɵɵelementEnd()();
|
|
461
|
-
i0.ɵɵelementStart(31, "div",
|
|
549
|
+
i0.ɵɵelementStart(31, "div", 87);
|
|
462
550
|
i0.ɵɵtext(32);
|
|
463
551
|
i0.ɵɵelementEnd();
|
|
464
|
-
i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template, 3, 1, "div",
|
|
465
|
-
i0.ɵɵelementEnd()
|
|
466
|
-
i0.ɵɵ
|
|
467
|
-
i0.ɵɵ
|
|
552
|
+
i0.ɵɵtemplate(33, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_33_Template, 3, 1, "div", 88)(34, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_34_Template, 2, 1, "div", 90);
|
|
553
|
+
i0.ɵɵelementEnd();
|
|
554
|
+
i0.ɵɵtemplate(35, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_35_Template, 7, 1, "div", 84)(36, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_36_Template, 7, 1, "div", 84)(37, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_37_Template, 7, 1, "div", 84);
|
|
555
|
+
i0.ɵɵelementEnd();
|
|
556
|
+
i0.ɵɵelementStart(38, "div", 91);
|
|
557
|
+
i0.ɵɵtemplate(39, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_39_Template, 5, 1, "div", 92)(40, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_40_Template, 5, 1, "div", 92)(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Conditional_41_Template, 6, 1, "div", 92);
|
|
468
558
|
i0.ɵɵelementEnd()();
|
|
469
559
|
} if (rf & 2) {
|
|
470
560
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -486,12 +576,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template(
|
|
|
486
576
|
i0.ɵɵconditional(ctx_r1.record.TotalCost && ctx_r1.record.TotalCost !== ctx_r1.record.Cost ? 33 : -1);
|
|
487
577
|
i0.ɵɵadvance();
|
|
488
578
|
i0.ɵɵconditional(ctx_r1.record.CostCurrency ? 34 : -1);
|
|
579
|
+
i0.ɵɵadvance();
|
|
580
|
+
i0.ɵɵconditional(ctx_r1.record.QueueTime != null ? 35 : -1);
|
|
581
|
+
i0.ɵɵadvance();
|
|
582
|
+
i0.ɵɵconditional(ctx_r1.record.PromptTime != null ? 36 : -1);
|
|
583
|
+
i0.ɵɵadvance();
|
|
584
|
+
i0.ɵɵconditional(ctx_r1.record.CompletionTime != null ? 37 : -1);
|
|
489
585
|
i0.ɵɵadvance(2);
|
|
490
|
-
i0.ɵɵconditional(ctx_r1.record.ExecutionOrder !== null ?
|
|
586
|
+
i0.ɵɵconditional(ctx_r1.record.ExecutionOrder !== null ? 39 : -1);
|
|
491
587
|
i0.ɵɵadvance();
|
|
492
|
-
i0.ɵɵconditional(ctx_r1.record.ConfigurationID ?
|
|
588
|
+
i0.ɵɵconditional(ctx_r1.record.ConfigurationID ? 40 : -1);
|
|
493
589
|
i0.ɵɵadvance();
|
|
494
|
-
i0.ɵɵconditional(ctx_r1.record.AgentID ?
|
|
590
|
+
i0.ɵɵconditional(ctx_r1.record.AgentID ? 41 : -1);
|
|
495
591
|
} }
|
|
496
592
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
497
593
|
i0.ɵɵelementStart(0, "span", 64);
|
|
@@ -503,7 +599,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
503
599
|
i0.ɵɵtextInterpolate1("(", ctx_r1.record.ValidationAttemptCount, " attempts)");
|
|
504
600
|
} }
|
|
505
601
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
506
|
-
i0.ɵɵelementStart(0, "span",
|
|
602
|
+
i0.ɵɵelementStart(0, "span", 99);
|
|
507
603
|
i0.ɵɵtext(1, "Passed");
|
|
508
604
|
i0.ɵɵelementEnd();
|
|
509
605
|
} }
|
|
@@ -514,9 +610,9 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
514
610
|
} }
|
|
515
611
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
516
612
|
i0.ɵɵelementStart(0, "span", 47);
|
|
517
|
-
i0.ɵɵelement(1, "i",
|
|
613
|
+
i0.ɵɵelement(1, "i", 98);
|
|
518
614
|
i0.ɵɵtext(2, " Validation & Retries ");
|
|
519
|
-
i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template, 2, 1, "span", 64)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template, 2, 0, "span",
|
|
615
|
+
i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_3_Template, 2, 1, "span", 64)(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_4_Template, 2, 0, "span", 99)(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_1_Conditional_5_Template, 2, 0, "span", 71);
|
|
520
616
|
i0.ɵɵelementEnd();
|
|
521
617
|
} if (rf & 2) {
|
|
522
618
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -526,7 +622,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
526
622
|
i0.ɵɵconditional(ctx_r1.record.FinalValidationPassed ? 4 : ctx_r1.record.FinalValidationPassed === false ? 5 : -1);
|
|
527
623
|
} }
|
|
528
624
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
529
|
-
i0.ɵɵelementStart(0, "span",
|
|
625
|
+
i0.ɵɵelementStart(0, "span", 110);
|
|
530
626
|
i0.ɵɵtext(1);
|
|
531
627
|
i0.ɵɵelementEnd();
|
|
532
628
|
} if (rf & 2) {
|
|
@@ -535,14 +631,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
535
631
|
i0.ɵɵtextInterpolate1("", ctx_r1.record.ValidationErrorCount, " validation errors");
|
|
536
632
|
} }
|
|
537
633
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
538
|
-
i0.ɵɵelementStart(0, "div",
|
|
634
|
+
i0.ɵɵelementStart(0, "div", 105)(1, "h5");
|
|
539
635
|
i0.ɵɵelement(2, "i", 73);
|
|
540
636
|
i0.ɵɵtext(3, " Final Validation Error");
|
|
541
637
|
i0.ɵɵelementEnd();
|
|
542
638
|
i0.ɵɵelementStart(4, "p");
|
|
543
639
|
i0.ɵɵtext(5);
|
|
544
640
|
i0.ɵɵelementEnd();
|
|
545
|
-
i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span",
|
|
641
|
+
i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Conditional_6_Template, 2, 1, "span", 110);
|
|
546
642
|
i0.ɵɵelementEnd();
|
|
547
643
|
} if (rf & 2) {
|
|
548
644
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -552,8 +648,8 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
552
648
|
i0.ɵɵconditional(ctx_r1.record && ctx_r1.record.ValidationErrorCount && ctx_r1.record.ValidationErrorCount > 0 ? 6 : -1);
|
|
553
649
|
} }
|
|
554
650
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
555
|
-
i0.ɵɵelementStart(0, "div",
|
|
556
|
-
i0.ɵɵelement(2, "i",
|
|
651
|
+
i0.ɵɵelementStart(0, "div", 106)(1, "h5");
|
|
652
|
+
i0.ɵɵelement(2, "i", 111);
|
|
557
653
|
i0.ɵɵtext(3, " Most Common Error");
|
|
558
654
|
i0.ɵɵelementEnd();
|
|
559
655
|
i0.ɵɵelementStart(4, "p");
|
|
@@ -565,23 +661,23 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
565
661
|
i0.ɵɵtextInterpolate(ctx_r1.record.CommonValidationError);
|
|
566
662
|
} }
|
|
567
663
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
568
|
-
i0.ɵɵelementStart(0, "div",
|
|
664
|
+
i0.ɵɵelementStart(0, "div", 107)(1, "h4");
|
|
569
665
|
i0.ɵɵtext(2, "Retry Timeline");
|
|
570
666
|
i0.ɵɵelementEnd();
|
|
571
|
-
i0.ɵɵelementStart(3, "div",
|
|
667
|
+
i0.ɵɵelementStart(3, "div", 112)(4, "div", 113);
|
|
572
668
|
i0.ɵɵelement(5, "i", 25);
|
|
573
669
|
i0.ɵɵelementStart(6, "span");
|
|
574
670
|
i0.ɵɵtext(7);
|
|
575
671
|
i0.ɵɵpipe(8, "date");
|
|
576
672
|
i0.ɵɵelementEnd()();
|
|
577
|
-
i0.ɵɵelementStart(9, "div",
|
|
578
|
-
i0.ɵɵelement(10, "i",
|
|
673
|
+
i0.ɵɵelementStart(9, "div", 113);
|
|
674
|
+
i0.ɵɵelement(10, "i", 95);
|
|
579
675
|
i0.ɵɵelementStart(11, "span");
|
|
580
676
|
i0.ɵɵtext(12);
|
|
581
677
|
i0.ɵɵpipe(13, "date");
|
|
582
678
|
i0.ɵɵelementEnd()();
|
|
583
|
-
i0.ɵɵelementStart(14, "div",
|
|
584
|
-
i0.ɵɵelement(15, "i",
|
|
679
|
+
i0.ɵɵelementStart(14, "div", 113);
|
|
680
|
+
i0.ɵɵelement(15, "i", 114);
|
|
585
681
|
i0.ɵɵelementStart(16, "span");
|
|
586
682
|
i0.ɵɵtext(17);
|
|
587
683
|
i0.ɵɵelementEnd()()()();
|
|
@@ -595,7 +691,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
595
691
|
i0.ɵɵtextInterpolate1("Total Retry Duration: ", ctx_r1.formatDuration(ctx_r1.record.TotalRetryDurationMS), "");
|
|
596
692
|
} }
|
|
597
693
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
598
|
-
i0.ɵɵelementStart(0, "span",
|
|
694
|
+
i0.ɵɵelementStart(0, "span", 110);
|
|
599
695
|
i0.ɵɵtext(1);
|
|
600
696
|
i0.ɵɵelementEnd();
|
|
601
697
|
} if (rf & 2) {
|
|
@@ -604,10 +700,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
604
700
|
i0.ɵɵtextInterpolate1("(", attempt_r11.validationErrorCount, " errors)");
|
|
605
701
|
} }
|
|
606
702
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
607
|
-
i0.ɵɵelementStart(0, "span",
|
|
703
|
+
i0.ɵɵelementStart(0, "span", 122);
|
|
608
704
|
i0.ɵɵtext(1);
|
|
609
705
|
i0.ɵɵelementEnd();
|
|
610
|
-
i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span",
|
|
706
|
+
i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Conditional_2_Template, 2, 1, "span", 110);
|
|
611
707
|
} if (rf & 2) {
|
|
612
708
|
const attempt_r11 = i0.ɵɵnextContext().$implicit;
|
|
613
709
|
i0.ɵɵadvance();
|
|
@@ -616,7 +712,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
616
712
|
i0.ɵɵconditional(attempt_r11.validationErrorCount > 0 ? 2 : -1);
|
|
617
713
|
} }
|
|
618
714
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
619
|
-
i0.ɵɵelementStart(0, "span",
|
|
715
|
+
i0.ɵɵelementStart(0, "span", 121);
|
|
620
716
|
i0.ɵɵtext(1);
|
|
621
717
|
i0.ɵɵelementEnd();
|
|
622
718
|
} if (rf & 2) {
|
|
@@ -625,14 +721,14 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
625
721
|
i0.ɵɵtextInterpolate1("Output: ", attempt_r11.outputLength, " chars");
|
|
626
722
|
} }
|
|
627
723
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
628
|
-
i0.ɵɵelementStart(0, "div",
|
|
724
|
+
i0.ɵɵelementStart(0, "div", 117)(1, "div", 118);
|
|
629
725
|
i0.ɵɵelement(2, "i");
|
|
630
726
|
i0.ɵɵtext(3);
|
|
631
727
|
i0.ɵɵelementEnd();
|
|
632
|
-
i0.ɵɵelementStart(4, "div",
|
|
728
|
+
i0.ɵɵelementStart(4, "div", 119)(5, "span", 120);
|
|
633
729
|
i0.ɵɵtext(6);
|
|
634
730
|
i0.ɵɵelementEnd();
|
|
635
|
-
i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span",
|
|
731
|
+
i0.ɵɵtemplate(7, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_7_Template, 3, 2)(8, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Conditional_8_Template, 2, 1, "span", 121);
|
|
636
732
|
i0.ɵɵelementEnd()();
|
|
637
733
|
} if (rf & 2) {
|
|
638
734
|
const attempt_r11 = ctx.$implicit;
|
|
@@ -649,11 +745,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
649
745
|
i0.ɵɵconditional(attempt_r11.outputLength ? 8 : -1);
|
|
650
746
|
} }
|
|
651
747
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
652
|
-
i0.ɵɵelementStart(0, "div",
|
|
748
|
+
i0.ɵɵelementStart(0, "div", 108)(1, "h4");
|
|
653
749
|
i0.ɵɵtext(2, "Validation Attempts");
|
|
654
750
|
i0.ɵɵelementEnd();
|
|
655
|
-
i0.ɵɵelementStart(3, "div",
|
|
656
|
-
i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div",
|
|
751
|
+
i0.ɵɵelementStart(3, "div", 115);
|
|
752
|
+
i0.ɵɵrepeaterCreate(4, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_For_5_Template, 9, 10, "div", 116, _forTrack0);
|
|
657
753
|
i0.ɵɵelementEnd()();
|
|
658
754
|
} if (rf & 2) {
|
|
659
755
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -662,10 +758,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
662
758
|
} }
|
|
663
759
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
664
760
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
665
|
-
i0.ɵɵelementStart(0, "div",
|
|
761
|
+
i0.ɵɵelementStart(0, "div", 109)(1, "h4");
|
|
666
762
|
i0.ɵɵtext(2, "Validation Summary Details");
|
|
667
763
|
i0.ɵɵelementEnd();
|
|
668
|
-
i0.ɵɵelementStart(3, "div",
|
|
764
|
+
i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 124);
|
|
669
765
|
i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationSummary, $event) || (ctx_r1.formattedValidationSummary = $event); return i0.ɵɵresetView($event); });
|
|
670
766
|
i0.ɵɵelementEnd()()();
|
|
671
767
|
} if (rf & 2) {
|
|
@@ -676,10 +772,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
676
772
|
} }
|
|
677
773
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
678
774
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
679
|
-
i0.ɵɵelementStart(0, "div",
|
|
775
|
+
i0.ɵɵelementStart(0, "div", 109)(1, "h4");
|
|
680
776
|
i0.ɵɵtext(2, "Validation Attempts (Raw JSON)");
|
|
681
777
|
i0.ɵɵelementEnd();
|
|
682
|
-
i0.ɵɵelementStart(3, "div",
|
|
778
|
+
i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 125);
|
|
683
779
|
i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedValidationAttempts, $event) || (ctx_r1.formattedValidationAttempts = $event); return i0.ɵɵresetView($event); });
|
|
684
780
|
i0.ɵɵelementEnd()()();
|
|
685
781
|
} if (rf & 2) {
|
|
@@ -689,40 +785,40 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_templa
|
|
|
689
785
|
i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
|
|
690
786
|
} }
|
|
691
787
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
692
|
-
i0.ɵɵelementStart(0, "div", 49)(1, "div",
|
|
788
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 100)(2, "div", 101)(3, "h4");
|
|
693
789
|
i0.ɵɵtext(4, "Validation Summary");
|
|
694
790
|
i0.ɵɵelementEnd();
|
|
695
|
-
i0.ɵɵelementStart(5, "div",
|
|
791
|
+
i0.ɵɵelementStart(5, "div", 102);
|
|
696
792
|
i0.ɵɵelement(6, "i");
|
|
697
793
|
i0.ɵɵtext(7);
|
|
698
794
|
i0.ɵɵelementEnd()();
|
|
699
|
-
i0.ɵɵelementStart(8, "div",
|
|
795
|
+
i0.ɵɵelementStart(8, "div", 103)(9, "div", 104)(10, "div", 27);
|
|
700
796
|
i0.ɵɵtext(11, "Total Attempts");
|
|
701
797
|
i0.ɵɵelementEnd();
|
|
702
798
|
i0.ɵɵelementStart(12, "div", 28);
|
|
703
799
|
i0.ɵɵtext(13);
|
|
704
800
|
i0.ɵɵelementEnd()();
|
|
705
|
-
i0.ɵɵelementStart(14, "div",
|
|
801
|
+
i0.ɵɵelementStart(14, "div", 104)(15, "div", 27);
|
|
706
802
|
i0.ɵɵtext(16, "Successful");
|
|
707
803
|
i0.ɵɵelementEnd();
|
|
708
804
|
i0.ɵɵelementStart(17, "div", 28);
|
|
709
805
|
i0.ɵɵtext(18);
|
|
710
806
|
i0.ɵɵelementEnd()();
|
|
711
|
-
i0.ɵɵelementStart(19, "div",
|
|
807
|
+
i0.ɵɵelementStart(19, "div", 104)(20, "div", 27);
|
|
712
808
|
i0.ɵɵtext(21, "Behavior");
|
|
713
809
|
i0.ɵɵelementEnd();
|
|
714
810
|
i0.ɵɵelementStart(22, "div", 28);
|
|
715
811
|
i0.ɵɵtext(23);
|
|
716
812
|
i0.ɵɵelementEnd()();
|
|
717
|
-
i0.ɵɵelementStart(24, "div",
|
|
813
|
+
i0.ɵɵelementStart(24, "div", 104)(25, "div", 27);
|
|
718
814
|
i0.ɵɵtext(26, "Retry Strategy");
|
|
719
815
|
i0.ɵɵelementEnd();
|
|
720
816
|
i0.ɵɵelementStart(27, "div", 28);
|
|
721
817
|
i0.ɵɵtext(28);
|
|
722
818
|
i0.ɵɵelementEnd()()();
|
|
723
|
-
i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template, 7, 2, "div",
|
|
819
|
+
i0.ɵɵtemplate(29, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_29_Template, 7, 2, "div", 105)(30, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_30_Template, 6, 1, "div", 106);
|
|
724
820
|
i0.ɵɵelementEnd();
|
|
725
|
-
i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template, 18, 9, "div",
|
|
821
|
+
i0.ɵɵtemplate(31, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_31_Template, 18, 9, "div", 107)(32, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_32_Template, 6, 0, "div", 108)(33, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_33_Template, 5, 4, "div", 109)(34, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_ng_template_2_Conditional_34_Template, 5, 4, "div", 109);
|
|
726
822
|
i0.ɵɵelementEnd();
|
|
727
823
|
} if (rf & 2) {
|
|
728
824
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -772,7 +868,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
772
868
|
} }
|
|
773
869
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
774
870
|
i0.ɵɵelementStart(0, "span", 47);
|
|
775
|
-
i0.ɵɵelement(1, "i",
|
|
871
|
+
i0.ɵɵelement(1, "i", 126);
|
|
776
872
|
i0.ɵɵtext(2, " Run Hierarchy ");
|
|
777
873
|
i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_1_Conditional_3_Template, 2, 1, "span", 64);
|
|
778
874
|
i0.ɵɵelementEnd();
|
|
@@ -783,21 +879,21 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
783
879
|
} }
|
|
784
880
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
785
881
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
786
|
-
i0.ɵɵelementStart(0, "div",
|
|
882
|
+
i0.ɵɵelementStart(0, "div", 127)(1, "h4");
|
|
787
883
|
i0.ɵɵelement(2, "i", 44);
|
|
788
884
|
i0.ɵɵtext(3, " Parent Run");
|
|
789
885
|
i0.ɵɵelementEnd();
|
|
790
|
-
i0.ɵɵelementStart(4, "div",
|
|
886
|
+
i0.ɵɵelementStart(4, "div", 129);
|
|
791
887
|
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template_div_click_4_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", ctx_r1.parentRun.ID)); });
|
|
792
|
-
i0.ɵɵelementStart(5, "div",
|
|
888
|
+
i0.ɵɵelementStart(5, "div", 130);
|
|
793
889
|
i0.ɵɵelement(6, "i");
|
|
794
890
|
i0.ɵɵelementEnd();
|
|
795
|
-
i0.ɵɵelementStart(7, "div",
|
|
891
|
+
i0.ɵɵelementStart(7, "div", 131)(8, "div", 132);
|
|
796
892
|
i0.ɵɵtext(9);
|
|
797
|
-
i0.ɵɵelementStart(10, "span",
|
|
893
|
+
i0.ɵɵelementStart(10, "span", 133);
|
|
798
894
|
i0.ɵɵtext(11);
|
|
799
895
|
i0.ɵɵelementEnd()();
|
|
800
|
-
i0.ɵɵelementStart(12, "div",
|
|
896
|
+
i0.ɵɵelementStart(12, "div", 134)(13, "span");
|
|
801
897
|
i0.ɵɵelement(14, "i", 25);
|
|
802
898
|
i0.ɵɵtext(15);
|
|
803
899
|
i0.ɵɵelementEnd();
|
|
@@ -810,7 +906,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
810
906
|
i0.ɵɵtext(21);
|
|
811
907
|
i0.ɵɵpipe(22, "date");
|
|
812
908
|
i0.ɵɵelementEnd()()();
|
|
813
|
-
i0.ɵɵelement(23, "i",
|
|
909
|
+
i0.ɵɵelement(23, "i", 97);
|
|
814
910
|
i0.ɵɵelementEnd()();
|
|
815
911
|
} if (rf & 2) {
|
|
816
912
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -830,7 +926,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
830
926
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(22, 9, ctx_r1.parentRun.RunAt, "short"), "");
|
|
831
927
|
} }
|
|
832
928
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
833
|
-
i0.ɵɵelementStart(0, "span",
|
|
929
|
+
i0.ɵɵelementStart(0, "span", 139);
|
|
834
930
|
i0.ɵɵtext(1);
|
|
835
931
|
i0.ɵɵelementEnd();
|
|
836
932
|
} if (rf & 2) {
|
|
@@ -840,18 +936,18 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
840
936
|
} }
|
|
841
937
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
842
938
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
843
|
-
i0.ɵɵelementStart(0, "div",
|
|
939
|
+
i0.ɵɵelementStart(0, "div", 138);
|
|
844
940
|
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template_div_click_0_listener() { const childRun_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.navigateToEntity("MJ: AI Prompt Runs", childRun_r16.ID)); });
|
|
845
|
-
i0.ɵɵelementStart(1, "div",
|
|
941
|
+
i0.ɵɵelementStart(1, "div", 130);
|
|
846
942
|
i0.ɵɵelement(2, "i");
|
|
847
943
|
i0.ɵɵelementEnd();
|
|
848
|
-
i0.ɵɵelementStart(3, "div",
|
|
944
|
+
i0.ɵɵelementStart(3, "div", 131)(4, "div", 132);
|
|
849
945
|
i0.ɵɵtext(5);
|
|
850
|
-
i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span",
|
|
851
|
-
i0.ɵɵelementStart(7, "span",
|
|
946
|
+
i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Conditional_6_Template, 2, 1, "span", 139);
|
|
947
|
+
i0.ɵɵelementStart(7, "span", 133);
|
|
852
948
|
i0.ɵɵtext(8);
|
|
853
949
|
i0.ɵɵelementEnd()();
|
|
854
|
-
i0.ɵɵelementStart(9, "div",
|
|
950
|
+
i0.ɵɵelementStart(9, "div", 134)(10, "span", 140);
|
|
855
951
|
i0.ɵɵelement(11, "i");
|
|
856
952
|
i0.ɵɵtext(12);
|
|
857
953
|
i0.ɵɵelementEnd();
|
|
@@ -863,7 +959,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
863
959
|
i0.ɵɵelement(17, "i", 29);
|
|
864
960
|
i0.ɵɵtext(18);
|
|
865
961
|
i0.ɵɵelementEnd()()();
|
|
866
|
-
i0.ɵɵelement(19, "i",
|
|
962
|
+
i0.ɵɵelement(19, "i", 97);
|
|
867
963
|
i0.ɵɵelementEnd();
|
|
868
964
|
} if (rf & 2) {
|
|
869
965
|
const childRun_r16 = ctx.$implicit;
|
|
@@ -890,12 +986,12 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
890
986
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatTokens(childRun_r16.TokensUsed), "");
|
|
891
987
|
} }
|
|
892
988
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
893
|
-
i0.ɵɵelementStart(0, "div",
|
|
894
|
-
i0.ɵɵelement(2, "i",
|
|
989
|
+
i0.ɵɵelementStart(0, "div", 128)(1, "h4");
|
|
990
|
+
i0.ɵɵelement(2, "i", 135);
|
|
895
991
|
i0.ɵɵtext(3, " Child Runs");
|
|
896
992
|
i0.ɵɵelementEnd();
|
|
897
|
-
i0.ɵɵelementStart(4, "div",
|
|
898
|
-
i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div",
|
|
993
|
+
i0.ɵɵelementStart(4, "div", 136);
|
|
994
|
+
i0.ɵɵrepeaterCreate(5, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_For_6_Template, 20, 14, "div", 137, _forTrack1);
|
|
899
995
|
i0.ɵɵelementEnd()();
|
|
900
996
|
} if (rf & 2) {
|
|
901
997
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -904,7 +1000,7 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_templa
|
|
|
904
1000
|
} }
|
|
905
1001
|
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
906
1002
|
i0.ɵɵelementStart(0, "div", 49);
|
|
907
|
-
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template, 24, 12, "div",
|
|
1003
|
+
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_1_Template, 24, 12, "div", 127)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_ng_template_2_Conditional_2_Template, 7, 0, "div", 128);
|
|
908
1004
|
i0.ɵɵelementEnd();
|
|
909
1005
|
} if (rf & 2) {
|
|
910
1006
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -923,20 +1019,20 @@ function AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template(
|
|
|
923
1019
|
} }
|
|
924
1020
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template(rf, ctx) { if (rf & 1) {
|
|
925
1021
|
i0.ɵɵelementStart(0, "span", 47);
|
|
926
|
-
i0.ɵɵelement(1, "i",
|
|
1022
|
+
i0.ɵɵelement(1, "i", 141);
|
|
927
1023
|
i0.ɵɵtext(2, " Additional Details ");
|
|
928
1024
|
i0.ɵɵelementEnd();
|
|
929
1025
|
} }
|
|
930
1026
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
931
1027
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
932
|
-
i0.ɵɵelementStart(0, "div",
|
|
1028
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
933
1029
|
i0.ɵɵtext(2, "Agent");
|
|
934
1030
|
i0.ɵɵelementEnd();
|
|
935
|
-
i0.ɵɵelementStart(3, "div",
|
|
1031
|
+
i0.ɵɵelementStart(3, "div", 151);
|
|
936
1032
|
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Agents", ctx_r1.record.AgentID)); });
|
|
937
|
-
i0.ɵɵelement(4, "i",
|
|
1033
|
+
i0.ɵɵelement(4, "i", 152);
|
|
938
1034
|
i0.ɵɵtext(5);
|
|
939
|
-
i0.ɵɵelement(6, "i",
|
|
1035
|
+
i0.ɵɵelement(6, "i", 97);
|
|
940
1036
|
i0.ɵɵelementEnd()();
|
|
941
1037
|
} if (rf & 2) {
|
|
942
1038
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -944,11 +1040,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
944
1040
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Agent || "Unknown", " ");
|
|
945
1041
|
} }
|
|
946
1042
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
947
|
-
i0.ɵɵelementStart(0, "div",
|
|
1043
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
948
1044
|
i0.ɵɵtext(2, "Configuration");
|
|
949
1045
|
i0.ɵɵelementEnd();
|
|
950
|
-
i0.ɵɵelementStart(3, "div",
|
|
951
|
-
i0.ɵɵelement(4, "i",
|
|
1046
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1047
|
+
i0.ɵɵelement(4, "i", 153);
|
|
952
1048
|
i0.ɵɵtext(5);
|
|
953
1049
|
i0.ɵɵelementEnd()();
|
|
954
1050
|
} if (rf & 2) {
|
|
@@ -957,10 +1053,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
957
1053
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Configuration || "Unknown", " ");
|
|
958
1054
|
} }
|
|
959
1055
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
960
|
-
i0.ɵɵelementStart(0, "div",
|
|
1056
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
961
1057
|
i0.ɵɵtext(2, "Run Type");
|
|
962
1058
|
i0.ɵɵelementEnd();
|
|
963
|
-
i0.ɵɵelementStart(3, "div",
|
|
1059
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
964
1060
|
i0.ɵɵelement(4, "i");
|
|
965
1061
|
i0.ɵɵtext(5);
|
|
966
1062
|
i0.ɵɵelementEnd()();
|
|
@@ -972,10 +1068,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
972
1068
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.RunType, " ");
|
|
973
1069
|
} }
|
|
974
1070
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
975
|
-
i0.ɵɵelementStart(0, "div",
|
|
1071
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
976
1072
|
i0.ɵɵtext(2, "Response Format");
|
|
977
1073
|
i0.ɵɵelementEnd();
|
|
978
|
-
i0.ɵɵelementStart(3, "div",
|
|
1074
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
979
1075
|
i0.ɵɵelement(4, "i", 69);
|
|
980
1076
|
i0.ɵɵtext(5);
|
|
981
1077
|
i0.ɵɵelementEnd()();
|
|
@@ -985,10 +1081,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
985
1081
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ResponseFormat, " ");
|
|
986
1082
|
} }
|
|
987
1083
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
988
|
-
i0.ɵɵelementStart(0, "div",
|
|
1084
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
989
1085
|
i0.ɵɵtext(2, "Started At");
|
|
990
1086
|
i0.ɵɵelementEnd();
|
|
991
|
-
i0.ɵɵelementStart(3, "div",
|
|
1087
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
992
1088
|
i0.ɵɵelement(4, "i", 25);
|
|
993
1089
|
i0.ɵɵtext(5);
|
|
994
1090
|
i0.ɵɵpipe(6, "date");
|
|
@@ -999,11 +1095,11 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
999
1095
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.RunAt, "medium"), " ");
|
|
1000
1096
|
} }
|
|
1001
1097
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
1002
|
-
i0.ɵɵelementStart(0, "div",
|
|
1098
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
1003
1099
|
i0.ɵɵtext(2, "Completed At");
|
|
1004
1100
|
i0.ɵɵelementEnd();
|
|
1005
|
-
i0.ɵɵelementStart(3, "div",
|
|
1006
|
-
i0.ɵɵelement(4, "i",
|
|
1101
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1102
|
+
i0.ɵɵelement(4, "i", 154);
|
|
1007
1103
|
i0.ɵɵtext(5);
|
|
1008
1104
|
i0.ɵɵpipe(6, "date");
|
|
1009
1105
|
i0.ɵɵelementEnd()();
|
|
@@ -1013,58 +1109,58 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Condition
|
|
|
1013
1109
|
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(6, 1, ctx_r1.record.CompletedAt, "medium"), " ");
|
|
1014
1110
|
} }
|
|
1015
1111
|
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template(rf, ctx) { if (rf & 1) {
|
|
1016
|
-
i0.ɵɵelementStart(0, "div", 49)(1, "div",
|
|
1017
|
-
i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template, 7, 1, "div",
|
|
1018
|
-
i0.ɵɵelementStart(6, "div",
|
|
1112
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 142);
|
|
1113
|
+
i0.ɵɵtemplate(2, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_2_Template, 7, 1, "div", 143)(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_3_Template, 6, 1, "div", 143)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_4_Template, 6, 3, "div", 143)(5, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_5_Template, 6, 1, "div", 143);
|
|
1114
|
+
i0.ɵɵelementStart(6, "div", 143)(7, "label");
|
|
1019
1115
|
i0.ɵɵtext(8, "Temperature");
|
|
1020
1116
|
i0.ɵɵelementEnd();
|
|
1021
|
-
i0.ɵɵelementStart(9, "div",
|
|
1022
|
-
i0.ɵɵelement(10, "i",
|
|
1117
|
+
i0.ɵɵelementStart(9, "div", 144);
|
|
1118
|
+
i0.ɵɵelement(10, "i", 145);
|
|
1023
1119
|
i0.ɵɵtext(11);
|
|
1024
1120
|
i0.ɵɵelementEnd()();
|
|
1025
|
-
i0.ɵɵelementStart(12, "div",
|
|
1121
|
+
i0.ɵɵelementStart(12, "div", 143)(13, "label");
|
|
1026
1122
|
i0.ɵɵtext(14, "Top P");
|
|
1027
1123
|
i0.ɵɵelementEnd();
|
|
1028
|
-
i0.ɵɵelementStart(15, "div",
|
|
1029
|
-
i0.ɵɵelement(16, "i",
|
|
1124
|
+
i0.ɵɵelementStart(15, "div", 144);
|
|
1125
|
+
i0.ɵɵelement(16, "i", 146);
|
|
1030
1126
|
i0.ɵɵtext(17);
|
|
1031
1127
|
i0.ɵɵelementEnd()();
|
|
1032
|
-
i0.ɵɵelementStart(18, "div",
|
|
1128
|
+
i0.ɵɵelementStart(18, "div", 143)(19, "label");
|
|
1033
1129
|
i0.ɵɵtext(20, "Top K");
|
|
1034
1130
|
i0.ɵɵelementEnd();
|
|
1035
|
-
i0.ɵɵelementStart(21, "div",
|
|
1036
|
-
i0.ɵɵelement(22, "i",
|
|
1131
|
+
i0.ɵɵelementStart(21, "div", 144);
|
|
1132
|
+
i0.ɵɵelement(22, "i", 147);
|
|
1037
1133
|
i0.ɵɵtext(23);
|
|
1038
1134
|
i0.ɵɵelementEnd()();
|
|
1039
|
-
i0.ɵɵelementStart(24, "div",
|
|
1135
|
+
i0.ɵɵelementStart(24, "div", 143)(25, "label");
|
|
1040
1136
|
i0.ɵɵtext(26, "Min P");
|
|
1041
1137
|
i0.ɵɵelementEnd();
|
|
1042
|
-
i0.ɵɵelementStart(27, "div",
|
|
1043
|
-
i0.ɵɵelement(28, "i",
|
|
1138
|
+
i0.ɵɵelementStart(27, "div", 144);
|
|
1139
|
+
i0.ɵɵelement(28, "i", 148);
|
|
1044
1140
|
i0.ɵɵtext(29);
|
|
1045
1141
|
i0.ɵɵelementEnd()();
|
|
1046
|
-
i0.ɵɵelementStart(30, "div",
|
|
1142
|
+
i0.ɵɵelementStart(30, "div", 143)(31, "label");
|
|
1047
1143
|
i0.ɵɵtext(32, "Frequency Penalty");
|
|
1048
1144
|
i0.ɵɵelementEnd();
|
|
1049
|
-
i0.ɵɵelementStart(33, "div",
|
|
1050
|
-
i0.ɵɵelement(34, "i",
|
|
1145
|
+
i0.ɵɵelementStart(33, "div", 144);
|
|
1146
|
+
i0.ɵɵelement(34, "i", 111);
|
|
1051
1147
|
i0.ɵɵtext(35);
|
|
1052
1148
|
i0.ɵɵelementEnd()();
|
|
1053
|
-
i0.ɵɵelementStart(36, "div",
|
|
1149
|
+
i0.ɵɵelementStart(36, "div", 143)(37, "label");
|
|
1054
1150
|
i0.ɵɵtext(38, "Presence Penalty");
|
|
1055
1151
|
i0.ɵɵelementEnd();
|
|
1056
|
-
i0.ɵɵelementStart(39, "div",
|
|
1057
|
-
i0.ɵɵelement(40, "i",
|
|
1152
|
+
i0.ɵɵelementStart(39, "div", 144);
|
|
1153
|
+
i0.ɵɵelement(40, "i", 149);
|
|
1058
1154
|
i0.ɵɵtext(41);
|
|
1059
1155
|
i0.ɵɵelementEnd()();
|
|
1060
|
-
i0.ɵɵelementStart(42, "div",
|
|
1156
|
+
i0.ɵɵelementStart(42, "div", 143)(43, "label");
|
|
1061
1157
|
i0.ɵɵtext(44, "Seed");
|
|
1062
1158
|
i0.ɵɵelementEnd();
|
|
1063
|
-
i0.ɵɵelementStart(45, "div",
|
|
1064
|
-
i0.ɵɵelement(46, "i",
|
|
1159
|
+
i0.ɵɵelementStart(45, "div", 144);
|
|
1160
|
+
i0.ɵɵelement(46, "i", 150);
|
|
1065
1161
|
i0.ɵɵtext(47);
|
|
1066
1162
|
i0.ɵɵelementEnd()();
|
|
1067
|
-
i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template, 7, 4, "div",
|
|
1163
|
+
i0.ɵɵtemplate(48, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_48_Template, 7, 4, "div", 143)(49, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Conditional_49_Template, 7, 4, "div", 143);
|
|
1068
1164
|
i0.ɵɵelementEnd()();
|
|
1069
1165
|
} if (rf & 2) {
|
|
1070
1166
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1109,6 +1205,256 @@ function AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template(
|
|
|
1109
1205
|
i0.ɵɵadvance();
|
|
1110
1206
|
i0.ɵɵconditional(ctx_r1.record.CompletedAt ? 49 : -1);
|
|
1111
1207
|
} }
|
|
1208
|
+
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
1209
|
+
i0.ɵɵelementStart(0, "span", 47);
|
|
1210
|
+
i0.ɵɵelement(1, "i", 41);
|
|
1211
|
+
i0.ɵɵtext(2, " Model Specific Response Details ");
|
|
1212
|
+
i0.ɵɵelementStart(3, "span", 48);
|
|
1213
|
+
i0.ɵɵtext(4, "JSON");
|
|
1214
|
+
i0.ɵɵelementEnd()();
|
|
1215
|
+
} }
|
|
1216
|
+
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
1217
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
1218
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 57)(2, "div", 58)(3, "button", 59);
|
|
1219
|
+
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyToClipboard(ctx_r1.formattedModelSpecificResponseDetails, "Model Specific Response Details")); });
|
|
1220
|
+
i0.ɵɵelement(4, "i", 60);
|
|
1221
|
+
i0.ɵɵtext(5, " Copy ");
|
|
1222
|
+
i0.ɵɵelementEnd()();
|
|
1223
|
+
i0.ɵɵelementStart(6, "mj-code-editor", 155);
|
|
1224
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template_mj_code_editor_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSpecificResponseDetails, $event) || (ctx_r1.formattedModelSpecificResponseDetails = $event); return i0.ɵɵresetView($event); });
|
|
1225
|
+
i0.ɵɵelementEnd()()();
|
|
1226
|
+
} if (rf & 2) {
|
|
1227
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1228
|
+
i0.ɵɵadvance(6);
|
|
1229
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedModelSpecificResponseDetails);
|
|
1230
|
+
i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
|
|
1231
|
+
} }
|
|
1232
|
+
function AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_Template(rf, ctx) { if (rf & 1) {
|
|
1233
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 36);
|
|
1234
|
+
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_1_Template, 5, 0, "ng-template", 34)(2, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_ng_template_2_Template, 7, 4, "ng-template", 35);
|
|
1235
|
+
i0.ɵɵelementEnd();
|
|
1236
|
+
} if (rf & 2) {
|
|
1237
|
+
i0.ɵɵproperty("expanded", false);
|
|
1238
|
+
} }
|
|
1239
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
1240
|
+
i0.ɵɵelementStart(0, "span", 99);
|
|
1241
|
+
i0.ɵɵtext(1, "Cached");
|
|
1242
|
+
i0.ɵɵelementEnd();
|
|
1243
|
+
} }
|
|
1244
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1245
|
+
i0.ɵɵelementStart(0, "span", 99);
|
|
1246
|
+
i0.ɵɵtext(1, "Selected");
|
|
1247
|
+
i0.ɵɵelementEnd();
|
|
1248
|
+
} }
|
|
1249
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Template(rf, ctx) { if (rf & 1) {
|
|
1250
|
+
i0.ɵɵelementStart(0, "span", 47);
|
|
1251
|
+
i0.ɵɵelement(1, "i", 41);
|
|
1252
|
+
i0.ɵɵtext(2, " Model Selection & Performance ");
|
|
1253
|
+
i0.ɵɵtemplate(3, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_3_Template, 2, 0, "span", 99)(4, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Conditional_4_Template, 2, 0, "span", 99);
|
|
1254
|
+
i0.ɵɵelementEnd();
|
|
1255
|
+
} if (rf & 2) {
|
|
1256
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1257
|
+
i0.ɵɵadvance(3);
|
|
1258
|
+
i0.ɵɵconditional(ctx_r1.record.CacheHit ? 3 : -1);
|
|
1259
|
+
i0.ɵɵadvance();
|
|
1260
|
+
i0.ɵɵconditional(ctx_r1.record.WasSelectedResult ? 4 : -1);
|
|
1261
|
+
} }
|
|
1262
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
1263
|
+
i0.ɵɵelementStart(0, "div", 158)(1, "label");
|
|
1264
|
+
i0.ɵɵtext(2, "Cache Key");
|
|
1265
|
+
i0.ɵɵelementEnd();
|
|
1266
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1267
|
+
i0.ɵɵelement(4, "i", 161);
|
|
1268
|
+
i0.ɵɵelementStart(5, "code");
|
|
1269
|
+
i0.ɵɵtext(6);
|
|
1270
|
+
i0.ɵɵelementEnd()()();
|
|
1271
|
+
} if (rf & 2) {
|
|
1272
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1273
|
+
i0.ɵɵadvance(6);
|
|
1274
|
+
i0.ɵɵtextInterpolate(ctx_r1.record.CacheKey);
|
|
1275
|
+
} }
|
|
1276
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
1277
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
1278
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
1279
|
+
i0.ɵɵtext(2, "Judge Prompt");
|
|
1280
|
+
i0.ɵɵelementEnd();
|
|
1281
|
+
i0.ɵɵelementStart(3, "div", 162);
|
|
1282
|
+
i0.ɵɵlistener("click", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.navigateToEntity("AI Prompts", ctx_r1.record.JudgeID)); });
|
|
1283
|
+
i0.ɵɵelement(4, "i", 163);
|
|
1284
|
+
i0.ɵɵtext(5);
|
|
1285
|
+
i0.ɵɵelement(6, "i", 97);
|
|
1286
|
+
i0.ɵɵelementEnd()();
|
|
1287
|
+
} if (rf & 2) {
|
|
1288
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1289
|
+
i0.ɵɵadvance(5);
|
|
1290
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Judge || "Unknown", " ");
|
|
1291
|
+
} }
|
|
1292
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
1293
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
1294
|
+
i0.ɵɵtext(2, "Judge Score");
|
|
1295
|
+
i0.ɵɵelementEnd();
|
|
1296
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1297
|
+
i0.ɵɵelement(4, "i", 164);
|
|
1298
|
+
i0.ɵɵtext(5);
|
|
1299
|
+
i0.ɵɵelementEnd()();
|
|
1300
|
+
} if (rf & 2) {
|
|
1301
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1302
|
+
i0.ɵɵadvance(5);
|
|
1303
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.JudgeScore, " ");
|
|
1304
|
+
} }
|
|
1305
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
1306
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
1307
|
+
i0.ɵɵtext(2, "First Token Time");
|
|
1308
|
+
i0.ɵɵelementEnd();
|
|
1309
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1310
|
+
i0.ɵɵelement(4, "i", 165);
|
|
1311
|
+
i0.ɵɵtext(5);
|
|
1312
|
+
i0.ɵɵelementEnd()();
|
|
1313
|
+
} if (rf & 2) {
|
|
1314
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1315
|
+
i0.ɵɵadvance(5);
|
|
1316
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.FirstTokenTime, " ms ");
|
|
1317
|
+
} }
|
|
1318
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1319
|
+
i0.ɵɵelementStart(0, "div", 158)(1, "label");
|
|
1320
|
+
i0.ɵɵtext(2, "Cancellation Reason");
|
|
1321
|
+
i0.ɵɵelementEnd();
|
|
1322
|
+
i0.ɵɵelementStart(3, "div", 144);
|
|
1323
|
+
i0.ɵɵelement(4, "i", 168);
|
|
1324
|
+
i0.ɵɵtext(5);
|
|
1325
|
+
i0.ɵɵelementEnd()();
|
|
1326
|
+
} if (rf & 2) {
|
|
1327
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1328
|
+
i0.ɵɵadvance(5);
|
|
1329
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.CancellationReason, " ");
|
|
1330
|
+
} }
|
|
1331
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
1332
|
+
i0.ɵɵelementStart(0, "div", 143)(1, "label");
|
|
1333
|
+
i0.ɵɵtext(2, "Cancelled");
|
|
1334
|
+
i0.ɵɵelementEnd();
|
|
1335
|
+
i0.ɵɵelementStart(3, "div", 166);
|
|
1336
|
+
i0.ɵɵelement(4, "i", 167);
|
|
1337
|
+
i0.ɵɵtext(5, " Yes ");
|
|
1338
|
+
i0.ɵɵelementEnd()();
|
|
1339
|
+
i0.ɵɵtemplate(6, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Conditional_6_Template, 6, 1, "div", 158);
|
|
1340
|
+
} if (rf & 2) {
|
|
1341
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1342
|
+
i0.ɵɵadvance(6);
|
|
1343
|
+
i0.ɵɵconditional(ctx_r1.record.CancellationReason ? 6 : -1);
|
|
1344
|
+
} }
|
|
1345
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
1346
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
1347
|
+
i0.ɵɵelementStart(0, "div", 159)(1, "h4");
|
|
1348
|
+
i0.ɵɵtext(2, "Model Selection Details");
|
|
1349
|
+
i0.ɵɵelementEnd();
|
|
1350
|
+
i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 169);
|
|
1351
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedModelSelection, $event) || (ctx_r1.formattedModelSelection = $event); return i0.ɵɵresetView($event); });
|
|
1352
|
+
i0.ɵɵelementEnd()()();
|
|
1353
|
+
} if (rf & 2) {
|
|
1354
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1355
|
+
i0.ɵɵadvance(4);
|
|
1356
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedModelSelection);
|
|
1357
|
+
i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
|
|
1358
|
+
} }
|
|
1359
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
1360
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
1361
|
+
i0.ɵɵelementStart(0, "div", 160)(1, "h4");
|
|
1362
|
+
i0.ɵɵtext(2, "Error Details");
|
|
1363
|
+
i0.ɵɵelementEnd();
|
|
1364
|
+
i0.ɵɵelementStart(3, "div", 123)(4, "mj-code-editor", 170);
|
|
1365
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template_mj_code_editor_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formattedErrorDetails, $event) || (ctx_r1.formattedErrorDetails = $event); return i0.ɵɵresetView($event); });
|
|
1366
|
+
i0.ɵɵelementEnd()()();
|
|
1367
|
+
} if (rf & 2) {
|
|
1368
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1369
|
+
i0.ɵɵadvance(4);
|
|
1370
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formattedErrorDetails);
|
|
1371
|
+
i0.ɵɵproperty("readonly", true)("language", "json")("lineWrapping", true);
|
|
1372
|
+
} }
|
|
1373
|
+
function AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Template(rf, ctx) { if (rf & 1) {
|
|
1374
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 142)(2, "div", 143)(3, "label");
|
|
1375
|
+
i0.ɵɵtext(4, "Status");
|
|
1376
|
+
i0.ɵɵelementEnd();
|
|
1377
|
+
i0.ɵɵelementStart(5, "div", 144);
|
|
1378
|
+
i0.ɵɵelement(6, "i", 141);
|
|
1379
|
+
i0.ɵɵtext(7);
|
|
1380
|
+
i0.ɵɵelementEnd()();
|
|
1381
|
+
i0.ɵɵelementStart(8, "div", 143)(9, "label");
|
|
1382
|
+
i0.ɵɵtext(10, "Selection Strategy");
|
|
1383
|
+
i0.ɵɵelementEnd();
|
|
1384
|
+
i0.ɵɵelementStart(11, "div", 144);
|
|
1385
|
+
i0.ɵɵelement(12, "i", 156);
|
|
1386
|
+
i0.ɵɵtext(13);
|
|
1387
|
+
i0.ɵɵelementEnd()();
|
|
1388
|
+
i0.ɵɵelementStart(14, "div", 143)(15, "label");
|
|
1389
|
+
i0.ɵɵtext(16, "Model Power Rank");
|
|
1390
|
+
i0.ɵɵelementEnd();
|
|
1391
|
+
i0.ɵɵelementStart(17, "div", 144);
|
|
1392
|
+
i0.ɵɵelement(18, "i", 157);
|
|
1393
|
+
i0.ɵɵtext(19);
|
|
1394
|
+
i0.ɵɵelementEnd()();
|
|
1395
|
+
i0.ɵɵelementStart(20, "div", 143)(21, "label");
|
|
1396
|
+
i0.ɵɵtext(22, "Cache Hit");
|
|
1397
|
+
i0.ɵɵelementEnd();
|
|
1398
|
+
i0.ɵɵelementStart(23, "div", 144);
|
|
1399
|
+
i0.ɵɵelement(24, "i");
|
|
1400
|
+
i0.ɵɵtext(25);
|
|
1401
|
+
i0.ɵɵelementEnd()();
|
|
1402
|
+
i0.ɵɵtemplate(26, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_26_Template, 7, 1, "div", 158)(27, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_27_Template, 7, 1, "div", 143)(28, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_28_Template, 6, 1, "div", 143);
|
|
1403
|
+
i0.ɵɵelementStart(29, "div", 143)(30, "label");
|
|
1404
|
+
i0.ɵɵtext(31, "Was Selected Result");
|
|
1405
|
+
i0.ɵɵelementEnd();
|
|
1406
|
+
i0.ɵɵelementStart(32, "div", 144);
|
|
1407
|
+
i0.ɵɵelement(33, "i");
|
|
1408
|
+
i0.ɵɵtext(34);
|
|
1409
|
+
i0.ɵɵelementEnd()();
|
|
1410
|
+
i0.ɵɵelementStart(35, "div", 143)(36, "label");
|
|
1411
|
+
i0.ɵɵtext(37, "Streaming Enabled");
|
|
1412
|
+
i0.ɵɵelementEnd();
|
|
1413
|
+
i0.ɵɵelementStart(38, "div", 144);
|
|
1414
|
+
i0.ɵɵelement(39, "i");
|
|
1415
|
+
i0.ɵɵtext(40);
|
|
1416
|
+
i0.ɵɵelementEnd()();
|
|
1417
|
+
i0.ɵɵtemplate(41, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_41_Template, 6, 1, "div", 143)(42, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_42_Template, 7, 1);
|
|
1418
|
+
i0.ɵɵelementEnd();
|
|
1419
|
+
i0.ɵɵtemplate(43, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_43_Template, 5, 4, "div", 159)(44, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Conditional_44_Template, 5, 4, "div", 160);
|
|
1420
|
+
i0.ɵɵelementEnd();
|
|
1421
|
+
} if (rf & 2) {
|
|
1422
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1423
|
+
i0.ɵɵadvance(7);
|
|
1424
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.Status || "Unknown", " ");
|
|
1425
|
+
i0.ɵɵadvance(6);
|
|
1426
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.SelectionStrategy || "\u2014", " ");
|
|
1427
|
+
i0.ɵɵadvance(4);
|
|
1428
|
+
i0.ɵɵclassProp("null-value", ctx_r1.record.ModelPowerRank === null);
|
|
1429
|
+
i0.ɵɵadvance(2);
|
|
1430
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.ModelPowerRank !== null ? ctx_r1.record.ModelPowerRank : "\u2014", " ");
|
|
1431
|
+
i0.ɵɵadvance(5);
|
|
1432
|
+
i0.ɵɵclassMap(ctx_r1.record.CacheHit ? "fa-solid fa-check-circle" : "fa-solid fa-times-circle");
|
|
1433
|
+
i0.ɵɵadvance();
|
|
1434
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.CacheHit ? "Yes" : "No", " ");
|
|
1435
|
+
i0.ɵɵadvance();
|
|
1436
|
+
i0.ɵɵconditional(ctx_r1.record.CacheKey ? 26 : -1);
|
|
1437
|
+
i0.ɵɵadvance();
|
|
1438
|
+
i0.ɵɵconditional(ctx_r1.record.JudgeID ? 27 : -1);
|
|
1439
|
+
i0.ɵɵadvance();
|
|
1440
|
+
i0.ɵɵconditional(ctx_r1.record.JudgeScore !== null ? 28 : -1);
|
|
1441
|
+
i0.ɵɵadvance(5);
|
|
1442
|
+
i0.ɵɵclassMap(ctx_r1.record.WasSelectedResult ? "fa-solid fa-trophy" : "fa-solid fa-times");
|
|
1443
|
+
i0.ɵɵadvance();
|
|
1444
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.WasSelectedResult ? "Yes" : "No", " ");
|
|
1445
|
+
i0.ɵɵadvance(5);
|
|
1446
|
+
i0.ɵɵclassMap(ctx_r1.record.StreamingEnabled ? "fa-solid fa-stream" : "fa-solid fa-ban");
|
|
1447
|
+
i0.ɵɵadvance();
|
|
1448
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.record.StreamingEnabled ? "Yes" : "No", " ");
|
|
1449
|
+
i0.ɵɵadvance();
|
|
1450
|
+
i0.ɵɵconditional(ctx_r1.record.FirstTokenTime !== null ? 41 : -1);
|
|
1451
|
+
i0.ɵɵadvance();
|
|
1452
|
+
i0.ɵɵconditional(ctx_r1.record.Cancelled ? 42 : -1);
|
|
1453
|
+
i0.ɵɵadvance();
|
|
1454
|
+
i0.ɵɵconditional(ctx_r1.record.ModelSelection ? 43 : -1);
|
|
1455
|
+
i0.ɵɵadvance();
|
|
1456
|
+
i0.ɵɵconditional(ctx_r1.record.ErrorDetails ? 44 : -1);
|
|
1457
|
+
} }
|
|
1112
1458
|
function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1113
1459
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1114
1460
|
i0.ɵɵelementStart(0, "form", 2, 0);
|
|
@@ -1169,11 +1515,15 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
|
|
|
1169
1515
|
i0.ɵɵtemplate(56, AIPromptRunFormComponentExtended_Conditional_1_ng_template_56_Template, 5, 2, "ng-template", 34)(57, AIPromptRunFormComponentExtended_Conditional_1_ng_template_57_Template, 4, 2, "ng-template", 35);
|
|
1170
1516
|
i0.ɵɵelementEnd();
|
|
1171
1517
|
i0.ɵɵelementStart(58, "kendo-panelbar-item", 36);
|
|
1172
|
-
i0.ɵɵtemplate(59, AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template, 3, 0, "ng-template", 34)(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template,
|
|
1518
|
+
i0.ɵɵtemplate(59, AIPromptRunFormComponentExtended_Conditional_1_ng_template_59_Template, 3, 0, "ng-template", 34)(60, AIPromptRunFormComponentExtended_Conditional_1_ng_template_60_Template, 42, 15, "ng-template", 35);
|
|
1173
1519
|
i0.ɵɵelementEnd();
|
|
1174
1520
|
i0.ɵɵtemplate(61, AIPromptRunFormComponentExtended_Conditional_1_Conditional_61_Template, 3, 1, "kendo-panelbar-item", 36)(62, AIPromptRunFormComponentExtended_Conditional_1_Conditional_62_Template, 3, 1, "kendo-panelbar-item", 36);
|
|
1175
1521
|
i0.ɵɵelementStart(63, "kendo-panelbar-item", 36);
|
|
1176
1522
|
i0.ɵɵtemplate(64, AIPromptRunFormComponentExtended_Conditional_1_ng_template_64_Template, 3, 0, "ng-template", 34)(65, AIPromptRunFormComponentExtended_Conditional_1_ng_template_65_Template, 50, 27, "ng-template", 35);
|
|
1523
|
+
i0.ɵɵelementEnd();
|
|
1524
|
+
i0.ɵɵtemplate(66, AIPromptRunFormComponentExtended_Conditional_1_Conditional_66_Template, 3, 1, "kendo-panelbar-item", 36);
|
|
1525
|
+
i0.ɵɵelementStart(67, "kendo-panelbar-item", 36);
|
|
1526
|
+
i0.ɵɵtemplate(68, AIPromptRunFormComponentExtended_Conditional_1_ng_template_68_Template, 5, 2, "ng-template", 34)(69, AIPromptRunFormComponentExtended_Conditional_1_ng_template_69_Template, 45, 21, "ng-template", 35);
|
|
1177
1527
|
i0.ɵɵelementEnd()()()();
|
|
1178
1528
|
} if (rf & 2) {
|
|
1179
1529
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1224,6 +1574,10 @@ function AIPromptRunFormComponentExtended_Conditional_1_Template(rf, ctx) { if (
|
|
|
1224
1574
|
i0.ɵɵconditional(ctx_r1.record.ParentID || ctx_r1.childRuns.length > 0 ? 62 : -1);
|
|
1225
1575
|
i0.ɵɵadvance();
|
|
1226
1576
|
i0.ɵɵproperty("expanded", false);
|
|
1577
|
+
i0.ɵɵadvance(3);
|
|
1578
|
+
i0.ɵɵconditional(ctx_r1.record.ModelSpecificResponseDetails ? 66 : -1);
|
|
1579
|
+
i0.ɵɵadvance();
|
|
1580
|
+
i0.ɵɵproperty("expanded", false);
|
|
1227
1581
|
} }
|
|
1228
1582
|
let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended extends AIPromptRunFormComponent {
|
|
1229
1583
|
constructor(elementRef, sharedService, router, route, cdr, testHarnessWindowService, viewContainerRef) {
|
|
@@ -1253,6 +1607,9 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
|
|
|
1253
1607
|
this.formattedValidationSummary = '';
|
|
1254
1608
|
this.formattedValidationAttempts = '';
|
|
1255
1609
|
this.formattedData = '';
|
|
1610
|
+
this.formattedModelSelection = '';
|
|
1611
|
+
this.formattedErrorDetails = '';
|
|
1612
|
+
this.formattedModelSpecificResponseDetails = '';
|
|
1256
1613
|
// Parsed input data
|
|
1257
1614
|
this.chatMessages = [];
|
|
1258
1615
|
this.inputData = null;
|
|
@@ -1274,6 +1631,11 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
|
|
|
1274
1631
|
this.cdr.detectChanges();
|
|
1275
1632
|
}, 0);
|
|
1276
1633
|
}
|
|
1634
|
+
ngOnDestroy() {
|
|
1635
|
+
// Clean up any resources
|
|
1636
|
+
// Currently no subscriptions or timers to clean up
|
|
1637
|
+
// This is here for future use and to complete the lifecycle
|
|
1638
|
+
}
|
|
1277
1639
|
onInputPanelToggle() {
|
|
1278
1640
|
// Force change detection when parent panel is toggled
|
|
1279
1641
|
// This helps ensure nested expansion panels render correctly
|
|
@@ -1341,6 +1703,45 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
|
|
|
1341
1703
|
this.isParsingMessages = false; // Done parsing
|
|
1342
1704
|
// Format result using extended entity method
|
|
1343
1705
|
this.formattedResult = this.record.GetFormattedResult();
|
|
1706
|
+
// Format v2.78 JSON fields
|
|
1707
|
+
const parseOptions = {
|
|
1708
|
+
extractInlineJson: true,
|
|
1709
|
+
maxDepth: 100,
|
|
1710
|
+
debug: false
|
|
1711
|
+
};
|
|
1712
|
+
// Format ModelSelection
|
|
1713
|
+
if (this.record.ModelSelection) {
|
|
1714
|
+
try {
|
|
1715
|
+
const modelSelection = JSON.parse(this.record.ModelSelection);
|
|
1716
|
+
const parsed = ParseJSONRecursive(modelSelection, parseOptions);
|
|
1717
|
+
this.formattedModelSelection = JSON.stringify(parsed, null, 2);
|
|
1718
|
+
}
|
|
1719
|
+
catch (error) {
|
|
1720
|
+
this.formattedModelSelection = this.record.ModelSelection;
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
// Format ErrorDetails
|
|
1724
|
+
if (this.record.ErrorDetails) {
|
|
1725
|
+
try {
|
|
1726
|
+
const errorDetails = JSON.parse(this.record.ErrorDetails);
|
|
1727
|
+
const parsed = ParseJSONRecursive(errorDetails, parseOptions);
|
|
1728
|
+
this.formattedErrorDetails = JSON.stringify(parsed, null, 2);
|
|
1729
|
+
}
|
|
1730
|
+
catch (error) {
|
|
1731
|
+
this.formattedErrorDetails = this.record.ErrorDetails;
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
// Format ModelSpecificResponseDetails
|
|
1735
|
+
if (this.record.ModelSpecificResponseDetails) {
|
|
1736
|
+
try {
|
|
1737
|
+
const modelDetails = JSON.parse(this.record.ModelSpecificResponseDetails);
|
|
1738
|
+
const parsed = ParseJSONRecursive(modelDetails, parseOptions);
|
|
1739
|
+
this.formattedModelSpecificResponseDetails = JSON.stringify(parsed, null, 2);
|
|
1740
|
+
}
|
|
1741
|
+
catch (error) {
|
|
1742
|
+
this.formattedModelSpecificResponseDetails = this.record.ModelSpecificResponseDetails;
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1344
1745
|
}
|
|
1345
1746
|
getStatusColor() {
|
|
1346
1747
|
if (!this.record)
|
|
@@ -1544,14 +1945,14 @@ let AIPromptRunFormComponentExtended = class AIPromptRunFormComponentExtended ex
|
|
|
1544
1945
|
this.validationExpanded = (this.record.ValidationAttemptCount || 0) > 1;
|
|
1545
1946
|
}
|
|
1546
1947
|
static { this.ɵfac = function AIPromptRunFormComponentExtended_Factory(t) { return new (t || AIPromptRunFormComponentExtended)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i2.Router), i0.ɵɵdirectiveInject(i2.ActivatedRoute), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.TestHarnessWindowService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); }; }
|
|
1547
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIPromptRunFormComponentExtended, selectors: [["mj-ai-prompt-run-form"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["form", "ngForm"], [1, "record-form-container"], [1, "record-form"], [3, "form"], [1, "prompt-run-header"], [1, "header-content"], [1, "run-overview"], [1, "run-icon-wrapper"], [1, "run-info"], [1, "run-title"], [1, "run-id"], [1, "run-meta"], [1, "status-badge"], [1, "run-type-badge", 3, "color"], ["title", "View Prompt", 1, "prompt-name"], ["title", "View Model", 1, "model-name"], ["title", "View Vendor", 1, "vendor-name"], ["title", "View Original Run", 1, "original-run"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Re-run this prompt", 3, "click"], [1, "fa-solid", "fa-play-circle"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "keepItemContent"], [3, "stateChange", "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [3, "expanded"], [1, "run-type-badge"], ["title", "View Prompt", 1, "prompt-name", 3, "click"], [1, "fa-solid", "fa-comment-dots"], ["title", "View Model", 1, "model-name", 3, "click"], [1, "fa-solid", "fa-microchip"], ["title", "View Vendor", 1, "vendor-name", 3, "click"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-level-up-alt"], [1, "original-link", 3, "click"], [1, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-
|
|
1948
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIPromptRunFormComponentExtended, selectors: [["mj-ai-prompt-run-form"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["form", "ngForm"], [1, "record-form-container"], [1, "record-form"], [3, "form"], [1, "prompt-run-header"], [1, "header-content"], [1, "run-overview"], [1, "run-icon-wrapper"], [1, "run-info"], [1, "run-title"], [1, "run-id"], [1, "run-meta"], [1, "status-badge"], [1, "run-type-badge", 3, "color"], ["title", "View Prompt", 1, "prompt-name"], ["title", "View Model", 1, "model-name"], ["title", "View Vendor", 1, "vendor-name"], ["title", "View Original Run", 1, "original-run"], [1, "run-actions"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Re-run this prompt", 3, "click"], [1, "fa-solid", "fa-play-circle"], ["kendoButton", "", "fillMode", "outline", "size", "small", "title", "Refresh data", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "metrics-bar"], [1, "metric-item"], [1, "fa-solid", "fa-clock"], [1, "metric-content"], [1, "metric-label"], [1, "metric-value"], [1, "fa-solid", "fa-coins"], [1, "fa-solid", "fa-dollar-sign"], [1, "form-content"], [3, "keepItemContent"], [3, "stateChange", "expanded"], ["kendoPanelBarItemTitle", ""], ["kendoPanelBarContent", ""], [3, "expanded"], [1, "run-type-badge"], ["title", "View Prompt", 1, "prompt-name", 3, "click"], [1, "fa-solid", "fa-comment-dots"], ["title", "View Model", 1, "model-name", 3, "click"], [1, "fa-solid", "fa-microchip"], ["title", "View Vendor", 1, "vendor-name", 3, "click"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-level-up-alt"], [1, "original-link", 3, "click"], [1, "fa-solid", "fa-calendar"], [1, "panel-title"], [1, "panel-badge"], [1, "panel-content"], [1, "nested-panels"], [1, "empty-state"], [1, "sub-expansion-panel", 3, "expanded", "animation"], ["kendoExpansionPanelTitleDirective", ""], [1, "sub-panel-content"], [1, "loading-state"], [3, "messages"], [1, "json-editor-container"], [1, "json-toolbar"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Copy JSON", 3, "click"], [1, "fa-solid", "fa-copy"], ["name", "formattedMessages", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "sub-panel-title"], [1, "fa-solid", "fa-comments"], [1, "panel-count"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-comment-slash"], [1, "fa-solid", "fa-database"], ["name", "formattedData", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-code"], [1, "fa-solid", "fa-square-check"], [1, "panel-badge", "error"], [1, "error-message"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "error-content"], ["name", "formattedResult", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-inbox"], [1, "error-info"], [1, "finish-reason"], [1, "error-details"], [1, "error-hint"], [2, "height", "200px", "width", "100%", 3, "ngModel", "disabled", "language", "lineWrapping"], [1, "fa-solid", "fa-chart-line"], [1, "metrics-grid"], [1, "metric-card"], [1, "metric-header"], [1, "fa-solid", "fa-message"], [1, "metric-value", "large"], [1, "metric-rollup"], [1, "fa-solid", "fa-reply"], [1, "metric-currency"], [1, "additional-metrics"], [1, "metric-row"], [1, "fa-solid", "fa-hourglass-start"], [1, "fa-solid", "fa-brain"], [1, "fa-solid", "fa-flag-checkered"], [1, "metric-value", "link", 3, "click"], [1, "fa-solid", "fa-external-link"], [1, "fa-solid", "fa-shield-check"], [1, "panel-badge", "success"], [1, "validation-summary"], [1, "summary-header"], [1, "validation-status"], [1, "validation-metrics"], [1, "metric-card", "small"], [1, "validation-error"], [1, "common-error"], [1, "retry-timeline"], [1, "validation-attempts"], [1, "validation-json"], [1, "error-count"], [1, "fa-solid", "fa-repeat"], [1, "timeline-info"], [1, "timeline-stat"], [1, "fa-solid", "fa-stopwatch"], [1, "attempts-list"], [1, "attempt-item", 3, "success", "failed"], [1, "attempt-item"], [1, "attempt-number"], [1, "attempt-details"], [1, "attempt-time"], [1, "output-length"], [1, "attempt-error"], [1, "json-viewer-container"], ["name", "formattedValidationSummary", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedValidationAttempts", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-sitemap"], [1, "parent-run-section"], [1, "child-runs-section"], [1, "run-item", "parent", 3, "click"], [1, "run-item-icon"], [1, "run-item-content"], [1, "run-item-title"], [1, "run-item-type"], [1, "run-item-meta"], [1, "fa-solid", "fa-level-down-alt"], [1, "runs-list"], [1, "run-item", "child"], [1, "run-item", "child", 3, "click"], [1, "execution-order"], [1, "status-indicator"], [1, "fa-solid", "fa-info-circle"], [1, "detail-fields-grid"], [1, "detail-field"], [1, "detail-value"], [1, "fa-solid", "fa-temperature-high"], [1, "fa-solid", "fa-percentage"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-plus-circle"], [1, "fa-solid", "fa-seedling"], ["title", "View Agent", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-cog"], [1, "fa-solid", "fa-check-circle"], ["name", "formattedModelSpecificResponseDetails", 2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], [1, "fa-solid", "fa-strategy"], [1, "fa-solid", "fa-ranking-star"], [1, "detail-field", "full-width"], [1, "model-selection-json"], [1, "error-details-json"], [1, "fa-solid", "fa-key"], ["title", "View Judge Prompt", 1, "detail-value", "clickable", 3, "click"], [1, "fa-solid", "fa-gavel"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-bolt"], [1, "detail-value", "error"], [1, "fa-solid", "fa-ban"], [1, "fa-solid", "fa-exclamation-circle"], ["name", "formattedModelSelection", 2, "height", "300px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"], ["name", "formattedErrorDetails", 2, "height", "200px", "width", "100%", 3, "ngModelChange", "ngModel", "readonly", "language", "lineWrapping"]], template: function AIPromptRunFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1548
1949
|
i0.ɵɵelementStart(0, "div", 1);
|
|
1549
|
-
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template,
|
|
1950
|
+
i0.ɵɵtemplate(1, AIPromptRunFormComponentExtended_Conditional_1_Template, 70, 31, "form", 2);
|
|
1550
1951
|
i0.ɵɵelementEnd();
|
|
1551
1952
|
} if (rf & 2) {
|
|
1552
1953
|
i0.ɵɵadvance();
|
|
1553
1954
|
i0.ɵɵconditional(ctx.record ? 1 : -1);
|
|
1554
|
-
} }, dependencies: [i4.ɵNgNoValidate, i4.NgControlStatus, i4.NgControlStatusGroup, i4.NgModel, i4.NgForm, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.PanelBarItemTitleDirective, i5.ExpansionPanelComponent, i5.ExpansionPanelTitleDirective, i6.ButtonComponent, i7.FormToolbarComponent, i8.CodeEditorComponent, i9.ChatMessageViewerComponent, i10.DatePipe], styles: ["\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"] }); }
|
|
1955
|
+
} }, dependencies: [i4.ɵNgNoValidate, i4.NgControlStatus, i4.NgControlStatusGroup, i4.NgModel, i4.NgForm, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.PanelBarItemTitleDirective, i5.ExpansionPanelComponent, i5.ExpansionPanelTitleDirective, i6.ButtonComponent, i7.FormToolbarComponent, i8.CodeEditorComponent, i9.ChatMessageViewerComponent, i10.DatePipe], styles: ["\n\n.error-info[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 16px;\n background-color: #fef3f3;\n border: 1px solid #fecaca;\n border-radius: 8px;\n}\n\n.finish-reason[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: #dc2626;\n font-size: 14px;\n}\n\n.error-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n}\n\n.error-details[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n}\n\n.error-hint[_ngcontent-%COMP%] {\n margin: 0;\n color: #7f1d1d;\n font-size: 14px;\n font-style: italic;\n}\n\n\n\n.prompt-run-header[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n.run-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id[_ngcontent-%COMP%] {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.9em;\n}\n\n.run-type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name[_ngcontent-%COMP%], .model-name[_ngcontent-%COMP%], .vendor-name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name[_ngcontent-%COMP%]:hover, .model-name[_ngcontent-%COMP%]:hover, .vendor-name[_ngcontent-%COMP%]:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link[_ngcontent-%COMP%] {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link[_ngcontent-%COMP%]:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.metrics-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label[_ngcontent-%COMP%] {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value[_ngcontent-%COMP%] {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n\n\n.form-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n\n\n.sub-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] > .k-item.k-expanded[_ngcontent-%COMP%] > .k-link[_ngcontent-%COMP%] {\n background-color: #f3f4f6;\n}\n\n.k-panelbar[_ngcontent-%COMP%] .k-panelbar[_ngcontent-%COMP%] .k-content[_ngcontent-%COMP%] {\n padding: 0;\n background: white;\n}\n\n\n\n.sub-panel-content[_ngcontent-%COMP%] mj-chat-message-viewer[_ngcontent-%COMP%] {\n display: block;\n min-height: 200px;\n max-height: 750px; \n\n height: auto;\n overflow: hidden;\n}\n\n\n\n.sub-expansion-panel[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel[_ngcontent-%COMP%] .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error[_ngcontent-%COMP%] {\n background: #dc3545;\n color: white;\n}\n\n.panel-count[_ngcontent-%COMP%] {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content[_ngcontent-%COMP%] {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.json-editor-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar[_ngcontent-%COMP%] {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large[_ngcontent-%COMP%] {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup[_ngcontent-%COMP%] {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency[_ngcontent-%COMP%] {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n\n\n.additional-metrics[_ngcontent-%COMP%] {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%] {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row[_ngcontent-%COMP%] .metric-value.link[_ngcontent-%COMP%]:hover {\n color: #0056b3;\n}\n\n\n\n.parent-run-section[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.parent-run-section[_ngcontent-%COMP%]:last-child, \n.child-runs-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n.child-runs-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item[_ngcontent-%COMP%] {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent[_ngcontent-%COMP%] {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent[_ngcontent-%COMP%]:hover {\n background: #bbdefb;\n}\n\n.run-item-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order[_ngcontent-%COMP%] {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.run-item[_ngcontent-%COMP%] > i[_ngcontent-%COMP%]:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n\n\n.detail-fields-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%]:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n opacity: 0.5;\n}\n\n\n\nkendo-panelbar[_ngcontent-%COMP%] {\n border: none !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%] {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-header[_ngcontent-%COMP%]:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item[_ngcontent-%COMP%] .k-panelbar-content[_ngcontent-%COMP%] {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n\n\n.validation-summary[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success[_ngcontent-%COMP%] {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed[_ngcontent-%COMP%] {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-label[_ngcontent-%COMP%] {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small[_ngcontent-%COMP%] .metric-value[_ngcontent-%COMP%] {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.common-error[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n\n\n.retry-timeline[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.retry-timeline[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.1em;\n}\n\n\n\n.validation-attempts[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.validation-attempts[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.attempt-item.failed[_ngcontent-%COMP%] .attempt-number[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.attempt-details[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n.attempt-error[_ngcontent-%COMP%] {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length[_ngcontent-%COMP%] {\n color: #6c757d;\n font-style: italic;\n}\n\n\n\n.validation-json[_ngcontent-%COMP%] {\n margin-top: 24px;\n}\n\n.validation-json[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container[_ngcontent-%COMP%] {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n\n\n.panel-badge.success[_ngcontent-%COMP%] {\n background: #28a745;\n color: white;\n}"], changeDetection: 0 }); }
|
|
1555
1956
|
};
|
|
1556
1957
|
AIPromptRunFormComponentExtended = __decorate([
|
|
1557
1958
|
RegisterClass(BaseFormComponent, 'MJ: AI Prompt Runs')
|
|
@@ -1559,7 +1960,7 @@ AIPromptRunFormComponentExtended = __decorate([
|
|
|
1559
1960
|
export { AIPromptRunFormComponentExtended };
|
|
1560
1961
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIPromptRunFormComponentExtended, [{
|
|
1561
1962
|
type: Component,
|
|
1562
|
-
args: [{ selector: 'mj-ai-prompt-run-form', template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n @if (record.RerunFromPromptRunID) {\n <span class=\"original-run\" title=\"View Original Run\">\n <i class=\"fa-solid fa-level-up-alt\"></i>\n <a (click)=\"navigateToOriginalRun()\" class=\"original-link\">Original Run</a>\n </span>\n }\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"run-actions\">\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"reRunPrompt()\" title=\"Re-run this prompt\">\n <i class=\"fa-solid fa-play-circle\"></i>\n Re-Run\n </button>\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"refreshData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n \n <!-- Key Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Metrics Bar */\n.metrics-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item > i {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
|
|
1963
|
+
args: [{ selector: 'mj-ai-prompt-run-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"record-form-container\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\">\n <mj-form-toolbar [form]=\"this\"></mj-form-toolbar>\n\n <!-- Header Section -->\n <div class=\"prompt-run-header\">\n <div class=\"header-content\">\n <div class=\"run-overview\">\n <div class=\"run-icon-wrapper\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\" [style.color]=\"getStatusColor()\"></i>\n </div>\n <div class=\"run-info\">\n <h1 class=\"run-title\">\n Prompt Run\n @if (record.ID) {\n <span class=\"run-id\">#{{ record.ID.substring(0, 8) }}</span>\n }\n </h1>\n <div class=\"run-meta\">\n <span class=\"status-badge\" [style.background-color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ getStatusText() }}\n </span>\n @if (record.RunType) {\n <span class=\"run-type-badge\" [style.color]=\"getRunTypeColor(record.RunType)\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </span>\n }\n @if (prompt) {\n <span class=\"prompt-name\" (click)=\"navigateToEntity('AI Prompts', prompt.ID)\" title=\"View Prompt\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n {{ prompt.Name }}\n </span>\n }\n @if (model) {\n <span class=\"model-name\" (click)=\"navigateToEntity('AI Models', model.ID)\" title=\"View Model\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.Name }}\n </span>\n }\n @if (record.Vendor) {\n <span class=\"vendor-name\" (click)=\"navigateToEntity('MJ: AI Vendors', record.VendorID)\" title=\"View Vendor\">\n <i class=\"fa-solid fa-building\"></i>\n {{ record.Vendor }}\n </span>\n }\n @if (record.RerunFromPromptRunID) {\n <span class=\"original-run\" title=\"View Original Run\">\n <i class=\"fa-solid fa-level-up-alt\"></i>\n <a (click)=\"navigateToOriginalRun()\" class=\"original-link\">Original Run</a>\n </span>\n }\n </div>\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"run-actions\">\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"reRunPrompt()\" title=\"Re-run this prompt\">\n <i class=\"fa-solid fa-play-circle\"></i>\n Re-Run\n </button>\n <button kendoButton fillMode=\"outline\" size=\"small\" (click)=\"refreshData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n \n <!-- Key Metrics Bar -->\n <div class=\"metrics-bar\">\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Duration</div>\n <div class=\"metric-value\">{{ formatDuration(record.ExecutionTimeMS) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-coins\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Total Tokens</div>\n <div class=\"metric-value\">{{ formatTokens(record.TokensUsed) }}</div>\n </div>\n </div>\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Cost</div>\n <div class=\"metric-value\">{{ formatCost(record.TotalCost || record.Cost) }}</div>\n </div>\n </div>\n @if (record.RunAt) {\n <div class=\"metric-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <div class=\"metric-content\">\n <div class=\"metric-label\">Started</div>\n <div class=\"metric-value\">{{ record.RunAt | date:'short' }}</div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Main Content with Expansion Panels -->\n <div class=\"form-content\">\n <kendo-panelbar [keepItemContent]=\"true\">\n \n <!-- Input Panel with nested sub-panels -->\n <kendo-panelbar-item [expanded]=\"inputExpanded\" (stateChange)=\"onInputPanelToggle()\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n Input\n @if (record.Messages && record.Messages.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.Messages && record.Messages.trim() !== '') {\n <!-- Nested expansion panels for sub-sections -->\n <div class=\"nested-panels\">\n <!-- Messages Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"messagesExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Messages\n @if (chatMessages.length > 0) {\n <span class=\"panel-count\">({{ chatMessages.length }})</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (isParsingMessages || isLoadingRelatedData) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <p>Loading messages...</p>\n </div>\n } @else if (chatMessages.length > 0) {\n <mj-chat-message-viewer \n [messages]=\"chatMessages\">\n </mj-chat-message-viewer>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No chat messages found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Data Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"dataExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-database\"></i>\n Data\n @if (inputData) {\n <span class=\"panel-badge\">Object</span>\n }\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n @if (inputData && formattedData) {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedData, 'Data')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedData\"\n name=\"formattedData\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database\"></i>\n <p>No data object found</p>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n \n <!-- Raw Sub-Panel -->\n <kendo-expansionpanel \n [expanded]=\"rawExpanded\" \n class=\"sub-expansion-panel\"\n [animation]=\"false\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span class=\"sub-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Raw\n </span>\n </ng-template>\n <div class=\"sub-panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedMessages, 'Messages')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessages\"\n name=\"formattedMessages\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </kendo-expansionpanel>\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-comment-slash\"></i>\n <p>No input messages recorded</p>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Result Panel -->\n <kendo-panelbar-item [expanded]=\"resultExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-square-check\"></i>\n Result\n @if (record.Result && record.Result.trim() !== '') {\n <span class=\"panel-badge\">JSON</span>\n }\n @if (record.ErrorMessage) {\n <span class=\"panel-badge error\">Error</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (record.ErrorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <div class=\"error-content\">\n <h4>Error Message</h4>\n <p>{{ record.ErrorMessage }}</p>\n </div>\n </div>\n }\n \n @if (record.Result && record.Result.trim() !== '') {\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedResult, 'Result')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedResult\"\n name=\"formattedResult\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else if (!record.ErrorMessage) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No result data recorded</p>\n @if (record.Status === 'Failed' || record.Success === false) {\n <div class=\"error-info\">\n @if (record.Status) {\n <p class=\"finish-reason\">\n <strong>Status:</strong> {{ record.Status }}\n </p>\n }\n @if (formattedErrorDetails) {\n <div class=\"error-details\">\n <h4>Error Details</h4>\n <mj-code-editor\n [ngModel]=\"formattedErrorDetails\"\n [disabled]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n }\n @if (!formattedErrorDetails) {\n <p class=\"error-hint\">\n The prompt execution failed but no additional error information is available.\n </p>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Token Usage & Metrics Panel -->\n <kendo-panelbar-item [expanded]=\"metricsExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Token Usage & Metrics\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"metrics-grid\">\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-message\"></i>\n <h4>Prompt Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensPrompt) }}</div>\n @if (record.TokensPromptRollup && record.TokensPromptRollup !== record.TokensPrompt) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensPromptRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-reply\"></i>\n <h4>Completion Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensCompletion) }}</div>\n @if (record.TokensCompletionRollup && record.TokensCompletionRollup !== record.TokensCompletion) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensCompletionRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-coins\"></i>\n <h4>Total Tokens</h4>\n </div>\n <div class=\"metric-value large\">{{ formatTokens(record.TokensUsed) }}</div>\n @if (record.TokensUsedRollup && record.TokensUsedRollup !== record.TokensUsed) {\n <div class=\"metric-rollup\">\n <span>Rollup: {{ formatTokens(record.TokensUsedRollup) }}</span>\n </div>\n }\n </div>\n \n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-dollar-sign\"></i>\n <h4>Cost</h4>\n </div>\n <div class=\"metric-value large\">{{ formatCost(record.Cost) }}</div>\n @if (record.TotalCost && record.TotalCost !== record.Cost) {\n <div class=\"metric-rollup\">\n <span>Total: {{ formatCost(record.TotalCost) }}</span>\n </div>\n }\n @if (record.CostCurrency) {\n <div class=\"metric-currency\">{{ record.CostCurrency }}</div>\n }\n </div>\n \n <!-- Timing Metrics -->\n @if (record.QueueTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-hourglass-start\"></i>\n <h4>Queue Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.QueueTime) }}</div>\n </div>\n }\n \n @if (record.PromptTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-brain\"></i>\n <h4>Prompt Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.PromptTime) }}</div>\n </div>\n }\n \n @if (record.CompletionTime != null) {\n <div class=\"metric-card\">\n <div class=\"metric-header\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <h4>Completion Time</h4>\n </div>\n <div class=\"metric-value large\">{{ formatDuration(record.CompletionTime) }}</div>\n </div>\n }\n </div>\n \n <!-- Additional Metrics -->\n <div class=\"additional-metrics\">\n @if (record.ExecutionOrder !== null) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Execution Order:</span>\n <span class=\"metric-value\">{{ record.ExecutionOrder }}</span>\n </div>\n }\n @if (record.ConfigurationID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Configuration:</span>\n <span class=\"metric-value\">{{ record.Configuration }}</span>\n </div>\n }\n @if (record.AgentID) {\n <div class=\"metric-row\">\n <span class=\"metric-label\">Agent:</span>\n <span class=\"metric-value link\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\">\n {{ record.Agent }}\n <i class=\"fa-solid fa-external-link\"></i>\n </span>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Validation & Retry Panel -->\n @if (record && ((record.ValidationAttemptCount && record.ValidationAttemptCount > 0) || record.ValidationBehavior)) {\n <kendo-panelbar-item [expanded]=\"validationExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-check\"></i>\n Validation & Retries\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <span class=\"panel-count\">({{ record.ValidationAttemptCount }} attempts)</span>\n }\n @if (record.FinalValidationPassed) {\n <span class=\"panel-badge success\">Passed</span>\n } @else if (record.FinalValidationPassed === false) {\n <span class=\"panel-badge error\">Failed</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <!-- Validation Summary -->\n <div class=\"validation-summary\">\n <div class=\"summary-header\">\n <h4>Validation Summary</h4>\n <div class=\"validation-status\" [class.success]=\"record.FinalValidationPassed\" [class.failed]=\"!record.FinalValidationPassed\">\n <i [class]=\"record.FinalValidationPassed ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.FinalValidationPassed ? 'Validation Passed' : 'Validation Failed' }}\n </div>\n </div>\n \n <div class=\"validation-metrics\">\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Total Attempts</div>\n <div class=\"metric-value\">{{ record.ValidationAttemptCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Successful</div>\n <div class=\"metric-value\">{{ record.SuccessfulValidationCount || 0 }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Behavior</div>\n <div class=\"metric-value\">{{ record.ValidationBehavior || 'Not set' }}</div>\n </div>\n <div class=\"metric-card small\">\n <div class=\"metric-label\">Retry Strategy</div>\n <div class=\"metric-value\">{{ record.RetryStrategy || 'Not set' }}</div>\n </div>\n </div>\n \n @if (record.FinalValidationError) {\n <div class=\"validation-error\">\n <h5><i class=\"fa-solid fa-exclamation-triangle\"></i> Final Validation Error</h5>\n <p>{{ record.FinalValidationError }}</p>\n @if (record && record.ValidationErrorCount && record.ValidationErrorCount > 0) {\n <span class=\"error-count\">{{ record.ValidationErrorCount }} validation errors</span>\n }\n </div>\n }\n \n @if (record.CommonValidationError && record.CommonValidationError !== record.FinalValidationError) {\n <div class=\"common-error\">\n <h5><i class=\"fa-solid fa-repeat\"></i> Most Common Error</h5>\n <p>{{ record.CommonValidationError }}</p>\n </div>\n }\n </div>\n \n <!-- Retry Timeline -->\n @if (record && record.ValidationAttemptCount && record.ValidationAttemptCount > 1) {\n <div class=\"retry-timeline\">\n <h4>Retry Timeline</h4>\n <div class=\"timeline-info\">\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>First Attempt: {{ record.FirstAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-flag-checkered\"></i>\n <span>Last Attempt: {{ record.LastAttemptAt | date:'short' }}</span>\n </div>\n <div class=\"timeline-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n <span>Total Retry Duration: {{ formatDuration(record.TotalRetryDurationMS) }}</span>\n </div>\n </div>\n </div>\n }\n \n <!-- Validation Attempts Details -->\n @if (validationAttempts && validationAttempts.length > 0) {\n <div class=\"validation-attempts\">\n <h4>Validation Attempts</h4>\n <div class=\"attempts-list\">\n @for (attempt of validationAttempts; track attempt.attemptNumber) {\n <div class=\"attempt-item\" [class.success]=\"attempt.success\" [class.failed]=\"!attempt.success\">\n <div class=\"attempt-number\">\n <i [class]=\"attempt.success ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n Attempt #{{ attempt.attemptNumber }}\n </div>\n <div class=\"attempt-details\">\n <span class=\"attempt-time\">{{ attempt.timestamp }}</span>\n @if (!attempt.success) {\n <span class=\"attempt-error\">{{ attempt.errorMessage || 'Unknown error' }}</span>\n @if (attempt.validationErrorCount > 0) {\n <span class=\"error-count\">({{ attempt.validationErrorCount }} errors)</span>\n }\n }\n @if (attempt.outputLength) {\n <span class=\"output-length\">Output: {{ attempt.outputLength }} chars</span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Validation Summary JSON -->\n @if (validationSummary) {\n <div class=\"validation-json\">\n <h4>Validation Summary Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationSummary\"\n name=\"formattedValidationSummary\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Validation Attempts JSON -->\n @if (record.ValidationAttempts) {\n <div class=\"validation-json\">\n <h4>Validation Attempts (Raw JSON)</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedValidationAttempts\"\n name=\"formattedValidationAttempts\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Hierarchy Panel (for parent/child relationships) -->\n @if (record.ParentID || childRuns.length > 0) {\n <kendo-panelbar-item [expanded]=\"hierarchyExpanded\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sitemap\"></i>\n Run Hierarchy\n @if (childRuns.length > 0) {\n <span class=\"panel-count\">({{ childRuns.length }} children)</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n @if (parentRun) {\n <div class=\"parent-run-section\">\n <h4><i class=\"fa-solid fa-level-up-alt\"></i> Parent Run</h4>\n <div class=\"run-item parent\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', parentRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(parentRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Parent Run #{{ parentRun.ID.substring(0, 8) }}\n <span class=\"run-item-type\">{{ parentRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(parentRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(parentRun.TokensUsed) }}</span>\n <span><i class=\"fa-solid fa-calendar\"></i> {{ parentRun.RunAt | date:'short' }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (childRuns.length > 0) {\n <div class=\"child-runs-section\">\n <h4><i class=\"fa-solid fa-level-down-alt\"></i> Child Runs</h4>\n <div class=\"runs-list\">\n @for (childRun of childRuns; track childRun.ID) {\n <div class=\"run-item child\" (click)=\"navigateToEntity('MJ: AI Prompt Runs', childRun.ID)\">\n <div class=\"run-item-icon\" [style.background-color]=\"getStatusColor() + '20'\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(childRun.RunType)\"></i>\n </div>\n <div class=\"run-item-content\">\n <div class=\"run-item-title\">\n Child Run #{{ childRun.ID.substring(0, 8) }}\n @if (childRun.ExecutionOrder !== null) {\n <span class=\"execution-order\">#{{ childRun.ExecutionOrder }}</span>\n }\n <span class=\"run-item-type\">{{ childRun.RunType }}</span>\n </div>\n <div class=\"run-item-meta\">\n <span class=\"status-indicator\" [style.color]=\"getStatusColor()\">\n <i [class]=\"'fa-solid ' + getStatusIcon()\"></i>\n {{ childRun.Success ? 'Success' : childRun.ErrorMessage ? 'Failed' : 'Running' }}\n </span>\n <span><i class=\"fa-solid fa-clock\"></i> {{ formatDuration(childRun.ExecutionTimeMS) }}</span>\n <span><i class=\"fa-solid fa-coins\"></i> {{ formatTokens(childRun.TokensUsed) }}</span>\n </div>\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Additional Details Panel -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Additional Details\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n @if (record.AgentID) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Agents', record.AgentID)\" title=\"View Agent\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ record.Agent || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.ConfigurationID) {\n <div class=\"detail-field\">\n <label>Configuration</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-cog\"></i>\n {{ record.Configuration || 'Unknown' }}\n </div>\n </div>\n }\n \n @if (record.RunType) {\n <div class=\"detail-field\">\n <label>Run Type</label>\n <div class=\"detail-value\">\n <i [class]=\"'fa-solid ' + getRunTypeIcon(record.RunType)\"></i>\n {{ record.RunType }}\n </div>\n </div>\n }\n \n @if (record.ResponseFormat) {\n <div class=\"detail-field\">\n <label>Response Format</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-code\"></i>\n {{ record.ResponseFormat }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Temperature</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Temperature === null || record.Temperature === undefined\">\n <i class=\"fa-solid fa-temperature-high\"></i>\n {{ record.Temperature !== null && record.Temperature !== undefined ? record.Temperature : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopP === null || record.TopP === undefined\">\n <i class=\"fa-solid fa-percentage\"></i>\n {{ record.TopP !== null && record.TopP !== undefined ? record.TopP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Top K</label>\n <div class=\"detail-value\" [class.null-value]=\"record.TopK === null || record.TopK === undefined\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ record.TopK !== null && record.TopK !== undefined ? record.TopK : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Min P</label>\n <div class=\"detail-value\" [class.null-value]=\"record.MinP === null || record.MinP === undefined\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ record.MinP !== null && record.MinP !== undefined ? record.MinP : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Frequency Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.FrequencyPenalty === null || record.FrequencyPenalty === undefined\">\n <i class=\"fa-solid fa-repeat\"></i>\n {{ record.FrequencyPenalty !== null && record.FrequencyPenalty !== undefined ? record.FrequencyPenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Presence Penalty</label>\n <div class=\"detail-value\" [class.null-value]=\"record.PresencePenalty === null || record.PresencePenalty === undefined\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n {{ record.PresencePenalty !== null && record.PresencePenalty !== undefined ? record.PresencePenalty : '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Seed</label>\n <div class=\"detail-value\" [class.null-value]=\"record.Seed === null || record.Seed === undefined\">\n <i class=\"fa-solid fa-seedling\"></i>\n {{ record.Seed !== null && record.Seed !== undefined ? record.Seed : '\u2014' }}\n </div>\n </div>\n \n @if (record.RunAt) {\n <div class=\"detail-field\">\n <label>Started At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ record.RunAt | date:'medium' }}\n </div>\n </div>\n }\n \n @if (record.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed At</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{ record.CompletedAt | date:'medium' }}\n </div>\n </div>\n }\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n <!-- Model Specific Response Details Panel -->\n @if (record.ModelSpecificResponseDetails) {\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Specific Response Details\n <span class=\"panel-badge\">JSON</span>\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"json-editor-container\">\n <div class=\"json-toolbar\">\n <button kendoButton\n fillMode=\"flat\" \n size=\"small\"\n (click)=\"copyToClipboard(formattedModelSpecificResponseDetails, 'Model Specific Response Details')\"\n title=\"Copy JSON\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedModelSpecificResponseDetails\"\n name=\"formattedModelSpecificResponseDetails\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-panelbar-item>\n }\n \n <!-- Model Selection & Performance Panel (v2.78 fields) -->\n <kendo-panelbar-item [expanded]=\"false\">\n <ng-template kendoPanelBarItemTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Model Selection & Performance\n @if (record.CacheHit) {\n <span class=\"panel-badge success\">Cached</span>\n }\n @if (record.WasSelectedResult) {\n <span class=\"panel-badge success\">Selected</span>\n }\n </span>\n </ng-template>\n <ng-template kendoPanelBarContent>\n <div class=\"panel-content\">\n <div class=\"detail-fields-grid\">\n <!-- Model Selection Details -->\n <div class=\"detail-field\">\n <label>Status</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ record.Status || 'Unknown' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Selection Strategy</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-strategy\"></i>\n {{ record.SelectionStrategy || '\u2014' }}\n </div>\n </div>\n \n <div class=\"detail-field\">\n <label>Model Power Rank</label>\n <div class=\"detail-value\" [class.null-value]=\"record.ModelPowerRank === null\">\n <i class=\"fa-solid fa-ranking-star\"></i>\n {{ record.ModelPowerRank !== null ? record.ModelPowerRank : '\u2014' }}\n </div>\n </div>\n \n <!-- Cache Information -->\n <div class=\"detail-field\">\n <label>Cache Hit</label>\n <div class=\"detail-value\">\n <i [class]=\"record.CacheHit ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n {{ record.CacheHit ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.CacheKey) {\n <div class=\"detail-field full-width\">\n <label>Cache Key</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-key\"></i>\n <code>{{ record.CacheKey }}</code>\n </div>\n </div>\n }\n \n <!-- Judge Information -->\n @if (record.JudgeID) {\n <div class=\"detail-field\">\n <label>Judge Prompt</label>\n <div class=\"detail-value clickable\" (click)=\"navigateToEntity('AI Prompts', record.JudgeID)\" title=\"View Judge Prompt\">\n <i class=\"fa-solid fa-gavel\"></i>\n {{ record.Judge || 'Unknown' }}\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n </div>\n }\n \n @if (record.JudgeScore !== null) {\n <div class=\"detail-field\">\n <label>Judge Score</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-star\"></i>\n {{ record.JudgeScore }}\n </div>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Was Selected Result</label>\n <div class=\"detail-value\">\n <i [class]=\"record.WasSelectedResult ? 'fa-solid fa-trophy' : 'fa-solid fa-times'\"></i>\n {{ record.WasSelectedResult ? 'Yes' : 'No' }}\n </div>\n </div>\n \n <!-- Performance Metrics -->\n <div class=\"detail-field\">\n <label>Streaming Enabled</label>\n <div class=\"detail-value\">\n <i [class]=\"record.StreamingEnabled ? 'fa-solid fa-stream' : 'fa-solid fa-ban'\"></i>\n {{ record.StreamingEnabled ? 'Yes' : 'No' }}\n </div>\n </div>\n \n @if (record.FirstTokenTime !== null) {\n <div class=\"detail-field\">\n <label>First Token Time</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-bolt\"></i>\n {{ record.FirstTokenTime }} ms\n </div>\n </div>\n }\n \n @if (record.Cancelled) {\n <div class=\"detail-field\">\n <label>Cancelled</label>\n <div class=\"detail-value error\">\n <i class=\"fa-solid fa-ban\"></i>\n Yes\n </div>\n </div>\n \n @if (record.CancellationReason) {\n <div class=\"detail-field full-width\">\n <label>Cancellation Reason</label>\n <div class=\"detail-value\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{ record.CancellationReason }}\n </div>\n </div>\n }\n }\n </div>\n \n <!-- Model Selection JSON -->\n @if (record.ModelSelection) {\n <div class=\"model-selection-json\">\n <h4>Model Selection Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedModelSelection\"\n name=\"formattedModelSelection\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n \n <!-- Error Details JSON -->\n @if (record.ErrorDetails) {\n <div class=\"error-details-json\">\n <h4>Error Details</h4>\n <div class=\"json-viewer-container\">\n <mj-code-editor \n [(ngModel)]=\"formattedErrorDetails\"\n name=\"formattedErrorDetails\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 200px; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </kendo-panelbar-item>\n \n </kendo-panelbar>\n </div>\n </form>\n }\n</div>", styles: ["/* Error Info Styles */\n.error-info {\n margin-top: 16px;\n padding: 16px;\n background-color: #fef3f3;\n border: 1px solid #fecaca;\n border-radius: 8px;\n}\n\n.finish-reason {\n margin: 0 0 12px 0;\n color: #dc2626;\n font-size: 14px;\n}\n\n.error-details {\n margin-top: 12px;\n}\n\n.error-details h4 {\n margin: 0 0 8px 0;\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n}\n\n.error-hint {\n margin: 0;\n color: #7f1d1d;\n font-size: 14px;\n font-style: italic;\n}\n\n/* Header Section */\n.prompt-run-header {\n background: #f8f9fa;\n border-bottom: 2px solid #e9ecef;\n padding: 20px;\n margin-bottom: 0;\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.run-overview {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n flex: 1;\n}\n\n.run-icon-wrapper {\n width: 56px;\n height: 56px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-icon-wrapper i {\n font-size: 24px;\n}\n\n.run-info {\n flex: 1;\n min-width: 0;\n}\n\n.run-title {\n margin: 0 0 8px 0;\n font-size: 1.5em;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.run-id {\n font-size: 0.8em;\n color: #6c757d;\n font-weight: 400;\n font-family: 'Courier New', monospace;\n}\n\n.run-meta {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n color: white;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.status-badge i {\n font-size: 0.9em;\n}\n\n.run-type-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #f1f3f5;\n font-size: 0.85em;\n font-weight: 500;\n}\n\n.prompt-name, .model-name, .vendor-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.85em;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.prompt-name:hover, .model-name:hover, .vendor-name:hover {\n background: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.original-run {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 16px;\n background: #fff3cd;\n font-size: 0.85em;\n}\n\n.original-link {\n color: #ff6358;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.original-link:hover {\n color: #ff4444;\n text-decoration: underline;\n}\n\n.run-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Metrics Bar */\n.metrics-bar {\n display: flex;\n gap: 24px;\n padding-top: 16px;\n border-top: 1px solid #e9ecef;\n flex-wrap: wrap;\n}\n\n.metric-item {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.metric-item > i {\n font-size: 1.2em;\n color: #6c757d;\n width: 24px;\n text-align: center;\n}\n\n.metric-content {\n display: flex;\n flex-direction: column;\n}\n\n.metric-label {\n font-size: 0.75em;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.metric-value {\n font-size: 1.1em;\n font-weight: 600;\n color: #2c3e50;\n}\n\n/* Panels */\n.form-content {\n padding: 16px;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n/* Nested Sub-Panel Styles */\n.sub-panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n font-size: 0.95em;\n}\n\n.sub-panel-content {\n padding: 0;\n}\n\n/* Nested kendo-panelbar styles */\n.k-panelbar .k-panelbar {\n border: none;\n background: transparent;\n}\n\n.k-panelbar .k-panelbar > .k-item {\n border: 1px solid #e5e7eb;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.k-panelbar .k-panelbar > .k-item > .k-link {\n background-color: #f9fafb;\n padding: 12px 16px;\n}\n\n.k-panelbar .k-panelbar > .k-item.k-expanded > .k-link {\n background-color: #f3f4f6;\n}\n\n.k-panelbar .k-panelbar .k-content {\n padding: 0;\n background: white;\n}\n\n/* Ensure chat message viewer takes appropriate height */\n.sub-panel-content mj-chat-message-viewer {\n display: block;\n min-height: 200px;\n max-height: 750px; /* Increased by 50% from 500px */\n height: auto;\n overflow: hidden;\n}\n\n/* Different colors for sub-expansion panels */\n.sub-expansion-panel {\n margin-bottom: 8px;\n}\n\n.sub-expansion-panel::ng-deep .k-expander {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-expander:hover {\n background-color: #edf2f7;\n}\n\n.sub-expansion-panel::ng-deep .k-header {\n background-color: #f7fafc;\n border-color: #e2e8f0;\n}\n\n.sub-expansion-panel::ng-deep .k-content {\n background-color: #ffffff;\n border-color: #e2e8f0;\n}\n\n.panel-badge {\n margin-left: auto;\n padding: 2px 8px;\n border-radius: 12px;\n background: #e9ecef;\n color: #495057;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.panel-badge.error {\n background: #dc3545;\n color: white;\n}\n\n.panel-count {\n color: #6c757d;\n font-weight: 400;\n font-size: 0.9em;\n}\n\n.panel-content {\n padding: 20px;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* JSON Editor Container */\n.json-editor-container {\n border: 1px solid #e9ecef;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.json-toolbar {\n background: #f8f9fa;\n padding: 8px 12px;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n justify-content: flex-end;\n}\n\n/* Error Message */\n.error-message {\n background: #dc354510;\n border: 1px solid #dc3545;\n border-radius: 6px;\n padding: 16px;\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n}\n\n.error-message i {\n font-size: 1.5em;\n color: #dc3545;\n flex-shrink: 0;\n}\n\n.error-content h4 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 1em;\n}\n\n.error-content p {\n margin: 0;\n color: #495057;\n}\n\n/* Empty State */\n.empty-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.empty-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Loading State */\n.loading-state {\n text-align: center;\n padding: 60px 40px;\n color: #6c757d;\n}\n\n.loading-state i {\n font-size: 3em;\n margin-bottom: 16px;\n opacity: 0.6;\n color: #007bff;\n}\n\n.loading-state p {\n margin: 0;\n font-size: 1.1em;\n}\n\n/* Metrics Grid */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n margin-bottom: 24px;\n}\n\n.metric-card {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 20px;\n}\n\n.metric-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.metric-header i {\n font-size: 1.2em;\n color: #6c757d;\n}\n\n.metric-header h4 {\n margin: 0;\n font-size: 0.9em;\n color: #6c757d;\n font-weight: 500;\n}\n\n.metric-value.large {\n font-size: 1.8em;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.metric-rollup {\n margin-top: 8px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.metric-currency {\n margin-top: 4px;\n font-size: 0.85em;\n color: #6c757d;\n text-transform: uppercase;\n}\n\n/* Additional Metrics */\n.additional-metrics {\n border-top: 1px solid #e9ecef;\n padding-top: 16px;\n}\n\n.metric-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid #f1f3f5;\n}\n\n.metric-row:last-child {\n border-bottom: none;\n}\n\n.metric-row .metric-label {\n font-weight: 500;\n color: #6c757d;\n}\n\n.metric-row .metric-value {\n font-weight: 400;\n color: #2c3e50;\n}\n\n.metric-row .metric-value.link {\n color: #007bff;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s;\n}\n\n.metric-row .metric-value.link:hover {\n color: #0056b3;\n}\n\n/* Hierarchy Section */\n.parent-run-section,\n.child-runs-section {\n margin-bottom: 24px;\n}\n\n.parent-run-section:last-child,\n.child-runs-section:last-child {\n margin-bottom: 0;\n}\n\n.parent-run-section h4,\n.child-runs-section h4 {\n margin: 0 0 12px 0;\n font-size: 0.95em;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.runs-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.run-item {\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.run-item:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n}\n\n.run-item.parent {\n background: #e3f2fd;\n border-color: #90caf9;\n}\n\n.run-item.parent:hover {\n background: #bbdefb;\n}\n\n.run-item-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.run-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.run-item-title {\n font-weight: 500;\n color: #2c3e50;\n margin-bottom: 4px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-order {\n background: #6c757d;\n color: white;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.run-item-type {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 400;\n}\n\n.run-item-meta {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 0.85em;\n color: #6c757d;\n}\n\n.run-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.status-indicator {\n font-weight: 500;\n}\n\n.run-item > i:last-child {\n color: #6c757d;\n font-size: 0.85em;\n}\n\n/* Detail Fields Grid */\n.detail-fields-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 24px;\n width: 100%;\n min-height: auto;\n overflow: visible;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.detail-field label {\n font-size: 0.85em;\n color: #6c757d;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-value {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 1em;\n color: #2c3e50;\n padding: 10px 14px;\n background: #f8f9fa;\n border: 1px solid #e9ecef;\n border-radius: 8px;\n transition: all 0.2s;\n}\n\n.detail-value i:first-child {\n color: #6c757d;\n font-size: 1.1em;\n width: 20px;\n text-align: center;\n}\n\n.detail-value.clickable {\n cursor: pointer;\n}\n\n.detail-value.clickable:hover {\n background: #e9ecef;\n border-color: #dee2e6;\n color: #007bff;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.detail-value.clickable i:last-child {\n margin-left: auto;\n font-size: 0.85em;\n opacity: 0.6;\n}\n\n.detail-value.clickable:hover i:last-child {\n opacity: 1;\n}\n\n.detail-value.null-value {\n color: #adb5bd;\n font-style: italic;\n}\n\n.detail-value.null-value i:first-child {\n opacity: 0.5;\n}\n\n/* Kendo Overrides */\nkendo-panelbar {\n border: none !important;\n}\n\nkendo-panelbar-item {\n margin-bottom: 8px;\n border: 1px solid #e9ecef !important;\n border-radius: 8px !important;\n overflow: hidden;\n}\n\nkendo-panelbar-item .k-panelbar-header {\n background: #f8f9fa !important;\n border: none !important;\n padding: 12px 16px !important;\n}\n\nkendo-panelbar-item .k-panelbar-header:hover {\n background: #e9ecef !important;\n}\n\nkendo-panelbar-item .k-panelbar-content {\n border: none !important;\n padding: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n}\n\n/* Validation Panel Styles */\n.validation-summary {\n margin-bottom: 24px;\n}\n\n.summary-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.summary-header h4 {\n margin: 0;\n font-size: 1.1em;\n color: #2c3e50;\n}\n\n.validation-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 16px;\n border-radius: 20px;\n font-weight: 500;\n font-size: 0.9em;\n}\n\n.validation-status.success {\n background: #28a74520;\n color: #28a745;\n}\n\n.validation-status.failed {\n background: #dc354520;\n color: #dc3545;\n}\n\n.validation-metrics {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.metric-card.small {\n padding: 16px;\n text-align: center;\n}\n\n.metric-card.small .metric-label {\n font-size: 0.8em;\n margin-bottom: 8px;\n font-weight: 600;\n}\n\n.metric-card.small .metric-value {\n font-size: 1.4em;\n font-weight: 700;\n}\n\n.validation-error,\n.common-error {\n background: #dc354510;\n border: 1px solid #dc354530;\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.validation-error h5,\n.common-error h5 {\n margin: 0 0 8px 0;\n color: #dc3545;\n font-size: 0.95em;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.validation-error p,\n.common-error p {\n margin: 0;\n color: #495057;\n font-size: 0.9em;\n}\n\n.error-count {\n display: inline-block;\n margin-top: 8px;\n padding: 2px 8px;\n background: #dc3545;\n color: white;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n/* Retry Timeline */\n.retry-timeline {\n margin-bottom: 24px;\n}\n\n.retry-timeline h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.timeline-info {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.timeline-stat {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6c757d;\n font-size: 0.9em;\n}\n\n.timeline-stat i {\n font-size: 1.1em;\n}\n\n/* Validation Attempts */\n.validation-attempts {\n margin-bottom: 24px;\n}\n\n.validation-attempts h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.attempts-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.attempt-item {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n}\n\n.attempt-item.success {\n background: #28a74510;\n border-color: #28a74530;\n}\n\n.attempt-item.failed {\n background: #dc354510;\n border-color: #dc354530;\n}\n\n.attempt-number {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #2c3e50;\n}\n\n.attempt-item.success .attempt-number {\n color: #28a745;\n}\n\n.attempt-item.failed .attempt-number {\n color: #dc3545;\n}\n\n.attempt-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n font-size: 0.85em;\n}\n\n.attempt-time {\n color: #6c757d;\n}\n\n.attempt-error {\n color: #dc3545;\n flex: 1 0 100%;\n}\n\n.output-length {\n color: #6c757d;\n font-style: italic;\n}\n\n/* Validation JSON */\n.validation-json {\n margin-top: 24px;\n}\n\n.validation-json h4 {\n margin: 0 0 12px 0;\n font-size: 1em;\n color: #495057;\n}\n\n.json-viewer-container {\n border: 1px solid #e9ecef;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Panel badge styles */\n.panel-badge.success {\n background: #28a745;\n color: white;\n}"] }]
|
|
1563
1964
|
}], () => [{ type: i0.ElementRef }, { type: i1.SharedService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i3.TestHarnessWindowService }, { type: i0.ViewContainerRef }], null); })();
|
|
1564
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber:
|
|
1965
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIPromptRunFormComponentExtended, { className: "AIPromptRunFormComponentExtended", filePath: "src/lib/custom/AIPromptRuns/ai-prompt-run-form.component.ts", lineNumber: 20 }); })();
|
|
1565
1966
|
//# sourceMappingURL=ai-prompt-run-form.component.js.map
|