Skip to content
CAI
Software that uses CAICheck a score

vip32/Naos

43.6

Weak · 21 September 2026

52.7k

lines of production code

C#

primary language

3

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a comprehensive .NET application framework designed to accelerate the development of distributed, event-driven microservices. It provides foundational infrastructure for Domain-Driven Design, including event sourcing, generic repositories, and a command handling pipeline that supports both synchronous execution and asynchronous queue-based processing. The platform also integrates essential operational capabilities such as structured logging, distributed tracing, multi-tenant data isolation, and flexible messaging via various brokers like RabbitMQ and Azure Service Bus.

How it got here

2018–2019 — Foundation and infrastructure scaffolding

206 changes.

This period established the core platform by initializing the .NET solution, defining foundational DDD domain models, and implementing cross-cutting infrastructure for messaging, file storage, and key-value persistence. It also introduced comprehensive unit and integration test suites to validate these new components and ensure architectural fitness.

2020 — Event sourcing and multi-provider infrastructure

31 changes.

This period focused on establishing core event sourcing abstractions, including aggregate roots, repositories, and storage backends like EventStore and in-memory stores. It also expanded the platform's infrastructure by implementing document and queueing providers for SQLite, SQL Server, RabbitMQ, and Azure, alongside comprehensive architecture fitness tests to enforce domain-driven design principles.

Features

Add LogAnalyticsLogEventRepository for Azure Log Analytics logging

A new repository class, LogAnalyticsLogEventRepository, has been introduced in the Azure infrastructure layer to handle log event persistence via Azure Log Analytics. This class implements ILogEventRepository and inherits from the generic LogAnalyticsRepository, allowing users to store and retrieve structured log events using the configured Azure credentials and HTTP client.

src/Operations.Infrastructure.Azure/Logging · high confidence

Add MessageStatus enum to define message lifecycle states

A new MessageStatus enum has been introduced in the messaging domain model to explicitly track the state of messages. It defines three distinct statuses: NotPublished, Published, and PublishedFailed, allowing consumers to determine whether a message has been successfully sent or if the publication process encountered an error.

src/Messaging/Domain/Model · high confidence

Add SignalR and File Storage messaging broker implementations

The application now supports two new messaging broker backends: Azure SignalR Serverless and File Storage. Users can enable the SignalR broker via the 'naos:messaging:signalr' configuration section, which registers a scoped 'IMessageBroker' using 'SignalRServerlessMessageBroker' with support for logging, tracing, MediatR integration, and subscription filtering. Similarly, the File Storage broker can be enabled via 'naos:messaging:fileStorage', registering a 'FileStorageMessageBroker' that persists messages to a configurable folder (defaulting to the system temp path) using JSON serialization, with support for processing delays and subscription filtering. Both brokers are registered as scoped services and allow for custom broker configuration via an optional action delegate.

src/Messaging.Application.Azure.SignalR · high confidence

Add console command to list registered startup tasks

A new console command \startuptasks\ has been added to allow users to list all registered startup tasks. Executing this command with the \-l\ (or \--list\) flag displays the names of all tasks currently registered in the system, sorted alphabetically, aiding in debugging and verification of the startup configuration.

src/Foundation.Application.Web.Startup/Console · high confidence

Add queueing console command for echo processing

A new console command 'queueing' is now available, allowing users to trigger an echo item processing workflow. When the --echo flag is provided, the command enqueues five sample items and processes them through an in-memory queue, providing immediate feedback on queueing functionality.

src/Queueing.Application/Console · high confidence

Add traces console command to view trace information

A new 'traces' console command has been added to the application, allowing users to display trace information via the CLI. The command supports a '--recent' flag to show recent traces and a '--count' option to limit the number of results returned. When executed, it queries the log trace repository, filters for trace entries, and renders them in a hierarchical format showing message content, span IDs, duration, and timestamp.

src/Operations.Application/ConsoleCommands · high confidence

Added Application Insights span exporter stub

A new \ApplicationInsightsExporter\ class has been added to the Azure Tracing Infrastructure, implementing the \ISpanExporter\ interface to enable exporting tracing spans to Azure Application Insights. Currently, the \ExportAsync\ method is a placeholder that throws a \NotImplementedException\, indicating that the actual telemetry logic (such as tracking dependencies) is yet to be implemented.

src/Tracing.Infrastructure.Azure/ApplicationInsights · high confidence

Added Azure Log Analytics tracing integration

Users can now configure the application to send trace logs to Azure Log Analytics. This is achieved by adding the \AddAzureLogAnalyticsTracing\ extension method, which registers a \LogAnalyticsLogTraceRepository\ implementation of \ILogTraceRepository\. The integration handles authentication via Azure AD using tenant ID, client ID, and client secret, and allows specifying a custom log name for the workspace.

src/Tracing.Infrastructure.Azure · high confidence

Added Azure Service Bus and Azure Storage queue provider registrations

The \NaosExtensions.cs\ file in \src/Queueing.Application.Azure\ now provides extension methods to register Azure-based queueing providers. Users can configure either Azure Service Bus or Azure Storage Queues via \UseServiceBusQueue\ and \UseAzureStorageQueue\ respectively. These methods read configuration from \naos:queueing:serviceBus\ or \naos:queueing:azureStorageQueue\, register the corresponding \IQueue\<TData\>\ implementation (either \AzureServiceBusQueue\ or \AzureStorageQueue\) into the DI container, and add health checks for the respective queue. The registration supports optional expiration and retry settings.

src/Queueing.Application.Azure · high confidence

Added Azure Service Bus messaging integration

The application now supports Azure Service Bus as a message broker. A new extension method registers the necessary infrastructure, including a Service Bus provider, subscription client, and message handler, allowing the system to send and receive messages via Azure Service Bus topics and subscriptions.

src/Messaging.Application.Azure · high confidence

Added Azure Storage Queue message broker implementation

A new StorageQueueMessageBroker class has been introduced in the Azure messaging infrastructure to handle message routing via Azure Storage Queues. This component implements the IMessageBroker interface, accepting dependencies for logging, storage connection strings, handler factories, and subscription mapping. Currently, the Publish and Unsubscribe methods are marked as not implemented, while the Subscribe method returns the broker instance itself, indicating that the foundational structure for queue-based message consumption is in place but full publish/subscribe functionality is not yet complete.

src/Messaging.Infrastructure.Azure/Storage · high confidence

Added Azure and RabbitMQ queue providers for command requests

New extension methods are now available to configure command request storage and messaging backends. The Azure package adds support for storing command requests in Azure Blob Storage and sending them via Azure Storage Queue or Azure Service Bus Queue. The RabbitMQ package adds support for sending command requests via a RabbitMQ queue, allowing users to select their preferred infrastructure provider for command queuing.

src/Commands.Application.Web.Azure, src/Commands.Application.Web.RabbitMQ · high confidence

Added Azure infrastructure configuration models

Introduced a set of configuration classes within the Foundation.Infrastructure.Azure module to define settings for various Azure services. These include AdAuthenticationConfiguration for tenant and client credentials, ApplicationInsightsConfiguration for monitoring, BlobStorageConfiguration and QueueStorageConfiguration for storage services, LogAnalyticsConfiguration for logging, and SignalRConfiguration for real-time communication. These models provide the structured data required to configure Azure integrations.

src/Foundation.Infrastructure.Azure · high confidence

Added Azure logging infrastructure and configuration

This change introduces support for sending application logs to Azure services. It adds configuration classes and extension methods to enable logging to Azure Diagnostics Log Stream, Azure Blob Storage, and Azure Log Analytics. When Azure Log Analytics is enabled, it also registers the necessary repository to allow the dashboard to query these log events.

src/Operations.Infrastructure.Azure · high confidence

Added DTOs for Azure Log Analytics query responses

New data transfer objects have been introduced to model the structure of Azure Log Analytics query results. This includes \LogAnalyticsResponse\ to wrap the output, \LogAnalyticsTable\ to represent individual result tables with their columns and rows, and \LogAnalyticsColumn\ to define column metadata. A sample JSON file is also included to illustrate the expected data shape, aiding in development and validation of the repository layer.

src/Foundation.Infrastructure.Azure.LogAnalytics/Repositories/Dto · high confidence

Added EF Core database provider extension methods

New extension methods have been added to configure Entity Framework Core with SQL Server, SQLite, and In-Memory databases. These helpers simplify setup by reading connection strings from configuration or accepting them directly, and they enable detailed error logging and sensitive data logging by default to aid in development and debugging.

src/Foundation.Infrastructure.EntityFramework/Extensions · high confidence

Added EchoStartupTask for startup logging

A new EchoStartupTask has been introduced to the application startup sequence. This component implements the IStartupTask interface and logs a simple informational message ('hello from echo startup task') during the application's StartAsync phase, providing a basic verification point for the startup pipeline.

src/Foundation.Application.Web.Startup/Tasks · high confidence

Added EventStore and stubbed SqlEventStore implementations for event sourcing

The event sourcing infrastructure now includes a concrete \EventStoreEventStore\ implementation that persists domain events and aggregates to an EventStore database, supporting both event streaming and snapshotting via dedicated streams. A corresponding \SqlEventStore\ class has been added as a placeholder implementing the same \IEventStore\ interface, though its methods currently throw \NotImplementedException\.

src/Foundation.Infrastructure.EventStore · high confidence

Added HTTP request tracing middleware

A new middleware component has been introduced to automatically trace incoming HTTP requests. It creates distributed tracing spans for each request, capturing details such as HTTP method, URL, host, path, and response status code. The middleware supports configuration via options, allowing users to enable or disable tracing and define path patterns (e.g., static assets, Swagger, favicon) to exclude from tracing.

src/Tracing.Application.Web/Middleware · high confidence

Added JsonContent helper for HTTP requests

A new JsonContent class has been introduced in the Client layer to simplify sending JSON payloads in HTTP requests. This class extends StringContent and automatically serializes objects to JSON using Newtonsoft.Json, providing a convenient alternative to external extension methods for POST operations.

src/Foundation.Application.Web/Client · high confidence

Added Log Analytics repository for trace data

A new repository class, LogAnalyticsLogTraceRepository, has been introduced to persist trace information into Azure Log Analytics. This implementation maps specific trace properties—such as TrackId, OperationName, CorrelationId, SpanId, ParentSpanId, Kind, Status, StatusDescription, StartTime, and EndTime—to corresponding Log Analytics entity fields, enabling users to query and analyze detailed tracing data within their Log Analytics workspaces.

src/Tracing.Infrastructure.Azure/Repositories · high confidence

Added PathHelper utility for file path normalization and expansion

A new PathHelper class has been introduced in the FileStorage utility layer to standardize how file paths are processed. This utility provides methods to expand paths containing the \|DataDirectory\| placeholder by resolving them against the application's base directory, and to normalize path separators (forward vs. backslashes) to match the current operating system's conventions, ensuring consistent path handling across different environments.

src/FileStorage/Utility · high confidence

Added ResourcesHelper for accessing embedded assets

A new ResourcesHelper class has been introduced to provide convenient access to embedded resources within the Naos.Foundation assembly. This utility allows applications to retrieve the logo, favicon, and CSS stylesheets (including specific styles for Swagger UI) as either byte arrays, Bitmaps, or strings, simplifying the integration of these static assets into the application's UI and API documentation.

src/Foundation.Resources · high confidence

Added Zipkin tracing exporter infrastructure

The \src/Tracing.Infrastructure.Zipkin\ package now includes the core components required to export distributed tracing spans to a Zipkin server. This introduces model classes (\ZipkinSpan\, \ZipkinEndpoint\, \ZipkinAnnotation\) to represent Zipkin protocol data, a \ZipkinSpanExporter\ implementation that maps internal spans to Zipkin format and sends them via HTTP POST, and a configuration class (\ZipkinSpanExporterConfiguration\) to enable/disable the exporter and specify the target host.

src/Tracing.Infrastructure.Zipkin · high confidence

