From 6b0a5be1afee0160a7f97f911e04b4aec34c7f1e Mon Sep 17 00:00:00 2001
From: Deep Blue
Date: Tue, 19 Dec 2023 07:16:43 -0600
Subject: [PATCH] Render quick replies in chat-box.
---
.../Agents/Models/Agent.cs | 4 +-
.../Messaging/IRichMessage.cs | 2 +
.../RichContentJsonConverter .cs | 2 +-
.../TemplateMessageJsonConverter.cs | 2 +-
.../Models/RichContent/RichContent.cs | 10 +
.../BotSharp.OpenAPI/BotSharp.OpenAPI.csproj | 2 +
.../BotSharpOpenApiExtensions.cs | 48 ++
.../Conversations/ChatResponseModel.cs | 13 +-
.../Hooks/ChatHubConversationHook.cs | 30 +-
.../Services/MessageHandleService.cs | 2 +-
.../BotSharp.Plugin.RoutingSpeeder.csproj | 2 +-
.../Models/DialoguePredictionModel.cs | 6 +-
src/WebStarter/Program.cs | 40 +-
src/WebStarter/WebStarter.csproj | 2 -
.../templates/welcome.liquid | 15 +-
src/web-live-chat/package-lock.json | 496 ++++++++++++------
src/web-live-chat/src/lib/helpers/typedefs.js | 54 ++
.../src/lib/scss/_variables.scss | 2 +-
.../src/lib/services/signalr-service.js | 3 +-
.../[conversationId]/chat-box.svelte | 12 +-
.../[conversationId]/rc-quick-reply.svelte | 12 +
.../[agentId]/[conversationId]/rc-text.svelte | 6 +
.../static/images/users/chatbot.png | Bin 0 -> 3403 bytes
23 files changed, 521 insertions(+), 244 deletions(-)
rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/RichContentJsonConverter .cs (89%)
rename src/Infrastructure/BotSharp.Abstraction/Messaging/{ => JsonConverters}/TemplateMessageJsonConverter.cs (89%)
create mode 100644 src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
create mode 100644 src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
create mode 100644 src/web-live-chat/static/images/users/chatbot.png
diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
index f6e10fd0..251af6b0 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Agents/Models/Agent.cs
@@ -21,7 +21,7 @@ public class Agent
/// Instruction
///
[JsonIgnore]
- public string Instruction { get; set; }
+ public string? Instruction { get; set; }
///
/// Templates
@@ -52,7 +52,7 @@ public class Agent
/// Domain knowledges
///
[JsonIgnore]
- public string Knowledges { get; set; }
+ public string? Knowledges { get; set; }
public bool IsPublic { get; set; }
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
index c81f7e91..fb87f381 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/IRichMessage.cs
@@ -3,5 +3,7 @@ namespace BotSharp.Abstraction.Messaging;
public interface IRichMessage
{
string Text { get; set; }
+
+ [JsonPropertyName("rich_type")]
string RichType => "text";
}
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
similarity index 89%
rename from src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs
rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
index 5234f7fd..7f01132e 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/RichContentJsonConverter .cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/RichContentJsonConverter .cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace BotSharp.Abstraction.Messaging;
+namespace BotSharp.Abstraction.Messaging.JsonConverters;
public class RichContentJsonConverter : JsonConverter
{
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
similarity index 89%
rename from src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs
rename to src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
index 36e68a71..9b990193 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/TemplateMessageJsonConverter.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/JsonConverters/TemplateMessageJsonConverter.cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace BotSharp.Abstraction.Messaging;
+namespace BotSharp.Abstraction.Messaging.JsonConverters;
public class TemplateMessageJsonConverter : JsonConverter
{
diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
index 61a89af8..95f4e6e9 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/RichContent.cs
@@ -9,4 +9,14 @@ public class RichContent where T : IRichMessage
[JsonPropertyName("messaging_type")]
public string MessagingType => "RESPONSE";
public T Message { get; set; }
+
+ public RichContent()
+ {
+
+ }
+
+ public RichContent(T message)
+ {
+ Message = message;
+ }
}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
index cef8a0e6..2df5badd 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
+++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharp.OpenAPI.csproj
@@ -11,6 +11,8 @@
+
+
diff --git a/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
new file mode 100644
index 00000000..89d7b099
--- /dev/null
+++ b/src/Infrastructure/BotSharp.OpenAPI/BotSharpOpenApiExtensions.cs
@@ -0,0 +1,48 @@
+using BotSharp.Abstraction.Messaging.JsonConverters;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.Extensions.Configuration;
+using Microsoft.IdentityModel.Tokens;
+
+namespace BotSharp.OpenAPI;
+
+public static class BotSharpOpenApiExtensions
+{
+ public static IServiceCollection AddBotSharpOpenAPI(this IServiceCollection services, IConfiguration config)
+ {
+ // Add services to the container.
+ services.AddControllers()
+ .AddJsonOptions(options =>
+ {
+ options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter());
+ options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter());
+ });
+
+ // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+ services.AddEndpointsApiExplorer();
+ services.AddSwaggerGen();
+
+ services.AddHttpContextAccessor();
+
+ // Add bearer authentication
+ services.AddAuthentication(options =>
+ {
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
+ }).AddJwtBearer(o =>
+ {
+ o.TokenValidationParameters = new TokenValidationParameters
+ {
+ ValidIssuer = config["Jwt:Issuer"],
+ ValidAudience = config["Jwt:Audience"],
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:Key"])),
+ ValidateIssuer = true,
+ ValidateAudience = true,
+ ValidateLifetime = false,
+ ValidateIssuerSigningKey = true
+ };
+ });
+
+ return services;
+ }
+}
diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
index 6fda2ade..cf71b8f9 100644
--- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
+++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Conversations/ChatResponseModel.cs
@@ -1,6 +1,7 @@
using BotSharp.Abstraction.Functions.Models;
using BotSharp.Abstraction.Instructs.Models;
-using BotSharp.OpenAPI.ViewModels.Users;
+using BotSharp.Abstraction.Messaging;
+using BotSharp.Abstraction.Messaging.Models.RichContent;
using System.Text.Json.Serialization;
namespace BotSharp.OpenAPI.ViewModels.Conversations;
@@ -8,24 +9,24 @@ namespace BotSharp.OpenAPI.ViewModels.Conversations;
public class ChatResponseModel : InstructResult
{
[JsonPropertyName("conversation_id")]
- public string ConversationId { get; set; }
+ public string ConversationId { get; set; } = string.Empty;
- public UserViewModel Sender { get; set; }
+ public UserViewModel Sender { get; set; } = new UserViewModel();
- public string Function { get; set; }
+ public string? Function { get; set; }
///
/// Planner instruction
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public FunctionCallFromLlm Instruction { get; set; }
+ public FunctionCallFromLlm? Instruction { get; set; }
///
/// Rich message for UI rendering
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
[JsonPropertyName("rich_content")]
- public object? RichContent { get; set; }
+ public RichContent? RichContent { get; set; }
[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
index 766ca858..590e65f2 100644
--- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
+++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs
@@ -1,6 +1,8 @@
using BotSharp.Abstraction.Messaging;
+using BotSharp.Abstraction.Messaging.JsonConverters;
using BotSharp.Abstraction.Messaging.Models.RichContent;
using Microsoft.AspNetCore.SignalR;
+using System.Text.Json.Serialization.Metadata;
namespace BotSharp.Plugin.ChatHub.Hooks;
@@ -9,7 +11,7 @@ public class ChatHubConversationHook : ConversationHookBase
private readonly IServiceProvider _services;
private readonly IHubContext _chatHub;
private readonly IUserIdentity _user;
-
+ private readonly JsonSerializerOptions _serializerOptions;
public ChatHubConversationHook(IServiceProvider services,
IHubContext chatHub,
IUserIdentity user)
@@ -17,15 +19,25 @@ public class ChatHubConversationHook : ConversationHookBase
_services = services;
_chatHub = chatHub;
_user = user;
+
+ _serializerOptions = new JsonSerializerOptions
+ {
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+ Converters =
+ {
+ new RichContentJsonConverter(),
+ new TemplateMessageJsonConverter(),
+ }
+ };
}
public override async Task OnUserAgentConnectedInitially(Conversation conversation)
{
- var agentService = _services.GetService();
+ var agentService = _services.GetRequiredService();
var agent = await agentService.LoadAgent(conversation.AgentId);
// Check if the Welcome template exists.
- var welcomeTemplate = agent.Templates.FirstOrDefault(x => x.Name == "welcome");
+ var welcomeTemplate = agent.Templates?.FirstOrDefault(x => x.Name == "welcome");
if (welcomeTemplate != null)
{
var richContentService = _services.GetRequiredService();
@@ -33,19 +45,22 @@ public class ChatHubConversationHook : ConversationHookBase
foreach (var message in messages)
{
- await Task.Delay(300);
-
- await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", new ChatResponseModel()
+ var json = JsonSerializer.Serialize(new ChatResponseModel()
{
ConversationId = conversation.Id,
Text = message.Text,
+ RichContent = new RichContent(message),
Sender = new UserViewModel()
{
FirstName = "AI",
LastName = "Assistant",
Role = AgentRole.Assistant
}
- });
+ }, _serializerOptions);
+
+ await Task.Delay(300);
+
+ await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json);
}
}
@@ -92,6 +107,7 @@ public class ChatHubConversationHook : ConversationHookBase
ConversationId = conv.ConversationId,
MessageId = message.MessageId,
Text = message.Content,
+ RichContent = message.RichContent,
Sender = new UserViewModel()
{
FirstName = "AI",
diff --git a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
index bf83ea70..242b5cea 100644
--- a/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
+++ b/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs
@@ -1,7 +1,7 @@
using BotSharp.Abstraction.Agents.Enums;
using BotSharp.Abstraction.Conversations.Enums;
+using BotSharp.Abstraction.Messaging.JsonConverters;
using BotSharp.Abstraction.Messaging.Models.RichContent;
-using BotSharp.Abstraction.Utilities;
using System.Text.Json.Serialization.Metadata;
namespace BotSharp.Plugin.MetaMessenger.Services;
diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
index cc28ea40..63a83977 100644
--- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
+++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/BotSharp.Plugin.RoutingSpeeder.csproj
@@ -6,7 +6,7 @@
$(LangVersion)
$(BotSharpVersion)
$(GeneratePackageOnBuild)
- True
+ $(GenerateDocumentationFile)
diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
index 36b7c38c..a061fe61 100644
--- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
+++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/Models/DialoguePredictionModel.cs
@@ -1,13 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
namespace BotSharp.Plugin.RoutingSpeeder.Providers.Models;
public class DialoguePredictionModel
{
public int Id { get; set; }
- public string Text { get; set; }
+ public string Text { get; set; } = string.Empty;
public string? Label { get; set; }
public string? Prediction { get; set; }
}
diff --git a/src/WebStarter/Program.cs b/src/WebStarter/Program.cs
index c8ba1a94..3da77ad9 100644
--- a/src/WebStarter/Program.cs
+++ b/src/WebStarter/Program.cs
@@ -1,53 +1,17 @@
-using BotSharp.Abstraction.Messaging;
using BotSharp.Abstraction.Users;
using BotSharp.Core;
+using BotSharp.OpenAPI;
using BotSharp.Core.Users.Services;
using BotSharp.Logger;
using BotSharp.Plugin.ChatHub;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.IdentityModel.Tokens;
-using System.Text;
var builder = WebApplication.CreateBuilder(args);
-// Add services to the container.
-builder.Services.AddControllers()
- .AddJsonOptions(options =>
- {
- options.JsonSerializerOptions.Converters.Add(new RichContentJsonConverter());
- options.JsonSerializerOptions.Converters.Add(new TemplateMessageJsonConverter());
- });
-
-// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
-builder.Services.AddEndpointsApiExplorer();
-builder.Services.AddSwaggerGen();
-
-builder.Services.AddHttpContextAccessor();
-
-// Add bearer authentication
-builder.Services.AddAuthentication(options =>
-{
- options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
- options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
-}).AddJwtBearer(o =>
-{
- o.TokenValidationParameters = new TokenValidationParameters
- {
- ValidIssuer = builder.Configuration["Jwt:Issuer"],
- ValidAudience = builder.Configuration["Jwt:Audience"],
- IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),
- ValidateIssuer = true,
- ValidateAudience = true,
- ValidateLifetime = false,
- ValidateIssuerSigningKey = true
- };
-});
-
builder.Services.AddScoped();
// Add BotSharp
builder.Services.AddBotSharpCore(builder.Configuration);
+builder.Services.AddBotSharpOpenAPI(builder.Configuration);
builder.Services.AddBotSharpLogger(builder.Configuration);
builder.Services.AddCors(options =>
diff --git a/src/WebStarter/WebStarter.csproj b/src/WebStarter/WebStarter.csproj
index 767af598..1e47e808 100644
--- a/src/WebStarter/WebStarter.csproj
+++ b/src/WebStarter/WebStarter.csproj
@@ -39,9 +39,7 @@
-
-
diff --git a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
index 6a0b2780..beabbccc 100644
--- a/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
+++ b/src/WebStarter/data/agents/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/templates/welcome.liquid
@@ -3,6 +3,17 @@
"text": "Hello, I'm an AI assistant that help you do variety of tasks."
},
{
- "text": "How can I help you today?"
- }
+ "rich_type": "quick_reply",
+ "text": "How can I help you today?",
+ "quick_replies": [
+ {
+ "title":"Order a pizza",
+ "payload":"order a pizza"
+ },
+ {
+ "title":"Who are you?",
+ "payload":"who are you?"
+ }
+ ]
+ }
]
\ No newline at end of file
diff --git a/src/web-live-chat/package-lock.json b/src/web-live-chat/package-lock.json
index c28973b0..0f233357 100644
--- a/src/web-live-chat/package-lock.json
+++ b/src/web-live-chat/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.1.0",
"dependencies": {
"@microsoft/signalr": "^8.0.0",
- "@sveltejs/adapter-static": "^2.0.3",
+ "@sveltejs/adapter-static": "^3.0.0",
"axios": "^1.6.2",
"bootstrap": "^5.3.2",
"overlayscrollbars": "^2.4.4",
@@ -17,8 +17,9 @@
"sveltestrap": "^5.11.2"
},
"devDependencies": {
- "@sveltejs/adapter-auto": "^2.0.0",
- "@sveltejs/kit": "^1.27.6",
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.0.0",
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-svelte": "^2.30.0",
@@ -28,7 +29,7 @@
"svelte": "^4.2.8",
"svelte-check": "^3.6.0",
"typescript": "^5.0.0",
- "vite": "^4.5.1"
+ "vite": "^5.0.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -53,9 +54,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
- "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz",
+ "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==",
"cpu": [
"arm"
],
@@ -68,9 +69,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
- "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz",
+ "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==",
"cpu": [
"arm64"
],
@@ -83,9 +84,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
- "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz",
+ "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==",
"cpu": [
"x64"
],
@@ -98,9 +99,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
- "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz",
+ "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==",
"cpu": [
"arm64"
],
@@ -113,9 +114,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
- "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz",
+ "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==",
"cpu": [
"x64"
],
@@ -128,9 +129,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
- "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz",
+ "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==",
"cpu": [
"arm64"
],
@@ -143,9 +144,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
- "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz",
+ "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==",
"cpu": [
"x64"
],
@@ -158,9 +159,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
- "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz",
+ "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==",
"cpu": [
"arm"
],
@@ -173,9 +174,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
- "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz",
+ "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==",
"cpu": [
"arm64"
],
@@ -188,9 +189,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
- "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz",
+ "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==",
"cpu": [
"ia32"
],
@@ -203,9 +204,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
- "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz",
+ "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==",
"cpu": [
"loong64"
],
@@ -218,9 +219,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
- "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz",
+ "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==",
"cpu": [
"mips64el"
],
@@ -233,9 +234,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
- "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz",
+ "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==",
"cpu": [
"ppc64"
],
@@ -248,9 +249,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
- "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz",
+ "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==",
"cpu": [
"riscv64"
],
@@ -263,9 +264,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
- "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz",
+ "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==",
"cpu": [
"s390x"
],
@@ -278,9 +279,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
- "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz",
+ "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==",
"cpu": [
"x64"
],
@@ -293,9 +294,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
- "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==",
"cpu": [
"x64"
],
@@ -308,9 +309,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
- "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz",
+ "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==",
"cpu": [
"x64"
],
@@ -323,9 +324,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
- "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz",
+ "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==",
"cpu": [
"x64"
],
@@ -338,9 +339,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
- "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz",
+ "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==",
"cpu": [
"arm64"
],
@@ -353,9 +354,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
- "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz",
+ "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==",
"cpu": [
"ia32"
],
@@ -368,9 +369,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
- "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz",
+ "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==",
"cpu": [
"x64"
],
@@ -438,14 +439,6 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/@fastify/busboy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
- "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.13",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@@ -583,98 +576,253 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz",
+ "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz",
+ "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz",
+ "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz",
+ "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz",
+ "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz",
+ "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz",
+ "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz",
+ "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz",
+ "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz",
+ "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz",
+ "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz",
+ "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz",
+ "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@sveltejs/adapter-auto": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz",
- "integrity": "sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.0.0.tgz",
+ "integrity": "sha512-UNWSs/rOReBRfI/xFwSO2WYF1a7PT74SrWOHJmSNLY3Lq+zbH0uuvnlP+TmrTUBvOTkou3WJDjL6lK3n6aOUgQ==",
"dev": true,
"dependencies": {
"import-meta-resolve": "^4.0.0"
},
"peerDependencies": {
- "@sveltejs/kit": "^1.0.0"
+ "@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/adapter-static": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz",
- "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.0.tgz",
+ "integrity": "sha512-nNsm8XChhJgQdeVegdXU+EnpznSUlsIjlLJa9SNmvSVN3rcPtB2BAnGuS/EWCtgPLkVcy9V2kW5knronqmF+KQ==",
"peerDependencies": {
- "@sveltejs/kit": "^1.5.0"
+ "@sveltejs/kit": "^2.0.0"
}
},
"node_modules/@sveltejs/kit": {
- "version": "1.27.7",
- "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.7.tgz",
- "integrity": "sha512-AzXYDoYt42clCBwLF9GTHsXyg2DFR31Ncyt8yxu8Aw4tgB433V+w+hcr1RTfAN9zKW2J2PY9FMQ8FoX/4Vw8CA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.3.tgz",
+ "integrity": "sha512-TjqRBC7I3qnGeRfmxAkkwbQVnto9x+DsSDTtHC4qC+MgHPImIVzSgUiw//tZ3/uB5/MXhGNLhi5mztWZVM0sjw==",
"hasInstallScript": true,
"dependencies": {
- "@sveltejs/vite-plugin-svelte": "^2.5.0",
- "@types/cookie": "^0.5.1",
- "cookie": "^0.5.0",
- "devalue": "^4.3.1",
+ "@types/cookie": "^0.6.0",
+ "cookie": "^0.6.0",
+ "devalue": "^4.3.2",
"esm-env": "^1.0.0",
"kleur": "^4.1.5",
- "magic-string": "^0.30.0",
+ "magic-string": "^0.30.5",
"mrmime": "^1.0.1",
"sade": "^1.8.1",
"set-cookie-parser": "^2.6.0",
- "sirv": "^2.0.2",
- "tiny-glob": "^0.2.9",
- "undici": "~5.26.2"
+ "sirv": "^2.0.3",
+ "tiny-glob": "^0.2.9"
},
"bin": {
"svelte-kit": "svelte-kit.js"
},
"engines": {
- "node": "^16.14 || >=18"
+ "node": ">=18.13"
},
"peerDependencies": {
- "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0",
- "vite": "^4.0.0"
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.3"
}
},
- "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz",
- "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==",
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz",
+ "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==",
"dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4",
+ "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0",
"debug": "^4.3.4",
"deepmerge": "^4.3.1",
"kleur": "^4.1.5",
- "magic-string": "^0.30.3",
+ "magic-string": "^0.30.5",
"svelte-hmr": "^0.15.3",
- "vitefu": "^0.2.4"
+ "vitefu": "^0.2.5"
},
"engines": {
- "node": "^14.18.0 || >= 16"
+ "node": "^18.0.0 || >=20"
},
"peerDependencies": {
- "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0",
- "vite": "^4.0.0"
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
}
},
- "node_modules/@sveltejs/kit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz",
- "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==",
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz",
+ "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==",
"dependencies": {
"debug": "^4.3.4"
},
"engines": {
- "node": "^14.18.0 || >= 16"
+ "node": "^18.0.0 || >=20"
},
"peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^2.2.0",
- "svelte": "^3.54.0 || ^4.0.0",
- "vite": "^4.0.0"
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.0"
}
},
"node_modules/@types/cookie": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz",
- "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA=="
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
},
"node_modules/@types/estree": {
"version": "1.0.5",
@@ -990,9 +1138,9 @@
"dev": true
},
"node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"engines": {
"node": ">= 0.6"
}
@@ -1114,9 +1262,9 @@
"dev": true
},
"node_modules/esbuild": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
- "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz",
+ "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
@@ -1125,28 +1273,28 @@
"node": ">=12"
},
"optionalDependencies": {
- "@esbuild/android-arm": "0.18.20",
- "@esbuild/android-arm64": "0.18.20",
- "@esbuild/android-x64": "0.18.20",
- "@esbuild/darwin-arm64": "0.18.20",
- "@esbuild/darwin-x64": "0.18.20",
- "@esbuild/freebsd-arm64": "0.18.20",
- "@esbuild/freebsd-x64": "0.18.20",
- "@esbuild/linux-arm": "0.18.20",
- "@esbuild/linux-arm64": "0.18.20",
- "@esbuild/linux-ia32": "0.18.20",
- "@esbuild/linux-loong64": "0.18.20",
- "@esbuild/linux-mips64el": "0.18.20",
- "@esbuild/linux-ppc64": "0.18.20",
- "@esbuild/linux-riscv64": "0.18.20",
- "@esbuild/linux-s390x": "0.18.20",
- "@esbuild/linux-x64": "0.18.20",
- "@esbuild/netbsd-x64": "0.18.20",
- "@esbuild/openbsd-x64": "0.18.20",
- "@esbuild/sunos-x64": "0.18.20",
- "@esbuild/win32-arm64": "0.18.20",
- "@esbuild/win32-ia32": "0.18.20",
- "@esbuild/win32-x64": "0.18.20"
+ "@esbuild/android-arm": "0.19.9",
+ "@esbuild/android-arm64": "0.19.9",
+ "@esbuild/android-x64": "0.19.9",
+ "@esbuild/darwin-arm64": "0.19.9",
+ "@esbuild/darwin-x64": "0.19.9",
+ "@esbuild/freebsd-arm64": "0.19.9",
+ "@esbuild/freebsd-x64": "0.19.9",
+ "@esbuild/linux-arm": "0.19.9",
+ "@esbuild/linux-arm64": "0.19.9",
+ "@esbuild/linux-ia32": "0.19.9",
+ "@esbuild/linux-loong64": "0.19.9",
+ "@esbuild/linux-mips64el": "0.19.9",
+ "@esbuild/linux-ppc64": "0.19.9",
+ "@esbuild/linux-riscv64": "0.19.9",
+ "@esbuild/linux-s390x": "0.19.9",
+ "@esbuild/linux-x64": "0.19.9",
+ "@esbuild/netbsd-x64": "0.19.9",
+ "@esbuild/openbsd-x64": "0.19.9",
+ "@esbuild/sunos-x64": "0.19.9",
+ "@esbuild/win32-arm64": "0.19.9",
+ "@esbuild/win32-ia32": "0.19.9",
+ "@esbuild/win32-x64": "0.19.9"
}
},
"node_modules/escape-string-regexp": {
@@ -2426,17 +2574,30 @@
}
},
"node_modules/rollup": {
- "version": "3.29.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
- "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz",
+ "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=14.18.0",
+ "node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.9.1",
+ "@rollup/rollup-android-arm64": "4.9.1",
+ "@rollup/rollup-darwin-arm64": "4.9.1",
+ "@rollup/rollup-darwin-x64": "4.9.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.9.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.9.1",
+ "@rollup/rollup-linux-arm64-musl": "4.9.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.9.1",
+ "@rollup/rollup-linux-x64-gnu": "4.9.1",
+ "@rollup/rollup-linux-x64-musl": "4.9.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.9.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.9.1",
+ "@rollup/rollup-win32-x64-msvc": "4.9.1",
"fsevents": "~2.3.2"
}
},
@@ -2904,17 +3065,6 @@
"node": ">=14.17"
}
},
- "node_modules/undici": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz",
- "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==",
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
"node_modules/universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
@@ -2948,28 +3098,28 @@
"dev": true
},
"node_modules/vite": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
- "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz",
+ "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==",
"dependencies": {
- "esbuild": "^0.18.10",
- "postcss": "^8.4.27",
- "rollup": "^3.27.1"
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.32",
+ "rollup": "^4.2.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
+ "node": "^18.0.0 || >=20.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
- "fsevents": "~2.3.2"
+ "fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": ">= 14",
+ "@types/node": "^18.0.0 || >=20.0.0",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
diff --git a/src/web-live-chat/src/lib/helpers/typedefs.js b/src/web-live-chat/src/lib/helpers/typedefs.js
index f52bdb02..e4246b3e 100644
--- a/src/web-live-chat/src/lib/helpers/typedefs.js
+++ b/src/web-live-chat/src/lib/helpers/typedefs.js
@@ -40,12 +40,66 @@
* @property {Date} created_time - The conversation created time.
*/
+/**
+ * @interface
+ * @class
+ * @classdesc A basic rich content interface.
+ */
+function IRichContent() {}
+
+/**
+ * The type of the rich content.
+ *
+ * @name rich_type
+ * @type {string}
+ * @instance
+ */
+IRichContent.prototype.rich_type;
+
+/**
+ * The text of the rich content.
+ *
+ * @name text
+ * @type {string}
+ * @instance
+ */
+IRichContent.prototype.text;
+
+/**
+ * @typedef {IRichContent} TextMessage
+ * @implements {IRichContent}
+ * @property {string} text
+ * @property {string} rich_type
+ */
+
+/**
+ * @typedef {Object} QuickReplyElement
+ * @property {string} content_type
+ * @property {string} title
+ * @property {string} payload
+ * @property {string} image_url
+ */
+
+/**
+ * @typedef {IRichContent} QuickReplyMessage
+ * @property {string} text
+ * @property {string} rich_type
+ * @property {QuickReplyElement[]} quick_replies
+ */
+
+/**
+ * @typedef {Object} RichContent
+ * @property {string} messaging_type
+ * @property {IRichContent} message
+ */
+
/**
* @typedef {Object} ChatResponseModel
* @property {string} conversation_id - The conversation id.
* @property {UserModel} sender - The message sender.
* @property {string} message_id - The message id.
* @property {string} text - The message content.
+ * @property {RichContent} rich_content - Rich content
* @property {Date} created_at - The message sent time.
*/
diff --git a/src/web-live-chat/src/lib/scss/_variables.scss b/src/web-live-chat/src/lib/scss/_variables.scss
index 67f77ef2..8ce230ed 100644
--- a/src/web-live-chat/src/lib/scss/_variables.scss
+++ b/src/web-live-chat/src/lib/scss/_variables.scss
@@ -138,7 +138,7 @@ $colors: (
// scss-docs-end colors-map
// scss-docs-start theme-color-variables
-$primary: $blue;
+$primary: $purple;
$secondary: $gray-600;
$success: $green;
$info: $cyan;
diff --git a/src/web-live-chat/src/lib/services/signalr-service.js b/src/web-live-chat/src/lib/services/signalr-service.js
index 57300207..780a1ff3 100644
--- a/src/web-live-chat/src/lib/services/signalr-service.js
+++ b/src/web-live-chat/src/lib/services/signalr-service.js
@@ -66,8 +66,9 @@ export const signalr = {
}
});
- connection.on('OnMessageReceivedFromAssistant', (message) => {
+ connection.on('OnMessageReceivedFromAssistant', (json) => {
// do something when receiving a message, such as updating the UI or showing a notification
+ const message = JSON.parse(json);
if (conversationId === message.conversation_id) {
console.log(`[OnMessageReceivedFromAssistant] ${message.sender.role}: ${message.text}`);
this.onMessageReceivedFromAssistant(message);
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
index 097c52eb..4ce81b2c 100644
--- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte
@@ -17,6 +17,8 @@
import { signalr } from '$lib/services/signalr-service.js';
import { sendMessageToHub, GetDialogs } from '$lib/services/conversation-service.js';
import { format } from '$lib/helpers/datetime';
+ import RcText from './rc-text.svelte';
+ import RcQuickReply from './rc-quick-reply.svelte';
const options = {
scrollbars: {
@@ -31,7 +33,7 @@
};
const params = $page.params;
- let text = "Hi";
+ let text = "";
/** @type {import('$typedefs').AgentModel} */
export let agent;
@@ -170,8 +172,12 @@
{:else}
-

-
{message.text}
+

+ {#if message.rich_content.message.rich_type == 'text'}
+
+ {:else if message.rich_content.message.rich_type == 'quick_reply'}
+
+ {/if}
{/if}
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
new file mode 100644
index 00000000..45697302
--- /dev/null
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-quick-reply.svelte
@@ -0,0 +1,12 @@
+
+
+{message.text}
+
+{#each message.quick_replies as reply}
+
+{/each}
+
\ No newline at end of file
diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
new file mode 100644
index 00000000..36b92f26
--- /dev/null
+++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/rc-text.svelte
@@ -0,0 +1,6 @@
+
+
+{message.text}
diff --git a/src/web-live-chat/static/images/users/chatbot.png b/src/web-live-chat/static/images/users/chatbot.png
new file mode 100644
index 0000000000000000000000000000000000000000..600988775c76f30b1a9fb350371dbb4d2f791183
GIT binary patch
literal 3403
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
literal 0
HcmV?d00001