diff --git a/embedded-assistant/c-sharp-wpf/.env.example b/embedded-assistant/c-sharp-wpf/.env.example
new file mode 100644
index 0000000..86751c7
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/.env.example
@@ -0,0 +1,5 @@
+CORTI_ENVIRONMENT=eu
+CORTI_TENANT_NAME=your-tenant
+CORTI_CLIENT_ID=assistant
+CORTI_USER_EMAIL=user@example.com
+CORTI_USER_PASSWORD=replace-me
diff --git a/embedded-assistant/c-sharp-wpf/.gitignore b/embedded-assistant/c-sharp-wpf/.gitignore
new file mode 100644
index 0000000..184d576
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/.gitignore
@@ -0,0 +1,10 @@
+.env
+.dotnet/
+bin/
+obj/
+artifacts/
+.vs/
+*.user
+*.csproj.user
+WebAssets/dist/
+WebAssets/node_modules/
diff --git a/embedded-assistant/c-sharp-wpf/App.xaml b/embedded-assistant/c-sharp-wpf/App.xaml
new file mode 100644
index 0000000..a9c5057
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/embedded-assistant/c-sharp-wpf/App.xaml.cs b/embedded-assistant/c-sharp-wpf/App.xaml.cs
new file mode 100644
index 0000000..03e005a
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/App.xaml.cs
@@ -0,0 +1,14 @@
+using System.Configuration;
+using System.Data;
+using System.Windows;
+
+namespace CortiAssistantApp
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+
+}
diff --git a/embedded-assistant/c-sharp-wpf/AssemblyInfo.cs b/embedded-assistant/c-sharp-wpf/AssemblyInfo.cs
new file mode 100644
index 0000000..b0ec827
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/embedded-assistant/c-sharp-wpf/CortiAssistantApp.csproj b/embedded-assistant/c-sharp-wpf/CortiAssistantApp.csproj
new file mode 100644
index 0000000..9762aaf
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/CortiAssistantApp.csproj
@@ -0,0 +1,28 @@
+
+
+
+ WinExe
+ net10.0-windows
+ enable
+ enable
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/embedded-assistant/c-sharp-wpf/CortiAssistantApp.slnx b/embedded-assistant/c-sharp-wpf/CortiAssistantApp.slnx
new file mode 100644
index 0000000..8429147
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/CortiAssistantApp.slnx
@@ -0,0 +1,3 @@
+
+
+
diff --git a/embedded-assistant/c-sharp-wpf/MainWindow.xaml b/embedded-assistant/c-sharp-wpf/MainWindow.xaml
new file mode 100644
index 0000000..aaade53
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/MainWindow.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/embedded-assistant/c-sharp-wpf/MainWindow.xaml.cs b/embedded-assistant/c-sharp-wpf/MainWindow.xaml.cs
new file mode 100644
index 0000000..0eec5dd
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/MainWindow.xaml.cs
@@ -0,0 +1,284 @@
+using CortiAssistantApp.Services;
+using Microsoft.Web.WebView2.Core;
+using System.IO;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Windows;
+
+namespace CortiAssistantApp
+{
+ public partial class MainWindow : Window
+ {
+ private const string LocalHostOrigin = "https://corti.local";
+
+ private readonly CortiSettings _settings = null!;
+ private readonly CortiAuthService _authService = null!;
+ private readonly JsonSerializerOptions _jsonOptions = new()
+ {
+ PropertyNameCaseInsensitive = true,
+ };
+
+ private AuthTokens _authTokens = null!;
+ private TaskCompletionSource? _bootstrapPending;
+ private BootstrapMessage? _pendingBootstrapMessage;
+
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ try
+ {
+ _settings = CortiSettings.LoadFromProjectEnv();
+ _authService = new CortiAuthService(_settings);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Configuration Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ Close();
+ return;
+ }
+
+ Loaded += MainWindow_Loaded;
+ }
+
+ private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
+ {
+ Loaded -= MainWindow_Loaded;
+ await InitializeWebViewAsync();
+ }
+
+ private async Task InitializeWebViewAsync()
+ {
+ try
+ {
+ var userDataFolder = Path.Combine(
+ Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
+ "CortiAssistantApp",
+ "WebView2"
+ );
+
+ var environment = await CoreWebView2Environment.CreateAsync(
+ null,
+ userDataFolder,
+ new CoreWebView2EnvironmentOptions
+ {
+ AdditionalBrowserArguments = "--enable-features=WebRTC " +
+ "--enable-media-stream " +
+ "--autoplay-policy=no-user-gesture-required"
+ }
+ );
+
+ await CortiWebView.EnsureCoreWebView2Async(environment);
+
+ var webAssetsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebAssets");
+ var webAssetsIndexPath = Path.Combine(webAssetsPath, "index.html");
+ if (!File.Exists(webAssetsIndexPath))
+ {
+ throw new FileNotFoundException(
+ "Built WebAssets were not found. Run 'npm install' and 'npm run build' in the WebAssets folder, then rebuild the WPF app.",
+ webAssetsIndexPath
+ );
+ }
+
+ CortiWebView.CoreWebView2.SetVirtualHostNameToFolderMapping(
+ "corti.local",
+ webAssetsPath,
+ CoreWebView2HostResourceAccessKind.Allow
+ );
+
+ CortiWebView.CoreWebView2.Settings.AreDevToolsEnabled =
+#if DEBUG
+ true;
+#else
+ false;
+#endif
+ CortiWebView.CoreWebView2.Settings.AreDefaultScriptDialogsEnabled = false;
+ CortiWebView.CoreWebView2.Settings.IsWebMessageEnabled = true;
+ CortiWebView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
+ CortiWebView.CoreWebView2.Settings.IsStatusBarEnabled = false;
+
+ CortiWebView.CoreWebView2.PermissionRequested += CoreWebView2_PermissionRequested;
+ CortiWebView.CoreWebView2.WebMessageReceived += WebView_WebMessageReceived;
+
+ AuthButton.IsEnabled = true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "WebView Initialization Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private async void AuthButton_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ AuthButton.IsEnabled = false;
+ AuthButton.Content = "Authenticating...";
+
+ _authTokens = await _authService.AuthenticateAsync();
+ await LoadCortiAssistant();
+
+ AuthButton.Visibility = Visibility.Collapsed;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Authentication failed: {ex.Message}", "Error",
+ MessageBoxButton.OK, MessageBoxImage.Error);
+ AuthButton.IsEnabled = true;
+ AuthButton.Content = "Authenticate";
+ }
+ }
+
+ private async Task LoadCortiAssistant()
+ {
+ if (CortiWebView.CoreWebView2 is null)
+ {
+ throw new InvalidOperationException("WebView2 is not ready yet.");
+ }
+
+ var navigationCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ _bootstrapPending = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ _pendingBootstrapMessage = new BootstrapMessage
+ {
+ AccessToken = _authTokens.AccessToken,
+ RefreshToken = _authTokens.RefreshToken,
+ IdToken = _authTokens.IdToken,
+ TokenType = _authTokens.JsonTokenType,
+ ExpiresIn = _authTokens.ExpiresIn,
+ BaseUrl = $"https://assistant.{_settings.EnvironmentName}.corti.app"
+ };
+
+ void OnNavigationCompleted(object? sender, CoreWebView2NavigationCompletedEventArgs e)
+ {
+ navigationCompleted.TrySetResult(e.IsSuccess);
+ }
+
+ try
+ {
+ CortiWebView.CoreWebView2.NavigationCompleted += OnNavigationCompleted;
+ CortiWebView.CoreWebView2.Navigate("https://corti.local/index.html");
+
+ var success = await navigationCompleted.Task;
+ if (!success)
+ {
+ throw new Exception("Failed to load the Corti Assistant page.");
+ }
+
+ var bootstrapCompleted = await Task.WhenAny(_bootstrapPending.Task, Task.Delay(TimeSpan.FromSeconds(10)));
+ if (bootstrapCompleted != _bootstrapPending.Task || !_bootstrapPending.Task.Result)
+ {
+ throw new TimeoutException("Timed out waiting for the embedded page to request bootstrap data.");
+ }
+ }
+ finally
+ {
+ CortiWebView.CoreWebView2.NavigationCompleted -= OnNavigationCompleted;
+ _pendingBootstrapMessage = null;
+ _bootstrapPending = null;
+ }
+ }
+
+ private void CoreWebView2_PermissionRequested(object? sender, CoreWebView2PermissionRequestedEventArgs args)
+ {
+ if (args.PermissionKind == CoreWebView2PermissionKind.Microphone &&
+ IsTrustedMicrophoneOrigin(args.Uri))
+ {
+ args.State = CoreWebView2PermissionState.Allow;
+ return;
+ }
+
+ args.State = CoreWebView2PermissionState.Deny;
+ }
+
+ private bool IsTrustedMicrophoneOrigin(string? uri)
+ {
+ if (string.IsNullOrWhiteSpace(uri))
+ {
+ return false;
+ }
+
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out var requestUri))
+ {
+ return false;
+ }
+
+ var origin = requestUri.GetLeftPart(UriPartial.Authority);
+ if (string.Equals(origin, LocalHostOrigin, StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+
+ var assistantOrigin = $"https://assistant.{_settings.EnvironmentName}.corti.app";
+ return string.Equals(origin, assistantOrigin, StringComparison.OrdinalIgnoreCase);
+ }
+
+ private void WebView_WebMessageReceived(object? sender, CoreWebView2WebMessageReceivedEventArgs e)
+ {
+ var message = e.TryGetWebMessageAsString();
+ if (string.IsNullOrWhiteSpace(message))
+ {
+ return;
+ }
+
+ var eventData = JsonSerializer.Deserialize(message, _jsonOptions);
+ if (eventData is not null)
+ {
+ HandleHostMessage(eventData);
+ }
+ }
+
+ private void HandleHostMessage(HostMessage eventData)
+ {
+ switch (eventData.Type)
+ {
+ case "host.ready":
+ if (CortiWebView.CoreWebView2 is not null && _pendingBootstrapMessage is not null)
+ {
+ CortiWebView.CoreWebView2.PostWebMessageAsJson(
+ JsonSerializer.Serialize(_pendingBootstrapMessage, _jsonOptions)
+ );
+ _bootstrapPending?.TrySetResult(true);
+ }
+ break;
+ case "session.started":
+ break;
+ case "error":
+ var errorMessage = eventData.Payload.ValueKind == JsonValueKind.String
+ ? eventData.Payload.GetString()
+ : eventData.Payload.GetRawText();
+ MessageBox.Show($"Error: {errorMessage}", "Assistant Error");
+ break;
+ }
+ }
+
+ private sealed class HostMessage
+ {
+ [JsonPropertyName("type")]
+ public string Type { get; set; } = string.Empty;
+
+ [JsonPropertyName("payload")]
+ public JsonElement Payload { get; set; }
+ }
+
+ private sealed class BootstrapMessage
+ {
+ [JsonPropertyName("access_token")]
+ public string AccessToken { get; set; } = string.Empty;
+
+ [JsonPropertyName("refresh_token")]
+ public string RefreshToken { get; set; } = string.Empty;
+
+ [JsonPropertyName("id_token")]
+ public string IdToken { get; set; } = string.Empty;
+
+ [JsonPropertyName("token_type")]
+ public string TokenType { get; set; } = string.Empty;
+
+ [JsonPropertyName("expires_in")]
+ public int ExpiresIn { get; set; }
+
+ [JsonPropertyName("baseUrl")]
+ public string BaseUrl { get; set; } = string.Empty;
+ }
+ }
+}
diff --git a/embedded-assistant/c-sharp-wpf/README.md b/embedded-assistant/c-sharp-wpf/README.md
new file mode 100644
index 0000000..34fed55
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/README.md
@@ -0,0 +1,78 @@
+# Corti Embedded Assistant WPF Example
+
+This example shows how to host `@corti/embedded-web` inside a WPF application using WebView2.
+
+The flow mirrors the vanilla TypeScript example:
+
+- load the embedded assistant
+- authenticate with Corti
+- create an interaction
+- navigate to the session
+- surface events and errors back to the host app
+
+## Prerequisites
+
+- .NET 10 SDK
+- Node.js LTS
+- WebView2 Runtime installed on Windows
+
+## Configuration
+
+This example uses a project-local `.env` file loaded with `DotNetEnv`.
+
+1. Copy `.env.example` to `.env`
+2. Fill in the values for your Corti environment
+
+Required keys:
+
+```env
+CORTI_ENVIRONMENT=
+CORTI_TENANT_NAME=
+CORTI_CLIENT_ID=
+CORTI_USER_EMAIL=
+CORTI_USER_PASSWORD=
+```
+
+## Run
+
+Build the frontend:
+
+```powershell
+cd WebAssets
+npm install
+npm run build
+cd ..
+```
+
+Run the WPF app:
+
+```powershell
+dotnet run
+```
+
+The .NET build fails fast if `WebAssets/dist` has not been built yet.
+
+## Expected Behavior
+
+After clicking `Authenticate`, the app should:
+
+- request tokens from Corti auth
+- load the embedded assistant in WebView2
+- create an interaction
+- navigate to the new session
+
+The Authenticate button stays disabled until WebView2 is ready. Microphone permission is granted only for the trusted assistant origins used by the sample.
+DevTools are enabled only in Debug builds.
+
+## Troubleshooting
+
+- Missing `.env`:
+ Create `.env` from `.env.example` in the project root.
+- Missing config keys:
+ The app will fail fast and list the required keys.
+- Missing built frontend:
+ Run `npm install` and `npm run build` in `WebAssets` before running `dotnet run`.
+- Frontend changes not showing up:
+ Rebuild `WebAssets` before running the WPF app.
+- Session crashes after navigation:
+ Verify your `.env` values and rebuild the frontend before retrying.
diff --git a/embedded-assistant/c-sharp-wpf/Services/CortiAuthService.cs b/embedded-assistant/c-sharp-wpf/Services/CortiAuthService.cs
new file mode 100644
index 0000000..ea2e3b7
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/Services/CortiAuthService.cs
@@ -0,0 +1,84 @@
+using System.Net.Http;
+using System.Text.Json;
+
+namespace CortiAssistantApp.Services
+{
+ internal sealed class CortiAuthService
+ {
+ private readonly CortiSettings _settings;
+ private readonly HttpClient _httpClient;
+
+ public CortiAuthService(CortiSettings settings)
+ {
+ _settings = settings;
+ _httpClient = new HttpClient();
+ }
+
+ public string GetAuthUrl()
+ {
+ return $"https://auth.{_settings.EnvironmentName}.corti.app/realms/{_settings.TenantName}/protocol/openid-connect";
+ }
+
+ public async Task AuthenticateAsync()
+ {
+ var tokenUrl = $"{GetAuthUrl()}/token";
+
+ var content = new FormUrlEncodedContent(new[]
+ {
+ new KeyValuePair("grant_type", "password"),
+ new KeyValuePair("client_id", _settings.ClientId),
+ new KeyValuePair("username", _settings.UserEmail),
+ new KeyValuePair("password", _settings.UserPassword),
+ new KeyValuePair("scope", "openid")
+ });
+
+ var response = await _httpClient.PostAsync(tokenUrl, content);
+ var responseBody = await response.Content.ReadAsStringAsync();
+
+ if (!response.IsSuccessStatusCode)
+ {
+ throw new Exception($"Authentication failed: {responseBody}");
+ }
+
+ var tokenResponse = JsonSerializer.Deserialize(
+ responseBody,
+ new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
+ );
+
+ if (tokenResponse is null ||
+ string.IsNullOrWhiteSpace(tokenResponse.access_token) ||
+ string.IsNullOrWhiteSpace(tokenResponse.refresh_token) ||
+ string.IsNullOrWhiteSpace(tokenResponse.token_type))
+ {
+ throw new Exception("Authentication failed: token response was missing required fields.");
+ }
+
+ return new AuthTokens
+ {
+ AccessToken = tokenResponse.access_token,
+ RefreshToken = tokenResponse.refresh_token,
+ IdToken = tokenResponse.id_token,
+ JsonTokenType = tokenResponse.token_type,
+ ExpiresIn = tokenResponse.expires_in,
+ };
+ }
+
+ private sealed class TokenResponse
+ {
+ public string access_token { get; set; } = string.Empty;
+ public string refresh_token { get; set; } = string.Empty;
+ public string id_token { get; set; } = string.Empty;
+ public string token_type { get; set; } = string.Empty;
+ public int expires_in { get; set; }
+ }
+ }
+
+ public sealed class AuthTokens
+ {
+ public string AccessToken { get; set; } = string.Empty;
+ public string RefreshToken { get; set; } = string.Empty;
+ public string IdToken { get; set; } = string.Empty;
+ public string JsonTokenType { get; set; } = string.Empty;
+ public int ExpiresIn { get; set; }
+ }
+}
diff --git a/embedded-assistant/c-sharp-wpf/Services/CortiSettings.cs b/embedded-assistant/c-sharp-wpf/Services/CortiSettings.cs
new file mode 100644
index 0000000..f48ea4b
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/Services/CortiSettings.cs
@@ -0,0 +1,104 @@
+using DotNetEnv;
+using System.IO;
+
+namespace CortiAssistantApp.Services
+{
+ internal sealed class CortiSettings
+ {
+ public string EnvironmentName { get; }
+ public string TenantName { get; }
+ public string ClientId { get; }
+ public string UserEmail { get; }
+ public string UserPassword { get; }
+
+ private CortiSettings(
+ string environmentName,
+ string tenantName,
+ string clientId,
+ string userEmail,
+ string userPassword
+ )
+ {
+ EnvironmentName = environmentName;
+ TenantName = tenantName;
+ ClientId = clientId;
+ UserEmail = userEmail;
+ UserPassword = userPassword;
+ }
+
+ public static CortiSettings LoadFromProjectEnv()
+ {
+ var envPath = FindEnvFile();
+ if (envPath is null)
+ {
+ throw new InvalidOperationException(
+ "Missing .env file in the project directory. Copy .env.example to .env in the project root and fill in the Corti settings."
+ );
+ }
+
+ Env.Load(envPath);
+
+ var missingKeys = new List();
+ var environmentName = ReadRequired("CORTI_ENVIRONMENT", missingKeys);
+ var tenantName = ReadRequired("CORTI_TENANT_NAME", missingKeys);
+ var clientId = ReadRequired("CORTI_CLIENT_ID", missingKeys);
+ var userEmail = ReadRequired("CORTI_USER_EMAIL", missingKeys);
+ var userPassword = ReadRequired("CORTI_USER_PASSWORD", missingKeys);
+
+ if (missingKeys.Count > 0)
+ {
+ throw new InvalidOperationException(
+ $"Missing required .env keys: {string.Join(", ", missingKeys.OrderBy(key => key))}"
+ );
+ }
+
+ return new CortiSettings(
+ environmentName,
+ tenantName,
+ clientId,
+ userEmail,
+ userPassword
+ );
+ }
+
+ private static string ReadRequired(string key, ICollection missingKeys)
+ {
+ var value = Environment.GetEnvironmentVariable(key);
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ missingKeys.Add(key);
+ return string.Empty;
+ }
+
+ return value;
+ }
+
+ private static string? FindEnvFile()
+ {
+ var candidateRoots = new[]
+ {
+ Directory.GetCurrentDirectory(),
+ AppContext.BaseDirectory
+ }
+ .Where(path => !string.IsNullOrWhiteSpace(path))
+ .Distinct(StringComparer.OrdinalIgnoreCase);
+
+ foreach (var root in candidateRoots)
+ {
+ var current = new DirectoryInfo(root);
+ while (current is not null)
+ {
+ var envPath = Path.Combine(current.FullName, ".env");
+ if (File.Exists(envPath))
+ {
+ return envPath;
+ }
+
+ current = current.Parent;
+ }
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/README.md b/embedded-assistant/c-sharp-wpf/WebAssets/README.md
new file mode 100644
index 0000000..457debb
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/README.md
@@ -0,0 +1,12 @@
+# WebAssets
+
+The frontend bootstrap for this example lives here.
+
+Most setup and run instructions are documented in the parent directory, which is the base of the application [README](../README.md). Use this folder when you need to rebuild the embedded web shell:
+
+```powershell
+npm install
+npm run build
+```
+
+The embedded web shell needs to be built before you run the C# application to ensure the build artifacts are copied over.
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/index.html b/embedded-assistant/c-sharp-wpf/WebAssets/index.html
new file mode 100644
index 0000000..976e910
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/index.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+ Corti Assistant WPF Example
+
+
+
+ Initializing...
+
+
+
+
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/package-lock.json b/embedded-assistant/c-sharp-wpf/WebAssets/package-lock.json
new file mode 100644
index 0000000..70a48fe
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/package-lock.json
@@ -0,0 +1,1006 @@
+{
+ "name": "webassets",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "webassets",
+ "version": "1.0.0",
+ "dependencies": {
+ "@corti/embedded-web": "^0.1.1"
+ },
+ "devDependencies": {
+ "vite": "^8.0.1"
+ }
+ },
+ "node_modules/@corti/embedded-web": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@corti/embedded-web/-/embedded-web-0.1.1.tgz",
+ "integrity": "sha512-v0wTP/h3NlnIQEd2jwJ8fShus6oMJIyDkILepchCXHTw+XFIoj9ttE67Q/GvtQtuqugkTlfLIOGHxKpmgEucxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@corti/sdk": "^0.5.0",
+ "@lit/react": "^1.0.8",
+ "lit": "^3.1.4"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@corti/sdk": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-0.5.0.tgz",
+ "integrity": "sha512-JL4J5VwOTP+0BXUUmz3Y+4h+fyy6cmxk4dZoRMvsGCsEbCJUnVVzHSr9gZ8ETIWw7WLQqKGeBDXFNUyUMDxvWw==",
+ "license": "MIT",
+ "dependencies": {
+ "ws": "^8.16.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz",
+ "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz",
+ "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
+ "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz",
+ "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit/react": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz",
+ "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==",
+ "license": "BSD-3-Clause",
+ "peerDependencies": {
+ "@types/react": "17 || 18 || 19"
+ }
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz",
+ "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.5.0"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz",
+ "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.120.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz",
+ "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz",
+ "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz",
+ "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz",
+ "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz",
+ "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz",
+ "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz",
+ "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz",
+ "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz",
+ "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz",
+ "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz",
+ "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz",
+ "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz",
+ "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz",
+ "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz",
+ "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz",
+ "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz",
+ "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lit": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz",
+ "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz",
+ "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.5.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz",
+ "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz",
+ "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.120.0",
+ "@rolldown/pluginutils": "1.0.0-rc.10"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-rc.10",
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.10",
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.10",
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.10",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/vite": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz",
+ "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.8",
+ "rolldown": "1.0.0-rc.10",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.0",
+ "esbuild": "^0.27.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/package.json b/embedded-assistant/c-sharp-wpf/WebAssets/package.json
new file mode 100644
index 0000000..289d5ed
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "webassets",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "build": "vite build"
+ },
+ "type": "module",
+ "dependencies": {
+ "@corti/embedded-web": "^0.1.1"
+ },
+ "devDependencies": {
+ "vite": "^8.0.1"
+ }
+}
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/src/main.ts b/embedded-assistant/c-sharp-wpf/WebAssets/src/main.ts
new file mode 100644
index 0000000..8968856
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/src/main.ts
@@ -0,0 +1,138 @@
+import "@corti/embedded-web";
+import type {
+ AuthPayload,
+ CortiEmbeddedAPI,
+ CreateInteractionPayload,
+ ErrorEventPayload,
+ InteractionDetails,
+} from "@corti/embedded-web/types";
+
+type CortiEmbeddedElement = HTMLElement & CortiEmbeddedAPI;
+type BootstrapMessage = AuthPayload & { baseUrl: string };
+type HostMessage =
+ | { type: "host.ready"; payload: null }
+ | { type: "session.started"; payload: string }
+ | { type: "error"; payload: string }
+ | { type: string; payload: unknown };
+
+declare global {
+ interface Window {
+ chrome?: {
+ webview?: {
+ postMessage: (message: string) => void;
+ addEventListener: (
+ type: "message",
+ listener: (event: MessageEvent) => void,
+ ) => void;
+ };
+ };
+ }
+}
+
+const statusElement = document.getElementById("status");
+const assistantElement = document.getElementById("assistant");
+
+if (!(statusElement instanceof HTMLDivElement)) {
+ throw new Error("Missing #status element");
+}
+
+if (!assistantElement) {
+ throw new Error("Missing #assistant element");
+}
+
+const status = statusElement;
+const corti = assistantElement as CortiEmbeddedElement;
+let bootstrapConfig: BootstrapMessage | null = null;
+let hasStarted = false;
+
+const postHostMessage = (message: HostMessage) => {
+ window.chrome?.webview?.postMessage(JSON.stringify(message));
+};
+
+const setErrorState = (message: string) => {
+ status.textContent = `Error: ${message}`;
+ status.style.background = "#ffebee";
+ status.style.color = "#c62828";
+};
+
+const reportError = (message: string) => {
+ setErrorState(message);
+ postHostMessage({ type: "error", payload: message });
+};
+
+window.addEventListener("error", event => {
+ reportError(event.message || "Unexpected application error");
+});
+
+window.addEventListener("unhandledrejection", event => {
+ const message = event.reason instanceof Error ? event.reason.message : String(event.reason);
+ reportError(message);
+});
+
+const startEmbeddedSession = () => {
+ if (hasStarted || bootstrapConfig === null) {
+ return;
+ }
+
+ hasStarted = true;
+ const config = bootstrapConfig;
+ corti.setAttribute("baseURL", config.baseUrl);
+ corti.setAttribute("visibility", "visible");
+};
+
+corti.addEventListener("embedded.ready", () => {
+ void (async () => {
+ if (bootstrapConfig === null) {
+ reportError("Missing host bootstrap configuration");
+ return;
+ }
+
+ try {
+ status.textContent = "Authenticating...";
+ await corti.auth(bootstrapConfig);
+
+ status.textContent = "Creating session...";
+ const interactionPayload: CreateInteractionPayload = {
+ assignedUserId: null,
+ encounter: {
+ identifier: `encounter-${Date.now()}`,
+ status: "planned",
+ type: "first_consultation",
+ period: { startedAt: new Date().toISOString() },
+ },
+ };
+ const interaction: InteractionDetails = await corti.createInteraction(interactionPayload);
+
+ status.textContent = "Navigating to session...";
+ await corti.navigate(`/session/${interaction.id}`);
+
+ status.textContent = "Ready";
+ status.style.background = "#e8f5e9";
+ status.style.color = "#2e7d32";
+ postHostMessage({ type: "session.started", payload: interaction.id });
+ } catch (error) {
+ const message = error instanceof Error ? error.message : String(error);
+ reportError(message);
+ }
+ })();
+}, { once: true });
+
+corti.addEventListener("embedded-event", (event: Event) => {
+ const detail = (event as CustomEvent<{ name: string; payload: unknown }>).detail;
+ postHostMessage({
+ type: detail.name,
+ payload: detail.payload ?? null,
+ });
+});
+
+corti.addEventListener("error", (event: Event) => {
+ const detail = (event as CustomEvent).detail;
+ reportError(detail.message);
+});
+
+window.chrome?.webview?.addEventListener("message", (event: MessageEvent) => {
+ bootstrapConfig = event.data;
+ startEmbeddedSession();
+});
+
+postHostMessage({ type: "host.ready", payload: null });
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/tsconfig.json b/embedded-assistant/c-sharp-wpf/WebAssets/tsconfig.json
new file mode 100644
index 0000000..80d2776
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "lib": [ "ES2022", "DOM", "DOM.Iterable" ],
+ "strict": true,
+ "noEmit": true,
+ "useDefineForClassFields": true,
+ "isolatedModules": true,
+ "skipLibCheck": true
+ },
+ "include": [ "src/**/*.ts" ],
+ "exclude": [
+ "node_modules",
+ "dist"
+ ]
+}
diff --git a/embedded-assistant/c-sharp-wpf/WebAssets/vite.config.js b/embedded-assistant/c-sharp-wpf/WebAssets/vite.config.js
new file mode 100644
index 0000000..cc3aaf1
--- /dev/null
+++ b/embedded-assistant/c-sharp-wpf/WebAssets/vite.config.js
@@ -0,0 +1,10 @@
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ build: {
+ outDir: "dist",
+ rollupOptions: {
+ input: "index.html",
+ },
+ },
+});
\ No newline at end of file