Added action filters for cache control and client disconnection handling

The application now includes two new ASP.NET Core action filters in the Foundation layer. The NoCacheAttribute ensures that marked action methods do not cache their output by setting NoStore to true. The OperationCancelledExceptionFilterAttribute intercepts OperationCanceledException instances and returns a 499 Client Closed Request status code, logging the event when a client closes the TCP connection prematurely.

src/Foundation.Application.Web/Filters · high confidence

Added configuration classes for console, file, and Seq logging

New configuration classes have been introduced to allow users to control logging behavior. ConsoleLoggingConfiguration enables or disables console output. FileLoggingConfiguration provides detailed settings for file-based logging, including the folder path (defaulting to the system temp directory with a 'naos\_operations' subfolder), file naming, output templates, size limits, rolling intervals, and write-sharing options. SeqLoggingConfiguration allows users to enable Seq logging and specify the endpoint URL and API key for sending logs to a Seq server.

src/Operations.Application/Configuration · high confidence

Added domain event handlers for exporting and logging trace spans

New domain event handlers have been introduced to process SpanStarted and SpanEnded events. SpanEndedExporterDomainEventHandler forwards completed spans to registered ISpanExporter implementations (such as Zipkin) for external storage. SpanEndedLogTraceDomainEventHandler maps span details (trace ID, span ID, status, timing) into structured log properties for correlation. SpanEndedLoggerDomainEventHandler provides human-readable debug and error logging for span lifecycle events, including duration and failure reasons. Additionally, the ILogTraceRepository interface has been added to support persistence of log traces.

src/Tracing.Domain/Events · high confidence

Added domain event-to-messaging bridge and message tracking

The system now includes a new \DomainEventMessagingPublisher\ abstract class that allows internal domain events to be automatically mapped and published as external messages via a message broker, enabling cross-service notifications. Additionally, a \TrackMessageDomainEventHandler\ has been introduced to log journal entries whenever messages are published or handled, providing visibility into message lifecycle events.

src/Messaging/Domain/Events · high confidence

Added domain-specific exception classes for aggregate and entity not found scenarios

The Foundation.Domain layer now includes four new exception types to improve error handling clarity: AggregateNotFoundException, EntityNotFoundException, InvalidAggregateIdException, and InvalidEntityIdException. These classes allow the application to distinguish between missing aggregates or entities and invalid identifier formats, providing more specific error information to callers.

src/Foundation.Domain/Exceptions · high confidence

Added health report data models

Introduced the \NaosHealthReport\ and \NaosHealthReportEntry\ model classes to structure health check data. These models define the schema for reporting overall health status, duration, timestamps, and detailed entry information including tags and error descriptions, enabling the application to aggregate and expose health metrics.

src/Operations.Application/Model · high confidence

Added in-memory file storage implementation

The FileStorage module now includes an in-memory implementation of the IFileStorage interface, allowing applications to store and retrieve files entirely in RAM without requiring persistent disk or cloud storage. This implementation supports standard file operations such as saving, reading, renaming, copying, and deleting files, along with bulk deletion via search patterns. It enforces configurable limits on maximum file size and total number of files, automatically evicting the oldest files when the count exceeds the threshold. Configuration is handled via InMemoryFileStorageOptions and an associated builder, allowing users to specify size limits, file count caps, and a custom serializer for file metadata.

src/FileStorage · high confidence

Added queue processing capabilities via startup tasks and hosted services

The application now includes infrastructure to process queue items automatically upon startup or as a background service. This is achieved by introducing \QueueProcessItemsStartupTask\ for one-time processing at launch and \QueueProcessItemsHostedService\ for continuous background processing, both accessible via new extension methods (\AddQueueProcessItemsStartupTask\ and \ProcessItemsHostedService\) on the service collection.

src/Queueing.Application.Web · high confidence

Added queueing application configuration and DI extensions

Introduced new application-layer components to support message queueing integration. This includes the \NaosExtensions\ class, which provides extension methods for registering queueing services via dependency injection, including automatic scanning for \QueueEventHandler\ implementations and configuring an in-memory queue provider. Additionally, \QueueingOptions\ and \QueueingProviderOptions\ classes were added to encapsulate configuration context for the queueing subsystem.

src/Queueing.Application · high confidence

Added queueing domain decorators for automatic completion and file storage

Introduced two new decorator classes in the Queueing domain: AutoCompleteQueueDecorator and FileStorageQueueDecorator. The AutoCompleteQueueDecorator automatically marks queue items as complete immediately after they are dequeued, simplifying the consumption pattern for scenarios where manual completion is not required. The FileStorageQueueDecorator provides a placeholder for persisting enqueued items to file storage, though the underlying storage integration is currently commented out and not yet active.

src/Queueing/Domain/Decorators · high confidence

Added request logging and storage middleware for HTTP traffic

New middleware components have been introduced to the web application pipeline to enhance observability and debugging. The \RequestLoggingMiddleware\ captures detailed logs for inbound requests and responses, including HTTP method, URL, status codes, headers, and duration (formatted using Humanizer), while respecting configurable path blacklists. Additionally, the \RequestStorageMiddleware\ provides the capability to persist raw request and response bodies to a configured \IFileStorage\ implementation, enabling deeper inspection of traffic data. Both middlewares are controlled via dedicated options classes (\RequestLoggingMiddlewareOptions\ and \RequestStorageMiddlewareOptions\) that allow enabling/disabling the features and defining exclusion patterns.

src/Operations.Application.Web/Middleware · high confidence

Added system metrics client for CPU and memory monitoring

Introduced a new \SystemMetricsClient\ in the \Naos.Foundation\ namespace that retrieves CPU load percentage and memory usage (total, used, free) for the host system. The client provides platform-specific implementations, using Windows Management Instrumentation (WMIC) commands on Windows and the \free\ command on Unix-like systems (Linux/macOS) to gather these metrics.

src/Foundation.Utilities/System · high confidence

Adds Entity Framework Core DbContext factory support

The Foundation.Infrastructure.EntityFramework package now includes infrastructure to create DbContext instances on demand via dependency injection. This change introduces an IDbContextFactory interface and a concrete DbContextFactory implementation, along with a ServiceCollectionExtensions method (AddDbContextFactory) that registers these services. This allows applications to obtain fresh DbContext instances scoped to specific lifetimes, rather than relying on a single long-lived context.

src/Foundation.Infrastructure.EntityFramework · high confidence

Adds application-layer distributed tracing infrastructure

The Tracing.Application layer now provides the core components for distributed tracing: an HttpClientDelegatingHandler that injects trace headers into outbound HTTP requests, a SpanViewModel for visualizing span hierarchies, and a fluent configuration API (OperationsOptionsExtensions) to register the tracer, select samplers, and configure span exporters via dependency injection.

src/Tracing.Application · high confidence

Adds request logging and health check middleware to the web application

The Operations.Application.Web library now provides extension methods to integrate request logging and system health checks into the ASP.NET Core pipeline. Users can enable request logging and storage (supporting local folder or Azure Blob storage backends) via the UseOperationsLogging method, which captures request data and correlates it with diagnostics. Additionally, the UseOperationsHealth method exposes standard health endpoints (/health, /health/ready, /health/live) and registers system-level health checks for memory and CPU usage, allowing external monitoring systems to verify application status.

src/Operations.Application.Web · high confidence

Automatic command journaling to local file storage

A new behavior has been introduced that automatically persists incoming commands to the local file system. This component implements the chain-of-responsibility pattern to intercept command execution, serializing the request object into JSON files (defaulting to the pattern {id}-{type}.json) within a temporary journal directory. This ensures that all commands are logged for auditing or replay purposes without requiring explicit handling in individual command handlers.

src/Commands.Infrastructure.FileStorage/Domain/Handlers/Behaviors · high confidence

Azure Table Storage and Cosmos DB Table API provider added

A new \TableKeyValueStorage\ implementation has been added to the \Naos.KeyValueStorage.Infrastructure.Azure\ package, providing a unified key-value storage backend for both Azure Table Storage and Azure Cosmos DB Table API. The provider automatically detects the backend based on the connection string (checking for \table.cosmos.azure.com\) and uses the \Microsoft.Azure.Cosmos.Table\ client library to handle operations such as insert, upsert, update, merge, and delete. Configuration is managed via \TableKeyValueStorageOptions\, allowing users to specify the connection string and the maximum batch insert limit (defaulting to 100).

src/KeyValueStorage.Infrastructure.Azure · high confidence

Azure file storage infrastructure added

The Azure file storage infrastructure now includes implementations for Azure Blob Storage and Azure File Share, allowing users to store and retrieve files using these Azure services. The \AzureBlobFileStorage\ class provides full support for blob operations, while \AzureFileShareStorage\ handles file share operations, though renaming files in file shares is currently not implemented. Configuration options for both storage types are available via dedicated options classes and builders. An \AzureKeyVaultFileStorage\ class is also present as a placeholder, with all methods currently throwing \NotImplementedException\.

src/FileStorage.Infrastructure.Azure · high confidence

CSV serialization support for file storage

Users can now read and write CSV files directly through the file storage service using new extension methods. The \SaveFileCsvAsync\ methods allow saving data to CSV with configurable separators, culture settings, and date formats, while \GetFileCsvAsync\ retrieves and deserializes CSV content back into objects.

src/FileStorage.Csv · high confidence

Console command to open browser dashboards

A new console command (\browser\) has been added to the application, allowing users to launch the browser directly to specific operational dashboards. By passing flags such as \--logs\, \--traces\, \--journal\, or \--swagger\, the command automatically resolves the current server address and opens the corresponding URL (e.g., \/naos/operations/logevents/dashboard\ or \/swagger/index.html\) using the native OS browser handler.

src/Foundation.Application.Web/Console · high confidence

Convenience extension methods for FileStorage operations

The FileStorage domain now includes a new \FileStorageExtensions\ class that provides helper methods for common file operations. Users can now easily save and retrieve strongly-typed objects (\SaveFileObjectAsync\, \GetFileObjectAsync\) using the storage's default or a specified serializer, read and write raw text contents (\SaveFileContentsAsync\, \GetFileContentsAsync\), retrieve raw byte arrays (\GetFileContentsRawAsync\), and manage file listings and deletions (\GetFileInformationsAsync\, \DeleteFilesAsync\). These extensions simplify interaction with the underlying \IFileStorage\ interface by handling serialization, stream management, and pagination logic.

src/FileStorage/Domain · high confidence

Generic repository seeder for startup data population

The application now supports seeding database entities at startup via a new generic \SeederStartupTask\. This feature allows developers to register specific entities to be inserted into the database during application initialization, ensuring required data (such as country lists) is present. The seeder checks for existing records to avoid duplicates and handles state initialization for entities implementing \IStateEntity\.

src/Foundation.Application.Web.Startup.Repositories · high confidence

Initial RabbitMQ messaging infrastructure implementation

This change introduces the core RabbitMQ infrastructure for the Naos messaging system, adding the \RabbitMQMessageBroker\ to handle message publishing and subscription binding, along with \RabbitMQProvider\ for resilient connection management and retry policies. It includes configuration options (\RabbitMQMessageBrokerOptions\) for defining exchange names, queue names, serialization, and message expiration, as well as a builder pattern for setup. The implementation supports direct exchanges with routing keys, persistent message delivery, correlation ID tracking, and distributed tracing headers.

src/Messaging.Infrastructure.RabbitMQ · high confidence

Initial Service Bus infrastructure provider

Added the core components for the Azure Service Bus foundation infrastructure, including configuration models, credential structures, and the provider implementation. This introduces \ServiceBusProvider\ which manages connections to Azure Service Bus namespaces, handles topic and subscription creation/verification, and provides topic clients, alongside supporting interfaces and configuration classes.

src/Foundation.Infrastructure.Azure.ServiceBus · high confidence

Initial command handling infrastructure and sample commands

