diff --git a/src/Seq.Api/Model/Indexes/IndexEntity.cs b/src/Seq.Api/Model/Indexes/IndexEntity.cs
new file mode 100644
index 0000000..c2ea190
--- /dev/null
+++ b/src/Seq.Api/Model/Indexes/IndexEntity.cs
@@ -0,0 +1,33 @@
+ namespace Seq.Api.Model.Indexes
+{
+ ///
+ /// An index over the event stream. May be one of several types discriminated by .
+ ///
+ public class IndexEntity: Entity
+ {
+ ///
+ /// The `Id` of the associated entity (Signal, Alert or Expression index).
+ ///
+ public string IndexedEntityId { get; set; }
+
+ ///
+ /// The type of this index.
+ ///
+ public IndexedEntityType IndexedEntityType { get; set; }
+
+ ///
+ /// The owner / creator of this index.
+ ///
+ public string OwnerUsername { get; set; }
+
+ ///
+ /// The name of this index. May not be applicable to all index types.
+ ///
+ public string Label { get; set; }
+
+ ///
+ /// The storage used by this index.
+ ///
+ public ulong StorageBytes { get; set; }
+ }
+}
diff --git a/src/Seq.Api/Model/Indexes/IndexedEntityType.cs b/src/Seq.Api/Model/Indexes/IndexedEntityType.cs
new file mode 100644
index 0000000..cdfb60b
--- /dev/null
+++ b/src/Seq.Api/Model/Indexes/IndexedEntityType.cs
@@ -0,0 +1,23 @@
+namespace Seq.Api.Model.Indexes
+{
+ ///
+ /// The type of the index.
+ ///
+ public enum IndexedEntityType
+ {
+ ///
+ /// A predicate index for a signal expression.
+ ///
+ Signal,
+
+ ///
+ /// An expression index.
+ ///
+ ExpressionIndex,
+
+ ///
+ /// A predicate index for an alert filter.
+ ///
+ Alert,
+ }
+}
\ No newline at end of file
diff --git a/src/Seq.Api/Model/Indexing/ExpressionIndexEntity.cs b/src/Seq.Api/Model/Indexing/ExpressionIndexEntity.cs
new file mode 100644
index 0000000..e0d3b86
--- /dev/null
+++ b/src/Seq.Api/Model/Indexing/ExpressionIndexEntity.cs
@@ -0,0 +1,18 @@
+namespace Seq.Api.Model.Indexing
+{
+ ///
+ /// An index based on an expression.
+ ///
+ public class ExpressionIndexEntity: Entity
+ {
+ ///
+ /// The expression to be indexed.
+ ///
+ public string Expression { get; set; }
+
+ ///
+ /// A user-provided description of the index.
+ ///
+ public string Description { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Seq.Api/Model/Settings/SettingName.cs b/src/Seq.Api/Model/Settings/SettingName.cs
index 1a36756..9609e57 100644
--- a/src/Seq.Api/Model/Settings/SettingName.cs
+++ b/src/Seq.Api/Model/Settings/SettingName.cs
@@ -15,6 +15,7 @@
using System;
using Seq.Api.Model.Apps;
using Seq.Api.Model.Updates;
+using Seq.Api.Model.Users;
using Seq.Api.ResourceGroups;
namespace Seq.Api.Model.Settings
@@ -124,6 +125,16 @@ public enum SettingName
/// Seq will stop accepting new events.
///
MinimumFreeStorageSpace,
+
+ ///
+ /// A dictionary of `(string, string)` pairs that will be used to initialize the
+ /// property when preparing new user entities
+ /// with , and with automatically
+ /// provisioning SSO users (when enabled).
+ ///
+ /// User preference keys are unconstrained; the Seq UI uses a number of these, but
+ /// alternative interfaces and integrations may add additional items to this collection.
+ NewUserPreferences,
///
/// A comma-separated list of role ids that will be assigned to new users by default.
diff --git a/src/Seq.Api/Model/Signals/SignalEntity.cs b/src/Seq.Api/Model/Signals/SignalEntity.cs
index 9c90ba2..82fd86d 100644
--- a/src/Seq.Api/Model/Signals/SignalEntity.cs
+++ b/src/Seq.Api/Model/Signals/SignalEntity.cs
@@ -67,6 +67,11 @@ public SignalEntity()
/// If true, the signal can only be modified by users with the permission.
///
public bool IsProtected { get; set; }
+
+ ///
+ /// If true, the signal has no backing index.
+ ///
+ public bool IsIndexSuppressed { get; set; }
///
/// How the signal is grouped in the Seq UI.
diff --git a/src/Seq.Api/ResourceGroups/ExpressionIndexesResourceGroup.cs b/src/Seq.Api/ResourceGroups/ExpressionIndexesResourceGroup.cs
new file mode 100644
index 0000000..5635915
--- /dev/null
+++ b/src/Seq.Api/ResourceGroups/ExpressionIndexesResourceGroup.cs
@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Seq.Api.Model;
+using Seq.Api.Model.Indexing;
+
+namespace Seq.Api.ResourceGroups
+{
+ ///
+ /// Perform operations on expression indexes.
+ ///
+ public class ExpressionIndexesResourceGroup: ApiResourceGroup
+ {
+ internal ExpressionIndexesResourceGroup(ILoadResourceGroup connection) : base("ExpressionIndexes", connection)
+ {
+ }
+
+ ///
+ /// Retrieve expression indexes.
+ ///
+ /// allowing the operation to be canceled.
+ /// A list containing matching expression indexes.
+ public async Task> ListAsync(CancellationToken cancellationToken = default)
+ {
+ return await GroupListAsync("Items", cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Construct an expression index with server defaults pre-initialized.
+ ///
+ /// allowing the operation to be canceled.
+ /// The unsaved expression index.
+ public async Task TemplateAsync(CancellationToken cancellationToken = default)
+ {
+ return await GroupGetAsync("Template", cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Add a new expression index.
+ ///
+ /// The expression index to add.
+ /// A allowing the operation to be canceled.
+ /// The expression index, with server-allocated properties such as initialized.
+ public async Task AddAsync(ExpressionIndexEntity entity, CancellationToken cancellationToken = default)
+ {
+ return await GroupCreateAsync(entity, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Remove an existing expression index.
+ ///
+ /// The expression index to remove.
+ /// A allowing the operation to be canceled.
+ /// A task indicating completion.
+ public async Task RemoveAsync(ExpressionIndexEntity entity, CancellationToken cancellationToken = default)
+ {
+ await Client.DeleteAsync(entity, "Self", entity, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Seq.Api/ResourceGroups/IndexesResourceGroup.cs b/src/Seq.Api/ResourceGroups/IndexesResourceGroup.cs
new file mode 100644
index 0000000..5c8038a
--- /dev/null
+++ b/src/Seq.Api/ResourceGroups/IndexesResourceGroup.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Seq.Api.Model.Alerting;
+using Seq.Api.Model.Indexes;
+using Seq.Api.Model.Indexing;
+using Seq.Api.Model.Signals;
+
+namespace Seq.Api.ResourceGroups
+{
+ ///
+ /// Statistics about indexes.
+ ///
+ public class IndexesResourceGroup : ApiResourceGroup
+ {
+ internal IndexesResourceGroup(ILoadResourceGroup connection)
+ : base("Indexes", connection)
+ {
+ }
+ ///
+ /// Retrieve the index with the given id; throws if the entity does not exist.
+ ///
+ /// The id of the index.
+ /// A allowing the operation to be canceled.
+ /// The index.
+ public async Task FindAsync(string id, CancellationToken cancellationToken = default)
+ {
+ if (id == null) throw new ArgumentNullException(nameof(id));
+ return await GroupGetAsync("Item", new Dictionary { { "id", id } }, cancellationToken).ConfigureAwait(false);
+ }
+
+
+ ///
+ /// Retrieve statistics on all indexes.
+ ///
+ /// allowing the operation to be canceled.
+ /// A list containing matching expression indexes.
+ public async Task> ListAsync(CancellationToken cancellationToken = default)
+ {
+ return await GroupListAsync("Items", cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Suppress an index. Not all index types can be suppressed: signal indexes do support suppression, in the case
+ /// of which the flag will be set to .
+ /// Expression indexes can only be suppressed by deleting the associated
+ /// and alert indexes can only be suppressed by deleting the corresponding .
+ ///
+ /// The index to suppress.
+ /// A allowing the operation to be canceled.
+ /// A task indicating completion.
+ public async Task SuppressAsync(IndexEntity entity, CancellationToken cancellationToken = default)
+ {
+ await Client.DeleteAsync(entity, "Self", entity, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ }
+}
diff --git a/src/Seq.Api/ResourceGroups/SignalsResourceGroup.cs b/src/Seq.Api/ResourceGroups/SignalsResourceGroup.cs
index d74c680..7249714 100644
--- a/src/Seq.Api/ResourceGroups/SignalsResourceGroup.cs
+++ b/src/Seq.Api/ResourceGroups/SignalsResourceGroup.cs
@@ -78,6 +78,7 @@ public async Task AddAsync(SignalEntity entity, CancellationToken
{
return await GroupCreateAsync(entity, cancellationToken: cancellationToken).ConfigureAwait(false);
}
+
///
/// Remove an existing signal.
///
diff --git a/src/Seq.Api/Seq.Api.csproj b/src/Seq.Api/Seq.Api.csproj
index 13e4ee2..9eed51c 100644
--- a/src/Seq.Api/Seq.Api.csproj
+++ b/src/Seq.Api/Seq.Api.csproj
@@ -1,7 +1,7 @@
Client library for the Seq HTTP API.
- 2024.2.0
+ 2024.3.0
Datalust;Contributors
netstandard2.0;net6.0
true
diff --git a/src/Seq.Api/SeqConnection.cs b/src/Seq.Api/SeqConnection.cs
index 35df2ce..6032e27 100644
--- a/src/Seq.Api/SeqConnection.cs
+++ b/src/Seq.Api/SeqConnection.cs
@@ -149,12 +149,22 @@ public void Dispose()
/// Perform operations on queries and filter expressions.
///
public ExpressionsResourceGroup Expressions => new ExpressionsResourceGroup(this);
+
+ ///
+ /// Perform operations on expression indexes.
+ ///
+ public ExpressionIndexesResourceGroup ExpressionIndexes => new ExpressionIndexesResourceGroup(this);
///
/// Perform operations on NuGet feeds.
///
public FeedsResourceGroup Feeds => new FeedsResourceGroup(this);
+ ///
+ /// Statistics about indexes.
+ ///
+ public IndexesResourceGroup Indexes => new IndexesResourceGroup(this);
+
///
/// Perform operations on the Seq license certificate.
///