sf-aiembedded 0.3.2 → 0.3.4

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.
@@ -345,10 +345,10 @@ class AgentService {
345
345
  }
346
346
  }
347
347
  }
348
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentService, deps: [{ token: AI_AGENTS }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
349
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentService });
348
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AgentService, deps: [{ token: AI_AGENTS }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
349
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AgentService });
350
350
  }
351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentService, decorators: [{
351
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AgentService, decorators: [{
352
352
  type: Injectable
353
353
  }], ctorParameters: () => [{ type: undefined, decorators: [{
354
354
  type: Inject,
@@ -359,10 +359,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
359
359
  class TextComponent {
360
360
  text = '';
361
361
  role = '';
362
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
363
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: TextComponent, isStandalone: true, selector: "app-text", inputs: { text: "text", role: "role" }, ngImport: i0, template: "<div\r\nclass=\"px-3 py-2 border-round-bottom-xl w-fit\"\r\n[ngClass]=\"role !== 'user' ? 'bg-white border-round-right-xl' : 'border-round-left-xl border-round-right-sm bg-primary text-white'\"\r\n>\r\n<span class=\"text-base m-0 whitespace-normal\" style=\"word-break: break-word;\">{{text}}</span>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }] });
362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
363
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: TextComponent, isStandalone: true, selector: "app-text", inputs: { text: "text", role: "role" }, ngImport: i0, template: "<div\r\nclass=\"px-3 py-2 border-round-bottom-xl w-fit\"\r\n[ngClass]=\"role !== 'user' ? 'bg-white border-round-right-xl' : 'border-round-left-xl border-round-right-sm bg-primary text-white'\"\r\n>\r\n<span class=\"text-base m-0 whitespace-normal\" style=\"word-break: break-word;\">{{text}}</span>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }] });
364
364
  }
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TextComponent, decorators: [{
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: TextComponent, decorators: [{
366
366
  type: Component,
367
367
  args: [{ selector: 'app-text', standalone: true, imports: [CommonModule, FormsModule], template: "<div\r\nclass=\"px-3 py-2 border-round-bottom-xl w-fit\"\r\n[ngClass]=\"role !== 'user' ? 'bg-white border-round-right-xl' : 'border-round-left-xl border-round-right-sm bg-primary text-white'\"\r\n>\r\n<span class=\"text-base m-0 whitespace-normal\" style=\"word-break: break-word;\">{{text}}</span>\r\n</div>" }]
368
368
  }], propDecorators: { text: [{
@@ -420,10 +420,10 @@ class FileComponent {
420
420
  return 'col-12 sm:col-6 md:col-4';
421
421
  }
422
422
  }
423
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
424
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: FileComponent, isStandalone: true, selector: "app-file", inputs: { files: "files", role: "role", remove: "remove" }, ngImport: i0, template: "<div *ngIf=\"!remove\" class=\"grid w-full m-o\" [ngClass]=\"role !== 'user' ? 'items-start justify-content-start' : 'items-end justify-content-end'\">\r\n <div *ngFor=\"let file of files\" [ngClass]=\"getGridClass()\">\r\n <div class=\"flex align-items-center gap-3 border-1 border-gray-300 border-round-2xl p-2 bg-gray-100 h-full\">\r\n <p-avatar class=\"p-1 border-1 avatar-responsive\" [ngClass]=\"getFileClasses(file.name)\" [icon]=\"getFileIcon(file.name)\"></p-avatar>\r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 text-sm md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'Archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"remove\" class=\"grid w-full\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"col-12 sm:col-6 md:col-4\">\r\n <div class=\"relative border-1 border-gray-300 border-round-xl p-2 h-full\">\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" variant=\"text\" severity=\"secondary\" class=\"no-hover absolute top-0 right-0 z-1\" (click)=\"removeSelectedFile(i)\" size=\"small\"/>\r\n <div class=\"flex align-items-center gap-3\">\r\n <p-avatar \r\n class=\"p-1 border-1 avatar-responsive\"\r\n [ngClass]=\"getFileClasses(file.name)\" \r\n [icon]=\"getFileIcon(file.name)\" \r\n >\r\n </p-avatar>\r\n \r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 md:text-base text-sm\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>", styles: [".avatar-responsive{aspect-ratio:1/1;width:2.5rem;height:2.5rem;font-size:2rem;flex-shrink:0}@media (max-width: 768px){.avatar-responsive{width:2rem;height:2rem;font-size:1.5rem}}@media (max-width: 576px){.avatar-responsive{width:1.75rem;height:1.75rem;font-size:1.25rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }] });
423
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
424
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FileComponent, isStandalone: true, selector: "app-file", inputs: { files: "files", role: "role", remove: "remove" }, ngImport: i0, template: "<div *ngIf=\"!remove\" class=\"grid w-full m-o\" [ngClass]=\"role !== 'user' ? 'items-start justify-content-start' : 'items-end justify-content-end'\">\r\n <div *ngFor=\"let file of files\" [ngClass]=\"getGridClass()\">\r\n <div class=\"flex align-items-center gap-3 border-1 border-gray-300 border-round-2xl p-2 bg-gray-100 h-full\">\r\n <p-avatar class=\"p-1 border-1 avatar-responsive\" [ngClass]=\"getFileClasses(file.name)\" [icon]=\"getFileIcon(file.name)\"></p-avatar>\r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 text-sm md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'Archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"remove\" class=\"grid w-full\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"col-12 sm:col-6 md:col-4\">\r\n <div class=\"relative border-1 border-gray-300 border-round-xl p-2 h-full\">\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" variant=\"text\" severity=\"secondary\" class=\"no-hover absolute top-0 right-0 z-1\" (click)=\"removeSelectedFile(i)\" size=\"small\"/>\r\n <div class=\"flex align-items-center gap-3\">\r\n <p-avatar \r\n class=\"p-1 border-1 avatar-responsive\"\r\n [ngClass]=\"getFileClasses(file.name)\" \r\n [icon]=\"getFileIcon(file.name)\" \r\n >\r\n </p-avatar>\r\n \r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 md:text-base text-sm\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>", styles: [".avatar-responsive{aspect-ratio:1/1;width:2.5rem;height:2.5rem;font-size:2rem;flex-shrink:0}@media (max-width: 768px){.avatar-responsive{width:2rem;height:2rem;font-size:1.5rem}}@media (max-width: 576px){.avatar-responsive{width:1.75rem;height:1.75rem;font-size:1.25rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }] });
425
425
  }
426
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FileComponent, decorators: [{
426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FileComponent, decorators: [{
427
427
  type: Component,
428
428
  args: [{ selector: 'app-file', standalone: true, imports: [CommonModule, FormsModule, ButtonModule, Avatar], template: "<div *ngIf=\"!remove\" class=\"grid w-full m-o\" [ngClass]=\"role !== 'user' ? 'items-start justify-content-start' : 'items-end justify-content-end'\">\r\n <div *ngFor=\"let file of files\" [ngClass]=\"getGridClass()\">\r\n <div class=\"flex align-items-center gap-3 border-1 border-gray-300 border-round-2xl p-2 bg-gray-100 h-full\">\r\n <p-avatar class=\"p-1 border-1 avatar-responsive\" [ngClass]=\"getFileClasses(file.name)\" [icon]=\"getFileIcon(file.name)\"></p-avatar>\r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 text-sm md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'Archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"remove\" class=\"grid w-full\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"col-12 sm:col-6 md:col-4\">\r\n <div class=\"relative border-1 border-gray-300 border-round-xl p-2 h-full\">\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" variant=\"text\" severity=\"secondary\" class=\"no-hover absolute top-0 right-0 z-1\" (click)=\"removeSelectedFile(i)\" size=\"small\"/>\r\n <div class=\"flex align-items-center gap-3\">\r\n <p-avatar \r\n class=\"p-1 border-1 avatar-responsive\"\r\n [ngClass]=\"getFileClasses(file.name)\" \r\n [icon]=\"getFileIcon(file.name)\" \r\n >\r\n </p-avatar>\r\n \r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 md:text-base text-sm\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>", styles: [".avatar-responsive{aspect-ratio:1/1;width:2.5rem;height:2.5rem;font-size:2rem;flex-shrink:0}@media (max-width: 768px){.avatar-responsive{width:2rem;height:2rem;font-size:1.5rem}}@media (max-width: 576px){.avatar-responsive{width:1.75rem;height:1.75rem;font-size:1.25rem}}\n"] }]
429
429
  }], propDecorators: { files: [{
@@ -436,10 +436,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
436
436
 
437
437
  class TableComponent {
438
438
  table = "";
439
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
440
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: TableComponent, isStandalone: true, selector: "app-table", inputs: { table: "table" }, ngImport: i0, template: "<div\r\n *ngIf=\"table\"\r\n class=\"mt-2 overflow-auto\"\r\n [innerHTML]=\"table\"\r\n style=\"max-width: 100%; overflow-x: auto;\"\r\n></div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
439
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
440
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: TableComponent, isStandalone: true, selector: "app-table", inputs: { table: "table" }, ngImport: i0, template: "<div\r\n *ngIf=\"table\"\r\n class=\"mt-2 overflow-auto\"\r\n [innerHTML]=\"table\"\r\n style=\"max-width: 100%; overflow-x: auto;\"\r\n></div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
441
441
  }
442
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TableComponent, decorators: [{
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: TableComponent, decorators: [{
443
443
  type: Component,
444
444
  args: [{ selector: 'app-table', imports: [CommonModule], template: "<div\r\n *ngIf=\"table\"\r\n class=\"mt-2 overflow-auto\"\r\n [innerHTML]=\"table\"\r\n style=\"max-width: 100%; overflow-x: auto;\"\r\n></div>" }]
445
445
  }], propDecorators: { table: [{
@@ -481,10 +481,10 @@ class MarkdownComponent {
481
481
  this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(rawHtml);
482
482
  }
483
483
  }
484
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MarkdownComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
485
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: MarkdownComponent, isStandalone: true, selector: "app-markdown", inputs: { content: "content" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"markdown-wrapper\">\r\n <div class=\"markdown-container\" [innerHTML]=\"safeHtml\"></div>\r\n</div>", styles: ["@charset \"UTF-8\";app-markdown{display:block;min-width:0;max-width:100%;flex:1 1 auto}.markdown-wrapper{min-width:0;flex:1;max-width:100%;overflow:visible;width:100%}.markdown-container{font-family:Arial,sans-serif;line-height:1.5;min-width:0;word-wrap:break-word;white-space:normal;overflow-wrap:anywhere;max-width:100%}.markdown-container>*{max-width:100%;min-width:0}.markdown-container .table-wrapper{width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;display:block;margin:1em 0;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent;max-width:100%}.markdown-container .table-wrapper::-webkit-scrollbar{height:6px}.markdown-container .table-wrapper::-webkit-scrollbar-track{background:transparent}.markdown-container .table-wrapper::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container table{width:max-content;min-width:100%;border-collapse:collapse;border-right:none;border-left:none}.markdown-container th{font-weight:600;padding:10px;text-align:left;border-bottom:1px solid var(--p-surface-300);overflow-wrap:anywhere;word-break:break-word}.markdown-container td{padding:10px;border-top:1px solid var(--p-surface-200);vertical-align:top;text-align:left;overflow-wrap:anywhere;word-break:break-word}@media (max-width: 1024px){.markdown-container table{font-size:1rem}}@media (max-width: 768px){.markdown-container table{font-size:.875rem}}.markdown-container tr:hover{background-color:#f1f5f9}.markdown-container a{color:#0366d6;text-decoration:underline;word-break:break-word;overflow-wrap:anywhere;max-width:100%}.markdown-container img{max-width:100%;margin:10px 0;border-radius:6px}.markdown-container pre{background:#f6f8fa;padding:12px;border-radius:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1em 0;max-width:100%;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent}.markdown-container pre::-webkit-scrollbar{height:6px}.markdown-container pre::-webkit-scrollbar-track{background:transparent}.markdown-container pre::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container code{font-family:monospace;word-break:break-word;overflow-wrap:anywhere}.markdown-container :not(pre)>code{background:#f6f8fa;padding:2px 6px;border-radius:4px;font-size:.9em;word-break:break-word;overflow-wrap:anywhere}.markdown-container p,.markdown-container li{font-size:1rem;overflow-wrap:anywhere;word-break:break-word}.markdown-container ul,.markdown-container ol{padding-left:1.5rem;margin:.5rem 0}.markdown-container ul{list-style-type:disc}.markdown-container ol{list-style-type:decimal}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
484
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MarkdownComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
485
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MarkdownComponent, isStandalone: true, selector: "app-markdown", inputs: { content: "content" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"markdown-wrapper\">\r\n <div class=\"markdown-container\" [innerHTML]=\"safeHtml\"></div>\r\n</div>", styles: ["@charset \"UTF-8\";app-markdown{display:block;min-width:0;max-width:100%;flex:1 1 auto}.markdown-wrapper{min-width:0;flex:1;max-width:100%;overflow:visible;width:100%}.markdown-container{font-family:Arial,sans-serif;line-height:1.5;min-width:0;word-wrap:break-word;white-space:normal;overflow-wrap:anywhere;max-width:100%}.markdown-container>*{max-width:100%;min-width:0}.markdown-container .table-wrapper{width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;display:block;margin:1em 0;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent;max-width:100%}.markdown-container .table-wrapper::-webkit-scrollbar{height:6px}.markdown-container .table-wrapper::-webkit-scrollbar-track{background:transparent}.markdown-container .table-wrapper::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container table{width:max-content;min-width:100%;border-collapse:collapse;border-right:none;border-left:none}.markdown-container th{font-weight:600;padding:10px;text-align:left;border-bottom:1px solid var(--p-surface-300);overflow-wrap:anywhere;word-break:break-word}.markdown-container td{padding:10px;border-top:1px solid var(--p-surface-200);vertical-align:top;text-align:left;overflow-wrap:anywhere;word-break:break-word}@media (max-width: 1024px){.markdown-container table{font-size:1rem}}@media (max-width: 768px){.markdown-container table{font-size:.875rem}}.markdown-container tr:hover{background-color:#f1f5f9}.markdown-container a{color:#0366d6;text-decoration:underline;word-break:break-word;overflow-wrap:anywhere;max-width:100%}.markdown-container img{max-width:100%;margin:10px 0;border-radius:6px}.markdown-container pre{background:#f6f8fa;padding:12px;border-radius:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1em 0;max-width:100%;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent}.markdown-container pre::-webkit-scrollbar{height:6px}.markdown-container pre::-webkit-scrollbar-track{background:transparent}.markdown-container pre::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container code{font-family:monospace;word-break:break-word;overflow-wrap:anywhere}.markdown-container :not(pre)>code{background:#f6f8fa;padding:2px 6px;border-radius:4px;font-size:.9em;word-break:break-word;overflow-wrap:anywhere}.markdown-container p,.markdown-container li{font-size:1rem;overflow-wrap:anywhere;word-break:break-word}.markdown-container ul,.markdown-container ol{padding-left:1.5rem;margin:.5rem 0}.markdown-container ul{list-style-type:disc}.markdown-container ol{list-style-type:decimal}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
486
486
  }
487
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MarkdownComponent, decorators: [{
487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MarkdownComponent, decorators: [{
488
488
  type: Component,
489
489
  args: [{ selector: 'app-markdown', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"markdown-wrapper\">\r\n <div class=\"markdown-container\" [innerHTML]=\"safeHtml\"></div>\r\n</div>", styles: ["@charset \"UTF-8\";app-markdown{display:block;min-width:0;max-width:100%;flex:1 1 auto}.markdown-wrapper{min-width:0;flex:1;max-width:100%;overflow:visible;width:100%}.markdown-container{font-family:Arial,sans-serif;line-height:1.5;min-width:0;word-wrap:break-word;white-space:normal;overflow-wrap:anywhere;max-width:100%}.markdown-container>*{max-width:100%;min-width:0}.markdown-container .table-wrapper{width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;display:block;margin:1em 0;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent;max-width:100%}.markdown-container .table-wrapper::-webkit-scrollbar{height:6px}.markdown-container .table-wrapper::-webkit-scrollbar-track{background:transparent}.markdown-container .table-wrapper::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container table{width:max-content;min-width:100%;border-collapse:collapse;border-right:none;border-left:none}.markdown-container th{font-weight:600;padding:10px;text-align:left;border-bottom:1px solid var(--p-surface-300);overflow-wrap:anywhere;word-break:break-word}.markdown-container td{padding:10px;border-top:1px solid var(--p-surface-200);vertical-align:top;text-align:left;overflow-wrap:anywhere;word-break:break-word}@media (max-width: 1024px){.markdown-container table{font-size:1rem}}@media (max-width: 768px){.markdown-container table{font-size:.875rem}}.markdown-container tr:hover{background-color:#f1f5f9}.markdown-container a{color:#0366d6;text-decoration:underline;word-break:break-word;overflow-wrap:anywhere;max-width:100%}.markdown-container img{max-width:100%;margin:10px 0;border-radius:6px}.markdown-container pre{background:#f6f8fa;padding:12px;border-radius:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:1em 0;max-width:100%;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent}.markdown-container pre::-webkit-scrollbar{height:6px}.markdown-container pre::-webkit-scrollbar-track{background:transparent}.markdown-container pre::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:3px}.markdown-container code{font-family:monospace;word-break:break-word;overflow-wrap:anywhere}.markdown-container :not(pre)>code{background:#f6f8fa;padding:2px 6px;border-radius:4px;font-size:.9em;word-break:break-word;overflow-wrap:anywhere}.markdown-container p,.markdown-container li{font-size:1rem;overflow-wrap:anywhere;word-break:break-word}.markdown-container ul,.markdown-container ol{padding-left:1.5rem;margin:.5rem 0}.markdown-container ul{list-style-type:disc}.markdown-container ol{list-style-type:decimal}\n"] }]
490
490
  }], ctorParameters: () => [{ type: i1$1.DomSanitizer }], propDecorators: { content: [{
@@ -492,10 +492,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
492
492
  }] } });
493
493
 
494
494
  class RobotIconComponent {
495
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RobotIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
496
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: RobotIconComponent, isStandalone: true, selector: "lib-robot-icon", host: { styleAttribute: "display: inline-flex; width: 1.5em; height: 1.5em;" }, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" width=\"100%\" height=\"100%\" fill=\"currentColor\">\r\n <path d=\"M440-120v-80h320v-284q0-117-81.5-198.5T480-764q-117 0-198.5 81.5T200-484v244h-40q-33 0-56.5-23.5T80-320v-80q0-21 10.5-39.5T120-469l3-53q8-68 39.5-126t79-101q47.5-43 109-67T480-840q68 0 129 24t109 66.5Q766-707 797-649t40 126l3 52q19 9 29.5 27t10.5 38v92q0 20-10.5 38T840-249v49q0 33-23.5 56.5T760-120H440Zm-80-280q-17 0-28.5-11.5T320-440q0-17 11.5-28.5T360-480q17 0 28.5 11.5T400-440q0 17-11.5 28.5T360-400Zm240 0q-17 0-28.5-11.5T560-440q0-17 11.5-28.5T600-480q17 0 28.5 11.5T640-440q0 17-11.5 28.5T600-400Zm-359-62q-7-106 64-182t177-76q89 0 156.5 56.5T720-519q-91-1-167.5-49T435-698q-16 80-67.5 142.5T241-462Z\"/>\r\n</svg>\r\n", styles: [""] });
495
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RobotIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
496
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: RobotIconComponent, isStandalone: true, selector: "lib-robot-icon", host: { styleAttribute: "display: inline-flex; width: 1.5em; height: 1.5em;" }, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" width=\"100%\" height=\"100%\" fill=\"currentColor\">\r\n <path d=\"M440-120v-80h320v-284q0-117-81.5-198.5T480-764q-117 0-198.5 81.5T200-484v244h-40q-33 0-56.5-23.5T80-320v-80q0-21 10.5-39.5T120-469l3-53q8-68 39.5-126t79-101q47.5-43 109-67T480-840q68 0 129 24t109 66.5Q766-707 797-649t40 126l3 52q19 9 29.5 27t10.5 38v92q0 20-10.5 38T840-249v49q0 33-23.5 56.5T760-120H440Zm-80-280q-17 0-28.5-11.5T320-440q0-17 11.5-28.5T360-480q17 0 28.5 11.5T400-440q0 17-11.5 28.5T360-400Zm240 0q-17 0-28.5-11.5T560-440q0-17 11.5-28.5T600-480q17 0 28.5 11.5T640-440q0 17-11.5 28.5T600-400Zm-359-62q-7-106 64-182t177-76q89 0 156.5 56.5T720-519q-91-1-167.5-49T435-698q-16 80-67.5 142.5T241-462Z\"/>\r\n</svg>\r\n", styles: [""] });
497
497
  }
498
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RobotIconComponent, decorators: [{
498
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: RobotIconComponent, decorators: [{
499
499
  type: Component,
500
500
  args: [{ selector: 'lib-robot-icon', imports: [], host: {
501
501
  style: 'display: inline-flex; width: 1.5em; height: 1.5em;'
@@ -504,10 +504,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
504
504
 
505
505
  class AgentAvatarComponent {
506
506
  size = 'large';
507
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: AgentAvatarComponent, isStandalone: true, selector: "lib-agent-avatar", inputs: { size: "size" }, ngImport: i0, template: "<p-avatar [size]=\"size\" class=\"agent-avatar\" shape=\"circle\">\r\n <lib-robot-icon style=\"color: var(--primary-color)\"></lib-robot-icon>\r\n</p-avatar> \r\n\r\n", styles: [".agent-avatar{--p1: color-mix(in srgb, var(--primary-color) 18%, transparent);flex-shrink:0;background-color:var(--p1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "component", type: RobotIconComponent, selector: "lib-robot-icon" }] });
507
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AgentAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
508
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: AgentAvatarComponent, isStandalone: true, selector: "lib-agent-avatar", inputs: { size: "size" }, ngImport: i0, template: "<p-avatar [size]=\"size\" class=\"agent-avatar\" shape=\"circle\">\r\n <lib-robot-icon style=\"color: var(--primary-color)\"></lib-robot-icon>\r\n</p-avatar> \r\n\r\n", styles: [".agent-avatar{--p1: color-mix(in srgb, var(--primary-color) 18%, transparent);flex-shrink:0;background-color:var(--p1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "component", type: RobotIconComponent, selector: "lib-robot-icon" }] });
509
509
  }
510
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentAvatarComponent, decorators: [{
510
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: AgentAvatarComponent, decorators: [{
511
511
  type: Component,
512
512
  args: [{ selector: 'lib-agent-avatar', imports: [CommonModule, Avatar, RobotIconComponent], template: "<p-avatar [size]=\"size\" class=\"agent-avatar\" shape=\"circle\">\r\n <lib-robot-icon style=\"color: var(--primary-color)\"></lib-robot-icon>\r\n</p-avatar> \r\n\r\n", styles: [".agent-avatar{--p1: color-mix(in srgb, var(--primary-color) 18%, transparent);flex-shrink:0;background-color:var(--p1)}\n"] }]
513
513
  }], propDecorators: { size: [{
@@ -529,10 +529,10 @@ class MessagesComponent {
529
529
  const el = this.chatContainer.nativeElement;
530
530
  el.scrollTo({ top: el.scrollHeight, behavior });
531
531
  }
532
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MessagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
533
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: MessagesComponent, isStandalone: true, selector: "lib-messages", inputs: { messages: "messages", isBotWritting: "isBotWritting", scrollMode: "scrollMode", agentIcon: "agentIcon" }, host: { classAttribute: "block h-full w-full overflow-hidden" }, viewQueries: [{ propertyName: "chatContainer", first: true, predicate: ["chatContainer"], descendants: true }], ngImport: i0, template: "<div class=\"messages-container\" [class.scroll-inline]=\"scrollMode === 'inline'\" #chatContainer>\r\n <div class=\"messages-content\">\r\n <div *ngFor=\"let msg of messages\" class=\"message-item\">\r\n <div class=\"flex w-full\" [ngClass]=\"msg.role !== 'user' ? 'justify-content-start' : 'justify-content-end'\">\r\n <div [ngClass]=\"msg.role !== 'user' ? 'message-bot' : 'message-user'\">\r\n <app-table *ngIf=\"msg.type === 'table'\" [table]=\"msg.content\"></app-table>\r\n <app-file *ngIf=\"msg.type === 'file'\" [files]=\"msg.content\" [role]=\"msg.role\"></app-file>\r\n <app-text *ngIf=\"msg.type === 'text'\" [text]=\"msg.content\" [role]=\"msg.role\"></app-text>\r\n <div [ngClass]=\"msg.role !== 'user' ? 'flex items-start gap-2' : ''\" *ngIf=\"msg.type === 'markdown'\">\r\n <lib-agent-avatar *ngIf=\"msg.role !== 'user'\" size=\"normal\"></lib-agent-avatar>\r\n <app-markdown [content]=\"msg.content\"></app-markdown>\r\n </div>\r\n <div *ngIf=\"msg.type === 'error'\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <p-message severity=\"error\">{{msg.content}}</p-message>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isBotWritting\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <div\r\n class=\"w-fit\">\r\n <span class=\"typing-dots\">\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #bottom></div>\r\n</div>", styles: ["@charset \"UTF-8\";.messages-container{height:100%;width:100%;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent}.messages-container::-webkit-scrollbar{width:8px}.messages-container::-webkit-scrollbar-track{background:transparent}.messages-container::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:4px}.messages-container::-webkit-scrollbar-thumb:hover{background-color:#9ca3afb3}@media (max-width: 768px){.messages-container{scrollbar-width:none;-ms-overflow-style:none}.messages-container::-webkit-scrollbar{display:none}}.messages-container.scroll-inline{max-width:60rem;margin:0 auto}.messages-container.scroll-inline .messages-content{max-width:100%}.messages-content{max-width:60rem;margin:0 auto;padding:1rem;display:flex;flex-direction:column;gap:.75rem}.message-item{width:100%;min-width:0;overflow:visible}.message-item .flex{min-width:0}.message-item .items-start{min-width:0;max-width:100%;overflow:visible}.message-bot{width:100%;max-width:100%;min-width:0;overflow:visible}.message-user{max-width:85%;overflow:visible}.typing-dots{display:inline-flex;align-items:center;gap:4px;padding:4px 0}.typing-dots .dot{width:8px;height:8px;background-color:var(--primary-color);border-radius:50%;animation:typingBounce 1.4s infinite ease-in-out both}.typing-dots .dot:nth-child(1){animation-delay:0s}.typing-dots .dot:nth-child(2){animation-delay:.2s}.typing-dots .dot:nth-child(3){animation-delay:.4s}@keyframes typingBounce{0%,80%,to{transform:scale(.6);opacity:.5}40%{transform:scale(1);opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: TextComponent, selector: "app-text", inputs: ["text", "role"] }, { kind: "component", type: FileComponent, selector: "app-file", inputs: ["files", "role", "remove"] }, { kind: "component", type: TableComponent, selector: "app-table", inputs: ["table"] }, { kind: "component", type: MarkdownComponent, selector: "app-markdown", inputs: ["content"] }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i2$1.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] });
532
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MessagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
533
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MessagesComponent, isStandalone: true, selector: "lib-messages", inputs: { messages: "messages", isBotWritting: "isBotWritting", scrollMode: "scrollMode", agentIcon: "agentIcon" }, host: { classAttribute: "block h-full w-full overflow-hidden" }, viewQueries: [{ propertyName: "chatContainer", first: true, predicate: ["chatContainer"], descendants: true }], ngImport: i0, template: "<div class=\"messages-container\" [class.scroll-inline]=\"scrollMode === 'inline'\" #chatContainer>\r\n <div class=\"messages-content\">\r\n <div *ngFor=\"let msg of messages\" class=\"message-item\">\r\n <div class=\"flex w-full\" [ngClass]=\"msg.role !== 'user' ? 'justify-content-start' : 'justify-content-end'\">\r\n <div [ngClass]=\"msg.role !== 'user' ? 'message-bot' : 'message-user'\">\r\n <app-table *ngIf=\"msg.type === 'table'\" [table]=\"msg.content\"></app-table>\r\n <app-file *ngIf=\"msg.type === 'file'\" [files]=\"msg.content\" [role]=\"msg.role\"></app-file>\r\n <app-text *ngIf=\"msg.type === 'text'\" [text]=\"msg.content\" [role]=\"msg.role\"></app-text>\r\n <div [ngClass]=\"msg.role !== 'user' ? 'flex items-start gap-2' : ''\" *ngIf=\"msg.type === 'markdown'\">\r\n <lib-agent-avatar *ngIf=\"msg.role !== 'user'\" size=\"normal\"></lib-agent-avatar>\r\n <app-markdown [content]=\"msg.content\"></app-markdown>\r\n </div>\r\n <div *ngIf=\"msg.type === 'error'\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <p-message severity=\"error\">{{msg.content}}</p-message>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isBotWritting\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <div\r\n class=\"w-fit\">\r\n <span class=\"typing-dots\">\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #bottom></div>\r\n</div>", styles: ["@charset \"UTF-8\";.messages-container{height:100%;width:100%;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:rgba(156,163,175,.5) transparent}.messages-container::-webkit-scrollbar{width:8px}.messages-container::-webkit-scrollbar-track{background:transparent}.messages-container::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:4px}.messages-container::-webkit-scrollbar-thumb:hover{background-color:#9ca3afb3}@media (max-width: 768px){.messages-container{scrollbar-width:none;-ms-overflow-style:none}.messages-container::-webkit-scrollbar{display:none}}.messages-container.scroll-inline{max-width:60rem;margin:0 auto}.messages-container.scroll-inline .messages-content{max-width:100%}.messages-content{max-width:60rem;margin:0 auto;padding:1rem;display:flex;flex-direction:column;gap:.75rem}.message-item{width:100%;min-width:0;overflow:visible}.message-item .flex{min-width:0}.message-item .items-start{min-width:0;max-width:100%;overflow:visible}.message-bot{width:100%;max-width:100%;min-width:0;overflow:visible}.message-user{max-width:85%;overflow:visible}.typing-dots{display:inline-flex;align-items:center;gap:4px;padding:4px 0}.typing-dots .dot{width:8px;height:8px;background-color:var(--primary-color);border-radius:50%;animation:typingBounce 1.4s infinite ease-in-out both}.typing-dots .dot:nth-child(1){animation-delay:0s}.typing-dots .dot:nth-child(2){animation-delay:.2s}.typing-dots .dot:nth-child(3){animation-delay:.4s}@keyframes typingBounce{0%,80%,to{transform:scale(.6);opacity:.5}40%{transform:scale(1);opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: TextComponent, selector: "app-text", inputs: ["text", "role"] }, { kind: "component", type: FileComponent, selector: "app-file", inputs: ["files", "role", "remove"] }, { kind: "component", type: TableComponent, selector: "app-table", inputs: ["table"] }, { kind: "component", type: MarkdownComponent, selector: "app-markdown", inputs: ["content"] }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: i2$1.Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }] });
534
534
  }
535
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MessagesComponent, decorators: [{
535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MessagesComponent, decorators: [{
536
536
  type: Component,
537
537
  args: [{ selector: 'lib-messages', imports: [CommonModule, FormsModule, ButtonModule, TextComponent, FileComponent, TableComponent, MarkdownComponent, AgentAvatarComponent, MessageModule], host: {
538
538
  'class': 'block h-full w-full overflow-hidden'
@@ -582,10 +582,10 @@ class InputComponent {
582
582
  this.sendInput.emit(trimmedInput);
583
583
  this.userInput = '';
584
584
  }
585
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: InputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
586
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: InputComponent, isStandalone: true, selector: "lib-input", inputs: { files: "files", isRecording: "isRecording", isLoading: "isLoading", isBotWritting: "isBotWritting", header: "header", mode: "mode" }, outputs: { sendInput: "sendInput", startRecording: "startRecording", stopRecording: "stopRecording", uploadFile: "uploadFile" }, host: { properties: { "class.inputModeDefault": "mode === \"default\"", "class.inputModeBubble": "mode === \"bubble\"" }, classAttribute: "block w-full" }, ngImport: i0, template: "<div class=\"input-wrapper input-default surface-overlay\">\r\n <app-file [files]=\"files || []\" role=\"assitant\" [remove]=\"true\" />\r\n <form (ngSubmit)=\"send()\" class=\"w-full flex flex-column gap-2\">\r\n <textarea pTextarea id=\"input\" name=\"userInput\" [(ngModel)]=\"userInput\"\r\n class=\"custom-input w-full text-base\" style=\"max-height: 200px\"\r\n [placeholder]=\"header?.placeholder || ''\" rows=\"1\" [autoResize]=\"true\"\r\n (keydown)=\"handleKeyDown($event)\"></textarea>\r\n <div class=\"flex align-items-center justify-content-between w-full\">\r\n\r\n <p-button icon=\"pi pi-paperclip\" [text]=\"true\" (click)=\"fileInputChat.click()\"\r\n [rounded]=\"true\" />\r\n <input type=\"file\" #fileInputChat multiple (change)=\"uploadFile.emit($event)\" style=\"display: none;\">\r\n\r\n <div class=\"flex align-items-center justify-content-end w-full gap-2\">\r\n <p-button *ngIf=\"!isRecording\" icon=\"pi pi-microphone\" [text]=\"true\" (click)=\"startRecording.emit()\"\r\n [rounded]=\"true\" />\r\n <p-button *ngIf=\"isRecording\" icon=\"pi pi-stop\" [text]=\"true\" (click)=\"stopRecording.emit()\"\r\n severity=\"danger\" [rounded]=\"true\" />\r\n <p-button icon=\"pi pi-send\" [rounded]=\"true\" type=\"submit\"\r\n [disabled]=\"isLoading || isBotWritting || (!userInput.trim() && (!files || files.length === 0))\" />\r\n </div>\r\n </div>\r\n </form>\r\n</div>", styles: [".input-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:.5rem;width:100%}:host.inputModeDefault .input-default{border:1px solid var(--p-surface-400);border-radius:1.5rem}:host.inputModeBubble .input-default{border:none;border-radius:0;padding:.75rem 1rem}.custom-input{border:none!important;box-shadow:none!important;background:transparent!important}.custom-input:focus{outline:none!important;box-shadow:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "component", type: FileComponent, selector: "app-file", inputs: ["files", "role", "remove"] }] });
585
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: InputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
586
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: InputComponent, isStandalone: true, selector: "lib-input", inputs: { files: "files", isRecording: "isRecording", isLoading: "isLoading", isBotWritting: "isBotWritting", header: "header", mode: "mode" }, outputs: { sendInput: "sendInput", startRecording: "startRecording", stopRecording: "stopRecording", uploadFile: "uploadFile" }, host: { properties: { "class.inputModeDefault": "mode === \"default\"", "class.inputModeBubble": "mode === \"bubble\"" }, classAttribute: "block w-full" }, ngImport: i0, template: "<div class=\"input-wrapper input-default surface-overlay\">\r\n <app-file [files]=\"files || []\" role=\"assitant\" [remove]=\"true\" />\r\n <form (ngSubmit)=\"send()\" class=\"w-full flex flex-column gap-2\">\r\n <textarea pTextarea id=\"input\" name=\"userInput\" [(ngModel)]=\"userInput\"\r\n class=\"custom-input w-full text-base\" style=\"max-height: 200px\"\r\n [placeholder]=\"header?.placeholder || ''\" rows=\"1\" [autoResize]=\"true\"\r\n (keydown)=\"handleKeyDown($event)\"></textarea>\r\n <div class=\"flex align-items-center justify-content-between w-full\">\r\n\r\n <p-button icon=\"pi pi-paperclip\" [text]=\"true\" (click)=\"fileInputChat.click()\"\r\n [rounded]=\"true\" />\r\n <input type=\"file\" #fileInputChat multiple (change)=\"uploadFile.emit($event)\" style=\"display: none;\">\r\n\r\n <div class=\"flex align-items-center justify-content-end w-full gap-2\">\r\n <p-button *ngIf=\"!isRecording\" icon=\"pi pi-microphone\" [text]=\"true\" (click)=\"startRecording.emit()\"\r\n [rounded]=\"true\" />\r\n <p-button *ngIf=\"isRecording\" icon=\"pi pi-stop\" [text]=\"true\" (click)=\"stopRecording.emit()\"\r\n severity=\"danger\" [rounded]=\"true\" />\r\n <p-button icon=\"pi pi-send\" [rounded]=\"true\" type=\"submit\"\r\n [disabled]=\"isLoading || isBotWritting || (!userInput.trim() && (!files || files.length === 0))\" />\r\n </div>\r\n </div>\r\n </form>\r\n</div>", styles: [".input-wrapper{display:flex;flex-direction:column;gap:.5rem;padding:.5rem;width:100%}:host.inputModeDefault .input-default{border:1px solid var(--p-surface-400);border-radius:1.5rem}:host.inputModeBubble .input-default{border:none;border-radius:0;padding:.75rem 1rem}.custom-input{border:none!important;box-shadow:none!important;background:transparent!important}.custom-input:focus{outline:none!important;box-shadow:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "component", type: FileComponent, selector: "app-file", inputs: ["files", "role", "remove"] }] });
587
587
  }
588
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: InputComponent, decorators: [{
588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: InputComponent, decorators: [{
589
589
  type: Component,
590
590
  args: [{ selector: 'lib-input', imports: [CommonModule, FormsModule, ButtonModule, Textarea, ChipModule, FileComponent], host: {
591
591
  'class': 'block w-full',
@@ -645,10 +645,10 @@ class GeneralAgentComponent {
645
645
  this.agentService.idKatios = this.idKatios;
646
646
  await this.agentService.loadAgent();
647
647
  }
648
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: GeneralAgentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
649
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: GeneralAgentComponent, isStandalone: true, selector: "app-general-agent", inputs: { agentId: "agentId", idKatios: "idKatios", scrollMode: "scrollMode" }, host: { classAttribute: "block w-full h-full" }, providers: [AgentService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\r\n <!-- Vista inicial (bienvenida) -->\r\n <div *ngIf=\"agentService.isInitial\" class=\"custom-chat flex flex-column items-center justify-content-center w-full\">\r\n <div class=\"flex flex-column items-center justify-content-center gap-4 p-3 mb-3 text-center md:p-1\">\r\n <h2 *ngIf=\"!vm.loading\" class=\"text-3xl font-semibold text-gray-900 lg:text-4xl\">{{vm.header?.title ||\r\n 'Agente'}}</h2>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"25rem\" height=\"2rem\" borderRadius=\"16px\"></p-skeleton>\r\n <div\r\n class=\"flex items-start justify-content-center gap-2\">\r\n <lib-agent-avatar [size]=\"'large'\"></lib-agent-avatar>\r\n <div *ngIf=\"vm.header?.initialMessages && !vm.loading\" class=\"flex flex-column items-start\">\r\n <div *ngFor=\"let msg of vm.header?.initialMessages\" class=\"text-left\">\r\n <span class=\"m-0 text-gray-700 text-base lg:text-lg\">{{msg}}</span>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-column gap-2\">\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"5rem\" borderRadius=\"16px\"></p-skeleton>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"15rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!vm.loading\" class=\"text-base text-gray-500\">{{vm.header?.subtitle}}</p>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"17rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n <!-- Input centrado para vista inicial -->\r\n <div class=\"flex flex-column items-center justify-content-center custom-size w-full pt-1 pb-1\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat (con mensajes) -->\r\n <div *ngIf=\"!agentService.isInitial\" class=\"custom-chat chat-layout flex flex-column w-full\">\r\n <!-- \u00C1rea de mensajes con scroll -->\r\n <div class=\"messages-area flex-1 overflow-hidden\">\r\n <lib-messages [messages]=\"vm.messages || []\" [isBotWritting]=\"vm.bot || false\" [scrollMode]=\"scrollMode\"></lib-messages>\r\n </div>\r\n <!-- Input fijo abajo -->\r\n <div class=\"input-area flex flex-column items-center w-full py-2 px-2 md:px-0\">\r\n <div class=\"custom-size w-full\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1 text-center\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".custom-chat{height:100%;width:100%}.chat-layout{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.messages-area{flex:1 1 auto;min-height:0;overflow:hidden}.input-area{flex:0 0 auto;z-index:10}.custom-size{width:100%;max-width:60rem;padding:0 1rem;margin:0 auto}.welcome-agent{--p1: color-mix(in srgb, var(--primary-color) 8%, transparent);background-color:var(--p1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: ChipModule }, { kind: "component", type: MessagesComponent, selector: "lib-messages", inputs: ["messages", "isBotWritting", "scrollMode", "agentIcon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: InputComponent, selector: "lib-input", inputs: ["files", "isRecording", "isLoading", "isBotWritting", "header", "mode"], outputs: ["sendInput", "startRecording", "stopRecording", "uploadFile"] }] });
648
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: GeneralAgentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
649
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: GeneralAgentComponent, isStandalone: true, selector: "app-general-agent", inputs: { agentId: "agentId", idKatios: "idKatios", scrollMode: "scrollMode" }, host: { classAttribute: "block w-full h-full" }, providers: [AgentService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\r\n <!-- Vista inicial (bienvenida) -->\r\n <div *ngIf=\"agentService.isInitial\" class=\"custom-chat flex flex-column items-center justify-content-center w-full\">\r\n <div class=\"flex flex-column items-center justify-content-center gap-4 p-3 mb-3 text-center md:p-1\">\r\n <h2 *ngIf=\"!vm.loading\" class=\"text-3xl font-semibold text-gray-900 lg:text-4xl\">{{vm.header?.title ||\r\n 'Agente'}}</h2>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"25rem\" height=\"2rem\" borderRadius=\"16px\"></p-skeleton>\r\n <div\r\n class=\"flex items-start justify-content-center gap-2\">\r\n <lib-agent-avatar [size]=\"'large'\"></lib-agent-avatar>\r\n <div *ngIf=\"vm.header?.initialMessages && !vm.loading\" class=\"flex flex-column items-start\">\r\n <div *ngFor=\"let msg of vm.header?.initialMessages\" class=\"text-left\">\r\n <span class=\"m-0 text-gray-700 text-base lg:text-lg\">{{msg}}</span>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-column gap-2\">\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"5rem\" borderRadius=\"16px\"></p-skeleton>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"15rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!vm.loading\" class=\"text-base text-gray-500\">{{vm.header?.subtitle}}</p>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"17rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n <!-- Input centrado para vista inicial -->\r\n <div class=\"flex flex-column items-center justify-content-center custom-size w-full pt-1 pb-1\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat (con mensajes) -->\r\n <div *ngIf=\"!agentService.isInitial\" class=\"custom-chat chat-layout flex flex-column w-full\">\r\n <!-- \u00C1rea de mensajes con scroll -->\r\n <div class=\"messages-area flex-1 overflow-hidden\">\r\n <lib-messages [messages]=\"vm.messages || []\" [isBotWritting]=\"vm.bot || false\" [scrollMode]=\"scrollMode\"></lib-messages>\r\n </div>\r\n <!-- Input fijo abajo -->\r\n <div class=\"input-area flex flex-column items-center w-full py-2 px-2 md:px-0\">\r\n <div class=\"custom-size w-full\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1 text-center\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".custom-chat{height:100%;width:100%}.chat-layout{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.messages-area{flex:1 1 auto;min-height:0;overflow:hidden}.input-area{flex:0 0 auto;z-index:10}.custom-size{width:100%;max-width:60rem;padding:0 1rem;margin:0 auto}.welcome-agent{--p1: color-mix(in srgb, var(--primary-color) 8%, transparent);background-color:var(--p1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: ChipModule }, { kind: "component", type: MessagesComponent, selector: "lib-messages", inputs: ["messages", "isBotWritting", "scrollMode", "agentIcon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: InputComponent, selector: "lib-input", inputs: ["files", "isRecording", "isLoading", "isBotWritting", "header", "mode"], outputs: ["sendInput", "startRecording", "stopRecording", "uploadFile"] }] });
650
650
  }
651
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: GeneralAgentComponent, decorators: [{
651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: GeneralAgentComponent, decorators: [{
652
652
  type: Component,
653
653
  args: [{ selector: 'app-general-agent', standalone: true, imports: [CommonModule, FormsModule, ButtonModule, AgentAvatarComponent, TagModule, ChipModule, MessagesComponent, Skeleton, InputComponent], providers: [AgentService], host: {
654
654
  'class': 'block w-full h-full'
@@ -701,10 +701,10 @@ class BubbleChatComponent {
701
701
  });
702
702
  this.agentService.addFullMessages(initialMessages);
703
703
  }
704
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
705
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: BubbleChatComponent, isStandalone: true, selector: "lib-bubble-chat", inputs: { agentId: "agentId", idKatios: "idKatios" }, host: { classAttribute: "block w-full h-full" }, providers: [AgentService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\r\n <div class=\"chat-view\">\r\n <div class=\"messages-wrapper\">\r\n <lib-messages [messages]=\"vm.messages\" [isBotWritting]=\"vm.bot || vm.loading\" scrollMode=\"inline\" [agentIcon]=\"vm.header?.avatar || 'pi pi-sparkles'\">\r\n </lib-messages>\r\n </div>\r\n <div class=\"input-wrapper surface-overlay border-top-1 border-surface-200 dark:border-surface-700\">\r\n <lib-input mode=\"bubble\" [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\"\r\n [isBotWritting]=\"vm.bot || vm.loading\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\"\r\n (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\"\r\n (uploadFile)=\"agentService.uploadFile($event)\">\r\n </lib-input>\r\n </div>\r\n </div>\r\n</ng-container>", styles: ["@charset \"UTF-8\";:host{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.chat-view{display:flex;flex-direction:column;height:100%;overflow:hidden}.messages-wrapper{flex:1;overflow:hidden;min-height:0}.chat-view .input-wrapper{flex-shrink:0;padding-bottom:env(safe-area-inset-bottom,0)}@media (max-width: 768px){.chat-view{height:100%;max-height:100%}.input-wrapper{padding:8px;padding-bottom:calc(8px + env(safe-area-inset-bottom,0))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: MessagesComponent, selector: "lib-messages", inputs: ["messages", "isBotWritting", "scrollMode", "agentIcon"] }, { kind: "component", type: InputComponent, selector: "lib-input", inputs: ["files", "isRecording", "isLoading", "isBotWritting", "header", "mode"], outputs: ["sendInput", "startRecording", "stopRecording", "uploadFile"] }] });
704
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BubbleChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
705
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: BubbleChatComponent, isStandalone: true, selector: "lib-bubble-chat", inputs: { agentId: "agentId", idKatios: "idKatios" }, host: { classAttribute: "block w-full h-full" }, providers: [AgentService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"vm$ | async as vm\">\r\n <div class=\"chat-view\">\r\n <div class=\"messages-wrapper\">\r\n <lib-messages [messages]=\"vm.messages\" [isBotWritting]=\"vm.bot || vm.loading\" scrollMode=\"inline\" [agentIcon]=\"vm.header?.avatar || 'pi pi-sparkles'\">\r\n </lib-messages>\r\n </div>\r\n <div class=\"input-wrapper surface-overlay border-top-1 border-surface-200 dark:border-surface-700\">\r\n <lib-input mode=\"bubble\" [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\"\r\n [isBotWritting]=\"vm.bot || vm.loading\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\"\r\n (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\"\r\n (uploadFile)=\"agentService.uploadFile($event)\">\r\n </lib-input>\r\n </div>\r\n </div>\r\n</ng-container>", styles: ["@charset \"UTF-8\";:host{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.chat-view{display:flex;flex-direction:column;height:100%;overflow:hidden}.messages-wrapper{flex:1;overflow:hidden;min-height:0}.chat-view .input-wrapper{flex-shrink:0;padding-bottom:env(safe-area-inset-bottom,0)}@media (max-width: 768px){.chat-view{height:100%;max-height:100%}.input-wrapper{padding:8px;padding-bottom:calc(8px + env(safe-area-inset-bottom,0))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: MessagesComponent, selector: "lib-messages", inputs: ["messages", "isBotWritting", "scrollMode", "agentIcon"] }, { kind: "component", type: InputComponent, selector: "lib-input", inputs: ["files", "isRecording", "isLoading", "isBotWritting", "header", "mode"], outputs: ["sendInput", "startRecording", "stopRecording", "uploadFile"] }] });
706
706
  }
707
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleChatComponent, decorators: [{
707
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BubbleChatComponent, decorators: [{
708
708
  type: Component,
709
709
  args: [{ selector: 'lib-bubble-chat', imports: [CommonModule, MessagesComponent, InputComponent], providers: [AgentService], host: {
710
710
  'class': 'block w-full h-full',
@@ -723,12 +723,25 @@ class BubbleAgentComponent {
723
723
  tdoc = '';
724
724
  // Estado del componente
725
725
  isOpen = false;
726
+ isExpanded = false;
727
+ isMobile = false;
726
728
  selectedAgent = null;
727
729
  agents = [];
728
730
  loading = false;
731
+ mobileQuery = matchMedia('(max-width: 768px)');
732
+ mobileListener = (e) => {
733
+ this.isMobile = e.matches;
734
+ if (this.isMobile)
735
+ this.isExpanded = false;
736
+ };
729
737
  constructor(aiAgentsGatewayService, messageService) {
730
738
  this.aiAgentsGatewayService = aiAgentsGatewayService;
731
739
  this.messageService = messageService;
740
+ this.isMobile = this.mobileQuery.matches;
741
+ this.mobileQuery.addEventListener('change', this.mobileListener);
742
+ }
743
+ ngOnDestroy() {
744
+ this.mobileQuery.removeEventListener('change', this.mobileListener);
732
745
  }
733
746
  ngOnChanges() {
734
747
  if (this.idKatios && this.ndoc && this.tdoc) {
@@ -751,11 +764,14 @@ class BubbleAgentComponent {
751
764
  }
752
765
  toggleChat() {
753
766
  this.isOpen = !this.isOpen;
754
- // Si se cierra, volver a la lista de agentes
755
- // if (!this.isOpen) {
756
- // this.selectedAgent = null;
757
- // this.messages = [];
758
- // }
767
+ if (!this.isOpen) {
768
+ this.isExpanded = false;
769
+ }
770
+ }
771
+ toggleExpand() {
772
+ if (this.isMobile)
773
+ return;
774
+ this.isExpanded = !this.isExpanded;
759
775
  }
760
776
  selectAgent(agent) {
761
777
  this.selectedAgent = agent;
@@ -763,12 +779,12 @@ class BubbleAgentComponent {
763
779
  goBack() {
764
780
  this.selectedAgent = null;
765
781
  }
766
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleAgentComponent, deps: [{ token: AI_AGENTS }, { token: i1$2.MessageService }], target: i0.ɵɵFactoryTarget.Component });
767
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: BubbleAgentComponent, isStandalone: true, selector: "lib-bubble-agent", inputs: { idKatios: "idKatios", ndoc: "ndoc", tdoc: "tdoc" }, usesOnChanges: true, ngImport: i0, template: "<!-- Bot\u00F3n burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <button class=\"close-button\" (click)=\"toggleChat()\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.bubble-button{position:fixed;bottom:24px;right:24px;width:60px;height:60px;border-radius:50%;background:var(--primary-color);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:1000}.bubble-button:hover{transform:scale(1.1);box-shadow:0 6px 25px #96999d}.bubble-button.is-open{transform:rotate(90deg)}.bubble-button i{font-size:1.5rem;color:#fff;transition:transform .3s ease}.chat-panel{position:fixed;bottom:100px;right:24px;width:380px;height:550px;border-radius:16px;box-shadow:0 10px 40px #00000026;display:flex;flex-direction:column;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;z-index:999}.chat-panel.is-open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.chat-header{background:var(--primary-color);color:#fff;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.header-text{display:flex;flex-direction:column}.header-title{margin:0}.header-subtitle{opacity:.9}.back-button,.close-button{background:#fff3;border:none;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s ease}.back-button:hover,.close-button:hover{background:#ffffff4d}.back-button i,.close-button i{color:#fff;font-size:.875rem}.chat-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.agents-list{overflow-y:auto;flex:1}.no-agents{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:2rem;text-align:center}.agents-subtitle{color:var(--p-text-muted-color);font-size:.875rem;margin:0 0 16px;text-align:center}.agent-card{display:flex;align-items:center;gap:12px;padding:12px;cursor:pointer;transition:all .2s ease}.agent-card:last-child{margin-bottom:0}.agent-info{flex:1;min-width:0}.agent-name{margin:0 0 4px}.agent-description{margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;line-clamp:2;-webkit-line-clamp:2}.agent-arrow{color:var(--p-text-muted-color);font-size:.875rem;flex-shrink:0}@media (max-width: 768px){.chat-panel{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;max-height:none;inset:0;border-radius:0;transform:translateY(100%)}.chat-panel.is-open{transform:translateY(0)}.bubble-button{bottom:16px;right:16px;width:56px;height:56px}.bubble-button.is-open{opacity:0;visibility:hidden;transform:scale(0)}.chat-content{flex:1;min-height:0;overflow:hidden}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "component", type: BubbleChatComponent, selector: "lib-bubble-chat", inputs: ["agentId", "idKatios"] }, { kind: "component", type: RobotIconComponent, selector: "lib-robot-icon" }] });
782
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BubbleAgentComponent, deps: [{ token: AI_AGENTS }, { token: i1$2.MessageService }], target: i0.ɵɵFactoryTarget.Component });
783
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: BubbleAgentComponent, isStandalone: true, selector: "lib-bubble-agent", inputs: { idKatios: "idKatios", ndoc: "ndoc", tdoc: "tdoc" }, usesOnChanges: true, ngImport: i0, template: "<!-- Bot\u00F3n burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\" [class.is-expanded]=\"isExpanded\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <div class=\"flex gap-2\">\r\n <button class=\"expand-button\" (click)=\"toggleExpand()\" *ngIf=\"selectedAgent\" title=\"Maximizar/Restaurar\">\r\n <i class=\"pi\" [ngClass]=\"isExpanded ? 'pi-window-minimize' : 'pi-window-maximize'\"></i>\r\n </button>\r\n <button class=\"close-button\" (click)=\"toggleChat()\" title=\"Cerrar\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.bubble-button{position:fixed;bottom:24px;right:24px;width:60px;height:60px;border-radius:50%;background:var(--primary-color);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:1000}.bubble-button:hover{transform:scale(1.1);box-shadow:0 6px 25px #96999d}.bubble-button.is-open{transform:rotate(90deg)}.bubble-button i{font-size:1.5rem;color:#fff;transition:transform .3s ease}.chat-panel{position:fixed;bottom:100px;right:24px;width:380px;height:550px;border-radius:16px;box-shadow:0 10px 40px #00000026;display:flex;flex-direction:column;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;z-index:999}.chat-panel.is-open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.chat-panel.is-expanded{width:100vw;height:100vh;height:100dvh;max-width:none;max-height:none;inset:0;border-radius:0}.chat-header{background:var(--primary-color);color:#fff;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.header-text{display:flex;flex-direction:column}.header-title{margin:0}.header-subtitle{opacity:.9}.back-button,.close-button,.expand-button{background:#fff3;border:none;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s ease}.back-button:hover,.close-button:hover,.expand-button:hover{background:#ffffff4d}.back-button i,.close-button i,.expand-button i{color:#fff;font-size:.875rem}.chat-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.agents-list{overflow-y:auto;flex:1}.no-agents{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:2rem;text-align:center}.agents-subtitle{color:var(--p-text-muted-color);font-size:.875rem;margin:0 0 16px;text-align:center}.agent-card{display:flex;align-items:center;gap:12px;padding:12px;cursor:pointer;transition:all .2s ease}.agent-card:last-child{margin-bottom:0}.agent-info{flex:1;min-width:0}.agent-name{margin:0 0 4px}.agent-description{margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;line-clamp:2;-webkit-line-clamp:2}.agent-arrow{color:var(--p-text-muted-color);font-size:.875rem;flex-shrink:0}@media (max-width: 768px){.chat-panel{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;max-height:none;inset:0;border-radius:0;transform:translateY(100%)}.chat-panel.is-open{transform:translateY(0)}.bubble-button{bottom:16px;right:16px;width:56px;height:56px}.bubble-button.is-open{opacity:0;visibility:hidden;transform:scale(0)}.expand-button{display:none}.chat-panel.is-expanded{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;inset:0;border-radius:0}.chat-content{flex:1;min-height:0;overflow:hidden}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: AgentAvatarComponent, selector: "lib-agent-avatar", inputs: ["size"] }, { kind: "component", type: BubbleChatComponent, selector: "lib-bubble-chat", inputs: ["agentId", "idKatios"] }, { kind: "component", type: RobotIconComponent, selector: "lib-robot-icon" }] });
768
784
  }
769
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleAgentComponent, decorators: [{
785
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: BubbleAgentComponent, decorators: [{
770
786
  type: Component,
771
- args: [{ selector: 'lib-bubble-agent', standalone: true, imports: [CommonModule, ButtonModule, AgentAvatarComponent, BubbleChatComponent, RobotIconComponent], template: "<!-- Bot\u00F3n burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <button class=\"close-button\" (click)=\"toggleChat()\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.bubble-button{position:fixed;bottom:24px;right:24px;width:60px;height:60px;border-radius:50%;background:var(--primary-color);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:1000}.bubble-button:hover{transform:scale(1.1);box-shadow:0 6px 25px #96999d}.bubble-button.is-open{transform:rotate(90deg)}.bubble-button i{font-size:1.5rem;color:#fff;transition:transform .3s ease}.chat-panel{position:fixed;bottom:100px;right:24px;width:380px;height:550px;border-radius:16px;box-shadow:0 10px 40px #00000026;display:flex;flex-direction:column;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;z-index:999}.chat-panel.is-open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.chat-header{background:var(--primary-color);color:#fff;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.header-text{display:flex;flex-direction:column}.header-title{margin:0}.header-subtitle{opacity:.9}.back-button,.close-button{background:#fff3;border:none;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s ease}.back-button:hover,.close-button:hover{background:#ffffff4d}.back-button i,.close-button i{color:#fff;font-size:.875rem}.chat-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.agents-list{overflow-y:auto;flex:1}.no-agents{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:2rem;text-align:center}.agents-subtitle{color:var(--p-text-muted-color);font-size:.875rem;margin:0 0 16px;text-align:center}.agent-card{display:flex;align-items:center;gap:12px;padding:12px;cursor:pointer;transition:all .2s ease}.agent-card:last-child{margin-bottom:0}.agent-info{flex:1;min-width:0}.agent-name{margin:0 0 4px}.agent-description{margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;line-clamp:2;-webkit-line-clamp:2}.agent-arrow{color:var(--p-text-muted-color);font-size:.875rem;flex-shrink:0}@media (max-width: 768px){.chat-panel{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;max-height:none;inset:0;border-radius:0;transform:translateY(100%)}.chat-panel.is-open{transform:translateY(0)}.bubble-button{bottom:16px;right:16px;width:56px;height:56px}.bubble-button.is-open{opacity:0;visibility:hidden;transform:scale(0)}.chat-content{flex:1;min-height:0;overflow:hidden}}\n"] }]
787
+ args: [{ selector: 'lib-bubble-agent', standalone: true, imports: [CommonModule, ButtonModule, AgentAvatarComponent, BubbleChatComponent, RobotIconComponent], template: "<!-- Bot\u00F3n burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\" [class.is-expanded]=\"isExpanded\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <div class=\"flex gap-2\">\r\n <button class=\"expand-button\" (click)=\"toggleExpand()\" *ngIf=\"selectedAgent\" title=\"Maximizar/Restaurar\">\r\n <i class=\"pi\" [ngClass]=\"isExpanded ? 'pi-window-minimize' : 'pi-window-maximize'\"></i>\r\n </button>\r\n <button class=\"close-button\" (click)=\"toggleChat()\" title=\"Cerrar\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block}.bubble-button{position:fixed;bottom:24px;right:24px;width:60px;height:60px;border-radius:50%;background:var(--primary-color);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:1000}.bubble-button:hover{transform:scale(1.1);box-shadow:0 6px 25px #96999d}.bubble-button.is-open{transform:rotate(90deg)}.bubble-button i{font-size:1.5rem;color:#fff;transition:transform .3s ease}.chat-panel{position:fixed;bottom:100px;right:24px;width:380px;height:550px;border-radius:16px;box-shadow:0 10px 40px #00000026;display:flex;flex-direction:column;overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;z-index:999}.chat-panel.is-open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.chat-panel.is-expanded{width:100vw;height:100vh;height:100dvh;max-width:none;max-height:none;inset:0;border-radius:0}.chat-header{background:var(--primary-color);color:#fff;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.header-text{display:flex;flex-direction:column}.header-title{margin:0}.header-subtitle{opacity:.9}.back-button,.close-button,.expand-button{background:#fff3;border:none;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s ease}.back-button:hover,.close-button:hover,.expand-button:hover{background:#ffffff4d}.back-button i,.close-button i,.expand-button i{color:#fff;font-size:.875rem}.chat-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.agents-list{overflow-y:auto;flex:1}.no-agents{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:2rem;text-align:center}.agents-subtitle{color:var(--p-text-muted-color);font-size:.875rem;margin:0 0 16px;text-align:center}.agent-card{display:flex;align-items:center;gap:12px;padding:12px;cursor:pointer;transition:all .2s ease}.agent-card:last-child{margin-bottom:0}.agent-info{flex:1;min-width:0}.agent-name{margin:0 0 4px}.agent-description{margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;line-clamp:2;-webkit-line-clamp:2}.agent-arrow{color:var(--p-text-muted-color);font-size:.875rem;flex-shrink:0}@media (max-width: 768px){.chat-panel{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;max-height:none;inset:0;border-radius:0;transform:translateY(100%)}.chat-panel.is-open{transform:translateY(0)}.bubble-button{bottom:16px;right:16px;width:56px;height:56px}.bubble-button.is-open{opacity:0;visibility:hidden;transform:scale(0)}.expand-button{display:none}.chat-panel.is-expanded{width:100vw;height:100vh;height:-webkit-fill-available;height:100dvh;inset:0;border-radius:0}.chat-content{flex:1;min-height:0;overflow:hidden}}\n"] }]
772
788
  }], ctorParameters: () => [{ type: undefined, decorators: [{
773
789
  type: Inject,
774
790
  args: [AI_AGENTS]
@@ -1 +1 @@
1
- {"version":3,"file":"sf-aiembedded.mjs","sources":["../../../projects/general-agent/src/lib/agents-backend.port.ts","../../../projects/general-agent/src/lib/general-agent/services/agent.service.ts","../../../projects/general-agent/src/lib/general-agent/types/text/text.component.ts","../../../projects/general-agent/src/lib/general-agent/types/text/text.component.html","../../../projects/general-agent/src/lib/general-agent/types/file/file.component.ts","../../../projects/general-agent/src/lib/general-agent/types/file/file.component.html","../../../projects/general-agent/src/lib/general-agent/types/table/table.component.ts","../../../projects/general-agent/src/lib/general-agent/types/table/table.component.html","../../../projects/general-agent/src/lib/general-agent/types/markdown/markdown.component.ts","../../../projects/general-agent/src/lib/general-agent/types/markdown/markdown.component.html","../../../projects/general-agent/src/lib/general-agent/components/robot-icon/robot-icon.component.ts","../../../projects/general-agent/src/lib/general-agent/components/robot-icon/robot-icon.component.html","../../../projects/general-agent/src/lib/general-agent/components/agent-avatar/agent-avatar.component.ts","../../../projects/general-agent/src/lib/general-agent/components/agent-avatar/agent-avatar.component.html","../../../projects/general-agent/src/lib/general-agent/components/messages/messages.component.ts","../../../projects/general-agent/src/lib/general-agent/components/messages/messages.component.html","../../../projects/general-agent/src/lib/general-agent/components/input/input.component.ts","../../../projects/general-agent/src/lib/general-agent/components/input/input.component.html","../../../projects/general-agent/src/lib/general-agent/general-agent.component.ts","../../../projects/general-agent/src/lib/general-agent/general-agent.component.html","../../../projects/general-agent/src/lib/general-agent/components/bubble-chat/bubble-chat.component.ts","../../../projects/general-agent/src/lib/general-agent/components/bubble-chat/bubble-chat.component.html","../../../projects/general-agent/src/lib/general-agent/agents/bubble-chat/bubble-agent.component.ts","../../../projects/general-agent/src/lib/general-agent/agents/bubble-chat/bubble-agent.component.html","../../../projects/general-agent/src/public-api.ts","../../../projects/general-agent/src/sf-aiembedded.ts"],"sourcesContent":["// projects/general-agent/src/lib/agents-backend.port.ts\r\nimport { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface AiAgentsGatewayService {\r\n getAgent(idKatios: string, agentId: string): Promise<any>;\r\n sendMessage(idKatios: string, agentId: string, req: {\r\n conversationId?: string;\r\n text: string;\r\n files: Array<{fileName:string; contentType:string; base64Data:string;}>;\r\n metadata?: any;\r\n }): Promise<{\r\n conversationId: string;\r\n messages: Array<{ role?: string; type?: string; content: any }>;\r\n }>;\r\n transcribeAudio(idKatios: string, audio:File): Promise<string>;\r\n getAgents(idKatios: string, ndoc: string, tdoc: string): Observable<any>;\r\n get metadata(): Record<string, any>;\r\n}\r\n\r\nexport const AI_AGENTS = new InjectionToken<AiAgentsGatewayService>('AI_AGENTS');\r\n","import { ChangeDetectorRef, Inject, Injectable, NgZone } from '@angular/core';\r\nimport { AI_AGENTS, AiAgentsGatewayService } from '../../agents-backend.port';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { ChatMessage, HeaderConfig } from '../models/agent.model';\r\n\r\n@Injectable()\r\nexport class AgentService {\r\n // Propiedades internas (ya no inputs/outputs)\r\n // Propiedades para notificar cambios a los componentes que usan el servicio\r\n private readonly messagesSubject = new BehaviorSubject<ChatMessage[]>([]);\r\n readonly messages$ = this.messagesSubject.asObservable();\r\n private readonly isBotWrittingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isBotWritting$ = this.isBotWrittingSubject.asObservable();\r\n private readonly isRecordingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isRecording$ = this.isRecordingSubject.asObservable();\r\n private readonly isLoadingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isLoading$ = this.isLoadingSubject.asObservable();\r\n private readonly headerConfigSubject = new BehaviorSubject<HeaderConfig | undefined>(undefined);\r\n readonly headerConfig$ = this.headerConfigSubject.asObservable();\r\n private readonly selectedFilesSubject = new BehaviorSubject<File[]>([]);\r\n readonly selectedFiles$ = this.selectedFilesSubject.asObservable();\r\n private mediaRecorder?: MediaRecorder;\r\n private audioChunks: BlobPart[] = [];\r\n private recordingStream?: MediaStream;\r\n _agentInfo: any;\r\n _configuration: any;\r\n _sessionId: string = '';\r\n _agentId = '';\r\n _idKatios = '';\r\n\r\n\r\n constructor(\r\n @Inject(AI_AGENTS) private aiAgentsGatewayService: AiAgentsGatewayService,\r\n private zone: NgZone\r\n ) { }\r\n\r\n get agentId() {\r\n return this._agentId;\r\n }\r\n set agentId(value: string) {\r\n this._agentId = value;\r\n }\r\n\r\n get idKatios() {\r\n return this._idKatios;\r\n }\r\n\r\n set idKatios(value: string) {\r\n this._idKatios = value;\r\n }\r\n\r\n\r\n set agentInfo(value: any) {\r\n this._agentInfo = value;\r\n }\r\n\r\n get agentInfo(): any {\r\n return this._agentInfo;\r\n }\r\n\r\n set selectedFiles(files: File[]) {\r\n this.selectedFilesSubject.next(files);\r\n }\r\n\r\n get selectedFiles(): File[] {\r\n return this.selectedFilesSubject.value;\r\n }\r\n\r\n set sessionId(value: string) {\r\n this._sessionId = value;\r\n }\r\n\r\n get sessionId(): string {\r\n return this._sessionId;\r\n }\r\n\r\n set isRecording(value: boolean) {\r\n this.isRecordingSubject.next(value);\r\n }\r\n\r\n get isRecording(): boolean {\r\n return this.isRecordingSubject.value;\r\n }\r\n\r\n set headerConfig(value: HeaderConfig | undefined) {\r\n this.headerConfigSubject.next(value);\r\n }\r\n\r\n get headerConfig(): HeaderConfig | undefined {\r\n return this.headerConfigSubject.value;\r\n }\r\n\r\n set isLoading(value: boolean) {\r\n this.isLoadingSubject.next(value);\r\n }\r\n\r\n get isLoading(): boolean {\r\n return this.isLoadingSubject.value;\r\n }\r\n\r\n set isBotWritting(isWritting: boolean) {\r\n this.isBotWrittingSubject.next(isWritting);\r\n }\r\n\r\n get isBotWritting(): boolean {\r\n return this.isBotWrittingSubject.value;\r\n }\r\n\r\n addMessage(message: ChatMessage) {\r\n const next = [...this.messagesSubject.value, message];\r\n this.messagesSubject.next(next);\r\n }\r\n\r\n clearMessages() {\r\n this.messagesSubject.next([]);\r\n }\r\n\r\n addFile(file: File) {\r\n const next = [...this.selectedFilesSubject.value, file];\r\n this.selectedFilesSubject.next(next);\r\n }\r\n\r\n addFullMessages(messages: ChatMessage[]) {\r\n const next = [...this.messagesSubject.value, ...messages];\r\n this.messagesSubject.next(next);\r\n }\r\n\r\n\r\n async loadAgent() {\r\n this.isLoading = true;\r\n this.isBotWritting = false;\r\n this.clearMessages();\r\n this.sessionId = \"\";\r\n try {\r\n\r\n const agentInfo = await this.aiAgentsGatewayService.getAgent(this.idKatios, this.agentId) as any;\r\n if (agentInfo.statusCode === 200) {\r\n this.agentInfo = JSON.parse(agentInfo.data.rawConfig);\r\n let configurationAgent = null;\r\n if (this.agentInfo.config?.i18n?.en) {\r\n configurationAgent = this.agentInfo.config?.i18n.en;\r\n }\r\n else {\r\n configurationAgent = this.agentInfo.config?.setUp;\r\n }\r\n\r\n this.headerConfig = {\r\n title: configurationAgent.title,\r\n subtitle: configurationAgent.subtitle,\r\n initialMessages: this.agentInfo.config.initialMessages,\r\n placeholder: configurationAgent.inputPlaceholder,\r\n footer: configurationAgent.footer\r\n };\r\n\r\n this.isLoading = false;\r\n }\r\n } catch (error) {\r\n console.error('An error occurred:', error);\r\n this.isLoading = false;\r\n }\r\n }\r\n\r\n get isInitial(): boolean {\r\n return this.messagesSubject.value.length === 0 && !this.isBotWritting;\r\n }\r\n\r\n /**\r\n * Converts File objects to Attachment format expected by the backend\r\n */\r\n private async convertFilesToAttachments(files: File[]): Promise<any[]> {\r\n if (!files || files.length === 0) {\r\n return [];\r\n }\r\n\r\n const attachments = [];\r\n for (const file of files) {\r\n try {\r\n const base64Data = await this.fileToBase64(file);\r\n const attachment = {\r\n fileName: file.name,\r\n contentType: file.type,\r\n base64Data: base64Data\r\n };\r\n attachments.push(attachment);\r\n } catch (error) {\r\n console.error(`Error converting file ${file.name} to base64:`, error);\r\n }\r\n }\r\n\r\n return attachments;\r\n }\r\n\r\n /**\r\n * Converts a File object to base64 string\r\n */\r\n private fileToBase64(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => {\r\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\r\n const base64String = (reader.result as string).split(',')[1];\r\n resolve(base64String);\r\n };\r\n reader.onerror = error => reject(error);\r\n });\r\n }\r\n\r\n async send(userInput: string) {\r\n console.log(this.selectedFiles);\r\n this.isBotWritting = true;\r\n\r\n let text = userInput.trim();\r\n try {\r\n\r\n\r\n if (!text) {\r\n this.isBotWritting = false;\r\n return;\r\n }\r\n const messagesToAdd: ChatMessage[] = [];\r\n if(this.selectedFiles.length > 0) {\r\n messagesToAdd.push({\r\n role: 'user',\r\n type: 'file',\r\n content: this.selectedFiles\r\n });\r\n }\r\n messagesToAdd.push({ role: 'user', type: 'text', content: text });\r\n this.addFullMessages(messagesToAdd);\r\n\r\n //this.addMessage({ role: 'user', type: 'text', content: text });\r\n const filesToSend = this.selectedFiles && this.selectedFiles.length > 0 ? await this.convertFilesToAttachments(this.selectedFiles) : [];\r\n const requestData = {\r\n conversationId: this.sessionId,\r\n text,\r\n files: filesToSend,\r\n metadata: this.aiAgentsGatewayService.metadata || {}\r\n };\r\n this.selectedFiles = [];\r\n const response = await this.aiAgentsGatewayService.sendMessage(\r\n this.idKatios,\r\n this.agentId,\r\n requestData\r\n ) as any;\r\n\r\n //this.userInput = '';\r\n \r\n // Asegurar que Angular detecte los cambios después del await\r\n if (response.success) {\r\n this.sessionId = response.data.conversationId;\r\n const incoming = response.data.messages.map((m: any) => ({\r\n role: m.role,\r\n type: m.type || 'markdown',\r\n content: m.content\r\n }));\r\n this.addFullMessages(incoming);\r\n }\r\n } catch (error) {\r\n console.error('Error en send:', error);\r\n this.addMessage({ role: 'assistant', type: 'error', content: 'Ocurrió un error al enviar el mensaje' });\r\n }\r\n finally {\r\n this.isBotWritting = false;\r\n }\r\n }\r\n async startRecording() {\r\n try {\r\n // pide permiso al micrófono\r\n this.recordingStream = await navigator.mediaDevices.getUserMedia({ audio: true });\r\n\r\n // mimeType: mejor opción común en Chrome/Edge\r\n const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.audioChunks = [];\r\n this.mediaRecorder = new MediaRecorder(this.recordingStream, { mimeType });\r\n\r\n this.mediaRecorder.ondataavailable = (e: BlobEvent) => {\r\n if (e.data && e.data.size > 0) this.audioChunks.push(e.data);\r\n };\r\n\r\n this.mediaRecorder.onstop = () => {\r\n // Asegura que Angular se entere de todo lo que pase aquí\r\n this.zone.run(async () => {\r\n try {\r\n const blob = new Blob(this.audioChunks, { type: mimeType });\r\n const fileName = `audio_${new Date().toISOString().replace(/[:.]/g, '-')}.webm`;\r\n const audioFile = new File([blob], fileName, { type: mimeType });\r\n\r\n this.audioChunks = [];\r\n\r\n await this.sendVoiceMessage(audioFile);\r\n } catch (e) {\r\n console.error('Error procesando audio:', e);\r\n }\r\n });\r\n };\r\n\r\n this.mediaRecorder.start();\r\n this.isRecording = true;\r\n } catch (err) {\r\n console.error('No se pudo iniciar la grabación:', err);\r\n this.isRecording = false;\r\n }\r\n }\r\n private async sendVoiceMessage(audioFile: File) {\r\n\r\n\r\n try {\r\n const sttText = await this.aiAgentsGatewayService.transcribeAudio(this.idKatios, audioFile);\r\n const text = (sttText || '').trim();\r\n if (!text) return;\r\n\r\n // Render inmediato del mensaje del usuario\r\n this.zone.run(() => {\r\n this.addMessage({ role: 'user', type: 'text', content: text });\r\n this.isBotWritting = true;\r\n });\r\n\r\n const requestData = {\r\n conversationId: this.sessionId,\r\n text,\r\n files: [],\r\n metadata: this.aiAgentsGatewayService.metadata || {}\r\n };\r\n\r\n const response = await this.aiAgentsGatewayService.sendMessage(\r\n this.idKatios,\r\n this.agentId,\r\n requestData\r\n ) as any;\r\n\r\n // Asegurar que Angular detecte los cambios después del await\r\n this.zone.run(() => {\r\n if (response?.success && response?.data) {\r\n this.sessionId = response.data.conversationId;\r\n\r\n const incoming = response.data.messages.map((m: any) => ({\r\n role: m.role || 'assistant',\r\n type: m.type || 'markdown',\r\n content: m.content\r\n }));\r\n this.addFullMessages(incoming);\r\n }\r\n });\r\n\r\n } catch (err) {\r\n console.error('Error en sendVoiceMessage:', err);\r\n } finally {\r\n this.zone.run(() => {\r\n this.isBotWritting = false;\r\n });\r\n }\r\n }\r\n stopRecording() {\r\n try {\r\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\r\n this.mediaRecorder.stop();\r\n }\r\n\r\n // detener pistas del micrófono (importantísimo para liberar el icono de mic)\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(t => t.stop());\r\n this.recordingStream = undefined;\r\n }\r\n\r\n } finally {\r\n this.isRecording = false;\r\n }\r\n }\r\n\r\n uploadFile(e: any) {\r\n const input = e.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n const newFiles = Array.from(input.files);\r\n\r\n // Agrega los archivos nuevos sin duplicar por nombre\r\n for (const file of newFiles) {\r\n if (!this.selectedFiles.some(f => f.name === file.name && f.size === file.size)) {\r\n this.addFile(file);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InputMode } from '../../models/agent.model';\r\n//import { Avatar } from 'primeng/avatar';\r\n\r\n@Component({\r\n selector: 'app-text',\r\n standalone: true,\r\n imports: [CommonModule,FormsModule],\r\n templateUrl: './text.component.html',\r\n styleUrl: './text.component.scss'\r\n})\r\nexport class TextComponent {\r\n @Input() text: string = '';\r\n @Input() role: string = '';\r\n}\r\n","<div\r\nclass=\"px-3 py-2 border-round-bottom-xl w-fit\"\r\n[ngClass]=\"role !== 'user' ? 'bg-white border-round-right-xl' : 'border-round-left-xl border-round-right-sm bg-primary text-white'\"\r\n>\r\n<span class=\"text-base m-0 whitespace-normal\" style=\"word-break: break-word;\">{{text}}</span>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\n\r\n@Component({\r\n selector: 'app-file',\r\n standalone: true,\r\n imports: [CommonModule,FormsModule,ButtonModule,Avatar],\r\n templateUrl: './file.component.html',\r\n styleUrl: './file.component.scss'\r\n})\r\nexport class FileComponent {\r\n @Input() files: File[] = [];\r\n @Input() role: string = 'assistant';\r\n @Input() remove: boolean = false;\r\n\r\n getFileIcon(mime: string): string {\r\n if (mime.includes('pdf')) return 'pi pi-file-pdf';\r\n if (mime.includes('image')) return 'pi pi-image';\r\n if (mime.includes('audio')) return 'pi pi-volume-up';\r\n if (mime.includes('video')) return 'pi pi-video';\r\n if (mime.includes('zip')) return 'pi pi-file-zip';\r\n if (mime.includes('xlsx')) return 'pi pi-file-excel';\r\n return 'pi pi-file';\r\n }\r\n getFileClasses(mime: string): string {\r\n if (mime.includes('pdf')) return 'bg-red-500 border-red-800 text-white';\r\n if (mime.includes('image')) return 'bg-gray-100 border-gray-200 text-white';\r\n if (mime.includes('audio')) return 'bg-blue-500 border-blue-800 text-white';\r\n if (mime.includes('video')) return 'bg-yellow-500 border-yellow-800 text-white';\r\n if (mime.includes('zip')) return 'bg-indigo-500 border-indigo-800 text-white';\r\n if (mime.includes('xlsx')) return 'bg-green-500 border-green-800 text-white';\r\n return 'bg-gray-100 border-3 border-gray-200 text-gray-500';\r\n }\r\n removeSelectedFile(i: number) {\r\n this.files.splice(i,1);\r\n }\r\n getGridClass(){\r\n const fileCount = this.files.length;\r\n if (fileCount === 1) {\r\n return 'col-12';\r\n } else if (fileCount === 2) {\r\n return 'col-12 sm:col-6';\r\n } else {\r\n return 'col-12 sm:col-6 md:col-4';\r\n }\r\n }\r\n\r\n}\r\n","<div *ngIf=\"!remove\" class=\"grid w-full m-o\" [ngClass]=\"role !== 'user' ? 'items-start justify-content-start' : 'items-end justify-content-end'\">\r\n <div *ngFor=\"let file of files\" [ngClass]=\"getGridClass()\">\r\n <div class=\"flex align-items-center gap-3 border-1 border-gray-300 border-round-2xl p-2 bg-gray-100 h-full\">\r\n <p-avatar class=\"p-1 border-1 avatar-responsive\" [ngClass]=\"getFileClasses(file.name)\" [icon]=\"getFileIcon(file.name)\"></p-avatar>\r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 text-sm md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'Archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"remove\" class=\"grid w-full\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"col-12 sm:col-6 md:col-4\">\r\n <div class=\"relative border-1 border-gray-300 border-round-xl p-2 h-full\">\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" variant=\"text\" severity=\"secondary\" class=\"no-hover absolute top-0 right-0 z-1\" (click)=\"removeSelectedFile(i)\" size=\"small\"/>\r\n <div class=\"flex align-items-center gap-3\">\r\n <p-avatar \r\n class=\"p-1 border-1 avatar-responsive\"\r\n [ngClass]=\"getFileClasses(file.name)\" \r\n [icon]=\"getFileIcon(file.name)\" \r\n >\r\n </p-avatar>\r\n \r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 md:text-base text-sm\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-table',\r\n imports: [CommonModule],\r\n templateUrl: './table.component.html',\r\n styleUrl: './table.component.scss'\r\n})\r\nexport class TableComponent {\r\n @Input() table: string = \"\";\r\n}\r\n","<div\r\n *ngIf=\"table\"\r\n class=\"mt-2 overflow-auto\"\r\n [innerHTML]=\"table\"\r\n style=\"max-width: 100%; overflow-x: auto;\"\r\n></div>","import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { marked, RendererObject } from 'marked';\r\nimport hljs from 'highlight.js';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { AgentAvatarComponent } from '../../components/agent-avatar/agent-avatar.component';\r\n\r\n// marked.setOptions({\r\n// highlight: (code, lang) => {\r\n// if (lang && hljs.getLanguage(lang)) {\r\n// return hljs.highlight(code, { language: lang }).value;\r\n// }\r\n// return hljs.highlightAuto(code).value;\r\n// }\r\n// });\r\n\r\nconst renderer: RendererObject = {\r\n link(token) {\r\n const href = token.href ?? '';\r\n const title = token.title ? ` title=\"${token.title}\"` : '';\r\n const text = token.text ?? token.raw ?? href;\r\n\r\n return `<a href=\"${href}\"${title} target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\r\n },\r\n table(token) {\r\n const header = token.header?.map((cell: { text: string }) => `<th>${cell.text}</th>`).join('') ?? '';\r\n const rows = token.rows?.map((row: { text: string }[]) => `<tr>${row.map((cell) => `<td>${cell.text}</td>`).join('')}</tr>`).join('') ?? '';\r\n\r\n return `<div class=\"table-wrapper\"><table><thead><tr>${header}</tr></thead><tbody>${rows}</tbody></table></div>`;\r\n }\r\n};\r\n\r\nmarked.use({ renderer });\r\n\r\n@Component({\r\n selector: 'app-markdown',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './markdown.component.html',\r\n styleUrl: './markdown.component.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class MarkdownComponent implements OnChanges {\r\n @Input() content = '';\r\n safeHtml: SafeHtml = '';\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if ('content' in changes) {\r\n const rawHtml = await marked.parse(this.content || '');\r\n this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(rawHtml);\r\n }\r\n }\r\n}\r\n","<div class=\"markdown-wrapper\">\r\n <div class=\"markdown-container\" [innerHTML]=\"safeHtml\"></div>\r\n</div>","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-robot-icon',\r\n imports: [],\r\n templateUrl: './robot-icon.component.html',\r\n styleUrl: './robot-icon.component.css',\r\n host: {\r\n style: 'display: inline-flex; width: 1.5em; height: 1.5em;'\r\n }\r\n})\r\nexport class RobotIconComponent {\r\n\r\n}\r\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" width=\"100%\" height=\"100%\" fill=\"currentColor\">\r\n <path d=\"M440-120v-80h320v-284q0-117-81.5-198.5T480-764q-117 0-198.5 81.5T200-484v244h-40q-33 0-56.5-23.5T80-320v-80q0-21 10.5-39.5T120-469l3-53q8-68 39.5-126t79-101q47.5-43 109-67T480-840q68 0 129 24t109 66.5Q766-707 797-649t40 126l3 52q19 9 29.5 27t10.5 38v92q0 20-10.5 38T840-249v49q0 33-23.5 56.5T760-120H440Zm-80-280q-17 0-28.5-11.5T320-440q0-17 11.5-28.5T360-480q17 0 28.5 11.5T400-440q0 17-11.5 28.5T360-400Zm240 0q-17 0-28.5-11.5T560-440q0-17 11.5-28.5T600-480q17 0 28.5 11.5T640-440q0 17-11.5 28.5T600-400Zm-359-62q-7-106 64-182t177-76q89 0 156.5 56.5T720-519q-91-1-167.5-49T435-698q-16 80-67.5 142.5T241-462Z\"/>\r\n</svg>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, input } from '@angular/core';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { RobotIconComponent } from '../robot-icon/robot-icon.component';\r\n\r\n@Component({\r\n selector: 'lib-agent-avatar',\r\n imports: [CommonModule, Avatar, RobotIconComponent],\r\n templateUrl: './agent-avatar.component.html',\r\n styleUrl: './agent-avatar.component.scss'\r\n})\r\nexport class AgentAvatarComponent {\r\n @Input() size: \"normal\" | \"large\" | \"xlarge\" | undefined = 'large';\r\n}\r\n","<p-avatar [size]=\"size\" class=\"agent-avatar\" shape=\"circle\">\r\n <lib-robot-icon style=\"color: var(--primary-color)\"></lib-robot-icon>\r\n</p-avatar> \r\n\r\n","import { AfterViewChecked, Component, ElementRef, Input, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TextComponent } from '../../types/text/text.component';\r\nimport { FileComponent } from '../../types/file/file.component';\r\nimport { TableComponent } from '../../types/table/table.component';\r\nimport { MarkdownComponent } from '../../types/markdown/markdown.component';\r\nimport { ChatMessage } from '../../models/agent.model';\r\nimport { AgentAvatarComponent } from \"../agent-avatar/agent-avatar.component\";\r\nimport { MessageModule } from 'primeng/message';\r\n@Component({\r\n selector: 'lib-messages',\r\n imports: [CommonModule, FormsModule, ButtonModule, TextComponent, FileComponent, TableComponent, MarkdownComponent, AgentAvatarComponent, MessageModule],\r\n templateUrl: './messages.component.html',\r\n styleUrl: './messages.component.scss',\r\n host: {\r\n 'class': 'block h-full w-full overflow-hidden'\r\n }\r\n})\r\nexport class MessagesComponent implements AfterViewChecked {\r\n @ViewChild('chatContainer') private chatContainer!: ElementRef<HTMLDivElement>;\r\n @Input() messages: ChatMessage[] = [];\r\n @Input() isBotWritting: boolean = false;\r\n @Input() scrollMode: 'edge' | 'inline' = 'edge';\r\n @Input() agentIcon: string = 'pi pi-sparkles';\r\n \r\n ngAfterViewChecked() {\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatContainer) return;\r\n const el = this.chatContainer.nativeElement;\r\n el.scrollTo({ top: el.scrollHeight, behavior });\r\n }\r\n\r\n}\r\n","<div class=\"messages-container\" [class.scroll-inline]=\"scrollMode === 'inline'\" #chatContainer>\r\n <div class=\"messages-content\">\r\n <div *ngFor=\"let msg of messages\" class=\"message-item\">\r\n <div class=\"flex w-full\" [ngClass]=\"msg.role !== 'user' ? 'justify-content-start' : 'justify-content-end'\">\r\n <div [ngClass]=\"msg.role !== 'user' ? 'message-bot' : 'message-user'\">\r\n <app-table *ngIf=\"msg.type === 'table'\" [table]=\"msg.content\"></app-table>\r\n <app-file *ngIf=\"msg.type === 'file'\" [files]=\"msg.content\" [role]=\"msg.role\"></app-file>\r\n <app-text *ngIf=\"msg.type === 'text'\" [text]=\"msg.content\" [role]=\"msg.role\"></app-text>\r\n <div [ngClass]=\"msg.role !== 'user' ? 'flex items-start gap-2' : ''\" *ngIf=\"msg.type === 'markdown'\">\r\n <lib-agent-avatar *ngIf=\"msg.role !== 'user'\" size=\"normal\"></lib-agent-avatar>\r\n <app-markdown [content]=\"msg.content\"></app-markdown>\r\n </div>\r\n <div *ngIf=\"msg.type === 'error'\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <p-message severity=\"error\">{{msg.content}}</p-message>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isBotWritting\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <div\r\n class=\"w-fit\">\r\n <span class=\"typing-dots\">\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #bottom></div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { Textarea } from 'primeng/textarea';\r\nimport { FileComponent } from '../../types/file/file.component';\r\nimport { HeaderConfig, InputMode } from '../../models/agent.model';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n imports: [CommonModule, FormsModule, ButtonModule, Textarea, ChipModule, FileComponent],\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.scss',\r\n host: {\r\n 'class': 'block w-full',\r\n '[class.inputModeDefault]': 'mode === \"default\"',\r\n '[class.inputModeBubble]': 'mode === \"bubble\"',\r\n }\r\n})\r\nexport class InputComponent {\r\n @Input() files: File[] = [];\r\n @Input() isRecording: boolean = false;\r\n @Input() isLoading: boolean = false;\r\n @Input() isBotWritting: boolean = false;\r\n @Input() header: HeaderConfig | undefined;\r\n @Input() mode: InputMode = 'default';\r\n @Output() sendInput = new EventEmitter<string>();\r\n @Output() startRecording = new EventEmitter<void>();\r\n @Output() stopRecording = new EventEmitter<void>();\r\n @Output() uploadFile = new EventEmitter<any>();\r\n userInput: string = '';\r\n\r\n handleKeyDown(event: KeyboardEvent) {\r\n const trimmedInput = this.userInput?.trim();\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n if (!trimmedInput || this.isBotWritting || this.isLoading) {\r\n event.preventDefault();\r\n return;\r\n }\r\n event.preventDefault();\r\n this.sendInput.emit(trimmedInput);\r\n this.userInput = '';\r\n }\r\n }\r\n\r\n send() {\r\n const trimmedInput = this.userInput?.trim();\r\n if (!trimmedInput || this.isBotWritting) {\r\n return;\r\n }\r\n this.sendInput.emit(trimmedInput);\r\n this.userInput = '';\r\n }\r\n\r\n}\r\n","<div class=\"input-wrapper input-default surface-overlay\">\r\n <app-file [files]=\"files || []\" role=\"assitant\" [remove]=\"true\" />\r\n <form (ngSubmit)=\"send()\" class=\"w-full flex flex-column gap-2\">\r\n <textarea pTextarea id=\"input\" name=\"userInput\" [(ngModel)]=\"userInput\"\r\n class=\"custom-input w-full text-base\" style=\"max-height: 200px\"\r\n [placeholder]=\"header?.placeholder || ''\" rows=\"1\" [autoResize]=\"true\"\r\n (keydown)=\"handleKeyDown($event)\"></textarea>\r\n <div class=\"flex align-items-center justify-content-between w-full\">\r\n\r\n <p-button icon=\"pi pi-paperclip\" [text]=\"true\" (click)=\"fileInputChat.click()\"\r\n [rounded]=\"true\" />\r\n <input type=\"file\" #fileInputChat multiple (change)=\"uploadFile.emit($event)\" style=\"display: none;\">\r\n\r\n <div class=\"flex align-items-center justify-content-end w-full gap-2\">\r\n <p-button *ngIf=\"!isRecording\" icon=\"pi pi-microphone\" [text]=\"true\" (click)=\"startRecording.emit()\"\r\n [rounded]=\"true\" />\r\n <p-button *ngIf=\"isRecording\" icon=\"pi pi-stop\" [text]=\"true\" (click)=\"stopRecording.emit()\"\r\n severity=\"danger\" [rounded]=\"true\" />\r\n <p-button icon=\"pi pi-send\" [rounded]=\"true\" type=\"submit\"\r\n [disabled]=\"isLoading || isBotWritting || (!userInput.trim() && (!files || files.length === 0))\" />\r\n </div>\r\n </div>\r\n </form>\r\n</div>","import { Component, Input, inject, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { AgentService } from './services/agent.service';\r\nimport { MessagesComponent } from './components/messages/messages.component';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport { combineLatest } from 'rxjs';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { AgentAvatarComponent } from './components/agent-avatar/agent-avatar.component';\r\n\r\n@Component({\r\n selector: 'app-general-agent',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ButtonModule, AgentAvatarComponent, TagModule, ChipModule, MessagesComponent, Skeleton, InputComponent],\r\n templateUrl: './general-agent.component.html',\r\n styleUrl: './general-agent.component.scss',\r\n providers: [AgentService],\r\n host: {\r\n 'class': 'block w-full h-full'\r\n }\r\n})\r\nexport class GeneralAgentComponent implements OnChanges {\r\n\r\n // Propiedades internas (ya no inputs/outputs)\r\n agentService = inject(AgentService);\r\n\r\n messages$ = this.agentService.messages$;\r\n isBotWritting$ = this.agentService.isBotWritting$;\r\n headerConfig$ = this.agentService.headerConfig$;\r\n isRecording$ = this.agentService.isRecording$;\r\n selectedFiles$ = this.agentService.selectedFiles$;\r\n isLoading$ = this.agentService.isLoading$;\r\n vm$ = combineLatest({\r\n header: this.headerConfig$,\r\n files: this.selectedFiles$,\r\n isRec: this.isRecording$,\r\n bot: this.isBotWritting$,\r\n messages: this.messages$,\r\n loading: this.isLoading$\r\n});\r\n\r\n @Input() agentId = '';\r\n @Input() idKatios = '';\r\n /** 'edge' = scroll en el borde del contenedor, 'inline' = scroll pegado al chat */\r\n @Input() scrollMode: 'edge' | 'inline' = 'edge';\r\n\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['agentId'] || changes['idKatios']) {\r\n await this.initAgent();\r\n }\r\n }\r\n\r\n async initAgent(){\r\n this.agentService.agentId = this.agentId;\r\n this.agentService.idKatios = this.idKatios;\r\n await this.agentService.loadAgent();\r\n }\r\n\r\n\r\n \r\n\r\n}\r\n","<ng-container *ngIf=\"vm$ | async as vm\">\r\n <!-- Vista inicial (bienvenida) -->\r\n <div *ngIf=\"agentService.isInitial\" class=\"custom-chat flex flex-column items-center justify-content-center w-full\">\r\n <div class=\"flex flex-column items-center justify-content-center gap-4 p-3 mb-3 text-center md:p-1\">\r\n <h2 *ngIf=\"!vm.loading\" class=\"text-3xl font-semibold text-gray-900 lg:text-4xl\">{{vm.header?.title ||\r\n 'Agente'}}</h2>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"25rem\" height=\"2rem\" borderRadius=\"16px\"></p-skeleton>\r\n <div\r\n class=\"flex items-start justify-content-center gap-2\">\r\n <lib-agent-avatar [size]=\"'large'\"></lib-agent-avatar>\r\n <div *ngIf=\"vm.header?.initialMessages && !vm.loading\" class=\"flex flex-column items-start\">\r\n <div *ngFor=\"let msg of vm.header?.initialMessages\" class=\"text-left\">\r\n <span class=\"m-0 text-gray-700 text-base lg:text-lg\">{{msg}}</span>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-column gap-2\">\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"5rem\" borderRadius=\"16px\"></p-skeleton>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"15rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!vm.loading\" class=\"text-base text-gray-500\">{{vm.header?.subtitle}}</p>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"17rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n <!-- Input centrado para vista inicial -->\r\n <div class=\"flex flex-column items-center justify-content-center custom-size w-full pt-1 pb-1\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat (con mensajes) -->\r\n <div *ngIf=\"!agentService.isInitial\" class=\"custom-chat chat-layout flex flex-column w-full\">\r\n <!-- Área de mensajes con scroll -->\r\n <div class=\"messages-area flex-1 overflow-hidden\">\r\n <lib-messages [messages]=\"vm.messages || []\" [isBotWritting]=\"vm.bot || false\" [scrollMode]=\"scrollMode\"></lib-messages>\r\n </div>\r\n <!-- Input fijo abajo -->\r\n <div class=\"input-area flex flex-column items-center w-full py-2 px-2 md:px-0\">\r\n <div class=\"custom-size w-full\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1 text-center\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { MessagesComponent } from '../messages/messages.component';\r\nimport { InputComponent } from '../input/input.component';\r\nimport { AgentService } from '../../services/agent.service';\r\nimport { combineLatest } from 'rxjs';\r\nimport { ChatMessage } from '../../models/agent.model';\r\n\r\n@Component({\r\n selector: 'lib-bubble-chat',\r\n imports: [CommonModule, MessagesComponent, InputComponent],\r\n templateUrl: './bubble-chat.component.html',\r\n styleUrls: ['./bubble-chat.component.scss'],\r\n providers: [AgentService],\r\n host: {\r\n 'class': 'block w-full h-full',\r\n }\r\n})\r\nexport class BubbleChatComponent implements OnChanges {\r\n agentService = inject(AgentService);\r\n\r\n messages$ = this.agentService.messages$;\r\n isBotWritting$ = this.agentService.isBotWritting$;\r\n headerConfig$ = this.agentService.headerConfig$;\r\n isRecording$ = this.agentService.isRecording$;\r\n selectedFiles$ = this.agentService.selectedFiles$;\r\n isLoading$ = this.agentService.isLoading$;\r\n vm$ = combineLatest({\r\n header: this.headerConfig$,\r\n files: this.selectedFiles$,\r\n isRec: this.isRecording$,\r\n bot: this.isBotWritting$,\r\n messages: this.messages$,\r\n loading: this.isLoading$\r\n });\r\n @Input() agentId = '';\r\n @Input() idKatios = '';\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['agentId'] || changes['agentType'] || changes['idKatios']) {\r\n await this.initAgent();\r\n this.addInitialMessages();\r\n }\r\n }\r\n\r\n async initAgent() {\r\n this.agentService.agentId = this.agentId;\r\n this.agentService.idKatios = this.idKatios;\r\n await this.agentService.loadAgent();\r\n }\r\n addInitialMessages() {\r\n const initialMessages: ChatMessage[] = [];\r\n this.agentService.headerConfig?.initialMessages?.map(msg => {\r\n initialMessages.push({\r\n role: 'assistant',\r\n type: 'markdown',\r\n content: msg\r\n });\r\n });\r\n this.agentService.addFullMessages(initialMessages);\r\n }\r\n\r\n}\r\n","<ng-container *ngIf=\"vm$ | async as vm\">\r\n <div class=\"chat-view\">\r\n <div class=\"messages-wrapper\">\r\n <lib-messages [messages]=\"vm.messages\" [isBotWritting]=\"vm.bot || vm.loading\" scrollMode=\"inline\" [agentIcon]=\"vm.header?.avatar || 'pi pi-sparkles'\">\r\n </lib-messages>\r\n </div>\r\n <div class=\"input-wrapper surface-overlay border-top-1 border-surface-200 dark:border-surface-700\">\r\n <lib-input mode=\"bubble\" [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\"\r\n [isBotWritting]=\"vm.bot || vm.loading\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\"\r\n (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\"\r\n (uploadFile)=\"agentService.uploadFile($event)\">\r\n </lib-input>\r\n </div>\r\n </div>\r\n</ng-container>","import { Component, Inject, Input, OnChanges, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { Agent } from '../../models/agent.model';\r\nimport { AI_AGENTS, AiAgentsGatewayService } from '../../../agents-backend.port';\r\nimport { BubbleChatComponent } from '../../components/bubble-chat/bubble-chat.component';\r\nimport { AgentAvatarComponent } from '../../components/agent-avatar/agent-avatar.component';\r\nimport { MessageService } from 'primeng/api';\r\nimport { RobotIconComponent } from '../../components/robot-icon/robot-icon.component';\r\n\r\n\r\n@Component({\r\n selector: 'lib-bubble-agent',\r\n standalone: true,\r\n imports: [CommonModule, ButtonModule, AgentAvatarComponent, BubbleChatComponent, RobotIconComponent],\r\n templateUrl: './bubble-agent.component.html',\r\n styleUrl: './bubble-agent.component.scss'\r\n})\r\nexport class BubbleAgentComponent implements OnChanges {\r\n @Input() idKatios = '';\r\n @Input() ndoc = '';\r\n @Input() tdoc = '';\r\n\r\n // Estado del componente\r\n isOpen = false;\r\n selectedAgent: Agent | null = null;\r\n agents: Agent[] = [];\r\n loading: boolean = false;\r\n\r\n constructor(\r\n @Inject(AI_AGENTS) private aiAgentsGatewayService: AiAgentsGatewayService,\r\n private messageService: MessageService\r\n ) { }\r\n\r\n ngOnChanges() {\r\n if (this.idKatios && this.ndoc && this.tdoc) {\r\n this.selectedAgent = null;\r\n this.agents = [];\r\n this.loading = true;\r\n this.aiAgentsGatewayService.getAgents(this.idKatios, this.ndoc, this.tdoc).subscribe({\r\n next: (response) => {\r\n if (response.data) this.agents = response.data;\r\n this.loading = false;\r\n },\r\n error: (err) => {\r\n console.error('Error al cargar agentes desde el servicio:', err);\r\n this.agents = [];\r\n this.messageService.add({ severity: 'error', summary: 'Error', detail: 'No se pudieron cargar los agentes. Por favor, inténtalo de nuevo más tarde.' });\r\n }\r\n });\r\n }\r\n }\r\n\r\n toggleChat() {\r\n this.isOpen = !this.isOpen;\r\n // Si se cierra, volver a la lista de agentes\r\n // if (!this.isOpen) {\r\n // this.selectedAgent = null;\r\n // this.messages = [];\r\n // }\r\n }\r\n\r\n selectAgent(agent: Agent) {\r\n this.selectedAgent = agent;\r\n }\r\n\r\n goBack() {\r\n this.selectedAgent = null;\r\n }\r\n}\r\n","<!-- Botón burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <button class=\"close-button\" (click)=\"toggleChat()\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n","/*\r\n * Public API Surface of general-agent\r\n */\r\n\r\nexport * from './lib/general-agent/general-agent.component';\r\nexport * from './lib/agents-backend.port';\r\nexport * from './lib/general-agent/agents/bubble-chat/bubble-agent.component';\r\nexport * from './lib/general-agent/components/bubble-chat/bubble-chat.component';\r\nexport * from './lib/general-agent/components/agent-avatar/agent-avatar.component';\r\nexport * from './lib/general-agent/components/robot-icon/robot-icon.component'\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"sf-aiembedded.mjs","sources":["../../../projects/general-agent/src/lib/agents-backend.port.ts","../../../projects/general-agent/src/lib/general-agent/services/agent.service.ts","../../../projects/general-agent/src/lib/general-agent/types/text/text.component.ts","../../../projects/general-agent/src/lib/general-agent/types/text/text.component.html","../../../projects/general-agent/src/lib/general-agent/types/file/file.component.ts","../../../projects/general-agent/src/lib/general-agent/types/file/file.component.html","../../../projects/general-agent/src/lib/general-agent/types/table/table.component.ts","../../../projects/general-agent/src/lib/general-agent/types/table/table.component.html","../../../projects/general-agent/src/lib/general-agent/types/markdown/markdown.component.ts","../../../projects/general-agent/src/lib/general-agent/types/markdown/markdown.component.html","../../../projects/general-agent/src/lib/general-agent/components/robot-icon/robot-icon.component.ts","../../../projects/general-agent/src/lib/general-agent/components/robot-icon/robot-icon.component.html","../../../projects/general-agent/src/lib/general-agent/components/agent-avatar/agent-avatar.component.ts","../../../projects/general-agent/src/lib/general-agent/components/agent-avatar/agent-avatar.component.html","../../../projects/general-agent/src/lib/general-agent/components/messages/messages.component.ts","../../../projects/general-agent/src/lib/general-agent/components/messages/messages.component.html","../../../projects/general-agent/src/lib/general-agent/components/input/input.component.ts","../../../projects/general-agent/src/lib/general-agent/components/input/input.component.html","../../../projects/general-agent/src/lib/general-agent/general-agent.component.ts","../../../projects/general-agent/src/lib/general-agent/general-agent.component.html","../../../projects/general-agent/src/lib/general-agent/components/bubble-chat/bubble-chat.component.ts","../../../projects/general-agent/src/lib/general-agent/components/bubble-chat/bubble-chat.component.html","../../../projects/general-agent/src/lib/general-agent/agents/bubble-chat/bubble-agent.component.ts","../../../projects/general-agent/src/lib/general-agent/agents/bubble-chat/bubble-agent.component.html","../../../projects/general-agent/src/public-api.ts","../../../projects/general-agent/src/sf-aiembedded.ts"],"sourcesContent":["// projects/general-agent/src/lib/agents-backend.port.ts\r\nimport { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface AiAgentsGatewayService {\r\n getAgent(idKatios: string, agentId: string): Promise<any>;\r\n sendMessage(idKatios: string, agentId: string, req: {\r\n conversationId?: string;\r\n text: string;\r\n files: Array<{fileName:string; contentType:string; base64Data:string;}>;\r\n metadata?: any;\r\n }): Promise<{\r\n conversationId: string;\r\n messages: Array<{ role?: string; type?: string; content: any }>;\r\n }>;\r\n transcribeAudio(idKatios: string, audio:File): Promise<string>;\r\n getAgents(idKatios: string, ndoc: string, tdoc: string): Observable<any>;\r\n get metadata(): Record<string, any>;\r\n}\r\n\r\nexport const AI_AGENTS = new InjectionToken<AiAgentsGatewayService>('AI_AGENTS');\r\n","import { ChangeDetectorRef, Inject, Injectable, NgZone } from '@angular/core';\r\nimport { AI_AGENTS, AiAgentsGatewayService } from '../../agents-backend.port';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { ChatMessage, HeaderConfig } from '../models/agent.model';\r\n\r\n@Injectable()\r\nexport class AgentService {\r\n // Propiedades internas (ya no inputs/outputs)\r\n // Propiedades para notificar cambios a los componentes que usan el servicio\r\n private readonly messagesSubject = new BehaviorSubject<ChatMessage[]>([]);\r\n readonly messages$ = this.messagesSubject.asObservable();\r\n private readonly isBotWrittingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isBotWritting$ = this.isBotWrittingSubject.asObservable();\r\n private readonly isRecordingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isRecording$ = this.isRecordingSubject.asObservable();\r\n private readonly isLoadingSubject = new BehaviorSubject<boolean>(false);\r\n readonly isLoading$ = this.isLoadingSubject.asObservable();\r\n private readonly headerConfigSubject = new BehaviorSubject<HeaderConfig | undefined>(undefined);\r\n readonly headerConfig$ = this.headerConfigSubject.asObservable();\r\n private readonly selectedFilesSubject = new BehaviorSubject<File[]>([]);\r\n readonly selectedFiles$ = this.selectedFilesSubject.asObservable();\r\n private mediaRecorder?: MediaRecorder;\r\n private audioChunks: BlobPart[] = [];\r\n private recordingStream?: MediaStream;\r\n _agentInfo: any;\r\n _configuration: any;\r\n _sessionId: string = '';\r\n _agentId = '';\r\n _idKatios = '';\r\n\r\n\r\n constructor(\r\n @Inject(AI_AGENTS) private aiAgentsGatewayService: AiAgentsGatewayService,\r\n private zone: NgZone\r\n ) { }\r\n\r\n get agentId() {\r\n return this._agentId;\r\n }\r\n set agentId(value: string) {\r\n this._agentId = value;\r\n }\r\n\r\n get idKatios() {\r\n return this._idKatios;\r\n }\r\n\r\n set idKatios(value: string) {\r\n this._idKatios = value;\r\n }\r\n\r\n\r\n set agentInfo(value: any) {\r\n this._agentInfo = value;\r\n }\r\n\r\n get agentInfo(): any {\r\n return this._agentInfo;\r\n }\r\n\r\n set selectedFiles(files: File[]) {\r\n this.selectedFilesSubject.next(files);\r\n }\r\n\r\n get selectedFiles(): File[] {\r\n return this.selectedFilesSubject.value;\r\n }\r\n\r\n set sessionId(value: string) {\r\n this._sessionId = value;\r\n }\r\n\r\n get sessionId(): string {\r\n return this._sessionId;\r\n }\r\n\r\n set isRecording(value: boolean) {\r\n this.isRecordingSubject.next(value);\r\n }\r\n\r\n get isRecording(): boolean {\r\n return this.isRecordingSubject.value;\r\n }\r\n\r\n set headerConfig(value: HeaderConfig | undefined) {\r\n this.headerConfigSubject.next(value);\r\n }\r\n\r\n get headerConfig(): HeaderConfig | undefined {\r\n return this.headerConfigSubject.value;\r\n }\r\n\r\n set isLoading(value: boolean) {\r\n this.isLoadingSubject.next(value);\r\n }\r\n\r\n get isLoading(): boolean {\r\n return this.isLoadingSubject.value;\r\n }\r\n\r\n set isBotWritting(isWritting: boolean) {\r\n this.isBotWrittingSubject.next(isWritting);\r\n }\r\n\r\n get isBotWritting(): boolean {\r\n return this.isBotWrittingSubject.value;\r\n }\r\n\r\n addMessage(message: ChatMessage) {\r\n const next = [...this.messagesSubject.value, message];\r\n this.messagesSubject.next(next);\r\n }\r\n\r\n clearMessages() {\r\n this.messagesSubject.next([]);\r\n }\r\n\r\n addFile(file: File) {\r\n const next = [...this.selectedFilesSubject.value, file];\r\n this.selectedFilesSubject.next(next);\r\n }\r\n\r\n addFullMessages(messages: ChatMessage[]) {\r\n const next = [...this.messagesSubject.value, ...messages];\r\n this.messagesSubject.next(next);\r\n }\r\n\r\n\r\n async loadAgent() {\r\n this.isLoading = true;\r\n this.isBotWritting = false;\r\n this.clearMessages();\r\n this.sessionId = \"\";\r\n try {\r\n\r\n const agentInfo = await this.aiAgentsGatewayService.getAgent(this.idKatios, this.agentId) as any;\r\n if (agentInfo.statusCode === 200) {\r\n this.agentInfo = JSON.parse(agentInfo.data.rawConfig);\r\n let configurationAgent = null;\r\n if (this.agentInfo.config?.i18n?.en) {\r\n configurationAgent = this.agentInfo.config?.i18n.en;\r\n }\r\n else {\r\n configurationAgent = this.agentInfo.config?.setUp;\r\n }\r\n\r\n this.headerConfig = {\r\n title: configurationAgent.title,\r\n subtitle: configurationAgent.subtitle,\r\n initialMessages: this.agentInfo.config.initialMessages,\r\n placeholder: configurationAgent.inputPlaceholder,\r\n footer: configurationAgent.footer\r\n };\r\n\r\n this.isLoading = false;\r\n }\r\n } catch (error) {\r\n console.error('An error occurred:', error);\r\n this.isLoading = false;\r\n }\r\n }\r\n\r\n get isInitial(): boolean {\r\n return this.messagesSubject.value.length === 0 && !this.isBotWritting;\r\n }\r\n\r\n /**\r\n * Converts File objects to Attachment format expected by the backend\r\n */\r\n private async convertFilesToAttachments(files: File[]): Promise<any[]> {\r\n if (!files || files.length === 0) {\r\n return [];\r\n }\r\n\r\n const attachments = [];\r\n for (const file of files) {\r\n try {\r\n const base64Data = await this.fileToBase64(file);\r\n const attachment = {\r\n fileName: file.name,\r\n contentType: file.type,\r\n base64Data: base64Data\r\n };\r\n attachments.push(attachment);\r\n } catch (error) {\r\n console.error(`Error converting file ${file.name} to base64:`, error);\r\n }\r\n }\r\n\r\n return attachments;\r\n }\r\n\r\n /**\r\n * Converts a File object to base64 string\r\n */\r\n private fileToBase64(file: File): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => {\r\n // Remove the data URL prefix (e.g., \"data:image/png;base64,\")\r\n const base64String = (reader.result as string).split(',')[1];\r\n resolve(base64String);\r\n };\r\n reader.onerror = error => reject(error);\r\n });\r\n }\r\n\r\n async send(userInput: string) {\r\n console.log(this.selectedFiles);\r\n this.isBotWritting = true;\r\n\r\n let text = userInput.trim();\r\n try {\r\n\r\n\r\n if (!text) {\r\n this.isBotWritting = false;\r\n return;\r\n }\r\n const messagesToAdd: ChatMessage[] = [];\r\n if(this.selectedFiles.length > 0) {\r\n messagesToAdd.push({\r\n role: 'user',\r\n type: 'file',\r\n content: this.selectedFiles\r\n });\r\n }\r\n messagesToAdd.push({ role: 'user', type: 'text', content: text });\r\n this.addFullMessages(messagesToAdd);\r\n\r\n //this.addMessage({ role: 'user', type: 'text', content: text });\r\n const filesToSend = this.selectedFiles && this.selectedFiles.length > 0 ? await this.convertFilesToAttachments(this.selectedFiles) : [];\r\n const requestData = {\r\n conversationId: this.sessionId,\r\n text,\r\n files: filesToSend,\r\n metadata: this.aiAgentsGatewayService.metadata || {}\r\n };\r\n this.selectedFiles = [];\r\n const response = await this.aiAgentsGatewayService.sendMessage(\r\n this.idKatios,\r\n this.agentId,\r\n requestData\r\n ) as any;\r\n\r\n //this.userInput = '';\r\n \r\n // Asegurar que Angular detecte los cambios después del await\r\n if (response.success) {\r\n this.sessionId = response.data.conversationId;\r\n const incoming = response.data.messages.map((m: any) => ({\r\n role: m.role,\r\n type: m.type || 'markdown',\r\n content: m.content\r\n }));\r\n this.addFullMessages(incoming);\r\n }\r\n } catch (error) {\r\n console.error('Error en send:', error);\r\n this.addMessage({ role: 'assistant', type: 'error', content: 'Ocurrió un error al enviar el mensaje' });\r\n }\r\n finally {\r\n this.isBotWritting = false;\r\n }\r\n }\r\n async startRecording() {\r\n try {\r\n // pide permiso al micrófono\r\n this.recordingStream = await navigator.mediaDevices.getUserMedia({ audio: true });\r\n\r\n // mimeType: mejor opción común en Chrome/Edge\r\n const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.audioChunks = [];\r\n this.mediaRecorder = new MediaRecorder(this.recordingStream, { mimeType });\r\n\r\n this.mediaRecorder.ondataavailable = (e: BlobEvent) => {\r\n if (e.data && e.data.size > 0) this.audioChunks.push(e.data);\r\n };\r\n\r\n this.mediaRecorder.onstop = () => {\r\n // Asegura que Angular se entere de todo lo que pase aquí\r\n this.zone.run(async () => {\r\n try {\r\n const blob = new Blob(this.audioChunks, { type: mimeType });\r\n const fileName = `audio_${new Date().toISOString().replace(/[:.]/g, '-')}.webm`;\r\n const audioFile = new File([blob], fileName, { type: mimeType });\r\n\r\n this.audioChunks = [];\r\n\r\n await this.sendVoiceMessage(audioFile);\r\n } catch (e) {\r\n console.error('Error procesando audio:', e);\r\n }\r\n });\r\n };\r\n\r\n this.mediaRecorder.start();\r\n this.isRecording = true;\r\n } catch (err) {\r\n console.error('No se pudo iniciar la grabación:', err);\r\n this.isRecording = false;\r\n }\r\n }\r\n private async sendVoiceMessage(audioFile: File) {\r\n\r\n\r\n try {\r\n const sttText = await this.aiAgentsGatewayService.transcribeAudio(this.idKatios, audioFile);\r\n const text = (sttText || '').trim();\r\n if (!text) return;\r\n\r\n // Render inmediato del mensaje del usuario\r\n this.zone.run(() => {\r\n this.addMessage({ role: 'user', type: 'text', content: text });\r\n this.isBotWritting = true;\r\n });\r\n\r\n const requestData = {\r\n conversationId: this.sessionId,\r\n text,\r\n files: [],\r\n metadata: this.aiAgentsGatewayService.metadata || {}\r\n };\r\n\r\n const response = await this.aiAgentsGatewayService.sendMessage(\r\n this.idKatios,\r\n this.agentId,\r\n requestData\r\n ) as any;\r\n\r\n // Asegurar que Angular detecte los cambios después del await\r\n this.zone.run(() => {\r\n if (response?.success && response?.data) {\r\n this.sessionId = response.data.conversationId;\r\n\r\n const incoming = response.data.messages.map((m: any) => ({\r\n role: m.role || 'assistant',\r\n type: m.type || 'markdown',\r\n content: m.content\r\n }));\r\n this.addFullMessages(incoming);\r\n }\r\n });\r\n\r\n } catch (err) {\r\n console.error('Error en sendVoiceMessage:', err);\r\n } finally {\r\n this.zone.run(() => {\r\n this.isBotWritting = false;\r\n });\r\n }\r\n }\r\n stopRecording() {\r\n try {\r\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\r\n this.mediaRecorder.stop();\r\n }\r\n\r\n // detener pistas del micrófono (importantísimo para liberar el icono de mic)\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(t => t.stop());\r\n this.recordingStream = undefined;\r\n }\r\n\r\n } finally {\r\n this.isRecording = false;\r\n }\r\n }\r\n\r\n uploadFile(e: any) {\r\n const input = e.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n const newFiles = Array.from(input.files);\r\n\r\n // Agrega los archivos nuevos sin duplicar por nombre\r\n for (const file of newFiles) {\r\n if (!this.selectedFiles.some(f => f.name === file.name && f.size === file.size)) {\r\n this.addFile(file);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InputMode } from '../../models/agent.model';\r\n//import { Avatar } from 'primeng/avatar';\r\n\r\n@Component({\r\n selector: 'app-text',\r\n standalone: true,\r\n imports: [CommonModule,FormsModule],\r\n templateUrl: './text.component.html',\r\n styleUrl: './text.component.scss'\r\n})\r\nexport class TextComponent {\r\n @Input() text: string = '';\r\n @Input() role: string = '';\r\n}\r\n","<div\r\nclass=\"px-3 py-2 border-round-bottom-xl w-fit\"\r\n[ngClass]=\"role !== 'user' ? 'bg-white border-round-right-xl' : 'border-round-left-xl border-round-right-sm bg-primary text-white'\"\r\n>\r\n<span class=\"text-base m-0 whitespace-normal\" style=\"word-break: break-word;\">{{text}}</span>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\n\r\n@Component({\r\n selector: 'app-file',\r\n standalone: true,\r\n imports: [CommonModule,FormsModule,ButtonModule,Avatar],\r\n templateUrl: './file.component.html',\r\n styleUrl: './file.component.scss'\r\n})\r\nexport class FileComponent {\r\n @Input() files: File[] = [];\r\n @Input() role: string = 'assistant';\r\n @Input() remove: boolean = false;\r\n\r\n getFileIcon(mime: string): string {\r\n if (mime.includes('pdf')) return 'pi pi-file-pdf';\r\n if (mime.includes('image')) return 'pi pi-image';\r\n if (mime.includes('audio')) return 'pi pi-volume-up';\r\n if (mime.includes('video')) return 'pi pi-video';\r\n if (mime.includes('zip')) return 'pi pi-file-zip';\r\n if (mime.includes('xlsx')) return 'pi pi-file-excel';\r\n return 'pi pi-file';\r\n }\r\n getFileClasses(mime: string): string {\r\n if (mime.includes('pdf')) return 'bg-red-500 border-red-800 text-white';\r\n if (mime.includes('image')) return 'bg-gray-100 border-gray-200 text-white';\r\n if (mime.includes('audio')) return 'bg-blue-500 border-blue-800 text-white';\r\n if (mime.includes('video')) return 'bg-yellow-500 border-yellow-800 text-white';\r\n if (mime.includes('zip')) return 'bg-indigo-500 border-indigo-800 text-white';\r\n if (mime.includes('xlsx')) return 'bg-green-500 border-green-800 text-white';\r\n return 'bg-gray-100 border-3 border-gray-200 text-gray-500';\r\n }\r\n removeSelectedFile(i: number) {\r\n this.files.splice(i,1);\r\n }\r\n getGridClass(){\r\n const fileCount = this.files.length;\r\n if (fileCount === 1) {\r\n return 'col-12';\r\n } else if (fileCount === 2) {\r\n return 'col-12 sm:col-6';\r\n } else {\r\n return 'col-12 sm:col-6 md:col-4';\r\n }\r\n }\r\n\r\n}\r\n","<div *ngIf=\"!remove\" class=\"grid w-full m-o\" [ngClass]=\"role !== 'user' ? 'items-start justify-content-start' : 'items-end justify-content-end'\">\r\n <div *ngFor=\"let file of files\" [ngClass]=\"getGridClass()\">\r\n <div class=\"flex align-items-center gap-3 border-1 border-gray-300 border-round-2xl p-2 bg-gray-100 h-full\">\r\n <p-avatar class=\"p-1 border-1 avatar-responsive\" [ngClass]=\"getFileClasses(file.name)\" [icon]=\"getFileIcon(file.name)\"></p-avatar>\r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 text-sm md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'Archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"remove\" class=\"grid w-full\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"col-12 sm:col-6 md:col-4\">\r\n <div class=\"relative border-1 border-gray-300 border-round-xl p-2 h-full\">\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" variant=\"text\" severity=\"secondary\" class=\"no-hover absolute top-0 right-0 z-1\" (click)=\"removeSelectedFile(i)\" size=\"small\"/>\r\n <div class=\"flex align-items-center gap-3\">\r\n <p-avatar \r\n class=\"p-1 border-1 avatar-responsive\"\r\n [ngClass]=\"getFileClasses(file.name)\" \r\n [icon]=\"getFileIcon(file.name)\" \r\n >\r\n </p-avatar>\r\n \r\n <div class=\"flex flex-column overflow-hidden\" style=\"min-width: 0;\">\r\n <span class=\"font-semibold text-gray-500 md:text-base text-sm\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{ file.name }}\r\n </span>\r\n <p class=\"text-xs text-gray-400 md:text-base\" \r\n style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n ({{ file.type || 'archivo' }})\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-table',\r\n imports: [CommonModule],\r\n templateUrl: './table.component.html',\r\n styleUrl: './table.component.scss'\r\n})\r\nexport class TableComponent {\r\n @Input() table: string = \"\";\r\n}\r\n","<div\r\n *ngIf=\"table\"\r\n class=\"mt-2 overflow-auto\"\r\n [innerHTML]=\"table\"\r\n style=\"max-width: 100%; overflow-x: auto;\"\r\n></div>","import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { marked, RendererObject } from 'marked';\r\nimport hljs from 'highlight.js';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { AgentAvatarComponent } from '../../components/agent-avatar/agent-avatar.component';\r\n\r\n// marked.setOptions({\r\n// highlight: (code, lang) => {\r\n// if (lang && hljs.getLanguage(lang)) {\r\n// return hljs.highlight(code, { language: lang }).value;\r\n// }\r\n// return hljs.highlightAuto(code).value;\r\n// }\r\n// });\r\n\r\nconst renderer: RendererObject = {\r\n link(token) {\r\n const href = token.href ?? '';\r\n const title = token.title ? ` title=\"${token.title}\"` : '';\r\n const text = token.text ?? token.raw ?? href;\r\n\r\n return `<a href=\"${href}\"${title} target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\r\n },\r\n table(token) {\r\n const header = token.header?.map((cell: { text: string }) => `<th>${cell.text}</th>`).join('') ?? '';\r\n const rows = token.rows?.map((row: { text: string }[]) => `<tr>${row.map((cell) => `<td>${cell.text}</td>`).join('')}</tr>`).join('') ?? '';\r\n\r\n return `<div class=\"table-wrapper\"><table><thead><tr>${header}</tr></thead><tbody>${rows}</tbody></table></div>`;\r\n }\r\n};\r\n\r\nmarked.use({ renderer });\r\n\r\n@Component({\r\n selector: 'app-markdown',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './markdown.component.html',\r\n styleUrl: './markdown.component.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class MarkdownComponent implements OnChanges {\r\n @Input() content = '';\r\n safeHtml: SafeHtml = '';\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if ('content' in changes) {\r\n const rawHtml = await marked.parse(this.content || '');\r\n this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(rawHtml);\r\n }\r\n }\r\n}\r\n","<div class=\"markdown-wrapper\">\r\n <div class=\"markdown-container\" [innerHTML]=\"safeHtml\"></div>\r\n</div>","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-robot-icon',\r\n imports: [],\r\n templateUrl: './robot-icon.component.html',\r\n styleUrl: './robot-icon.component.css',\r\n host: {\r\n style: 'display: inline-flex; width: 1.5em; height: 1.5em;'\r\n }\r\n})\r\nexport class RobotIconComponent {\r\n\r\n}\r\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" width=\"100%\" height=\"100%\" fill=\"currentColor\">\r\n <path d=\"M440-120v-80h320v-284q0-117-81.5-198.5T480-764q-117 0-198.5 81.5T200-484v244h-40q-33 0-56.5-23.5T80-320v-80q0-21 10.5-39.5T120-469l3-53q8-68 39.5-126t79-101q47.5-43 109-67T480-840q68 0 129 24t109 66.5Q766-707 797-649t40 126l3 52q19 9 29.5 27t10.5 38v92q0 20-10.5 38T840-249v49q0 33-23.5 56.5T760-120H440Zm-80-280q-17 0-28.5-11.5T320-440q0-17 11.5-28.5T360-480q17 0 28.5 11.5T400-440q0 17-11.5 28.5T360-400Zm240 0q-17 0-28.5-11.5T560-440q0-17 11.5-28.5T600-480q17 0 28.5 11.5T640-440q0 17-11.5 28.5T600-400Zm-359-62q-7-106 64-182t177-76q89 0 156.5 56.5T720-519q-91-1-167.5-49T435-698q-16 80-67.5 142.5T241-462Z\"/>\r\n</svg>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input, input } from '@angular/core';\r\nimport { Avatar } from 'primeng/avatar';\r\nimport { RobotIconComponent } from '../robot-icon/robot-icon.component';\r\n\r\n@Component({\r\n selector: 'lib-agent-avatar',\r\n imports: [CommonModule, Avatar, RobotIconComponent],\r\n templateUrl: './agent-avatar.component.html',\r\n styleUrl: './agent-avatar.component.scss'\r\n})\r\nexport class AgentAvatarComponent {\r\n @Input() size: \"normal\" | \"large\" | \"xlarge\" | undefined = 'large';\r\n}\r\n","<p-avatar [size]=\"size\" class=\"agent-avatar\" shape=\"circle\">\r\n <lib-robot-icon style=\"color: var(--primary-color)\"></lib-robot-icon>\r\n</p-avatar> \r\n\r\n","import { AfterViewChecked, Component, ElementRef, Input, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TextComponent } from '../../types/text/text.component';\r\nimport { FileComponent } from '../../types/file/file.component';\r\nimport { TableComponent } from '../../types/table/table.component';\r\nimport { MarkdownComponent } from '../../types/markdown/markdown.component';\r\nimport { ChatMessage } from '../../models/agent.model';\r\nimport { AgentAvatarComponent } from \"../agent-avatar/agent-avatar.component\";\r\nimport { MessageModule } from 'primeng/message';\r\n@Component({\r\n selector: 'lib-messages',\r\n imports: [CommonModule, FormsModule, ButtonModule, TextComponent, FileComponent, TableComponent, MarkdownComponent, AgentAvatarComponent, MessageModule],\r\n templateUrl: './messages.component.html',\r\n styleUrl: './messages.component.scss',\r\n host: {\r\n 'class': 'block h-full w-full overflow-hidden'\r\n }\r\n})\r\nexport class MessagesComponent implements AfterViewChecked {\r\n @ViewChild('chatContainer') private chatContainer!: ElementRef<HTMLDivElement>;\r\n @Input() messages: ChatMessage[] = [];\r\n @Input() isBotWritting: boolean = false;\r\n @Input() scrollMode: 'edge' | 'inline' = 'edge';\r\n @Input() agentIcon: string = 'pi pi-sparkles';\r\n \r\n ngAfterViewChecked() {\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatContainer) return;\r\n const el = this.chatContainer.nativeElement;\r\n el.scrollTo({ top: el.scrollHeight, behavior });\r\n }\r\n\r\n}\r\n","<div class=\"messages-container\" [class.scroll-inline]=\"scrollMode === 'inline'\" #chatContainer>\r\n <div class=\"messages-content\">\r\n <div *ngFor=\"let msg of messages\" class=\"message-item\">\r\n <div class=\"flex w-full\" [ngClass]=\"msg.role !== 'user' ? 'justify-content-start' : 'justify-content-end'\">\r\n <div [ngClass]=\"msg.role !== 'user' ? 'message-bot' : 'message-user'\">\r\n <app-table *ngIf=\"msg.type === 'table'\" [table]=\"msg.content\"></app-table>\r\n <app-file *ngIf=\"msg.type === 'file'\" [files]=\"msg.content\" [role]=\"msg.role\"></app-file>\r\n <app-text *ngIf=\"msg.type === 'text'\" [text]=\"msg.content\" [role]=\"msg.role\"></app-text>\r\n <div [ngClass]=\"msg.role !== 'user' ? 'flex items-start gap-2' : ''\" *ngIf=\"msg.type === 'markdown'\">\r\n <lib-agent-avatar *ngIf=\"msg.role !== 'user'\" size=\"normal\"></lib-agent-avatar>\r\n <app-markdown [content]=\"msg.content\"></app-markdown>\r\n </div>\r\n <div *ngIf=\"msg.type === 'error'\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <p-message severity=\"error\">{{msg.content}}</p-message>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isBotWritting\" class=\"message-item\">\r\n <div class=\"flex gap-2 message-bot\">\r\n <lib-agent-avatar size=\"normal\"></lib-agent-avatar>\r\n <div\r\n class=\"w-fit\">\r\n <span class=\"typing-dots\">\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n <span class=\"dot\"></span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #bottom></div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, input, Output } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { Textarea } from 'primeng/textarea';\r\nimport { FileComponent } from '../../types/file/file.component';\r\nimport { HeaderConfig, InputMode } from '../../models/agent.model';\r\n\r\n@Component({\r\n selector: 'lib-input',\r\n imports: [CommonModule, FormsModule, ButtonModule, Textarea, ChipModule, FileComponent],\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.scss',\r\n host: {\r\n 'class': 'block w-full',\r\n '[class.inputModeDefault]': 'mode === \"default\"',\r\n '[class.inputModeBubble]': 'mode === \"bubble\"',\r\n }\r\n})\r\nexport class InputComponent {\r\n @Input() files: File[] = [];\r\n @Input() isRecording: boolean = false;\r\n @Input() isLoading: boolean = false;\r\n @Input() isBotWritting: boolean = false;\r\n @Input() header: HeaderConfig | undefined;\r\n @Input() mode: InputMode = 'default';\r\n @Output() sendInput = new EventEmitter<string>();\r\n @Output() startRecording = new EventEmitter<void>();\r\n @Output() stopRecording = new EventEmitter<void>();\r\n @Output() uploadFile = new EventEmitter<any>();\r\n userInput: string = '';\r\n\r\n handleKeyDown(event: KeyboardEvent) {\r\n const trimmedInput = this.userInput?.trim();\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n if (!trimmedInput || this.isBotWritting || this.isLoading) {\r\n event.preventDefault();\r\n return;\r\n }\r\n event.preventDefault();\r\n this.sendInput.emit(trimmedInput);\r\n this.userInput = '';\r\n }\r\n }\r\n\r\n send() {\r\n const trimmedInput = this.userInput?.trim();\r\n if (!trimmedInput || this.isBotWritting) {\r\n return;\r\n }\r\n this.sendInput.emit(trimmedInput);\r\n this.userInput = '';\r\n }\r\n\r\n}\r\n","<div class=\"input-wrapper input-default surface-overlay\">\r\n <app-file [files]=\"files || []\" role=\"assitant\" [remove]=\"true\" />\r\n <form (ngSubmit)=\"send()\" class=\"w-full flex flex-column gap-2\">\r\n <textarea pTextarea id=\"input\" name=\"userInput\" [(ngModel)]=\"userInput\"\r\n class=\"custom-input w-full text-base\" style=\"max-height: 200px\"\r\n [placeholder]=\"header?.placeholder || ''\" rows=\"1\" [autoResize]=\"true\"\r\n (keydown)=\"handleKeyDown($event)\"></textarea>\r\n <div class=\"flex align-items-center justify-content-between w-full\">\r\n\r\n <p-button icon=\"pi pi-paperclip\" [text]=\"true\" (click)=\"fileInputChat.click()\"\r\n [rounded]=\"true\" />\r\n <input type=\"file\" #fileInputChat multiple (change)=\"uploadFile.emit($event)\" style=\"display: none;\">\r\n\r\n <div class=\"flex align-items-center justify-content-end w-full gap-2\">\r\n <p-button *ngIf=\"!isRecording\" icon=\"pi pi-microphone\" [text]=\"true\" (click)=\"startRecording.emit()\"\r\n [rounded]=\"true\" />\r\n <p-button *ngIf=\"isRecording\" icon=\"pi pi-stop\" [text]=\"true\" (click)=\"stopRecording.emit()\"\r\n severity=\"danger\" [rounded]=\"true\" />\r\n <p-button icon=\"pi pi-send\" [rounded]=\"true\" type=\"submit\"\r\n [disabled]=\"isLoading || isBotWritting || (!userInput.trim() && (!files || files.length === 0))\" />\r\n </div>\r\n </div>\r\n </form>\r\n</div>","import { Component, Input, inject, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { AgentService } from './services/agent.service';\r\nimport { MessagesComponent } from './components/messages/messages.component';\r\nimport { Skeleton } from 'primeng/skeleton';\r\nimport { combineLatest } from 'rxjs';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { AgentAvatarComponent } from './components/agent-avatar/agent-avatar.component';\r\n\r\n@Component({\r\n selector: 'app-general-agent',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ButtonModule, AgentAvatarComponent, TagModule, ChipModule, MessagesComponent, Skeleton, InputComponent],\r\n templateUrl: './general-agent.component.html',\r\n styleUrl: './general-agent.component.scss',\r\n providers: [AgentService],\r\n host: {\r\n 'class': 'block w-full h-full'\r\n }\r\n})\r\nexport class GeneralAgentComponent implements OnChanges {\r\n\r\n // Propiedades internas (ya no inputs/outputs)\r\n agentService = inject(AgentService);\r\n\r\n messages$ = this.agentService.messages$;\r\n isBotWritting$ = this.agentService.isBotWritting$;\r\n headerConfig$ = this.agentService.headerConfig$;\r\n isRecording$ = this.agentService.isRecording$;\r\n selectedFiles$ = this.agentService.selectedFiles$;\r\n isLoading$ = this.agentService.isLoading$;\r\n vm$ = combineLatest({\r\n header: this.headerConfig$,\r\n files: this.selectedFiles$,\r\n isRec: this.isRecording$,\r\n bot: this.isBotWritting$,\r\n messages: this.messages$,\r\n loading: this.isLoading$\r\n});\r\n\r\n @Input() agentId = '';\r\n @Input() idKatios = '';\r\n /** 'edge' = scroll en el borde del contenedor, 'inline' = scroll pegado al chat */\r\n @Input() scrollMode: 'edge' | 'inline' = 'edge';\r\n\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['agentId'] || changes['idKatios']) {\r\n await this.initAgent();\r\n }\r\n }\r\n\r\n async initAgent(){\r\n this.agentService.agentId = this.agentId;\r\n this.agentService.idKatios = this.idKatios;\r\n await this.agentService.loadAgent();\r\n }\r\n\r\n\r\n \r\n\r\n}\r\n","<ng-container *ngIf=\"vm$ | async as vm\">\r\n <!-- Vista inicial (bienvenida) -->\r\n <div *ngIf=\"agentService.isInitial\" class=\"custom-chat flex flex-column items-center justify-content-center w-full\">\r\n <div class=\"flex flex-column items-center justify-content-center gap-4 p-3 mb-3 text-center md:p-1\">\r\n <h2 *ngIf=\"!vm.loading\" class=\"text-3xl font-semibold text-gray-900 lg:text-4xl\">{{vm.header?.title ||\r\n 'Agente'}}</h2>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"25rem\" height=\"2rem\" borderRadius=\"16px\"></p-skeleton>\r\n <div\r\n class=\"flex items-start justify-content-center gap-2\">\r\n <lib-agent-avatar [size]=\"'large'\"></lib-agent-avatar>\r\n <div *ngIf=\"vm.header?.initialMessages && !vm.loading\" class=\"flex flex-column items-start\">\r\n <div *ngFor=\"let msg of vm.header?.initialMessages\" class=\"text-left\">\r\n <span class=\"m-0 text-gray-700 text-base lg:text-lg\">{{msg}}</span>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-column gap-2\">\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"5rem\" borderRadius=\"16px\"></p-skeleton>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"15rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <p *ngIf=\"!vm.loading\" class=\"text-base text-gray-500\">{{vm.header?.subtitle}}</p>\r\n <p-skeleton *ngIf=\"vm.loading\" width=\"17rem\" borderRadius=\"16px\"></p-skeleton>\r\n </div>\r\n <!-- Input centrado para vista inicial -->\r\n <div class=\"flex flex-column items-center justify-content-center custom-size w-full pt-1 pb-1\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat (con mensajes) -->\r\n <div *ngIf=\"!agentService.isInitial\" class=\"custom-chat chat-layout flex flex-column w-full\">\r\n <!-- Área de mensajes con scroll -->\r\n <div class=\"messages-area flex-1 overflow-hidden\">\r\n <lib-messages [messages]=\"vm.messages || []\" [isBotWritting]=\"vm.bot || false\" [scrollMode]=\"scrollMode\"></lib-messages>\r\n </div>\r\n <!-- Input fijo abajo -->\r\n <div class=\"input-area flex flex-column items-center w-full py-2 px-2 md:px-0\">\r\n <div class=\"custom-size w-full\">\r\n <lib-input [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\" [isBotWritting]=\"vm.bot || false\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\" (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\" (uploadFile)=\"agentService.uploadFile($event)\"></lib-input>\r\n <p class=\"mx-auto text-sm text-gray-600 mt-1 text-center\">{{vm.header?.footer}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { MessagesComponent } from '../messages/messages.component';\r\nimport { InputComponent } from '../input/input.component';\r\nimport { AgentService } from '../../services/agent.service';\r\nimport { combineLatest } from 'rxjs';\r\nimport { ChatMessage } from '../../models/agent.model';\r\n\r\n@Component({\r\n selector: 'lib-bubble-chat',\r\n imports: [CommonModule, MessagesComponent, InputComponent],\r\n templateUrl: './bubble-chat.component.html',\r\n styleUrls: ['./bubble-chat.component.scss'],\r\n providers: [AgentService],\r\n host: {\r\n 'class': 'block w-full h-full',\r\n }\r\n})\r\nexport class BubbleChatComponent implements OnChanges {\r\n agentService = inject(AgentService);\r\n\r\n messages$ = this.agentService.messages$;\r\n isBotWritting$ = this.agentService.isBotWritting$;\r\n headerConfig$ = this.agentService.headerConfig$;\r\n isRecording$ = this.agentService.isRecording$;\r\n selectedFiles$ = this.agentService.selectedFiles$;\r\n isLoading$ = this.agentService.isLoading$;\r\n vm$ = combineLatest({\r\n header: this.headerConfig$,\r\n files: this.selectedFiles$,\r\n isRec: this.isRecording$,\r\n bot: this.isBotWritting$,\r\n messages: this.messages$,\r\n loading: this.isLoading$\r\n });\r\n @Input() agentId = '';\r\n @Input() idKatios = '';\r\n\r\n async ngOnChanges(changes: SimpleChanges) {\r\n if (changes['agentId'] || changes['agentType'] || changes['idKatios']) {\r\n await this.initAgent();\r\n this.addInitialMessages();\r\n }\r\n }\r\n\r\n async initAgent() {\r\n this.agentService.agentId = this.agentId;\r\n this.agentService.idKatios = this.idKatios;\r\n await this.agentService.loadAgent();\r\n }\r\n addInitialMessages() {\r\n const initialMessages: ChatMessage[] = [];\r\n this.agentService.headerConfig?.initialMessages?.map(msg => {\r\n initialMessages.push({\r\n role: 'assistant',\r\n type: 'markdown',\r\n content: msg\r\n });\r\n });\r\n this.agentService.addFullMessages(initialMessages);\r\n }\r\n\r\n}\r\n","<ng-container *ngIf=\"vm$ | async as vm\">\r\n <div class=\"chat-view\">\r\n <div class=\"messages-wrapper\">\r\n <lib-messages [messages]=\"vm.messages\" [isBotWritting]=\"vm.bot || vm.loading\" scrollMode=\"inline\" [agentIcon]=\"vm.header?.avatar || 'pi pi-sparkles'\">\r\n </lib-messages>\r\n </div>\r\n <div class=\"input-wrapper surface-overlay border-top-1 border-surface-200 dark:border-surface-700\">\r\n <lib-input mode=\"bubble\" [files]=\"vm.files || []\" [isRecording]=\"vm.isRec || false\" [isLoading]=\"vm.loading || false\"\r\n [isBotWritting]=\"vm.bot || vm.loading\" [header]=\"vm.header\" (sendInput)=\"agentService.send($event)\"\r\n (startRecording)=\"agentService.startRecording()\" (stopRecording)=\"agentService.stopRecording()\"\r\n (uploadFile)=\"agentService.uploadFile($event)\">\r\n </lib-input>\r\n </div>\r\n </div>\r\n</ng-container>","import { Component, Inject, Input, OnChanges, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { Agent } from '../../models/agent.model';\r\nimport { AI_AGENTS, AiAgentsGatewayService } from '../../../agents-backend.port';\r\nimport { BubbleChatComponent } from '../../components/bubble-chat/bubble-chat.component';\r\nimport { AgentAvatarComponent } from '../../components/agent-avatar/agent-avatar.component';\r\nimport { MessageService } from 'primeng/api';\r\nimport { RobotIconComponent } from '../../components/robot-icon/robot-icon.component';\r\n\r\n\r\n@Component({\r\n selector: 'lib-bubble-agent',\r\n standalone: true,\r\n imports: [CommonModule, ButtonModule, AgentAvatarComponent, BubbleChatComponent, RobotIconComponent],\r\n templateUrl: './bubble-agent.component.html',\r\n styleUrl: './bubble-agent.component.scss'\r\n})\r\nexport class BubbleAgentComponent implements OnChanges, OnDestroy {\r\n @Input() idKatios = '';\r\n @Input() ndoc = '';\r\n @Input() tdoc = '';\r\n\r\n // Estado del componente\r\n isOpen = false;\r\n isExpanded = false;\r\n isMobile = false;\r\n selectedAgent: Agent | null = null;\r\n agents: Agent[] = [];\r\n loading: boolean = false;\r\n\r\n private mobileQuery = matchMedia('(max-width: 768px)');\r\n private mobileListener = (e: MediaQueryListEvent) => {\r\n this.isMobile = e.matches;\r\n if (this.isMobile) this.isExpanded = false;\r\n };\r\n\r\n constructor(\r\n @Inject(AI_AGENTS) private aiAgentsGatewayService: AiAgentsGatewayService,\r\n private messageService: MessageService\r\n ) {\r\n this.isMobile = this.mobileQuery.matches;\r\n this.mobileQuery.addEventListener('change', this.mobileListener);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.mobileQuery.removeEventListener('change', this.mobileListener);\r\n }\r\n\r\n ngOnChanges() {\r\n if (this.idKatios && this.ndoc && this.tdoc) {\r\n this.selectedAgent = null;\r\n this.agents = [];\r\n this.loading = true;\r\n this.aiAgentsGatewayService.getAgents(this.idKatios, this.ndoc, this.tdoc).subscribe({\r\n next: (response) => {\r\n if (response.data) this.agents = response.data;\r\n this.loading = false;\r\n },\r\n error: (err) => {\r\n console.error('Error al cargar agentes desde el servicio:', err);\r\n this.agents = [];\r\n this.messageService.add({ severity: 'error', summary: 'Error', detail: 'No se pudieron cargar los agentes. Por favor, inténtalo de nuevo más tarde.' });\r\n }\r\n });\r\n }\r\n }\r\n\r\n toggleChat() {\r\n this.isOpen = !this.isOpen;\r\n if (!this.isOpen) {\r\n this.isExpanded = false;\r\n }\r\n }\r\n\r\n toggleExpand() {\r\n if (this.isMobile) return;\r\n this.isExpanded = !this.isExpanded;\r\n }\r\n\r\n selectAgent(agent: Agent) {\r\n this.selectedAgent = agent;\r\n }\r\n\r\n goBack() {\r\n this.selectedAgent = null;\r\n }\r\n}\r\n","<!-- Botón burbuja flotante -->\r\n<button class=\"bubble-button shadow-5\" (click)=\"toggleChat()\" [class.is-open]=\"isOpen\">\r\n <i class=\"pi\" [ngClass]=\"isOpen ? 'pi-times' : 'pi-comments'\"></i>\r\n</button>\r\n\r\n<!-- Panel del chat -->\r\n<div class=\"chat-panel surface-overlay\" [class.is-open]=\"isOpen\" [class.is-expanded]=\"isExpanded\">\r\n <!-- Header del panel -->\r\n <div class=\"p-3 chat-header\">\r\n <div class=\"flex align-items-center gap-2\">\r\n <button *ngIf=\"selectedAgent\" class=\"back-button\" (click)=\"goBack()\">\r\n <i class=\"pi pi-arrow-left\"></i>\r\n </button>\r\n <lib-robot-icon style=\"color: white\" *ngIf=\"selectedAgent\"></lib-robot-icon>\r\n <div class=\"header-text\">\r\n <p class=\"header-title text-white font-semibold text-lg\">{{ selectedAgent ? selectedAgent.key : 'Agentes disponibles' }}</p>\r\n </div>\r\n </div>\r\n <div class=\"flex gap-2\">\r\n <button class=\"expand-button\" (click)=\"toggleExpand()\" *ngIf=\"selectedAgent\" title=\"Maximizar/Restaurar\">\r\n <i class=\"pi\" [ngClass]=\"isExpanded ? 'pi-window-minimize' : 'pi-window-maximize'\"></i>\r\n </button>\r\n <button class=\"close-button\" (click)=\"toggleChat()\" title=\"Cerrar\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Contenido del panel -->\r\n <div class=\"chat-content\">\r\n <!-- Vista de lista de agentes -->\r\n <div *ngIf=\"!selectedAgent\" class=\"agents-list\">\r\n <!-- Mensaje cuando no hay agentes -->\r\n <div *ngIf=\"!agents || agents.length === 0 || loading\" class=\"no-agents\">\r\n <i class=\"pi text-4xl text-gray-400\" [ngClass]=\"loading ? 'pi-spin pi-cog' : 'pi-users'\"></i>\r\n <p class=\"text-color-secondary mt-2\">{{ loading ? 'Cargando agentes...' : 'No se encontraron agentes' }}</p>\r\n </div>\r\n <!-- Lista de agentes -->\r\n <div class=\"agent-card border-bottom-1 surface-border hover:surface-ground\" *ngFor=\"let agent of agents\" (click)=\"selectAgent(agent)\">\r\n <lib-agent-avatar \r\n [size]=\"'large'\">\r\n </lib-agent-avatar>\r\n <div class=\"agent-info\">\r\n <p class=\"agent-name text-base font-medium\">{{ agent.key }}</p>\r\n <p class=\"agent-description text-sm text-color-secondary\">{{ agent.label }}</p>\r\n </div>\r\n <i class=\"pi pi-chevron-right agent-arrow\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- Vista de chat con el agente seleccionado -->\r\n <lib-bubble-chat *ngIf=\"selectedAgent\" \r\n [agentId]=\"selectedAgent.valor.agentId || ''\" \r\n [idKatios]=\"idKatios\">\r\n </lib-bubble-chat>\r\n </div>\r\n</div>\r\n","/*\r\n * Public API Surface of general-agent\r\n */\r\n\r\nexport * from './lib/general-agent/general-agent.component';\r\nexport * from './lib/agents-backend.port';\r\nexport * from './lib/general-agent/agents/bubble-chat/bubble-agent.component';\r\nexport * from './lib/general-agent/components/bubble-chat/bubble-chat.component';\r\nexport * from './lib/general-agent/components/agent-avatar/agent-avatar.component';\r\nexport * from './lib/general-agent/components/robot-icon/robot-icon.component'\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
@@ -1,21 +1,27 @@
1
- import { OnChanges } from '@angular/core';
1
+ import { OnChanges, OnDestroy } from '@angular/core';
2
2
  import { Agent } from '../../models/agent.model';
3
3
  import { AiAgentsGatewayService } from '../../../agents-backend.port';
4
4
  import { MessageService } from 'primeng/api';
5
5
  import * as i0 from "@angular/core";
6
- export declare class BubbleAgentComponent implements OnChanges {
6
+ export declare class BubbleAgentComponent implements OnChanges, OnDestroy {
7
7
  private aiAgentsGatewayService;
8
8
  private messageService;
9
9
  idKatios: string;
10
10
  ndoc: string;
11
11
  tdoc: string;
12
12
  isOpen: boolean;
13
+ isExpanded: boolean;
14
+ isMobile: boolean;
13
15
  selectedAgent: Agent | null;
14
16
  agents: Agent[];
15
17
  loading: boolean;
18
+ private mobileQuery;
19
+ private mobileListener;
16
20
  constructor(aiAgentsGatewayService: AiAgentsGatewayService, messageService: MessageService);
21
+ ngOnDestroy(): void;
17
22
  ngOnChanges(): void;
18
23
  toggleChat(): void;
24
+ toggleExpand(): void;
19
25
  selectAgent(agent: Agent): void;
20
26
  goBack(): void;
21
27
  static ɵfac: i0.ɵɵFactoryDeclaration<BubbleAgentComponent, never>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sf-aiembedded",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "GeneralAgent UI (standalone) para Angular",
5
5
  "author": "camila.torres@nhubex.com",
6
6
  "license": "MIT",