The Commands.Application layer now provides the core infrastructure for executing commands, including automatic registration of command handlers and behaviors via the Naos DI extension. It introduces sample commands (Echo, Ping, Test) with their respective handlers and validators to demonstrate usage, and defines constants for distributed tracing properties (TraceId, TraceSpanId, TraceSampled) to support observability.

src/Commands.Application · high confidence

Initial implementation of SQL Server document provider infrastructure

This change introduces the core components for the SQL Server document storage provider within the \src/Foundation.Infrastructure.Documents.SqlServer\ module. It adds the \SqlServerDocumentProvider\ to handle document persistence and retrieval (including count, existence checks, and key/data loading) against a SQL Server database, utilizing \Dapper\ for data access. The implementation is supported by a new \SqlBuilder\ for generating SQL queries, \IndexMap\ classes for defining queryable indexes, and a fluent \SqlServerDocumentProviderOptionsBuilder\ for configuring connection strings, schemas, and index mappings.

src/Foundation.Infrastructure.Documents.SqlServer · high confidence

Initial repository scaffolding and build configuration

The repository is initialized with a comprehensive .NET solution structure and build tooling. This includes an .editorconfig enforcing C\# 8 coding conventions, a Directory.Build.props file setting up Roslyn 3.7.0, FxCop, and StyleCop analyzers, and GitVersion configuration for semantic versioning. CI/CD pipelines are defined in Azure Pipelines YAML files, and foundational documentation such as a Code of Conduct and Contributing guide are added.

(repo-wide) · high confidence

Introduce Azure Service Bus message broker implementation

Added the \ServiceBusMessageBroker\ class and its associated configuration options (\ServiceBusMessageBrokerOptions\, \ServiceBusMessageBrokerOptionsBuilder\) to enable publishing and subscribing to Azure Service Bus topics. This implementation supports message serialization via \ISerializer\, distributed tracing context propagation (TraceId/SpanId) for observability, configurable retry policies, and subscription rule management.

src/Messaging.Infrastructure.Azure/ServiceBus · high confidence

Introduce Azure Service Bus queue implementation

Added a new \AzureServiceBusQueue\ implementation for the queueing infrastructure, enabling message persistence and processing via Azure Service Bus. This change introduces the core queue client (\AzureServiceBusQueue.cs\) along with its configuration options (\AzureServiceBusQueueOptions.cs\) and a fluent builder (\AzureServiceBusQueueOptionsBuilder.cs\), allowing users to configure connection strings, queue properties (such as TTL, dead-lettering, and partitioning), and retry policies.

src/Queueing.Infrastructure.Azure/ServiceBus · high confidence

Introduce Azure Storage Queue implementation for message queuing

Added a new Azure Storage Queue infrastructure component that implements the queueing domain interface using Microsoft Azure Storage Queues. This includes the core queue client for enqueuing, dequeuing, completing, and abandoning messages, along with support for dead-letter queues for failed items. The implementation integrates with Polly for retry policies, supports distributed tracing via correlation IDs, and provides metrics for queue depth and processing counts. Configuration is handled through a builder pattern allowing customization of connection strings, retry counts, processing intervals, and serialization.

src/Queueing.Infrastructure.Azure/Storage · high confidence

Introduce Event Sourcing repository infrastructure with in-memory store

Added the core components for the Event Sourcing repository layer, including the \IEventStore\ interface and an \InMemoryEventStore\ implementation for reading and saving domain events. The change introduces supporting types such as \Event\<TId\>\ and \Snapshot\<TAggregate, TId\>\ wrappers, an \EventResult\ for version tracking, and specific exception classes (\EventStoreException\, \EventStoreStreamNotFoundException\, \EventStoreCommunicationException\). While the in-memory store currently implements event persistence and retrieval, snapshot read and save operations are present but not yet implemented.

src/Foundation.Domain.EventSourcing/Repositories/EventStore · high confidence

Introduce EventSourcingRepository for aggregate persistence

Added the EventSourcingRepository implementation and its corresponding interface, enabling the persistence and retrieval of event-sourced aggregates. This component handles reading events from the event store to reconstruct aggregate state, saving new domain events, and managing snapshots for optimized retrieval. It also includes a dedicated exception type for repository-level errors.

src/Foundation.Domain.EventSourcing/Repositories · high confidence

Introduce Foundation ContentTypes and Criteria libraries

This change introduces two new foundation libraries. The \Foundation.ContentTypes\ library provides a comprehensive \ContentType\ enum mapping file extensions to MIME types, along with metadata attributes and extension methods to resolve content types from file names, extensions, or MIME values. The \Foundation.Criteria\ library introduces a \Criteria\ class and \CriteriaOperator\ enum to define filtering rules, supporting standard comparison operators (Equal, NotEqual, GreaterThan, etc.) and string functions (Contains, StartsWith, EndsWith), with extension methods to convert criteria into expression strings for querying.

src/Foundation.ContentTypes, src/Foundation.Criteria · high confidence

Introduce HTTP command request middleware with extensible dispatch pipeline

The application now includes a new \CommandRequestMiddleware\ that intercepts HTTP requests and routes them to command handlers via a configurable extension chain. This middleware supports both synchronous (Mediator) and asynchronous (Queue) dispatch strategies, allowing commands to be executed directly or enqueued for background processing. It automatically parses incoming requests from query strings or JSON bodies, injects correlation IDs, and propagates distributed tracing spans. The pipeline is extensible, featuring built-in logging and tracing extensions, and returns appropriate HTTP responses including command IDs and cancellation reasons.

src/Commands.Application.Web/Middleware · high confidence

Introduce MongoDB repository infrastructure with query composition and DI support

The \src/Foundation.Infrastructure.Mongo\ package now provides a complete MongoDB persistence layer, including \MongoRepository\ implementations for both direct entity storage and mapped destination documents. This change adds configuration options (\MongoConfiguration\, \MongoRepositoryOptions\), a fluent options builder, and dependency injection extensions to register the MongoDB client with custom conventions and optional command logging. It also introduces LINQ extension methods (\WhereExpression\, \OrderByIf\, \SkipIf\, \TakeIf\) that enable specification-based filtering and conditional sorting/pagination on MongoDB queries, along with domain interfaces like \IMongoDocument\ to support the mapping layer.

src/Foundation.Infrastructure.Mongo · high confidence

Introduce Naos FileStorage as an IFileProvider implementation

Users can now access Naos FileStorage through the standard Microsoft.Extensions.FileProviders.IFileProvider interface. This change adds three new classes—FileStorageProvider, FileStorageFileInfo, and FileStorageDirectoryContents—which wrap the existing IFileStorage service to provide file information and directory listing capabilities compatible with ASP.NET Core file provider expectations.

src/FileStorage/Provider · high confidence

Introduce SQLite document provider implementation

Adds a new SQLite-based implementation for the document repository infrastructure, including the SqliteDocumentProvider, SqliteBuilder, and associated options and builders. This allows applications to persist document entities to a SQLite database, extending the existing document repository pattern to support SQLite as a backend alongside other providers.

src/Foundation.Domain.Repositories.Documents · high confidence

Introduce Service Discovery Application layer with registry and client abstractions

This change introduces the core application logic for service discovery, providing a pluggable registry system and client infrastructure. It adds a \ServiceDiscoveryClient\ that supports both direct service resolution and routing via a proxy, along with a \ServiceRegistryClient\ facade for registration operations. The layer supports multiple registry backends, including a file-system based registry (\FileSystemServiceRegistry\) for local development and a router-based registry (\RouterServiceRegistry\) for distributed environments. Additionally, it includes a \ServiceDiscoveryHostedService\ for automatic service registration on startup, health check extensions for verifying client connectivity, and an echo controller for debugging service states.

src/ServiceDiscovery.Application · high confidence

Introduce Service Discovery Router with HTTP proxy and registration management

This change adds a new service discovery router component that enables HTTP-based request routing and service registration management. The router exposes a proxy endpoint at \/naos/servicediscovery/router/proxy\ that forwards requests to upstream services based on \serviceName\ and \serviceTag\ headers, utilizing ProxyKit for forwarding and X-Forwarded header handling. Additionally, it provides a REST API at \/naos/servicediscovery/router/registrations\ for listing, registering, and deregistering service instances, and an echo endpoint at \/naos/servicediscovery/echo/router\ to retrieve all current registrations. The implementation supports a file-system-based service registry by default, configured via the \naos:serviceDiscovery\ section, and registers the necessary DI services and middleware to enable this functionality.

src/ServiceDiscovery.Application.Web.Router · high confidence

Introduce command persistence model and in-memory repository

The Commands.Domain layer now includes a domain model for persisting commands, represented by the new Command class which wraps a MediatR request and tracks metadata such as ID, correlation ID, and creation details. To support this, an ICommandRepository interface and a corresponding CommandInMemoryRepository implementation have been added, enabling commands to be stored and retrieved from an in-memory data store.

Commands.Domain, src/Commands.Domain · high confidence

Introduce core Event Sourcing abstractions for domain aggregates

The Foundation.Domain.EventSourcing module now provides the foundational types for implementing event-sourced aggregates. This includes the IDomainEvent interface and DomainEventBase class, which standardize event metadata such as AggregateId and AggregateVersion, and introduce a ForAggregate method to attach these details to events. Additionally, the EventSourcedAggregateRoot abstract class is added, offering built-in support for tracking versioned state changes, applying incoming events, and raising new domain events that are automatically enriched with the correct aggregate identity and version before being stored in the change set.

Foundation.Domain.EventSourcing · high confidence

Introduce core domain model and extension methods for key-value storage

This change adds the foundational domain layer for the new KeyValueStorage feature. It defines the core data structures \Key\ (partition and row keys) and \Value\ (a dictionary-like row entity) within the \Naos.KeyValueStorage.Domain\ namespace, along with the \IKeyValueStorage\ interface specifying operations like \FindAllAsync\, \InsertAsync\, \UpsertAsync\, and \DeleteAsync\. Additionally, it provides \Extensions\ that offer convenient, type-safe wrappers for these operations, automatically handling table name pluralization and mapping between entity objects and storage values.

src/KeyValueStorage/Domain · high confidence

Introduce core job scheduling domain models

Added the foundational domain models for the job scheduling system, including the \Cron\ helper class for generating standard cron expressions, the \IJob\ interface and \Job\ implementation for defining and executing scheduled tasks with support for correlation IDs and cancellation tokens, and the \JobRegistration\ class for managing job configuration, parsing cron schedules, and determining execution timing.

src/JobScheduling/Domain/Model · high confidence

Introduce file storage domain model and interfaces

The file storage domain layer now exposes a structured API for managing files, centered around the new \IFileStorage\ and \IReadOnlyFileStorage\ interfaces. Users can perform read operations (such as retrieving file streams, metadata, and existence checks) and write operations (saving, renaming, copying, and deleting files). The model includes a \FileInformation\ class that tracks path, timestamps, size, and automatically detects content type, alongside a \PagedResults\ class that supports lazy pagination via \NextPageAsync\ for handling large file lists.

src/FileStorage/Domain/Model · high confidence

Introduce file-based and in-memory key-value storage implementations

Added a new \FileStorageKeyValueStorage\ implementation that persists key-value pairs as JSON files within a directory structure (organized by table, partition, and row keys) using the \IFileStorage\ abstraction, along with the corresponding options and builder classes. Also added a stub \InMemoryKeyValueStorage\ implementation of \IKeyValueStorage\ that currently throws \NotImplementedException\ for all operations, serving as a placeholder for future in-memory support.

src/KeyValueStorage.Infrastructure.FileStorage · high confidence

Introduce file-system-based messaging and LightningDB key-value storage

This change adds two new infrastructure components to the platform. First, it introduces a \FileStorageMessageBroker\ that implements the \IMessageBroker\ interface by persisting messages as JSON files in a configurable folder and using \FileSystemWatcher\ to detect and process new messages, supporting distributed tracing and correlation IDs. Second, it adds a \LightningDbKeyValueStorage\ implementation of \IKeyValueStorage\ that uses the LightningDB library for local key-value persistence, supporting insert, upsert, update, merge, and delete operations (though table listing and deletion remain unsupported). Both components include their respective configuration options and builder classes for setup.

