aiservermanager 0.5.18 → 0.5.19

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.
@@ -11,5 +11,5 @@
11
11
  <style>html{--mat-sys-on-surface:initial}html{--mat-app-background-color:#fafafa;--mat-app-text-color:rgba(0, 0, 0, .87);--mat-app-elevation-shadow-level-0:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-1:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-2:0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-3:0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-4:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-5:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 5px 8px 0px rgba(0, 0, 0, .14), 0px 1px 14px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-6:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-7:0px 4px 5px -2px rgba(0, 0, 0, .2), 0px 7px 10px 1px rgba(0, 0, 0, .14), 0px 2px 16px 1px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-8:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-9:0px 5px 6px -3px rgba(0, 0, 0, .2), 0px 9px 12px 1px rgba(0, 0, 0, .14), 0px 3px 16px 2px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-10:0px 6px 6px -3px rgba(0, 0, 0, .2), 0px 10px 14px 1px rgba(0, 0, 0, .14), 0px 4px 18px 3px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-11:0px 6px 7px -4px rgba(0, 0, 0, .2), 0px 11px 15px 1px rgba(0, 0, 0, .14), 0px 4px 20px 3px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-12:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-13:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 13px 19px 2px rgba(0, 0, 0, .14), 0px 5px 24px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-14:0px 7px 9px -4px rgba(0, 0, 0, .2), 0px 14px 21px 2px rgba(0, 0, 0, .14), 0px 5px 26px 4px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-15:0px 8px 9px -5px rgba(0, 0, 0, .2), 0px 15px 22px 2px rgba(0, 0, 0, .14), 0px 6px 28px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-16:0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-17:0px 8px 11px -5px rgba(0, 0, 0, .2), 0px 17px 26px 2px rgba(0, 0, 0, .14), 0px 6px 32px 5px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-18:0px 9px 11px -5px rgba(0, 0, 0, .2), 0px 18px 28px 2px rgba(0, 0, 0, .14), 0px 7px 34px 6px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-19:0px 9px 12px -6px rgba(0, 0, 0, .2), 0px 19px 29px 2px rgba(0, 0, 0, .14), 0px 7px 36px 6px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-20:0px 10px 13px -6px rgba(0, 0, 0, .2), 0px 20px 31px 3px rgba(0, 0, 0, .14), 0px 8px 38px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-21:0px 10px 13px -6px rgba(0, 0, 0, .2), 0px 21px 33px 3px rgba(0, 0, 0, .14), 0px 8px 40px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-22:0px 10px 14px -6px rgba(0, 0, 0, .2), 0px 22px 35px 3px rgba(0, 0, 0, .14), 0px 8px 42px 7px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-23:0px 11px 14px -7px rgba(0, 0, 0, .2), 0px 23px 36px 3px rgba(0, 0, 0, .14), 0px 9px 44px 8px rgba(0, 0, 0, .12);--mat-app-elevation-shadow-level-24:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12)}html{--mat-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent)}html{--mat-option-selected-state-label-text-color:#3f51b5;--mat-option-label-text-color:rgba(0, 0, 0, .87);--mat-option-hover-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 4%, transparent);--mat-option-focus-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-option-selected-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent)}html{--mat-optgroup-label-text-color:rgba(0, 0, 0, .87)}html{--mat-pseudo-checkbox-full-selected-icon-color:#ff4081;--mat-pseudo-checkbox-full-selected-checkmark-color:#fafafa;--mat-pseudo-checkbox-full-unselected-icon-color:rgba(0, 0, 0, .54);--mat-pseudo-checkbox-full-disabled-selected-checkmark-color:#fafafa;--mat-pseudo-checkbox-full-disabled-unselected-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-pseudo-checkbox-full-disabled-selected-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-pseudo-checkbox-minimal-selected-checkmark-color:#ff4081;--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent)}html{--mat-option-label-text-font:Roboto, sans-serif;--mat-option-label-text-line-height:24px;--mat-option-label-text-size:16px;--mat-option-label-text-tracking:.03125em;--mat-option-label-text-weight:400}html{--mat-optgroup-label-text-font:Roboto, sans-serif;--mat-optgroup-label-text-line-height:24px;--mat-optgroup-label-text-size:16px;--mat-optgroup-label-text-tracking:.03125em;--mat-optgroup-label-text-weight:400}html{--mat-card-elevated-container-shape:4px;--mat-card-outlined-container-shape:4px;--mat-card-filled-container-shape:4px;--mat-card-outlined-outline-width:1px}html{--mat-card-elevated-container-color:white;--mat-card-elevated-container-elevation:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-card-outlined-container-color:white;--mat-card-outlined-container-elevation:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-card-outlined-outline-color:rgba(0, 0, 0, .12);--mat-card-subtitle-text-color:rgba(0, 0, 0, .54);--mat-card-filled-container-color:white;--mat-card-filled-container-elevation:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-card-title-text-font:Roboto, sans-serif;--mat-card-title-text-line-height:32px;--mat-card-title-text-size:20px;--mat-card-title-text-tracking:.0125em;--mat-card-title-text-weight:500;--mat-card-subtitle-text-font:Roboto, sans-serif;--mat-card-subtitle-text-line-height:22px;--mat-card-subtitle-text-size:14px;--mat-card-subtitle-text-tracking:.0071428571em;--mat-card-subtitle-text-weight:500}html{--mat-progress-bar-active-indicator-height:4px;--mat-progress-bar-track-height:4px;--mat-progress-bar-track-shape:0}html{--mat-tooltip-container-shape:4px;--mat-tooltip-supporting-text-line-height:16px}html{--mat-tooltip-container-color:#424242;--mat-tooltip-supporting-text-color:white}html{--mat-tooltip-supporting-text-font:Roboto, sans-serif;--mat-tooltip-supporting-text-size:12px;--mat-tooltip-supporting-text-weight:400;--mat-tooltip-supporting-text-tracking:.0333333333em}html{--mat-form-field-filled-active-indicator-height:1px;--mat-form-field-filled-focus-active-indicator-height:2px;--mat-form-field-filled-container-shape:4px;--mat-form-field-outlined-outline-width:1px;--mat-form-field-outlined-focus-outline-width:2px;--mat-form-field-outlined-container-shape:4px}html{--mat-form-field-focus-select-arrow-color:color-mix(in srgb, #3f51b5 87%, transparent);--mat-form-field-filled-caret-color:#3f51b5;--mat-form-field-filled-focus-active-indicator-color:#3f51b5;--mat-form-field-filled-focus-label-text-color:color-mix(in srgb, #3f51b5 87%, transparent);--mat-form-field-outlined-caret-color:#3f51b5;--mat-form-field-outlined-focus-outline-color:#3f51b5;--mat-form-field-outlined-focus-label-text-color:color-mix(in srgb, #3f51b5 87%, transparent);--mat-form-field-disabled-input-text-placeholder-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-state-layer-color:rgba(0, 0, 0, .87);--mat-form-field-error-text-color:#f44336;--mat-form-field-select-option-text-color:inherit;--mat-form-field-select-disabled-option-text-color:GrayText;--mat-form-field-leading-icon-color:unset;--mat-form-field-disabled-leading-icon-color:unset;--mat-form-field-trailing-icon-color:unset;--mat-form-field-disabled-trailing-icon-color:unset;--mat-form-field-error-focus-trailing-icon-color:unset;--mat-form-field-error-hover-trailing-icon-color:unset;--mat-form-field-error-trailing-icon-color:unset;--mat-form-field-enabled-select-arrow-color:rgba(0, 0, 0, .54);--mat-form-field-disabled-select-arrow-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-hover-state-layer-opacity:.04;--mat-form-field-focus-state-layer-opacity:.12;--mat-form-field-filled-container-color:#f6f6f6;--mat-form-field-filled-disabled-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 4%, transparent);--mat-form-field-filled-label-text-color:rgba(0, 0, 0, .54);--mat-form-field-filled-hover-label-text-color:rgba(0, 0, 0, .54);--mat-form-field-filled-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-filled-input-text-color:rgba(0, 0, 0, .87);--mat-form-field-filled-disabled-input-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-filled-input-text-placeholder-color:rgba(0, 0, 0, .54);--mat-form-field-filled-error-hover-label-text-color:#f44336;--mat-form-field-filled-error-focus-label-text-color:#f44336;--mat-form-field-filled-error-label-text-color:#f44336;--mat-form-field-filled-error-caret-color:#f44336;--mat-form-field-filled-active-indicator-color:rgba(0, 0, 0, .54);--mat-form-field-filled-disabled-active-indicator-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-form-field-filled-hover-active-indicator-color:rgba(0, 0, 0, .87);--mat-form-field-filled-error-active-indicator-color:#f44336;--mat-form-field-filled-error-focus-active-indicator-color:#f44336;--mat-form-field-filled-error-hover-active-indicator-color:#f44336;--mat-form-field-outlined-label-text-color:rgba(0, 0, 0, .54);--mat-form-field-outlined-hover-label-text-color:rgba(0, 0, 0, .87);--mat-form-field-outlined-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-outlined-input-text-color:rgba(0, 0, 0, .87);--mat-form-field-outlined-disabled-input-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-form-field-outlined-input-text-placeholder-color:rgba(0, 0, 0, .54);--mat-form-field-outlined-error-caret-color:#f44336;--mat-form-field-outlined-error-focus-label-text-color:#f44336;--mat-form-field-outlined-error-label-text-color:#f44336;--mat-form-field-outlined-error-hover-label-text-color:#f44336;--mat-form-field-outlined-outline-color:rgba(0, 0, 0, .38);--mat-form-field-outlined-disabled-outline-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-form-field-outlined-hover-outline-color:rgba(0, 0, 0, .87);--mat-form-field-outlined-error-focus-outline-color:#f44336;--mat-form-field-outlined-error-hover-outline-color:#f44336;--mat-form-field-outlined-error-outline-color:#f44336}html{--mat-form-field-container-height:56px;--mat-form-field-filled-label-display:block;--mat-form-field-container-vertical-padding:16px;--mat-form-field-filled-with-label-container-padding-top:24px;--mat-form-field-filled-with-label-container-padding-bottom:8px}html{--mat-form-field-container-text-font:Roboto, sans-serif;--mat-form-field-container-text-line-height:24px;--mat-form-field-container-text-size:16px;--mat-form-field-container-text-tracking:.03125em;--mat-form-field-container-text-weight:400;--mat-form-field-outlined-label-text-populated-size:16px;--mat-form-field-subscript-text-font:Roboto, sans-serif;--mat-form-field-subscript-text-line-height:20px;--mat-form-field-subscript-text-size:12px;--mat-form-field-subscript-text-tracking:.0333333333em;--mat-form-field-subscript-text-weight:400;--mat-form-field-filled-label-text-font:Roboto, sans-serif;--mat-form-field-filled-label-text-size:16px;--mat-form-field-filled-label-text-tracking:.03125em;--mat-form-field-filled-label-text-weight:400;--mat-form-field-outlined-label-text-font:Roboto, sans-serif;--mat-form-field-outlined-label-text-size:16px;--mat-form-field-outlined-label-text-tracking:.03125em;--mat-form-field-outlined-label-text-weight:400}html{--mat-select-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-select-panel-background-color:white;--mat-select-enabled-trigger-text-color:rgba(0, 0, 0, .87);--mat-select-disabled-trigger-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-select-placeholder-text-color:rgba(0, 0, 0, .54);--mat-select-enabled-arrow-color:rgba(0, 0, 0, .54);--mat-select-disabled-arrow-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-select-focused-arrow-color:#3f51b5;--mat-select-invalid-arrow-color:#f44336}html{--mat-select-arrow-transform:translateY(-8px)}html{--mat-select-trigger-text-font:Roboto, sans-serif;--mat-select-trigger-text-line-height:24px;--mat-select-trigger-text-size:16px;--mat-select-trigger-text-tracking:.03125em;--mat-select-trigger-text-weight:400}html{--mat-autocomplete-container-shape:4px;--mat-autocomplete-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-autocomplete-background-color:white}html{--mat-dialog-container-shape:4px;--mat-dialog-container-elevation-shadow:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12);--mat-dialog-container-max-width:80vw;--mat-dialog-container-small-max-width:80vw;--mat-dialog-container-min-width:0;--mat-dialog-actions-alignment:start;--mat-dialog-actions-padding:8px;--mat-dialog-content-padding:20px 24px;--mat-dialog-with-actions-content-padding:20px 24px;--mat-dialog-headline-padding:0 24px 9px}html{--mat-dialog-container-color:white;--mat-dialog-subhead-color:rgba(0, 0, 0, .87);--mat-dialog-supporting-text-color:rgba(0, 0, 0, .54)}html{--mat-dialog-subhead-font:Roboto, sans-serif;--mat-dialog-subhead-line-height:32px;--mat-dialog-subhead-size:20px;--mat-dialog-subhead-weight:500;--mat-dialog-subhead-tracking:.0125em;--mat-dialog-supporting-text-font:Roboto, sans-serif;--mat-dialog-supporting-text-line-height:24px;--mat-dialog-supporting-text-size:16px;--mat-dialog-supporting-text-weight:400;--mat-dialog-supporting-text-tracking:.03125em}html{--mat-slide-toggle-disabled-handle-opacity:.38;--mat-slide-toggle-disabled-selected-handle-opacity:.38;--mat-slide-toggle-disabled-selected-icon-opacity:.38;--mat-slide-toggle-disabled-track-opacity:.12;--mat-slide-toggle-disabled-unselected-handle-opacity:.38;--mat-slide-toggle-disabled-unselected-icon-opacity:.38;--mat-slide-toggle-disabled-unselected-track-outline-color:transparent;--mat-slide-toggle-disabled-unselected-track-outline-width:1px;--mat-slide-toggle-handle-height:20px;--mat-slide-toggle-handle-shape:10px;--mat-slide-toggle-handle-width:20px;--mat-slide-toggle-hidden-track-opacity:1;--mat-slide-toggle-hidden-track-transition:transform 75ms 0ms cubic-bezier(.4, 0, .6, 1);--mat-slide-toggle-pressed-handle-size:20px;--mat-slide-toggle-selected-focus-state-layer-opacity:.12;--mat-slide-toggle-selected-handle-horizontal-margin:0;--mat-slide-toggle-selected-handle-size:20px;--mat-slide-toggle-selected-hover-state-layer-opacity:.04;--mat-slide-toggle-selected-icon-size:18px;--mat-slide-toggle-selected-pressed-handle-horizontal-margin:0;--mat-slide-toggle-selected-pressed-state-layer-opacity:.12;--mat-slide-toggle-selected-track-outline-color:transparent;--mat-slide-toggle-selected-track-outline-width:1px;--mat-slide-toggle-selected-with-icon-handle-horizontal-margin:0;--mat-slide-toggle-track-height:14px;--mat-slide-toggle-track-outline-color:transparent;--mat-slide-toggle-track-outline-width:1px;--mat-slide-toggle-track-shape:7px;--mat-slide-toggle-track-width:36px;--mat-slide-toggle-unselected-focus-state-layer-opacity:.12;--mat-slide-toggle-unselected-handle-horizontal-margin:0;--mat-slide-toggle-unselected-handle-size:20px;--mat-slide-toggle-unselected-hover-state-layer-opacity:.12;--mat-slide-toggle-unselected-icon-size:18px;--mat-slide-toggle-unselected-pressed-handle-horizontal-margin:0;--mat-slide-toggle-unselected-pressed-state-layer-opacity:.1;--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin:0;--mat-slide-toggle-visible-track-opacity:1;--mat-slide-toggle-visible-track-transition:transform 75ms 0ms cubic-bezier(0, 0, .2, 1);--mat-slide-toggle-with-icon-handle-size:20px;--mat-slide-toggle-touch-target-size:48px}html{--mat-slide-toggle-selected-icon-color:white;--mat-slide-toggle-disabled-selected-icon-color:white;--mat-slide-toggle-selected-focus-state-layer-color:#3f51b5;--mat-slide-toggle-selected-handle-color:#3f51b5;--mat-slide-toggle-selected-hover-state-layer-color:#3f51b5;--mat-slide-toggle-selected-pressed-state-layer-color:#3f51b5;--mat-slide-toggle-selected-focus-handle-color:#3f51b5;--mat-slide-toggle-selected-hover-handle-color:#3f51b5;--mat-slide-toggle-selected-pressed-handle-color:#3f51b5;--mat-slide-toggle-selected-focus-track-color:#7986cb;--mat-slide-toggle-selected-hover-track-color:#7986cb;--mat-slide-toggle-selected-pressed-track-color:#7986cb;--mat-slide-toggle-selected-track-color:#7986cb;--mat-slide-toggle-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-slide-toggle-disabled-handle-elevation-shadow:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-slide-toggle-disabled-selected-handle-color:rgba(0, 0, 0, .87);--mat-slide-toggle-disabled-selected-track-color:rgba(0, 0, 0, .87);--mat-slide-toggle-disabled-unselected-handle-color:rgba(0, 0, 0, .87);--mat-slide-toggle-disabled-unselected-icon-color:#f6f6f6;--mat-slide-toggle-disabled-unselected-track-color:rgba(0, 0, 0, .87);--mat-slide-toggle-handle-elevation-shadow:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-slide-toggle-handle-surface-color:white;--mat-slide-toggle-label-text-color:rgba(0, 0, 0, .87);--mat-slide-toggle-unselected-hover-handle-color:#424242;--mat-slide-toggle-unselected-focus-handle-color:#424242;--mat-slide-toggle-unselected-focus-state-layer-color:rgba(0, 0, 0, .87);--mat-slide-toggle-unselected-focus-track-color:rgba(0, 0, 0, .12);--mat-slide-toggle-unselected-icon-color:#f6f6f6;--mat-slide-toggle-unselected-handle-color:rgba(0, 0, 0, .54);--mat-slide-toggle-unselected-hover-state-layer-color:rgba(0, 0, 0, .87);--mat-slide-toggle-unselected-hover-track-color:rgba(0, 0, 0, .12);--mat-slide-toggle-unselected-pressed-handle-color:#424242;--mat-slide-toggle-unselected-pressed-track-color:rgba(0, 0, 0, .12);--mat-slide-toggle-unselected-pressed-state-layer-color:rgba(0, 0, 0, .87);--mat-slide-toggle-unselected-track-color:rgba(0, 0, 0, .12)}html{--mat-slide-toggle-state-layer-size:40px;--mat-slide-toggle-touch-target-display:block}html{--mat-slide-toggle-label-text-font:Roboto, sans-serif;--mat-slide-toggle-label-text-line-height:20px;--mat-slide-toggle-label-text-size:14px;--mat-slide-toggle-label-text-tracking:.0178571429em;--mat-slide-toggle-label-text-weight:400}html{--mat-radio-disabled-selected-icon-opacity:.38;--mat-radio-disabled-unselected-icon-opacity:.38;--mat-radio-state-layer-size:40px;--mat-radio-touch-target-size:48px}html{--mat-radio-state-layer-size:40px;--mat-radio-touch-target-display:block}html{--mat-radio-label-text-font:Roboto, sans-serif;--mat-radio-label-text-line-height:20px;--mat-radio-label-text-size:14px;--mat-radio-label-text-tracking:.0178571429em;--mat-radio-label-text-weight:400}html{--mat-slider-active-track-height:6px;--mat-slider-active-track-shape:9999px;--mat-slider-handle-elevation:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-slider-handle-height:20px;--mat-slider-handle-shape:50%;--mat-slider-handle-width:20px;--mat-slider-inactive-track-height:4px;--mat-slider-inactive-track-shape:9999px;--mat-slider-value-indicator-border-radius:4px;--mat-slider-value-indicator-caret-display:block;--mat-slider-value-indicator-container-transform:translateX(-50%);--mat-slider-value-indicator-height:32px;--mat-slider-value-indicator-padding:0 12px;--mat-slider-value-indicator-text-transform:none;--mat-slider-value-indicator-width:auto;--mat-slider-with-overlap-handle-outline-width:1px;--mat-slider-with-tick-marks-active-container-opacity:.6;--mat-slider-with-tick-marks-container-shape:50%;--mat-slider-with-tick-marks-container-size:2px;--mat-slider-with-tick-marks-inactive-container-opacity:.6;--mat-slider-value-indicator-transform-origin:bottom}html{--mat-slider-active-track-color:#3f51b5;--mat-slider-focus-handle-color:#3f51b5;--mat-slider-handle-color:#3f51b5;--mat-slider-hover-handle-color:#3f51b5;--mat-slider-focus-state-layer-color:color-mix(in srgb, #3f51b5 12%, transparent);--mat-slider-hover-state-layer-color:color-mix(in srgb, #3f51b5 4%, transparent);--mat-slider-inactive-track-color:#3f51b5;--mat-slider-ripple-color:#3f51b5;--mat-slider-with-tick-marks-active-container-color:white;--mat-slider-with-tick-marks-inactive-container-color:#3f51b5;--mat-slider-disabled-active-track-color:rgba(0, 0, 0, .87);--mat-slider-disabled-handle-color:rgba(0, 0, 0, .87);--mat-slider-disabled-inactive-track-color:rgba(0, 0, 0, .87);--mat-slider-label-container-color:#424242;--mat-slider-label-label-text-color:white;--mat-slider-value-indicator-opacity:1;--mat-slider-with-overlap-handle-outline-color:rgba(0, 0, 0, .87);--mat-slider-with-tick-marks-disabled-container-color:rgba(0, 0, 0, .87)}html{--mat-slider-label-label-text-font:Roboto, sans-serif;--mat-slider-label-label-text-size:14px;--mat-slider-label-label-text-line-height:22px;--mat-slider-label-label-text-tracking:.0071428571em;--mat-slider-label-label-text-weight:500}html{--mat-menu-container-shape:4px;--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-menu-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-menu-item-label-text-color:rgba(0, 0, 0, .87);--mat-menu-item-icon-color:rgba(0, 0, 0, .87);--mat-menu-item-hover-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 4%, transparent);--mat-menu-item-focus-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-menu-container-color:white;--mat-menu-divider-color:rgba(0, 0, 0, .12)}html{--mat-menu-item-label-text-font:Roboto, sans-serif;--mat-menu-item-label-text-size:16px;--mat-menu-item-label-text-tracking:.03125em;--mat-menu-item-label-text-line-height:24px;--mat-menu-item-label-text-weight:400}html{--mat-list-active-indicator-color:transparent;--mat-list-active-indicator-shape:4px;--mat-list-list-item-container-shape:0;--mat-list-list-item-leading-avatar-shape:50%;--mat-list-list-item-container-color:transparent;--mat-list-list-item-selected-container-color:transparent;--mat-list-list-item-leading-avatar-color:transparent;--mat-list-list-item-leading-icon-size:24px;--mat-list-list-item-leading-avatar-size:40px;--mat-list-list-item-trailing-icon-size:24px;--mat-list-list-item-disabled-state-layer-color:transparent;--mat-list-list-item-disabled-state-layer-opacity:0;--mat-list-list-item-disabled-label-text-opacity:.38;--mat-list-list-item-disabled-leading-icon-opacity:.38;--mat-list-list-item-disabled-trailing-icon-opacity:.38}html{--mat-list-list-item-label-text-color:rgba(0, 0, 0, .87);--mat-list-list-item-supporting-text-color:rgba(0, 0, 0, .54);--mat-list-list-item-leading-icon-color:rgba(0, 0, 0, .54);--mat-list-list-item-trailing-supporting-text-color:rgba(0, 0, 0, .54);--mat-list-list-item-trailing-icon-color:rgba(0, 0, 0, .54);--mat-list-list-item-selected-trailing-icon-color:rgba(0, 0, 0, .54);--mat-list-list-item-disabled-label-text-color:rgba(0, 0, 0, .87);--mat-list-list-item-disabled-leading-icon-color:rgba(0, 0, 0, .87);--mat-list-list-item-disabled-trailing-icon-color:rgba(0, 0, 0, .87);--mat-list-list-item-hover-label-text-color:rgba(0, 0, 0, .87);--mat-list-list-item-hover-leading-icon-color:rgba(0, 0, 0, .54);--mat-list-list-item-hover-state-layer-color:rgba(0, 0, 0, .87);--mat-list-list-item-hover-state-layer-opacity:.04;--mat-list-list-item-hover-trailing-icon-color:rgba(0, 0, 0, .54);--mat-list-list-item-focus-label-text-color:rgba(0, 0, 0, .87);--mat-list-list-item-focus-state-layer-color:rgba(0, 0, 0, .87);--mat-list-list-item-focus-state-layer-opacity:.12}html{--mat-list-list-item-leading-icon-start-space:16px;--mat-list-list-item-leading-icon-end-space:32px;--mat-list-list-item-one-line-container-height:48px;--mat-list-list-item-two-line-container-height:64px;--mat-list-list-item-three-line-container-height:88px}html{--mat-list-list-item-label-text-font:Roboto, sans-serif;--mat-list-list-item-label-text-line-height:24px;--mat-list-list-item-label-text-size:16px;--mat-list-list-item-label-text-tracking:.03125em;--mat-list-list-item-label-text-weight:400;--mat-list-list-item-supporting-text-font:Roboto, sans-serif;--mat-list-list-item-supporting-text-line-height:20px;--mat-list-list-item-supporting-text-size:14px;--mat-list-list-item-supporting-text-tracking:.0178571429em;--mat-list-list-item-supporting-text-weight:400;--mat-list-list-item-trailing-supporting-text-font:Roboto, sans-serif;--mat-list-list-item-trailing-supporting-text-line-height:20px;--mat-list-list-item-trailing-supporting-text-size:12px;--mat-list-list-item-trailing-supporting-text-tracking:.0333333333em;--mat-list-list-item-trailing-supporting-text-weight:400}html{--mat-paginator-page-size-select-width:84px;--mat-paginator-page-size-select-touch-target-height:48px}html{--mat-paginator-container-text-color:rgba(0, 0, 0, .87);--mat-paginator-container-background-color:white;--mat-paginator-enabled-icon-color:rgba(0, 0, 0, .54);--mat-paginator-disabled-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent)}html{--mat-paginator-container-size:56px;--mat-paginator-form-field-container-height:40px;--mat-paginator-form-field-container-vertical-padding:8px;--mat-paginator-touch-target-display:block}html{--mat-paginator-container-text-font:Roboto, sans-serif;--mat-paginator-container-text-line-height:20px;--mat-paginator-container-text-size:12px;--mat-paginator-container-text-tracking:.0333333333em;--mat-paginator-container-text-weight:400;--mat-paginator-select-trigger-text-size:12px}html{--mat-tab-container-height:48px;--mat-tab-divider-color:transparent;--mat-tab-divider-height:0;--mat-tab-active-indicator-height:2px;--mat-tab-active-indicator-shape:0}html{--mat-checkbox-disabled-selected-checkmark-color:white;--mat-checkbox-selected-focus-state-layer-opacity:.12;--mat-checkbox-selected-hover-state-layer-opacity:.04;--mat-checkbox-selected-pressed-state-layer-opacity:.12;--mat-checkbox-unselected-focus-state-layer-opacity:.12;--mat-checkbox-unselected-hover-state-layer-opacity:.04;--mat-checkbox-unselected-pressed-state-layer-opacity:.12;--mat-checkbox-touch-target-size:48px}html{--mat-checkbox-disabled-label-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-checkbox-label-text-color:rgba(0, 0, 0, .87);--mat-checkbox-disabled-selected-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-checkbox-disabled-unselected-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-checkbox-selected-checkmark-color:white;--mat-checkbox-selected-focus-icon-color:#ff4081;--mat-checkbox-selected-hover-icon-color:#ff4081;--mat-checkbox-selected-icon-color:#ff4081;--mat-checkbox-selected-pressed-icon-color:#ff4081;--mat-checkbox-unselected-focus-icon-color:rgba(0, 0, 0, .87);--mat-checkbox-unselected-hover-icon-color:rgba(0, 0, 0, .87);--mat-checkbox-unselected-icon-color:rgba(0, 0, 0, .54);--mat-checkbox-selected-focus-state-layer-color:#ff4081;--mat-checkbox-selected-hover-state-layer-color:#ff4081;--mat-checkbox-selected-pressed-state-layer-color:#ff4081;--mat-checkbox-unselected-focus-state-layer-color:rgba(0, 0, 0, .87);--mat-checkbox-unselected-hover-state-layer-color:rgba(0, 0, 0, .87);--mat-checkbox-unselected-pressed-state-layer-color:rgba(0, 0, 0, .87)}html{--mat-checkbox-touch-target-display:block;--mat-checkbox-state-layer-size:40px}html{--mat-checkbox-label-text-font:Roboto, sans-serif;--mat-checkbox-label-text-line-height:20px;--mat-checkbox-label-text-size:14px;--mat-checkbox-label-text-tracking:.0178571429em;--mat-checkbox-label-text-weight:400}html{--mat-button-filled-container-shape:4px;--mat-button-filled-horizontal-padding:16px;--mat-button-filled-icon-offset:-4px;--mat-button-filled-icon-spacing:8px;--mat-button-filled-touch-target-size:48px;--mat-button-outlined-container-shape:4px;--mat-button-outlined-horizontal-padding:15px;--mat-button-outlined-icon-offset:-4px;--mat-button-outlined-icon-spacing:8px;--mat-button-outlined-keep-touch-target:false;--mat-button-outlined-outline-width:1px;--mat-button-outlined-touch-target-size:48px;--mat-button-protected-container-elevation-shadow:0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);--mat-button-protected-container-shape:4px;--mat-button-protected-disabled-container-elevation-shadow:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-button-protected-focus-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-button-protected-horizontal-padding:16px;--mat-button-protected-hover-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-button-protected-icon-offset:-4px;--mat-button-protected-icon-spacing:8px;--mat-button-protected-pressed-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-button-protected-touch-target-size:48px;--mat-button-text-container-shape:4px;--mat-button-text-horizontal-padding:8px;--mat-button-text-icon-offset:0;--mat-button-text-icon-spacing:8px;--mat-button-text-with-icon-horizontal-padding:8px;--mat-button-text-touch-target-size:48px;--mat-button-tonal-container-shape:4px;--mat-button-tonal-horizontal-padding:16px;--mat-button-tonal-icon-offset:-4px;--mat-button-tonal-icon-spacing:8px;--mat-button-tonal-touch-target-size:48px}html{--mat-button-filled-container-color:white;--mat-button-filled-disabled-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-filled-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-filled-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-button-filled-focus-state-layer-opacity:.12;--mat-button-filled-hover-state-layer-opacity:.04;--mat-button-filled-label-text-color:rgba(0, 0, 0, .87);--mat-button-filled-pressed-state-layer-opacity:.12;--mat-button-filled-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-filled-state-layer-color:rgba(0, 0, 0, .87);--mat-button-outlined-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-outlined-disabled-outline-color:rgba(0, 0, 0, .12);--mat-button-outlined-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-button-outlined-focus-state-layer-opacity:.12;--mat-button-outlined-hover-state-layer-opacity:.04;--mat-button-outlined-label-text-color:rgba(0, 0, 0, .87);--mat-button-outlined-outline-color:rgba(0, 0, 0, .12);--mat-button-outlined-pressed-state-layer-opacity:.12;--mat-button-outlined-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-outlined-state-layer-color:rgba(0, 0, 0, .87);--mat-button-protected-container-color:white;--mat-button-protected-disabled-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-protected-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-protected-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-button-protected-focus-state-layer-opacity:.12;--mat-button-protected-hover-state-layer-opacity:.04;--mat-button-protected-label-text-color:rgba(0, 0, 0, .87);--mat-button-protected-pressed-state-layer-opacity:.12;--mat-button-protected-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-protected-state-layer-color:rgba(0, 0, 0, .87);--mat-button-text-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-text-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-button-text-focus-state-layer-opacity:.12;--mat-button-text-hover-state-layer-opacity:.04;--mat-button-text-label-text-color:rgba(0, 0, 0, .87);--mat-button-text-pressed-state-layer-opacity:.12;--mat-button-text-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-text-state-layer-color:rgba(0, 0, 0, .87);--mat-button-tonal-container-color:white;--mat-button-tonal-disabled-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-tonal-disabled-label-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-tonal-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-button-tonal-focus-state-layer-opacity:.12;--mat-button-tonal-hover-state-layer-opacity:.04;--mat-button-tonal-label-text-color:rgba(0, 0, 0, .87);--mat-button-tonal-pressed-state-layer-opacity:.12;--mat-button-tonal-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-tonal-state-layer-color:rgba(0, 0, 0, .87)}html{--mat-button-filled-container-height:36px;--mat-button-filled-touch-target-display:block;--mat-button-outlined-container-height:36px;--mat-button-outlined-touch-target-display:block;--mat-button-protected-container-height:36px;--mat-button-protected-touch-target-display:block;--mat-button-text-container-height:36px;--mat-button-text-touch-target-display:block;--mat-button-tonal-container-height:36px;--mat-button-tonal-touch-target-display:block}html{--mat-button-filled-label-text-font:Roboto, sans-serif;--mat-button-filled-label-text-size:14px;--mat-button-filled-label-text-tracking:.0892857143em;--mat-button-filled-label-text-transform:none;--mat-button-filled-label-text-weight:500;--mat-button-outlined-label-text-font:Roboto, sans-serif;--mat-button-outlined-label-text-size:14px;--mat-button-outlined-label-text-tracking:.0892857143em;--mat-button-outlined-label-text-transform:none;--mat-button-outlined-label-text-weight:500;--mat-button-protected-label-text-font:Roboto, sans-serif;--mat-button-protected-label-text-size:14px;--mat-button-protected-label-text-tracking:.0892857143em;--mat-button-protected-label-text-transform:none;--mat-button-protected-label-text-weight:500;--mat-button-text-label-text-font:Roboto, sans-serif;--mat-button-text-label-text-size:14px;--mat-button-text-label-text-tracking:.0892857143em;--mat-button-text-label-text-transform:none;--mat-button-text-label-text-weight:500;--mat-button-tonal-label-text-font:Roboto, sans-serif;--mat-button-tonal-label-text-size:14px;--mat-button-tonal-label-text-tracking:.0892857143em;--mat-button-tonal-label-text-transform:none;--mat-button-tonal-label-text-weight:500}html{--mat-icon-button-icon-size:24px;--mat-icon-button-container-shape:50%;--mat-icon-button-touch-target-size:48px}html{--mat-icon-button-disabled-icon-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-icon-button-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-icon-button-focus-state-layer-opacity:.12;--mat-icon-button-hover-state-layer-opacity:.04;--mat-icon-button-icon-color:inherit;--mat-icon-button-pressed-state-layer-opacity:.12;--mat-icon-button-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-icon-button-state-layer-color:rgba(0, 0, 0, .87)}html{--mat-icon-button-touch-target-display:block}html{--mat-fab-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-fab-container-shape:50%;--mat-fab-touch-target-size:48px;--mat-fab-extended-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-fab-extended-container-height:48px;--mat-fab-extended-container-shape:24px;--mat-fab-extended-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-extended-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-extended-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-fab-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-fab-small-container-elevation-shadow:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-fab-small-container-shape:50%;--mat-fab-small-touch-target-size:48px;--mat-fab-small-focus-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-small-hover-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-fab-small-pressed-container-elevation-shadow:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mat-fab-container-color:white;--mat-fab-disabled-state-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-fab-disabled-state-foreground-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-fab-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-fab-focus-state-layer-opacity:.12;--mat-fab-foreground-color:rgba(0, 0, 0, .87);--mat-fab-hover-state-layer-opacity:.04;--mat-fab-pressed-state-layer-opacity:.12;--mat-fab-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-fab-small-container-color:white;--mat-fab-small-disabled-state-container-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-fab-small-disabled-state-foreground-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-fab-small-disabled-state-layer-color:rgba(0, 0, 0, .54);--mat-fab-small-focus-state-layer-opacity:.12;--mat-fab-small-foreground-color:rgba(0, 0, 0, .87);--mat-fab-small-hover-state-layer-opacity:.04;--mat-fab-small-pressed-state-layer-opacity:.12;--mat-fab-small-ripple-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-fab-small-state-layer-color:rgba(0, 0, 0, .87);--mat-fab-state-layer-color:rgba(0, 0, 0, .87)}html{--mat-fab-small-touch-target-display:block;--mat-fab-touch-target-display:block}html{--mat-fab-extended-label-text-font:Roboto, sans-serif;--mat-fab-extended-label-text-size:14px;--mat-fab-extended-label-text-tracking:.0892857143em;--mat-fab-extended-label-text-weight:500}html{--mat-snack-bar-container-shape:4px}html{--mat-snack-bar-container-color:#424242;--mat-snack-bar-supporting-text-color:white;--mat-snack-bar-button-color:#7986cb}html{--mat-snack-bar-supporting-text-font:Roboto, sans-serif;--mat-snack-bar-supporting-text-line-height:20px;--mat-snack-bar-supporting-text-size:14px;--mat-snack-bar-supporting-text-weight:400}html{--mat-table-row-item-outline-width:1px}html{--mat-table-background-color:white;--mat-table-header-headline-color:rgba(0, 0, 0, .87);--mat-table-row-item-label-text-color:rgba(0, 0, 0, .87);--mat-table-row-item-outline-color:rgba(0, 0, 0, .12)}html{--mat-table-header-container-height:56px;--mat-table-footer-container-height:52px;--mat-table-row-item-container-height:52px}html{--mat-table-header-headline-font:Roboto, sans-serif;--mat-table-header-headline-line-height:22px;--mat-table-header-headline-size:14px;--mat-table-header-headline-weight:500;--mat-table-header-headline-tracking:.0071428571em;--mat-table-row-item-label-text-font:Roboto, sans-serif;--mat-table-row-item-label-text-line-height:20px;--mat-table-row-item-label-text-size:14px;--mat-table-row-item-label-text-weight:400;--mat-table-row-item-label-text-tracking:.0178571429em;--mat-table-footer-supporting-text-font:Roboto, sans-serif;--mat-table-footer-supporting-text-line-height:20px;--mat-table-footer-supporting-text-size:14px;--mat-table-footer-supporting-text-weight:400;--mat-table-footer-supporting-text-tracking:.0178571429em}html{--mat-progress-spinner-active-indicator-width:4px;--mat-progress-spinner-size:48px}html{--mat-progress-spinner-active-indicator-color:#3f51b5}html{--mat-badge-container-shape:50%;--mat-badge-container-size:unset;--mat-badge-small-size-container-size:unset;--mat-badge-large-size-container-size:unset;--mat-badge-legacy-container-size:22px;--mat-badge-legacy-small-size-container-size:16px;--mat-badge-legacy-large-size-container-size:28px;--mat-badge-container-offset:-11px 0;--mat-badge-small-size-container-offset:-8px 0;--mat-badge-large-size-container-offset:-14px 0;--mat-badge-container-overlap-offset:-11px;--mat-badge-small-size-container-overlap-offset:-8px;--mat-badge-large-size-container-overlap-offset:-14px;--mat-badge-container-padding:0;--mat-badge-small-size-container-padding:0;--mat-badge-large-size-container-padding:0}html{--mat-badge-background-color:#3f51b5;--mat-badge-text-color:white;--mat-badge-disabled-state-background-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-badge-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent)}html{--mat-badge-text-font:Roboto, sans-serif;--mat-badge-line-height:22px;--mat-badge-text-size:12px;--mat-badge-text-weight:600;--mat-badge-small-size-text-size:9px;--mat-badge-small-size-line-height:16px;--mat-badge-large-size-text-size:24px;--mat-badge-large-size-line-height:28px}html{--mat-bottom-sheet-container-shape:4px}html{--mat-bottom-sheet-container-text-color:rgba(0, 0, 0, .87);--mat-bottom-sheet-container-background-color:white}html{--mat-bottom-sheet-container-text-font:Roboto, sans-serif;--mat-bottom-sheet-container-text-line-height:20px;--mat-bottom-sheet-container-text-size:14px;--mat-bottom-sheet-container-text-tracking:.0178571429em;--mat-bottom-sheet-container-text-weight:400}html{--mat-button-toggle-focus-state-layer-opacity:.12;--mat-button-toggle-hover-state-layer-opacity:.04;--mat-button-toggle-legacy-focus-state-layer-opacity:1;--mat-button-toggle-legacy-height:36px;--mat-button-toggle-legacy-shape:2px;--mat-button-toggle-shape:4px}html{--mat-button-toggle-background-color:white;--mat-button-toggle-disabled-selected-state-background-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-toggle-disabled-selected-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-toggle-disabled-state-background-color:white;--mat-button-toggle-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-toggle-divider-color:rgba(0, 0, 0, .12);--mat-button-toggle-legacy-disabled-selected-state-background-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-toggle-legacy-disabled-state-background-color:white;--mat-button-toggle-legacy-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-button-toggle-legacy-selected-state-background-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-toggle-legacy-selected-state-text-color:rgba(0, 0, 0, .87);--mat-button-toggle-legacy-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-toggle-legacy-text-color:rgba(0, 0, 0, .87);--mat-button-toggle-selected-state-background-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-button-toggle-selected-state-text-color:rgba(0, 0, 0, .87);--mat-button-toggle-state-layer-color:rgba(0, 0, 0, .87);--mat-button-toggle-text-color:rgba(0, 0, 0, .87)}html{--mat-button-toggle-height:48px}html{--mat-button-toggle-label-text-font:Roboto, sans-serif;--mat-button-toggle-label-text-line-height:24px;--mat-button-toggle-label-text-size:16px;--mat-button-toggle-label-text-tracking:.03125em;--mat-button-toggle-label-text-weight:400;--mat-button-toggle-legacy-label-text-font:Roboto, sans-serif;--mat-button-toggle-legacy-label-text-line-height:24px;--mat-button-toggle-legacy-label-text-size:16px;--mat-button-toggle-legacy-label-text-tracking:.03125em;--mat-button-toggle-legacy-label-text-weight:400}html{--mat-datepicker-calendar-container-shape:4px;--mat-datepicker-calendar-container-touch-shape:4px;--mat-datepicker-calendar-container-elevation-shadow:0px 2px 4px -1px rgba(0, 0, 0, .2), 0px 4px 5px 0px rgba(0, 0, 0, .14), 0px 1px 10px 0px rgba(0, 0, 0, .12);--mat-datepicker-calendar-container-touch-elevation-shadow:0px 11px 15px -7px rgba(0, 0, 0, .2), 0px 24px 38px 3px rgba(0, 0, 0, .14), 0px 9px 46px 8px rgba(0, 0, 0, .12)}html{--mat-datepicker-calendar-date-in-range-state-background-color:color-mix(in srgb, #3f51b5 20%, transparent);--mat-datepicker-calendar-date-in-comparison-range-state-background-color:color-mix(in srgb, #ff4081 20%, transparent);--mat-datepicker-calendar-date-in-overlap-range-state-background-color:#a8dab5;--mat-datepicker-calendar-date-in-overlap-range-selected-state-background-color:rgb(69.5241935484, 163.4758064516, 93.9516129032);--mat-datepicker-calendar-date-selected-state-text-color:white;--mat-datepicker-calendar-date-selected-state-background-color:#3f51b5;--mat-datepicker-calendar-date-selected-disabled-state-background-color:color-mix(in srgb, #3f51b5 38%, transparent);--mat-datepicker-calendar-date-today-selected-state-outline-color:white;--mat-datepicker-calendar-date-focus-state-background-color:color-mix(in srgb, #3f51b5 12%, transparent);--mat-datepicker-calendar-date-hover-state-background-color:color-mix(in srgb, #3f51b5 4%, transparent);--mat-datepicker-toggle-active-state-icon-color:#3f51b5;--mat-datepicker-toggle-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-body-label-text-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-period-button-text-color:rgba(0, 0, 0, .87);--mat-datepicker-calendar-period-button-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-navigation-button-icon-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-header-divider-color:rgba(0, 0, 0, .12);--mat-datepicker-calendar-header-text-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-date-today-outline-color:rgba(0, 0, 0, .54);--mat-datepicker-calendar-date-today-disabled-state-outline-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-datepicker-calendar-date-text-color:rgba(0, 0, 0, .87);--mat-datepicker-calendar-date-outline-color:transparent;--mat-datepicker-calendar-date-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-datepicker-calendar-date-preview-state-outline-color:rgba(0, 0, 0, .54);--mat-datepicker-range-input-separator-color:rgba(0, 0, 0, .87);--mat-datepicker-range-input-disabled-state-separator-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-datepicker-range-input-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-datepicker-calendar-container-background-color:white;--mat-datepicker-calendar-container-text-color:rgba(0, 0, 0, .87)}html{--mat-datepicker-calendar-text-font:Roboto, sans-serif;--mat-datepicker-calendar-text-size:13px;--mat-datepicker-calendar-body-label-text-size:14px;--mat-datepicker-calendar-body-label-text-weight:500;--mat-datepicker-calendar-period-button-text-size:14px;--mat-datepicker-calendar-period-button-text-weight:500;--mat-datepicker-calendar-header-text-size:11px;--mat-datepicker-calendar-header-text-weight:400}html{--mat-divider-width:1px}html{--mat-divider-color:rgba(0, 0, 0, .12)}html{--mat-expansion-container-shape:4px;--mat-expansion-container-elevation-shadow:0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);--mat-expansion-legacy-header-indicator-display:inline-block;--mat-expansion-header-indicator-display:none}html{--mat-expansion-container-background-color:white;--mat-expansion-container-text-color:rgba(0, 0, 0, .87);--mat-expansion-actions-divider-color:rgba(0, 0, 0, .12);--mat-expansion-header-hover-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 4%, transparent);--mat-expansion-header-focus-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-expansion-header-disabled-state-text-color:color-mix(in srgb, rgba(0, 0, 0, .87) 38%, transparent);--mat-expansion-header-text-color:rgba(0, 0, 0, .87);--mat-expansion-header-description-color:rgba(0, 0, 0, .54);--mat-expansion-header-indicator-color:rgba(0, 0, 0, .54)}html{--mat-expansion-header-collapsed-state-height:48px;--mat-expansion-header-expanded-state-height:64px}html{--mat-expansion-header-text-font:Roboto, sans-serif;--mat-expansion-header-text-size:14px;--mat-expansion-header-text-weight:500;--mat-expansion-header-text-line-height:inherit;--mat-expansion-header-text-tracking:inherit;--mat-expansion-container-text-font:Roboto, sans-serif;--mat-expansion-container-text-line-height:20px;--mat-expansion-container-text-size:14px;--mat-expansion-container-text-tracking:.0178571429em;--mat-expansion-container-text-weight:400}html{--mat-grid-list-tile-header-primary-text-size:14px;--mat-grid-list-tile-header-secondary-text-size:12px;--mat-grid-list-tile-footer-primary-text-size:14px;--mat-grid-list-tile-footer-secondary-text-size:12px}html{--mat-icon-color:inherit}html{--mat-sidenav-container-shape:0;--mat-sidenav-container-elevation-shadow:0px 8px 10px -5px rgba(0, 0, 0, .2), 0px 16px 24px 2px rgba(0, 0, 0, .14), 0px 6px 30px 5px rgba(0, 0, 0, .12);--mat-sidenav-container-width:auto}html{--mat-sidenav-container-divider-color:rgba(0, 0, 0, .12);--mat-sidenav-container-background-color:white;--mat-sidenav-container-text-color:rgba(0, 0, 0, .87);--mat-sidenav-content-background-color:#fafafa;--mat-sidenav-content-text-color:rgba(0, 0, 0, .87);--mat-sidenav-scrim-color:rgba(0, 0, 0, .6)}html{--mat-stepper-header-focus-state-layer-shape:0;--mat-stepper-header-hover-state-layer-shape:0}html{--mat-stepper-header-icon-foreground-color:white;--mat-stepper-header-selected-state-icon-background-color:#3f51b5;--mat-stepper-header-selected-state-icon-foreground-color:white;--mat-stepper-header-done-state-icon-background-color:#3f51b5;--mat-stepper-header-done-state-icon-foreground-color:white;--mat-stepper-header-edit-state-icon-background-color:#3f51b5;--mat-stepper-header-edit-state-icon-foreground-color:white;--mat-stepper-container-color:white;--mat-stepper-line-color:rgba(0, 0, 0, .12);--mat-stepper-header-hover-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 4%, transparent);--mat-stepper-header-focus-state-layer-color:color-mix(in srgb, rgba(0, 0, 0, .87) 12%, transparent);--mat-stepper-header-label-text-color:rgba(0, 0, 0, .54);--mat-stepper-header-optional-label-text-color:rgba(0, 0, 0, .54);--mat-stepper-header-selected-state-label-text-color:rgba(0, 0, 0, .87);--mat-stepper-header-error-state-label-text-color:#f44336;--mat-stepper-header-icon-background-color:rgba(0, 0, 0, .54);--mat-stepper-header-error-state-icon-foreground-color:#f44336;--mat-stepper-header-error-state-icon-background-color:transparent}html{--mat-stepper-header-height:72px}html{--mat-stepper-container-text-font:Roboto, sans-serif;--mat-stepper-header-label-text-font:Roboto, sans-serif;--mat-stepper-header-label-text-size:14px;--mat-stepper-header-label-text-weight:400;--mat-stepper-header-error-state-label-text-size:16px;--mat-stepper-header-selected-state-label-text-size:16px;--mat-stepper-header-selected-state-label-text-weight:400}html{--mat-sort-arrow-color:rgba(0, 0, 0, .87)}html{--mat-toolbar-container-background-color:white;--mat-toolbar-container-text-color:rgba(0, 0, 0, .87)}html{--mat-toolbar-standard-height:64px;--mat-toolbar-mobile-height:56px}html{--mat-toolbar-title-text-font:Roboto, sans-serif;--mat-toolbar-title-text-line-height:32px;--mat-toolbar-title-text-size:20px;--mat-toolbar-title-text-tracking:.0125em;--mat-toolbar-title-text-weight:500}html{--mat-tree-container-background-color:white;--mat-tree-node-text-color:rgba(0, 0, 0, .87)}html{--mat-tree-node-min-height:48px}html{--mat-tree-node-text-font:Roboto, sans-serif;--mat-tree-node-text-size:14px;--mat-tree-node-text-weight:400}html{--mat-timepicker-container-shape:4px;--mat-timepicker-container-elevation-shadow:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-timepicker-container-background-color:white}*{box-sizing:border-box}html,body{margin:0;padding:0;height:100%;overflow:hidden}body{font-family:Roboto,Helvetica Neue,sans-serif;background-color:#f5f5f5}</style><link rel="stylesheet" href="styles-QBUDNRKH.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-QBUDNRKH.css"></noscript></head>
12
12
  <body>
13
13
  <app-root></app-root>
14
- <link rel="modulepreload" href="chunk-JGNPKRLU.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-DXMGUDSM.js" type="module"></script></body>
14
+ <link rel="modulepreload" href="chunk-JGNPKRLU.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-HYLGIPYS.js" type="module"></script></body>
15
15
  </html>
@@ -5595,4 +5595,4 @@ HSA_OVERRIDE_GFX_VERSION=11.0.0`,"matTooltip","Environment variables for the ser
5595
5595
  `)){let n=t.trim();if(!n||n.startsWith("#"))continue;let a=n.indexOf("=");a<=0||(e[n.slice(0,a).trim()]=n.slice(a+1))}return e}save(){if(this.form.invalid)return;let e=this.parseEnvironment(),t=B({name:this.form.controls.name.value.trim(),type:"vllm",command:this.form.controls.command.value.trim(),flags:this.buildFlags()},Object.keys(e).length?{environment:e}:{});this.dialogRef.close(t)}cancel(){this.dialogRef.close()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-vllm-dialog"]],decls:258,vars:108,consts:[["commandAuto","matAutocomplete"],["modelAuto","matAutocomplete"],["maxLenAuto","matAutocomplete"],["hostAuto","matAutocomplete"],["mat-dialog-title",""],[1,"vllm-form",3,"formGroup"],["appearance","outline",1,"full-width"],["matInput","","formControlName","name","placeholder","e.g. vllm-qwen-bf16-4gpu",3,"disabled"],["matInput","","formControlName","command","placeholder","/path/to/vllm/run.sh",3,"matAutocomplete"],[3,"value"],["expanded",""],["matInput","","formControlName","model","placeholder","unsloth/Qwen3.8-27B or /path/to/model","matTooltip","Model to serve. HF repo id or local path. Passed as the positional argument to 'vllm serve'",3,"matAutocomplete"],["matInput","","formControlName","servedModelName","type","text","placeholder","e.g. qwen-256k, qwen-256k-fast","matTooltip","Name(s) the model is served under. List several separated by commas \u2014 emitted as a single --served-model-name flag with names separated by spaces"],[1,"form-row"],["appearance","outline",1,"form-col"],["matInput","","formControlName","tokenizer","type","text","matTooltip","Tokenizer path (HF repo id or local). Defaults to the model path"],["formControlName","dtype","matTooltip","Data type for model weights and activations"],["matInput","","formControlName","tensorParallelSize","type","number","matTooltip","Number of tensor-parallel replicas (GPUs sharding each model copy). 1 = single GPU"],["matInput","","formControlName","pipelineParallelSize","type","number","matTooltip","Number of pipeline-parallel replicas (model split in stages across GPU groups)"],["matInput","","formControlName","maxParallelLoadingWorkers","type","number","matTooltip","Max number of parallel workers for safetensors loading. 0 = default"],["matInput","","formControlName","gpuMemoryUtilization","type","number","step","0.05","min","0","max","1","matTooltip","Fraction of GPU memory to reserve for the model and KV cache (0.0\u20131.0)"],["matInput","","formControlName","swapSpace","type","number","matTooltip","CPU offload space per GPU (GiB)"],["matInput","","formControlName","cpuOffloadGb","type","number","matTooltip","Space to offload model weights to CPU (GiB). 0 = disabled"],["matInput","","formControlName","device","type","text","placeholder","auto","matTooltip","Device(s) for vLLM execution, e.g. 'auto', 'cuda:0,1' or 'rocm'"],["formControlName","attentionBackend","matTooltip","Attention kernel backend override. TRITON_ATTN is the tested choice on ROCm (4x RX 7900 XTX). Empty = auto"],["value",""],["matInput","","formControlName","kvCacheMemory","type","number","matTooltip","Explicit KV cache size in bytes. 0 = auto (derived from GPU memory utilization)"],["matInput","","formControlName","maxModelLen","type","text","placeholder","e.g. 24K, 262144","matTooltip","Model context length. Supports: 20000, 20K. Empty = model's max. Large values need more KV cache",3,"blur","keyup.enter","matAutocomplete"],["matInput","","formControlName","maxNumSeqs","type","number","matTooltip","Maximum number of sequences per iteration (concurrent requests)"],["formControlName","enableChunkedPrefill","matTooltip","Split long prompts into chunks for continuous batching. auto = decided by vLLM"],["value","auto"],["value","on"],["value","off"],["matInput","","formControlName","maxNumBatchedTokens","type","number","matTooltip","Max number of tokens per batch (prefill+decode budget). 0 = default"],["matInput","","formControlName","blockSize","type","number","matTooltip","Token block size for the paged KV cache. 0 = default (platform-specific)"],["formControlName","specMethod","matTooltip","Speculative decoding method. draft-model variants use a separate draft model"],["matInput","","formControlName","specTokens","type","number","matTooltip","Number of speculative tokens (proposal length). 0 = method default"],["matInput","","formControlName","temperature","type","number","matTooltip","Default temperature. 1.0 = default"],["matInput","","formControlName","topP","type","number","step","0.05","matTooltip","Nucleus sampling. 1.0 = default"],["matInput","","formControlName","topK","type","number","matTooltip","Top-K sampling. -1 = disabled (default)"],["matInput","","formControlName","minP","type","number","step","0.05","matTooltip","Min-P sampling threshold. 0.0 = disabled (default)"],["matInput","","formControlName","seed","type","number","matTooltip","RNG seed. -1 = random (default)"],["matInput","","formControlName","repetitionPenalty","type","number","step","0.05","matTooltip","Penalty for repeating tokens. 1.0 = disabled (default)"],["matInput","","formControlName","maxNumSeq","type","number","matTooltip","Maximum number of tokens per sequence. 0 = model default"],["formControlName","trustRemoteCode"],["formControlName","enableAutoToolChoice"],["formControlName","toolCallParser","matTooltip","Parser for tool calls. Requires --enable-auto-tool-choice",3,"disabled"],["formControlName","reasoningParser","matTooltip","Parser separating reasoning content from final content in chat completions"],["formControlName","enablePrefixCaching","matTooltip","Cache prefixes of prompts to speed up repeated requests. auto = decided by vLLM"],["matInput","","formControlName","host","type","text","matTooltip","IP address to listen (default: 127.0.0.1)",3,"matAutocomplete"],["matInput","","formControlName","port","type","number","matTooltip","Port to listen (default: 8000)"],["matInput","","formControlName","apiKey","type","text","matTooltip","API key for authentication. Leave empty if the launcher adds it itself (e.g. run.sh reads keys.ini)"],["matInput","","formControlName","extraFlags","rows","4","wrap","off","placeholder",`--enforce-eager
5596
5596
  --disable-log-requests`,"matTooltip","Any vLLM flags not covered by the fields above (one per line). Pass-through \u2014 not validated",1,"flags-textarea"],["matInput","","formControlName","envText","rows","4","wrap","off","placeholder",`HF_TOKEN=hf_xxx
5597
5597
  HIP_VISIBLE_DEVICES=0,1,2,3`,"matTooltip","Environment variables for the service process (KEY=VALUE, one per line)",1,"env-textarea"],["align","end"],["mat-stroked-button","",3,"click"],["mat-raised-button","","color","primary",3,"click","disabled"],[1,"auto-path"],[1,"auto-from"],[1,"subsection-label"],["appearance","outline",1,"form-col-60"],["matInput","","formControlName","specDraftModel","type","text","placeholder","/path/to/draft-model or HF repo id","matTooltip","Draft model for speculative decoding (draft-model methods)"],["matInput","","formControlName","specDraftTensorParallelSize","type","number","matTooltip","Tensor parallel size of the draft model. 0 = same as main model"],["matInput","","formControlName","specNumDraftTokens","type","number","matTooltip","Number of tokens the draft model proposes in one step. 0 = default"]],template:function(t,n){if(t&1&&(s(0,"h2",4),m(1),l(),s(2,"mat-dialog-content")(3,"form",5)(4,"mat-form-field",6),_(5,"input",7),b(),s(6,"mat-label"),m(7,"Service Name"),l(),S(8,By,2,0,"mat-error")(9,zy,2,0,"mat-error"),l(),s(10,"mat-form-field",6),_(11,"input",8),b(),s(12,"mat-label"),m(13,"Command (launcher or binary)"),l(),S(14,jy,2,0,"mat-error"),l(),s(15,"mat-autocomplete",null,0),de(17,Hy,5,3,"mat-option",9,Fy),l(),s(19,"mat-expansion-panel",10)(20,"mat-expansion-panel-header")(21,"mat-panel-title"),m(22,"Model"),l()(),s(23,"mat-form-field",6),_(24,"input",11),b(),s(25,"mat-label"),m(26,"Model (serve)"),l(),S(27,Uy,2,0,"mat-error"),l(),s(28,"mat-autocomplete",null,1),de(30,Gy,5,2,"mat-option",9,St),l(),s(32,"mat-form-field",6),_(33,"input",12),b(),s(34,"mat-label"),m(35,"Served Model Name"),l()(),s(36,"div",13)(37,"mat-form-field",14),_(38,"input",15),b(),s(39,"mat-label"),m(40,"Tokenizer"),l()(),s(41,"mat-form-field",14)(42,"mat-select",16),de(43,$y,2,2,"mat-option",9,St),l(),b(),s(45,"mat-label"),m(46,"Dtype"),l()()()(),s(47,"mat-expansion-panel")(48,"mat-expansion-panel-header")(49,"mat-panel-title"),m(50,"Parallelism & Memory"),l()(),s(51,"div",13)(52,"mat-form-field",14),_(53,"input",17),b(),s(54,"mat-label"),m(55,"Tensor Parallel Size"),l()(),s(56,"mat-form-field",14),_(57,"input",18),b(),s(58,"mat-label"),m(59,"Pipeline Parallel Size"),l()(),s(60,"mat-form-field",14),_(61,"input",19),b(),s(62,"mat-label"),m(63,"Loading Workers"),l()()(),s(64,"div",13)(65,"mat-form-field",14),_(66,"input",20),b(),s(67,"mat-label"),m(68,"GPU Memory Utilization"),l()(),s(69,"mat-form-field",14),_(70,"input",21),b(),s(71,"mat-label"),m(72,"Swap Space (GiB)"),l()(),s(73,"mat-form-field",14),_(74,"input",22),b(),s(75,"mat-label"),m(76,"CPU Offload (GiB)"),l()(),s(77,"mat-form-field",14),_(78,"input",23),b(),s(79,"mat-label"),m(80,"Device"),l()()(),s(81,"div",13)(82,"mat-form-field",14)(83,"mat-select",24)(84,"mat-option",25),m(85,"(auto)"),l(),de(86,Wy,2,2,"mat-option",9,St),l(),b(),s(88,"mat-label"),m(89,"Attention Backend"),l()(),s(90,"mat-form-field",14),_(91,"input",26),b(),s(92,"mat-label"),m(93,"KV Cache Memory (bytes)"),l()()()(),s(94,"mat-expansion-panel")(95,"mat-expansion-panel-header")(96,"mat-panel-title"),m(97,"Context & Scheduling"),l()(),s(98,"div",13)(99,"mat-form-field",14)(100,"input",27),E("blur",function(){return n.onMaxLenInput()})("keyup.enter",function(){return n.onMaxLenInput()}),l(),b(),s(101,"mat-label"),m(102,"Max Model Len"),l()(),s(103,"mat-autocomplete",null,2),de(105,qy,2,2,"mat-option",9,Ny),l(),s(107,"mat-form-field",14),_(108,"input",28),b(),s(109,"mat-label"),m(110,"Max Num Seqs"),l()(),s(111,"mat-form-field",14)(112,"mat-select",29)(113,"mat-option",30),m(114,"auto"),l(),s(115,"mat-option",31),m(116,"on"),l(),s(117,"mat-option",32),m(118,"off"),l()(),b(),s(119,"mat-label"),m(120,"Chunked Prefill"),l()()(),s(121,"div",13)(122,"mat-form-field",14),_(123,"input",33),b(),s(124,"mat-label"),m(125,"Max Batched Tokens"),l()(),s(126,"mat-form-field",14),_(127,"input",34),b(),s(128,"mat-label"),m(129,"Block Size"),l()()()(),s(130,"mat-expansion-panel")(131,"mat-expansion-panel-header")(132,"mat-panel-title"),m(133,"Speculative Decoding"),l(),s(134,"mat-panel-description"),m(135,"Draft method and speculative options"),l()(),s(136,"div",13)(137,"mat-form-field",14)(138,"mat-select",35),de(139,Ky,2,2,"mat-option",9,Ly),l(),b(),s(141,"mat-label"),m(142,"Spec Method"),l()(),s(143,"mat-form-field",14),_(144,"input",36),b(),s(145,"mat-label"),m(146,"Spec Tokens"),l()()(),S(147,Yy,15,6),l(),s(148,"mat-expansion-panel")(149,"mat-expansion-panel-header")(150,"mat-panel-title"),m(151,"Sampling Defaults"),l(),s(152,"mat-panel-description"),m(153,"Default sampling parameters for generation"),l()(),s(154,"div",13)(155,"mat-form-field",14),_(156,"input",37),b(),s(157,"mat-label"),m(158,"Temperature"),l()(),s(159,"mat-form-field",14),_(160,"input",38),b(),s(161,"mat-label"),m(162,"Top-P"),l()(),s(163,"mat-form-field",14),_(164,"input",39),b(),s(165,"mat-label"),m(166,"Top-K"),l()(),s(167,"mat-form-field",14),_(168,"input",40),b(),s(169,"mat-label"),m(170,"Min-P"),l()()(),s(171,"div",13)(172,"mat-form-field",14),_(173,"input",41),b(),s(174,"mat-label"),m(175,"Seed"),l()(),s(176,"mat-form-field",14),_(177,"input",42),b(),s(178,"mat-label"),m(179,"Repetition Penalty"),l()(),s(180,"mat-form-field",14),_(181,"input",43),b(),s(182,"mat-label"),m(183,"Max Tokens (seq)"),l()()()(),s(184,"mat-expansion-panel")(185,"mat-expansion-panel-header")(186,"mat-panel-title"),m(187,"Tools & Chat"),l(),s(188,"mat-panel-description"),m(189,"Tool calling, reasoning and cache options"),l()(),s(190,"div",13)(191,"mat-checkbox",44),m(192," Trust Remote Code "),l(),b(),s(193,"mat-checkbox",45),m(194," Enable Auto Tool Choice "),l(),b(),l(),s(195,"div",13)(196,"mat-form-field",14)(197,"mat-select",46),de(198,Xy,2,2,"mat-option",9,St),l(),b(),s(200,"mat-label"),m(201,"Tool Call Parser"),l()(),s(202,"mat-form-field",14)(203,"mat-select",47),de(204,Zy,2,2,"mat-option",9,St),l(),b(),s(206,"mat-label"),m(207,"Reasoning Parser"),l()(),s(208,"mat-form-field",14)(209,"mat-select",48)(210,"mat-option",30),m(211,"auto"),l(),s(212,"mat-option",31),m(213,"on"),l(),s(214,"mat-option",32),m(215,"off"),l()(),b(),s(216,"mat-label"),m(217,"Prefix Caching"),l()()()(),s(218,"mat-expansion-panel")(219,"mat-expansion-panel-header")(220,"mat-panel-title"),m(221,"Server & Network"),l()(),s(222,"div",13)(223,"mat-form-field",14),_(224,"input",49),b(),s(225,"mat-label"),m(226,"Host"),l()(),s(227,"mat-autocomplete",null,3),de(229,Qy,5,3,"mat-option",9,Vy),l(),s(231,"mat-form-field",14),_(232,"input",50),b(),s(233,"mat-label"),m(234,"Port"),l()(),s(235,"mat-form-field",14),_(236,"input",51),b(),s(237,"mat-label"),m(238,"API Key"),l()()()(),s(239,"mat-expansion-panel")(240,"mat-expansion-panel-header")(241,"mat-panel-title"),m(242,"Additional"),l(),s(243,"mat-panel-description"),m(244,"Extra CLI flags and environment variables"),l()(),s(245,"mat-form-field",6),_(246,"textarea",52),b(),s(247,"mat-label"),m(248,"Extra CLI Flags (one per line)"),l()(),s(249,"mat-form-field",6),_(250,"textarea",53),b(),s(251,"mat-label"),m(252,"Environment variables (KEY=VALUE, one per line)"),l()()()()(),s(253,"mat-dialog-actions",54)(254,"button",55),E("click",function(){return n.cancel()}),m(255,"Cancel"),l(),s(256,"button",56),E("click",function(){return n.save()}),m(257),l()()),t&2){let a=Le(16),r=Le(29),u=Le(104),h=Le(228);c(),he("",n.isClone?"Clone":n.isEdit?"Edit":"Add"," vllm service"),c(2),x("formGroup",n.form),c(),p("changed",n.isControlChanged("name")),c(),x("disabled",n.isEdit&&!n.isClone),y(),c(3),k(n.form.controls.name.errors?.required?8:n.form.controls.name.errors?.pattern?9:-1),c(2),p("changed",n.isControlChanged("command")),c(),x("matAutocomplete",a),y(),c(3),k(n.form.controls.command.errors?.required?14:-1),c(3),me(n.filteredCommands()),c(2),p("has-changed",n.isSectionChanged("model","tokenizer","dtype","servedModelName")),c(4),p("changed",n.isControlChanged("model")),c(),x("matAutocomplete",r),y(),c(3),k(n.form.controls.model.errors?.required?27:-1),c(3),me(n.existingModelPaths()),c(2),p("changed",n.isControlChanged("servedModelName")),c(),y(),c(4),p("changed",n.isControlChanged("tokenizer")),c(),y(),c(3),p("changed",n.isControlChanged("dtype")),c(),y(),c(),me(n.dtypeOptions),c(4),p("has-changed",n.isSectionChanged("tensorParallelSize","pipelineParallelSize","maxParallelLoadingWorkers","gpuMemoryUtilization","swapSpace","cpuOffloadGb","kvCacheMemory","device","attentionBackend")),c(5),p("changed",n.isControlChanged("tensorParallelSize")),c(),y(),c(3),p("changed",n.isControlChanged("pipelineParallelSize")),c(),y(),c(3),p("changed",n.isControlChanged("maxParallelLoadingWorkers")),c(),y(),c(4),p("changed",n.isControlChanged("gpuMemoryUtilization")),c(),y(),c(3),p("changed",n.isControlChanged("swapSpace")),c(),y(),c(3),p("changed",n.isControlChanged("cpuOffloadGb")),c(),y(),c(3),p("changed",n.isControlChanged("device")),c(),y(),c(4),p("changed",n.isControlChanged("attentionBackend")),c(),y(),c(3),me(n.attentionBackends),c(4),p("changed",n.isControlChanged("kvCacheMemory")),c(),y(),c(3),p("has-changed",n.isSectionChanged("maxModelLen","maxNumSeqs","maxNumBatchedTokens","blockSize","enableChunkedPrefill")),c(5),p("changed",n.isControlChanged("maxModelLen")),c(),x("matAutocomplete",u),y(),c(5),me(n.maxLenPresets()),c(2),p("changed",n.isControlChanged("maxNumSeqs")),c(),y(),c(3),p("changed",n.isControlChanged("enableChunkedPrefill")),c(),y(),c(10),p("changed",n.isControlChanged("maxNumBatchedTokens")),c(),y(),c(3),p("changed",n.isControlChanged("blockSize")),c(),y(),c(3),p("has-changed",n.isSectionChanged("specMethod","specTokens","specDraftModel","specDraftTensorParallelSize","specNumDraftTokens")),c(7),p("changed",n.isControlChanged("specMethod")),c(),y(),c(),me(n.specMethods),c(4),p("changed",n.isControlChanged("specTokens")),c(),y(),c(3),k(n.showSpecDraftParams()?147:-1),c(),p("has-changed",n.isSectionChanged("temperature","topP","topK","minP","seed","repetitionPenalty","maxNumSeq")),c(7),p("changed",n.isControlChanged("temperature")),c(),y(),c(3),p("changed",n.isControlChanged("topP")),c(),y(),c(3),p("changed",n.isControlChanged("topK")),c(),y(),c(3),p("changed",n.isControlChanged("minP")),c(),y(),c(4),p("changed",n.isControlChanged("seed")),c(),y(),c(3),p("changed",n.isControlChanged("repetitionPenalty")),c(),y(),c(3),p("changed",n.isControlChanged("maxNumSeq")),c(),y(),c(3),p("has-changed",n.isSectionChanged("trustRemoteCode","enableAutoToolChoice","toolCallParser","reasoningParser","enablePrefixCaching")),c(7),p("changed",n.isControlChanged("trustRemoteCode")),y(),c(2),p("changed",n.isControlChanged("enableAutoToolChoice")),y(),c(3),p("changed",n.isControlChanged("toolCallParser")),c(),x("disabled",n.isToolCallParserDisabled()),y(),c(),me(n.toolCallParsers),c(4),p("changed",n.isControlChanged("reasoningParser")),c(),y(),c(),me(n.reasoningParsers),c(4),p("changed",n.isControlChanged("enablePrefixCaching")),c(),y(),c(9),p("has-changed",n.isSectionChanged("host","port","apiKey")),c(5),p("changed",n.isControlChanged("host")),c(),x("matAutocomplete",h),y(),c(5),me(n.filteredHosts()),c(2),p("changed",n.isControlChanged("port")),c(),y(),c(3),p("changed",n.isControlChanged("apiKey")),c(),y(),c(3),p("has-changed",n.isSectionChanged("extraFlags","envText")),c(6),p("changed",n.isControlChanged("extraFlags")),c(),y(),c(3),p("changed",n.isControlChanged("envText")),c(),y(),c(6),x("disabled",n.form.invalid),c(),he(" ",n.isEdit&&!n.isClone?"Save":"Create"," ")}},dependencies:[Pe,fn,xo,Oi,xa,Pi,hn,oc,nc,gn,Kt,$i,Sn,Dn,Ct,Yi,Ke,Xe,Fo,zc,Fs,Ga,Rs,Ps,Os,Tt,Et,Lt,_n,ri,ai,bt,Bt,jt,zt,Vo,Lo,Ns,$a],styles:['@charset "UTF-8";.vllm-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;min-width:640px}.form-row[_ngcontent-%COMP%]{display:flex;gap:12px;margin-bottom:4px;align-items:center}.form-col[_ngcontent-%COMP%]{flex:1}.form-col-60[_ngcontent-%COMP%]{flex:3}.full-width[_ngcontent-%COMP%]{width:100%}.auto-path[_ngcontent-%COMP%]{font-family:monospace}.auto-from[_ngcontent-%COMP%]{margin-left:8px;opacity:.6;font-size:12px}.flags-textarea[_ngcontent-%COMP%], .env-textarea[_ngcontent-%COMP%]{overflow-x:auto}mat-dialog-content[_ngcontent-%COMP%]{padding-top:10px!important;max-height:80vh}mat-expansion-panel[_ngcontent-%COMP%]{margin-bottom:0}mat-dialog-actions[_ngcontent-%COMP%]{gap:8px}.subsection-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:#0009;margin:4px 0 14px;text-transform:uppercase;letter-spacing:.5px}mat-expansion-panel.has-changed[_ngcontent-%COMP%] mat-panel-title[_ngcontent-%COMP%]{font-weight:700}mat-form-field.changed[_ngcontent-%COMP%] .mat-mdc-form-field-infix input, mat-form-field.changed[_ngcontent-%COMP%] .mat-mdc-form-field-infix .mat-mdc-select{font-weight:700}mat-checkbox.changed[_ngcontent-%COMP%] label{font-weight:700}']})}}return i})();function Si(i,o,e){let t=Bo(i,o);return t!==null?t:e}function Rt(i,o,e){let t=Bo(i,o);if(t!==null){let n=parseInt(t,10);return isNaN(n)?e:n}return e}function Zn(i,o,e){let t=Bo(i,o);if(t!==null){let n=parseFloat(t);return isNaN(n)?e:n}return e}function rC(i,o,e,t){let n=null;for(let a of i){let[r,...u]=a.split(/\s+/);r===o?u.join(" ").trim()==="false"?n="off":n="on":r===e&&(n="off")}return n??t}var sC=(i,o)=>o.name;function lC(i,o){if(i&1){let e=De();s(0,"button",23),E("click",function(n){le(e);let a=C(2).$implicit;return C(2).control(a.name,"start"),ce(n.stopPropagation())}),s(1,"mat-icon"),m(2,"play_arrow"),l(),m(3," Start "),l()}if(i&2){let e=C(2).$implicit,t=C(2);x("disabled",t.busy()?.name===e.name)}}function cC(i,o){if(i&1){let e=De();s(0,"button",24),E("click",function(n){le(e);let a=C(2).$implicit;return C(2).control(a.name,"stop"),ce(n.stopPropagation())}),s(1,"mat-icon"),m(2,"stop"),l(),m(3," Stop "),l()}if(i&2){let e=C(2).$implicit,t=C(2);x("disabled",t.busy()?.name===e.name)}}function dC(i,o){if(i&1){let e=De();s(0,"button",25),E("click",function(n){le(e);let a=C(2).$implicit;return C(2).control(a.name,"disable"),ce(n.stopPropagation())}),s(1,"mat-icon"),m(2,"lock"),l(),m(3," Disable "),l()}if(i&2){let e=C(2).$implicit,t=C(2);x("disabled",t.busy()?.name===e.name)}}function mC(i,o){if(i&1){let e=De();s(0,"button",25),E("click",function(n){le(e);let a=C(2).$implicit;return C(2).control(a.name,"enable"),ce(n.stopPropagation())}),s(1,"mat-icon"),m(2,"lock_open"),l(),m(3," Enable "),l()}if(i&2){let e=C(2).$implicit,t=C(2);x("disabled",e.enabled||t.busy()?.name===e.name)}}function uC(i,o){if(i&1&&(S(0,lC,4,1,"button",20)(1,cC,4,1,"button",21),S(2,dC,4,1,"button",22)(3,mC,4,1,"button",22)),i&2){let e=C().$implicit;k(e.running?1:0),c(2),k(e.enabled?2:3)}}function hC(i,o){if(i&1){let e=De();s(0,"tr",13),E("click",function(){let n=le(e).$implicit,a=C(2);return ce(a.selectedServiceService.select(n.name))}),s(1,"td")(2,"div",14),_(3,"span",15),s(4,"span",16),m(5),l()()(),s(6,"td",17),S(7,uC,4,2),l(),s(8,"td",17)(9,"div")(10,"button",18)(11,"mat-icon"),m(12,"more_vert"),l()(),s(13,"mat-menu",19,2)(15,"button",8),E("click",function(){let n=le(e).$implicit,a=C(2);return ce(a.editService(n))}),s(16,"mat-icon"),m(17,"edit"),l(),s(18,"span"),m(19,"Edit"),l()(),s(20,"button",8),E("click",function(){let n=le(e).$implicit,a=C(2);return ce(a.cloneService(n))}),s(21,"mat-icon"),m(22,"content_copy"),l(),s(23,"span"),m(24,"Clone"),l()(),s(25,"button",8),E("click",function(){let n=le(e).$implicit,a=C(2);return ce(a.deleteService(n.name))}),s(26,"mat-icon"),m(27,"delete"),l(),s(28,"span"),m(29,"Delete"),l()()()()()()}if(i&2){let e=o.$implicit,t=Le(14);p("custom",e.hasConfig),c(3),p("running",e.running),c(),p("disabled",!e.enabled),c(),L(e.name),c(2),k(e.installed?7:-1),c(2),Ve("visibility",e.hasConfig?"visible":"hidden"),c(),x("matMenuTriggerFor",t)}}function pC(i,o){if(i&1&&(s(0,"table",10)(1,"tbody"),de(2,hC,30,11,"tr",12,sC),l()()),i&2){let e=C();c(2),me(e.filtered())}}function fC(i,o){if(i&1&&(s(0,"p"),m(1),l()),i&2){let e=C(2);c(),he('No services match "',e.filter().trim(),'".')}}function gC(i,o){i&1&&(s(0,"p"),m(1,'No services configured. Click "Managed services" to select system services or "Custom service" to create one.'),l())}function _C(i,o){if(i&1&&(s(0,"div",11),S(1,fC,2,1,"p")(2,gC,2,0,"p"),l()),i&2){let e=C();c(),k(e.filter().trim()?1:2)}}var Rp=(()=>{class i{constructor(){this.serviceService=d(yt),this.serviceList=d(Es),this.selectedServiceService=d(Ms),this.dialog=d(Io),this.snackBar=d(ks),this.services=this.serviceList.services,this.configs=A([]),this.loading=A(!0),this.busy=A(null),this.unified=U(()=>{let e=this.services(),t=this.configs(),n=new Map;for(let u of t)n.set(u.name,u);let a=e.filter(u=>n.has(u.name)).map(u=>{let h=n.get(u.name)??null;return{name:u.name,running:u.running,enabled:u.enabled,installed:u.installed,pid:u.pid,error:u.error,config:h,hasConfig:!0}}),r=e.filter(u=>!n.has(u.name)).map(u=>Fe(B({},u),{config:null,hasConfig:!1}));return[...a,...r]}),this.filter=A(""),this.filtered=U(()=>{let e=this.filter().trim().toLowerCase(),t=this.unified();return e?t.filter(n=>n.name.toLowerCase().includes(e)):t})}onFilterInput(e){this.filter.set(e.target.value)}ngOnInit(){this.load()}load(){return J(this,null,function*(){this.loading.set(!0);try{yield this.serviceList.refresh(),this.configs.set(yield _e(this.serviceService.fetchConfigs()))}catch(e){console.error("[ServicesComponent] load error:",e)}finally{this.loading.set(!1)}})}control(e,t){return J(this,null,function*(){let n=this.busy();if(!(n&&n.name===e&&n.action===t)){this.selectedServiceService.select(e),this.busy.set({name:e,action:t});try{let a=yield _e(this.serviceService.control(e,t));a.error&&this.showError(`${e}: ${a.error}`),yield this.load()}catch(a){this.showError(`${e}: ${this.errorText(a)}`)}finally{this.busy.set(null)}}})}showError(e){this.snackBar.open(e,"Dismiss",{duration:8e3,horizontalPosition:"center",verticalPosition:"top"})}errorText(e){return e instanceof Wt?e.error?.error??e.message:String(e)}manageServices(){this.dialog.open(pp,{maxWidth:"600px"}).afterClosed().subscribe(t=>{t&&this.load()})}archiveServices(){this.dialog.open(gp,{minWidth:"840px"}).afterClosed().subscribe(t=>{t&&this.load()})}addService(e){this.openDialog(null,e)}editService(e){this.selectedServiceService.select(e.name),this.openDialog(e.config,e.config?.type)}cloneService(e){if(!e.config)return;let t=Fe(B({},e.config),{name:this.uniqueCloneName(e.name)});this.openDialog(t,t.type,!0)}uniqueCloneName(e){let t=new Set(this.configs().map(a=>a.name));if(!t.has(`${e}-copy`))return`${e}-copy`;let n=2;for(;t.has(`${e}-copy-${n}`);)n++;return`${e}-copy-${n}`}deleteService(e){return J(this,null,function*(){if(confirm(`Delete service "${e}"? Its systemd unit will be uninstalled and the config removed.`)){this.selectedServiceService.select(e);try{yield _e(this.serviceService.deleteConfig(e)),yield this.load()}catch(t){this.showError(`Delete "${e}": ${this.errorText(t)}`)}}})}hasFlags(e){return e.flags.length>0}openDialog(e,t,n=!1){let a=t??e?.type??"generic";if(a==="llama-server"){let r={config:e,allConfigs:this.configs(),clone:n},u=this.dialog.open(Tp,{data:r,minWidth:"800px"});this.handleDialogResult(u,e,n)}else if(a==="vllm"){let r={config:e,allConfigs:this.configs(),clone:n},u=this.dialog.open(Ip,{data:r,minWidth:"800px"});this.handleDialogResult(u,e,n)}else{let r={config:e,allConfigs:this.configs(),clone:n},u=this.dialog.open(lp,{data:r,minWidth:"1000px"});this.handleDialogResult(u,e,n)}}handleDialogResult(e,t,n=!1){e.afterClosed().subscribe(a=>J(this,null,function*(){if(a)try{if(n)yield _e(this.serviceService.saveConfig(a));else{let r=t?.name??null;if(r!==null&&r!==a.name){let h=this.unified().find(D=>D.name===r),g=h?.running??!1,v=h?.enabled??!1;yield _e(this.serviceService.deleteConfig(r)),yield _e(this.serviceService.saveConfig(a)),v&&(yield _e(this.serviceService.control(a.name,"enable"))),g&&(yield _e(this.serviceService.control(a.name,"start")))}else yield _e(this.serviceService.saveConfig(a))}}catch(r){this.showError(`Save: ${this.errorText(r)}`)}finally{yield this.load()}}))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-services"]],decls:44,vars:4,consts:[["servicesMenu","matMenu"],["addMenu",""],["serviceMenu","matMenu"],[1,"services-card"],[1,"section-header"],["type","text","placeholder","Filter by name\u2026",1,"service-filter",3,"input","value"],["mat-icon-button","","title","Services actions",1,"header-menu-btn",3,"matMenuTriggerFor"],["xPosition","before"],["mat-menu-item","",3,"click"],["mat-menu-item","",3,"matMenuTriggerFor"],[1,"services-list"],[1,"empty"],[3,"custom"],[3,"click"],[1,"service-name"],[1,"status-dot"],[1,"name-text"],[1,"service-actions-cell"],["mat-icon-button","","title","Service actions",3,"matMenuTriggerFor"],["yPosition","below"],["mat-raised-button","","color","primary",3,"disabled"],["mat-raised-button","","color","warn",3,"disabled"],["mat-stroked-button","",3,"disabled"],["mat-raised-button","","color","primary",3,"click","disabled"],["mat-raised-button","","color","warn",3,"click","disabled"],["mat-stroked-button","",3,"click","disabled"]],template:function(t,n){if(t&1&&(s(0,"div",3)(1,"div",4)(2,"h2"),m(3,"Services"),l(),s(4,"input",5),E("input",function(r){return n.onFilterInput(r)}),l(),s(5,"button",6)(6,"mat-icon"),m(7,"more_vert"),l()(),s(8,"mat-menu",7,0)(10,"button",8),E("click",function(){return n.manageServices()}),s(11,"mat-icon"),m(12,"tune"),l(),s(13,"span"),m(14,"Managed services"),l()(),s(15,"button",8),E("click",function(){return n.archiveServices()}),s(16,"mat-icon"),m(17,"archive"),l(),s(18,"span"),m(19,"Archive"),l()(),s(20,"button",9)(21,"mat-icon"),m(22,"add"),l(),s(23,"span"),m(24,"Custom service"),l()()(),s(25,"mat-menu",null,1)(27,"button",8),E("click",function(){return n.addService("generic")}),s(28,"mat-icon"),m(29,"settings"),l(),s(30,"span"),m(31,"Generic service"),l()(),s(32,"button",8),E("click",function(){return n.addService("llama-server")}),s(33,"mat-icon"),m(34,"smart_toy"),l(),s(35,"span"),m(36,"llama-server"),l()(),s(37,"button",8),E("click",function(){return n.addService("vllm")}),s(38,"mat-icon"),m(39,"bolt"),l(),s(40,"span"),m(41,"vllm"),l()()()(),S(42,pC,4,0,"table",10)(43,_C,3,1,"div",11),l()),t&2){let a=Le(9),r=Le(26);c(4),x("value",n.filter()),c(),x("matMenuTriggerFor",a),c(15),x("matMenuTriggerFor",r),c(22),k(n.filtered().length>0?42:n.loading()?-1:43)}},dependencies:[Pe,Ke,Xe,vi,Mo,Ss,wn,Kn,Ds,vt,_t],styles:[".section-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.section-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:1.1rem;font-weight:600;color:#333}.section-header[_ngcontent-%COMP%] .header-menu-btn[_ngcontent-%COMP%]{color:#666}.section-header[_ngcontent-%COMP%] .service-filter[_ngcontent-%COMP%]{flex:1 1 240px;max-width:320px;min-width:140px;margin:0 16px;padding:6px 12px;font-size:.9rem;border:1px solid #cfcfcf;border-radius:16px;outline:none;background:#fff;transition:border-color .15s ease,box-shadow .15s ease}.section-header[_ngcontent-%COMP%] .service-filter[_ngcontent-%COMP%]::placeholder{color:#9e9e9e}.section-header[_ngcontent-%COMP%] .service-filter[_ngcontent-%COMP%]:focus{border-color:#7c4dff;box-shadow:0 0 0 2px #7c4dff26}.services-list[_ngcontent-%COMP%]{width:100%;border-collapse:collapse}.services-list[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{border-bottom:1px solid #e0e0e0;transition:background-color .2s ease}.services-list[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:#fff}.services-list[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child{border-bottom:none}.services-list[_ngcontent-%COMP%] tr.custom[_ngcontent-%COMP%], .services-list[_ngcontent-%COMP%] tr.custom[_ngcontent-%COMP%]:first-child td[_ngcontent-%COMP%]:first-child{border-left:3px solid #7c4dff}.services-list[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:4px 12px;vertical-align:middle}.service-name[_ngcontent-%COMP%]{font-size:1rem;font-weight:600;white-space:nowrap;display:flex;align-items:center;gap:8px}.service-name[_ngcontent-%COMP%] .status-dot[_ngcontent-%COMP%]{display:inline-block;width:10px;height:10px;border-radius:50%;background-color:#bdbdbd}.service-name[_ngcontent-%COMP%] .status-dot.running[_ngcontent-%COMP%]{background-color:#4caf50}.service-name[_ngcontent-%COMP%] .name-text[_ngcontent-%COMP%]{color:#212121}.service-name[_ngcontent-%COMP%] .name-text.disabled[_ngcontent-%COMP%]{color:#9e9e9e}.service-actions-cell[_ngcontent-%COMP%]{white-space:nowrap}.service-actions-cell[_ngcontent-%COMP%] button[_ngcontent-%COMP%] + button[_ngcontent-%COMP%]{margin-left:8px}.status-chip[_ngcontent-%COMP%], .enabled-chip[_ngcontent-%COMP%]{font-size:.8rem;font-weight:500}.status-chip.running[_ngcontent-%COMP%]{--mat-chip-elevated-container-color: #a5d6a7}.status-chip.stopped[_ngcontent-%COMP%]{--mat-chip-elevated-container-color: #ef9a9a}.enabled-chip.enabled[_ngcontent-%COMP%]{--mat-chip-elevated-container-color: #90caf9}.enabled-chip.disabled[_ngcontent-%COMP%]{--mat-chip-elevated-container-color: #bdbdbd}.empty[_ngcontent-%COMP%]{text-align:center;padding:24px;color:#999;font-size:.9rem}.empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0}"]})}}return i})();var vC=["journalBody"],bC=(i,o)=>o.name;function yC(i,o){if(i&1&&(s(0,"mat-option",7),m(1),l()),i&2){let e=o.$implicit;x("value",e.name),c(),L(e.name)}}function CC(i,o){if(i&1){let e=De();s(0,"button",10),E("click",function(){le(e);let n=C(2);return ce(n.toggleWordWrap())}),s(1,"mat-icon"),m(2,"wrap_text"),l()()}}function xC(i,o){if(i&1){let e=De();s(0,"button",11),E("click",function(){le(e);let n=C(2);return ce(n.toggleWordWrap())}),s(1,"mat-icon"),m(2,"wrap_text"),l()()}}function wC(i,o){if(i&1){let e=De();s(0,"mat-select",6),E("ngModelChange",function(n){le(e);let a=C();return ce(a.onServiceChange(n))}),s(1,"mat-option",7),m(2,"\u2014 None \u2014"),l(),de(3,yC,2,2,"mat-option",7,bC),l(),b(),S(5,CC,3,0,"button",8)(6,xC,3,0,"button",9)}if(i&2){let e=C();x("ngModel",e.selectedService()),y(),c(),x("value",null),c(2),me(e.services()),c(2),k(e.wordWrap()?5:6)}}function DC(i,o){if(i&1&&(s(0,"div",3),m(1),l()),i&2){let e=C();c(),L(e.error())}}function SC(i,o){if(i&1&&(s(0,"div",4,0)(2,"pre"),m(3),l()()),i&2){let e=C();c(2),p("wrap-on",e.wordWrap()),c(),L(e.journalText())}}function kC(i,o){i&1&&(s(0,"div",5)(1,"p"),m(2,"No service selected"),l()())}var MC=40,Op=(()=>{class i{toggleWordWrap(){this.wordWrap.update(e=>!e)}constructor(){this.serviceService=d(yt),this.selectedServiceService=d(Ms),this.serviceList=d(Es),this.cdr=d(ne),this.services=this.serviceList.services,this.servicesLoaded=this.serviceList.loaded,this.journalLines=A([]),this.journalLoading=A(!1),this.journalError=A(null),this.error=U(()=>this.serviceList.error()??this.journalError()),this.selectedService=U(()=>this.selectedServiceService.selectedService()),this.wordWrap=A(!0),this.journalText=U(()=>{let e=this.journalLines();return e.length===0?"":e.map(t=>t.timestamp?`${t.timestamp} ${t.message}`:t.message).join(`
5598
- `)}),Gt(()=>{if(!this.servicesLoaded())return;let e=this.selectedService();e!==null&&!this.services().some(t=>t.name===e)&&this.selectedServiceService.select(null)}),Gt(()=>{if(!this.servicesLoaded())return;this.selectedService()?(this.journalLines.set([]),this.journalError.set(null),this.restartPolling()):(this.stopPolling(),this.journalLines.set([]))}),this.serviceList.refresh()}ngAfterViewInit(){this.scrollToBottom()}ngOnDestroy(){this.stopPolling()}onServiceChange(e){this.selectedServiceService.select(e)}restartPolling(){this.stopPolling(),this.fetchJournal(),this.journalSub=Qa(0,1e3).subscribe(()=>this.fetchJournal())}stopPolling(){this.journalSub&&(this.journalSub.unsubscribe(),this.journalSub=void 0)}fetchJournal(){let e=this.selectedService();e&&(this.isTextSelected()||(this.journalLoading.set(!0),this.serviceService.fetchJournal(e,100).subscribe({next:t=>{let n=this.isScrolledToBottom();this.journalLines.set(t),this.journalError.set(null),this.journalLoading.set(!1),this.cdr.markForCheck(),requestAnimationFrame(()=>{n&&this.scrollToBottom()})},error:t=>{this.journalError.set(t.message),this.journalLoading.set(!1),this.cdr.markForCheck()}})))}get scrollContainer(){return this.journalBody?.nativeElement??null}isTextSelected(){let e=typeof window<"u"?window:null;if(!e)return!1;let t=e.getSelection();if(!t||t.isCollapsed||!t.rangeCount)return!1;let n=this.scrollContainer;return n?n.contains(t.anchorNode):!1}isScrolledToBottom(){let e=this.scrollContainer;return e?e.scrollHeight-e.scrollTop-e.clientHeight<=MC:!0}scrollToBottom(){let e=this.scrollContainer;e&&(e.scrollTop=e.scrollHeight)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-journal-panel"]],viewQuery:function(t,n){if(t&1&&Te(vC,5),t&2){let a;P(a=F())&&(n.journalBody=a.first)}},decls:9,vars:3,consts:[["journalBody",""],[1,"journal-card"],[1,"journal-header"],[1,"journal-error"],[1,"journal-body"],[1,"journal-body","journal-empty"],["disableOptionCentering","",1,"service-select",3,"ngModelChange","ngModel"],[3,"value"],["mat-flat-button","","color","primary","aria-label","Disable word wrap"],["mat-stroked-button","","aria-label","Enable word wrap"],["mat-flat-button","","color","primary","aria-label","Disable word wrap",3,"click"],["mat-stroked-button","","aria-label","Enable word wrap",3,"click"]],template:function(t,n){t&1&&(s(0,"mat-card",1)(1,"mat-card-content")(2,"div",2)(3,"h2"),m(4,"Journal"),l(),S(5,wC,7,3),l(),S(6,DC,2,1,"div",3),S(7,SC,4,3,"div",4)(8,kC,3,0,"div",5),l()()),t&2&&(c(5),k(n.servicesLoaded()&&n.services().length>0?5:-1),c(),k(n.error()?6:-1),c(),k(n.selectedService()?7:8))},dependencies:[Pe,rn,on,an,Vo,Lo,Ct,Ke,Xe,vt,_t,ni,fn,Pi,rc],styles:[".journal-card[_ngcontent-%COMP%]{height:100%;display:flex;flex-direction:column;overflow:hidden}.journal-card[_ngcontent-%COMP%] mat-card-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.journal-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-shrink:0}.journal-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:20px;font-weight:500}.service-select[_ngcontent-%COMP%]{flex:1;min-width:150px}.journal-error[_ngcontent-%COMP%]{color:#f44336;font-size:13px;margin-bottom:8px;flex-shrink:0}.journal-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;background:#1e1e1e;border-radius:4px;padding:8px;min-height:0}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#2d2d2d;border-radius:4px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.journal-body[_ngcontent-%COMP%]{scrollbar-width:thin;scrollbar-color:#555 #2d2d2d}.journal-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-family:Courier New,Courier,monospace;font-size:12px;line-height:1.6;color:#d4d4d4;white-space:pre}.journal-body[_ngcontent-%COMP%] pre.wrap-on[_ngcontent-%COMP%]{white-space:pre-wrap}.journal-empty[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center}.journal-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:#888;font-size:14px}[_nghost-%COMP%] .mdc-button{min-width:32px}[_nghost-%COMP%] .mat-mdc-unelevated-button>.mat-icon, [_nghost-%COMP%] .mat-mdc-outlined-button>.mat-icon{margin-right:0}"]})}}return i})();var Ls=(()=>{class i{constructor(){this.http=d(Ft),this.baseUrl="/api/system"}reboot(){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/reboot`,null))})}shutdown(){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/shutdown`,null))})}getSystemInfo(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/info`))})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=ee({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var Vs=(()=>{class i{constructor(){this.http=d(Ft),this.baseUrl="/api/hf"}getStatus(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/status`))})}getDownloads(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/downloads`))})}getLocalModels(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/models`))})}deleteLocalModel(e){return J(this,null,function*(){let[t,...n]=e.split("/");yield _e(this.http.delete(`${this.baseUrl}/models/${t}/${n.join("/")}`))})}getOrphanBlobs(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/models/orphans`))})}cleanupOrphanBlobs(){return J(this,null,function*(){return _e(this.http.post(`${this.baseUrl}/models/orphans/cleanup`,{}))})}action(e,t){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/downloads/action`,{action:e,repoId:t.repoId,dest:t.dest}))})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=ee({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var EC=(i,o)=>o.device,TC=(i,o)=>o.path;function AC(i,o){i&1&&_(0,"mat-progress-bar",2)}function IC(i,o){if(i&1&&(s(0,"p",3),m(1),l()),i&2){let e=C();c(),L(e.error())}}function RC(i,o){if(i&1&&(s(0,"span",11),m(1),l()),i&2){let e=C(2);c(),L(e.info().uptime)}}function OC(i,o){if(i&1&&(s(0,"div",12)(1,"span",13),m(2,"Version"),l(),s(3,"span",14),m(4),l()()),i&2){let e=C(2);c(4),L(e.info().os.version)}}function PC(i,o){if(i&1&&(s(0,"div",16)(1,"div",18)(2,"span",19),m(3),l(),s(4,"span",20),m(5),l()(),s(6,"div",21),_(7,"div",22),l(),s(8,"div",23)(9,"span"),m(10),l(),s(11,"span"),m(12),l()()()),i&2){let e=o.$implicit,t=C(2);c(3),L(e.device),c(2),L(e.mountPoint),c(2),Ve("width",e.usePercent,"%")("background",e.usePercent>90?"#f44336":e.usePercent>75?"#ff9800":"#4caf50"),c(3),fi("",t.formatBytes(e.available)," free of ",t.formatBytes(e.total)),c(2),he("",e.usePercent,"% used")}}function FC(i,o){if(i&1&&(s(0,"div",27)(1,"span",31),m(2,"Last"),l(),s(3,"span",32),m(4),Go(5,"date"),l()()),i&2){let e=C(3);c(4),L($o(5,1,e.info().timeshift.lastSnapshot,"medium"))}}function NC(i,o){if(i&1&&(s(0,"mat-chip",33),m(1),l()),i&2){let e=o.$implicit;c(),L(e)}}function LC(i,o){if(i&1&&(s(0,"mat-chip-set"),de(1,NC,2,1,"mat-chip",33,St),l()),i&2){let e=C(3);c(),me(e.info().timeshift.schedules)}}function VC(i,o){if(i&1&&(s(0,"div",6)(1,"h3"),m(2,"Timeshift Backup"),l(),s(3,"div",7)(4,"div",8)(5,"mat-chip-set")(6,"mat-chip",24),m(7),l(),s(8,"mat-chip",25),m(9),l()(),s(10,"span",26),m(11),l()(),S(12,FC,6,4,"div",27),s(13,"div",28),_(14,"div",29),l(),s(15,"div",30)(16,"span"),m(17),l(),S(18,LC,3,0,"mat-chip-set"),l()()(),_(19,"mat-divider",15)),i&2){let e=C(2);c(7),L(e.info().timeshift.mode),c(2),L(e.info().timeshift.device),c(2),he("",e.info().timeshift.snapshots," snapshots"),c(),k(e.info().timeshift.lastSnapshot?12:-1),c(2),Ve("width",e.info().timeshift.totalSpace>0?(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace*100:0,"%")("background",e.info().timeshift.totalSpace>0&&(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace>.9?"#f44336":e.info().timeshift.totalSpace>0&&(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace>.75?"#ff9800":"#4caf50"),c(3),fi("",e.formatBytes(e.info().timeshift.freeSpace)," free of ",e.formatBytes(e.info().timeshift.totalSpace)),c(),k(e.info().timeshift.schedules.length>0?18:-1)}}function BC(i,o){if(i&1&&m(0),i&2){let e=C().$implicit,t=C(2);he(" ",t.formatBytes(e.size)," ")}}function zC(i,o){i&1&&m(0," \u2014 ")}function jC(i,o){if(i&1&&(s(0,"div",17)(1,"span",34),m(2),l(),s(3,"span",35),S(4,BC,1,1)(5,zC,1,0),l()()),i&2){let e=o.$implicit;c(2),L(e.path),c(2),k(e.exists?4:5)}}function HC(i,o){if(i&1&&(s(0,"div",6)(1,"h3"),m(2,"Operating System"),l(),s(3,"div",7)(4,"div",8)(5,"mat-chip-set")(6,"mat-chip",9),m(7),l(),s(8,"mat-chip",10),m(9),l()(),S(10,RC,2,1,"span",11),l(),S(11,OC,5,1,"div",12),s(12,"div",12)(13,"span",13),m(14,"Kernel"),l(),s(15,"span",14),m(16),l()()()(),_(17,"mat-divider",15),s(18,"div",6)(19,"h3"),m(20,"Disks"),l(),de(21,PC,13,9,"div",16,EC),l(),_(23,"mat-divider",15),S(24,VC,20,11),s(25,"div",6)(26,"h3"),m(27,"System Logs"),l(),de(28,jC,6,2,"div",17,TC),l()),i&2){let e=C();c(7),L(e.info().hostname),c(2),L(e.info().os.name),c(),k(e.info().uptime?10:-1),c(),k(e.info().os.version?11:-1),c(5),L(e.info().kernel),c(5),me(e.info().disks),c(3),k(e.info().timeshift?24:-1),c(4),me(e.info().logs)}}var Pp=(()=>{class i{constructor(){this.systemService=d(Ls),this.dialogRef=d(ut),this.loading=A(!0),this.info=A(null),this.error=A(null)}ngOnInit(){return J(this,null,function*(){try{let e=yield this.systemService.getSystemInfo();this.info.set(e)}catch(e){this.error.set(e instanceof Error?e.message:"Failed to load system info")}finally{this.loading.set(!1)}})}formatBytes(e){return e===0?"0 B":`${(e/(1024*1024*1024)).toFixed(1)} GB`}close(){this.dialogRef.close()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-system-info-dialog"]],decls:12,vars:1,consts:[[1,"dialog-container"],["mat-dialog-title",""],["mode","indeterminate"],[1,"dialog-error"],["align","end"],["mat-raised-button","","color","primary",3,"click"],[1,"info-section"],[1,"info-card"],[1,"info-card-header"],[1,"hostname-chip"],[1,"distro-chip"],[1,"os-uptime"],[1,"info-row"],[1,"info-label"],[1,"info-value"],[1,"section-divider"],[1,"disk-row"],[1,"log-row"],[1,"disk-header"],[1,"disk-device"],[1,"disk-mount"],[1,"disk-bar-bg"],[1,"disk-bar-fill"],[1,"disk-details"],[1,"mode-chip"],[1,"device-chip"],[1,"timeshift-snapshots"],[1,"timeshift-row"],[1,"timeshift-disk-bar-bg"],[1,"timeshift-disk-bar-fill"],[1,"timeshift-disk-details"],[1,"timeshift-label"],[1,"timeshift-value"],[1,"schedule-chip"],[1,"log-path"],[1,"log-size"]],template:function(t,n){t&1&&(s(0,"div",0)(1,"h2",1)(2,"mat-icon"),m(3,"info"),l(),m(4," System Info "),l(),s(5,"mat-dialog-content"),S(6,AC,1,0,"mat-progress-bar",2)(7,IC,2,1,"p",3)(8,HC,30,6),l(),s(9,"mat-dialog-actions",4)(10,"button",5),E("click",function(){return n.close()}),m(11,"OK"),l()()()),t&2&&(c(6),k(n.loading()?6:n.error()?7:n.info()?8:-1))},dependencies:[Pe,Ke,Xe,bt,Bt,jt,zt,ni,Ii,No,Ua,vt,_t,Mo,Ra,Rh,ml],styles:[".dialog-container[_ngcontent-%COMP%]{min-width:480px}.dialog-error[_ngcontent-%COMP%]{color:#f44336;padding:8px 0}.info-section[_ngcontent-%COMP%]{margin-bottom:8px}.info-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.info-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0}.info-row[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%]{color:#666;font-size:14px}.info-row[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%]{font-family:monospace;font-size:13px;color:#333}.section-divider[_ngcontent-%COMP%]{margin:12px 0}.disk-row[_ngcontent-%COMP%]{margin-bottom:12px}.disk-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;margin-bottom:4px}.disk-header[_ngcontent-%COMP%] .disk-device[_ngcontent-%COMP%]{font-family:monospace;font-size:13px}.disk-header[_ngcontent-%COMP%] .disk-mount[_ngcontent-%COMP%]{font-size:13px;color:#666}.disk-bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden;margin-bottom:2px}.disk-bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px}.disk-details[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-size:12px;color:#666}.info-card[_ngcontent-%COMP%]{background:#f5f5f5;border-radius:8px;padding:12px}.info-card-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.info-card-header[_ngcontent-%COMP%] .hostname-chip[_ngcontent-%COMP%]{font-family:monospace;background:#e8eaf6!important;color:#303f9f!important}.info-card-header[_ngcontent-%COMP%] .distro-chip[_ngcontent-%COMP%], .info-card-header[_ngcontent-%COMP%] .mode-chip[_ngcontent-%COMP%]{font-weight:600;background:#e3f2fd!important;color:#1976d2!important}.info-card-header[_ngcontent-%COMP%] .device-chip[_ngcontent-%COMP%]{font-family:monospace;background:#e8eaf6!important;color:#303f9f!important}.os-uptime[_ngcontent-%COMP%], .timeshift-snapshots[_ngcontent-%COMP%]{font-size:13px;color:#666;white-space:nowrap}.timeshift-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0;margin-bottom:6px}.timeshift-row[_ngcontent-%COMP%] .timeshift-label[_ngcontent-%COMP%]{color:#666;font-size:13px}.timeshift-row[_ngcontent-%COMP%] .timeshift-value[_ngcontent-%COMP%]{font-size:13px;color:#333}.timeshift-disk-bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden;margin-bottom:4px}.timeshift-disk-bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px}.timeshift-disk-details[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#666}.timeshift-disk-details[_ngcontent-%COMP%] .schedule-chip[_ngcontent-%COMP%]{font-size:11px;background:#fff3e0!important;color:#e65100!important}.log-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0}.log-row[_ngcontent-%COMP%] .log-path[_ngcontent-%COMP%]{font-family:monospace;font-size:13px}.log-row[_ngcontent-%COMP%] .log-size[_ngcontent-%COMP%]{font-family:monospace;font-size:13px;color:#333}"]})}}return i})();var UC=(i,o)=>o.name,GC=(i,o)=>o.repoId+o.dest,$C=(i,o)=>o.path;function WC(i,o){i&1&&(s(0,"div",2),m(1),l()),i&2&&(c(),L(o))}function qC(i,o){i&1&&(s(0,"div",4),m(1,"Loading\u2026"),l())}function KC(i,o){i&1&&(s(0,"div",8),m(1,"Loading\u2026"),l())}function YC(i,o){i&1&&(s(0,"div",9),m(1,"No models in the Hugging Face cache"),l())}function XC(i,o){if(i&1){let e=De();s(0,"div",13)(1,"div",14)(2,"span",15),m(3),l(),s(4,"span",16),m(5),l()(),s(6,"span",17),m(7),l(),s(8,"button",18),E("click",function(){let n=le(e).$implicit,a=C(3);return ce(a.deleteModel(n))}),s(9,"mat-icon"),m(10,"delete"),l()()()}if(i&2){let e=o.$implicit,t=C(3);c(3),L(e.name),c(),x("title",e.dir),c(),L(e.dir),c(2),L(t.formatBytes(e.size)),c(),x("disabled",t.deleting()===e.name)}}function ZC(i,o){if(i&1&&(s(0,"div",10),de(1,XC,11,5,"div",13,UC),l()),i&2){let e=C(2);c(),me(e.staticModels())}}function QC(i,o){i&1&&(s(0,"div",9),m(1,"No active downloads"),l())}function JC(i,o){if(i&1&&(s(0,"span",22),m(1),l()),i&2){let e=C().$implicit;c(),he("pid ",e.pids.join(", "))}}function ex(i,o){if(i&1){let e=De();s(0,"button",33),E("click",function(){le(e);let n=C().$implicit,a=C(3);return ce(a.resume(n))}),s(1,"mat-icon"),m(2,"play_arrow"),l()()}}function tx(i,o){if(i&1){let e=De();s(0,"button",34),E("click",function(){le(e);let n=C().$implicit,a=C(3);return ce(a.pause(n))}),s(1,"mat-icon"),m(2,"pause"),l()()}}function ix(i,o){if(i&1){let e=De();s(0,"div",19)(1,"div",14)(2,"div",20)(3,"span",15),m(4),l(),s(5,"span",21),m(6),l(),S(7,JC,2,1,"span",22),l(),s(8,"div",16),m(9),l(),_(10,"mat-progress-bar",23),s(11,"div",24)(12,"span",25),m(13),l(),s(14,"span",26),m(15),l(),s(16,"span",27),m(17),l(),s(18,"span",28),m(19),l()()(),s(20,"div",29),S(21,ex,3,0,"button",30)(22,tx,3,0,"button",31),s(23,"button",32),E("click",function(){let n=le(e).$implicit,a=C(3);return ce(a.cancel(n))}),s(24,"mat-icon"),m(25,"cancel"),l()()()()}if(i&2){let e=o.$implicit,t=C(3);c(4),L(e.repoId),c(),p("paused",e.status==="paused"),c(),L(e.status),c(),k(e.pids.length>0?7:-1),c(),x("title",e.dest),c(),L(e.dest),c(),x("mode",t.progressMode(e))("value",t.percent(e)??0),c(3),fi(" ",t.formatBytes(e.doneBytes)," / ",e.totalBytes>0?t.formatBytes(e.totalBytes):"\u2026"," "),c(2),fi("",e.filesDone," / ",e.filesTotal," files"),c(2),L(t.formatSpeed(e.speedBps)),c(2),L(e.status==="paused"?"paused":"\u2248 "+t.formatEta(e.etaSeconds)),c(2),k(e.status==="paused"?21:22)}}function nx(i,o){if(i&1&&(s(0,"div",11),de(1,ix,26,16,"div",19,GC),l()),i&2){let e=C(2);c(),me(e.downloads())}}function ox(i,o){if(i&1&&(s(0,"span",12),m(1),l()),i&2){let e=C(2);c(),fi(" \u2014 ",e.orphans().length," file(s), ",e.formatBytes(e.totalOrphanBytes()))}}function ax(i,o){i&1&&(s(0,"div",8),m(1,"Loading\u2026"),l())}function rx(i,o){i&1&&(s(0,"div",9),m(1,"No orphaned blobs"),l())}function sx(i,o){if(i&1&&(s(0,"div",13)(1,"div",14)(2,"span",16),m(3),l()(),s(4,"span",17),m(5),l()()),i&2){let e=o.$implicit,t=C(3);c(2),x("title",e.path),c(),L(e.path),c(2),L(t.formatBytes(e.size))}}function lx(i,o){if(i&1){let e=De();s(0,"div",35),de(1,sx,6,3,"div",13,$C),l(),s(3,"div",36)(4,"button",37),E("click",function(){le(e);let n=C(2);return ce(n.cleanupOrphans())}),m(5),l()()}if(i&2){let e=C(2);c(),me(e.orphans()),c(3),x("disabled",e.cleaning()),c(),he(" ",e.cleaning()?"Cleaning\u2026":"Cleanup ("+e.formatBytes(e.totalOrphanBytes())+")"," ")}}function cx(i,o){if(i&1&&(s(0,"div",7),m(1,"Downloaded models"),l(),S(2,KC,2,0,"div",8)(3,YC,2,0,"div",9)(4,ZC,3,0,"div",10),s(5,"div",7),m(6,"Downloading"),l(),S(7,QC,2,0,"div",9)(8,nx,3,0,"div",11),s(9,"div",7),m(10," Orphaned blobs "),S(11,ox,2,2,"span",12),l(),S(12,ax,2,0,"div",8)(13,rx,2,0,"div",9)(14,lx,6,2)),i&2){let e=C();c(2),k(e.modelsLoading()?2:e.staticModels().length===0?3:4),c(5),k(e.downloads().length===0?7:8),c(4),k(!e.orphansLoading()&&e.orphans().length>0?11:-1),c(),k(e.orphansLoading()?12:e.orphans().length===0?13:14)}}var dx=2e3,Fp=(()=>{class i{constructor(){this.hfService=d(Vs),this.dialogRef=d(ut),this.downloads=A([]),this.models=A([]),this.loading=A(!0),this.modelsLoading=A(!0),this.error=A(null),this.deleting=A(null),this.staticModels=U(()=>{let e=new Set(this.downloads().map(t=>t.dest));return this.models().filter(t=>!e.has(t.dir))}),this.orphans=A([]),this.orphansLoading=A(!0),this.cleaning=A(!1),this.totalOrphanBytes=U(()=>this.orphans().reduce((e,t)=>e+t.size,0)),this.timer=null,this.busy=!1}ngOnInit(){this.refresh(),this.refreshModels(),this.refreshOrphans(),this.timer=setInterval(()=>{this.refresh()},dx)}ngOnDestroy(){this.timer&&clearInterval(this.timer)}refresh(){return J(this,null,function*(){try{this.downloads.set(yield this.hfService.getDownloads()),this.error.set(null)}catch(e){this.error.set(this.errorText(e,"Failed to load downloads"))}finally{this.loading.set(!1)}})}refreshModels(){return J(this,null,function*(){try{this.models.set(yield this.hfService.getLocalModels())}catch(e){this.error.set(this.errorText(e,"Failed to load models"))}finally{this.modelsLoading.set(!1)}})}refreshOrphans(){return J(this,null,function*(){try{this.orphans.set(yield this.hfService.getOrphanBlobs())}catch(e){this.error.set(this.errorText(e,"Failed to load orphaned blobs"))}finally{this.orphansLoading.set(!1)}})}errorText(e,t){return e instanceof Wt?e.error?.error??e.message:e instanceof Error?e.message:t}pause(e){return J(this,null,function*(){yield this.act("pause",e)})}resume(e){return J(this,null,function*(){yield this.act("resume",e)})}cancel(e){return J(this,null,function*(){confirm(`Cancel download of ${e.repoId}? Partial files will be kept for resume.`)&&(yield this.act("cancel",e))})}deleteModel(e){return J(this,null,function*(){if(!this.deleting()&&confirm(`Delete model ${e.name} (${this.formatBytes(e.size)}) from the Hugging Face cache?`)){this.deleting.set(e.name);try{yield this.hfService.deleteLocalModel(e.name),yield this.refreshModels(),yield this.refreshOrphans()}catch(t){this.error.set(this.errorText(t,`Failed to delete ${e.name}`))}finally{this.deleting.set(null)}}})}cleanupOrphans(){return J(this,null,function*(){if(this.cleaning())return;let e=this.orphans().length;if(confirm(`Delete ${e} orphaned blob file(s) (${this.formatBytes(this.totalOrphanBytes())})?`)){this.cleaning.set(!0);try{yield this.hfService.cleanupOrphanBlobs(),yield this.refreshOrphans()}catch(t){this.error.set(this.errorText(t,"Failed to clean up orphaned blobs"))}finally{this.cleaning.set(!1)}}})}act(e,t){return J(this,null,function*(){if(!this.busy){this.busy=!0;try{yield this.hfService.action(e,t),yield this.refresh()}catch(n){this.error.set(this.errorText(n,`Failed to ${e} download`))}finally{this.busy=!1}}})}percent(e){return e.totalBytes<=0?null:Math.min(100,e.doneBytes/e.totalBytes*100)}progressMode(e){return e.totalBytes>0?"determinate":"indeterminate"}formatBytes(e){if(e<=0)return"0 B";let t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}formatSpeed(e){return e<=0?"\u2014":`${(e/(1024*1024)).toFixed(1)} MB/s`}formatEta(e){if(e===null)return"\u2014";if(e<60)return`${e} s`;let t=Math.floor(e/3600),n=Math.round(e%3600/60);return t>0?`${t} h ${n} m`:`${n} m`}close(){this.dialogRef.close()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-llm-models-dialog"]],decls:16,vars:2,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"error"],[1,"section-title"],[1,"state"],["align","end"],["mat-raised-button","","color","primary",3,"click"],[1,"subsection-title"],[1,"state","small"],[1,"empty"],[1,"model-list"],[1,"download-list"],[1,"orphan-total"],[1,"model-row"],[1,"row-main"],[1,"repo"],[1,"row-dest",3,"title"],[1,"size"],["mat-icon-button","","color","warn","title","Delete model",3,"click","disabled"],[1,"download-row"],[1,"row-title"],[1,"status-chip"],[1,"pids"],[3,"mode","value"],[1,"row-meta"],[1,"progress-text"],[1,"files"],[1,"speed"],[1,"eta"],[1,"row-actions"],["mat-icon-button","","color","primary","title","Resume"],["mat-icon-button","","title","Pause"],["mat-icon-button","","color","warn","title","Cancel",3,"click"],["mat-icon-button","","color","primary","title","Resume",3,"click"],["mat-icon-button","","title","Pause",3,"click"],[1,"model-list","orphan-list"],[1,"orphan-actions"],["mat-raised-button","","color","warn",3,"click","disabled"]],template:function(t,n){if(t&1&&(s(0,"div",0)(1,"h2",1)(2,"mat-icon"),m(3,"model_training"),l(),m(4," LLM Models "),l(),s(5,"mat-dialog-content"),S(6,WC,2,1,"div",2),s(7,"h3",3)(8,"mat-icon"),m(9,"cloud"),l(),m(10," HuggingFace "),l(),S(11,qC,2,0,"div",4)(12,cx,15,4),l(),s(13,"mat-dialog-actions",5)(14,"button",6),E("click",function(){return n.close()}),m(15,"Close"),l()()()),t&2){let a;c(6),k((a=n.error())?6:-1,a),c(5),k(n.loading()?11:12)}},dependencies:[Pe,Ke,Xe,vi,bt,Bt,jt,zt,ni,Ii,vt,_t],styles:[".dialog-container[_ngcontent-%COMP%]{min-width:480px}.error[_ngcontent-%COMP%]{margin:0 0 12px;padding:8px 12px;border-radius:6px;background:#f443361a;color:#d32f2f;font-size:13px}.section-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:4px 0 12px;font-size:15px;font-weight:500;color:#333}.section-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:#666}.subsection-title[_ngcontent-%COMP%]{margin:16px 0 8px;font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.6px;color:#666}.subsection-title[_ngcontent-%COMP%]:first-of-type{margin-top:0}.orphan-total[_ngcontent-%COMP%]{text-transform:none;letter-spacing:0;font-weight:400;color:#999}.orphan-list[_ngcontent-%COMP%]{max-height:25vh}.orphan-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;margin-top:8px}.state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:8px;padding:40px 0;color:#999;font-size:14px}.state.small[_ngcontent-%COMP%]{padding:16px 0}.state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.empty[_ngcontent-%COMP%]{padding:8px 4px;color:#999;font-size:13px}.model-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;max-height:35vh;overflow-y:auto}.model-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;border:1px solid #e0e0e0;background:#fafafa}.model-row[_ngcontent-%COMP%] .row-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.model-row[_ngcontent-%COMP%] .repo[_ngcontent-%COMP%]{font-weight:500;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.model-row[_ngcontent-%COMP%] .row-dest[_ngcontent-%COMP%]{font-family:monospace;font-size:11px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.model-row[_ngcontent-%COMP%] .size[_ngcontent-%COMP%]{flex-shrink:0;font-size:13px;color:#666}.download-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;max-height:55vh;overflow-y:auto}.download-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px;border-radius:8px;border:1px solid #e0e0e0;background:#fafafa}.download-row[_ngcontent-%COMP%] .row-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%] .repo[_ngcontent-%COMP%]{font-weight:500;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%] .pids[_ngcontent-%COMP%]{font-size:11px;color:#999}.download-row[_ngcontent-%COMP%] .status-chip[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase;letter-spacing:.4px;padding:2px 8px;border-radius:10px;background:#e8f5e9;color:#2e7d32}.download-row[_ngcontent-%COMP%] .status-chip.paused[_ngcontent-%COMP%]{background:#fff3e0;color:#e65100}.download-row[_ngcontent-%COMP%] .row-dest[_ngcontent-%COMP%]{font-family:monospace;font-size:11px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.download-row[_ngcontent-%COMP%] mat-progress-bar[_ngcontent-%COMP%]{margin:4px 0}.download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%]{display:flex;gap:16px;font-size:12px;color:#333}.download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .files[_ngcontent-%COMP%], .download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .speed[_ngcontent-%COMP%], .download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .eta[_ngcontent-%COMP%]{color:#666}.download-row[_ngcontent-%COMP%] .row-actions[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}"]})}}return i})();function mx(i,o){if(i&1){let e=De();s(0,"button",14),E("click",function(){le(e);let n=C();return ce(n.openLlmModels())}),s(1,"mat-icon"),m(2,"model_training"),l(),s(3,"span"),m(4,"LLM Models"),l()()}}var Np=(()=>{class i{constructor(){this.systemInfo=ro.required(),this.systemService=d(Ls),this.hfService=d(Vs),this.dialog=d(Io),this.layoutService=d(rs),this.layout=U(()=>this.layoutService.layout()),this.hfInstalled=A(!1)}ngOnInit(){this.hfService.getStatus().then(e=>this.hfInstalled.set(e.installed)).catch(()=>this.hfInstalled.set(!1))}setLayout(e){this.layoutService.setLayout(e)}openSystemInfo(){this.dialog.open(Pp,{disableClose:!1})}openLlmModels(){this.dialog.open(Fp,{width:"760px",maxWidth:"95vw",disableClose:!1})}reboot(){return J(this,null,function*(){confirm("Reboot the server?")&&(yield this.systemService.reboot())})}shutdown(){return J(this,null,function*(){confirm("Shutdown the server?")&&(yield this.systemService.shutdown())})}formatBytes(e){let t=e/1073741824;return`${Math.ceil(t)} GB`}ceilCpu(e){return Math.ceil(e)}colorForUsage(e){return e<40?"#4caf50":e<75?"#ff9800":"#f44336"}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-system-bar"]],inputs:{systemInfo:[1,"systemInfo"]},decls:61,vars:19,consts:[["menu","matMenu"],[1,"system-bar"],[1,"system-panel"],[1,"panel-body"],[1,"panel-icon"],[1,"panel-content"],[1,"panel-header"],[1,"panel-label"],[1,"panel-value"],[1,"bar-bg"],[1,"bar-fill"],[1,"server-controls"],["mat-icon-button","","color","warn","title","Server actions",3,"matMenuTriggerFor"],["yPosition","below"],["mat-menu-item","",3,"click"],["mat-menu-item",""]],template:function(t,n){if(t&1&&(s(0,"div",1)(1,"mat-card",2)(2,"mat-card-content")(3,"div",3)(4,"mat-icon",4),m(5,"dynamic_feed"),l(),s(6,"div",5)(7,"div",6)(8,"span",7),m(9,"CPU"),l(),s(10,"span",8),m(11),l()(),s(12,"div",9),_(13,"div",10),l()()()()(),s(14,"mat-card",2)(15,"mat-card-content")(16,"div",3)(17,"mat-icon",4),m(18,"memory"),l(),s(19,"div",5)(20,"div",6)(21,"span",7),m(22,"RAM"),l(),s(23,"span",8),m(24),l()(),s(25,"div",9),_(26,"div",10),l()()()()(),s(27,"div",11)(28,"button",12)(29,"mat-icon"),m(30,"more_vert"),l()(),s(31,"mat-menu",13,0)(33,"button",14),E("click",function(){return n.reboot()}),s(34,"mat-icon"),m(35,"restart_alt"),l(),s(36,"span"),m(37,"Reboot server"),l()(),s(38,"button",14),E("click",function(){return n.shutdown()}),s(39,"mat-icon"),m(40,"power_settings_new"),l(),s(41,"span"),m(42,"Shutdown server"),l()(),_(43,"mat-divider"),s(44,"button",14),E("click",function(){return n.setLayout("vertical")}),s(45,"mat-icon"),m(46),l(),s(47,"span"),m(48,"Layout: vertical"),l()(),s(49,"button",14),E("click",function(){return n.setLayout("horizontal")}),s(50,"mat-icon"),m(51),l(),s(52,"span"),m(53,"Layout: horizontal"),l()(),_(54,"mat-divider"),s(55,"button",14),E("click",function(){return n.openSystemInfo()}),s(56,"mat-icon"),m(57,"info"),l(),s(58,"span"),m(59,"System info"),l()(),S(60,mx,5,0,"button",15),l()()()),t&2){let a=Le(32);c(10),Ve("color",n.colorForUsage(n.systemInfo().cpuUsage)),c(),he(" ",n.ceilCpu(n.systemInfo().cpuUsage),"% "),c(2),Ve("width",n.systemInfo().cpuUsage,"%")("background",n.colorForUsage(n.systemInfo().cpuUsage)),c(10),Ve("color",n.colorForUsage(n.systemInfo().memoryPercent)),c(),fi(" ",n.formatBytes(n.systemInfo().memoryUsed)," / ",n.formatBytes(n.systemInfo().memoryTotal)," "),c(2),Ve("width",n.systemInfo().memoryPercent,"%")("background",n.colorForUsage(n.systemInfo().memoryPercent)),c(2),x("matMenuTriggerFor",a),c(18),L(n.layout()==="vertical"?"check":"radio_button_unchecked"),c(5),L(n.layout()==="horizontal"?"check":"radio_button_unchecked"),c(9),k(n.hfInstalled()?60:-1)}},dependencies:[Pe,rn,on,an,vt,_t,Ke,vi,Ss,wn,Kn,Ds,No,Ua,bt],styles:[".system-bar[_ngcontent-%COMP%]{display:flex;gap:16px;margin-bottom:16px;align-items:stretch}.system-panel[_ngcontent-%COMP%]{flex:1}.server-controls[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.panel-body[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.panel-icon[_ngcontent-%COMP%]{color:#757575;font-size:24px;width:24px;height:24px}.panel-content[_ngcontent-%COMP%]{flex:1;min-width:0}.panel-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px}.panel-label[_ngcontent-%COMP%]{font-weight:500;font-size:.85rem;color:#555;text-transform:uppercase;letter-spacing:.5px}.panel-value[_ngcontent-%COMP%]{font-weight:500;font-size:.9rem;white-space:nowrap}.bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden}.bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px;transition:width .4s ease,background .4s ease}"]})}}return i})();function ux(i,o){if(i&1&&(s(0,"div",8)(1,"mat-icon",10),m(2,"warning"),l(),m(3),l()),i&2){let e=C(2);c(3),he(" ",e.loginError()," ")}}function hx(i,o){if(i&1){let e=De();s(0,"div",0)(1,"mat-card",1)(2,"mat-card-content")(3,"div",2)(4,"mat-icon",3),m(5,"lock"),l(),s(6,"h2"),m(7,"Authentication Required"),l(),s(8,"p",4),m(9,"Enter your system password to continue"),l()(),s(10,"form",5),E("submit",function(n){return le(e),C().onLogin(),ce(n.preventDefault())}),s(11,"mat-form-field",6)(12,"mat-label"),m(13,"Password"),l(),s(14,"input",7),E("input",function(n){le(e);let a=C();return ce(a.loginPassword.set(n.target.value))}),l()(),S(15,ux,4,1,"div",8),s(16,"button",9),m(17,"Sign In"),l()()()()()}if(i&2){let e=C();c(14),x("value",e.loginPassword()),c(),k(e.loginError()?15:-1)}}function px(i,o){i&1&&_(0,"mat-progress-bar",11)}function fx(i,o){if(i&1&&(s(0,"mat-card",14)(1,"mat-card-content")(2,"mat-icon",15),m(3," error_outline "),l(),s(4,"p"),m(5),l(),s(6,"p",4),m(7,"Make sure the backend is running on port 4242."),l()()()),i&2){let e=C(2);c(5),L(e.error())}}function gx(i,o){i&1&&(s(0,"mat-card",19)(1,"mat-card-content")(2,"p"),m(3,"No GPUs detected."),l(),s(4,"p",4),m(5," Ensure nvidia-smi or rocm-smi is available on this system. "),l()()())}function _x(i,o){if(i&1&&_(0,"app-gpu-table",20),i&2){let e=C(4);x("gpus",e.gpus())}}function vx(i,o){if(i&1){let e=De();s(0,"div",16)(1,"div",17),_(2,"app-system-bar",18),S(3,gx,6,0,"mat-card",19)(4,_x,1,1,"app-gpu-table",20),l(),s(5,"div",21),_(6,"app-services"),l()(),s(7,"div",22),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startJournalWidthDrag(n))}),_(8,"span",23),l(),s(9,"div",24),_(10,"app-journal-panel"),l()}if(i&2){let e=C(3);c(2),x("systemInfo",e.systemInfo()),c(),k(e.hasGpus()?4:3),c(6),Ve("width",e.sidebarWidth(),"px")}}function bx(i,o){i&1&&(s(0,"mat-card",19)(1,"mat-card-content")(2,"p"),m(3,"No GPUs detected."),l(),s(4,"p",4),m(5," Ensure nvidia-smi or rocm-smi is available on this system. "),l()()())}function yx(i,o){if(i&1&&_(0,"app-gpu-table",20),i&2){let e=C(4);x("gpus",e.gpus())}}function Cx(i,o){if(i&1){let e=De();s(0,"div",25)(1,"div",17),_(2,"app-system-bar",18),S(3,bx,6,0,"mat-card",19)(4,yx,1,1,"app-gpu-table",20),l(),s(5,"div",22),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startGpuColDrag(n))}),_(6,"span",23),l(),s(7,"div",21),_(8,"app-services"),l()(),s(9,"div",26),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startJournalHeightDrag(n))}),_(10,"span",23),l(),s(11,"div",27),_(12,"app-journal-panel"),l()}if(i&2){let e=C(3);c(),Ve("width",e.gpuColWidth(),"px"),c(),x("systemInfo",e.systemInfo()),c(),k(e.hasGpus()?4:3),c(8),Ve("height",e.journalHeight(),"px")}}function xx(i,o){if(i&1&&S(0,vx,11,4)(1,Cx,13,6),i&2){let e,t=C(2);k((e=t.layout())==="vertical"?0:e==="horizontal"?1:-1)}}function wx(i,o){if(i&1&&(S(0,px,1,0,"mat-progress-bar",11),s(1,"div",12)(2,"div",13),S(3,fx,8,1,"mat-card",14)(4,xx,2,1),l()()),i&2){let e=C();k(e.loading()?0:-1),c(),p("horizontal",e.layout()==="horizontal")("dragging",e.isDragging()),c(2),k(e.error()?3:4)}}var Lp=100,Vp=1600,Bp=160,zp=800,Dx=320,jp=360,Hp=1400,Sx=560,Up=(()=>{class i{ngOnInit(){this.authService.authState.subscribe(a=>{this.isAuthenticated.set(a),a&&(this.loginError.set(null),this.loginPassword.set(""))});let e=localStorage.getItem("journal-sidebar-width");if(e){let a=parseInt(e,10);a>=Lp&&a<=Vp&&this.sidebarWidth.set(a)}let t=localStorage.getItem("journal-bottom-height");if(t){let a=parseInt(t,10);a>=Bp&&a<=zp&&this.journalHeight.set(a)}let n=localStorage.getItem("gpu-col-width");if(n){let a=parseInt(n,10);a>=jp&&a<=Hp&&this.gpuColWidth.set(a)}}ngOnDestroy(){}onLogin(){return J(this,null,function*(){this.loginError.set(null),(yield this.authService.login(this.loginPassword()))?(this.loading.set(!0),this.initGpus()):this.loginError.set("Invalid password")})}startJournalWidthDrag(e){this.beginDrag("journalWidth",e.clientX,this.sidebarWidth())}startJournalHeightDrag(e){this.beginDrag("journalHeight",e.clientY,this.journalHeight())}startGpuColDrag(e){this.beginDrag("gpuColWidth",e.clientX,this.gpuColWidth())}beginDrag(e,t,n){this.dragTarget=e,this.dragStartCoord=t,this.dragStartValue=n,this.isDragging.set(!0)}onDrag(e){if(!(!this.isDragging()||!this.dragTarget)){if(this.dragTarget==="journalWidth"){let t=this.dragStartCoord-e.clientX;this.sidebarWidth.set(this.clamp(this.dragStartValue+t,Lp,Vp))}else if(this.dragTarget==="journalHeight"){let t=this.dragStartCoord-e.clientY;this.journalHeight.set(this.clamp(this.dragStartValue+t,Bp,zp))}else if(this.dragTarget==="gpuColWidth"){let t=e.clientX-this.dragStartCoord;this.gpuColWidth.set(this.clamp(this.dragStartValue+t,jp,Hp))}}}onDragEnd(){!this.isDragging()||!this.dragTarget||(this.dragTarget==="journalWidth"?localStorage.setItem("journal-sidebar-width",String(this.sidebarWidth())):this.dragTarget==="journalHeight"?localStorage.setItem("journal-bottom-height",String(this.journalHeight())):this.dragTarget==="gpuColWidth"&&localStorage.setItem("gpu-col-width",String(this.gpuColWidth())),this.dragTarget=null,this.isDragging.set(!1))}clamp(e,t,n){return Math.max(t,Math.min(n,e))}constructor(){this.gpuService=d(ch),this.authService=d(Ir),this.layoutService=d(rs),this.gpus=A([]),this.systemInfo=A({cpuUsage:0,memoryTotal:0,memoryUsed:0,memoryPercent:0}),this.loading=A(!0),this.error=A(null),this.hasGpus=U(()=>this.gpus().length>0),this.layout=this.layoutService.layout,this.isAuthenticated=A(this.authService.isAuthenticated()),this.loginPassword=A(""),this.loginError=A(null),this.sidebarWidth=A(420),this.journalHeight=A(Dx),this.gpuColWidth=A(Sx),this.isDragging=A(!1),this.dragTarget=null,this.dragStartCoord=0,this.dragStartValue=0,this.isAuthenticated()&&this.initGpus()}initGpus(e=0){this.gpuService.fetchGpus().subscribe({next:t=>{if(t.length===0){e<3?setTimeout(()=>this.initGpus(e+1),5e3):this.loading.set(!1);return}let n=t.map(a=>Fe(B({},a),{key:a.pciBusId,usage:0,temperature:0,vramUsed:0}));this.gpus.set(n),this.loading.set(!1),this.error.set(null),this.gpuService.watchStatus(3e3).subscribe({next:a=>{this.systemInfo.set(a.system),this.mergeUsage(a.gpus)},error:a=>{console.error("[AppComponent] status poll error:",a)}})},error:t=>{console.error("[AppComponent] static fetch error:",t),this.error.set(`Failed to fetch GPU data: ${t.message}`),this.loading.set(!1)}})}mergeUsage(e){let t=new Map;for(let n of e)t.set(n.key,n);this.gpus.update(n=>n.map(a=>{let r=t.get(a.pciBusId);return Fe(B({},a),{key:a.pciBusId,usage:r?.usage??0,temperature:r?.temperature??0,vramUsed:r?.vramUsed??0})}))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-root"]],hostBindings:function(t,n){t&1&&E("mousemove",function(r){return n.onDrag(r)},qs)("mouseup",function(){return n.onDragEnd()},qs)},decls:2,vars:1,consts:[[1,"login-container"],[1,"login-card"],[1,"login-header"],[1,"login-icon"],[1,"mat-body-2",2,"color","#999"],[1,"login-form",3,"submit"],["appearance","outline",1,"full-width"],["matInput","","type","password","autofocus","",3,"input","value"],[1,"login-error"],["mat-raised-button","","color","primary","type","submit",1,"login-btn"],[2,"font-size","20px","vertical-align","middle"],["mode","query","color","primary"],[1,"layout"],[1,"main-content"],[1,"error-card"],[2,"color","#f44336","font-size","48px","float","left","margin-right","16px"],[1,"top-row-vertical"],[1,"gpu-col"],[3,"systemInfo"],[1,"empty-card"],[3,"gpus"],[1,"services-col"],[1,"splitter",3,"mousedown"],[1,"splitter-line"],[1,"journal-sidebar"],[1,"top-row-horizontal"],[1,"splitter","splitter-h",3,"mousedown"],[1,"journal-bottom"]],template:function(t,n){t&1&&S(0,hx,18,2,"div",0)(1,wx,5,6),t&2&&k(n.isAuthenticated()?1:0)},dependencies:[Pe,ni,Ii,rn,on,an,ri,ai,Et,Lt,Tt,Ke,Xe,vt,_t,Ph,Rp,Op,Np],styles:[".spacer[_ngcontent-%COMP%]{flex:1 1 auto}.login-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - 56px);padding:24px;background:#f5f5f5}.login-card[_ngcontent-%COMP%]{width:100%;max-width:400px}.login-header[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.login-header[_ngcontent-%COMP%] .login-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;line-height:48px;background:#e3f2fd;border-radius:50%;padding:8px;color:#1976d2}.login-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:16px 0 4px;font-size:22px;font-weight:500}.login-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px}.login-error[_ngcontent-%COMP%]{color:#d32f2f;font-size:14px;text-align:center;padding:8px;background:#ffebee;border-radius:4px}.login-btn[_ngcontent-%COMP%]{width:100%;margin-top:8px}.full-width[_ngcontent-%COMP%]{width:100%}.layout[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.layout.dragging[_ngcontent-%COMP%]{user-select:none;-webkit-user-select:none}.main-content[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:row;padding:24px;max-width:100%}.top-row-vertical[_ngcontent-%COMP%]{flex:1;min-width:0;overflow-y:auto}.gpu-col[_ngcontent-%COMP%], .services-col[_ngcontent-%COMP%]{min-width:0}.splitter[_ngcontent-%COMP%]{width:8px;flex-shrink:0;cursor:col-resize;margin:0 8px;display:flex;align-items:center;justify-content:center;background:transparent;transition:background .15s}.splitter[_ngcontent-%COMP%]:hover{background:#0000000a}.splitter[_ngcontent-%COMP%] .splitter-line[_ngcontent-%COMP%]{width:2px;height:32px;border-radius:1px;background:#bdbdbd;transition:background .15s,width .15s}.splitter[_ngcontent-%COMP%]:hover .splitter-line[_ngcontent-%COMP%]{background:#757575;width:3px}.splitter-h[_ngcontent-%COMP%]{width:100%;height:8px;flex-shrink:0;cursor:row-resize;margin:8px 0;display:flex;align-items:center;justify-content:center;background:transparent;transition:background .15s}.splitter-h[_ngcontent-%COMP%]:hover{background:#0000000a}.splitter-h[_ngcontent-%COMP%] .splitter-line[_ngcontent-%COMP%]{width:32px;height:2px;border-radius:1px;background:#bdbdbd;transition:background .15s,height .15s}.splitter-h[_ngcontent-%COMP%]:hover .splitter-line[_ngcontent-%COMP%]{background:#757575;height:3px}.journal-sidebar[_ngcontent-%COMP%], .journal-bottom[_ngcontent-%COMP%]{flex-shrink:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%]{flex-direction:column}.layout.horizontal[_ngcontent-%COMP%] .top-row-horizontal[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex:1;min-height:0}.layout.horizontal[_ngcontent-%COMP%] .gpu-col[_ngcontent-%COMP%]{flex-shrink:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .services-col[_ngcontent-%COMP%]{flex:1;min-width:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .services-col[_ngcontent-%COMP%] app-services[_ngcontent-%COMP%]{margin-top:0}.error-card[_ngcontent-%COMP%], .empty-card[_ngcontent-%COMP%]{margin-top:32px;max-width:600px;margin-left:auto;margin-right:auto}[_nghost-%COMP%] mat-card-content{padding-top:10px!important;padding-bottom:10px!important}app-services[_ngcontent-%COMP%]{display:block;margin-top:24px}"]})}}return i})();yl(Up,Cm).catch(i=>console.error(i));
5598
+ `)}),Gt(()=>{if(!this.servicesLoaded())return;let e=this.selectedService();e!==null&&!this.services().some(t=>t.name===e)&&this.selectedServiceService.select(null)}),Gt(()=>{if(!this.servicesLoaded())return;this.selectedService()?(this.journalLines.set([]),this.journalError.set(null),this.restartPolling()):(this.stopPolling(),this.journalLines.set([]))}),this.serviceList.refresh()}ngAfterViewInit(){this.scrollToBottom()}ngOnDestroy(){this.stopPolling()}onServiceChange(e){this.selectedServiceService.select(e)}restartPolling(){this.stopPolling(),this.fetchJournal(),this.journalSub=Qa(0,1e3).subscribe(()=>this.fetchJournal())}stopPolling(){this.journalSub&&(this.journalSub.unsubscribe(),this.journalSub=void 0)}fetchJournal(){let e=this.selectedService();e&&(this.isTextSelected()||(this.journalLoading.set(!0),this.serviceService.fetchJournal(e,100).subscribe({next:t=>{let n=this.isScrolledToBottom();this.journalLines.set(t),this.journalError.set(null),this.journalLoading.set(!1),this.cdr.markForCheck(),requestAnimationFrame(()=>{n&&this.scrollToBottom()})},error:t=>{this.journalError.set(t.message),this.journalLoading.set(!1),this.cdr.markForCheck()}})))}get scrollContainer(){return this.journalBody?.nativeElement??null}isTextSelected(){let e=typeof window<"u"?window:null;if(!e)return!1;let t=e.getSelection();if(!t||t.isCollapsed||!t.rangeCount)return!1;let n=this.scrollContainer;return n?n.contains(t.anchorNode):!1}isScrolledToBottom(){let e=this.scrollContainer;return e?e.scrollHeight-e.scrollTop-e.clientHeight<=MC:!0}scrollToBottom(){let e=this.scrollContainer;e&&(e.scrollTop=e.scrollHeight)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-journal-panel"]],viewQuery:function(t,n){if(t&1&&Te(vC,5),t&2){let a;P(a=F())&&(n.journalBody=a.first)}},decls:9,vars:3,consts:[["journalBody",""],[1,"journal-card"],[1,"journal-header"],[1,"journal-error"],[1,"journal-body"],[1,"journal-body","journal-empty"],["disableOptionCentering","",1,"service-select",3,"ngModelChange","ngModel"],[3,"value"],["mat-flat-button","","color","primary","aria-label","Disable word wrap"],["mat-stroked-button","","aria-label","Enable word wrap"],["mat-flat-button","","color","primary","aria-label","Disable word wrap",3,"click"],["mat-stroked-button","","aria-label","Enable word wrap",3,"click"]],template:function(t,n){t&1&&(s(0,"mat-card",1)(1,"mat-card-content")(2,"div",2)(3,"h2"),m(4,"Journal"),l(),S(5,wC,7,3),l(),S(6,DC,2,1,"div",3),S(7,SC,4,3,"div",4)(8,kC,3,0,"div",5),l()()),t&2&&(c(5),k(n.servicesLoaded()&&n.services().length>0?5:-1),c(),k(n.error()?6:-1),c(),k(n.selectedService()?7:8))},dependencies:[Pe,rn,on,an,Vo,Lo,Ct,Ke,Xe,vt,_t,ni,fn,Pi,rc],styles:[".journal-card[_ngcontent-%COMP%]{height:100%;display:flex;flex-direction:column;overflow:hidden}.journal-card[_ngcontent-%COMP%] mat-card-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.journal-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-shrink:0}.journal-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:20px;font-weight:500}.service-select[_ngcontent-%COMP%]{flex:1;min-width:150px}.journal-error[_ngcontent-%COMP%]{color:#f44336;font-size:13px;margin-bottom:8px;flex-shrink:0}.journal-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;background:#1e1e1e;border-radius:4px;padding:8px;min-height:0}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#2d2d2d;border-radius:4px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.journal-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.journal-body[_ngcontent-%COMP%]{scrollbar-width:thin;scrollbar-color:#555 #2d2d2d}.journal-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-family:Courier New,Courier,monospace;font-size:12px;line-height:1.6;color:#d4d4d4;white-space:pre}.journal-body[_ngcontent-%COMP%] pre.wrap-on[_ngcontent-%COMP%]{white-space:pre-wrap}.journal-empty[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center}.journal-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:#888;font-size:14px}[_nghost-%COMP%] .mdc-button{min-width:32px}[_nghost-%COMP%] .mat-mdc-unelevated-button>.mat-icon, [_nghost-%COMP%] .mat-mdc-outlined-button>.mat-icon{margin-right:0}"]})}}return i})();var Ls=(()=>{class i{constructor(){this.http=d(Ft),this.baseUrl="/api/system"}reboot(){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/reboot`,null))})}shutdown(){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/shutdown`,null))})}getSystemInfo(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/info`))})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=ee({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var Vs=(()=>{class i{constructor(){this.http=d(Ft),this.baseUrl="/api/hf"}getStatus(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/status`))})}getDownloads(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/downloads`))})}getLocalModels(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/models`))})}deleteLocalModel(e){return J(this,null,function*(){let[t,...n]=e.split("/");yield _e(this.http.delete(`${this.baseUrl}/models/${t}/${n.join("/")}`))})}getOrphanBlobs(){return J(this,null,function*(){return _e(this.http.get(`${this.baseUrl}/models/orphans`))})}cleanupOrphanBlobs(){return J(this,null,function*(){return _e(this.http.post(`${this.baseUrl}/models/orphans/cleanup`,{}))})}action(e,t){return J(this,null,function*(){yield _e(this.http.post(`${this.baseUrl}/downloads/action`,{action:e,repoId:t.repoId,dest:t.dest}))})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=ee({token:i,factory:i.\u0275fac,providedIn:"root"})}}return i})();var EC=(i,o)=>o.device,TC=(i,o)=>o.path;function AC(i,o){i&1&&_(0,"mat-progress-bar",2)}function IC(i,o){if(i&1&&(s(0,"p",3),m(1),l()),i&2){let e=C();c(),L(e.error())}}function RC(i,o){if(i&1&&(s(0,"span",11),m(1),l()),i&2){let e=C(2);c(),L(e.info().uptime)}}function OC(i,o){if(i&1&&(s(0,"div",12)(1,"span",13),m(2,"Version"),l(),s(3,"span",14),m(4),l()()),i&2){let e=C(2);c(4),L(e.info().os.version)}}function PC(i,o){if(i&1&&(s(0,"div",16)(1,"div",18)(2,"span",19),m(3),l(),s(4,"span",20),m(5),l()(),s(6,"div",21),_(7,"div",22),l(),s(8,"div",23)(9,"span"),m(10),l(),s(11,"span"),m(12),l()()()),i&2){let e=o.$implicit,t=C(2);c(3),L(e.device),c(2),L(e.mountPoint),c(2),Ve("width",e.usePercent,"%")("background",e.usePercent>90?"#f44336":e.usePercent>75?"#ff9800":"#4caf50"),c(3),fi("",t.formatBytes(e.available)," free of ",t.formatBytes(e.total)),c(2),he("",e.usePercent,"% used")}}function FC(i,o){if(i&1&&(s(0,"div",27)(1,"span",31),m(2,"Last"),l(),s(3,"span",32),m(4),Go(5,"date"),l()()),i&2){let e=C(3);c(4),L($o(5,1,e.info().timeshift.lastSnapshot,"medium"))}}function NC(i,o){if(i&1&&(s(0,"mat-chip",33),m(1),l()),i&2){let e=o.$implicit;c(),L(e)}}function LC(i,o){if(i&1&&(s(0,"mat-chip-set"),de(1,NC,2,1,"mat-chip",33,St),l()),i&2){let e=C(3);c(),me(e.info().timeshift.schedules)}}function VC(i,o){if(i&1&&(s(0,"div",6)(1,"h3"),m(2,"Timeshift Backup"),l(),s(3,"div",7)(4,"div",8)(5,"mat-chip-set")(6,"mat-chip",24),m(7),l(),s(8,"mat-chip",25),m(9),l()(),s(10,"span",26),m(11),l()(),S(12,FC,6,4,"div",27),s(13,"div",28),_(14,"div",29),l(),s(15,"div",30)(16,"span"),m(17),l(),S(18,LC,3,0,"mat-chip-set"),l()()(),_(19,"mat-divider",15)),i&2){let e=C(2);c(7),L(e.info().timeshift.mode),c(2),L(e.info().timeshift.device),c(2),he("",e.info().timeshift.snapshots," snapshots"),c(),k(e.info().timeshift.lastSnapshot?12:-1),c(2),Ve("width",e.info().timeshift.totalSpace>0?(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace*100:0,"%")("background",e.info().timeshift.totalSpace>0&&(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace>.9?"#f44336":e.info().timeshift.totalSpace>0&&(e.info().timeshift.totalSpace-e.info().timeshift.freeSpace)/e.info().timeshift.totalSpace>.75?"#ff9800":"#4caf50"),c(3),fi("",e.formatBytes(e.info().timeshift.freeSpace)," free of ",e.formatBytes(e.info().timeshift.totalSpace)),c(),k(e.info().timeshift.schedules.length>0?18:-1)}}function BC(i,o){if(i&1&&m(0),i&2){let e=C().$implicit,t=C(2);he(" ",t.formatBytes(e.size)," ")}}function zC(i,o){i&1&&m(0," \u2014 ")}function jC(i,o){if(i&1&&(s(0,"div",17)(1,"span",34),m(2),l(),s(3,"span",35),S(4,BC,1,1)(5,zC,1,0),l()()),i&2){let e=o.$implicit;c(2),L(e.path),c(2),k(e.exists?4:5)}}function HC(i,o){if(i&1&&(s(0,"div",6)(1,"h3"),m(2,"Operating System"),l(),s(3,"div",7)(4,"div",8)(5,"mat-chip-set")(6,"mat-chip",9),m(7),l(),s(8,"mat-chip",10),m(9),l()(),S(10,RC,2,1,"span",11),l(),S(11,OC,5,1,"div",12),s(12,"div",12)(13,"span",13),m(14,"Kernel"),l(),s(15,"span",14),m(16),l()()()(),_(17,"mat-divider",15),s(18,"div",6)(19,"h3"),m(20,"Disks"),l(),de(21,PC,13,9,"div",16,EC),l(),_(23,"mat-divider",15),S(24,VC,20,11),s(25,"div",6)(26,"h3"),m(27,"System Logs"),l(),de(28,jC,6,2,"div",17,TC),l()),i&2){let e=C();c(7),L(e.info().hostname),c(2),L(e.info().os.name),c(),k(e.info().uptime?10:-1),c(),k(e.info().os.version?11:-1),c(5),L(e.info().kernel),c(5),me(e.info().disks),c(3),k(e.info().timeshift?24:-1),c(4),me(e.info().logs)}}var Pp=(()=>{class i{constructor(){this.systemService=d(Ls),this.dialogRef=d(ut),this.loading=A(!0),this.info=A(null),this.error=A(null)}ngOnInit(){return J(this,null,function*(){try{let e=yield this.systemService.getSystemInfo();this.info.set(e)}catch(e){this.error.set(e instanceof Error?e.message:"Failed to load system info")}finally{this.loading.set(!1)}})}formatBytes(e){return e===0?"0 B":`${(e/(1024*1024*1024)).toFixed(1)} GB`}close(){this.dialogRef.close()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-system-info-dialog"]],decls:12,vars:1,consts:[[1,"dialog-container"],["mat-dialog-title",""],["mode","indeterminate"],[1,"dialog-error"],["align","end"],["mat-raised-button","","color","primary",3,"click"],[1,"info-section"],[1,"info-card"],[1,"info-card-header"],[1,"hostname-chip"],[1,"distro-chip"],[1,"os-uptime"],[1,"info-row"],[1,"info-label"],[1,"info-value"],[1,"section-divider"],[1,"disk-row"],[1,"log-row"],[1,"disk-header"],[1,"disk-device"],[1,"disk-mount"],[1,"disk-bar-bg"],[1,"disk-bar-fill"],[1,"disk-details"],[1,"mode-chip"],[1,"device-chip"],[1,"timeshift-snapshots"],[1,"timeshift-row"],[1,"timeshift-disk-bar-bg"],[1,"timeshift-disk-bar-fill"],[1,"timeshift-disk-details"],[1,"timeshift-label"],[1,"timeshift-value"],[1,"schedule-chip"],[1,"log-path"],[1,"log-size"]],template:function(t,n){t&1&&(s(0,"div",0)(1,"h2",1)(2,"mat-icon"),m(3,"info"),l(),m(4," System Info "),l(),s(5,"mat-dialog-content"),S(6,AC,1,0,"mat-progress-bar",2)(7,IC,2,1,"p",3)(8,HC,30,6),l(),s(9,"mat-dialog-actions",4)(10,"button",5),E("click",function(){return n.close()}),m(11,"OK"),l()()()),t&2&&(c(6),k(n.loading()?6:n.error()?7:n.info()?8:-1))},dependencies:[Pe,Ke,Xe,bt,Bt,jt,zt,ni,Ii,No,Ua,vt,_t,Mo,Ra,Rh,ml],styles:[".dialog-container[_ngcontent-%COMP%]{min-width:480px}.dialog-error[_ngcontent-%COMP%]{color:#f44336;padding:8px 0}.info-section[_ngcontent-%COMP%]{margin-bottom:8px}.info-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.info-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0}.info-row[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%]{color:#666;font-size:14px}.info-row[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%]{font-family:monospace;font-size:13px;color:#333}.section-divider[_ngcontent-%COMP%]{margin:12px 0}.disk-row[_ngcontent-%COMP%]{margin-bottom:12px}.disk-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;margin-bottom:4px}.disk-header[_ngcontent-%COMP%] .disk-device[_ngcontent-%COMP%]{font-family:monospace;font-size:13px}.disk-header[_ngcontent-%COMP%] .disk-mount[_ngcontent-%COMP%]{font-size:13px;color:#666}.disk-bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden;margin-bottom:2px}.disk-bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px}.disk-details[_ngcontent-%COMP%]{display:flex;justify-content:space-between;font-size:12px;color:#666}.info-card[_ngcontent-%COMP%]{background:#f5f5f5;border-radius:8px;padding:12px}.info-card-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.info-card-header[_ngcontent-%COMP%] .hostname-chip[_ngcontent-%COMP%]{font-family:monospace;background:#e8eaf6!important;color:#303f9f!important}.info-card-header[_ngcontent-%COMP%] .distro-chip[_ngcontent-%COMP%], .info-card-header[_ngcontent-%COMP%] .mode-chip[_ngcontent-%COMP%]{font-weight:600;background:#e3f2fd!important;color:#1976d2!important}.info-card-header[_ngcontent-%COMP%] .device-chip[_ngcontent-%COMP%]{font-family:monospace;background:#e8eaf6!important;color:#303f9f!important}.os-uptime[_ngcontent-%COMP%], .timeshift-snapshots[_ngcontent-%COMP%]{font-size:13px;color:#666;white-space:nowrap}.timeshift-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0;margin-bottom:6px}.timeshift-row[_ngcontent-%COMP%] .timeshift-label[_ngcontent-%COMP%]{color:#666;font-size:13px}.timeshift-row[_ngcontent-%COMP%] .timeshift-value[_ngcontent-%COMP%]{font-size:13px;color:#333}.timeshift-disk-bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden;margin-bottom:4px}.timeshift-disk-bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px}.timeshift-disk-details[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#666}.timeshift-disk-details[_ngcontent-%COMP%] .schedule-chip[_ngcontent-%COMP%]{font-size:11px;background:#fff3e0!important;color:#e65100!important}.log-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:4px 0}.log-row[_ngcontent-%COMP%] .log-path[_ngcontent-%COMP%]{font-family:monospace;font-size:13px}.log-row[_ngcontent-%COMP%] .log-size[_ngcontent-%COMP%]{font-family:monospace;font-size:13px;color:#333}"]})}}return i})();var UC=(i,o)=>o.name,GC=(i,o)=>o.repoId+o.dest,$C=(i,o)=>o.path;function WC(i,o){i&1&&(s(0,"div",2),m(1),l()),i&2&&(c(),L(o))}function qC(i,o){i&1&&(s(0,"div",4),m(1,"Loading\u2026"),l())}function KC(i,o){i&1&&(s(0,"div",8),m(1,"Loading\u2026"),l())}function YC(i,o){i&1&&(s(0,"div",9),m(1,"No models in the Hugging Face cache"),l())}function XC(i,o){if(i&1){let e=De();s(0,"div",13)(1,"div",14)(2,"span",15),m(3),l(),s(4,"span",16),m(5),l()(),s(6,"span",17),m(7),l(),s(8,"button",18),E("click",function(){let n=le(e).$implicit,a=C(3);return ce(a.deleteModel(n))}),s(9,"mat-icon"),m(10,"delete"),l()()()}if(i&2){let e=o.$implicit,t=C(3);c(3),L(e.name),c(),x("title",e.dir),c(),L(e.dir),c(2),L(t.formatBytes(e.size)),c(),x("disabled",t.deleting()===e.name)}}function ZC(i,o){if(i&1&&(s(0,"div",10),de(1,XC,11,5,"div",13,UC),l()),i&2){let e=C(2);c(),me(e.staticModels())}}function QC(i,o){i&1&&(s(0,"div",9),m(1,"No active downloads"),l())}function JC(i,o){if(i&1&&(s(0,"span",22),m(1),l()),i&2){let e=C().$implicit;c(),he("pid ",e.pids.join(", "))}}function ex(i,o){if(i&1){let e=De();s(0,"button",33),E("click",function(){le(e);let n=C().$implicit,a=C(3);return ce(a.resume(n))}),s(1,"mat-icon"),m(2,"play_arrow"),l()()}}function tx(i,o){if(i&1){let e=De();s(0,"button",34),E("click",function(){le(e);let n=C().$implicit,a=C(3);return ce(a.pause(n))}),s(1,"mat-icon"),m(2,"pause"),l()()}}function ix(i,o){if(i&1){let e=De();s(0,"div",19)(1,"div",14)(2,"div",20)(3,"span",15),m(4),l(),s(5,"span",21),m(6),l(),S(7,JC,2,1,"span",22),l(),s(8,"div",16),m(9),l(),_(10,"mat-progress-bar",23),s(11,"div",24)(12,"span",25),m(13),l(),s(14,"span",26),m(15),l(),s(16,"span",27),m(17),l(),s(18,"span",28),m(19),l()()(),s(20,"div",29),S(21,ex,3,0,"button",30)(22,tx,3,0,"button",31),s(23,"button",32),E("click",function(){let n=le(e).$implicit,a=C(3);return ce(a.cancel(n))}),s(24,"mat-icon"),m(25,"cancel"),l()()()()}if(i&2){let e=o.$implicit,t=C(3);c(4),L(e.repoId),c(),p("paused",e.status==="paused"),c(),L(e.status),c(),k(e.pids.length>0?7:-1),c(),x("title",e.dest),c(),L(e.dest),c(),x("mode",t.progressMode(e))("value",t.percent(e)??0),c(3),fi(" ",t.formatBytes(e.doneBytes)," / ",e.totalBytes>0?t.formatBytes(e.totalBytes):"\u2026"," "),c(2),fi("",e.filesDone," / ",e.filesTotal," files"),c(2),L(t.formatSpeed(e.speedBps)),c(2),L(e.status==="paused"?"paused":"\u2248 "+t.formatEta(e.etaSeconds)),c(2),k(e.status==="paused"?21:22)}}function nx(i,o){if(i&1&&(s(0,"div",11),de(1,ix,26,16,"div",19,GC),l()),i&2){let e=C(2);c(),me(e.downloads())}}function ox(i,o){if(i&1&&(s(0,"span",12),m(1),l()),i&2){let e=C(2);c(),fi(" \u2014 ",e.orphans().length," file(s), ",e.formatBytes(e.totalOrphanBytes()))}}function ax(i,o){i&1&&(s(0,"div",8),m(1,"Loading\u2026"),l())}function rx(i,o){i&1&&(s(0,"div",9),m(1,"No orphaned blobs"),l())}function sx(i,o){if(i&1&&(s(0,"div",13)(1,"div",14)(2,"span",16),m(3),l()(),s(4,"span",17),m(5),l()()),i&2){let e=o.$implicit,t=C(3);c(2),x("title",e.path),c(),L(e.path),c(2),L(t.formatBytes(e.size))}}function lx(i,o){if(i&1){let e=De();s(0,"div",35),de(1,sx,6,3,"div",13,$C),l(),s(3,"div",36)(4,"button",37),E("click",function(){le(e);let n=C(2);return ce(n.cleanupOrphans())}),m(5),l()()}if(i&2){let e=C(2);c(),me(e.orphans()),c(3),x("disabled",e.cleaning()),c(),he(" ",e.cleaning()?"Cleaning\u2026":"Cleanup ("+e.formatBytes(e.totalOrphanBytes())+")"," ")}}function cx(i,o){if(i&1&&(s(0,"div",7),m(1,"Downloaded models"),l(),S(2,KC,2,0,"div",8)(3,YC,2,0,"div",9)(4,ZC,3,0,"div",10),s(5,"div",7),m(6,"Downloading"),l(),S(7,QC,2,0,"div",9)(8,nx,3,0,"div",11),s(9,"div",7),m(10," Orphaned blobs "),S(11,ox,2,2,"span",12),l(),S(12,ax,2,0,"div",8)(13,rx,2,0,"div",9)(14,lx,6,2)),i&2){let e=C();c(2),k(e.modelsLoading()?2:e.staticModels().length===0?3:4),c(5),k(e.downloads().length===0?7:8),c(4),k(!e.orphansLoading()&&e.orphans().length>0?11:-1),c(),k(e.orphansLoading()?12:e.orphans().length===0?13:14)}}var dx=2e3,Fp=(()=>{class i{constructor(){this.hfService=d(Vs),this.dialogRef=d(ut),this.downloads=A([]),this.models=A([]),this.loading=A(!0),this.modelsLoading=A(!0),this.error=A(null),this.deleting=A(null),this.staticModels=U(()=>{let e=new Set(this.downloads().map(t=>t.dest));return this.models().filter(t=>!e.has(t.dir))}),this.orphans=A([]),this.orphansLoading=A(!0),this.cleaning=A(!1),this.totalOrphanBytes=U(()=>this.orphans().reduce((e,t)=>e+t.size,0)),this.timer=null,this.busy=!1}ngOnInit(){this.refresh(),this.refreshModels(),this.refreshOrphans(),this.timer=setInterval(()=>{this.refresh()},dx)}ngOnDestroy(){this.timer&&clearInterval(this.timer)}refresh(){return J(this,null,function*(){try{this.downloads.set(yield this.hfService.getDownloads()),this.error.set(null)}catch(e){this.error.set(this.errorText(e,"Failed to load downloads"))}finally{this.loading.set(!1)}})}refreshModels(){return J(this,null,function*(){try{this.models.set(yield this.hfService.getLocalModels())}catch(e){this.error.set(this.errorText(e,"Failed to load models"))}finally{this.modelsLoading.set(!1)}})}refreshOrphans(){return J(this,null,function*(){try{this.orphans.set(yield this.hfService.getOrphanBlobs())}catch(e){this.error.set(this.errorText(e,"Failed to load orphaned blobs"))}finally{this.orphansLoading.set(!1)}})}errorText(e,t){return e instanceof Wt?e.error?.error??e.message:e instanceof Error?e.message:t}pause(e){return J(this,null,function*(){yield this.act("pause",e)})}resume(e){return J(this,null,function*(){yield this.act("resume",e)})}cancel(e){return J(this,null,function*(){confirm(`Cancel download of ${e.repoId}? Partial files will be kept for resume.`)&&(yield this.act("cancel",e))})}deleteModel(e){return J(this,null,function*(){if(!this.deleting()&&confirm(`Delete model ${e.name} (${this.formatBytes(e.size)}) from the Hugging Face cache?`)){this.deleting.set(e.name);try{yield this.hfService.deleteLocalModel(e.name),yield this.refreshModels(),yield this.refreshOrphans()}catch(t){this.error.set(this.errorText(t,`Failed to delete ${e.name}`))}finally{this.deleting.set(null)}}})}cleanupOrphans(){return J(this,null,function*(){if(this.cleaning())return;let e=this.orphans().length;if(confirm(`Delete ${e} orphaned blob file(s) (${this.formatBytes(this.totalOrphanBytes())})?`)){this.cleaning.set(!0);try{yield this.hfService.cleanupOrphanBlobs(),yield this.refreshOrphans()}catch(t){this.error.set(this.errorText(t,"Failed to clean up orphaned blobs"))}finally{this.cleaning.set(!1)}}})}act(e,t){return J(this,null,function*(){if(!this.busy){this.busy=!0;try{yield this.hfService.action(e,t),yield this.refresh()}catch(n){this.error.set(this.errorText(n,`Failed to ${e} download`))}finally{this.busy=!1}}})}percent(e){return e.totalBytes<=0?null:Math.min(100,e.doneBytes/e.totalBytes*100)}progressMode(e){return e.totalBytes>0?"determinate":"indeterminate"}formatBytes(e){if(e<=0)return"0 B";let t=e/1024**3;return t>=1?`${t.toFixed(1)} GB`:`${(e/1024**2).toFixed(0)} MB`}formatSpeed(e){return e<=0?"\u2014":`${(e/(1024*1024)).toFixed(1)} MB/s`}formatEta(e){if(e===null)return"\u2014";if(e<60)return`${e} s`;let t=Math.floor(e/3600),n=Math.round(e%3600/60);return t>0?`${t} h ${n} m`:`${n} m`}close(){this.dialogRef.close()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-llm-models-dialog"]],decls:16,vars:2,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"error"],[1,"section-title"],[1,"state"],["align","end"],["mat-raised-button","","color","primary",3,"click"],[1,"subsection-title"],[1,"state","small"],[1,"empty"],[1,"model-list"],[1,"download-list"],[1,"orphan-total"],[1,"model-row"],[1,"row-main"],[1,"repo"],[1,"row-dest",3,"title"],[1,"size"],["mat-icon-button","","color","warn","title","Delete model",3,"click","disabled"],[1,"download-row"],[1,"row-title"],[1,"status-chip"],[1,"pids"],[3,"mode","value"],[1,"row-meta"],[1,"progress-text"],[1,"files"],[1,"speed"],[1,"eta"],[1,"row-actions"],["mat-icon-button","","color","primary","title","Resume"],["mat-icon-button","","title","Pause"],["mat-icon-button","","color","warn","title","Cancel",3,"click"],["mat-icon-button","","color","primary","title","Resume",3,"click"],["mat-icon-button","","title","Pause",3,"click"],[1,"model-list","orphan-list"],[1,"orphan-actions"],["mat-raised-button","","color","warn",3,"click","disabled"]],template:function(t,n){if(t&1&&(s(0,"div",0)(1,"h2",1)(2,"mat-icon"),m(3,"model_training"),l(),m(4," LLM Models "),l(),s(5,"mat-dialog-content"),S(6,WC,2,1,"div",2),s(7,"h3",3)(8,"mat-icon"),m(9,"cloud"),l(),m(10," HuggingFace "),l(),S(11,qC,2,0,"div",4)(12,cx,15,4),l(),s(13,"mat-dialog-actions",5)(14,"button",6),E("click",function(){return n.close()}),m(15,"Close"),l()()()),t&2){let a;c(6),k((a=n.error())?6:-1,a),c(5),k(n.loading()?11:12)}},dependencies:[Pe,Ke,Xe,vi,bt,Bt,jt,zt,ni,Ii,vt,_t],styles:['@charset "UTF-8";.dialog-container[_ngcontent-%COMP%]{min-width:480px}mat-dialog-content[_ngcontent-%COMP%]{max-height:72vh;overflow-y:auto}.error[_ngcontent-%COMP%]{margin:0 0 12px;padding:8px 12px;border-radius:6px;background:#f443361a;color:#d32f2f;font-size:13px}.section-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:4px 0 12px;font-size:15px;font-weight:500;color:#333}.section-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:#666}.subsection-title[_ngcontent-%COMP%]{margin:16px 0 8px;font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.6px;color:#666}.subsection-title[_ngcontent-%COMP%]:first-of-type{margin-top:0}.orphan-total[_ngcontent-%COMP%]{text-transform:none;letter-spacing:0;font-weight:400;color:#999}.orphan-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;margin-top:8px}.state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:8px;padding:40px 0;color:#999;font-size:14px}.state.small[_ngcontent-%COMP%]{padding:16px 0}.state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.empty[_ngcontent-%COMP%]{padding:8px 4px;color:#999;font-size:13px}.model-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px}.model-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;border:1px solid #e0e0e0;background:#fafafa}.model-row[_ngcontent-%COMP%] .row-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.model-row[_ngcontent-%COMP%] .repo[_ngcontent-%COMP%]{font-weight:500;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.model-row[_ngcontent-%COMP%] .row-dest[_ngcontent-%COMP%]{font-family:monospace;font-size:11px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.model-row[_ngcontent-%COMP%] .size[_ngcontent-%COMP%]{flex-shrink:0;font-size:13px;color:#666}.download-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px}.download-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px;border-radius:8px;border:1px solid #e0e0e0;background:#fafafa}.download-row[_ngcontent-%COMP%] .row-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%] .repo[_ngcontent-%COMP%]{font-weight:500;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.download-row[_ngcontent-%COMP%] .row-title[_ngcontent-%COMP%] .pids[_ngcontent-%COMP%]{font-size:11px;color:#999}.download-row[_ngcontent-%COMP%] .status-chip[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase;letter-spacing:.4px;padding:2px 8px;border-radius:10px;background:#e8f5e9;color:#2e7d32}.download-row[_ngcontent-%COMP%] .status-chip.paused[_ngcontent-%COMP%]{background:#fff3e0;color:#e65100}.download-row[_ngcontent-%COMP%] .row-dest[_ngcontent-%COMP%]{font-family:monospace;font-size:11px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.download-row[_ngcontent-%COMP%] mat-progress-bar[_ngcontent-%COMP%]{margin:4px 0}.download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%]{display:flex;gap:16px;font-size:12px;color:#333}.download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .files[_ngcontent-%COMP%], .download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .speed[_ngcontent-%COMP%], .download-row[_ngcontent-%COMP%] .row-meta[_ngcontent-%COMP%] .eta[_ngcontent-%COMP%]{color:#666}.download-row[_ngcontent-%COMP%] .row-actions[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}']})}}return i})();function mx(i,o){if(i&1){let e=De();s(0,"button",14),E("click",function(){le(e);let n=C();return ce(n.openLlmModels())}),s(1,"mat-icon"),m(2,"model_training"),l(),s(3,"span"),m(4,"LLM Models"),l()()}}var Np=(()=>{class i{constructor(){this.systemInfo=ro.required(),this.systemService=d(Ls),this.hfService=d(Vs),this.dialog=d(Io),this.layoutService=d(rs),this.layout=U(()=>this.layoutService.layout()),this.hfInstalled=A(!1)}ngOnInit(){this.hfService.getStatus().then(e=>this.hfInstalled.set(e.installed)).catch(()=>this.hfInstalled.set(!1))}setLayout(e){this.layoutService.setLayout(e)}openSystemInfo(){this.dialog.open(Pp,{disableClose:!1})}openLlmModels(){this.dialog.open(Fp,{width:"760px",maxWidth:"95vw",disableClose:!1})}reboot(){return J(this,null,function*(){confirm("Reboot the server?")&&(yield this.systemService.reboot())})}shutdown(){return J(this,null,function*(){confirm("Shutdown the server?")&&(yield this.systemService.shutdown())})}formatBytes(e){let t=e/1073741824;return`${Math.ceil(t)} GB`}ceilCpu(e){return Math.ceil(e)}colorForUsage(e){return e<40?"#4caf50":e<75?"#ff9800":"#f44336"}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-system-bar"]],inputs:{systemInfo:[1,"systemInfo"]},decls:61,vars:19,consts:[["menu","matMenu"],[1,"system-bar"],[1,"system-panel"],[1,"panel-body"],[1,"panel-icon"],[1,"panel-content"],[1,"panel-header"],[1,"panel-label"],[1,"panel-value"],[1,"bar-bg"],[1,"bar-fill"],[1,"server-controls"],["mat-icon-button","","color","warn","title","Server actions",3,"matMenuTriggerFor"],["yPosition","below"],["mat-menu-item","",3,"click"],["mat-menu-item",""]],template:function(t,n){if(t&1&&(s(0,"div",1)(1,"mat-card",2)(2,"mat-card-content")(3,"div",3)(4,"mat-icon",4),m(5,"dynamic_feed"),l(),s(6,"div",5)(7,"div",6)(8,"span",7),m(9,"CPU"),l(),s(10,"span",8),m(11),l()(),s(12,"div",9),_(13,"div",10),l()()()()(),s(14,"mat-card",2)(15,"mat-card-content")(16,"div",3)(17,"mat-icon",4),m(18,"memory"),l(),s(19,"div",5)(20,"div",6)(21,"span",7),m(22,"RAM"),l(),s(23,"span",8),m(24),l()(),s(25,"div",9),_(26,"div",10),l()()()()(),s(27,"div",11)(28,"button",12)(29,"mat-icon"),m(30,"more_vert"),l()(),s(31,"mat-menu",13,0)(33,"button",14),E("click",function(){return n.reboot()}),s(34,"mat-icon"),m(35,"restart_alt"),l(),s(36,"span"),m(37,"Reboot server"),l()(),s(38,"button",14),E("click",function(){return n.shutdown()}),s(39,"mat-icon"),m(40,"power_settings_new"),l(),s(41,"span"),m(42,"Shutdown server"),l()(),_(43,"mat-divider"),s(44,"button",14),E("click",function(){return n.setLayout("vertical")}),s(45,"mat-icon"),m(46),l(),s(47,"span"),m(48,"Layout: vertical"),l()(),s(49,"button",14),E("click",function(){return n.setLayout("horizontal")}),s(50,"mat-icon"),m(51),l(),s(52,"span"),m(53,"Layout: horizontal"),l()(),_(54,"mat-divider"),s(55,"button",14),E("click",function(){return n.openSystemInfo()}),s(56,"mat-icon"),m(57,"info"),l(),s(58,"span"),m(59,"System info"),l()(),S(60,mx,5,0,"button",15),l()()()),t&2){let a=Le(32);c(10),Ve("color",n.colorForUsage(n.systemInfo().cpuUsage)),c(),he(" ",n.ceilCpu(n.systemInfo().cpuUsage),"% "),c(2),Ve("width",n.systemInfo().cpuUsage,"%")("background",n.colorForUsage(n.systemInfo().cpuUsage)),c(10),Ve("color",n.colorForUsage(n.systemInfo().memoryPercent)),c(),fi(" ",n.formatBytes(n.systemInfo().memoryUsed)," / ",n.formatBytes(n.systemInfo().memoryTotal)," "),c(2),Ve("width",n.systemInfo().memoryPercent,"%")("background",n.colorForUsage(n.systemInfo().memoryPercent)),c(2),x("matMenuTriggerFor",a),c(18),L(n.layout()==="vertical"?"check":"radio_button_unchecked"),c(5),L(n.layout()==="horizontal"?"check":"radio_button_unchecked"),c(9),k(n.hfInstalled()?60:-1)}},dependencies:[Pe,rn,on,an,vt,_t,Ke,vi,Ss,wn,Kn,Ds,No,Ua,bt],styles:[".system-bar[_ngcontent-%COMP%]{display:flex;gap:16px;margin-bottom:16px;align-items:stretch}.system-panel[_ngcontent-%COMP%]{flex:1}.server-controls[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.panel-body[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.panel-icon[_ngcontent-%COMP%]{color:#757575;font-size:24px;width:24px;height:24px}.panel-content[_ngcontent-%COMP%]{flex:1;min-width:0}.panel-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px}.panel-label[_ngcontent-%COMP%]{font-weight:500;font-size:.85rem;color:#555;text-transform:uppercase;letter-spacing:.5px}.panel-value[_ngcontent-%COMP%]{font-weight:500;font-size:.9rem;white-space:nowrap}.bar-bg[_ngcontent-%COMP%]{height:6px;background:#e0e0e0;border-radius:3px;overflow:hidden}.bar-fill[_ngcontent-%COMP%]{height:100%;border-radius:3px;transition:width .4s ease,background .4s ease}"]})}}return i})();function ux(i,o){if(i&1&&(s(0,"div",8)(1,"mat-icon",10),m(2,"warning"),l(),m(3),l()),i&2){let e=C(2);c(3),he(" ",e.loginError()," ")}}function hx(i,o){if(i&1){let e=De();s(0,"div",0)(1,"mat-card",1)(2,"mat-card-content")(3,"div",2)(4,"mat-icon",3),m(5,"lock"),l(),s(6,"h2"),m(7,"Authentication Required"),l(),s(8,"p",4),m(9,"Enter your system password to continue"),l()(),s(10,"form",5),E("submit",function(n){return le(e),C().onLogin(),ce(n.preventDefault())}),s(11,"mat-form-field",6)(12,"mat-label"),m(13,"Password"),l(),s(14,"input",7),E("input",function(n){le(e);let a=C();return ce(a.loginPassword.set(n.target.value))}),l()(),S(15,ux,4,1,"div",8),s(16,"button",9),m(17,"Sign In"),l()()()()()}if(i&2){let e=C();c(14),x("value",e.loginPassword()),c(),k(e.loginError()?15:-1)}}function px(i,o){i&1&&_(0,"mat-progress-bar",11)}function fx(i,o){if(i&1&&(s(0,"mat-card",14)(1,"mat-card-content")(2,"mat-icon",15),m(3," error_outline "),l(),s(4,"p"),m(5),l(),s(6,"p",4),m(7,"Make sure the backend is running on port 4242."),l()()()),i&2){let e=C(2);c(5),L(e.error())}}function gx(i,o){i&1&&(s(0,"mat-card",19)(1,"mat-card-content")(2,"p"),m(3,"No GPUs detected."),l(),s(4,"p",4),m(5," Ensure nvidia-smi or rocm-smi is available on this system. "),l()()())}function _x(i,o){if(i&1&&_(0,"app-gpu-table",20),i&2){let e=C(4);x("gpus",e.gpus())}}function vx(i,o){if(i&1){let e=De();s(0,"div",16)(1,"div",17),_(2,"app-system-bar",18),S(3,gx,6,0,"mat-card",19)(4,_x,1,1,"app-gpu-table",20),l(),s(5,"div",21),_(6,"app-services"),l()(),s(7,"div",22),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startJournalWidthDrag(n))}),_(8,"span",23),l(),s(9,"div",24),_(10,"app-journal-panel"),l()}if(i&2){let e=C(3);c(2),x("systemInfo",e.systemInfo()),c(),k(e.hasGpus()?4:3),c(6),Ve("width",e.sidebarWidth(),"px")}}function bx(i,o){i&1&&(s(0,"mat-card",19)(1,"mat-card-content")(2,"p"),m(3,"No GPUs detected."),l(),s(4,"p",4),m(5," Ensure nvidia-smi or rocm-smi is available on this system. "),l()()())}function yx(i,o){if(i&1&&_(0,"app-gpu-table",20),i&2){let e=C(4);x("gpus",e.gpus())}}function Cx(i,o){if(i&1){let e=De();s(0,"div",25)(1,"div",17),_(2,"app-system-bar",18),S(3,bx,6,0,"mat-card",19)(4,yx,1,1,"app-gpu-table",20),l(),s(5,"div",22),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startGpuColDrag(n))}),_(6,"span",23),l(),s(7,"div",21),_(8,"app-services"),l()(),s(9,"div",26),E("mousedown",function(n){le(e);let a=C(3);return ce(a.startJournalHeightDrag(n))}),_(10,"span",23),l(),s(11,"div",27),_(12,"app-journal-panel"),l()}if(i&2){let e=C(3);c(),Ve("width",e.gpuColWidth(),"px"),c(),x("systemInfo",e.systemInfo()),c(),k(e.hasGpus()?4:3),c(8),Ve("height",e.journalHeight(),"px")}}function xx(i,o){if(i&1&&S(0,vx,11,4)(1,Cx,13,6),i&2){let e,t=C(2);k((e=t.layout())==="vertical"?0:e==="horizontal"?1:-1)}}function wx(i,o){if(i&1&&(S(0,px,1,0,"mat-progress-bar",11),s(1,"div",12)(2,"div",13),S(3,fx,8,1,"mat-card",14)(4,xx,2,1),l()()),i&2){let e=C();k(e.loading()?0:-1),c(),p("horizontal",e.layout()==="horizontal")("dragging",e.isDragging()),c(2),k(e.error()?3:4)}}var Lp=100,Vp=1600,Bp=160,zp=800,Dx=320,jp=360,Hp=1400,Sx=560,Up=(()=>{class i{ngOnInit(){this.authService.authState.subscribe(a=>{this.isAuthenticated.set(a),a&&(this.loginError.set(null),this.loginPassword.set(""))});let e=localStorage.getItem("journal-sidebar-width");if(e){let a=parseInt(e,10);a>=Lp&&a<=Vp&&this.sidebarWidth.set(a)}let t=localStorage.getItem("journal-bottom-height");if(t){let a=parseInt(t,10);a>=Bp&&a<=zp&&this.journalHeight.set(a)}let n=localStorage.getItem("gpu-col-width");if(n){let a=parseInt(n,10);a>=jp&&a<=Hp&&this.gpuColWidth.set(a)}}ngOnDestroy(){}onLogin(){return J(this,null,function*(){this.loginError.set(null),(yield this.authService.login(this.loginPassword()))?(this.loading.set(!0),this.initGpus()):this.loginError.set("Invalid password")})}startJournalWidthDrag(e){this.beginDrag("journalWidth",e.clientX,this.sidebarWidth())}startJournalHeightDrag(e){this.beginDrag("journalHeight",e.clientY,this.journalHeight())}startGpuColDrag(e){this.beginDrag("gpuColWidth",e.clientX,this.gpuColWidth())}beginDrag(e,t,n){this.dragTarget=e,this.dragStartCoord=t,this.dragStartValue=n,this.isDragging.set(!0)}onDrag(e){if(!(!this.isDragging()||!this.dragTarget)){if(this.dragTarget==="journalWidth"){let t=this.dragStartCoord-e.clientX;this.sidebarWidth.set(this.clamp(this.dragStartValue+t,Lp,Vp))}else if(this.dragTarget==="journalHeight"){let t=this.dragStartCoord-e.clientY;this.journalHeight.set(this.clamp(this.dragStartValue+t,Bp,zp))}else if(this.dragTarget==="gpuColWidth"){let t=e.clientX-this.dragStartCoord;this.gpuColWidth.set(this.clamp(this.dragStartValue+t,jp,Hp))}}}onDragEnd(){!this.isDragging()||!this.dragTarget||(this.dragTarget==="journalWidth"?localStorage.setItem("journal-sidebar-width",String(this.sidebarWidth())):this.dragTarget==="journalHeight"?localStorage.setItem("journal-bottom-height",String(this.journalHeight())):this.dragTarget==="gpuColWidth"&&localStorage.setItem("gpu-col-width",String(this.gpuColWidth())),this.dragTarget=null,this.isDragging.set(!1))}clamp(e,t,n){return Math.max(t,Math.min(n,e))}constructor(){this.gpuService=d(ch),this.authService=d(Ir),this.layoutService=d(rs),this.gpus=A([]),this.systemInfo=A({cpuUsage:0,memoryTotal:0,memoryUsed:0,memoryPercent:0}),this.loading=A(!0),this.error=A(null),this.hasGpus=U(()=>this.gpus().length>0),this.layout=this.layoutService.layout,this.isAuthenticated=A(this.authService.isAuthenticated()),this.loginPassword=A(""),this.loginError=A(null),this.sidebarWidth=A(420),this.journalHeight=A(Dx),this.gpuColWidth=A(Sx),this.isDragging=A(!1),this.dragTarget=null,this.dragStartCoord=0,this.dragStartValue=0,this.isAuthenticated()&&this.initGpus()}initGpus(e=0){this.gpuService.fetchGpus().subscribe({next:t=>{if(t.length===0){e<3?setTimeout(()=>this.initGpus(e+1),5e3):this.loading.set(!1);return}let n=t.map(a=>Fe(B({},a),{key:a.pciBusId,usage:0,temperature:0,vramUsed:0}));this.gpus.set(n),this.loading.set(!1),this.error.set(null),this.gpuService.watchStatus(3e3).subscribe({next:a=>{this.systemInfo.set(a.system),this.mergeUsage(a.gpus)},error:a=>{console.error("[AppComponent] status poll error:",a)}})},error:t=>{console.error("[AppComponent] static fetch error:",t),this.error.set(`Failed to fetch GPU data: ${t.message}`),this.loading.set(!1)}})}mergeUsage(e){let t=new Map;for(let n of e)t.set(n.key,n);this.gpus.update(n=>n.map(a=>{let r=t.get(a.pciBusId);return Fe(B({},a),{key:a.pciBusId,usage:r?.usage??0,temperature:r?.temperature??0,vramUsed:r?.vramUsed??0})}))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=I({type:i,selectors:[["app-root"]],hostBindings:function(t,n){t&1&&E("mousemove",function(r){return n.onDrag(r)},qs)("mouseup",function(){return n.onDragEnd()},qs)},decls:2,vars:1,consts:[[1,"login-container"],[1,"login-card"],[1,"login-header"],[1,"login-icon"],[1,"mat-body-2",2,"color","#999"],[1,"login-form",3,"submit"],["appearance","outline",1,"full-width"],["matInput","","type","password","autofocus","",3,"input","value"],[1,"login-error"],["mat-raised-button","","color","primary","type","submit",1,"login-btn"],[2,"font-size","20px","vertical-align","middle"],["mode","query","color","primary"],[1,"layout"],[1,"main-content"],[1,"error-card"],[2,"color","#f44336","font-size","48px","float","left","margin-right","16px"],[1,"top-row-vertical"],[1,"gpu-col"],[3,"systemInfo"],[1,"empty-card"],[3,"gpus"],[1,"services-col"],[1,"splitter",3,"mousedown"],[1,"splitter-line"],[1,"journal-sidebar"],[1,"top-row-horizontal"],[1,"splitter","splitter-h",3,"mousedown"],[1,"journal-bottom"]],template:function(t,n){t&1&&S(0,hx,18,2,"div",0)(1,wx,5,6),t&2&&k(n.isAuthenticated()?1:0)},dependencies:[Pe,ni,Ii,rn,on,an,ri,ai,Et,Lt,Tt,Ke,Xe,vt,_t,Ph,Rp,Op,Np],styles:[".spacer[_ngcontent-%COMP%]{flex:1 1 auto}.login-container[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - 56px);padding:24px;background:#f5f5f5}.login-card[_ngcontent-%COMP%]{width:100%;max-width:400px}.login-header[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.login-header[_ngcontent-%COMP%] .login-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;line-height:48px;background:#e3f2fd;border-radius:50%;padding:8px;color:#1976d2}.login-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:16px 0 4px;font-size:22px;font-weight:500}.login-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px}.login-error[_ngcontent-%COMP%]{color:#d32f2f;font-size:14px;text-align:center;padding:8px;background:#ffebee;border-radius:4px}.login-btn[_ngcontent-%COMP%]{width:100%;margin-top:8px}.full-width[_ngcontent-%COMP%]{width:100%}.layout[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.layout.dragging[_ngcontent-%COMP%]{user-select:none;-webkit-user-select:none}.main-content[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:row;padding:24px;max-width:100%}.top-row-vertical[_ngcontent-%COMP%]{flex:1;min-width:0;overflow-y:auto}.gpu-col[_ngcontent-%COMP%], .services-col[_ngcontent-%COMP%]{min-width:0}.splitter[_ngcontent-%COMP%]{width:8px;flex-shrink:0;cursor:col-resize;margin:0 8px;display:flex;align-items:center;justify-content:center;background:transparent;transition:background .15s}.splitter[_ngcontent-%COMP%]:hover{background:#0000000a}.splitter[_ngcontent-%COMP%] .splitter-line[_ngcontent-%COMP%]{width:2px;height:32px;border-radius:1px;background:#bdbdbd;transition:background .15s,width .15s}.splitter[_ngcontent-%COMP%]:hover .splitter-line[_ngcontent-%COMP%]{background:#757575;width:3px}.splitter-h[_ngcontent-%COMP%]{width:100%;height:8px;flex-shrink:0;cursor:row-resize;margin:8px 0;display:flex;align-items:center;justify-content:center;background:transparent;transition:background .15s}.splitter-h[_ngcontent-%COMP%]:hover{background:#0000000a}.splitter-h[_ngcontent-%COMP%] .splitter-line[_ngcontent-%COMP%]{width:32px;height:2px;border-radius:1px;background:#bdbdbd;transition:background .15s,height .15s}.splitter-h[_ngcontent-%COMP%]:hover .splitter-line[_ngcontent-%COMP%]{background:#757575;height:3px}.journal-sidebar[_ngcontent-%COMP%], .journal-bottom[_ngcontent-%COMP%]{flex-shrink:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .main-content[_ngcontent-%COMP%]{flex-direction:column}.layout.horizontal[_ngcontent-%COMP%] .top-row-horizontal[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex:1;min-height:0}.layout.horizontal[_ngcontent-%COMP%] .gpu-col[_ngcontent-%COMP%]{flex-shrink:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .services-col[_ngcontent-%COMP%]{flex:1;min-width:0;overflow-y:auto}.layout.horizontal[_ngcontent-%COMP%] .services-col[_ngcontent-%COMP%] app-services[_ngcontent-%COMP%]{margin-top:0}.error-card[_ngcontent-%COMP%], .empty-card[_ngcontent-%COMP%]{margin-top:32px;max-width:600px;margin-left:auto;margin-right:auto}[_nghost-%COMP%] mat-card-content{padding-top:10px!important;padding-bottom:10px!important}app-services[_ngcontent-%COMP%]{display:block;margin-top:24px}"]})}}return i})();yl(Up,Cm).catch(i=>console.error(i));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiservermanager",
3
- "version": "0.5.18",
3
+ "version": "0.5.19",
4
4
  "description": "GPU server monitoring and AI service manager web dashboard",
5
5
  "main": "backend/dist/index.js",
6
6
  "bin": {