@hahnpro/ai-sdk 0.3.0 → 0.4.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.
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i1$3 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Injectable, inject, isDevMode, NgModule, Directive, DestroyRef, Input, ViewChild, Component, Pipe, Inject, InjectionToken, ViewContainerRef, Injector, ViewEncapsulation, importProvidersFrom } from '@angular/core';
|
|
5
5
|
import * as i2$1 from '@angular/material/button';
|
|
6
6
|
import { MatButtonModule } from '@angular/material/button';
|
|
7
|
-
import * as i3
|
|
7
|
+
import * as i3 from '@angular/material/dialog';
|
|
8
8
|
import { MAT_DIALOG_DATA, MatDialogModule, MatDialog } from '@angular/material/dialog';
|
|
9
9
|
import * as i2$2 from '@angular/material/icon';
|
|
10
10
|
import { MatIconModule } from '@angular/material/icon';
|
|
11
|
-
import * as i3$
|
|
11
|
+
import * as i3$1 from '@angular/material/progress-spinner';
|
|
12
12
|
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
13
13
|
import * as i4 from '@jsverse/transloco';
|
|
14
14
|
import { TranslocoModule, DefaultTranspiler, TRANSLOCO_TRANSPILER, TRANSLOCO_LOADER, provideTransloco, TranslocoService } from '@jsverse/transloco';
|
|
15
|
-
import * as i3$
|
|
15
|
+
import * as i3$2 from '@angular/platform-browser';
|
|
16
16
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
17
|
-
import * as
|
|
17
|
+
import * as i5 from '@angular/material/input';
|
|
18
18
|
import { MatInputModule } from '@angular/material/input';
|
|
19
19
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
20
|
-
import * as
|
|
20
|
+
import * as i2 from '@angular/forms';
|
|
21
21
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
22
22
|
import * as i1$1 from 'ngx-logger';
|
|
23
23
|
import { NGXLogger, LoggerModule, NgxLoggerLevel } from 'ngx-logger';
|
|
@@ -29,10 +29,9 @@ import * as i1 from '@angular/cdk/layout';
|
|
|
29
29
|
import { Breakpoints } from '@angular/cdk/layout';
|
|
30
30
|
import { CdkTextareaAutosize, TextFieldModule } from '@angular/cdk/text-field';
|
|
31
31
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
32
|
-
import * as
|
|
32
|
+
import * as i6 from '@angular/material/tooltip';
|
|
33
33
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
34
|
-
import
|
|
35
|
-
import * as i1$3 from '@angular/cdk/accordion';
|
|
34
|
+
import * as i1$4 from '@angular/cdk/accordion';
|
|
36
35
|
import { CdkAccordionModule } from '@angular/cdk/accordion';
|
|
37
36
|
import { Overlay, OverlayModule } from '@angular/cdk/overlay';
|
|
38
37
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
@@ -41,7 +40,7 @@ import { MarkdownModule, provideMarkdown, MARKED_OPTIONS } from 'ngx-markdown';
|
|
|
41
40
|
import prettyBytes from 'pretty-bytes';
|
|
42
41
|
import { formatDistanceToNow } from 'date-fns';
|
|
43
42
|
import { ClipboardModule } from '@angular/cdk/clipboard';
|
|
44
|
-
import * as i5 from 'ngx-extended-pdf-viewer';
|
|
43
|
+
import * as i5$1 from 'ngx-extended-pdf-viewer';
|
|
45
44
|
import { pdfDefaultOptions, NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';
|
|
46
45
|
import { HttpClient as HttpClient$1, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
47
46
|
|
|
@@ -2396,135 +2395,20 @@ var WebSocketMessageType;
|
|
|
2396
2395
|
WebSocketMessageType["ERROR_EVENT"] = "errorEvent";
|
|
2397
2396
|
})(WebSocketMessageType || (WebSocketMessageType = {}));
|
|
2398
2397
|
|
|
2399
|
-
class VoiceRecognitionService {
|
|
2400
|
-
_isListening = false;
|
|
2401
|
-
recognizer = null;
|
|
2402
|
-
tokenExpiration = 0;
|
|
2403
|
-
_preResult$ = new Subject();
|
|
2404
|
-
_result$ = new Subject();
|
|
2405
|
-
audioConfig = AudioConfig.fromDefaultMicrophoneInput();
|
|
2406
|
-
apiService = inject(ApiService);
|
|
2407
|
-
logger = inject(NGXLogger);
|
|
2408
|
-
get isInitialized() {
|
|
2409
|
-
return !!this.recognizer;
|
|
2410
|
-
}
|
|
2411
|
-
get isListening() {
|
|
2412
|
-
return this._isListening;
|
|
2413
|
-
}
|
|
2414
|
-
get isTokenExpired() {
|
|
2415
|
-
const currentTime = Math.floor(Date.now() / 1000);
|
|
2416
|
-
const bufferTime = 180; // 3 min
|
|
2417
|
-
return currentTime + bufferTime >= this.tokenExpiration;
|
|
2418
|
-
}
|
|
2419
|
-
get preResult$() {
|
|
2420
|
-
return this._preResult$.asObservable();
|
|
2421
|
-
}
|
|
2422
|
-
get result$() {
|
|
2423
|
-
return this._result$.asObservable();
|
|
2424
|
-
}
|
|
2425
|
-
async start(language) {
|
|
2426
|
-
if (!this.isInitialized || this.isTokenExpired) {
|
|
2427
|
-
await this.init(language).catch((err) => this.logger.error(err));
|
|
2428
|
-
}
|
|
2429
|
-
this.recognizer?.startContinuousRecognitionAsync(() => { }, (err) => this.logger.error(err));
|
|
2430
|
-
}
|
|
2431
|
-
async stop() {
|
|
2432
|
-
this.recognizer?.stopContinuousRecognitionAsync(() => (this._isListening = false), (err) => {
|
|
2433
|
-
this.logger.error(err);
|
|
2434
|
-
this._isListening = false;
|
|
2435
|
-
this.recognizer?.close();
|
|
2436
|
-
this.recognizer = null;
|
|
2437
|
-
});
|
|
2438
|
-
}
|
|
2439
|
-
async toggle(language) {
|
|
2440
|
-
if (this.isListening) {
|
|
2441
|
-
await this.stop();
|
|
2442
|
-
}
|
|
2443
|
-
else {
|
|
2444
|
-
await this.start(language);
|
|
2445
|
-
}
|
|
2446
|
-
}
|
|
2447
|
-
parseJwtToken(token) {
|
|
2448
|
-
try {
|
|
2449
|
-
const base64Url = token.split('.')[1];
|
|
2450
|
-
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
2451
|
-
const jsonPayload = atob(base64);
|
|
2452
|
-
const payload = JSON.parse(jsonPayload);
|
|
2453
|
-
return payload.exp || 0;
|
|
2454
|
-
}
|
|
2455
|
-
catch (error) {
|
|
2456
|
-
this.logger.error('Error parsing JWT token:', error);
|
|
2457
|
-
return 0;
|
|
2458
|
-
}
|
|
2459
|
-
}
|
|
2460
|
-
async init(language = 'de-DE') {
|
|
2461
|
-
const { token, region } = await this.apiService.getSpeechToken();
|
|
2462
|
-
this.tokenExpiration = this.parseJwtToken(token);
|
|
2463
|
-
const speechConfig = SpeechConfig.fromAuthorizationToken(token, region);
|
|
2464
|
-
speechConfig.speechRecognitionLanguage = language;
|
|
2465
|
-
this.recognizer = new SpeechRecognizer(speechConfig, this.audioConfig);
|
|
2466
|
-
this.recognizer.recognized = (_sender, event) => {
|
|
2467
|
-
if (event.result.text) {
|
|
2468
|
-
this._result$.next(event.result.text);
|
|
2469
|
-
}
|
|
2470
|
-
};
|
|
2471
|
-
this.recognizer.recognizing = (_sender, event) => {
|
|
2472
|
-
if (event.result.text) {
|
|
2473
|
-
this._preResult$.next(event.result.text);
|
|
2474
|
-
}
|
|
2475
|
-
};
|
|
2476
|
-
this.recognizer.sessionStarted = (_sender, _event) => {
|
|
2477
|
-
this._isListening = true;
|
|
2478
|
-
};
|
|
2479
|
-
this.recognizer.sessionStopped = (_sender, _event) => {
|
|
2480
|
-
this._isListening = false;
|
|
2481
|
-
};
|
|
2482
|
-
this.recognizer.canceled = (_sender, event) => {
|
|
2483
|
-
this.logger.debug(event.errorDetails);
|
|
2484
|
-
this.logger.debug(event.reason);
|
|
2485
|
-
this._isListening = false;
|
|
2486
|
-
};
|
|
2487
|
-
}
|
|
2488
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: VoiceRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2489
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: VoiceRecognitionService, providedIn: 'root' });
|
|
2490
|
-
}
|
|
2491
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: VoiceRecognitionService, decorators: [{
|
|
2492
|
-
type: Injectable,
|
|
2493
|
-
args: [{ providedIn: 'root' }]
|
|
2494
|
-
}] });
|
|
2495
|
-
|
|
2496
2398
|
class MessageInputComponent {
|
|
2497
2399
|
messageInput;
|
|
2498
2400
|
startConversation = '';
|
|
2499
2401
|
chatService = inject(ChatService);
|
|
2500
|
-
voiceRecognitionService = inject(VoiceRecognitionService);
|
|
2501
2402
|
isMobileView;
|
|
2502
2403
|
message;
|
|
2503
2404
|
tmpMessage;
|
|
2504
2405
|
destroyRef = inject(DestroyRef);
|
|
2505
|
-
translocoService = inject(TranslocoService);
|
|
2506
|
-
lang;
|
|
2507
2406
|
constructor(breakpointObserver) {
|
|
2508
2407
|
breakpointObserver
|
|
2509
2408
|
.observe([Breakpoints.XSmall, Breakpoints.Small])
|
|
2510
2409
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
2511
2410
|
.subscribe((result) => (this.isMobileView = result.matches));
|
|
2512
2411
|
}
|
|
2513
|
-
ngOnInit() {
|
|
2514
|
-
this.lang = this.translocoService.getActiveLang();
|
|
2515
|
-
this.translocoService.langChanges$
|
|
2516
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
2517
|
-
.subscribe((l) => (this.lang = l));
|
|
2518
|
-
this.voiceRecognitionService.preResult$.subscribe((result) => {
|
|
2519
|
-
const msg = (this.tmpMessage || '') + ' ' + result;
|
|
2520
|
-
this.message = msg.trim();
|
|
2521
|
-
});
|
|
2522
|
-
this.voiceRecognitionService.result$.subscribe((result) => {
|
|
2523
|
-
const msg = (this.tmpMessage || '') + ' ' + result;
|
|
2524
|
-
this.message = msg.trim();
|
|
2525
|
-
this.tmpMessage = this.message;
|
|
2526
|
-
});
|
|
2527
|
-
}
|
|
2528
2412
|
sendMessage() {
|
|
2529
2413
|
this.message = this.message.trim();
|
|
2530
2414
|
if (!this.message) {
|
|
@@ -2537,16 +2421,8 @@ class MessageInputComponent {
|
|
|
2537
2421
|
this.messageInput.nativeElement.focus();
|
|
2538
2422
|
}
|
|
2539
2423
|
}
|
|
2540
|
-
toggleVoice() {
|
|
2541
|
-
this.tmpMessage = this.message;
|
|
2542
|
-
const lang = this.lang === 'de' ? 'de-DE' : 'en-US';
|
|
2543
|
-
this.voiceRecognitionService.toggle(lang);
|
|
2544
|
-
}
|
|
2545
|
-
stopVoice() {
|
|
2546
|
-
this.voiceRecognitionService.stop();
|
|
2547
|
-
}
|
|
2548
2424
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: MessageInputComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
|
|
2549
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
2425
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.6", type: MessageInputComponent, isStandalone: true, selector: "ai-message-input", inputs: { startConversation: "startConversation" }, viewQueries: [{ propertyName: "messageInput", first: true, predicate: ["messageInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"mx-auto flex w-full items-end justify-center bg-zinc-50 py-2 pl-4 pr-2 md:gap-x-2 md:rounded-2xl md:py-4 md:pr-4 lg:max-w-screen-md xl:max-w-screen-lg dark:border dark:border-zinc-600/30 dark:bg-black\"\n *transloco=\"let t\"\n>\n <textarea\n class=\"w-full md:text-lg md:font-semibold\"\n matInput\n cdkAutosizeMaxRows=\"10\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"isMobileView ? 2 : 4\"\n [placeholder]=\"t('message')\"\n [(ngModel)]=\"message\"\n (keydown.enter)=\"sendMessage() || $event.preventDefault()\"\n spellcheck=\"false\"\n #autosize=\"cdkTextareaAutosize\"\n #messageInput\n ></textarea>\n <div class=\"flex md:flex-col md:gap-2\">\n <button\n mat-icon-button\n [matTooltip]=\"t('ai.send_message')\"\n matTooltipPosition=\"above\"\n (click)=\"sendMessage()\"\n >\n <mat-icon svgIcon=\"send\" class=\"icon-md\"></mat-icon>\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }] });
|
|
2550
2426
|
}
|
|
2551
2427
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: MessageInputComponent, decorators: [{
|
|
2552
2428
|
type: Component,
|
|
@@ -2563,7 +2439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImpor
|
|
|
2563
2439
|
MatTooltipModule,
|
|
2564
2440
|
TextFieldModule,
|
|
2565
2441
|
TranslocoModule,
|
|
2566
|
-
], selector: 'ai-message-input', template: "<div\n class=\"mx-auto flex w-full items-end justify-center bg-zinc-50 py-2 pl-4 pr-2 md:gap-x-2 md:rounded-2xl md:py-4 md:pr-4 lg:max-w-screen-md xl:max-w-screen-lg dark:border dark:border-zinc-600/30 dark:bg-black\"\n *transloco=\"let t\"\n>\n <textarea\n class=\"w-full md:text-lg md:font-semibold\"\n matInput\n cdkAutosizeMaxRows=\"10\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"isMobileView ? 2 : 4\"\n [placeholder]=\"t('message')\"\n [(ngModel)]=\"message\"\n (keydown.enter)=\"sendMessage() || $event.preventDefault()\"\n spellcheck=\"false\"\n #autosize=\"cdkTextareaAutosize\"\n #messageInput\n ></textarea>\n <div class=\"flex md:flex-col md:gap-2\">\n <button\n mat-icon-button\n [matTooltip]=\"t('ai.
|
|
2442
|
+
], selector: 'ai-message-input', template: "<div\n class=\"mx-auto flex w-full items-end justify-center bg-zinc-50 py-2 pl-4 pr-2 md:gap-x-2 md:rounded-2xl md:py-4 md:pr-4 lg:max-w-screen-md xl:max-w-screen-lg dark:border dark:border-zinc-600/30 dark:bg-black\"\n *transloco=\"let t\"\n>\n <textarea\n class=\"w-full md:text-lg md:font-semibold\"\n matInput\n cdkAutosizeMaxRows=\"10\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"isMobileView ? 2 : 4\"\n [placeholder]=\"t('message')\"\n [(ngModel)]=\"message\"\n (keydown.enter)=\"sendMessage() || $event.preventDefault()\"\n spellcheck=\"false\"\n #autosize=\"cdkTextareaAutosize\"\n #messageInput\n ></textarea>\n <div class=\"flex md:flex-col md:gap-2\">\n <button\n mat-icon-button\n [matTooltip]=\"t('ai.send_message')\"\n matTooltipPosition=\"above\"\n (click)=\"sendMessage()\"\n >\n <mat-icon svgIcon=\"send\" class=\"icon-md\"></mat-icon>\n </button>\n </div>\n</div>\n" }]
|
|
2567
2443
|
}], ctorParameters: () => [{ type: i1.BreakpointObserver }], propDecorators: { messageInput: [{
|
|
2568
2444
|
type: ViewChild,
|
|
2569
2445
|
args: ['messageInput']
|
|
@@ -2830,7 +2706,7 @@ class PreviewComponent {
|
|
|
2830
2706
|
});
|
|
2831
2707
|
}
|
|
2832
2708
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: PreviewComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
2833
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: PreviewComponent, isStandalone: true, selector: "ai-content-preview", ngImport: i0, template: "<ng-container>\n <div mat-dialog-title class=\"relative\">\n <div class=\"truncate pr-10\">{{ content.filename }}</div>\n <button\n mat-icon-button\n matDialogClose\n class=\"small absolute right-4 top-4 bg-zinc-50 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 dark:bg-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-50\"\n >\n <mat-icon svgIcon=\"dismiss\"></mat-icon>\n </button>\n </div>\n <div mat-dialog-content class=\"flex grow flex-col\">\n @if (markdown) {\n <div class=\"w-full overflow-y-auto rounded-xl bg-white p-4\">\n <markdown class=\"markdown-body\" [data]=\"markdown\"></markdown>\n </div>\n } @else if (content.mimetype === 'application/pdf') {\n <div class=\"mx-auto w-[50rem] sm:h-[65vh]\">\n <ngx-extended-pdf-viewer\n [authorization]=\"token\"\n [src]=\"pdfSrc\"\n [disableHistory]=\"true\"\n [showBorders]=\"false\"\n [showDownloadButton]=\"false\"\n [showDrawEditor]=\"false\"\n [showEditor]=\"false\"\n [showHighlightEditor]=\"false\"\n [showOpenFileButton]=\"false\"\n [showPrintButton]=\"false\"\n [showRotateButton]=\"false\"\n [showSecondaryToolbarButton]=\"false\"\n [showSidebarButton]=\"false\"\n [showStampEditor]=\"false\"\n [showTextEditor]=\"false\"\n [sidebarVisible]=\"false\"\n [useBrowserLocale]=\"true\"\n [zoom]=\"auto\"\n [page]=\"pageNumber\"\n ></ngx-extended-pdf-viewer>\n </div>\n } @else if (previewUrl) {\n <div\n class=\"group relative w-full overflow-hidden rounded-2xl border border-zinc-300/40 bg-zinc-300/30 p-4 dark:border-zinc-700/40 dark:bg-zinc-700/30\"\n >\n <div class=\"w-full overflow-hidden rounded-lg\">\n <img class=\"w-full\" [src]=\"previewUrl\" alt=\"\" />\n </div>\n </div>\n }\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i1$2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3
|
|
2709
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: PreviewComponent, isStandalone: true, selector: "ai-content-preview", ngImport: i0, template: "<ng-container>\n <div mat-dialog-title class=\"relative\">\n <div class=\"truncate pr-10\">{{ content.filename }}</div>\n <button\n mat-icon-button\n matDialogClose\n class=\"small absolute right-4 top-4 bg-zinc-50 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 dark:bg-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-50\"\n >\n <mat-icon svgIcon=\"dismiss\"></mat-icon>\n </button>\n </div>\n <div mat-dialog-content class=\"flex grow flex-col\">\n @if (markdown) {\n <div class=\"w-full overflow-y-auto rounded-xl bg-white p-4\">\n <markdown class=\"markdown-body\" [data]=\"markdown\"></markdown>\n </div>\n } @else if (content.mimetype === 'application/pdf') {\n <div class=\"mx-auto w-[50rem] sm:h-[65vh]\">\n <ngx-extended-pdf-viewer\n [authorization]=\"token\"\n [src]=\"pdfSrc\"\n [disableHistory]=\"true\"\n [showBorders]=\"false\"\n [showDownloadButton]=\"false\"\n [showDrawEditor]=\"false\"\n [showEditor]=\"false\"\n [showHighlightEditor]=\"false\"\n [showOpenFileButton]=\"false\"\n [showPrintButton]=\"false\"\n [showRotateButton]=\"false\"\n [showSecondaryToolbarButton]=\"false\"\n [showSidebarButton]=\"false\"\n [showStampEditor]=\"false\"\n [showTextEditor]=\"false\"\n [sidebarVisible]=\"false\"\n [useBrowserLocale]=\"true\"\n [zoom]=\"auto\"\n [page]=\"pageNumber\"\n ></ngx-extended-pdf-viewer>\n </div>\n } @else if (previewUrl) {\n <div\n class=\"group relative w-full overflow-hidden rounded-2xl border border-zinc-300/40 bg-zinc-300/30 p-4 dark:border-zinc-700/40 dark:bg-zinc-700/30\"\n >\n <div class=\"w-full overflow-hidden rounded-lg\">\n <img class=\"w-full\" [src]=\"previewUrl\" alt=\"\" />\n </div>\n </div>\n }\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i1$2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: NgxExtendedPdfViewerModule }, { kind: "component", type: i5$1.NgxExtendedPdfViewerComponent, selector: "ngx-extended-pdf-viewer", inputs: ["customFindbarInputArea", "customToolbar", "customFindbar", "customFindbarButtons", "customPdfViewer", "customSecondaryToolbar", "customSidebar", "customThumbnail", "customFreeFloatingBar", "showFreeFloatingBar", "enableDragAndDrop", "forceUsingLegacyES5", "formData", "disableForms", "pageViewMode", "scrollMode", "authorization", "httpHeaders", "contextMenuAllowed", "enablePrint", "enablePrintAutoRotate", "forceFullReloadOfJavaScriptCode", "showTextEditor", "showStampEditor", "showDrawEditor", "showHighlightEditor", "logLevel", "relativeCoordsOptions", "minifiedJSLibraries", "printResolution", "rotation", "src", "base64Src", "minHeight", "height", "backgroundColor", "filenameForDownload", "ignoreKeyboard", "ignoreKeys", "acceptKeys", "imageResourcesPath", "localeFolderPath", "language", "listenToURL", "nameddest", "password", "replaceBrowserPrint", "useInlineScripts", "showUnverifiedSignatures", "startTabindex", "showSidebarButton", "sidebarVisible", "activeSidebarView", "findbarVisible", "propertiesDialogVisible", "showFindButton", "showFindHighlightAll", "showFindMatchCase", "showFindMultiple", "showFindRegexp", "showFindEntireWord", "showFindMatchDiacritics", "showFindResultsCount", "showFindMessages", "showPagingButtons", "showFirstAndLastPageButtons", "showPreviousAndNextPageButtons", "showPageNumber", "showPageLabel", "showZoomButtons", "showZoomDropdown", "showPresentationModeButton", "showOpenFileButton", "showPrintButton", "showDownloadButton", "theme", "showToolbar", "showSecondaryToolbarButton", "showSinglePageModeButton", "showVerticalScrollButton", "showHorizontalScrollButton", "showWrappedScrollButton", "showInfiniteScrollButton", "showBookModeButton", "showRotateButton", "showRotateCwButton", "showRotateCcwButton", "handTool", "showHandToolButton", "showSpreadButton", "showPropertiesButton", "showBorders", "spread", "showScrollingButtons", "page", "pageLabel", "textLayer", "zoom", "zoomLevels", "maxZoom", "minZoom", "mobileFriendlyZoom"], outputs: ["annotationEditorEvent", "formDataChange", "pageViewModeChange", "progress", "srcChange", "scrollModeChange", "afterPrint", "beforePrint", "currentZoomFactor", "rotationChange", "annotationLayerRendered", "annotationEditorLayerRendered", "xfaLayerRendered", "outlineLoaded", "attachmentsloaded", "layersloaded", "sidebarVisibleChange", "activeSidebarViewChange", "findbarVisibleChange", "propertiesDialogVisibleChange", "handToolChange", "spreadChange", "thumbnailDrawn", "pageChange", "pageLabelChange", "pagesLoaded", "pageRender", "pageRendered", "pdfDownloaded", "pdfLoaded", "pdfLoadingStarts", "pdfLoadingFailed", "textLayerRendered", "annotationEditorModeChanged", "updateFindMatchesCount", "updateFindState", "zoomChange"] }] });
|
|
2834
2710
|
}
|
|
2835
2711
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: PreviewComponent, decorators: [{
|
|
2836
2712
|
type: Component,
|
|
@@ -2918,7 +2794,7 @@ class ContextOverlayComponent {
|
|
|
2918
2794
|
}
|
|
2919
2795
|
}
|
|
2920
2796
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ContextOverlayComponent, deps: [{ token: OVERLAY_RESOURCE_ID }, { token: OVERLAY_RESOURCE_TYPE }, { token: OVERLAY_PAGE_NUMBER }], target: i0.ɵɵFactoryTarget.Component });
|
|
2921
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: ContextOverlayComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<div\n class=\"relative min-w-48 max-w-md rounded-2xl border border-zinc-400/50 bg-zinc-100/60 p-4 shadow-md backdrop-blur-md dark:border-zinc-600/50 dark:bg-zinc-800/60\"\n *transloco=\"let t\"\n>\n @if (resource) {\n @if (pageNumber) {\n <div class=\"flex w-full flex-col gap-y-2 px-2\">\n <div class=\"flex items-center gap-x-1 text-lg\">\n <span>{{ t('ai.source') }}:</span>\n <button\n class=\"text-blue-700 underline hover:text-blue-500 dark:text-blue-100 dark:hover:text-blue-400\"\n (click)=\"previewContent(pageNumber)\"\n >\n {{ t('page') }} {{ pageNumber }}\n </button>\n <span>{{ t('ai.of_document') }}</span>\n </div>\n <div class=\"mx-2 h-0.5 bg-zinc-200 dark:bg-zinc-700\"></div>\n <div class=\"flex items-center gap-x-3\">\n <mat-icon [svgIcon]=\"iconForMimeType()\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ resource?.filename }}\n </div>\n </div>\n @if (asset) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"asset\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ asset.name }}\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"flex w-full flex-col items-center justify-center gap-x-3 pb-4 sm:flex-row sm:justify-start\"\n >\n <div\n class=\"flex rounded-xl border border-zinc-300/50 bg-zinc-300/40 p-2 dark:border-zinc-700/50 dark:bg-zinc-700/30\"\n >\n <mat-icon class=\"icon-md\" [svgIcon]=\"iconForMimeType()\"></mat-icon>\n </div>\n <div class=\"w-full overflow-hidden\">\n <div class=\"flex w-full flex-col items-center pr-8 sm:items-start\">\n <div\n class=\"w-full truncate text-md font-semibold text-zinc-950 dark:text-zinc-50\"\n >\n {{ resource?.name || resource?.filename }}\n </div>\n <div\n class=\"flex flex-col gap-x-2 text-sm text-zinc-900/70 sm:flex-row sm:items-center dark:text-zinc-100/70\"\n >\n <span>{{ t(labelForType()) }}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full flex-col gap-y-2 px-2\">\n @if (resource?.owner?.name) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"shield_person\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ t('owner.managed_by') }} <b>{{ resource.owner.name }}</b>\n </div>\n </div>\n }\n @if (asset) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"asset\" class=\"icon-sm\"></mat-icon>\n <div>{{ asset.name }} ({{ asset.type$name }})</div>\n </div>\n }\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"history\" class=\"icon-sm\"></mat-icon>\n <div class=\"flex flex-col gap-x-2 sm:flex-row sm:items-center\">\n @if (\n resource?.updatedAt && resource?.updatedAt !== resource?.createdAt\n ) {\n <span>\n {{ t('last_updated') }}\n <span\n class=\"select-none\"\n matTooltip=\"{{ resource?.updatedAt | date: 'medium' }}\"\n matTooltipClass=\"text-sm\"\n >\n {{ resource?.updatedAt | dateAgo }}\n </span>\n </span>\n } @else {\n <span>\n {{ t('created') }}\n <span\n class=\"select-none\"\n matTooltip=\"{{ resource?.createdAt | date: 'medium' }}\"\n matTooltipClass=\"text-sm\"\n >\n {{ resource?.createdAt | dateAgo }}\n </span>\n </span>\n }\n </div>\n </div>\n @if (resource?.description) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"slide_text\" class=\"icon-sm\"></mat-icon>\n <div class=\"line-clamp-3\">{{ resource?.description }}</div>\n </div>\n }\n @if (resource?.size) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"drive\" class=\"icon-sm\"></mat-icon>\n <div>{{ resource?.size | bytes }}</div>\n </div>\n }\n @if (isPreviewSupported()) {\n <div class=\"w-full px-4 pt-4\">\n <button\n mat-raised-button\n color=\"primary\"\n class=\"w-full\"\n (click)=\"previewContent()\"\n >\n {{ t('show_preview') }}\n </button>\n </div>\n }\n </div>\n }\n } @else if (status?.isLoading) {\n <div class=\"flex h-10 w-10 items-center justify-center\">\n <mat-spinner strokeWidth=\"1\" diameter=\"18\"></mat-spinner>\n </div>\n } @else {\n <div class=\"flex flex-col gap-y-1 px-2 py-1\">\n <span class=\"text-md font-semibold\">{{\n t('toast_error_load_item', { item: t(resourceType) })\n }}</span>\n <span class=\"text-xs\">{{ resourceId }}</span>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type:
|
|
2797
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: ContextOverlayComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<div\n class=\"relative min-w-48 max-w-md rounded-2xl border border-zinc-400/50 bg-zinc-100/60 p-4 shadow-md backdrop-blur-md dark:border-zinc-600/50 dark:bg-zinc-800/60\"\n *transloco=\"let t\"\n>\n @if (resource) {\n @if (pageNumber) {\n <div class=\"flex w-full flex-col gap-y-2 px-2\">\n <div class=\"flex items-center gap-x-1 text-lg\">\n <span>{{ t('ai.source') }}:</span>\n <button\n class=\"text-blue-700 underline hover:text-blue-500 dark:text-blue-100 dark:hover:text-blue-400\"\n (click)=\"previewContent(pageNumber)\"\n >\n {{ t('page') }} {{ pageNumber }}\n </button>\n <span>{{ t('ai.of_document') }}</span>\n </div>\n <div class=\"mx-2 h-0.5 bg-zinc-200 dark:bg-zinc-700\"></div>\n <div class=\"flex items-center gap-x-3\">\n <mat-icon [svgIcon]=\"iconForMimeType()\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ resource?.filename }}\n </div>\n </div>\n @if (asset) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"asset\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ asset.name }}\n </div>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"flex w-full flex-col items-center justify-center gap-x-3 pb-4 sm:flex-row sm:justify-start\"\n >\n <div\n class=\"flex rounded-xl border border-zinc-300/50 bg-zinc-300/40 p-2 dark:border-zinc-700/50 dark:bg-zinc-700/30\"\n >\n <mat-icon class=\"icon-md\" [svgIcon]=\"iconForMimeType()\"></mat-icon>\n </div>\n <div class=\"w-full overflow-hidden\">\n <div class=\"flex w-full flex-col items-center pr-8 sm:items-start\">\n <div\n class=\"w-full truncate text-md font-semibold text-zinc-950 dark:text-zinc-50\"\n >\n {{ resource?.name || resource?.filename }}\n </div>\n <div\n class=\"flex flex-col gap-x-2 text-sm text-zinc-900/70 sm:flex-row sm:items-center dark:text-zinc-100/70\"\n >\n <span>{{ t(labelForType()) }}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full flex-col gap-y-2 px-2\">\n @if (resource?.owner?.name) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"shield_person\" class=\"icon-sm\"></mat-icon>\n <div>\n {{ t('owner.managed_by') }} <b>{{ resource.owner.name }}</b>\n </div>\n </div>\n }\n @if (asset) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"asset\" class=\"icon-sm\"></mat-icon>\n <div>{{ asset.name }} ({{ asset.type$name }})</div>\n </div>\n }\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"history\" class=\"icon-sm\"></mat-icon>\n <div class=\"flex flex-col gap-x-2 sm:flex-row sm:items-center\">\n @if (\n resource?.updatedAt && resource?.updatedAt !== resource?.createdAt\n ) {\n <span>\n {{ t('last_updated') }}\n <span\n class=\"select-none\"\n matTooltip=\"{{ resource?.updatedAt | date: 'medium' }}\"\n matTooltipClass=\"text-sm\"\n >\n {{ resource?.updatedAt | dateAgo }}\n </span>\n </span>\n } @else {\n <span>\n {{ t('created') }}\n <span\n class=\"select-none\"\n matTooltip=\"{{ resource?.createdAt | date: 'medium' }}\"\n matTooltipClass=\"text-sm\"\n >\n {{ resource?.createdAt | dateAgo }}\n </span>\n </span>\n }\n </div>\n </div>\n @if (resource?.description) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"slide_text\" class=\"icon-sm\"></mat-icon>\n <div class=\"line-clamp-3\">{{ resource?.description }}</div>\n </div>\n }\n @if (resource?.size) {\n <div class=\"flex items-center gap-x-3\">\n <mat-icon svgIcon=\"drive\" class=\"icon-sm\"></mat-icon>\n <div>{{ resource?.size | bytes }}</div>\n </div>\n }\n @if (isPreviewSupported()) {\n <div class=\"w-full px-4 pt-4\">\n <button\n mat-raised-button\n color=\"primary\"\n class=\"w-full\"\n (click)=\"previewContent()\"\n >\n {{ t('show_preview') }}\n </button>\n </div>\n }\n </div>\n }\n } @else if (status?.isLoading) {\n <div class=\"flex h-10 w-10 items-center justify-center\">\n <mat-spinner strokeWidth=\"1\" diameter=\"18\"></mat-spinner>\n </div>\n } @else {\n <div class=\"flex flex-col gap-y-1 px-2 py-1\">\n <span class=\"text-md font-semibold\">{{\n t('toast_error_load_item', { item: t(resourceType) })\n }}</span>\n <span class=\"text-xs\">{{ resourceId }}</span>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.DatePipe, name: "date" }, { kind: "ngmodule", type: ClipboardModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: UiPipesModule }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: DateAgoPipe, name: "dateAgo" }] });
|
|
2922
2798
|
}
|
|
2923
2799
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ContextOverlayComponent, decorators: [{
|
|
2924
2800
|
type: Component,
|
|
@@ -2987,7 +2863,7 @@ class MessageContextComponent {
|
|
|
2987
2863
|
this.overlayRef.backdropClick().subscribe(() => this.overlayRef?.detach());
|
|
2988
2864
|
}
|
|
2989
2865
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: MessageContextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2990
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: MessageContextComponent, isStandalone: true, selector: "ai-message-context", inputs: { isLastMessage: "isLastMessage", message: "message" }, ngImport: i0, template: "<cdk-accordion *transloco=\"let t\">\n <cdk-accordion-item\n #accordionItem=\"cdkAccordionItem\"\n [expanded]=\"isLastMessage\"\n >\n <div\n class=\"flex min-w-80 max-w-full flex-col rounded-2xl bg-zinc-300/40 pt-3 dark:bg-zinc-700/30\"\n >\n @if (message?.parsedContent?.references?.length) {\n <div\n class=\"flex cursor-pointer items-center gap-x-3 px-5 pb-3 text-lg text-zinc-800 dark:text-zinc-300\"\n (click)=\"accordionItem.toggle()\"\n (keyup.enter)=\"accordionItem.toggle()\"\n tabindex=\"0\"\n >\n <mat-icon svgIcon=\"layer_diagonal_sparkle\"></mat-icon>\n <span class=\"font-bold\">{{ t('ai.context') }}</span>\n </div>\n @if (accordionItem.expanded) {\n <div class=\"flex flex-nowrap gap-x-3 overflow-x-auto px-5 pb-3\">\n @for (\n ref of message?.parsedContent?.references;\n track ref.reference_id\n ) {\n @if (contextService.getContext(ref.id); as resource) {\n @if (\n ref.resourceType === 'asset' &&\n contextService.getContext(ref.id)\n ) {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon svgIcon=\"asset\"></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.name\n }}</span>\n @if (resource.type$name) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{\n resource.type$name\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (ref.resourceType === 'content') {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon\n [svgIcon]=\"iconForMimeType(resource.mimetype)\"\n ></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.filename\n }}</span>\n @if (\n contextService.assetForContent(resource.id);\n as asset\n ) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ asset.name }}</span>\n <span>\u00B7</span>\n <span class=\"truncate\">{{ asset.type$name }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (\n ref.resourceType === 'event' &&\n contextService.getContext(ref.id)\n ) {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon svgIcon=\"calendar_clock\"></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.name\n }}</span>\n @if (contextService.assetForEvent(resource); as asset) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ asset.name }}</span>\n <span>\u00B7</span>\n <span class=\"truncate\">{{ asset.type$name }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n } @else if (contextService.status.get(ref.id)?.isLoading) {\n <div\n class=\"flex rounded-2xl border border-zinc-400/40 bg-zinc-400/20 px-2 py-1 dark:border-black/50 dark:bg-black/20\"\n >\n <div class=\"flex h-10 w-10 items-center justify-center\">\n <mat-spinner strokeWidth=\"1\" diameter=\"18\"></mat-spinner>\n </div>\n </div>\n } @else {\n <div\n class=\"min-w-40 rounded-2xl border border-zinc-400/40 bg-zinc-400/20 dark:border-black/50 dark:bg-black/20\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-red-300 bg-red-100 text-red-700 dark:border-red-900 dark:bg-red-950/80 dark:text-red-400\"\n >\n <mat-icon svgIcon=\"error_circle\"></mat-icon>\n </div>\n <div class=\"flex h-full flex-col pr-4\">\n <span class=\"text-md font-semibold\">{{\n t('toast_error_load_item', {\n item: t(ref.resourceType),\n })\n }}</span>\n <span class=\"text-xs\">{{ ref.id }}</span>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n }\n </div>\n </cdk-accordion-item>\n</cdk-accordion>\n", styles: ["@keyframes flash{0%,to{background:transparent}50%{background:#06b6d44d}}.animate-highlight{animation:flash .75s linear;animation-fill-mode:backwards;animation-iteration-count:2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: CdkAccordionModule }, { kind: "directive", type: i1$3.CdkAccordion, selector: "cdk-accordion, [cdkAccordion]", inputs: ["multi"], exportAs: ["cdkAccordion"] }, { kind: "directive", type: i1$3.CdkAccordionItem, selector: "cdk-accordion-item, [cdkAccordionItem]", inputs: ["expanded", "disabled"], outputs: ["closed", "opened", "destroyed", "expandedChange"], exportAs: ["cdkAccordionItem"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: UiPipesModule }] });
|
|
2866
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: MessageContextComponent, isStandalone: true, selector: "ai-message-context", inputs: { isLastMessage: "isLastMessage", message: "message" }, ngImport: i0, template: "<cdk-accordion *transloco=\"let t\">\n <cdk-accordion-item\n #accordionItem=\"cdkAccordionItem\"\n [expanded]=\"isLastMessage\"\n >\n <div\n class=\"flex min-w-80 max-w-full flex-col rounded-2xl bg-zinc-300/40 pt-3 dark:bg-zinc-700/30\"\n >\n @if (message?.parsedContent?.references?.length) {\n <div\n class=\"flex cursor-pointer items-center gap-x-3 px-5 pb-3 text-lg text-zinc-800 dark:text-zinc-300\"\n (click)=\"accordionItem.toggle()\"\n (keyup.enter)=\"accordionItem.toggle()\"\n tabindex=\"0\"\n >\n <mat-icon svgIcon=\"layer_diagonal_sparkle\"></mat-icon>\n <span class=\"font-bold\">{{ t('ai.context') }}</span>\n </div>\n @if (accordionItem.expanded) {\n <div class=\"flex flex-nowrap gap-x-3 overflow-x-auto px-5 pb-3\">\n @for (\n ref of message?.parsedContent?.references;\n track ref.reference_id\n ) {\n @if (contextService.getContext(ref.id); as resource) {\n @if (\n ref.resourceType === 'asset' &&\n contextService.getContext(ref.id)\n ) {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon svgIcon=\"asset\"></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.name\n }}</span>\n @if (resource.type$name) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{\n resource.type$name\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (ref.resourceType === 'content') {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon\n [svgIcon]=\"iconForMimeType(resource.mimetype)\"\n ></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.filename\n }}</span>\n @if (\n contextService.assetForContent(resource.id);\n as asset\n ) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ asset.name }}</span>\n <span>\u00B7</span>\n <span class=\"truncate\">{{ asset.type$name }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (\n ref.resourceType === 'event' &&\n contextService.getContext(ref.id)\n ) {\n <div\n class=\"min-w-40 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"openOverlay($event, ref.id, ref.resourceType)\"\n (keyup.enter)=\"\n openOverlay($event, ref.id, ref.resourceType)\n \"\n tabindex=\"0\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n [class.animate-highlight]=\"\n resource.id === chatService.highlightContext\n \"\n (animationend)=\"chatService.highlightContext = ''\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\"\n >\n <mat-icon svgIcon=\"calendar_clock\"></mat-icon>\n </div>\n <div\n class=\"flex h-full grow flex-col overflow-hidden pr-4\"\n >\n <span class=\"truncate text-md font-semibold\">{{\n resource.name\n }}</span>\n @if (contextService.assetForEvent(resource); as asset) {\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ asset.name }}</span>\n <span>\u00B7</span>\n <span class=\"truncate\">{{ asset.type$name }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n } @else if (contextService.status.get(ref.id)?.isLoading) {\n <div\n class=\"flex rounded-2xl border border-zinc-400/40 bg-zinc-400/20 px-2 py-1 dark:border-black/50 dark:bg-black/20\"\n >\n <div class=\"flex h-10 w-10 items-center justify-center\">\n <mat-spinner strokeWidth=\"1\" diameter=\"18\"></mat-spinner>\n </div>\n </div>\n } @else {\n <div\n class=\"min-w-40 rounded-2xl border border-zinc-400/40 bg-zinc-400/20 dark:border-black/50 dark:bg-black/20\"\n >\n <div\n class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\"\n >\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-red-300 bg-red-100 text-red-700 dark:border-red-900 dark:bg-red-950/80 dark:text-red-400\"\n >\n <mat-icon svgIcon=\"error_circle\"></mat-icon>\n </div>\n <div class=\"flex h-full flex-col pr-4\">\n <span class=\"text-md font-semibold\">{{\n t('toast_error_load_item', {\n item: t(ref.resourceType),\n })\n }}</span>\n <span class=\"text-xs\">{{ ref.id }}</span>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n }\n </div>\n </cdk-accordion-item>\n</cdk-accordion>\n", styles: ["@keyframes flash{0%,to{background:transparent}50%{background:#06b6d44d}}.animate-highlight{animation:flash .75s linear;animation-fill-mode:backwards;animation-iteration-count:2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: CdkAccordionModule }, { kind: "directive", type: i1$4.CdkAccordion, selector: "cdk-accordion, [cdkAccordion]", inputs: ["multi"], exportAs: ["cdkAccordion"] }, { kind: "directive", type: i1$4.CdkAccordionItem, selector: "cdk-accordion-item, [cdkAccordionItem]", inputs: ["expanded", "disabled"], outputs: ["closed", "opened", "destroyed", "expandedChange"], exportAs: ["cdkAccordionItem"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: UiPipesModule }] });
|
|
2991
2867
|
}
|
|
2992
2868
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: MessageContextComponent, decorators: [{
|
|
2993
2869
|
type: Component,
|
|
@@ -3106,7 +2982,7 @@ class ThreadComponent {
|
|
|
3106
2982
|
this.chatService.selectChoice(selection, toolMessage);
|
|
3107
2983
|
}
|
|
3108
2984
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ThreadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3109
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: ThreadComponent, isStandalone: true, selector: "ai-thread", ngImport: i0, template: "<div class=\"relative flex h-full w-full flex-col gap-1 px-6 py-4\" *transloco=\"let t\">\n @if (chatService.isLoading) {\n <div class=\"absolute inset-0 z-100 flex items-center justify-center backdrop-blur-lg\">\n <mat-spinner diameter=\"28\"></mat-spinner>\n </div>\n }\n @for (item of chatService.messages; track item.id; let idx = $index) {\n @if (item.role === 'assistant' && item.parsedContent) {\n <div class=\"flex w-full max-w-[85%] flex-col gap-y-2 self-center px-2 py-2 text-lg md:text-xl\">\n <markdown class=\"markdown-body\" [data]=\"getMarkdownContent(item)\" (click)=\"interceptClick($event)\"></markdown>\n @if (item.parsedContent.references?.length) {\n <ai-message-context [message]=\"item\" [isLastMessage]=\"idx === chatService.messages.length - 1\" class=\"mt-2\"></ai-message-context>\n }\n </div>\n } @else if (item.role === 'assistant' && item.status === 'failed' && getFailReason(item)) {\n <div class=\"flex w-full max-w-[85%] flex-col gap-y-2 self-center px-2 py-2 text-lg md:text-xl\">\n <div class=\"flex items-center gap-x-2 rounded-2xl bg-red-400/10 px-4 py-2 dark:bg-red-600/10\">\n <mat-icon svgIcon=\"dismiss_circle\" class=\"text-red-600/80 icon-sm dark:text-red-400/80\"></mat-icon>\n <span>{{ getFailReason(item) }}</span>\n </div>\n </div>\n } @else if (item.role === 'tool' && item.toolType === 'action' && item.status && getToolStatus(item)) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center px-2 py-1 text-lg md:text-xl\">\n <div\n class=\"flex w-fit items-center gap-x-2 rounded-2xl bg-zinc-300/20 px-4 py-1 text-md text-zinc-800/90 dark:bg-black/70 dark:text-zinc-100/90\"\n >\n @if (item.status === 'completed') {\n <mat-icon svgIcon=\"checkmark_circle\" class=\"text-green-500/80 icon-sm dark:text-green-400/80\"></mat-icon>\n } @else if (item.status === 'failed') {\n <mat-icon svgIcon=\"dismiss_circle\" class=\"text-red-500/80 icon-sm dark:text-red-400/80\"></mat-icon>\n } @else if (item.status === 'pending') {\n <mat-icon svgIcon=\"hourglass_quarter\" class=\"text-zinc-700/60 icon-sm dark:text-zinc-300/40\"></mat-icon>\n } @else if (item.status === 'processing') {\n <mat-spinner diameter=\"16\"></mat-spinner>\n }\n <i>{{ getToolStatus(item) }}</i>\n </div>\n </div>\n } @else if (item.role === 'tool' && item.toolType === 'choice' && item.status === 'processing' && item.args?.choices) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center px-2 py-2 text-lg md:text-xl\">\n <div class=\"flex flex-col rounded-2xl bg-zinc-300/40 pt-3 dark:bg-zinc-700/30\">\n @if (item.args.message) {\n <div class=\"flex items-center gap-x-3 px-5 pb-3 text-lg text-zinc-800 dark:text-zinc-300\">\n <mat-icon svgIcon=\"layer_diagonal_sparkle\"></mat-icon>\n <span class=\"font-semibold\">{{ item.args.message }}</span>\n </div>\n }\n <div class=\"flex flex-wrap gap-x-3 gap-y-2 overflow-x-auto px-5 pb-3\">\n @for (choice of item.args.choices; track choice.id) {\n <div\n class=\"min-w-48 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"selectChoice(choice, item)\"\n (keyup.enter)=\"selectChoice(choice, item)\"\n tabindex=\"0\"\n >\n <div class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\">\n <div class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\">\n <mat-icon svgIcon=\"asset\"></mat-icon>\n </div>\n <div class=\"flex h-full grow flex-col overflow-hidden pr-4\">\n <span class=\"truncate text-md font-semibold\">{{ choice.name }}</span>\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ choice.typeName }}</span>\n @if (choice.location) {\n <span class=\"truncate\">{{ choice.location }}</span>\n }\n @if (choice.factory) {\n <span class=\"truncate\">{{ choice.factory }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (item.role === 'user' && !item.hidden) {\n <div class=\"flex max-w-[90%] flex-col self-end py-4 md:max-w-[80%]\">\n <div class=\"rounded-2xl bg-zinc-300/30 px-6 py-4 text-md md:text-lg dark:bg-black/20\">\n <markdown class=\"markdown-body\" [data]=\"item.content\"></markdown>\n </div>\n </div>\n }\n }\n\n @if (chatService.isProcessing) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center rounded-2xl text-lg md:text-xl\">\n <div class=\"flex flex-col gap-y-2 px-2 py-4\">\n <div class=\"pulse-loader flex items-center gap-x-1 text-zinc-700/50 dark:text-zinc-300/30\"> <div></div><div></div><div></div> </div>\n </div>\n </div>\n }\n</div>\n", styles: [".pulse-loader>div{background-color:currentColor;width:8px;height:8px;border-radius:100%;animation:pulse 1s ease infinite}.pulse-loader>div:nth-child(2){animation-delay:.1s!important}.pulse-loader>div:nth-child(3){animation-delay:.2s!important}@keyframes pulse{0%,60%,to{opacity:1;transform:scale(1)}30%{opacity:.1;transform:scale(.01)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: CdkAccordionModule }, { kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i1$2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$
|
|
2985
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.6", type: ThreadComponent, isStandalone: true, selector: "ai-thread", ngImport: i0, template: "<div class=\"relative flex h-full w-full flex-col gap-1 px-6 py-4\" *transloco=\"let t\">\n @if (chatService.isLoading) {\n <div class=\"absolute inset-0 z-100 flex items-center justify-center backdrop-blur-lg\">\n <mat-spinner diameter=\"28\"></mat-spinner>\n </div>\n }\n @for (item of chatService.messages; track item.id; let idx = $index) {\n @if (item.role === 'assistant' && item.parsedContent) {\n <div class=\"flex w-full max-w-[85%] flex-col gap-y-2 self-center px-2 py-2 text-lg md:text-xl\">\n <markdown class=\"markdown-body\" [data]=\"getMarkdownContent(item)\" (click)=\"interceptClick($event)\"></markdown>\n @if (item.parsedContent.references?.length) {\n <ai-message-context [message]=\"item\" [isLastMessage]=\"idx === chatService.messages.length - 1\" class=\"mt-2\"></ai-message-context>\n }\n </div>\n } @else if (item.role === 'assistant' && item.status === 'failed' && getFailReason(item)) {\n <div class=\"flex w-full max-w-[85%] flex-col gap-y-2 self-center px-2 py-2 text-lg md:text-xl\">\n <div class=\"flex items-center gap-x-2 rounded-2xl bg-red-400/10 px-4 py-2 dark:bg-red-600/10\">\n <mat-icon svgIcon=\"dismiss_circle\" class=\"text-red-600/80 icon-sm dark:text-red-400/80\"></mat-icon>\n <span>{{ getFailReason(item) }}</span>\n </div>\n </div>\n } @else if (item.role === 'tool' && item.toolType === 'action' && item.status && getToolStatus(item)) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center px-2 py-1 text-lg md:text-xl\">\n <div\n class=\"flex w-fit items-center gap-x-2 rounded-2xl bg-zinc-300/20 px-4 py-1 text-md text-zinc-800/90 dark:bg-black/70 dark:text-zinc-100/90\"\n >\n @if (item.status === 'completed') {\n <mat-icon svgIcon=\"checkmark_circle\" class=\"text-green-500/80 icon-sm dark:text-green-400/80\"></mat-icon>\n } @else if (item.status === 'failed') {\n <mat-icon svgIcon=\"dismiss_circle\" class=\"text-red-500/80 icon-sm dark:text-red-400/80\"></mat-icon>\n } @else if (item.status === 'pending') {\n <mat-icon svgIcon=\"hourglass_quarter\" class=\"text-zinc-700/60 icon-sm dark:text-zinc-300/40\"></mat-icon>\n } @else if (item.status === 'processing') {\n <mat-spinner diameter=\"16\"></mat-spinner>\n }\n <i>{{ getToolStatus(item) }}</i>\n </div>\n </div>\n } @else if (item.role === 'tool' && item.toolType === 'choice' && item.status === 'processing' && item.args?.choices) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center px-2 py-2 text-lg md:text-xl\">\n <div class=\"flex flex-col rounded-2xl bg-zinc-300/40 pt-3 dark:bg-zinc-700/30\">\n @if (item.args.message) {\n <div class=\"flex items-center gap-x-3 px-5 pb-3 text-lg text-zinc-800 dark:text-zinc-300\">\n <mat-icon svgIcon=\"layer_diagonal_sparkle\"></mat-icon>\n <span class=\"font-semibold\">{{ item.args.message }}</span>\n </div>\n }\n <div class=\"flex flex-wrap gap-x-3 gap-y-2 overflow-x-auto px-5 pb-3\">\n @for (choice of item.args.choices; track choice.id) {\n <div\n class=\"min-w-48 max-w-80 cursor-pointer rounded-2xl border border-zinc-400/40 bg-zinc-400/20 hover:bg-zinc-400/30 dark:border-black/50 dark:bg-black/20\"\n (click)=\"selectChoice(choice, item)\"\n (keyup.enter)=\"selectChoice(choice, item)\"\n tabindex=\"0\"\n >\n <div class=\"flex grow items-center gap-x-2 rounded-2xl px-2 py-1\">\n <div class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-zinc-400/30\">\n <mat-icon svgIcon=\"asset\"></mat-icon>\n </div>\n <div class=\"flex h-full grow flex-col overflow-hidden pr-4\">\n <span class=\"truncate text-md font-semibold\">{{ choice.name }}</span>\n <div class=\"flex items-center gap-x-2 text-xs\">\n <span class=\"truncate\">{{ choice.typeName }}</span>\n @if (choice.location) {\n <span class=\"truncate\">{{ choice.location }}</span>\n }\n @if (choice.factory) {\n <span class=\"truncate\">{{ choice.factory }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else if (item.role === 'user' && !item.hidden) {\n <div class=\"flex max-w-[90%] flex-col self-end py-4 md:max-w-[80%]\">\n <div class=\"rounded-2xl bg-zinc-300/30 px-6 py-4 text-md md:text-lg dark:bg-black/20\">\n <markdown class=\"markdown-body\" [data]=\"item.content\"></markdown>\n </div>\n </div>\n }\n }\n\n @if (chatService.isProcessing) {\n <div class=\"flex w-full max-w-[85%] flex-col self-center rounded-2xl text-lg md:text-xl\">\n <div class=\"flex flex-col gap-y-2 px-2 py-4\">\n <div class=\"pulse-loader flex items-center gap-x-1 text-zinc-700/50 dark:text-zinc-300/30\"> <div></div><div></div><div></div> </div>\n </div>\n </div>\n }\n</div>\n", styles: [".pulse-loader>div{background-color:currentColor;width:8px;height:8px;border-radius:100%;animation:pulse 1s ease infinite}.pulse-loader>div:nth-child(2){animation-delay:.1s!important}.pulse-loader>div:nth-child(3){animation-delay:.2s!important}@keyframes pulse{0%,60%,to{opacity:1;transform:scale(1)}30%{opacity:.1;transform:scale(.01)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: CdkAccordionModule }, { kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i1$2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: MessageContextComponent, selector: "ai-message-context", inputs: ["isLastMessage", "message"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: UiPipesModule }] });
|
|
3110
2986
|
}
|
|
3111
2987
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ThreadComponent, decorators: [{
|
|
3112
2988
|
type: Component,
|
|
@@ -3369,7 +3245,7 @@ class AiChatDialogComponent {
|
|
|
3369
3245
|
close(message) {
|
|
3370
3246
|
this.matDialogRef.close(message);
|
|
3371
3247
|
}
|
|
3372
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: AiChatDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i3
|
|
3248
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: AiChatDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i3.MatDialogRef }, { token: i2$2.MatIconRegistry }, { token: i3$2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
3373
3249
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.6", type: AiChatDialogComponent, isStandalone: true, selector: "ng-component", providers: [ChatService, ContextService, WebsocketService], ngImport: i0, template: "<div class=\"flex h-full w-full flex-col\" *transloco=\"let t\">\n <div class=\"flex justify-end pb-2\">\n <button\n mat-icon-button\n (click)=\"close()\"\n class=\"small bg-zinc-50 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 dark:bg-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-50\"\n >\n <mat-icon svgIcon=\"dismiss\"></mat-icon>\n </button>\n </div>\n <div\n class=\"flex h-full w-full flex-col items-center overflow-y-auto\"\n aiChatScroll\n >\n <ai-thread class=\"flex h-full w-full\"></ai-thread>\n </div>\n <ai-message-input class=\"w-full\"></ai-message-input>\n</div>\n", styles: ["*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:\"\"}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.absolute{position:absolute!important}.relative{position:relative!important}.inset-0{inset:0!important}.right-4{right:1rem!important}.top-4{top:1rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.mt-2{margin-top:.5rem!important}.line-clamp-3{display:-webkit-box!important;overflow:hidden!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:3!important}.flex{display:flex!important}.contents{display:contents!important}.hidden{display:none!important}.h-0\\.5{height:.125rem!important}.h-10{height:2.5rem!important}.h-full{height:100%!important}.w-10{width:2.5rem!important}.w-\\[50rem\\]{width:50rem!important}.w-fit{width:-moz-fit-content!important;width:fit-content!important}.w-full{width:100%!important}.min-w-40{min-width:10rem!important}.min-w-48{min-width:12rem!important}.min-w-80{min-width:20rem!important}.max-w-80{max-width:20rem!important}.max-w-\\[85\\%\\]{max-width:85%!important}.max-w-\\[90\\%\\]{max-width:90%!important}.max-w-full{max-width:100%!important}.max-w-md{max-width:28rem!important}.shrink-0{flex-shrink:0!important}.grow{flex-grow:1!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.cursor-pointer{cursor:pointer!important}.select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.items-end{align-items:flex-end!important}.items-center{align-items:center!important}.justify-end{justify-content:flex-end!important}.justify-center{justify-content:center!important}.gap-1{gap:.25rem!important}.gap-x-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.gap-x-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.gap-x-3{-moz-column-gap:.75rem!important;column-gap:.75rem!important}.gap-y-1{row-gap:.25rem!important}.gap-y-2{row-gap:.5rem!important}.self-end{align-self:flex-end!important}.self-center{align-self:center!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.truncate{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important}.rounded-2xl{border-radius:1rem!important}.rounded-lg{border-radius:.5rem!important}.rounded-xl{border-radius:.75rem!important}.border{border-width:1px!important}.border-red-300{--tw-border-opacity:1!important;border-color:rgb(252 165 165/var(--tw-border-opacity,1))!important}.border-zinc-300\\/40{border-color:#d4d4d866!important}.border-zinc-300\\/50{border-color:#d4d4d880!important}.border-zinc-400\\/30{border-color:#a1a1aa4d!important}.border-zinc-400\\/40{border-color:#a1a1aa66!important}.border-zinc-400\\/50{border-color:#a1a1aa80!important}.bg-blue-600{background-color:rgb(37 99 235/var(--tw-bg-opacity,1))!important}.bg-blue-600,.bg-gray-600{--tw-bg-opacity:1!important}.bg-gray-600{background-color:rgb(75 85 99/var(--tw-bg-opacity,1))!important}.bg-green-600{background-color:rgb(22 163 74/var(--tw-bg-opacity,1))!important}.bg-green-600,.bg-red-100{--tw-bg-opacity:1!important}.bg-red-100{background-color:rgb(254 226 226/var(--tw-bg-opacity,1))!important}.bg-red-400\\/10{background-color:#f872721a!important}.bg-red-600{background-color:rgb(220 38 38/var(--tw-bg-opacity,1))!important}.bg-red-600,.bg-white{--tw-bg-opacity:1!important}.bg-white{background-color:rgb(255 255 255/var(--tw-bg-opacity,1))!important}.bg-yellow-600{--tw-bg-opacity:1!important;background-color:rgb(202 138 4/var(--tw-bg-opacity,1))!important}.bg-zinc-100\\/60{background-color:#f4f4f599!important}.bg-zinc-200{--tw-bg-opacity:1!important;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))!important}.bg-zinc-300\\/20{background-color:#d4d4d833!important}.bg-zinc-300\\/30{background-color:#d4d4d84d!important}.bg-zinc-300\\/40{background-color:#d4d4d866!important}.bg-zinc-400\\/20{background-color:#a1a1aa33!important}.bg-zinc-50{--tw-bg-opacity:1!important;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))!important}.p-2{padding:.5rem!important}.p-4{padding:1rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-4{padding-bottom:1rem!important;padding-top:1rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:.75rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.pr-10{padding-right:2.5rem!important}.pr-2{padding-right:.5rem!important}.pr-4{padding-right:1rem!important}.pr-8{padding-right:2rem!important}.pt-3{padding-top:.75rem!important}.pt-4{padding-top:1rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.font-bold{font-weight:700!important}.font-semibold{font-weight:600!important}.lowercase{text-transform:lowercase!important}.text-amber-600{--tw-text-opacity:1!important;color:rgb(217 119 6/var(--tw-text-opacity,1))!important}.text-blue-600{--tw-text-opacity:1!important;color:rgb(37 99 235/var(--tw-text-opacity,1))!important}.text-blue-700{--tw-text-opacity:1!important;color:rgb(29 78 216/var(--tw-text-opacity,1))!important}.text-gray-600{--tw-text-opacity:1!important;color:rgb(75 85 99/var(--tw-text-opacity,1))!important}.text-green-500\\/80{color:#22c55ecc!important}.text-green-600{--tw-text-opacity:1!important;color:rgb(22 163 74/var(--tw-text-opacity,1))!important}.text-red-500\\/80{color:#ef4444cc!important}.text-red-600{--tw-text-opacity:1!important;color:rgb(220 38 38/var(--tw-text-opacity,1))!important}.text-red-600\\/80{color:#dc2626cc!important}.text-red-700{--tw-text-opacity:1!important;color:rgb(185 28 28/var(--tw-text-opacity,1))!important}.text-zinc-500{--tw-text-opacity:1!important;color:rgb(113 113 122/var(--tw-text-opacity,1))!important}.text-zinc-700\\/50{color:#3f3f4680!important}.text-zinc-700\\/60{color:#3f3f4699!important}.text-zinc-800{--tw-text-opacity:1!important;color:rgb(39 39 42/var(--tw-text-opacity,1))!important}.text-zinc-800\\/90{color:#27272ae6!important}.text-zinc-900\\/70{color:#18181bb3!important}.text-zinc-950{--tw-text-opacity:1!important;color:rgb(9 9 11/var(--tw-text-opacity,1))!important}.underline{text-decoration-line:underline!important}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)!important}.backdrop-blur-lg,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important;backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)!important}:root{--black:#000;--white:#fff;--white-rgb:255,255,255;--blue-slate-950-rgb:2,6,23;--blue-slate-900-rgb:15,23,42;--blue-slate-800-rgb:30,41,59;--blue-slate-700-rgb:51,65,85;--blue-slate-400-rgb:148,163,184;--blue-slate-300-rgb:203,213,225;--blue-slate-100-rgb:241,245,249;--blue-slate-050-rgb:248,250,252;--gray-800-rgb:31,41,55;--gray-700-rgb:55,65,81;--gray-600-rgb:75,85,99;--gray-200-rgb:229,231,235;--zinc-950-rgb:9,9,11;--zinc-900-rgb:24,24,27;--zinc-800-rgb:39,39,42;--zinc-700-rgb:63,63,70;--zinc-600-rgb:82,82,91;--zinc-500-rgb:113,113,122;--zinc-400-rgb:161,161,170;--zinc-300-rgb:212,212,216;--zinc-200-rgb:228,228,231;--zinc-100-rgb:244,244,245;--zinc-050-rgb:250,250,250;--red-700-rgb:185,28,28;--red-600-rgb:220,38,38;--red-500-rgb:239,68,68;--red-400-rgb:248,113,113;--red-300-rgb:252,165,165;--blue-gray-900-10:rgba(15,23,42,.1);--blue-gray-900-20:rgba(15,23,42,.2);--blue-gray-900:#0f172a;--blue-gray-800:#1e293b;--blue-gray-800-rgb:30,41,59;--blue-gray-700:#334155;--blue-gray-600:#475569;--blue-gray-500:#64748b;--blue-gray-400:#94a3b8;--blue-gray-300:#cbd5e1;--blue-gray-200:#e2e8f0;--blue-gray-100:#f1f5f9;--blue-gray-50:#f8fafc;--blue-gray-light-2:#141b2e;--blue-gray-light-4:#182032;--blue-gray-light-8:#21293b;--blue-gray-light-8-rgb:33,41,59;--blue-gray-light-16:#333b4b;--blue-gray-light-32:#575e6c;--blue-gray-light-64:#a0a5ae;--blue-gray-light-100:#f1f5f9;--blue-gray-dark-2:#e8ecf1;--blue-gray-dark-4:#e8ecf1;--blue-gray-dark-8:#dfe3e8;--blue-gray-dark-16:#cdd1d8;--blue-gray-dark-32:#a9aeb7;--blue-gray-dark-64:#606775;--blue-gray-dark-100:#0f172a;--blue-700:#1d4ed8;--blue-50:#eff6ff;--green-500:#10b981;--green-50:#ecfdf5;--yellow-50:#fffbeb;--yellow-500:#d97706;--red-700:#b91c1c;--red-50:#fef2f2;--emerald-300:#6ee7b7;--emerald-400:#34d399;--emerald-500:#10b981;--emerald-600:#059669;--rose-400:#fb7185;--rose-500:#f43f5e;--rose-600:#e11d48;--rose-700:#be123c;--teal-500:#14b8a6;--teal-600:#0d9488;--cyan-200:#a5f3fc;--cyan-300:#67e8f9;--cyan-400:#22d3ee;--cyan-500:#06b6d4;--cyan-600:#0891b2;--cyan-700:#0e7490;--hp-light-blue:#13cae6;--hp-gradient-light:#3f8efe;--hp-gradient-highlight:#3ffbda;--hp-gradient-dark:#2b64ff;--font-family:Lato,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Open Sans,Helvetica Neue,Helvetica,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--mdc-chip-container-height:30px;--mdc-chip-container-shape-radius:12px;--mdc-fab-container-shape:12px;--mdc-icon-button-icon-size:24px;--mdc-icon-button-state-layer-size:40px;--mdc-icon-button-icon-color:currentColor;--mdc-linear-progress-active-indicator-color:#020617;--mdc-linear-progress-active-indicator-height:10px;--mdc-linear-progress-track-color:#f4f4f5;--mdc-linear-progress-track-height:10px;--mdc-linear-progress-track-shape:10px;--mdc-plain-tooltip-container-shape:8px;--mdc-protected-button-container-shape:9999px;--mdc-protected-button-keep-touch-target:false;--mat-protected-button-horizontal-padding:24px;--mat-protected-button-icon-spacing:8px;--mat-protected-button-icon-offset:-4px;--mat-dialog-actions-padding:16px;--mat-dialog-actions-alignment:normal;--mdc-dialog-container-shape:16px;--mdc-dialog-supporting-text-font:Lato,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Open Sans,Helvetica Neue,Helvetica,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--mdc-outlined-button-container-height:40px;--mdc-outlined-button-container-shape:9999px;--mat-outlined-button-icon-spacing:8px;--mat-outlined-button-icon-offset:-4px;--mat-outlined-button-horizontal-padding:24px;--mdc-outlined-button-keep-touch-target:false;--mdc-outlined-button-outline-width:1px;--mdc-text-button-container-height:40px;--mdc-text-button-container-shape:9999px;--mat-text-button-horizontal-padding:24px;--mat-text-button-icon-spacing:8px;--mat-text-button-icon-offset:0;--mdc-text-button-keep-touch-target:false;--mat-text-button-with-icon-horizontal-padding:8px;--mdc-filled-button-container-shape:4px;--mdc-filled-button-keep-touch-target:false;--mat-filled-button-horizontal-padding:16px;--mat-filled-button-icon-spacing:8px;--mat-filled-button-icon-offset:-4px;--mat-menu-container-shape:16px;--mat-menu-divider-bottom-spacing:0;--mat-menu-divider-top-spacing:0;--mat-menu-item-spacing:16px;--mat-menu-item-icon-size:24px;--mat-menu-item-leading-spacing:16px;--mat-menu-item-trailing-spacing:16px;--mat-menu-item-with-icon-leading-spacing:16px;--mat-menu-item-with-icon-trailing-spacing:16px;--mat-stepper-container-color:transparent;--mdc-switch-track-height:28px;--mat-switch-track-outline-color:#52525b;--mat-switch-label-text-font:Lato,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Open Sans,Helvetica Neue,Helvetica,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--mat-switch-label-text-color:#09090b;--mat-switch-label-text-tracking:0;--mat-switch-label-text-weight:600;--mdc-switch-unselected-handle-color:#52525b;--mdc-switch-unselected-track-color:#d4d4d8;--mdc-switch-unselected-focus-track-color:#cbd5e1;--mdc-switch-unselected-hover-track-color:#cbd5e1;--mdc-switch-unselected-pressed-track-color:#cbd5e1;--mdc-switch-selected-track-color:#1e293b;--mdc-switch-selected-focus-track-color:#334155;--mdc-switch-selected-hover-track-color:#334155;--mdc-switch-selected-pressed-track-color:#334155;--mat-switch-selected-track-outline-color:#020617;--mdc-switch-selected-handle-color:#cbd5e1;--mdc-switch-selected-focus-handle-color:#3ffbda;--mdc-switch-selected-hover-handle-color:#3ffbda;--mdc-switch-selected-pressed-handle-color:#3ffbda;--mdc-switch-selected-focus-state-layer-color:#3ffbda;--mdc-switch-selected-hover-state-layer-color:#3ffbda;--mdc-switch-selected-pressed-state-layer-color:#3ffbda;--mdc-switch-unselected-focus-state-layer-color:#020617;--mdc-switch-unselected-hover-state-layer-color:#020617;--mdc-switch-unselected-pressed-state-layer-color:#020617;--mdc-switch-selected-icon-color:#020617;--mat-switch-with-icon-handle-size:22px;--hot-toast-border-radius:16px;--hot-toast-padding:14px 20px;--hot-toast-info-icon-background-color:#1d4ed8;--hot-toast-checkmark-icon-background-color:#10b981;--hot-toast-warning-icon-background-color:#d97706;--hot-toast-error-icon-background-color:#b91c1c;--color-primary:#020617;--color-primary-inverted:#f8fafc;--color-on-primary:#f8fafc;--color-danger:#fca5a5;--color-on-danger:#dc2626;--menu_container-color:#020617;--menu_text-color:#f8fafc;--color-surface:#fff;--color-on-surface:#1e293b;--color-on-surface-lighter:#64748b;--color-base:#f1f5f9;--color-base-900:#f1f5f9;--color-base-800:#e2e8f0;--color-base-700:#cbd5e1;--color-base-600:#94a3b8;--color-base-500:#64748b;--color-base-400:#475569;--color-base-300:#334155;--color-base-200:#1e293b;--color-base-100:#0f172a;--color-border-around-base:#e2e8f0;--color-alternate:#f1f5f9;--color-alternate-lighter:#f8fafc;--color-active:#e2e8f0;--color-active-lighter:#f1f5f9;--color-on-active:#0f172a;--color-interactive:#cbd5e1;--color-on-interactive:#0f172a;--color-disabled:#fff;--color-highlight:#3f8efe;--color-highlight-hover:#06b6d4;--color-hint:#606775;--color-info:#eff6ff;--color-on-info:#1d4ed8;--color-success:#ecfdf5;--color-on-success:#10b981;--color-warning:#fffbeb;--color-on-warning:#d97706;--color-error:#fef2f2;--color-on-error:#b91c1c;--color-bg-primary:#fff;--color-bg-secondary:rgba(239,254,252,.3);--color-hover:#e2e8f0;--card_background-color:#fff;--card_background-color-rgb:255,255,255;--dialog_background-color:#fff;--query-sender_background-color:#f5f5ef;--query-sender_text-color:#000;--sidebar_text-color:#fff;--sidebar_border-color:#1e293b;--sidebar-title_font-size:1.7rem;--sidebar-title-letter-spacing:-1px;--sidebar-button_background-color:transparent;--sidebar-button_text-color:#94a3b8;--sidebar-button_font-weight:500;--sidebar-button_active_text-color:#f8fafc;--radio_background-color:#e2e8f0;--radio_border-color:#334155;--radio_active_background-color:#cbd5e1;--radio_active_border-color:#0f172a;--mdc-radio-selected-icon-color:#0f172a;--mdc-radio-selected-pressed-icon-color:#3f8efe;--mdc-radio-selected-hover-icon-color:#06b6d4;--mdc-radio-unselected-icon-color:#0f172a;--mdc-radio-unselected-pressed-icon-color:#3f8efe;--mdc-radio-unselected-hover-icon-color:#06b6d4;--checkbox_background-color:#f1f5f9;--mdc-checkbox-state-layer-size:36px;--mdc-checkbox-selected-icon-color:#0f172a;--mdc-checkbox-selected-hover-icon-color:#0f172a;--mdc-checkbox-selected-pressed-icon-color:#0f172a;--mdc-checkbox-selected-focus-icon-color:#0f172a;--mdc-checkbox-unselected-icon-color:#475569;--mdc-checkbox-unselected-hover-icon-color:#0f172a;--mdc-checkbox-unselected-pressed-icon-color:#0f172a;--mdc-checkbox-unselected-focus-icon-color:#0f172a;--mdc-checkbox-selected-checkmark-color:#f1f5f9;--mat-mdc-button-persistent-ripple-color:#0f172a;--mat-mdc-button-ripple-color:rgba(15,23,42,.2);--toggle-bar_color:#cbd5e1;--toggle-bar_active_color:#94a3b8;--toggle-bar-thumb_color:#64748b;--toggle-bar-thumb_active_color:#0f172a;--toggle-button_text-color:#000;--toggle-button_background-color:#f8fafc;--toggle-button_hover_background-color:#e2e8f0;--toggle-button_checked_text-color:#fff;--toggle-button_checked_background-color:#10b981;--tag_background-color:#e2e8f0;--tag_text-color:#475569;--tag_border-color:#e2e8f0;--tag_hover_background-color:#475569;--tag_hover_text-color:#e2e8f0;--tag_hover_border-color:#475569;--tag_disabled_background-color:#f8fafc;--tag_disabled_text-color:#cbd5e1;--tag_disabled_border-color:#f8fafc;--tag_system_background-color:#a5f3fc;--tag_border-radius:.75rem;--input_text-color:#1e293b;--input_border-color:#cbd5e1;--input_placeholder-color:#64748b;--input_xfix-color:#64748b;--input_caret-color:#1e293b;--input_border-radius:.5rem;--input_active_border-color:#334155;--form-field-label_text-color:#f1f5f9;--form-field-required_color:#b91c1c;--color-button-primary:#475569;--color-button-primary-text:#fff;--color-button-secondary:#cbd5e1;--color-button-secondary-text:#0f172a;--color-disabled-button:hsla(0,0%,100%,.5);--color-text-primary:#0f172a;--color-text-secondary:#0f172a;--color-text-accent:red;--color-text-disabled:#606775;--color-text-disabled-button:#606775;--color-text-hint:#606775;--color-dividers:#cbd5e1;--color-icons:#0f172a;--light-primary-text:#fff;--dark-primary-text:#000;--primary-color:#fff;--primary-lighter-color:#b3b6e8;--primary-darker-color:#010798;--text-primary-color:#0f172a;--text-primary-lighter-color:#000;--text-primary-darker-color:#fff;--accent-color:#475569;--accent-lighter-color:#94a3b8;--accent-darker-color:#1e293b;--text-accent-color:#fff;--text-accent-lighter-color:#000;--text-accent-darker-color:#fff;--white-color:#fff;--text-white-color:#000;--success-color:#6ee7b7;--text-success-color:#000;--warn-color:#be123c;--warn-lighter-color:#fef2f2;--warn-darker-color:#b91c1c;--text-warn-color:#fff;--text-warn-lighter-color:#000;--text-warn-darker-color:#fff;--text-primary:#0f172a;--form-filed-bg:#fff;--fab-button-bg:#fff;--fab-button-text:#0f172a;--fab-button-disabled-bg:hsla(0,0%,100%,.6);--fab-button-disabled-text:rgba(0,0,0,.3);--button-text-color:#0f172a;--button-bg-color:#cbd5e1;--button-hover-color:#94a3b8;--mdc-filled-button-label-text-color:#0f172a;--mdc-filled-button-container-color:#cbd5e1;--mdc-protected-button-label-text-color:#0f172a;--mdc-protected-button-container-color:#cbd5e1}html{--hp-dark-blue:#131d56;--hp-light-blue:#13cae6;--hp-gradient-light:63,142,254;--hp-gradient-highlight:63,251,218;--hp-gradient-dark:43,100,255;--hp-color-text-highlight:19,202,230;--hpc-highlight-color-light:6 182 212;--hpc-highlight-color-dark:19 202 230;--hpc-highlight-color:6 182 212;--mdc-chip-elevated-container-color:#e2e8f0;--mdc-plain-tooltip-container-color:#020617;--mdc-plain-tooltip-supporting-text-color:#fff;--mat-menu-container-color:hsla(0,0%,100%,.5);--mat-select-panel-background-color:hsla(0,0%,100%,.4);--mat-paginator-container-background-color:#fafafa;--mat-paginator-container-border-color:#f4f4f5;--mat-paginator-container-border-top-color:#e4e4e7;--mat-sidenav-container-divider-color:#e2e8f0;--mat-stepper-line-color:#f1f5f9;--sidebar_background-color:#020617;--sidebar-submenu_hover_background-color:hsla(240,4%,46%,.7);--scrollbar-thumb-color:rgba(2,6,23,.25);--scrollbar-track-color:rgba(2,6,23,.1)}input,textarea{background:transparent}input::-moz-placeholder,textarea::-moz-placeholder{color:#d4d4d8}input::placeholder,textarea::placeholder{color:#d4d4d8}.dark input::-moz-placeholder,.dark textarea::-moz-placeholder{color:#52525b}.dark input::placeholder,.dark textarea::placeholder{color:#52525b}input::-moz-placeholder,textarea::-moz-placeholder{color:#606775}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#606775}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#606775}input:-webkit-autofill,input:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:hover{-webkit-transition:background-color 600000s 0s,color 600000s 0s!important;transition:background-color 600000s 0s,color 600000s 0s!important}input:-webkit-autofill:active,input:-webkit-autofill:focus,textarea:-webkit-autofill:active,textarea:-webkit-autofill:focus{-webkit-transition:background-color 600000s 0s,color 600000s 0s!important;transition:background-color 600000s 0s,color 600000s 0s!important}[data-autocompleted]{background-color:transparent!important}input:focus,textarea:focus{box-shadow:none!important;outline:none!important}.mdc-elevation--z4{box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important}.mat-mdc-raised-button.mat-primary{background-color:#020617!important;color:#f8fafc!important;font-weight:600!important;line-height:1.375!important;padding-left:1rem!important;padding-right:1rem!important}.dark .mat-mdc-raised-button.mat-primary{background-color:#e4e4e7!important;color:#020617!important}.mat-mdc-outlined-button:hover .mat-mdc-button-persistent-ripple:before{opacity:.05}.mat-mdc-outlined-button.mat-primary{background:linear-gradient(to bottom right,#3ffbdae6,#2b64ffe6)!important;border:none!important;color:#fff!important;font-weight:600!important}.mat-mdc-outlined-button.mat-primary:hover{background:linear-gradient(to bottom right,#3ffbda,#2b64ff)!important}.mat-mdc-outlined-button:not([disabled=true]){border-color:#27272a!important}.dark .mat-mdc-outlined-button:not([disabled=true]){border-color:#d4d4d8!important}.mat-mdc-outlined-button[disabled=true]{border-color:#e5e7eb!important}.dark .mat-mdc-outlined-button[disabled=true]{border-color:#4b5563!important}.mat-mdc-raised-button .mat-icon,.mat-mdc-unelevated-button .mat-icon{color:currentColor!important}.mat-mdc-raised-button:not(.mat-primary,.mat-accent),.mat-mdc-raised-button:not(.mat-primary,.mat-accent):hover,.mat-mdc-unelevated-button:not(.mat-primary,.mat-accent),.mat-mdc-unelevated-button:not(.mat-primary,.mat-accent):hover{background-color:#cbd5e1!important;color:#0f172a!important}.mat-mdc-raised-button.mat-white:not([disabled]),.mat-mdc-unelevated-button.mat-white:not([disabled]){background-color:#fff!important;color:#000!important}.mat-mdc-raised-button.mat-success:not([disabled]),.mat-mdc-unelevated-button.mat-success:not([disabled]){background-color:#6ee7b7!important;color:#000!important}.mat-mdc-raised-button.mat-accent:not([disabled]),.mat-mdc-unelevated-button.mat-accent:not([disabled]){background-color:#475569!important;color:#fff!important}.mat-mdc-raised-button.mat-warn:not([disabled]),.mat-mdc-unelevated-button.mat-warn:not([disabled]){background-color:#ef4444!important;color:#fef2f2!important}.mat-mdc-raised-button.mat-warn:not([disabled]):hover,.mat-mdc-unelevated-button.mat-warn:not([disabled]):hover{background-color:#dc2626!important}.dark .mat-mdc-raised-button.mat-warn:not([disabled]),.dark .mat-mdc-unelevated-button.mat-warn:not([disabled]){background-color:#b91c1ccc!important;color:#ef4444!important}.dark .mat-mdc-raised-button.mat-warn:not([disabled]):hover,.dark .mat-mdc-unelevated-button.mat-warn:not([disabled]):hover{background-color:#b91c1c!important}.mat-mdc-raised-button.mat-info:not([disabled]),.mat-mdc-unelevated-button.mat-info:not([disabled]){background-color:#3b82f6!important;color:#fff!important}.mdc-button--raised{padding-left:1.5rem!important;padding-right:1.5rem!important}.mat-mdc-dialog-container .mdc-dialog__content{font-family:inherit!important;font-size:inherit!important;font-weight:inherit!important}.mat-mdc-dialog-container .mdc-dialog__content,.mat-mdc-dialog-container .mdc-dialog__title{letter-spacing:inherit!important;line-height:inherit!important}.mat-mdc-dialog-title:before{display:none!important}.mat-mdc-tooltip .mdc-tooltip__surface{font-size:.875rem!important;padding:.5rem .75rem!important}.mat-expansion-panel{background-color:#fff!important;border-radius:.375rem!important;box-shadow:none!important;padding:.25rem!important}.mat-expansion-panel .mat-expansion-panel-header{background-color:#f8fafc!important;border:1px solid #f1f5f9!important;border-radius:.375rem!important;transition:padding .2s ease-in-out}.mat-expansion-panel .mat-expansion-panel-header:hover{background-color:#e2e8f0!important}.mat-expansion-panel .mat-expansion-panel-header.mat-expanded{background-color:#fff!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.mat-expansion-panel .mat-expansion-panel-header.mat-expanded:hover{background-color:#e2e8f0!important}.mat-expansion-panel .mat-expansion-panel-header .mat-content{justify-content:space-between}.mat-expansion-panel .mat-expansion-panel-header-description,.mat-expansion-panel .mat-expansion-panel-header-title{flex-basis:auto!important;margin:0!important}.mat-expansion-panel .mat-expansion-panel-header-description{flex-grow:0!important}.mat-expansion-panel .mat-expansion-panel-content{border-bottom:1px solid #f1f5f9!important;border-bottom-left-radius:.375rem!important;border-bottom-right-radius:.375rem!important;border-left:1px solid #f1f5f9!important;border-right:1px solid #f1f5f9!important}.mat-expansion-panel .mat-expansion-panel-content,.mat-expansion-panel .mat-expansion-panel-header{font-size:.875rem}.mat-expansion-panel .mat-expansion-panel-header-title,.mat-expansion-panel .mat-panel-title{font-size:1rem;font-weight:600}.mat-accordion .mat-expansion-panel .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{margin-right:1.75rem}.mat-accordion .mat-expansion-panel .mat-expansion-panel-header .mat-expansion-indicator{background-color:#d4d4d8!important;border-radius:9999px!important;display:inline-block!important;height:1.5rem!important;padding:3px;width:1.5rem!important;fill:currentColor!important;color:#18181b!important}.mat-accordion .mat-expansion-panel .mat-expansion-panel-header .mat-expansion-indicator:after{border:none;content:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='3.5'><path d='M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z' /></svg>\");height:100%;padding:0;transform:rotate(0);width:100%}.mat-accordion .mat-expansion-panel .mat-expansion-panel-body{color:#0f172a!important;line-height:1.625!important;padding:1rem!important}.mat-tree{background-color:#fff!important;border-radius:.5rem!important;box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a!important}.mat-tree .mat-tree-node{color:#0f172a;padding:.25rem}.mat-mdc-button,.mat-mdc-fab,.mat-mdc-icon-button,.mat-mdc-raised-button,.mat-mdc-unelevated-button{height:40px;line-height:1!important;max-height:40px;min-height:40px}.mat-mdc-button.hpc-mat-button-small,.mat-mdc-fab.hpc-mat-button-small,.mat-mdc-icon-button.hpc-mat-button-small,.mat-mdc-raised-button.hpc-mat-button-small,.mat-mdc-unelevated-button.hpc-mat-button-small{height:32px;max-height:32px;min-height:32px}.mat-mdc-button.hpc-mat-button-medium,.mat-mdc-fab.hpc-mat-button-medium,.mat-mdc-icon-button.hpc-mat-button-medium,.mat-mdc-raised-button.hpc-mat-button-medium,.mat-mdc-unelevated-button.hpc-mat-button-medium{height:40px;max-height:40px;min-height:40px}.mat-mdc-button.hpc-mat-button-large,.mat-mdc-fab.hpc-mat-button-large,.mat-mdc-icon-button.hpc-mat-button-large,.mat-mdc-raised-button.hpc-mat-button-large,.mat-mdc-unelevated-button.hpc-mat-button-large{height:48px;max-height:48px;min-height:48px;width:48px}.mat-mdc-button[disabled=true] .mat-icon,.mat-mdc-button[disabled=true] .mat-mdc-paginator-icon,.mat-mdc-fab[disabled=true] .mat-icon,.mat-mdc-fab[disabled=true] .mat-mdc-paginator-icon,.mat-mdc-icon-button[disabled=true] .mat-icon,.mat-mdc-icon-button[disabled=true] .mat-mdc-paginator-icon,.mat-mdc-raised-button[disabled=true] .mat-icon,.mat-mdc-raised-button[disabled=true] .mat-mdc-paginator-icon,.mat-mdc-unelevated-button[disabled=true] .mat-icon,.mat-mdc-unelevated-button[disabled=true] .mat-mdc-paginator-icon{opacity:.38!important}.mat-mdc-icon-button{border-radius:1rem!important}.mat-mdc-icon-button .mat-icon{color:#020617e6}.mat-mdc-icon-button.small{border-radius:.75rem!important;height:32px;max-height:32px;min-height:32px;padding:6px;width:32px}.mat-mdc-icon-button.small .mat-icon{font-size:20px;height:20px;line-height:20px;min-height:20px;min-width:20px;width:20px}.mat-mdc-icon-button.small .mat-icon svg{height:20px;width:20px}.mat-mdc-icon-button.large{height:44px;max-height:44px;min-height:44px;width:44px}.mat-mdc-icon-button.large .mat-icon{font-size:28px;height:28px;line-height:28px;min-height:28px;min-width:28px;width:28px}.mat-mdc-icon-button.large .mat-icon svg{height:28px;width:28px}.mat-mdc-icon-button.inverted .mat-icon{color:#f8fafccc}.mat-mdc-icon-button:hover{background-color:#02061726}.mat-mdc-icon-button:hover .mat-icon{color:#020617}.mat-mdc-icon-button:hover.danger{background-color:#fca6a633}.mat-mdc-icon-button:hover.danger .mat-icon{color:#dc2626}.mat-mdc-icon-button:hover.inverted{background-color:#f8fafc33}.mat-mdc-icon-button:hover.inverted .mat-icon{color:#f8fafc}.mat-mdc-button .mat-ripple-element{background-color:#0f172a1a!important}.mat-mdc-button .mat-mdc-button-persistent-ripple:before{background-color:#0206170d!important}.dark .mat-mdc-button .mat-mdc-button-persistent-ripple:before{background-color:#fafafa26!important}.mat-mdc-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon{margin-left:0!important}mat-icon,mat-icon.mat-primary{color:#18181b}.dark mat-icon,.dark mat-icon.mat-primary{color:#fafafa}.mdc-linear-progress__buffer-bar{background-color:#d4d4d8b3!important}.dark .mdc-linear-progress__buffer-bar{background-color:#52525bb3!important}.mdc-linear-progress__bar-inner{border-color:#3f8efe!important}.mat-mdc-button .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-container circle,.mat-mdc-fab .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-container circle,.mat-mdc-icon-button .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-container circle,.mat-mdc-raised-button .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-container circle,.mat-mdc-unelevated-button .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-container circle{stroke:currentColor!important;animation-duration:6s}.mat-mdc-fab .mat-icon,.mat-mdc-raised-button .mat-icon,.mat-mdc-unelevated-button .mat-icon{color:currentColor!important}.mat-mdc-fab .mat-ripple-element,.mat-mdc-raised-button .mat-ripple-element,.mat-mdc-unelevated-button .mat-ripple-element{background-color:#0000001a!important}.mat-mdc-button:not([disabled=true]).mat-primary .mat-icon,.mat-mdc-icon-button:not([disabled=true]).mat-primary .mat-icon{color:#020617!important}.mat-mdc-button:not([disabled=true]).mat-accent .mat-icon,.mat-mdc-icon-button:not([disabled=true]).mat-accent .mat-icon{color:#475569!important}.mat-mdc-button:not([disabled=true]).mat-warn .mat-icon,.mat-mdc-icon-button:not([disabled=true]).mat-warn .mat-icon{color:#fffbeb!important}.mdc-button .mdc-button__label{font-weight:600;white-space:nowrap}.mat-mdc-dialog-container .mdc-dialog__surface{background-color:#fff!important;border-radius:0!important;box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a!important;padding:24px}@media (min-width:640px){.mat-mdc-dialog-container .mdc-dialog__surface{border-radius:1.5rem!important;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a!important}}.dark .mat-mdc-dialog-container .mdc-dialog__surface{background-color:#000!important;border:1px solid #3f3f46!important}.mat-mdc-dialog-container .mdc-dialog__content,.mat-mdc-dialog-container .mdc-dialog__title{color:#1e293b!important}.mat-icon{align-items:center;-webkit-appearance:none!important;display:inline-flex!important;font-size:24px;height:24px;justify-content:center;line-height:24px;width:24px}.mat-mdc-input-element::-moz-placeholder{color:#d4d4d8!important}.mat-mdc-input-element::placeholder{color:#d4d4d8!important;transition:none!important}.dark .mat-mdc-input-element::-moz-placeholder{color:#52525b!important}.dark .mat-mdc-input-element::placeholder{color:#52525b!important}.mat-mdc-input-element::-moz-placeholder{color:#606775!important;-moz-transition:none!important;transition:none!important}.mat-mdc-input-element::placeholder,.mat-mdc-select .mat-mdc-select-placeholder{color:#64748b}html{--color-prettylights-syntax-comment:#57606a;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#6639ba;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#1f2328;--color-fg-muted:#656d76;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:#d8dee4;--color-neutral-muted:rgba(175,184,193,.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-success-fg:#1a7f37;--color-success-emphasis:#1f883d;--color-attention-fg:#9a6700;--color-attention-emphasis:#9a6700;--color-attention-subtle:#fff8c5;--color-danger-fg:#d1242f;--color-danger-emphasis:#cf222e;--color-done-fg:#8250df;--color-done-emphasis:#8250df}.markdown-body{color:var(--color-fg-default)}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{background-color:currentColor;content:\" \";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0\"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0\"/></svg>');width:16px}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:var(--base-text-weight-semibold,600)}.markdown-body dfn{font-style:italic}.markdown-body h1{border-bottom:1px solid var(--color-border-muted);font-size:2em;font-weight:var(--base-text-weight-semibold,600);margin:.67em 0;padding-bottom:.3em}.markdown-body mark{background-color:var(--color-attention-subtle);color:var(--color-fg-default)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{background-color:var(--color-canvas-default);border-style:none;box-sizing:content-box;max-width:100%}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{background:transparent;background-color:var(--color-border-default);border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}.markdown-body input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::-moz-placeholder{color:var(--color-fg-subtle);opacity:1}.markdown-body ::placeholder{color:var(--color-fg-subtle);opacity:1}.markdown-body hr:after,.markdown-body hr:before{content:\"\";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-moz-max-content;width:max-content}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none!important}.markdown-body [role=button]:focus,.markdown-body a:focus,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=radio]:focus{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}.markdown-body [role=button]:focus-visible,.markdown-body a:focus-visible,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible{outline-offset:0}.markdown-body kbd{background-color:var(--color-canvas-subtle);border-bottom-color:var(--color-neutral-muted);border:1px solid var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted);color:var(--color-fg-default);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:var(--base-text-weight-semibold,600);line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h2{border-bottom:1px solid var(--color-border-muted);font-size:1.5em;padding-bottom:.3em}.markdown-body h2,.markdown-body h3{font-weight:var(--base-text-weight-semibold,600)}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h4,.markdown-body h5{font-weight:var(--base-text-weight-semibold,600)}.markdown-body h5{font-size:.875em}.markdown-body h6{color:var(--color-fg-muted);font-size:.85em;font-weight:var(--base-text-weight-semibold,600)}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{border-left:.25em solid var(--color-border-default);color:var(--color-fg-muted);margin:0;padding:0 1em}.markdown-body ul{list-style-type:disc}.markdown-body ol{list-style-type:decimal}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre,.markdown-body samp,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{margin-bottom:0;margin-top:0;word-wrap:normal}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-body .mr-2{margin-right:var(--base-size-8,8px)!important}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--color-danger-fg)}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit;padding:0 .2em}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{border-bottom:0;padding-bottom:0}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}.markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}.markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}.markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}.markdown-body div>ol:not([type]),.markdown-body ol[type=\"1\"]{list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold,600);margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table th{font-weight:var(--base-text-weight-semibold,600)}.markdown-body table td,.markdown-body table th{border:1px solid var(--color-border-default);padding:6px 13px}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:transparent;max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid var(--color-border-default);display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:var(--color-fg-default);display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{background-color:var(--color-neutral-muted);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:var(--color-canvas-subtle);border-radius:6px;color:var(--color-fg-default);font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code,.markdown-body pre tt{display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{background:var(--color-canvas-default);border:0;padding:10px 8px 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:var(--color-canvas-subtle);border-top:0;font-weight:var(--base-text-weight-semibold,600)}.markdown-body [data-footnote-ref]:before{content:\"[\"}.markdown-body [data-footnote-ref]:after{content:\"]\"}.markdown-body .footnotes{border-top:1px solid var(--color-border-default);color:var(--color-fg-muted);font-size:12px}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes ol ul{display:inline-block;margin-top:16px;padding-left:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{border:2px solid var(--color-accent-emphasis);border-radius:6px;content:\"\";inset:-8px -8px -8px -24px;pointer-events:none;position:absolute}.markdown-body .footnotes li:target{color:var(--color-fg-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-smw,.markdown-body .pl-v{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{background-color:var(--color-prettylights-syntax-invalid-illegal-bg);color:var(--color-prettylights-syntax-invalid-illegal-text)}.markdown-body .pl-c2{background-color:var(--color-prettylights-syntax-carriage-return-bg);color:var(--color-prettylights-syntax-carriage-return-text)}.markdown-body .pl-sr .pl-cce{color:var(--color-prettylights-syntax-string-regexp);font-weight:700}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:var(--color-prettylights-syntax-markup-heading);font-weight:700}.markdown-body .pl-mi{color:var(--color-prettylights-syntax-markup-italic);font-style:italic}.markdown-body .pl-mb{color:var(--color-prettylights-syntax-markup-bold);font-weight:700}.markdown-body .pl-md{background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}.markdown-body .pl-mi1{background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}.markdown-body .pl-mc{background-color:var(--color-prettylights-syntax-markup-changed-bg);color:var(--color-prettylights-syntax-markup-changed-text)}.markdown-body .pl-mi2{background-color:var(--color-prettylights-syntax-markup-ignored-bg);color:var(--color-prettylights-syntax-markup-ignored-text)}.markdown-body .pl-mdr{color:var(--color-prettylights-syntax-meta-diff-range);font-weight:700}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{color:var(--color-prettylights-syntax-constant-other-reference-link);text-decoration:underline}.markdown-body g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal,400);line-height:1;min-width:1ch;vertical-align:-.075em}.markdown-body g-emoji img{height:1em;width:1em}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:var(--base-text-weight-normal,400)}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:4px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list{position:relative}.markdown-body .contains-task-list:focus-within .task-list-item-convert-container,.markdown-body .contains-task-list:hover .task-list-item-convert-container{display:block;height:24px;overflow:visible;width:auto;clip:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.hover\\:bg-zinc-100:hover{--tw-bg-opacity:1!important;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))!important}.hover\\:bg-zinc-400\\/30:hover{background-color:#a1a1aa4d!important}.hover\\:text-blue-500:hover{--tw-text-opacity:1!important;color:rgb(59 130 246/var(--tw-text-opacity,1))!important}.hover\\:text-zinc-900:hover{--tw-text-opacity:1!important;color:rgb(24 24 27/var(--tw-text-opacity,1))!important}@media (min-width:640px){.sm\\:h-\\[65vh\\]{height:65vh!important}.sm\\:flex-row{flex-direction:row!important}.sm\\:items-start{align-items:flex-start!important}.sm\\:items-center{align-items:center!important}.sm\\:justify-start{justify-content:flex-start!important}}@media (min-width:768px){.md\\:max-w-\\[80\\%\\]{max-width:80%!important}.md\\:flex-col{flex-direction:column!important}.md\\:gap-2{gap:.5rem!important}.md\\:gap-x-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.md\\:rounded-2xl{border-radius:1rem!important}.md\\:py-4{padding-bottom:1rem!important;padding-top:1rem!important}.md\\:pr-4{padding-right:1rem!important}.md\\:text-lg{font-size:1.125rem!important}.md\\:text-lg,.md\\:text-xl{line-height:1.75rem!important}.md\\:text-xl{font-size:1.25rem!important}.md\\:font-semibold{font-weight:600!important}}@media (min-width:1024px){.lg\\:max-w-screen-md{max-width:768px!important}}@media (min-width:1280px){.xl\\:max-w-screen-lg{max-width:1024px!important}}.dark\\:border:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-width:1px!important}.dark\\:border-black\\/50:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-color:#00000080!important}.dark\\:border-red-900:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-border-opacity:1!important;border-color:rgb(127 29 29/var(--tw-border-opacity,1))!important}.dark\\:border-zinc-600\\/30:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-color:#52525b4d!important}.dark\\:border-zinc-600\\/50:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-color:#52525b80!important}.dark\\:border-zinc-700\\/40:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-color:#3f3f4666!important}.dark\\:border-zinc-700\\/50:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){border-color:#3f3f4680!important}.dark\\:bg-black:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))!important}.dark\\:bg-black\\/20:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#0003!important}.dark\\:bg-black\\/70:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#000000b3!important}.dark\\:bg-red-600\\/10:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#dc26261a!important}.dark\\:bg-red-950\\/80:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#450a0acc!important}.dark\\:bg-zinc-700:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-bg-opacity:1!important;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))!important}.dark\\:bg-zinc-700\\/30:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#3f3f464d!important}.dark\\:bg-zinc-800\\/60:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){background-color:#27272a99!important}.dark\\:bg-zinc-900:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-bg-opacity:1!important;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))!important}.dark\\:text-blue-100:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(219 234 254/var(--tw-text-opacity,1))!important}.dark\\:text-green-400\\/80:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#4ade80cc!important}.dark\\:text-red-400:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(248 113 113/var(--tw-text-opacity,1))!important}.dark\\:text-red-400\\/80:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#f87272cc!important}.dark\\:text-zinc-100\\/70:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#f4f4f5b3!important}.dark\\:text-zinc-100\\/90:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#f4f4f5e6!important}.dark\\:text-zinc-300:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(212 212 216/var(--tw-text-opacity,1))!important}.dark\\:text-zinc-300\\/30:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#d4d4d84d!important}.dark\\:text-zinc-300\\/40:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){color:#d4d4d866!important}.dark\\:text-zinc-400:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(161 161 170/var(--tw-text-opacity,1))!important}.dark\\:text-zinc-50:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(250 250 250/var(--tw-text-opacity,1))!important}.dark\\:hover\\:bg-zinc-800:hover:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-bg-opacity:1!important;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))!important}.dark\\:hover\\:text-blue-400:hover:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(96 165 250/var(--tw-text-opacity,1))!important}.dark\\:hover\\:text-zinc-50:hover:where([data-theme=hpc-dark],[data-theme=hpc-dark] *){--tw-text-opacity:1!important;color:rgb(250 250 250/var(--tw-text-opacity,1))!important}\n/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/\n"], dependencies: [{ kind: "ngmodule", type: AiTranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "directive", type: ChatScrollDirective, selector: "[aiChatScroll]" }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LoggerModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: MessageInputComponent, selector: "ai-message-input", inputs: ["startConversation"] }, { kind: "component", type: ThreadComponent, selector: "ai-thread" }], encapsulation: i0.ViewEncapsulation.None });
|
|
3374
3250
|
}
|
|
3375
3251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: AiChatDialogComponent, decorators: [{
|
|
@@ -3393,7 +3269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImpor
|
|
|
3393
3269
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
3394
3270
|
type: Inject,
|
|
3395
3271
|
args: [MAT_DIALOG_DATA]
|
|
3396
|
-
}] }, { type: i3
|
|
3272
|
+
}] }, { type: i3.MatDialogRef }, { type: i2$2.MatIconRegistry }, { type: i3$2.DomSanitizer }] });
|
|
3397
3273
|
|
|
3398
3274
|
class AiModule {
|
|
3399
3275
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: AiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|