src/Messaging.Infrastructure.FileSystem · high confidence

Introduce in-memory queue implementation with configurable retry and dequeue behavior

The Queueing module now includes an in-memory queue implementation (InMemoryQueue) that supports configurable retry delays, retry multipliers, and dequeue intervals via InMemoryQueueOptions. This allows users to process messages in memory with customizable timing and retry logic, suitable for testing or lightweight scenarios where persistent storage is not required.

src/Queueing · high confidence

Introduce in-memory repository implementation for domain entities

Adds a new in-memory persistence layer for the domain model, including \InMemoryRepository\ and \InMemoryRepository\<TDestination\>\ classes that support entity storage, retrieval, and upserts. The implementation features an \InMemoryEntityIdGenerator\ that automatically assigns sequential integer IDs or sequential GUIDs based on the entity's ID type, and an \InMemoryContext\ to hold the entity collection. It also provides an options builder to configure the repository with a mediator for publishing domain events, an entity mapper for DTO translation, and specific context instances, enabling developers to use this lightweight store for testing or simple scenarios without external database dependencies.

src/Foundation.Domain.Repositories/InMemory · high confidence

Introduce job scheduling domain events and handlers

Added new domain event types and handlers for the job scheduling system, including \JobEvent\<TData\>\ and \JobEventHandler\<TData\>\ as the base abstractions, and a concrete \EchoJobEventHandler\ that logs job data after a short delay. This establishes the event-driven structure for processing job-related actions within the \Naos.JobScheduling.Domain\ namespace.

src/JobScheduling/Domain/Events · high confidence

Introduces AutoMapper-based entity mapping with expression support

The repository layer now includes an \AutoMapperEntityMapper\ implementation that delegates object and expression mapping to the global AutoMapper instance. This enables the system to map domain specifications into query expressions (e.g., converting \ISpecification\ objects into \Expression\<Func\<TDestination, bool\>\>\), allowing for more flexible and maintainable data retrieval logic compared to previous manual or alternative mapping approaches.

src/Foundation.Domain.Repositories.AutoMapper · high confidence

Introduces Azure SignalR-based serverless message broker

Adds a new \SignalRServerlessMessageBroker\ implementation within the \Naos.Messaging.Infrastructure.Azure\ namespace, enabling applications to use Azure SignalR Service as a transport for messaging. This includes the broker class itself, which handles subscribing to and publishing messages via SignalR hubs, along with supporting infrastructure such as \ServiceUtils\ for parsing connection strings and generating JWT access tokens, and a dedicated options/configuration builder (\SignalRServerlessMessageBrokerOptions\ and \SignalRServerlessMessageBrokerOptionsBuilder\) to wire up dependencies like serializers, handlers, and HTTP clients.

src/Messaging.Infrastructure.Azure.SignalR · high confidence

Introduces a new asynchronous pipeline processing framework

Adds a new \Pipeline\<TPipeIn, TPipeOut\>\ utility in the Foundation.Utilities library that enables chaining linear, one-directional processing steps. The implementation uses \BlockingCollection\ buffers to pass data between steps asynchronously via \TaskCompletionSource\, allowing users to define a sequence of transformations where the output of one step feeds into the next, with results returned as tasks.

src/Foundation.Utilities/Pipeline · high confidence

Introduces core domain model for the queueing system

Adds the foundational domain interfaces and classes for the new queueing capability, including \IQueue\ and \IQueue\<TData\>\ for queue operations (enqueue, dequeue, process), \IQueueItem\ and \QueueItem\ for representing queued messages with lifecycle management, \QueueBase\ as an abstract base implementation, \QueueMetrics\ for tracking queue statistics, and \QueueOptionsBase\ for configuration. This establishes the domain layer for the queueing feature.

src/Queueing/Domain/Model · high confidence

Introduces dynamic Expando object with XML-serializable property bag

Adds a new \Expando\ class in \src/Foundation.Utilities/Expando\ that extends existing objects with dynamic properties, allowing access via indexer, dynamic casting, or dictionary interface. The implementation includes a \PropertyBag\ that supports XML serialization for storing extra dynamic values, along with helper extensions like \ToExpando\ to facilitate casting objects to dynamic types.

src/Foundation.Utilities/Expando · high confidence

Introduces foundation options builder infrastructure with logging support

Adds a new set of classes and interfaces in the Foundation.Options library to standardize options configuration. This includes an OptionsBuilder base class and a generic BaseOptionsBuilder that extends Microsoft's OptionsBuilder, enabling fluent configuration. A key addition is the OptionsBase abstract class, which provides a LoggerFactory property and helper methods to create loggers, allowing options objects to easily access logging capabilities. The package also defines the IOptionsBuilder interface and extension methods to access the built target object.

src/Foundation.Options · high confidence

Introduces foundational abstractions and infrastructure components

This change adds a new set of core libraries to the platform. It introduces the \DateTimeEpoch\ value object for handling time-based comparisons and serialization, along with \IStartupTask\ to define pre-start and post-shutdown application lifecycle hooks. A comprehensive logging and tracing schema is established via \LogKeys\, \LogPropertyKeys\, \LogTraceNames\, and \LogTrackTypes\, enabling structured correlation IDs and trace tracking across services. The update also includes \NaosException\ and \NaosClientFormatException\ for standardized error handling, \ServiceDescriptor\ for service metadata, and \EnvironmentKeys\ for configuration. Additionally, it provides \Console2\ for colored terminal output, \ExitCode\ for process status, and \IConsoleCommand\ for CLI integration. Infrastructure support is added with Azure Key Vault integration (\PrefixKeyVaultSecretManager\, \KeyVaultConfiguration\) and an \AutoMapper\ adapter with extension methods for mapping profiles.

src/Foundation.Abstractions · high confidence

Introduces job scheduling capabilities with console management and hosted service

The application now includes a job scheduling system, exposing a new 'jobscheduler' console command to enable, disable, list, and trigger jobs, alongside a background hosted service that automatically runs scheduled jobs. This feature is registered via the \AddJobScheduling\ extension method, which configures the scheduler, its hosted service, and command handlers within the dependency injection container.

src/JobScheduling.Application · high confidence

Introduces messaging application infrastructure and console echo demo

Adds the core application layer for the messaging system, including a new console command and handler that allow users to trigger an echo message flow via the CLI. This flow subscribes to and publishes EchoMessage and EntityMessage instances through the message broker. The change also registers a background hosted service to manage the messaging lifecycle, configures dependency injection to automatically scan and register message handlers, and sets up a subscription map with a default echo route.

src/Messaging.Application · high confidence

Introduces queue event domain model with correlation ID support

The Queueing domain now defines a generic \QueueEvent\<TData\>\ structure and an abstract \QueueEventHandler\<TData\>\ base class to standardize how queue items are processed. A concrete implementation, \EchoQueueEventHandler\, demonstrates this pattern by logging the text content of incoming items. The event data model includes a \CorrelationId\ property (via \IHaveCorrelationId\), enabling traceability across distributed queue operations.

src/Queueing/Domain/Events · high confidence

Introduction of Command and CommandResponse base models

The \src/Commands.Application/Model\ directory now includes new base classes for the command pattern: \Command\ and \Command\<TResponse\>\ serve as the base request types, providing identifiers, correlation IDs, and creation timestamps, while \CommandResponse\<TResponse\>\ serves as the base response type, supporting result data and cancellation states. A \CommandException\ class is also added for standard service exceptions. These files establish the foundational data structures for command handling within the application layer.

src/Commands.Application/Model · high confidence

Introduction of Foundation CSV serialization with culture and header support

The \src/Foundation.Serialization.Csv\ area now provides a new \CsvSerializer\ implementation that wraps ServiceStack.Text for CSV operations. This serializer allows users to configure the item separator, specify a \CultureInfo\ for consistent formatting of numbers and dates, and define a custom \DateTimeFormat\. Additionally, a generic \CsvSerializer\<THeader\>\ variant is introduced, which supports mapping custom headers via a dictionary, enabling more flexible CSV structure control.

src/Foundation.Serialization.Csv · high confidence

Introduction of IEventSourcedAggregateRoot interface

A new interface, IEventSourcedAggregateRoot, has been added to the Foundation.Domain.EventSourcing model. This interface defines the contract for event-sourced aggregate roots, specifying properties and methods for managing versioning (Version), applying domain events (ApplyEvent), retrieving pending changes (GetChanges), and clearing those changes (ClearChanges).

src/Foundation.Domain.EventSourcing/Model · high confidence

Introduction of JobSchedulerOptions for job registration

The JobSchedulerOptions class has been added to the JobScheduling project, providing a centralized configuration and registration mechanism for scheduled jobs. This component allows users to define job behaviors using cron expressions, specify reentrancy and timeout settings, and register jobs via various overloads including action delegates, async tasks, and generic types. It integrates with the MediatR library for event-based job execution and utilizes a job factory for deferred job instance creation, effectively serving as the primary entry point for configuring the job scheduler's behavior.

src/JobScheduling · high confidence

Introduction of LogEvent domain model for structured logging

The Operations.Domain now includes a new LogEvent entity to represent structured log data. This model captures key telemetry fields such as log level, message, timestamp, correlation ID, and service context (name, product, capability), along with a flexible Properties dictionary for custom attributes. This change enables the domain to persist and query detailed log events, supporting better observability and debugging of operations.

Operations.Domain · high confidence

Introduction of Span Exporter interface and Tracing documentation

The Tracing.Domain layer now includes the ISpanExporter interface, defining the contract for exporting trace spans asynchronously, alongside a new README that documents the timeline and sequence views for visualizing span hierarchies and durations.

src/Tracing.Domain · high confidence

Introduction of core distributed tracing model and scope management

This change introduces the foundational domain model for distributed tracing within the \Naos.Tracing.Domain\ namespace. It adds core interfaces (\ISpan\, \IScope\, \IScopeManager\, \ITracer\) and their implementations (\AsyncLocalScope\, \AsyncLocalScopeManager\, \Tracer\) to manage trace context and span lifecycle. The \AsyncLocalScopeManager\ leverages \AsyncLocal\ to maintain current scope context across asynchronous operations and integrates with MediatR to publish \SpanStartedDomainEvent\ and \SpanEndedDomainEvent\ for sampled spans. Additionally, it defines the \ITraceAdapter\ interface and initial stubs for \LoggerTraceAdapter\ and \ZipkinTraceAdapter\ to facilitate future integration with logging and distributed tracing backends.

src/Tracing.Domain/Model · high confidence

Introduction of core messaging domain model and events

The Messaging module now includes a foundational domain model for handling messages, introducing the \Message\ class which serves as the base for all message types and includes properties for identification, correlation, origin, and status. Alongside this, new domain events \MessagePublishedDomainEvent\ and \MessageHandledDomainEvent\ have been added to track message lifecycle stages, while sample message types like \DummyMessage\, \EchoMessage\, and \EntityMessage\ are provided to demonstrate usage patterns within the system.

Messaging · high confidence

Introduction of domain event infrastructure with MediatR integration

The domain layer now includes a structured eventing system built on MediatR. A new \IDomainEvent\ interface extends \INotification\ and adds \EventId\ and \CorrelationId\ properties for tracking. The \IDomainEventHandler\ interface defines a \CanHandle\ method to allow handlers to filter events, and the \DomainEventHandlerBase\ provides a concrete base class that implements logging, execution timing, and error handling for event processing.

src/Foundation.Domain/Events · high confidence

Introduction of domain models for metrics and logging

