sf-aiembedded 0.3.1 → 0.3.2
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.
|
@@ -193,6 +193,7 @@ class AgentService {
|
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
195
|
async send(userInput) {
|
|
196
|
+
console.log(this.selectedFiles);
|
|
196
197
|
this.isBotWritting = true;
|
|
197
198
|
let text = userInput.trim();
|
|
198
199
|
try {
|
|
@@ -200,18 +201,27 @@ class AgentService {
|
|
|
200
201
|
this.isBotWritting = false;
|
|
201
202
|
return;
|
|
202
203
|
}
|
|
203
|
-
|
|
204
|
-
this.
|
|
205
|
-
|
|
204
|
+
const messagesToAdd = [];
|
|
205
|
+
if (this.selectedFiles.length > 0) {
|
|
206
|
+
messagesToAdd.push({
|
|
207
|
+
role: 'user',
|
|
208
|
+
type: 'file',
|
|
209
|
+
content: this.selectedFiles
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
messagesToAdd.push({ role: 'user', type: 'text', content: text });
|
|
213
|
+
this.addFullMessages(messagesToAdd);
|
|
214
|
+
//this.addMessage({ role: 'user', type: 'text', content: text });
|
|
215
|
+
const filesToSend = this.selectedFiles && this.selectedFiles.length > 0 ? await this.convertFilesToAttachments(this.selectedFiles) : [];
|
|
206
216
|
const requestData = {
|
|
207
217
|
conversationId: this.sessionId,
|
|
208
218
|
text,
|
|
209
|
-
files:
|
|
219
|
+
files: filesToSend,
|
|
210
220
|
metadata: this.aiAgentsGatewayService.metadata || {}
|
|
211
221
|
};
|
|
222
|
+
this.selectedFiles = [];
|
|
212
223
|
const response = await this.aiAgentsGatewayService.sendMessage(this.idKatios, this.agentId, requestData);
|
|
213
224
|
//this.userInput = '';
|
|
214
|
-
this.selectedFiles = [];
|
|
215
225
|
// Asegurar que Angular detecte los cambios después del await
|
|
216
226
|
if (response.success) {
|
|
217
227
|
this.sessionId = response.data.conversationId;
|
|
@@ -335,10 +345,10 @@ class AgentService {
|
|
|
335
345
|
}
|
|
336
346
|
}
|
|
337
347
|
}
|
|
338
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
339
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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 });
|
|
340
350
|
}
|
|
341
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
351
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentService, decorators: [{
|
|
342
352
|
type: Injectable
|
|
343
353
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
344
354
|
type: Inject,
|
|
@@ -349,10 +359,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
|
|
|
349
359
|
class TextComponent {
|
|
350
360
|
text = '';
|
|
351
361
|
role = '';
|
|
352
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
353
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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 }] });
|
|
354
364
|
}
|
|
355
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TextComponent, decorators: [{
|
|
356
366
|
type: Component,
|
|
357
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>" }]
|
|
358
368
|
}], propDecorators: { text: [{
|
|
@@ -410,10 +420,10 @@ class FileComponent {
|
|
|
410
420
|
return 'col-12 sm:col-6 md:col-4';
|
|
411
421
|
}
|
|
412
422
|
}
|
|
413
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
414
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
415
425
|
}
|
|
416
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
426
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: FileComponent, decorators: [{
|
|
417
427
|
type: Component,
|
|
418
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"] }]
|
|
419
429
|
}], propDecorators: { files: [{
|
|
@@ -426,10 +436,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
|
|
|
426
436
|
|
|
427
437
|
class TableComponent {
|
|
428
438
|
table = "";
|
|
429
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
430
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
431
441
|
}
|
|
432
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TableComponent, decorators: [{
|
|
433
443
|
type: Component,
|
|
434
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>" }]
|
|
435
445
|
}], propDecorators: { table: [{
|
|
@@ -471,10 +481,10 @@ class MarkdownComponent {
|
|
|
471
481
|
this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(rawHtml);
|
|
472
482
|
}
|
|
473
483
|
}
|
|
474
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
475
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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 });
|
|
476
486
|
}
|
|
477
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
487
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MarkdownComponent, decorators: [{
|
|
478
488
|
type: Component,
|
|
479
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"] }]
|
|
480
490
|
}], ctorParameters: () => [{ type: i1$1.DomSanitizer }], propDecorators: { content: [{
|
|
@@ -482,10 +492,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
|
|
|
482
492
|
}] } });
|
|
483
493
|
|
|
484
494
|
class RobotIconComponent {
|
|
485
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
486
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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: [""] });
|
|
487
497
|
}
|
|
488
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
498
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RobotIconComponent, decorators: [{
|
|
489
499
|
type: Component,
|
|
490
500
|
args: [{ selector: 'lib-robot-icon', imports: [], host: {
|
|
491
501
|
style: 'display: inline-flex; width: 1.5em; height: 1.5em;'
|
|
@@ -494,10 +504,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
|
|
|
494
504
|
|
|
495
505
|
class AgentAvatarComponent {
|
|
496
506
|
size = 'large';
|
|
497
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
498
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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" }] });
|
|
499
509
|
}
|
|
500
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
510
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AgentAvatarComponent, decorators: [{
|
|
501
511
|
type: Component,
|
|
502
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"] }]
|
|
503
513
|
}], propDecorators: { size: [{
|
|
@@ -519,10 +529,10 @@ class MessagesComponent {
|
|
|
519
529
|
const el = this.chatContainer.nativeElement;
|
|
520
530
|
el.scrollTo({ top: el.scrollHeight, behavior });
|
|
521
531
|
}
|
|
522
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
523
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
524
534
|
}
|
|
525
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
535
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: MessagesComponent, decorators: [{
|
|
526
536
|
type: Component,
|
|
527
537
|
args: [{ selector: 'lib-messages', imports: [CommonModule, FormsModule, ButtonModule, TextComponent, FileComponent, TableComponent, MarkdownComponent, AgentAvatarComponent, MessageModule], host: {
|
|
528
538
|
'class': 'block h-full w-full overflow-hidden'
|
|
@@ -572,10 +582,10 @@ class InputComponent {
|
|
|
572
582
|
this.sendInput.emit(trimmedInput);
|
|
573
583
|
this.userInput = '';
|
|
574
584
|
}
|
|
575
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
576
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
577
587
|
}
|
|
578
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
588
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: InputComponent, decorators: [{
|
|
579
589
|
type: Component,
|
|
580
590
|
args: [{ selector: 'lib-input', imports: [CommonModule, FormsModule, ButtonModule, Textarea, ChipModule, FileComponent], host: {
|
|
581
591
|
'class': 'block w-full',
|
|
@@ -635,10 +645,10 @@ class GeneralAgentComponent {
|
|
|
635
645
|
this.agentService.idKatios = this.idKatios;
|
|
636
646
|
await this.agentService.loadAgent();
|
|
637
647
|
}
|
|
638
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
639
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
640
650
|
}
|
|
641
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
651
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: GeneralAgentComponent, decorators: [{
|
|
642
652
|
type: Component,
|
|
643
653
|
args: [{ selector: 'app-general-agent', standalone: true, imports: [CommonModule, FormsModule, ButtonModule, AgentAvatarComponent, TagModule, ChipModule, MessagesComponent, Skeleton, InputComponent], providers: [AgentService], host: {
|
|
644
654
|
'class': 'block w-full h-full'
|
|
@@ -691,10 +701,10 @@ class BubbleChatComponent {
|
|
|
691
701
|
});
|
|
692
702
|
this.agentService.addFullMessages(initialMessages);
|
|
693
703
|
}
|
|
694
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
695
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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"] }] });
|
|
696
706
|
}
|
|
697
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
707
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleChatComponent, decorators: [{
|
|
698
708
|
type: Component,
|
|
699
709
|
args: [{ selector: 'lib-bubble-chat', imports: [CommonModule, MessagesComponent, InputComponent], providers: [AgentService], host: {
|
|
700
710
|
'class': 'block w-full h-full',
|
|
@@ -753,10 +763,10 @@ class BubbleAgentComponent {
|
|
|
753
763
|
goBack() {
|
|
754
764
|
this.selectedAgent = null;
|
|
755
765
|
}
|
|
756
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
757
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
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" }] });
|
|
758
768
|
}
|
|
759
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
769
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: BubbleAgentComponent, decorators: [{
|
|
760
770
|
type: Component,
|
|
761
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"] }]
|
|
762
772
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
@@ -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 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\r\n // 2️⃣ Pintar mensaje usuario\r\n this.addMessage({ role: 'user', type: 'text', content: text });\r\n\r\n // 3️⃣ Enviar SOLO texto al agente\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 //this.userInput = '';\r\n this.selectedFiles = [];\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, 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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"}
|