The Operations.Domain layer now includes foundational types for observability. A new ILogEventRepository interface has been added to support logging persistence. Additionally, a comprehensive metrics model is introduced, featuring a base Metric class with properties for timestamp, category, name, type, and instance, along with specialized subclasses for Counter, Gauge, and Timer metrics. The MetricTimerUnit enum defines supported time units (Nanoseconds through Days), and stub implementations for MetricsPublisher and AzureMonitoringMetricHandler are included to facilitate future metric publishing and Azure integration.

src/Operations.Domain · high confidence

Introduction of foundational Domain-Driven Design types and eventing infrastructure

The Foundation.Domain library now includes core building blocks for domain modeling, including an abstract DomainEventBase class with identity and correlation support, and specific event types for entity lifecycle changes (insert, update, delete, and their completed counterparts). It introduces an AggregateRoot base class that manages a collection of domain events to ensure aggregate consistency, alongside TenantEntity and TenantAggregateRoot classes to support multi-tenancy via a TenantId property. These types provide the structural basis for implementing event-sourced aggregates and handling tenant-scoped data within the domain layer.

Foundation.Domain · high confidence

Introduction of generic repository controllers and Consul service discovery

The web layer now supports dynamic API endpoints through a new generic repository controller system. By calling \AddEndpoint\<T\>()\ in the MVC options, the application automatically registers controllers for specified entity types, with Swagger documentation automatically tagged by entity name. Additionally, the application gains the ability to register with a Consul service registry via the \UseConsulClientRegistry\ extension, enabling automatic service discovery and health checks.

src/Application.Web · high confidence

Introduction of job factory abstraction for scheduled job creation

The domain layer now includes an IJobFactory interface and a ServiceProviderJobFactory implementation, enabling the creation of IJob instances via type resolution. This allows scheduled jobs to be instantiated through the service provider, supporting dependency injection for job implementations.

src/JobScheduling/Domain · high confidence

Introduction of span lifecycle events and trace data model

The Tracing.Domain layer now exposes domain events for span lifecycle changes (SpanStarted and SpanEnded) and introduces a LogTrace entity to persist detailed trace information. This enables consumers to react to span start/end occurrences and provides a structured model for storing trace attributes such as correlation IDs, service context, timing, and tags.

Tracing.Domain · high confidence

Introduction of the Domain Specification pattern for validation and querying

The \src/Foundation.Domain.Specifications\ library now provides a complete implementation of the Specification pattern, introducing \ISpecification\ and \ISpecification\<T\>\ interfaces along with base \Specification\ classes. This enables users to compose complex business rules and query filters using \And\, \Or\, and \Not\ combinators, which are implemented via \AndSpecification\, \OrSpecification\, and \NotSpecification\ classes. The library includes specific ready-to-use rules such as \HasIdSpecification\ and \HasTenantSpecification\ for common entity checks, and a \Check\ utility class that allows validating entities against specifications by throwing a new \SpecificationNotSatisfiedException\ when rules are not met. The implementation is optimized for MongoDB compatibility by using \Expression.Invoke\ to correctly combine expression trees.

src/Foundation.Domain.Specifications · high confidence

Introduction of the JobScheduling domain service

The \src/JobScheduling/Domain/Services\ area now contains the core implementation for the job scheduling system. This includes the \JobScheduler\ class which handles job registration, execution, and lifecycle management, along with interfaces \IJobScheduler\ and \IMutex\ and their implementations (\InProcessMutex\, \DistributedMutext\). Users can now register jobs with cron expressions and timeouts, trigger them manually or via schedule, and benefit from built-in logging and tracing integration within this service layer.

src/JobScheduling/Domain/Services · high confidence

MongoDB persistence for log traces

Added support for storing log trace data in MongoDB. This includes a new \MongoLogTrace\ document model that maps domain trace properties (such as trace ID, span ID, service context, and timing) to MongoDB fields, a \MongoLogTraceRepository\ implementing the trace repository interface, and an AutoMapper configuration to handle serialization and deserialization between the domain model and the database document.

src/Tracing.Infrastructure.Mongo/Repositories · high confidence

MongoDB-backed logging and tracing infrastructure

The Operations service now supports persisting log events and traces to MongoDB. This change introduces a new CamelCasedMongoDBJsonFormatter to standardize JSON output, a MongoLoggingConfiguration class for settings (connection string, database/collection names, and capped collection limits), and DI extensions to register the MongoDB sink, health check, and the MongoLogEventRepository used by the dashboard. Users can enable this backend via configuration, which routes logs to a MongoDB collection and makes them queryable through the existing operations dashboard.

src/Operations.Infrastructure.Mongo · high confidence

MongoDB-backed logging repository implementation

The Operations infrastructure now supports persisting log events to MongoDB. This change introduces a new \MongoLogEvent\ data transfer object, an AutoMapper configuration to map between domain \LogEvent\ objects and MongoDB documents, and a \MongoLogEventRepository\ that implements \ILogEventRepository\ to handle storage and retrieval of these events.

src/Operations.Infrastructure.Mongo/Logging · high confidence

MongoDB-based trace storage with DI registration

The Tracing.Infrastructure.Mongo module now provides a MongoDB-backed implementation for storing log traces. A new configuration class (MongoTracingConfiguration) allows users to specify the MongoDB connection string, database name, and collection name (defaulting to 'LogEvents' in 'naos\_operations'). The NaosExtensions class registers this repository via AddMongoTracing, wiring up the ILogTraceRepository interface to MongoLogTraceRepository using the configured MongoDB client and AutoMapper mappings.

src/Tracing.Infrastructure.Mongo · high confidence

Naos configuration and service bootstrapping framework

The Configuration.Application module now provides a comprehensive bootstrapping framework for .NET applications. It introduces a centralized configuration factory (NaosConfigurationFactory) that automatically assembles configuration sources, including JSON files, environment variables, command-line arguments, user secrets, Azure App Configuration (with offline caching), and Azure Key Vault. The module exposes extension methods for IServiceCollection and IConfigurationBuilder to simplify service registration, offering helpers to configure and validate singleton options, conditionally add configuration providers, and register MediatR across assemblies. It also includes a NaosBuilderContext for managing service descriptors and environment details, along with health checks for Azure Key Vault connectivity.

src/Configuration.Application · high confidence

New API endpoints for command request metrics, status, and echo registrations

Added two new ASP.NET Core controllers to expose command-related data via HTTP. The NaosCommandRequestsController provides endpoints under the 'naos/commands' prefix to retrieve queue metrics, fetch individual command request statuses (handling Accepted, Failed, Cancelled, and other states), and get command responses. The NaosCommandsEchoController exposes an endpoint under 'naos/commands/echo' that returns a list of registered command request types.

src/Commands.Application.Web/Controllers · high confidence

New Foundation Extension Methods for Collections, Strings, and Utilities

The \src/Foundation.Extensions\ library has been populated with a comprehensive suite of new extension methods to simplify common development tasks. For collections, developers can now use \Add\, \AddOrUpdate\, \AddRange\, \Chunk\, \DistinctBy\, \Duplicates\, \ForEach\, \Insert\, \InsertRange\, and \Ignore\ to manipulate lists and dictionaries more fluently. String handling is enhanced with \Capitalize\, \Decapitalize\, \Contains\, \ContainsAny\, \EndsWithAny\, \EqualsAny\, \EqualsPattern\, \EmptyToNull\, and \Default\. Additional utilities include \AnyContext\ for configuring task awaiters, \As\ for safe casting, \IsBase64\, \IsNumber\, \IsDefault\, and \IsNullOrEmpty\ for type checks, and \GetFullMessage\ for detailed exception logging. Assembly metadata can now be retrieved via \GetBuildDate\ and \GetLinkerDateTime\, while GUIDs support conversion to Base64, numeric codes, and strings.

src/Foundation.Extensions · high confidence

New Foundation Utilities Library

The src/Foundation.Utilities package introduces a comprehensive set of helper classes for common development tasks. It includes EncryptionHelper and SigningHelper for data security (AES encryption and RSA signing), HashAlgorithm for computing hashes (MD5, SHA1, SHA256, etc.), and Factory for creating object instances via reflection or dependency injection. Additional utilities cover random data generation (RandomGenerator), unique ID creation (IdGenerator, SequentialGuid), retry logic (Retry, Run), rate limiting (RateLimiter), and general reflection and stream helpers.

src/Foundation.Utilities · high confidence

New HTML node rendering options and ASP.NET Core route matching utility

The \src/Foundation.Utilities.Web\ package now includes \HtmlNodeRenderOptions\, which allows users to customize the visual structure (breaks, connectors, and spacing) of rendered HTML node trees and write output directly to the HTTP response context. Additionally, a new \RouteMatcher\ class has been added to provide manual route matching capabilities for ASP.NET Core, supporting both path templates and query string constraints, while automatically casting matched route parameters to their expected types (such as int, bool, datetime, decimal, double, float, guid, and long) based on inline constraints.

src/Foundation.Utilities.Web · high confidence

New HTTP context and request extension utilities

Added a suite of extension methods to the \src/Foundation.Application.Web/Extensions\ directory to simplify working with ASP.NET Core HTTP objects. \HttpContextExtensions\ provides helpers for managing correlation and request IDs, retrieving URL helpers, and applying cache profiles. \HttpRequestExtensions\ adds methods to construct full URIs and detect local requests. \HttpResponseExtensions\ introduces fluent methods for writing JSON, setting headers, and returning standard HTTP status codes (OK, Created, BadRequest, etc.). Additional extensions for \IUrlHelper\ generate absolute URLs, while \WebRequestBuilderExtensions\ allows conditional configuration of the web host builder.

src/Foundation.Application.Web/Extensions · high confidence

New JSON serialization foundation with dual-engine support and type-safe deserialization

The \src/Foundation.Serialization/Json\ area now provides a comprehensive set of utilities for JSON handling, introducing support for both \System.Text.Json\ and \Newtonsoft.Json\. A new \DefaultJsonSerializerOptions\ class configures the modern \System.Text.Json\ engine with camel-case naming, null-value ignoring, and case-insensitive property matching. Simultaneously, the library establishes robust defaults for \Newtonsoft.Json\ via \DefaultJsonSerializerSettings\ (ignoring nulls/defaults, camel-case, ISO 8601 dates) and \TypedJsonSerializerSettings\ (which enables \TypeNameHandling.All\ for polymorphic deserialization). To support these engines, the diff adds custom contract resolvers (\PrivateSetterCamelCasePropertyNamesContractResolver\, \PrivateSetterContractResolver\) that allow deserialization into properties with private setters, a \GuidConverter\ for safe GUID handling, and a \SerializationHelper\ class offering static methods for serializing/deserializing JSON and BSON from strings, streams, and byte arrays.

src/Foundation.Serialization/Json · high confidence

New LogAnalyticsRepository for querying Azure Log Analytics

Added a new generic LogAnalyticsRepository that queries Azure Log Analytics via the REST API, using a LogAnalyticsEntityMap to translate between entity properties and Log Analytics columns. This enables reading log events from Azure Log Analytics as domain entities.

src/Foundation.Infrastructure.Azure.LogAnalytics/Repositories · high confidence

New Naos API controller base classes and echo endpoint

This change introduces a new set of base controller classes in the Application.Web layer to standardize API behavior. NaosControllerBase provides shared access to MediatR, logging, correlation, and filtering contexts. NaosReadOnlyGenericRepositoryControllerBase and NaosGenericRepositoryControllerBase implement standard CRUD operations (FindAll, FindOne, Post, Put, Delete) for entity repositories, exposing them via the 'api/\[controller\]' route. Additionally, a new NaosEchoController is added at the 'naos/echo' route to provide a simple health-check-style endpoint.

src/Application.Web/Controllers · high confidence

New Node tree structure and console rendering utilities

Added a generic \Node\<T\>\ class to represent hierarchical tree structures, providing navigation properties such as \Ancestors\, \Descendants\, \Siblings\, and \Leaves\, along with a static \ToHierarchy\ method to build trees from flat lists. Introduced an \INodeRenderOptions\ interface and two implementations (\ConsoleNodeRenderOptions\ and \StringBuilderNodeRenderOptions\) to support customizable text-based rendering of these trees. Added \NodeExtensions\ with \RenderConsole\ and \RenderAsync\ methods that allow users to visualize node hierarchies in the console or capture them as strings, using configurable separators and indentation styles.

src/Foundation.Utilities/Node · high confidence

New Operations Health, Log Events, and Log Traces API endpoints

Added three new ASP.NET Core controllers to expose operational visibility: a health check endpoint at /naos/operations/health that aggregates service status and provides an HTML dashboard; a log events endpoint at /naos/operations/logevents that retrieves log entries with filtering and an HTML dashboard view; and a log traces endpoint at /naos/operations/logtraces that retrieves distributed trace spans, renders them as a hierarchy, and provides an HTML dashboard. All endpoints support JSON responses and dedicated HTML dashboard views for browser-based inspection.

src/Operations.Application.Web/Controllers · high confidence

New RabbitMQ queueing infrastructure implementation

This change introduces the core infrastructure for RabbitMQ-based message queueing within the Naos Queueing system. It adds a new \IRabbitMQProvider\ interface and its \RabbitMQProvider\ implementation, which manages RabbitMQ connections with automatic reconnection logic using Polly retry policies. The \RabbitMQQueue\<TData\>\ class implements the queueing logic, supporting message publishing to exchanges, durable message storage, and basic get/dequeue operations. Configuration is handled via \RabbitMQQueueOptions\ and a builder pattern, allowing customization of exchange names, queue names, retry counts, and message expiration (TTL). The implementation also integrates with the existing tracing domain to propagate trace context headers in message properties.

src/Queueing.Infrastructure.RabbitMQ · high confidence

New Service Context API endpoints for runtime information and echo

Added two new ASP.NET Core controllers to expose service context information via HTTP. The root endpoint at \naos/servicecontext\ returns a comprehensive JSON response including service descriptors, request metadata (correlation ID, IP, host), runtime details (framework, OS, build date), and links to various application actions (Swagger, health, log events). A secondary endpoint at \naos/servicecontext/echo\ provides a simpler response by echoing back the current service descriptor.

src/ServiceContext.Application/Web/Controllers · high confidence

New authentication handlers and registration extensions for API Key, Basic, EasyAuth, and OIDC

This change introduces a comprehensive authentication infrastructure in the web application layer, adding support for four distinct authentication schemes: API Key, Basic, Azure EasyAuth, and OpenID Connect (OIDC). It provides dedicated authentication handlers (ApiKeyAuthenticationHandler, BasicAuthenticationHandler, EasyAuthAuthenticationHandler) that validate credentials via an extensible IAuthenticationService interface, including static validation services for API keys and Basic auth. The update also includes DI extension methods (AddApiKeyStaticAuthentication, AddBasicStaticAuthentication, AddEasyAuthentication, AddOidcAuthentication) to register these schemes, an OidcAuthenticationChallengeMiddleware to enforce OIDC challenges for unauthenticated requests, and a NaosAuthenticationEchoController to expose current user identity and claims for debugging.

src/Authentication.Application.Web · high confidence

New command handling infrastructure and logging enrichers

This change introduces a new command handling architecture in the Commands.Application layer, featuring a BaseCommandHandler that orchestrates a chain of behaviors (such as validation, journaling, and tracing) around command execution. It also adds several Serilog log event enrichers in the Operations.Application layer to automatically attach metadata like event types, IDs, and timestamps to logs, alongside a new HttpClient delegating handler that injects service context into outgoing HTTP requests.

(repo-wide) · high confidence

New command request endpoints with queueing and OpenAPI support

The \src/Commands.Application.Web\ library now provides a complete infrastructure for exposing domain commands as HTTP endpoints. It introduces a fluent registration API (\CommandRequestOptionsExtensions\) that maps commands to specific HTTP routes (GET, POST, PUT, DELETE) and supports both synchronous responses and asynchronous queue-based processing (returning 202 Accepted with a Location header). The system automatically generates OpenAPI (Swagger) documentation for these commands via \CommandRequestDocumentProcessor\, ensuring API consumers see accurate schemas and operation details. Additionally, it includes a background queue processor (\CommandRequestQueueProcessor\) and event handler (\CommandRequestQueueEventHandler\) to manage the lifecycle of queued commands, including status tracking and optional result storage.

src/Commands.Application.Web · high confidence

New compression utilities for byte arrays, streams, and files

The Foundation.Compression module now provides a new set of helpers for GZip compression and decompression. Users can compress and decompress byte arrays and streams via the CompressionHelper class, or work directly with files using FileCompressionHelper, which supports compressing files to .gz and decompressing them back to original paths or output streams. Extension methods are also available on Stream for convenient Compress and Decompress calls.

src/Foundation.Compression · high confidence

New dashboard UI framework with navigation menu support

The application now includes a new dashboard UI framework located in the Dashboard module. This introduces a DashboardMenuItem class for defining navigation items (name, URL, icon) and an HttpResponseExtensions method to render a standardized HTML dashboard page. The default dashboard includes links to service context, health, logging, tracing, requests, messaging, queueing, job scheduling, journal, and Swagger, styled with Font Awesome icons and a custom CSS file.

src/Foundation.Application.Web/Dashboard · high confidence

New distributed tracing domain model for spans

The tracing domain layer now includes a complete set of model classes for representing distributed tracing spans. This introduces the \Span\ class and its \ISpanBuilder\ interface for constructing spans with trace/span IDs, operation names, tags, and logs. It also defines core enums and constants including \SpanKind\ (Internal, Server, Client, Producer, Consumer), \SpanStatus\ (Transient, Succeeded, Cancelled, Failed), and standard semantic tag/log keys (e.g., HTTP, database, peer, and error conventions) aligned with OpenTracing specifications.

src/Tracing.Domain/Model/Span · high confidence

New domain model foundation classes and interfaces

The domain model layer now includes a set of new base classes and interfaces to support domain-driven design patterns. This introduces \Entity\<TId\>\ as the base for entities with identity and equality semantics, \ValueObject\ and \ValueObjectComparable\ for immutable value types with equality and comparison support, and \State\ for tracking lifecycle metadata (created, updated, deleted, etc.). Additionally, new interfaces such as \IEntity\, \IAggregateRoot\, \IStateEntity\, \IIdentifiable\, \ITenantEntity\, and \IHaveCorrelationId\ are provided to define contracts for domain objects, alongside a \DomainEvents\ class for managing and dispatching domain events via MediatR and a \DataDictionary\ for flexible key-value storage.

src/Foundation.Domain/Model · high confidence

New embedded and folder-based file storage providers

The FileSystem infrastructure now includes two new implementations of the IFileStorage interface: EmbeddedFileStorage, which serves files from .NET assembly embedded resources, and FolderFileStorage, which manages files on the local disk. Both providers support configuration via dedicated options builders (EmbeddedFileStorageOptionsBuilder and FolderFileStorageOptionsBuilder) allowing users to specify assemblies or target folders and custom serializers.

src/FileStorage.Infrastructure.FileSystem · high confidence

New exception and result types for HTTP error handling

The application now includes a new \HttpException\ base class and specific subclasses (\BadRequestException\, \NotFoundException\) that carry HTTP status codes and model state information, alongside a custom \InternalServerErrorObjectResult\ for standardized 500 responses. These types are located in \src/Foundation.Application.Web\ and provide a structured way to handle and return HTTP errors from API controllers. Additionally, an empty \ArmConfiguration\ class was added in \src/Foundation.Infrastructure.Azure.Arm\, likely serving as a placeholder for future Azure ARM configuration.

src/Foundation.Application.Web/Exceptions, src/Foundation.Application.Web/Results, src/Foundation.Infrastructure.Azure.Arm · high confidence

New expression utility extensions for LINQ and property access

Added \ExpressionExtensions\ and \ExpressionHelper\ classes to the \Naos.Foundation\ namespace. \ExpressionExtensions\ provides an \Expand\ method that flattens \Invoke\ calls and expands compiled expressions, enabling complex predicate builders to work correctly with Entity Framework. \ExpressionHelper\ offers utilities for inspecting expression trees, including methods to extract property names (\GetPropertyName\), retrieve \PropertyInfo\ objects (\GetProperty\), evaluate expression values (\GetValue\), and generate delegates or string representations for specific properties.

src/Foundation.Utilities/Expressions · high confidence

New generic repository foundation with entity mapping and ID generation

This change introduces the core abstractions and implementations for the domain's data access layer. It adds a generic repository pattern (IGenericRepository, GenericRepository, and their read-only counterparts) that supports CRUD operations, specification-based queries, and result tracking via RepositoryActionResult. It also introduces FindOptions for controlling pagination, ordering, and eager loading (includes), a new EntityGuidIdGenerator for creating sequential or standard GUIDs, and an IEntityMapper interface for translating between entity types and specifications.

src/Foundation.Domain.Repositories · high confidence

New health dashboard and service identity middleware

This change introduces new middleware components that enhance the user experience by providing a built-in health dashboard and explicit service identity headers. The \ServiceContextMiddleware\ now serves a dashboard UI (including custom CSS and a favicon) when accessing the root path or \/index.html\, allowing users to view service details and tags directly in the browser. Additionally, the \ServicePoweredByMiddleware\ automatically adds an \X-PoweredBy: naos\ header to responses, making the underlying platform visible to clients and tools.

src/ServiceContext.Application/Web/Middleware · high confidence

New in-memory message broker and subscription map introduced

The messaging layer now includes a new in-memory implementation for publishing messages and managing subscriptions. This change introduces the \IMessageBroker\ interface for core publish/subscribe operations, alongside a \SubscriptionMap\ that tracks message-handler bindings and exposes subscription details. Users can now register and unregister handlers via the broker, with the underlying map handling the lifecycle of these subscriptions in memory.

src/Messaging · high confidence

New interactive console commands for process info, echo, and history

The console application now supports several new interactive commands: \process\ displays current process details (PID, memory, GC counts) and can force a garbage collection with the \-c\ flag; \echo\ prints a text message with an optional UTC timestamp; \history\ lists previously entered commands; \cls\ clears the screen; \exit\ terminates the session while saving command history to a local file; \help\ shows an overview of available commands; and \logo\ displays the application logo and service descriptor. These commands are implemented using a MediatR-based command/event handler pattern and utilize Colorful.Console for colored output.

src/Foundation.Console/Commands · high confidence

New interactive console with command parsing and history

The application now includes an interactive console hosted service that allows users to execute commands via a readline interface. This service discovers registered console commands, parses user input using the CommandLine library, and dispatches them through the MediatR pipeline. It features command history persistence, basic auto-completion for specific command prefixes (echo, messaging, queueing, jobscheduler), and colored output for status feedback.

src/Foundation.Console/App · high confidence

New logging infrastructure and operations service registration

The Operations.Application layer now includes a complete logging setup and operations service registration. A custom CamelCasedJsonFormatter ensures Serilog JSON output uses camelCase property names. Logging adapters bridge Microsoft.Extensions.Logging with the internal logging interface, and extension methods allow configuring file, console, and Seq sinks via configuration. A LoggingFilterContext provides default criteria for querying log events (environment, message, level, time range). Finally, the NaosExtensions and OperationsOptionsExtensions register the ILogEventService, HttpClient logging handlers, and interactive console support.

src/Operations.Application · high confidence

New message handler infrastructure with correlation ID tracing

The messaging domain now includes a new handler framework located in src/Messaging/Domain/Handlers. This introduces the IMessageHandler\<T\> interface and a ServiceProviderMessageHandlerFactory for instantiating handlers via dependency injection. Concrete implementations (DummyMessageHandler, EchoMessageHandler, EchoEntityMessageHandler, and the generic EntityMessageHandler\<T\>) have been added, all of which now log incoming messages with structured correlation IDs to support distributed tracing.

src/Messaging/Domain/Handlers · high confidence

New middleware extension methods for service context and request tracing

Developers can now explicitly enable service context descriptors and request tracing in the HTTP request pipeline using new extension methods. The \UseServiceContext\ and \UseNaosServicePoweredBy\ methods in \ServiceContext.Application.Web\ allow adding service metadata and powered-by headers to API responses, while \UseOperationsTracing\ in \Tracing.Application.Web\ injects a middleware to trace incoming requests. These changes simplify startup configuration by providing dedicated fluent API calls for these cross-cutting concerns.

src/ServiceContext.Application/Web, src/Tracing.Application.Web · high confidence

New object serialization extensions for KeyValueStorage

Added two new extension methods to the Naos.KeyValueStorage library to facilitate conversion between objects and key-value dictionaries. The \ToDictionary\ method allows any object to be serialized into an \IDictionary\<string, object\>\ by reflecting its public properties, while the \ToObject\<T\>\ method enables deserializing a dictionary back into a strongly-typed class instance by mapping dictionary keys to class properties.

src/KeyValueStorage/Extensions · high confidence

New queueing metrics and echo endpoints

Added two new API controllers to expose queueing system information. The \NaosQueuesController\ provides a GET endpoint at \/naos/queueing/queues\ that returns metrics for all registered queues. The \NaosQueueingEchoController\ adds a GET endpoint at \/naos/queueing/echo\ which enqueues a test message and returns combined queue metrics, aiding in debugging and verification of queue connectivity.

src/Queueing.Application.Web/Controllers · high confidence

New repository decorators for cross-cutting concerns

The repository layer now includes a set of new decorator classes that wrap the generic repository interface to provide additional capabilities. These include \RepositoryDomainEventsDecorator\ for publishing domain events, \RepositoryLoggingDecorator\ for structured logging, \RepositoryIncludeDecorator\ and \RepositoryOrderDecorator\ for query composition, \RepositorySpecificationDecorator\ for filtering, \RepositoryStateSoftDeleteDecorator\ for soft-delete logic, and \RepositoryTenantDecorator\ for multi-tenancy support.

src/Foundation.Domain.Repositories/Decorators · high confidence

New startup task execution pipeline and object mapping utilities

The application now supports executing \IStartupTask\ implementations during the server lifecycle via a new \StartupTaskServerDecorator\ that wraps the underlying \IServer\, allowing tasks to run on startup and shutdown with optional delays. This is exposed through new \ServiceCollectionExtensions\ and \StartupTaskExtensions\ methods for registering these tasks. Additionally, a new generic object mapping framework has been introduced in the \Foundation.Mapping\ project, featuring an \IMapper\ interface, a concrete \Mapper\ class, and extension methods for mapping single objects and collections.

src/Foundation.Application.Web.Startup · high confidence

New startup tasks for database migrations and seeding

The application now includes built-in support for applying pending Entity Framework Core migrations and seeding initial data during startup. A new \ApplyPendingMigrationsTask\ automatically runs database migrations when the application starts, while a generic \SeederStartupTask\ allows registering entities to be inserted into the database if they do not already exist. These capabilities are exposed via a new \ServiceCollectionExtensions\ method, \AddSeederStartupTask\, which simplifies the registration of seed data with optional delays.

src/Foundation.Application.Web.Startup.EntityFramework · high confidence

New structured journal logging extension method

The Foundation.Logging library now includes a new \LogJournal\ extension method on \ILogger\. This method allows callers to emit structured log entries with a specific key, message, type, and optional duration, automatically wrapping the log in a scope that attaches metadata such as track type (set to 'Journal'), duration in milliseconds, and a UTC timestamp. The implementation includes a fallback mechanism to handle potential \IndexOutOfRangeException\ errors during log formatting by downgrading the log level to Warning, ensuring robustness in high-throughput logging scenarios.

src/Foundation.Logging · high confidence

New system health checks for CPU and memory

The application now includes dedicated health checks for system CPU and memory usage. The new SystemCpuHealthCheck and SystemMemoryHealthCheck components monitor resource utilization, reporting a Degraded status when usage exceeds 80% and an Unhealthy status when it exceeds 90%. These checks are supported by a new HealthReportResponseWriter that formats the aggregated health report into a structured JSON response for consumers.

src/Operations.Application.Web/Health · high confidence

New tenant-aware repository extension methods

Added new asynchronous extension methods to the repository layer that automatically enforce tenant isolation. The \FindAllAsync\ overloads now accept a \tenantId\ parameter and internally apply a \HasTenantSpecification\ to filter results, ensuring that queries only return entities belonging to the specified tenant. Similarly, \FindOneAsync\ now accepts a \tenantId\ and verifies that the retrieved entity satisfies the tenant constraint before returning it, preventing cross-tenant data leakage.

src/Foundation.Domain.Repositories/Extensions · high confidence

New trace sampling strategies added

The tracing domain now includes a set of new sampler implementations to control which spans are recorded. Users can choose from a ConstantSampler that always samples, a NoopSampler that never samples, an OperationNamePatternSampler that samples based on operation name patterns, and a RateLimiterSampler that samples based on a rate-limiting credit system. These new classes implement the ISampler interface, allowing for more granular control over trace data volume.

src/Tracing.Domain/Model/Sampling · high confidence

New unified serialization foundation with multiple format support

The serialization layer has been restructured around a new \ISerializer\ interface and a \DefaultSerializer\ factory that defaults to MessagePack. This change introduces a suite of serializer implementations including JsonNet, Bson, Binary, Base64, Hex, and Gzip (compression), along with a Rijndael (encryption) wrapper. Extension methods are provided to simplify serialization to and from strings and byte arrays, automatically handling encoding based on whether the serializer is a text format.

src/Foundation.Serialization/Serializers · high confidence

New utility extension methods for cloning, dumping, hashing, and ordering

Added a set of new extension methods to the Foundation.Utilities library to simplify common object operations. Developers can now clone objects using either BSON or JSON serialization via the new Clone extension, dump object contents to formatted or unformatted JSON strings for logging with the Dump extension, and compute SHA-256 or other algorithm hashes from byte arrays using GetHash. Additionally, the library now supports dynamic ordering of IEnumerable and IQueryable collections by property name (ascending or descending) through the OrderBy extensions, and provides a convenience Send method for MediatR that accepts dynamic request objects.

src/Foundation.Utilities/Extensions · high confidence

New utility libraries for encoding and conditional request pipelines

This release introduces new foundation libraries to enhance application capabilities. In \Foundation.Encoding\, developers now have access to \Base36\ for encoding and decoding numeric identifiers, and \Base64\ for handling URL and filename-safe Base64 encoding and decoding, which is useful for generating compact, safe strings for URLs or filenames. Additionally, \Foundation.Application.Web\ adds \ApplicationBuilderExtensions\ that provide \UseIf\ and \UseIfElse\ methods, allowing developers to conditionally add middleware to the ASP.NET Core request execution pipeline based on boolean flags or \HttpContext\ conditions, simplifying the setup of environment-specific or feature-flagged middleware configurations.

src/Foundation.Application.Web, src/Foundation.Encoding · high confidence

New xUnit test utilities for logging and test categorization

The \src/Foundation.Utilities.Xunit\ library now includes a comprehensive xUnit test logger that routes Microsoft.Extensions.Logging output directly to the test output window, featuring configurable formatting, structured scope tracking, and filtering logic. Additionally, the library introduces a set of custom xUnit traits (Bug, FitnessTest, IntegrationTest, SystemTest, UnitTest) with their corresponding discoverers, enabling developers to easily categorize and filter tests using standard xUnit filtering syntax.

src/Foundation.Utilities.Xunit · high confidence

Outbound HTTP request and response logging added

The HttpClientLogHandler and its builder filter have been added to automatically log details of outbound HTTP requests and responses. This includes logging request URIs, headers, response status codes, and execution duration, with error-level logging for server errors (5xx) and warning-level for client errors (4xx). The handler integrates with the standard HttpClientFactory via an IHttpMessageHandlerBuilderFilter, ensuring that all HTTP clients configured within the application benefit from this observability without requiring manual instrumentation.

src/Foundation.Application.Web/Client/Handlers · high confidence

RabbitMQ broker integration and configuration

The application now supports RabbitMQ as a message broker. A new configuration class allows specifying connection details (host, port, credentials, virtual host) and retry counts. The DI extension registers the RabbitMQ message broker, configures subscriptions, and adds a health check for the broker connection.

src/Messaging.Application.RabbitMQ · high confidence

RabbitMQ queueing provider integration

The application now supports RabbitMQ as a message queue provider. A new extension method allows configuring RabbitMQ connection details (host, port, credentials) and registers the necessary services, including a health check endpoint for the queueing provider.

src/Queueing.Application.RabbitMQ · high confidence

Repository operations now emit distributed tracing spans

The new RepositoryTracingDecorator wraps generic repositories to automatically create distributed tracing spans for all data operations (insert, update, delete, find, upsert, count). Each span is tagged with the entity name and database type (SQL), providing visibility into repository performance and execution flow without requiring changes to existing repository implementations.

src/Tracing.Domain/Repositories/Decorators · high confidence

Request filtering middleware and context support

The Filtering.Application layer now provides a complete request filtering capability. A new middleware (RequestFilterMiddleware) intercepts HTTP requests to parse query string parameters (q, order, skip, take) into a FilterContext, which is then made available via an IFilterContextAccessor for downstream use. The package includes factories to convert this context into LINQ Specifications or FindOptions for data retrieval, and registers the necessary services via DI extensions. An echo controller is also included to expose the parsed filter context for debugging.

src/Filtering.Application · high confidence

SSH/SFTP file storage implementation added

The \src/FileStorage.Infrastructure.Ssh\ package now provides an \SshNetFileStorage\ implementation of the \IFileStorage\ interface, enabling file operations (read, write, delete, rename, copy) over SFTP using the Renci.SshNet library. This change introduces new configuration options (\SshNetFileStorageOptions\) and a builder pattern for setting connection details such as connection strings, proxy settings, and private key authentication.

src/FileStorage.Infrastructure.Ssh · high confidence

Service context registration and health check integration

The application now registers the service context via a new \NaosExtensions\ class, which configures the \HttpClientServiceContextHandler\, establishes a singleton \ServiceDescriptor\ based on the product and capability metadata, and registers a basic health check endpoint. This change also defines a feature flag for 'ServiceContext' and sets up the echo route at 'naos/servicecontext/echo'.

src/ServiceContext.Application · high confidence

Structured HTTP exception handling middleware

The application now includes a new exception handling middleware that intercepts unhandled errors and returns structured JSON Problem Details responses instead of raw stack traces. This middleware supports configurable detail hiding and includes specific handlers for common scenarios: BadRequestException, NaosClientFormatException, FluentValidation.ValidationException, and Kestrel's BadHttpRequestException. It automatically registers all implementations of IExceptionResponseHandler via dependency injection and suppresses the default ASP.NET Core model state invalid filter to allow these custom handlers to manage validation errors.

src/Exceptions.Application.Web · high confidence

Zipkin tracing exporter configuration via extension method

The application now supports exporting trace spans to Zipkin through a new \UseZipkinExporter\ extension method on \OperationsTracingOptions\. This method reads configuration from the \naos:operations:tracing:zipkin\ section to determine the Zipkin host and whether the exporter is enabled. When enabled, it registers the \ZipkinSpanExporter\ as a singleton service and adds a health check endpoint at the Zipkin host's \/health\ path to monitor the exporter's connectivity.

src/Tracing.Application.Zipkin · high confidence

Behavioural changes

Added architecture fitness policy for DDD layering and naming

Introduced an architecture fitness policy in the Application layer that enforces Domain-Driven Design guidelines. This policy validates that messages, commands, queries, and their handlers reside in the Application layer, while domain entities, aggregates, events, and specifications are confined to the Domain layer. It also ensures repositories are placed in Domain or Infrastructure, prevents the Domain layer from depending on Infrastructure, and enforces specific naming conventions for messages, handlers, and interfaces.

src/Application/Fitness · high confidence

Added branding assets and custom styling for Swagger UI

The application now includes a favicon, a logo image, and custom CSS files to enhance the visual presentation of the API documentation. Users will see a branded favicon and logo in the browser tab and UI, while the Swagger interface itself has been restyled with a dark theme (Monokai-inspired) and monospace fonts to improve readability and match the application's aesthetic.

src/Foundation.Resources/Resources · high confidence

Automatic state tracking and identifier hashing for domain entities

The foundation now automatically manages entity lifecycle metadata when domain events occur. When an entity is inserted or updated, the system automatically sets the creation or update timestamp (marked with identity '\[IDENTITY\]' and source 'domainevent') and computes the entity's identifier hash, provided the entity implements the relevant interfaces. Additionally, a generic tracking handler logs all domain events to the journal for observability.

src/Foundation.Domain/Events/Handlers · high confidence

Azure Cosmos DB provider upgraded to SDK v3 with new repository implementations

The Azure Cosmos DB infrastructure has been updated to use the Microsoft.Azure.Cosmos SDK v3, replacing the previous v2 client. This change introduces new \CosmosSqlProviderV3\ and \CosmosSqlRepository\ implementations that leverage the modern SDK's LINQ query capabilities and partition key handling. The update includes a new \CosmosConfiguration\ class for connection settings, specific extension methods for query building (such as \WhereExpression\ and \OrderByIf\), and support for the v3 document model which no longer requires the discriminator-based collection structure of v2.

src/Foundation.Infrastructure.Azure.Cosmos · high confidence

Cosmos DB repository implementation for messages is commented out

The file implementing the Cosmos DB repository for messages (MessageCosmosDbRepository) has been added but its code is entirely commented out. This means the repository class and its dependencies (IMediator, ICosmosDbSqlProvider) are not currently active or compiled into the application, effectively disabling this specific data access path for messages until the code is uncommented.

src/Messaging.Infrastructure.Azure/CosmosDb · high confidence

Disabled message repository interface

The IMessageRepository interface in the Messaging domain has been disabled by commenting out its code. This change effectively removes the repository contract from the active codebase, likely as part of a broader refactoring or deprecation of the messaging repository pattern.

src/Messaging/Domain/Repositories · high confidence

File storage operations now include logging and scoped path isolation

File storage interactions are now wrapped with two new decorators that enhance observability and organization. The FileStorageLoggingDecorator records details for every operation (such as file reads, saves, and deletions), including the size of saved files in human-readable format. The FileStorageScopedDecorator automatically prefixes all file paths with a configurable scope, supporting dynamic placeholders for environment names and date-based segments (year, month, day) to help isolate data across different contexts or time periods.

src/FileStorage/Domain/Decorators · high confidence

Introduce .NET Core 3.1 compatibility for application context

The application context infrastructure now supports .NET Core 3.1 alongside .NET Standard 2.0. The \INaosApplicationContext\ interface and its implementation \NaosApplicationContext\ conditionally expose \IWebHostEnvironment\ for .NET Core 3.1 or \IHostingEnvironment\ for .NET Standard 2.0. The \NaosExtensions.UseNaos\ middleware method has been updated to resolve the correct environment service based on the target framework, ensuring the application context is correctly initialized in .NET Core 3.1 environments.

src/Configuration.Application.Web · high confidence

New EF Core repository query and persistence extension methods

The repository layer now includes a set of LINQ and DbContext extension methods in \src/Foundation.Infrastructure.EntityFramework/Repositories/Extensions\ to simplify data access patterns. \DbContextExtensions\ adds \SaveChangesAsync\<T\>\ to persist only a specific aggregate type while ignoring others, and \ExecuteScopedAsync\ to run operations within a transaction using the database's retry strategy. Query building is streamlined with conditional helpers: \IncludeIf\, \OrderByIf\, \SkipIf\, \TakeIf\, and \WhereExpression\ apply filtering, sorting, and pagination only when options are provided, while \TrackChangesIf\ toggles change tracking. Additionally, \ToListAsyncSafe\ ensures safe async enumeration. These utilities allow repositories to construct queries and manage transactions more declaratively.

src/Foundation.Infrastructure.EntityFramework/Repositories/Extensions · high confidence

New Entity Framework repository implementation with specification support

The \src/Foundation.Infrastructure.EntityFramework/Repositories\ area now provides a new \EntityFrameworkRepository\ implementation that replaces the previous data access layer. This change introduces support for LINQKit-based specifications, allowing complex query composition via \ISpecification\ objects, and adds configurable event publishing through MediatR for insert and update operations. The repository also includes options for tracking changes and mapping between entity and destination types, providing a more flexible and testable data access pattern for users.

src/Foundation.Infrastructure.EntityFramework/Repositories · high confidence

New MVC conventions for default authorization and dynamic routing

The application now includes a set of new conventions in the \Naos.Foundation.Application\ namespace that automatically enforce security and routing policies. \AuthorizeByDefaultConvention\ ensures that all API actions require authentication by default unless explicitly marked with \\[AllowAnonymous\]\. \GeneratedControllerRouteConvention\ and \GeneratedControllerAttribute\ allow controllers to automatically derive their route prefixes from a custom attribute or controller name. Additionally, \RoutePrefixConvention\ provides a mechanism to apply a global route prefix to all controllers.

src/Foundation.Application.Web/Conventions · high confidence

Standardized HTTP client configuration with resilience and observability

The application now automatically configures outbound HTTP clients with a consistent set of middleware and resilience policies. New extension methods in \HttpClientBuilderExtensions\ and \NaosExtensions\ wire up correlation, service context, tracing, and logging handlers to every registered client by default. Additionally, clients are configured with a retry policy (exponential backoff, 3 attempts) and a circuit breaker (3 failures, 30-second break duration) to handle transient errors, while health checks are automatically registered for typed service clients.

src/Application · high confidence

Test coverage

Added Codecov Bash uploader script to tests directory; Added Entity Framework test infrastructure for User Accounts; Added Foundation unit test infrastructure and coverage reporting setup; Added architecture fitness tests for domain model rules; Added architecture fitness tests for sample domains; Added architecture fitness tests for the Customers sample; Added domain event handlers for UserAccount entity lifecycle events; Added domain model and events for the shopping cart sample; Added domain model classes for the Sample UserAccounts feature; Added domain model classes for the sample customer service; Added domain model, handlers, and repository interfaces for the Sample Inventory feature; Added domain specifications for user account filtering; Added initial Entity Framework migration for UserAccounts; Added integration test infrastructure and base classes; Added integration tests for Catalogs Infrastructure; Added integration tests for Cosmos DB SQL Provider V3; Added integration tests for Country domain events and repository operations; Added integration tests for Customer and Order repositories; Added integration tests for EventStore-based event sourcing; Added integration tests for Inventory and Replenishment repositories; Added integration tests for core infrastructure components; Added integration tests for customer domain event handlers; Added integration tests for the CreateCustomer command handler; Added integration tests for the Shopping Cart domain model; Added repository interfaces and implementations for the Sample Customers domain; Added sample application command and query handlers for customer operations; Added sample job implementations and data model for countries export/import; Added sample web application scaffolding for testing; Added seeder startup task and commented-out controller in UserAccounts sample; Added test composition roots and placeholder controllers for sample modules; Added test coverage for Country domain event handlers; Added test handler for countries export data with random failure simulation; Added test harness for Customer domain event handlers; Added test infrastructure for Countries sample presentation; Added test infrastructure for Country domain mapping; Added test infrastructure for Customer Order mapping; Added test infrastructure for Sample Catalogs domain; Added test module for customer application composition root; Added test project for Sample Application Web2; Added tests for Inventory Infrastructure mapping and document models; Added tests for inventory seeder startup task; Added unit tests and benchmarks for Foundation serialization serializers; Added unit tests for Azure Service Bus, Azure Storage, and In-Memory queue implementations; Added unit tests for Cosmos DB, File, LightningDB, and Table storage implementations; Added unit tests for Entity Framework repository operations; Added unit tests for EventSourcingRepository; Added unit tests for FileStorage implementations; Added unit tests for FileStorage infrastructure providers; Added unit tests for FilterContextFactory; Added unit tests for Foundation domain repositories and specifications; Added unit tests for Foundation extension methods and mapping utilities; Added unit tests for Foundation utilities; Added unit tests for Foundation utilities; Added unit tests for JobScheduling domain models and services; Added unit tests for KeyValueStorage base operations; Added unit tests for RouteMatcher utility; Added unit tests for UserAccountsClient; Added unit tests for ValidateCommandBehavior; Added unit tests for command request handling; Added unit tests for country code and name specifications; Added unit tests for customer and order domain specifications; Added unit tests for domain event messaging publisher; Added unit tests for domain model specifications and value objects; Added unit tests for file and stream compression helpers; Added unit tests for generic repository controller base classes; Added unit tests for the Country domain model; Added unit tests for the Tracing domain logic; Integration tests added for UserAccount and UserVisit repositories.

Dependencies

Upgrade to .NET Core 3.1 and MediatR 8

The foundation libraries and application components have been upgraded to target .NET Core 3.1 (while maintaining netstandard2.0 support for shared code) and updated to use MediatR version 8.0.1. This change brings the codebase in line with the .NET Core 3.1 LTS release and the latest MediatR features, ensuring compatibility with modern ASP.NET Core 3.1 infrastructure packages like Microsoft.AspNetCore.Mvc.NewtonsoftJson and Microsoft.EntityFrameworkCore 3.1.5.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 44.

Lenses

  • Code Health 39
  • Architecture 69
  • Maturity 64
  • Readiness 47
  • Security 40
  • Domain Modelling 51
  • Event-Driven 100
  • Performance 67

Changes since last survey

  • 300 commits — 284 feature/other, 16 fixes

By area

  • tests/Sample — 39 commits
  • (root) — 31 commits
  • src/Foundation.Domain.Repositories — 19 commits
  • tests/Sample.IntegrationTests — 17 commits
  • tests/Sample.Application.Web — 16 commits
  • src/Foundation.Domain.EventSourcing — 12 commits
  • src/Queueing.Infrastructure.Azure — 11 commits
  • src/Foundation.Utilities — 10 commits
  • (repo) — 9 commits
  • src/Foundation.Infrastructure.EntityFramework — 9 commits
  • src/Foundation.Domain — 8 commits
  • src/Foundation.Extensions — 8 commits
  • src/Application.Web — 6 commits
  • src/Foundation.Infrastructure.Azure.Cosmos — 6 commits
  • src/Foundation.Infrastructure.EventStore — 6 commits
  • tests/Sample.FitnessTests — 6 commits
  • src/Foundation.Application.Web.Startup.EntityFramework — 5 commits
  • src/Foundation.Domain.Specifications — 5 commits
  • src/Foundation.Resources — 5 commits
  • src/Application — 4 commits

Notable commits

  • fix: AggregateRoot domainevents fix
  • fix: build fix
  • fix: enum fix
  • fix: job correlationid fix
  • fix: mapper fix
  • fix: messaging singleton subscriptions fix
  • fix: migration fix
  • fix: nuget + humanizer core regression (interpolation issue)
  • fix: order fix
  • fix: order fix (cosmos)
  • fix: repo log decorator fix
  • fix: seq fix
  • fix: softdelete decorator fix (count)
  • fix: style fix
  • fix: succeeded fix
  • fix: upsert fix
  • change: +web2 + queueing
  • change: AddModules
  • change: AddSeederStartupTask
  • change: AddSeederStartupTask
  • …and 280 more

API surface

  • 27 HTTP endpoints (baseline)

Architecture

  • 2 containers · 6 bounded contexts · 5 dependency edges (baseline)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

vip32/Naos was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 8c1cd1350e01f0d52dd0553444df226a5b3f2b0a — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.