This commit is contained in:
2026-05-25 14:02:56 +02:00
parent 29bd42e52e
commit 758b152a0c
1798 changed files with 1991205 additions and 481068 deletions
+14 -10
View File
@@ -1,13 +1,13 @@
{
"generatedAt": "2026-05-22T06:58:01.149Z",
"runId": "v4-1779429619297-t7x306q1",
"generatedAt": "2026-05-25T11:41:38.940Z",
"runId": "v4-1779707139870-rlu0248l",
"agentVersion": "v4.1-streaming",
"totalDurationMs": 3461851,
"totalDurationMs": 2159068,
"phaseTiming": {
"phase0": 934,
"phase1": 53278,
"pipeline": 3377465,
"phase5": 29989
"phase0": 1390,
"phase1": 36355,
"pipeline": 2082571,
"phase5": 30289
},
"config": {
"llmCandidateCount": 5,
@@ -22,15 +22,19 @@
"erDiagrams": false,
"experimentalDiagramFamilies": false,
"publicationCollections": true,
"businessFlowGeneration": true
"businessFlowGeneration": true,
"v5LocalDiagramsOnly": false,
"v5StitchedFlowPreview": true,
"v5ComposedMarkdownPublication": true,
"v5FullDefault": false
}
},
"project": {
"technology": "dotnet",
"totalFiles": 198,
"uniqueFilesSummarized": 189,
"uniqueFilesSummarized": 187,
"documentsGenerated": 10,
"collectionsPlanned": 4,
"collectionsPlanned": 7,
"projectArchetype": "web-application",
"candidateEntrypoints": 20
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -4,5 +4,5 @@ This collection groups business documentation generated from the repository sema
### Documents
- [Business Overview](business-overview.md): ## Business Overview Business Overview centers on account, ai token usage / limits, ai tokens and c...
- [Business Overview](business-overview.md): ## Business Overview Business Overview centers on account, ai tokens, ai tokens (aitokensused, aito...
- [Top Business Flows](top-business-flows.md): ## Top Business Flows Highest-value business flows that should be published as first-class system e...
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","purpose":"Defines application-level command abstractions used with MediatR and FluentResults to represent operations that return FluentResults (optionally with a typed payload).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace NexusReader.Application.Abstractions.Messaging indicates an application-layer contract","Interfaces extend MediatR IRequest and use FluentResults Result types"]},"className":"","methods":[],"types":[{"name":"ICommand","kind":"interface","line":6,"purpose":"Marker/contract for a command that produces a FluentResults.Result when handled via MediatR.","fields":[]},{"name":"ICommand<TResponse>","kind":"interface","line":10,"purpose":"Generic command contract that produces a FluentResults.Result<TResponse> when handled via MediatR.","fields":[{"name":"TResponse","type":"type-parameter","required":true,"line":10,"description":"Generic result payload type returned inside Result<TResponse>"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (external)","MediatR (external)"],"patterns":["Command Pattern","Mediator"],"domainConcepts":[],"keyDetails":"Two simple interfaces that unify MediatR IRequest with FluentResults.Result to standardize command return shapes across the application.","orchestrationMethods":[],"typedContracts":[{"name":"ICommand","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"name":"ICommand<TResponse>","kind":"interface","line":10,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommand","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"kind":"typed-contract","label":"ICommand<TResponse>","line":10,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","purpose":"Defines application-level command message contracts used with MediatR and FluentResults to represent commands that return operation Results.","classification":{"role":"handler","layer":"application","confidence":0.72,"evidence":["Command pattern","Namespace NexusReader.Application.Abstractions.Messaging indicates application-level messaging abstractions","Interfaces extend MediatR IRequest with FluentResults result types (IRequest<Result / Result<T>>)"]},"className":"","methods":[],"types":[{"name":"ICommand","kind":"interface","line":6,"purpose":"Marker interface for commands that produce a FluentResults.Result with no payload via MediatR.","fields":[]},{"name":"ICommand<TResponse>","kind":"interface","line":10,"purpose":"Generic marker interface for commands that produce a FluentResults.Result<TResponse> via MediatR.","fields":[{"name":"TResponse","type":"generic","required":true,"line":10,"description":"Response payload type parameter for the Result<TResponse> wrapped by the command"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["CQRS","Command"],"domainConcepts":["Command"],"keyDetails":"Two marker interfaces mapping application commands to MediatR IRequest<Result> / IRequest<Result<T>> using FluentResults; no runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"ICommand","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"name":"ICommand<TResponse>","kind":"interface","line":10,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommand","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]},{"kind":"typed-contract","label":"ICommand<TResponse>","line":10,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommand.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ed5694bdf95984b1a21d2929ad8dbbb1a75cf66c8dfa733422262666478b3066","sourceByteSize":229,"analyzedAt":"2026-05-23T16:16:03.990Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","purpose":"Declares application-level command handler abstractions that adapt MediatR IRequestHandler to return FluentResults.Result, standardizing command handling signatures across the Application layer.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Abstractions.Messaging","Interfaces extend MediatR IRequestHandler and use FluentResults.Result"]},"className":"ICommandHandler","methods":[],"types":[{"name":"ICommandHandler<TCommand>","kind":"interface","line":6,"purpose":"Represents a command handler that processes a command and returns a FluentResults.Result (no data).","fields":[]},{"name":"ICommandHandler<TCommand, TResponse>","kind":"interface","line":11,"purpose":"Represents a command handler that processes a command and returns a FluentResults.Result with a typed response.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults","MediatR","ICommand (project-local type, path unknown)"],"patterns":["Mediator","Command Handler","Dependency Inversion"],"domainConcepts":["Command","Result"],"keyDetails":"Two small interface abstractions adapting MediatR handlers to use FluentResults.Result; no implementations or runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"ICommandHandler<TCommand>","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"name":"ICommandHandler<TCommand, TResponse>","kind":"interface","line":11,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommandHandler<TCommand>","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"kind":"typed-contract","label":"ICommandHandler<TCommand, TResponse>","line":11,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","purpose":"Defines application-level command handler contracts that adapt MediatR IRequestHandler to return FluentResults.Result wrappers for command operations.","classification":{"role":"handler","layer":"application","confidence":0.75,"evidence":["Command pattern","Namespace: NexusReader.Application.Abstractions.Messaging","File declares ICommandHandler interfaces that extend MediatR IRequestHandler","Types are generic command handler abstractions used at application layer"]},"className":"","methods":[],"types":[{"name":"ICommandHandler<TCommand>","kind":"interface","line":6,"purpose":"Contract for handling command messages that returns a FluentResults.Result indicating success or failure.","fields":[]},{"name":"ICommandHandler<TCommand, TResponse>","kind":"interface","line":11,"purpose":"Contract for handling command messages that return a typed response wrapped in FluentResults.Result<TResponse>.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Mediator","Command Handler"],"domainConcepts":["Command","Result (operation outcome)"],"keyDetails":"Two small generic interfaces that adapt MediatR's IRequestHandler to return FluentResults.Result/Result<T>, serving as the application-layer command handler abstractions.","orchestrationMethods":[],"typedContracts":[{"name":"ICommandHandler<TCommand>","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"name":"ICommandHandler<TCommand, TResponse>","kind":"interface","line":11,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ICommandHandler<TCommand>","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]},{"kind":"typed-contract","label":"ICommandHandler<TCommand, TResponse>","line":11,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ed38724a52e6c34ec76ebc2538078d618812fb7da2b6b928a4f91b502cd2ef08","sourceByteSize":370,"analyzedAt":"2026-05-23T16:16:02.195Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Messaging/IQuery.cs","purpose":"Defines a marker interface for application-layer read/query operations that use MediatR and return a FluentResults.Result-wrapped response.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Abstractions.Messaging","public interface IQuery<TResponse> : IRequest<Result<TResponse>> (extends MediatR IRequest and uses FluentResults)"]},"className":"","methods":[],"types":[{"name":"IQuery<TResponse>","kind":"interface","line":6,"purpose":"Marker interface representing a CQRS query that returns a Result-wrapped TResponse via MediatR.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (package)","MediatR (package)"],"patterns":["CQRS","Mediator"],"domainConcepts":["Query","Result<TResponse>"],"keyDetails":"A minimal marker interface used to type queries handled by MediatR handlers; no runtime methods or properties in this file.","orchestrationMethods":[],"typedContracts":[{"name":"IQuery<TResponse>","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQuery<TResponse>","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Messaging/IQuery.cs","purpose":"Defines a generic marker/query contract for application queries that return a FluentResults-wrapped response via MediatR.","classification":{"role":"handler","layer":"application","confidence":0.72,"evidence":["Command pattern","namespace NexusReader.Application.Abstractions.Messaging","interface IQuery<TResponse> extends MediatR IRequest<Result<TResponse>>"]},"className":"IQuery<TResponse>","methods":[],"types":[{"name":"IQuery<TResponse>","kind":"interface","line":6,"purpose":"Marker interface representing a CQRS query that yields a Result-wrapped response handled by MediatR.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["CQRS","Mediator","Result-wrapping"],"domainConcepts":["Query","Result<T>"],"keyDetails":"A tiny application-layer abstraction: a generic query contract that maps to MediatR IRequest<Result<TResponse>> enabling handlers to return FluentResults.","orchestrationMethods":[],"typedContracts":[{"name":"IQuery<TResponse>","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQuery<TResponse>","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"c980954f4577ff67fed485fe302bffa488224762567bf7f5708089ef46f238c5","sourceByteSize":173,"analyzedAt":"2026-05-23T16:16:04.401Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs","purpose":"Defines an application-level abstraction for MediatR query handlers that return a FluentResults Result<TResponse>.","classification":{"role":"handler","layer":"application","confidence":0.85,"evidence":["Namespace: NexusReader.Application.Abstractions.Messaging","Interface name IQueryHandler and generic TQuery/TResponse","Inherits MediatR IRequestHandler<TQuery, Result<TResponse>>"]},"className":"IQueryHandler<TQuery, TResponse>","methods":[{"name":"Handle (inherited from IRequestHandler)","line":6,"endLine":9,"signature":"(request: TQuery, cancellationToken: CancellationToken) -> Task<Result<TResponse>>","purpose":"Abstract handler method for processing a query and returning a Result-wrapped response.","calls":[],"actions":[{"id":"orchestration-point_6","kind":"mapping","label":"Query handling contract for MediatR pipeline","line":6,"detail":"This interface surface is used by the MediatR pipeline to locate and invoke query handlers that return FluentResults.Result<TResponse>.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IQueryHandler","kind":"interface","line":6,"purpose":"Generic abstraction for query handlers that process TQuery and return Result<TResponse> via MediatR.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (package)","MediatR (package)","NexusReader.Application.Abstractions.Messaging.IQuery (type dependency, same namespace)"],"patterns":["CQRS Handler","Mediator"],"domainConcepts":["Query","Result"],"keyDetails":"This file only declares a small generic interface that ties MediatR's IRequestHandler to FluentResults.Result<TResponse>, serving as an application-layer contract for query handlers.","orchestrationMethods":[],"typedContracts":[{"name":"IQueryHandler","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQueryHandler","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs","purpose":"Declares an application-layer abstraction for handling queries (CQRS) where handlers return a FluentResults.Result<TResponse> via MediatR.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["namespace NexusReader.Application.Abstractions.Messaging indicates an application abstraction for messaging","interface IQueryHandler<TQuery, TResponse> extends MediatR.IRequestHandler<TQuery, Result<TResponse>>"]},"className":"IQueryHandler","methods":[{"name":"Handle","line":6,"endLine":9,"signature":"(request: TQuery, cancellationToken: CancellationToken) -> Task<Result<TResponse>>","purpose":"Implied contract method for handling a query and returning a Result-wrapped TResponse asynchronously (inherited from MediatR IRequestHandler).","calls":[],"actions":[{"id":"inheritance_6","kind":"mapping","label":"Inherits MediatR IRequestHandler contract","line":6,"detail":"IQueryHandler<TQuery, TResponse> : IRequestHandler<TQuery, Result<TResponse>> - implies Handle(request, CancellationToken) -> Task<Result<TResponse>>","visibility":"detail-only","confidence":0.7},{"id":"generic-constraint_7","kind":"mapping","label":"Query type constraint","line":7,"detail":"where TQuery : IQuery<TResponse> enforces that TQuery implements IQuery<TResponse>","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IQueryHandler","kind":"interface","line":6,"purpose":"Generic interface representing a query handler that processes a TQuery and returns a Result-wrapped TResponse using MediatR semantics.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults","MediatR"],"patterns":["Mediator","CQRS Handler"],"domainConcepts":["Query","Result"],"keyDetails":"Thin application-layer abstraction that binds the project's IQuery<TResponse> concept to MediatR's IRequestHandler and FluentResults.Result for uniform asynchronous query handling.","orchestrationMethods":[],"typedContracts":[{"name":"IQueryHandler","kind":"interface","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IQueryHandler","line":6,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"1a365adef17e2cc45bafcca5fb3c98d03c2d8c7d17aa9342043e2554b210be35","sourceByteSize":241,"analyzedAt":"2026-05-23T16:16:08.026Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Services/IBillingService.cs","purpose":"Defines an application-layer billing service contract for handling subscription lifecycle events (updated/deleted) using asynchronous results.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","File declares IBillingService in Application.Abstractions.Services namespace (line 4-6)","Methods represent application-level operations for subscription events (lines 8-9)"]},"className":"IBillingService","methods":[{"name":"HandleSubscriptionUpdatedAsync","line":8,"endLine":8,"signature":"(customerEmail: string, stripeProductId: string) -> Task<Result>","purpose":"Contract method to process a subscription update for a customer (e.g., map Stripe product change to app state) and return an operation Result asynchronously.","calls":[],"actions":[{"id":"abstract-method_8","kind":"mapping","label":"Declaration of async handler for subscription-updated events","line":8,"detail":"Interface method only; implementation must handle orchestration, persistence, notifications, or external calls.","visibility":"detail-only","confidence":0.7},{"id":"returns_8","kind":"mapping","label":"Returns a FluentResults.Result wrapped in Task","line":8,"detail":"Task<Result> indicates success/failure reporting from implementations.","visibility":"detail-only","confidence":0.7}]},{"name":"HandleSubscriptionDeletedAsync","line":9,"endLine":9,"signature":"(customerEmail: string) -> Task<Result>","purpose":"Contract method to process a subscription deletion for a customer and return an operation Result asynchronously.","calls":[],"actions":[{"id":"abstract-method_9","kind":"mapping","label":"Declaration of async handler for subscription-deleted events","line":9,"detail":"Interface method only; implementation must handle cleanup, persistence updates, or downstream notifications.","visibility":"detail-only","confidence":0.7},{"id":"returns_9","kind":"mapping","label":"Returns a FluentResults.Result wrapped in Task","line":9,"detail":"Task<Result> indicates success/failure reporting from implementations.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBillingService","kind":"interface","line":6,"purpose":"Service contract for handling billing/subscription lifecycle events (update/delete).","fields":[{"name":"HandleSubscriptionUpdatedAsync","type":"Task<Result>","required":true,"line":8,"description":"Async operation to handle subscription updates given customer email and Stripe product id."},{"name":"HandleSubscriptionDeletedAsync","type":"Task<Result>","required":true,"line":9,"description":"Async operation to handle subscription deletions given customer email."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities (imported at line 1)","FluentResults (imported at line 2)"],"patterns":["Service Interface","Dependency Injection (interface abstraction for implementations)"],"domainConcepts":["Billing","Subscription","Customer","Stripe (stripeProductId)"],"keyDetails":"This file is an application-layer abstraction defining two async handlers that implementations must use to reconcile subscription updates/deletions; it returns FluentResults to surface success/failure.","orchestrationMethods":[],"typedContracts":[{"name":"IBillingService","kind":"interface","line":6,"fieldCount":2,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBillingService","line":6,"summary":"interface with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Services/IBillingService.cs","purpose":"Defines an application-layer billing service abstraction that declares handlers for subscription updates and deletions (used by infrastructure implementations to react to Stripe/customer events).","classification":{"role":"service","layer":"application","confidence":0.86,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Application.Abstractions.Services","public interface IBillingService declares subscription-related handler methods"]},"className":"IBillingService","methods":[{"name":"HandleSubscriptionUpdatedAsync","line":8,"endLine":8,"signature":"(customerEmail: string, stripeProductId: string) -> Task<Result>","purpose":"Contract for handling when a customer's subscription is created or updated (by Stripe or equivalent).","calls":[],"actions":[{"id":"abstract-definition_8","kind":"mapping","label":"declares handler contract","line":8,"detail":"Interface method with no implementation; concrete services implement business behavior (e.g., persistence, notifications, mapping).","visibility":"detail-only","confidence":0.7}]},{"name":"HandleSubscriptionDeletedAsync","line":9,"endLine":9,"signature":"(customerEmail: string) -> Task<Result>","purpose":"Contract for handling when a customer's subscription is deleted (cleanup or downgrade actions).","calls":[],"actions":[{"id":"abstract-definition_9","kind":"mapping","label":"declares handler contract","line":9,"detail":"Interface method with no implementation; concrete services implement removal/fallback logic.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBillingService","kind":"interface","line":6,"purpose":"Abstraction exposing billing/subscription lifecycle handlers to be implemented by infrastructure or application services.","fields":[{"name":"HandleSubscriptionUpdatedAsync","type":"Task<Result>","required":true,"line":8,"description":"Async handler invoked when a subscription is created or updated; accepts customer email and Stripe product id."},{"name":"HandleSubscriptionDeletedAsync","type":"Task<Result>","required":true,"line":9,"description":"Async handler invoked when a subscription is deleted; accepts customer email."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities (using)","FluentResults (using)"],"patterns":["Service Interface","Dependency Injection (abstraction)"],"domainConcepts":["Billing","Subscription","Customer (email)","StripeProduct"],"keyDetails":"Pure interface in the Application.Abstractions layer; no runtime behavior here—concrete implementations will perform persistence, external calls, mapping, and error handling and return FluentResults.Result.","orchestrationMethods":[],"typedContracts":[{"name":"IBillingService","kind":"interface","line":6,"fieldCount":2,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBillingService","line":6,"summary":"interface with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBillingService.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"1ea42394f881117d7099f76358dac73a54ee1ba37391a7c814ba6979efff5008","sourceByteSize":328,"analyzedAt":"2026-05-23T16:16:18.338Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Services/IBookStorageService.cs","purpose":"Defines an application-layer abstraction for persisting ebook and cover image files (byte[] or Stream) and returning their relative path/URL; cover save methods may return null when no data is provided.","classification":{"role":"service","layer":"application","confidence":0.85,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Application.Abstractions.Services (line 1) indicates an application-layer abstraction","File declares IBookStorageService interface with SaveEbookAsync/SaveCoverAsync methods (lines 6-29)"]},"className":"IBookStorageService","methods":[{"name":"SaveEbookAsync","line":11,"endLine":11,"signature":"(data: byte[], fileName: string) -> Task<string>","purpose":"Saves an ebook provided as a byte array and returns its relative path/URL.","calls":[],"actions":[{"id":"return_11","kind":"return","label":"returns path/url","line":11,"detail":"Returns Task<string> containing the relative path/URL of the saved ebook","visibility":"detail-only","confidence":0.7}]},{"name":"SaveEbookAsync","line":16,"endLine":16,"signature":"(data: Stream, fileName: string) -> Task<string>","purpose":"Saves an ebook provided as a Stream and returns its relative path/URL.","calls":[],"actions":[{"id":"return_16","kind":"return","label":"returns path/url","line":16,"detail":"Returns Task<string> containing the relative path/URL of the saved ebook","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":22,"endLine":22,"signature":"(data: byte[], fileName: string) -> Task<string?>","purpose":"Saves a cover image provided as a byte array and returns its relative path/URL; may return null if no cover data.","calls":[],"actions":[{"id":"nullable-return_19","kind":"mapping","label":"may return null when no data provided","line":19,"detail":"Method returns Task<string?>; documentation notes null is returned if no cover data is provided","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":28,"endLine":28,"signature":"(data: Stream, fileName: string) -> Task<string?>","purpose":"Saves a cover image provided as a Stream and returns its relative path/URL; may return null if no cover data.","calls":[],"actions":[{"id":"nullable-return_25","kind":"mapping","label":"may return null when no data provided","line":25,"detail":"Method returns Task<string?>; documentation notes null is returned if no cover data is provided","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBookStorageService","kind":"interface","line":6,"purpose":"Abstraction for persisting ebook and cover files and returning their storage path/URLs.","fields":[{"name":"SaveEbookAsync(byte[])","type":"Task<string>","required":true,"line":11,"description":"Saves ebook from byte array and returns relative path/URL"},{"name":"SaveEbookAsync(Stream)","type":"Task<string>","required":true,"line":16,"description":"Saves ebook from stream and returns relative path/URL"},{"name":"SaveCoverAsync(byte[])","type":"Task<string?>","required":true,"line":22,"description":"Saves cover from byte array and returns relative path/URL or null if no data"},{"name":"SaveCoverAsync(Stream)","type":"Task<string?>","required":true,"line":28,"description":"Saves cover from stream and returns relative path/URL or null if no data"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Storage Abstraction","Adapter"],"domainConcepts":["Ebook","Cover","File Storage","Path/URL"],"keyDetails":"Application-layer abstraction for ebook and cover persistence; supports both byte[] and Stream overloads; cover save methods explicitly allow null when no data is provided.","orchestrationMethods":[],"typedContracts":[{"name":"IBookStorageService","kind":"interface","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBookStorageService","line":6,"summary":"interface with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Services/IBookStorageService.cs","purpose":"Defines an application-level abstraction for saving ebook and cover files, returning relative paths/URLs; implementations handle actual storage persistence.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","File declares IBookStorageService interface describing storage operations","Methods return paths/URLs and accept file data (byte[] or Stream) indicating persistence responsibilities"]},"className":"IBookStorageService","methods":[{"name":"SaveEbookAsync","line":11,"endLine":11,"signature":"(data: byte[], fileName: string) -> Task<string>","purpose":"Contract to save ebook binary data and return a relative path/URL.","calls":[],"actions":[{"id":"contract_11","kind":"mapping","label":"async save ebook","line":11,"detail":"Asynchronous save that returns a string path/URL","visibility":"detail-only","confidence":0.7}]},{"name":"SaveEbookAsync","line":16,"endLine":16,"signature":"(data: Stream, fileName: string) -> Task<string>","purpose":"Contract to save ebook data from a Stream and return a relative path/URL.","calls":[],"actions":[{"id":"contract_16","kind":"mapping","label":"async save ebook (stream)","line":16,"detail":"Asynchronous save from Stream that returns a string path/URL","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":22,"endLine":22,"signature":"(data: byte[], fileName: string) -> Task<string?>","purpose":"Contract to save cover image binary data and return a relative path/URL, or null if no cover provided.","calls":[],"actions":[{"id":"contract_22","kind":"mapping","label":"async save cover","line":22,"detail":"May return null when no cover data is provided","visibility":"detail-only","confidence":0.7}]},{"name":"SaveCoverAsync","line":28,"endLine":28,"signature":"(data: Stream, fileName: string) -> Task<string?>","purpose":"Contract to save cover image from a Stream and return a relative path/URL, or null if no cover provided.","calls":[],"actions":[{"id":"contract_28","kind":"mapping","label":"async save cover (stream)","line":28,"detail":"May return null when no cover data is provided","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IBookStorageService","kind":"interface","line":6,"purpose":"Interface describing methods to persist ebooks and cover images and return their relative paths/URLs.","fields":[{"name":"SaveEbookAsync(byte[] data, string fileName)","type":"Task<string>","required":true,"line":11,"description":"Save ebook from byte array and return relative path/URL."},{"name":"SaveEbookAsync(Stream data, string fileName)","type":"Task<string>","required":true,"line":16,"description":"Save ebook from Stream and return relative path/URL."},{"name":"SaveCoverAsync(byte[] data, string fileName)","type":"Task<string?>","required":true,"line":22,"description":"Save cover from byte array; may return null if no data."},{"name":"SaveCoverAsync(Stream data, string fileName)","type":"Task<string?>","required":true,"line":28,"description":"Save cover from Stream; may return null if no data."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Service Interface","Storage Abstraction"],"domainConcepts":["Ebook","Cover","Storage","File path/URL"],"keyDetails":"Interface provides async contracts for saving ebooks and covers (byte[] or Stream) and returning relative paths/URLs; cover methods explicitly allow null return when no data is provided.","orchestrationMethods":[],"typedContracts":[{"name":"IBookStorageService","kind":"interface","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IBookStorageService","line":6,"summary":"interface with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IBookStorageService.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"37d7b154e4f16604e1c147e5417ef6e8fc11e86a27b95381e3cd1a7930da2b41","sourceByteSize":1002,"analyzedAt":"2026-05-23T16:16:20.572Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Services/IEpubMetadataExtractor.cs","purpose":"Defines an application-layer service abstraction for extracting metadata from an EPUB stream, returning a Result-wrapped LocalEpubMetadata.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","Namespace: NexusReader.Application.Abstractions.Services","Type is an interface named IEpubMetadataExtractor and lives in Application project","Method returns application DTO LocalEpubMetadata (imported from Queries.Reader)"]},"className":"IEpubMetadataExtractor","methods":[{"name":"ExtractMetadataAsync","line":9,"endLine":9,"signature":"(epubStream: Stream) -> Task<Result<LocalEpubMetadata>>","purpose":"Asynchronously extracts EPUB metadata from the provided stream and returns it wrapped in a FluentResults Result.","calls":[],"actions":[{"id":"async-signature_9","kind":"mapping","label":"Asynchronous extraction contract","line":9,"detail":"Returns Task<Result<LocalEpubMetadata>> to signal success/failure and carry metadata","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application/Queries/Reader (LocalEpubMetadata)","FluentResults","System.IO"],"patterns":["Service Interface","Abstraction"],"domainConcepts":["EPUB","Metadata"],"keyDetails":"Small application-layer interface specifying a single async operation to extract EPUB metadata; implementation is expected elsewhere in the Application/Infrastructure layers.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Application/Abstractions/Services/IEpubMetadataExtractor.cs","purpose":"Defines an application-layer abstraction for extracting metadata from an EPUB stream, returning a Result-wrapped LocalEpubMetadata asynchronously.","classification":{"role":"service","layer":"application","confidence":0.8,"evidence":["Service naming pattern","Application/service path heuristic","Namespace: NexusReader.Application.Abstractions.Services","Public interface named IEpubMetadataExtractor used to extract EPUB metadata","References FluentResults and a LocalEpubMetadata result type"]},"className":"IEpubMetadataExtractor","methods":[{"name":"ExtractMetadataAsync","line":9,"endLine":10,"signature":"(epubStream: Stream) -> Task<Result<LocalEpubMetadata>>","purpose":"Asynchronously extracts metadata from the provided EPUB stream and returns it wrapped in a FluentResults Result.","calls":[],"actions":[]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (NuGet/namespace)","NexusReader.Application.Queries.Reader (namespace containing LocalEpubMetadata)","System.IO (Stream)"],"patterns":["Service Interface","Dependency Inversion"],"domainConcepts":["Epub","Metadata"],"keyDetails":"Interface exposes a single async method returning Task<Result<LocalEpubMetadata>>; implementation responsibilities include stream parsing and error/result handling via FluentResults.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"878d9a601b0bd9cc8c9adf63050c9eb5ba3050028ed89f190e45f896f3cddf94","sourceByteSize":274,"analyzedAt":"2026-05-23T16:19:00.585Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Abstractions/Services/IEpubReader.cs","purpose":"Defines an application-level abstraction for reading and parsing EPUB content for a specific ebook and chapter, exposing a single async operation that returns a Result-wrapped ReaderPageViewModel.","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Service naming pattern","Application/service path heuristic","namespace NexusReader.Application.Abstractions.Services","public interface IEpubReader with a GetEpubContentAsync method"]},"className":"IEpubReader","methods":[{"name":"GetEpubContentAsync","line":18,"endLine":22,"signature":"(ebookId: Guid, chapterIndex: int, userId: string? = null, cancellationToken: CancellationToken = default) -> Task<Result<ReaderPageViewModel>>","purpose":"Retrieve content blocks for a specific ebook chapter, returning a Result that wraps a ReaderPageViewModel; supports optional tenant userId and cancellation.","calls":[],"actions":[{"id":"parameter_16","kind":"mapping","label":"tenant-isolation-hint","line":16,"detail":"userId parameter is documented as used for tenant isolation in DB lookup (implementation responsibility).","visibility":"detail-only","confidence":0.7},{"id":"return_18","kind":"return","label":"result-wrapper","line":18,"detail":"Returns a FluentResults.Result wrapping ReaderPageViewModel to convey success/failure and payload.","visibility":"detail-only","confidence":0.7},{"id":"parameter_22","kind":"mapping","label":"cancellation-token","line":22,"detail":"Accepts CancellationToken to allow caller-driven cancellation of the async read.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IEpubReader","kind":"interface","line":9,"purpose":"Abstraction for EPUB reading/parsing service used by application code to fetch chapter content.","fields":[{"name":"GetEpubContentAsync","type":"Task<Result<ReaderPageViewModel>>","required":true,"line":18,"description":"Async method to get EPUB chapter content by ebookId and chapterIndex, with optional userId and cancellationToken."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Queries.Reader (ReaderPageViewModel)","FluentResults (Result<T>)"],"patterns":["Abstraction/Service Interface"],"domainConcepts":["Ebook","Chapter","TenantIsolation","ReaderPage (content blocks)"],"keyDetails":"Single-method interface that returns a FluentResults.Result of ReaderPageViewModel; userId is explicitly documented for tenant isolation and a CancellationToken is supported for cooperative cancellation.","orchestrationMethods":[],"typedContracts":[{"name":"IEpubReader","kind":"interface","line":9,"fieldCount":1,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IEpubReader","line":9,"summary":"interface with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}]}
{"path":"NexusReader.Application/Abstractions/Services/IEpubReader.cs","purpose":"Defines the application service contract for reading and parsing EPUB content for a specific ebook and chapter (async, tenant-aware).","classification":{"role":"service","layer":"application","confidence":0.85,"evidence":["Service naming pattern","Application/service path heuristic","File declares an interface IEpubReader in Application.Abstractions.Services namespace","Method GetEpubContentAsync returns a ReaderPageViewModel result and accepts userId and CancellationToken (service contract)"]},"className":"IEpubReader","methods":[{"name":"GetEpubContentAsync","line":18,"endLine":22,"signature":"(ebookId: Guid, chapterIndex: int, userId: string? = null, cancellationToken: CancellationToken = default) -> Task<Result<ReaderPageViewModel>>","purpose":"Asynchronously retrieves parsed EPUB content blocks (a ReaderPageViewModel) for the specified ebook and zero-based chapter index, optionally scoped to a user and cancellable.","calls":[],"actions":[{"id":"validation-hint_15","kind":"mapping","label":"Chapter index is zero-based","line":15,"detail":"Documentation indicates chapterIndex is zero-based; callers should validate bounds","visibility":"detail-only","confidence":0.7},{"id":"async-return_18","kind":"mapping","label":"Returns a Result-wrapped ReaderPageViewModel","line":18,"detail":"Method returns Task<Result<ReaderPageViewModel>>","visibility":"detail-only","confidence":0.7},{"id":"cancellation_21","kind":"mapping","label":"Supports cancellation","line":21,"detail":"cancellationToken parameter allows caller to cancel the operation","visibility":"detail-only","confidence":0.7},{"id":"tenant-isolation_21","kind":"mapping","label":"User-scoped lookup","line":21,"detail":"userId parameter is documented as used for tenant isolation in DB lookup","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"IEpubReader","kind":"interface","line":9,"purpose":"Service contract that exposes EPUB reading/parsing behavior for ebooks and chapters.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Queries.Reader (ReaderPageViewModel referenced)","FluentResults (Result<T> usage)"],"patterns":["Service Interface","Async API"],"domainConcepts":["Ebook","Chapter","EPUB","ReaderPage"],"keyDetails":"Single-method interface; method is async, returns FluentResults-wrapped ReaderPageViewModel, accepts optional userId for tenant isolation and CancellationToken for cancellation.","orchestrationMethods":[],"typedContracts":[{"name":"IEpubReader","kind":"interface","line":9,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IEpubReader","line":9,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Services/IEpubReader.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"a442a63e2ad648555d1e38653bbf9c5a5642d3afc258a2e0c1f0fcdf85db0858","sourceByteSize":913,"analyzedAt":"2026-05-23T16:19:21.212Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Commands/Library/IngestEbookCommand.cs","purpose":"Defines a CQRS command record used to ingest a new ebook into the library, carrying payload (metadata, content bytes, ownership and tenant info) for application-side handlers.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Library (line 3)","Declares a record named IngestEbookCommand that implements ICommand<Guid> (lines 15-23)"]},"className":"IngestEbookCommand","methods":[],"types":[{"name":"IngestEbookCommand","kind":"command","line":15,"purpose":"Represents the input payload to ingest a new ebook (title, author, cover bytes, EPUB bytes, description, owner and tenant) for processing by an application command handler.","fields":[{"name":"Title","type":"string","required":true,"line":16,"description":"The title of the ebook."},{"name":"AuthorName","type":"string","required":true,"line":17,"description":"The name of the author."},{"name":"CoverImage","type":"byte[]?","required":false,"line":18,"description":"Optional raw bytes for the cover image."},{"name":"EpubData","type":"byte[]","required":true,"line":19,"description":"Raw bytes of the EPUB file (content to persist/process)."},{"name":"Description","type":"string?","required":false,"line":20,"description":"Optional description or summary of the book."},{"name":"UserId","type":"string","required":true,"line":21,"description":"ID of the user who owns/ingested the book."},{"name":"TenantId","type":"string","required":false,"line":22,"description":"Tenant ID for multi-tenant isolation; defaults to \"global\"."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS Command"],"domainConcepts":["Ebook","Library","Tenant","User/Ownership"],"keyDetails":"Record implements ICommand<Guid> (line 23) so it is intended for a command handler that will return a Guid (likely the created ebook id). TenantId has a default of \"global\" indicating single-tenant default behavior. Contains raw binary payloads (CoverImage, EpubData) which imply handlers will perform persistence or external storage operations.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookCommand","kind":"command","line":15,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookCommand","line":15,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}]}
{"path":"NexusReader.Application/Commands/Library/IngestEbookCommand.cs","purpose":"Defines a CQRS command DTO used to ingest a new ebook into the library, carrying ebook metadata and binary payloads (cover and EPUB) across the application boundary.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Commands.Library indicates application-level command","Type implements ICommand<Guid> (CQRS command)","File name and folder Commands/Library imply a command for library ingestion"]},"className":"IngestEbookCommand","methods":[],"types":[{"name":"IngestEbookCommand","kind":"command","line":15,"purpose":"Represents the data required to ingest an ebook (metadata + binary payloads) and is dispatched as a command returning a Guid identifier.","fields":[{"name":"Title","type":"string","required":true,"line":16,"description":"The title of the book."},{"name":"AuthorName","type":"string","required":true,"line":17,"description":"The name of the author."},{"name":"CoverImage","type":"byte[]?","required":false,"line":18,"description":"Optional raw bytes of the cover image."},{"name":"EpubData","type":"byte[]","required":true,"line":19,"description":"Raw bytes of the EPUB file (payload to ingest)."},{"name":"Description","type":"string?","required":false,"line":20,"description":"Optional description or summary of the book."},{"name":"UserId","type":"string","required":true,"line":21,"description":"ID of the user owning the book."},{"name":"TenantId","type":"string","required":false,"line":22,"description":"Tenant ID for multi-tenant isolation; defaults to \"global\"."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["CQRS Command"],"domainConcepts":["Ebook","Library","Tenant"],"keyDetails":"Record implements ICommand<Guid>; TenantId defaults to \"global\" enabling single-tenant default behavior; carries binary payloads (CoverImage and EpubData) so consumers will perform IO/persistence when handling this command.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookCommand","kind":"command","line":15,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookCommand","line":15,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookCommand.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"508a30855af13eb089f7a90d39aa2f1072ec32a60ec09298aadc12c01b10ac47","sourceByteSize":984,"analyzedAt":"2026-05-23T16:16:42.095Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Commands/Library/IngestEbookRequest.cs","purpose":"Defines a command/request DTO used to ingest an ebook into the library (carries metadata and base64-encoded payload).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Library","File path indicates Commands/Library and the type is named IngestEbookRequest","Record shape carries data for an application-level request (ingest)"]},"className":"IngestEbookRequest","methods":[],"types":[{"name":"IngestEbookRequest","kind":"command","line":3,"purpose":"Represents the data required to ingest an ebook: metadata, optional cover image, and the EPUB payload (base64).","fields":[{"name":"Title","type":"string","required":true,"line":4,"description":"Ebook title"},{"name":"AuthorName","type":"string","required":true,"line":5,"description":"Author's name"},{"name":"CoverImageBase64","type":"string?","required":false,"line":6,"description":"Optional cover image encoded as base64"},{"name":"EpubDataBase64","type":"string","required":true,"line":7,"description":"EPUB file content encoded as base64"},{"name":"Description","type":"string?","required":false,"line":8,"description":"Optional description (has default null)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Command DTO"],"domainConcepts":["Ebook","Library","Author","CoverImage"],"keyDetails":"Simple immutable record used as an application command carrying base64-encoded EPUB payload and optional cover/description; no runtime behavior, methods, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookRequest","kind":"command","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookRequest","line":3,"summary":"command with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}]}
{"path":"NexusReader.Application/Commands/Library/IngestEbookRequest.cs","purpose":"Defines a command/DTO that carries data needed to ingest an EPUB ebook into the application (title, author, cover image, base64 epub payload, and optional description).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Library","Type is a record named IngestEbookRequest used to carry input data","Parameters represent an ingestion payload (epub base64, metadata)"]},"className":"","methods":[],"types":[{"name":"IngestEbookRequest","kind":"command","line":3,"purpose":"Payload/DTO for requesting ingestion of an ebook into the library.","fields":[{"name":"Title","type":"string","required":true,"line":4,"description":"Human-readable title of the ebook"},{"name":"AuthorName","type":"string","required":true,"line":5,"description":"Author name for the ebook"},{"name":"CoverImageBase64","type":"string?","required":false,"line":6,"description":"Optional base64-encoded cover image"},{"name":"EpubDataBase64","type":"string","required":true,"line":7,"description":"Base64-encoded EPUB payload (binary content)"},{"name":"Description","type":"string?","required":false,"line":8,"description":"Optional textual description or synopsis"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Command","DTO"],"domainConcepts":["Ebook","Library","Ingestion"],"keyDetails":"Simple immutable record used as an application-layer command/DTO; no methods or behavior in this file.","orchestrationMethods":[],"typedContracts":[{"name":"IngestEbookRequest","kind":"command","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"IngestEbookRequest","line":3,"summary":"command with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Library/IngestEbookRequest.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"60123cd40de552bf7ce82d61fc10d539366b45a235424913a1d10463f1e53455","sourceByteSize":228,"analyzedAt":"2026-05-23T16:16:50.777Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs","purpose":"Defines a lightweight CQRS command that carries the user's selected answer index and the correct index for quiz answer submission.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace: NexusReader.Application.Commands.Quiz","Type implements ICommand from Application.Abstractions.Messaging"]},"className":"SubmitAnswerCommand","methods":[],"types":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"purpose":"Represents a request to submit an answer for a quiz question carrying the selected and correct indices.","fields":[{"name":"SelectedIndex","type":"int","required":true,"line":5,"description":"Index chosen by the user"},{"name":"CorrectIndex","type":"int","required":true,"line":5,"description":"Index considered correct for the question"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS","Command"],"domainConcepts":["Quiz","Answer"],"keyDetails":"Simple immutable record used as a CQRS command (ICommand) carrying two integers; no methods or runtime branching present in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubmitAnswerCommand","line":5,"summary":"command with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}]}
{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs","purpose":"Defines a simple application command that carries a quiz answer selection (selected index and correct index) to be handled by the application's command pipeline.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Namespace NexusReader.Application.Commands.Quiz","Type implements ICommand from the application's messaging abstractions"]},"className":"SubmitAnswerCommand","methods":[],"types":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"purpose":"Represents a CQRS command carrying the user's selected answer index and the correct answer index for a quiz question.","fields":[{"name":"SelectedIndex","type":"int","required":true,"line":5,"description":"The index chosen by the user"},{"name":"CorrectIndex","type":"int","required":true,"line":5,"description":"The index that is the correct answer"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS Command"],"domainConcepts":["Quiz","Answer Submission"],"keyDetails":"Minimal DTO/command type used to submit a quiz answer; no methods or behavior in this file beyond the record declaration.","orchestrationMethods":[],"typedContracts":[{"name":"SubmitAnswerCommand","kind":"command","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubmitAnswerCommand","line":5,"summary":"command with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"afbda632f3de8fcd577301575f2a26cb26b65193feef53a15bace61248131324","sourceByteSize":193,"analyzedAt":"2026-05-23T16:16:48.600Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","purpose":"Command handler that processes a quiz answer submission: vibrates the device on correct answers and returns success/failure results.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Class implements ICommandHandler<T> (line 7)","Namespace NexusReader.Application.Commands.Quiz (line 5)"]},"className":"SubmitAnswerCommandHandler","methods":[{"name":"Handle","line":16,"endLine":25,"signature":"(request: SubmitAnswerCommand, cancellationToken: CancellationToken) -> Task<Result>","purpose":"Evaluates the submitted answer, triggers a short vibration if correct, and returns a success or failure Result.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services","targetMethod":"VibrateAsync","callLine":20,"paramSummary":"durationMs: 50"}],"actions":[{"id":"guard-clause_18","kind":"guard-clause","label":"Check if selected index equals correct index","line":18,"detail":"If true, vibrate and return Result.Ok(); otherwise return Result.Fail(...)","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["correct","incorrect"],"visibility":"detail-only","confidence":0.7},{"id":"handle_branch_18_0","kind":"branch","label":"Evaluates branch condition","line":18,"detail":"if (request.SelectedIndex == request.CorrectIndex)","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"external-call_20","kind":"external-call","label":"Triggers platform vibration for correct answer","line":20,"detail":"await _platformService.VibrateAsync(50)","visibility":"detail-only","confidence":0.7},{"id":"return_21","kind":"return","label":"Return success Result","line":21,"detail":"Result.Ok()","visibility":"detail-only","confidence":0.7},{"id":"handle_return_21_1","kind":"return","label":"Returns result","line":21,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"return_24","kind":"return","label":"Return failure Result","line":24,"detail":"Result.Fail(\"Incorrect answer.\")","visibility":"detail-only","confidence":0.7},{"id":"handle_return_24_2","kind":"return","label":"Returns result","line":24,"detail":"return Result.Fail(\"Incorrect answer.\");","visibility":"detail-only","confidence":0.7}]},{"name":"SubmitAnswerCommandHandler","line":11,"endLine":14,"signature":"(platformService: IPlatformService) -> SubmitAnswerCommandHandler","purpose":"Constructor that injects the platform service dependency.","calls":[],"actions":[{"id":"assign_13","kind":"mapping","label":"Assign injected dependency","line":13,"detail":"_platformService = platformService","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services","NexusReader.Application.Abstractions.Messaging","FluentResults (nuget)"],"patterns":["Command Handler","Dependency Injection"],"domainConcepts":["Quiz","Answer"],"keyDetails":"Runtime behavior centers on a simple branch: correct answer triggers a platform vibration (external call) and returns Result.Ok; incorrect returns Result.Fail. Implements ICommandHandler in the Application layer.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.77,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","external-call","return"],"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":20,"kind":"external-call","detail":"await _platformService.VibrateAsync(50)","evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.77,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services"]},{"kind":"external-call","label":"Handle","line":20,"summary":"await _platformService.VibrateAsync(50)","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}]}
{"path":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","purpose":"Handles quiz answer submission: verifies the selected answer against the correct index, triggers a platform vibration on correct answers, and returns a success/failure Result.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Commands.Quiz","implements ICommandHandler<SubmitAnswerCommand>","contains Handle(request, CancellationToken) that returns Task<Result>"]},"className":"SubmitAnswerCommandHandler","methods":[{"name":"Handle","line":16,"endLine":25,"signature":"(request: SubmitAnswerCommand, cancellationToken: CancellationToken) -> Task<Result>","purpose":"Checks the submitted answer; vibrates the device and returns success if correct, otherwise returns a failure Result.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services/IPlatformService.cs","targetMethod":"VibrateAsync","callLine":20,"paramSummary":"50 (int milliseconds)"}],"actions":[{"id":"guard-clause_18","kind":"guard-clause","label":"correct-answer-check","line":18,"detail":"if selected equals correct index then vibrate and return Result.Ok(); else return Result.Fail(\"Incorrect answer.\")","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["correct -> vibrate and return success","incorrect -> return failure"],"visibility":"detail-only","confidence":0.7},{"id":"handle_branch_18_0","kind":"branch","label":"Evaluates branch condition","line":18,"detail":"if (request.SelectedIndex == request.CorrectIndex)","conditionSummary":"request.SelectedIndex == request.CorrectIndex","outcomeLabels":["true","false"],"visibility":"secondary-visible","confidence":0.78},{"id":"external-call_20","kind":"external-call","label":"platform vibrate","line":20,"detail":"_platformService.VibrateAsync(50) invoked to provide haptic feedback on correct answer","visibility":"detail-only","confidence":0.7},{"id":"handle_await_20_1","kind":"await","label":"Waits for async work","line":20,"detail":"await _platformService.VibrateAsync(50);","visibility":"secondary-visible","confidence":0.81},{"id":"handle_return_21_2","kind":"return","label":"Returns result","line":21,"detail":"return Result.Ok();","visibility":"detail-only","confidence":0.7},{"id":"return_21","kind":"return","label":"success-return","line":21,"detail":"returns Result.Ok() on correct answer","visibility":"detail-only","confidence":0.7},{"id":"return_24","kind":"return","label":"failure-return","line":24,"detail":"returns Result.Fail(\"Incorrect answer.\") on incorrect answer","visibility":"detail-only","confidence":0.7},{"id":"handle_return_24_3","kind":"return","label":"Returns result","line":24,"detail":"return Result.Fail(\"Incorrect answer.\");","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Services/IPlatformService.cs","NexusReader.Application.Commands.Quiz/SubmitAnswerCommand.cs"],"patterns":["Command Handler","Mediator-style handler"],"domainConcepts":["Quiz","Answer"],"keyDetails":"Uses FluentResults.Result for success/failure; relies on IPlatformService for haptic feedback; trivial constructor injects dependency (_platformService at line 9).","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.77,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["guard-clause","branch","external-call","await","return"],"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services/IPlatformService.cs"]}],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":20,"kind":"external-call","detail":"_platformService.VibrateAsync(50) invoked to provide haptic feedback on correct answer","evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.77,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs","NexusReader.Application.Abstractions.Services/IPlatformService.cs"]},{"kind":"external-call","label":"Handle","line":20,"summary":"_platformService.VibrateAsync(50) invoked to provide haptic feedback on correct answer","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Quiz/SubmitAnswerCommandHandler.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"713d16e9d277b0ad0f650a7847a8d6eac2080e1f4e677316a565502850462841","sourceByteSize":820,"analyzedAt":"2026-05-23T16:16:59.147Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs","purpose":"Defines a MediatR command DTO used to update/sync a user's reading progress for an ebook across the application.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Commands.Sync","type implements IRequest<Result> (MediatR) — used as an application-level command/DTO"]},"className":"UpdateReadingProgressCommand","methods":[],"types":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"purpose":"Represents the data required to update/synchronize reading progress for a user's ebook.","fields":[{"name":"PageId","type":"string","required":true,"line":7,"description":"Identifier of the current page"},{"name":"UserId","type":"string","required":true,"line":8,"description":"Identifier of the user whose progress is being updated"},{"name":"EbookId","type":"Guid","required":true,"line":9,"description":"Ebook identifier"},{"name":"Progress","type":"double","required":true,"line":10,"description":"Progress value (e.g., percentage or fraction) representing reading position"},{"name":"ChapterTitle","type":"string?","required":false,"line":11,"description":"Optional current chapter title"},{"name":"ChapterIndex","type":"int","required":true,"line":12,"description":"Index of the current chapter"},{"name":"ExcludedConnectionId","type":"string?","required":false,"line":13,"description":"Optional connection id to exclude from notifications (default null)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["FluentResults (external package)","MediatR (external package)"],"patterns":["CQRS Command","MediatR IRequest<Result>"],"domainConcepts":["ReadingProgress","Ebook","User","Sync"],"keyDetails":"A simple record-level command DTO (lines 613). Implements IRequest<Result> for MediatR dispatch; includes an optional ExcludedConnectionId likely used to suppress notifying the originator when broadcasting updates.","orchestrationMethods":[],"typedContracts":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"UpdateReadingProgressCommand","line":6,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}]}
{"path":"NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs","purpose":"Defines a MediatR command record that carries data for updating a user's reading progress for an ebook (used in sync operations).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","namespace NexusReader.Application.Commands.Sync","record UpdateReadingProgressCommand ... : IRequest<Result> (MediatR command)"]},"className":"UpdateReadingProgressCommand","methods":[],"types":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"purpose":"Carries parameters required to update a user's reading progress for an ebook in synchronization workflows.","fields":[{"name":"PageId","type":"string","required":true,"line":6,"description":"Identifier of the current page or location."},{"name":"UserId","type":"string","required":true,"line":7,"description":"Identifier of the user whose progress is being updated."},{"name":"EbookId","type":"Guid","required":true,"line":9,"description":"GUID of the ebook being read."},{"name":"Progress","type":"double","required":true,"line":10,"description":"Numeric progress value (likely 0.0-1.0 or percent)."},{"name":"ChapterTitle","type":"string?","required":false,"line":11,"description":"Optional title of the current chapter."},{"name":"ChapterIndex","type":"int","required":true,"line":12,"description":"Index of the current chapter."},{"name":"ExcludedConnectionId","type":"string?","required":false,"line":13,"description":"Optional connection id to exclude from notifications/sync (default null)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["CQRS","MediatR Command"],"domainConcepts":["ReadingProgress","Ebook","User"],"keyDetails":"Simple immutable record used as a MediatR IRequest<Result> to trigger update logic elsewhere; contains nullable fields for optional metadata and an excluded connection id to avoid echoing updates.","orchestrationMethods":[],"typedContracts":[{"name":"UpdateReadingProgressCommand","kind":"command","line":6,"fieldCount":7,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"UpdateReadingProgressCommand","line":6,"summary":"command with 7 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Commands/Sync/UpdateReadingProgressCommand.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ca97d53952b614e0bca15aa50fda28c29b032b77398d390225b05ddb0749bc7b","sourceByteSize":334,"analyzedAt":"2026-05-23T16:16:53.338Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Common/AppJsonContext.cs","purpose":"Defines a System.Text.Json source-generation context that registers graph-related DTO types for ahead-of-time JSON (de)serialization with indented output.","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Namespace NexusReader.Application.Common (application layer)","Uses JsonSourceGenerationOptions and multiple JsonSerializable attributes (lines 6-11)"]},"className":"AppJsonContext","methods":[],"types":[{"name":"AppJsonContext","kind":"model","line":12,"purpose":"Partial JsonSerializerContext type that drives System.Text.Json source generation for specified DTO types.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["System.Text.Json.Serialization (framework)","NexusReader.Application.Queries.Graph (referenced DTOs GraphNodeDto, GraphLinkDto, GraphDataDto)"],"patterns":["Source Generator","Json Source Generation"],"domainConcepts":["GraphNode","GraphLink","GraphData"],"keyDetails":"Lines 6-11 apply JsonSourceGenerationOptions(WriteIndented=true) and register JsonSerializable for GraphNodeDto, GraphLinkDto, GraphDataDto and List<T> variants. The class (line 12) is an empty partial inheriting JsonSerializerContext used at compile-time to generate optimized JSON serializers.","orchestrationMethods":[],"typedContracts":[{"name":"AppJsonContext","kind":"model","line":12,"fieldCount":0,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AppJsonContext","line":12,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}]}
{"path":"NexusReader.Application/Common/AppJsonContext.cs","purpose":"Defines a System.Text.Json source-generated JsonSerializerContext for Graph DTO types used by the application, enabling ahead-of-time serialization metadata and configuration (WriteIndented = true).","classification":{"role":"config","layer":"application","confidence":0.8,"evidence":["File declares a partial JsonSerializerContext subclass (AppJsonContext) via System.Text.Json source-gen attributes","Attributes list JsonSerializable types for Graph DTOs (GraphNodeDto, GraphLinkDto, GraphDataDto)"]},"className":"AppJsonContext","methods":[],"types":[{"name":"AppJsonContext","kind":"model","line":12,"purpose":"A source-generated JsonSerializerContext subclass configured to include serialization metadata for Graph DTO types and to emit indented JSON.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["System.Text.Json.Serialization","NexusReader.Application.Queries.Graph"],"patterns":["Source Generator","Serialization Context"],"domainConcepts":["Graph","GraphNode","GraphLink","GraphData"],"keyDetails":"Uses [JsonSourceGenerationOptions(WriteIndented = true)] and [JsonSerializable(...)] attributes to register GraphNodeDto, GraphLinkDto, GraphDataDto and their List<> variants for source-generation; class is a partial JsonSerializerContext with no custom members.","orchestrationMethods":[],"typedContracts":[{"name":"AppJsonContext","kind":"model","line":12,"fieldCount":0,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AppJsonContext","line":12,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Common/AppJsonContext.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"13484c94badd9a18218775b31e07c692bcffb33f319e00445084b58c65e314a2","sourceByteSize":474,"analyzedAt":"2026-05-23T16:19:17.323Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Constants/PlanConstants.cs","purpose":"Defines application-wide default constants for Plan-related settings (name, token limit, activity label).","classification":{"role":"config","layer":"application","confidence":0.85,"evidence":["namespace NexusReader.Application.Constants","static class with public constant values for Plan defaults"]},"className":"PlanConstants","methods":[],"types":[{"name":"PlanConstants","kind":"model","line":3,"purpose":"Holds compile-time constant defaults for plan configuration used across the application.","fields":[{"name":"DefaultPlanName","type":"string","required":true,"line":5,"description":"Default plan name (e.g., 'Free')."},{"name":"DefaultTokenLimit","type":"int","required":true,"line":6,"description":"Default numeric token limit for the plan."},{"name":"DefaultActivityLabel","type":"string","required":true,"line":7,"description":"Default label shown when there's no activity."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants holder"],"domainConcepts":["Plan"],"keyDetails":"Simple static container of compile-time constants; no runtime behavior, no external calls, and safe for inlining/compile-time use.","orchestrationMethods":[],"typedContracts":[{"name":"PlanConstants","kind":"model","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"PlanConstants","line":3,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}]}
{"path":"NexusReader.Application/Constants/PlanConstants.cs","purpose":"Holds application-wide default constants for plan behavior (default plan name, token limit, and activity label).","classification":{"role":"unknown","layer":"application","confidence":0.7,"evidence":["Namespace: NexusReader.Application.Constants","Defines public const values used across the application (defaults for plans/tokens/activity label)"]},"className":"PlanConstants","methods":[],"types":[{"name":"PlanConstants","kind":"model","line":3,"purpose":"Static holder for default plan-related constants used by the application.","fields":[{"name":"DefaultPlanName","type":"string","required":true,"line":5,"description":"Default plan name (\"Free\")."},{"name":"DefaultTokenLimit","type":"int","required":true,"line":6,"description":"Default token limit for the plan (1000)."},{"name":"DefaultActivityLabel","type":"string","required":true,"line":7,"description":"Default label for no activity (\"Brak aktywności\")."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants holder"],"domainConcepts":["Plan","TokenLimit","ActivityLabel"],"keyDetails":"A small, focused static class providing compile-time constants for default plan behavior; no runtime logic, external calls, or registrations.","orchestrationMethods":[],"typedContracts":[{"name":"PlanConstants","kind":"model","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"PlanConstants","line":3,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/PlanConstants.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"23b811243f4548cf2f01c0386df268bef236fe52ed1939212f2510d50c8210fe","sourceByteSize":256,"analyzedAt":"2026-05-23T16:19:15.697Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Constants/StorageKeys.cs","purpose":"Defines application-wide string keys used for client/local storage (auth tokens and user metadata).","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Namespace NexusReader.Application.Constants indicates application-level constants","Public static class with const string fields used as storage keys"]},"className":"StorageKeys","methods":[],"types":[{"name":"StorageKeys","kind":"model","line":3,"purpose":"Holds constant keys for storing authentication and user metadata in client/local storage.","fields":[{"name":"AuthToken","type":"string","required":true,"line":5,"description":"Key for the auth token (\"nexus_auth_token\")."},{"name":"RefreshToken","type":"string","required":true,"line":6,"description":"Key for the refresh token (\"nexus_refresh_token\")."},{"name":"UserEmail","type":"string","required":true,"line":7,"description":"Key for the user's email (\"nexus_user_email\")."},{"name":"UserTenant","type":"string","required":true,"line":8,"description":"Key for the user's tenant identifier (\"nexus_user_tenant\")."},{"name":"UserRoles","type":"string","required":true,"line":9,"description":"Key for the user's roles (\"nexus_user_roles\")."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants"],"domainConcepts":["Auth","User","Tenant","Roles","Token storage"],"keyDetails":"Simple static constant holder used across client and application code to standardize local storage keys for authentication and user metadata.","orchestrationMethods":[],"typedContracts":[{"name":"StorageKeys","kind":"model","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"StorageKeys","line":3,"summary":"model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}]}
{"path":"NexusReader.Application/Constants/StorageKeys.cs","purpose":"Holds string constant keys used for storing authentication and user-related values in client/app storage (e.g., local storage or secure storage).","classification":{"role":"config","layer":"application","confidence":0.8,"evidence":["Namespace NexusReader.Application.Constants indicates application-level constants","Class StorageKeys contains string keys for auth tokens and user metadata used across the app"]},"className":"StorageKeys","methods":[],"types":[{"name":"StorageKeys","kind":"model","line":3,"purpose":"Container for storage key constants used throughout the application for persisting auth and user data.","fields":[{"name":"AuthToken","type":"string","required":true,"line":5,"description":"Key for storing the authentication token (\"nexus_auth_token\")."},{"name":"RefreshToken","type":"string","required":true,"line":6,"description":"Key for storing the refresh token (\"nexus_refresh_token\")."},{"name":"UserEmail","type":"string","required":true,"line":7,"description":"Key for storing the user's email (\"nexus_user_email\")."},{"name":"UserTenant","type":"string","required":true,"line":8,"description":"Key for storing the user's tenant/organization (\"nexus_user_tenant\")."},{"name":"UserRoles","type":"string","required":true,"line":9,"description":"Key for storing the user's roles (\"nexus_user_roles\")."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Constants Holder"],"domainConcepts":["Authentication","User"],"keyDetails":"Simple static class with public const string fields; no runtime behavior, methods, or external calls. Typical usage: shared keys for storage reads/writes across Web, MAUI, or client layers.","orchestrationMethods":[],"typedContracts":[{"name":"StorageKeys","kind":"model","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"StorageKeys","line":3,"summary":"model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Constants/StorageKeys.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"d420ebbac21f8af8586b9cf6667f24af3f86da9419af589d4c649f8343529abf","sourceByteSize":380,"analyzedAt":"2026-05-23T16:19:26.793Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","purpose":"Defines simple DTOs used to return a grounded AI response (answer plus provenance/citations) from application services.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI","File only contains plain data-holder classes (GroundedResponseDto, CitationDto) with auto-properties"]},"className":"GroundedResponseDto","methods":[],"types":[{"name":"GroundedResponseDto","kind":"dto","line":5,"purpose":"Carries an AI-generated answer and a list of provenance citations back to callers.","fields":[{"name":"Answer","type":"string","required":true,"line":7,"description":"The generated answer text"},{"name":"Citations","type":"List<CitationDto>","required":true,"line":8,"description":"List of contextual citations supporting the answer"}]},{"name":"CitationDto","kind":"dto","line":11,"purpose":"Represents a single provenance item (chunk id, snippet, and source) used to justify the answer.","fields":[{"name":"CitationId","type":"string","required":true,"line":13,"description":"Identifier for the cited chunk (e.g., chunk hash/ID)"},{"name":"Snippet","type":"string","required":true,"line":14,"description":"Verified text snippet extracted from context"},{"name":"SourceBook","type":"string","required":true,"line":15,"description":"Book title or human-readable source description"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["GroundedResponse","Citation","AI/Knowledge","Answering","Provenance"],"keyDetails":"Small, self-contained DTOs with default non-null initializers (string.Empty, new List) intended for safe transport over app/service boundaries.","orchestrationMethods":[],"typedContracts":[{"name":"GroundedResponseDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"name":"CitationDto","kind":"dto","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GroundedResponseDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"kind":"typed-contract","label":"CitationDto","line":11,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}]}
{"path":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","purpose":"Defines simple DTOs for AI grounded responses and their citations used across the application boundary.","classification":{"role":"dto","layer":"application","confidence":0.8,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI indicates application-layer DTOs","File contains plain POCO classes with public properties and default initializers"]},"className":"","methods":[],"types":[{"name":"GroundedResponseDto","kind":"dto","line":5,"purpose":"Represents a grounded AI answer plus associated citations.","fields":[{"name":"Answer","type":"string","required":true,"line":7,"description":"Primary textual answer from the AI"},{"name":"Citations","type":"List<CitationDto>","required":true,"line":8,"description":"List of citation entries that support the answer"}]},{"name":"CitationDto","kind":"dto","line":11,"purpose":"Represents a single citation/snippet referencing source material supporting an AI response.","fields":[{"name":"CitationId","type":"string","required":true,"line":13,"description":"Identifier for the cited chunk (e.g., chunk hash/ID)"},{"name":"Snippet","type":"string","required":true,"line":14,"description":"Verified text snippet extracted from the source context"},{"name":"SourceBook","type":"string","required":true,"line":15,"description":"Book title or human-readable source description"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","POCO"],"domainConcepts":["Grounded AI Response","Citation"],"keyDetails":"Simple, immutable-seeming DTOs (with default initializers) meant for transporting AI answers and their provenance; no runtime behavior, external calls, or persistence in this file.","orchestrationMethods":[],"typedContracts":[{"name":"GroundedResponseDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"name":"CitationDto","kind":"dto","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GroundedResponseDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]},{"kind":"typed-contract","label":"CitationDto","line":11,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/GroundedResponseDto.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"717b4a7e0b2e1e969aef25735b5861388e6278777c1e5664d997fb572d9351f8","sourceByteSize":546,"analyzedAt":"2026-05-23T16:17:01.422Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/DTOs/AI/RelevantContext.cs","purpose":"Defines a small DTO that carries a piece of retrieved context (text, source id and confidence) used by AI/knowledge features.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI","File path implies DTOs for AI features and contains only plain properties"]},"className":"RelevantContext","methods":[],"types":[{"name":"RelevantContext","kind":"dto","line":3,"purpose":"Represents a single relevant context item (text snippet) returned or passed to AI/knowledge components, including its source and confidence score.","fields":[{"name":"Text","type":"string","required":true,"line":5,"description":"The context text snippet; initialized to empty string by default."},{"name":"SourceId","type":"string","required":true,"line":6,"description":"Identifier of the source (e.g., ContentHash or EbookTitle); initialized to empty string."},{"name":"Confidence","type":"double","required":false,"line":7,"description":"Confidence score for how relevant the snippet is."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["AI","Knowledge Retrieval","Context Snippet"],"keyDetails":"Tiny immutable-appearing DTO (auto-properties with defaults) used to transport relevant context text, its source id, and a numeric confidence between layers or AI components.","orchestrationMethods":[],"typedContracts":[{"name":"RelevantContext","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"RelevantContext","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}]}
{"path":"NexusReader.Application/DTOs/AI/RelevantContext.cs","purpose":"Defines a small data transfer object that carries a piece of text along with its source identifier and a confidence score for AI/processing scenarios.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI indicates DTO in Application layer","Class RelevantContext contains only plain properties (Text, SourceId, Confidence)"]},"className":"RelevantContext","methods":[],"types":[{"name":"RelevantContext","kind":"dto","line":3,"purpose":"Represents a piece of relevant textual context with its source identifier and confidence score for AI-related processing.","fields":[{"name":"Text","type":"string","required":true,"line":5,"description":"The textual content; initialized to empty string by default."},{"name":"SourceId","type":"string","required":true,"line":6,"description":"Identifier of the content origin (e.g., ContentHash or EbookTitle); default empty string."},{"name":"Confidence","type":"double","required":true,"line":7,"description":"Numeric confidence score associated with this context."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Data Transfer Object (DTO)"],"domainConcepts":["RelevantContext","AI context"],"keyDetails":"A minimal DTO in the Application layer with default-initialized string properties and a numeric confidence field; no methods or external dependencies.","orchestrationMethods":[],"typedContracts":[{"name":"RelevantContext","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"RelevantContext","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/RelevantContext.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"8466002902f433e3f51838bdb14a662ff9bb9514a6747f2c63e4eeeedeb7eeb0","sourceByteSize":267,"analyzedAt":"2026-05-23T16:19:38.739Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","purpose":"Defines a data transfer object representing a semantic search hit returned by AI/semantic search operations, carrying content identifiers, a snippet, relevance score and optional metadata.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI indicates an Application-layer DTO","File declares a single plain data class SemanticSearchResultDto with no methods"]},"className":"SemanticSearchResultDto","methods":[],"types":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"purpose":"Carries the result of a semantic search (content identifier, snippet, unit type, relevance and optional source/metadata) across application boundaries.","fields":[{"name":"ContentHash","type":"string","required":true,"line":5,"description":"Identifier/hash for the matched content (non-null, initialized to empty string)."},{"name":"Snippet","type":"string","required":true,"line":6,"description":"Text snippet or excerpt used to show the match (non-null, initialized to empty string)."},{"name":"UnitType","type":"string?","required":false,"line":7,"description":"Optional unit/type of the content (nullable)."},{"name":"RelevanceScore","type":"float","required":true,"line":8,"description":"Numeric relevance score from the semantic search."},{"name":"SourceBookTitle","type":"string?","required":false,"line":9,"description":"Optional title of the source book where the content originated (nullable)."},{"name":"Metadata","type":"Dictionary<string, object>?","required":false,"line":10,"description":"Optional arbitrary metadata / bonus context attached to the result (nullable)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["Semantic Search","Search Result","Knowledge Retrieval"],"keyDetails":"Plain DTO used to transport semantic search hits; contains nullable metadata for extensibility and initialized non-null strings for ContentHash and Snippet.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"fieldCount":6,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticSearchResultDto","line":3,"summary":"dto with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}]}
{"path":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","purpose":"Defines a simple Data Transfer Object (DTO) representing a semantic search result used by the Application layer to carry search snippet, relevance and metadata.","classification":{"role":"dto","layer":"application","confidence":0.95,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.DTOs.AI","Class name ends with 'Dto' and file path under Application/DTOs"]},"className":"SemanticSearchResultDto","methods":[],"types":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"purpose":"Carries the result of a semantic search (content hash, snippet, relevance, source and optional metadata).","fields":[{"name":"ContentHash","type":"string","required":true,"line":5,"description":"Identifier/hash of the content returned"},{"name":"Snippet","type":"string","required":true,"line":6,"description":"Short text snippet excerpt from matched content"},{"name":"UnitType","type":"string?","required":false,"line":7,"description":"Optional type of the content unit (e.g., chapter, paragraph)"},{"name":"RelevanceScore","type":"float","required":true,"line":8,"description":"Numeric relevance score for ordering results"},{"name":"SourceBookTitle","type":"string?","required":false,"line":9,"description":"Optional source book title where the content came from"},{"name":"Metadata","type":"Dictionary<string, object>?","required":false,"line":10,"description":"Optional additional context key/value pairs"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["SemanticSearch","AI","SearchResult"],"keyDetails":"Simple immutable-shaped DTO (auto-properties) used to transfer semantic search results; no methods or runtime behavior in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticSearchResultDto","kind":"dto","line":3,"fieldCount":6,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticSearchResultDto","line":3,"summary":"dto with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"173f463b736020dd7ae03300cd14d0e1d44d68597fc2661b44cde85051f21c43","sourceByteSize":428,"analyzedAt":"2026-05-23T16:17:05.113Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/DTOs/User/AuthorDto.cs","purpose":"Defines a simple data transfer object representing an author (Id and Name) used by the Application layer to pass user/author data between boundaries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.DTOs.User","File path and name: Application/DTOs/User/AuthorDto.cs","Declares a record named AuthorDto with simple properties"]},"className":"AuthorDto","methods":[],"types":[{"name":"AuthorDto","kind":"dto","line":3,"purpose":"Immutable DTO carrying basic author identity data across application boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Numeric author identifier"},{"name":"Name","type":"string","required":true,"line":6,"description":"Author display name (defaults to empty string)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","record"],"domainConcepts":["Author","User"],"keyDetails":"Small immutable record DTO in the Application layer representing author/user identity (Id and Name).","orchestrationMethods":[],"typedContracts":[{"name":"AuthorDto","kind":"dto","line":3,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AuthorDto","line":3,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}]}
{"path":"NexusReader.Application/DTOs/User/AuthorDto.cs","purpose":"Defines an immutable data transfer object (DTO) representing an author with an Id and Name used across the application layer.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","namespace NexusReader.Application.DTOs.User","file contains a record type AuthorDto with simple data properties"]},"className":"AuthorDto","methods":[],"types":[{"name":"AuthorDto","kind":"dto","line":3,"purpose":"Carries author identity and display name across application boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Author identifier"},{"name":"Name","type":"string","required":true,"line":6,"description":"Author display name; defaults to empty string"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Immutable record"],"domainConcepts":["Author","User"],"keyDetails":"Small immutable DTO in the Application layer; no runtime logic, only two properties (Id, Name).","orchestrationMethods":[],"typedContracts":[{"name":"AuthorDto","kind":"dto","line":3,"fieldCount":2,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AuthorDto","line":3,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/AuthorDto.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"faa07b9180afdb94af84dcd97efb1bbe3f3f593a2f7295fb633f63929d6b5821","sourceByteSize":168,"analyzedAt":"2026-05-23T16:17:08.017Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs","purpose":"Defines a simple immutable DTO representing a subscription plan used across the application layer (billing/AI quota).","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.DTOs.User","File name and shape: SubscriptionPlanDto record with init-only properties"]},"className":"SubscriptionPlanDto","methods":[],"types":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"purpose":"Carries subscription plan data (id, name, AI token limits, price) across application boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Numeric identifier of the subscription plan"},{"name":"Name","type":"string","required":true,"line":6,"description":"Human-readable plan name"},{"name":"AITokenLimit","type":"int","required":true,"line":7,"description":"Token allowance for AI usage on the plan"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":8,"description":"Flag indicating whether token limits are disabled"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":9,"description":"Monthly price for the subscription plan"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Immutable Record"],"domainConcepts":["SubscriptionPlan","Billing","AI Tokens"],"keyDetails":"A minimal, immutable data-transfer record used to move subscription plan data; no methods, behavior, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlanDto","line":3,"summary":"dto with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}]}
{"path":"NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs","purpose":"Defines a data-transfer object representing a subscription plan (id, display name, token limits, and monthly price) used across the application layer.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","namespace NexusReader.Application.DTOs.User (line 1) indicates application-layer DTOs","record SubscriptionPlanDto declared (line 3) contains only data properties"]},"className":"SubscriptionPlanDto","methods":[],"types":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"purpose":"Carries subscription plan details (id, name, AI token limits, and price) across boundaries.","fields":[{"name":"Id","type":"int","required":true,"line":5,"description":"Numeric identifier for the subscription plan."},{"name":"Name","type":"string","required":false,"line":6,"description":"Human-readable plan name (defaults to empty string)."},{"name":"AITokenLimit","type":"int","required":true,"line":7,"description":"Configured AI token limit for the plan."},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":8,"description":"Flag indicating whether the plan has unlimited tokens."},{"name":"MonthlyPrice","type":"decimal","required":true,"line":9,"description":"Monthly price for the subscription plan."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record (C# 9+)"],"domainConcepts":["SubscriptionPlan","Billing"],"keyDetails":"Simple immutable record used as a DTO in the Application layer to represent subscription plan metadata; no runtime behavior (methods) in this file.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlanDto","kind":"dto","line":3,"fieldCount":5,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlanDto","line":3,"summary":"dto with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/DTOs/User/SubscriptionPlanDto.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"9a5850697c58ef8a3f440890d0ab9a6e0cb14824116adbec03fe065b289b2b73","sourceByteSize":320,"analyzedAt":"2026-05-23T16:17:12.847Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/DependencyInjection.cs","purpose":"Provides application-level DI registrations (Mapster mapping config and MediatR handler registration) and exposes the application assembly for composition/root usage.","classification":{"role":"service-registration","layer":"application","confidence":0.9,"evidence":["Contains an AddApplication(IServiceCollection) extension that registers services","Exposes Assembly property for registering handlers from this assembly"]},"className":"DependencyInjection","methods":[{"name":"AddApplication","line":8,"endLine":14,"signature":"(services: IServiceCollection) -> IServiceCollection","purpose":"Extension method that registers application mapping configuration and MediatR handlers, returning the IServiceCollection for chaining.","calls":[{"targetFile":"NexusReader.Application/Mappings.cs","targetMethod":"AddMapsterConfiguration","callLine":10,"paramSummary":"this IServiceCollection (extension call to register Mapster mappings)"}],"actions":[{"id":"service-registration_10","kind":"mapping","label":"Register mapping configuration","line":10,"detail":"Calls AddMapsterConfiguration() to add Mapster mapping setup","visibility":"detail-only","confidence":0.7},{"id":"service-registration_11","kind":"mapping","label":"Register MediatR handlers","line":11,"detail":"Calls AddMediatR(...) to register MediatR handlers from this assembly (external library call)","visibility":"detail-only","confidence":0.7},{"id":"return_13","kind":"return","label":"Return IServiceCollection","line":13,"detail":"Returns the same IServiceCollection for fluent chaining","visibility":"detail-only","confidence":0.7},{"id":"addapplication_return_13_0","kind":"return","label":"Returns result","line":13,"detail":"return services;","visibility":"detail-only","confidence":0.7}]},{"name":"Assembly","line":16,"endLine":16,"signature":"-> System.Reflection.Assembly","purpose":"Exposes the current assembly (NexusReader.Application) for use when registering handlers or scanning types.","calls":[],"actions":[{"id":"expose-value_16","kind":"mapping","label":"Provide assembly reference","line":16,"detail":"Getter returns typeof(DependencyInjection).Assembly","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[{"line":10,"serviceType":"Mapster configuration / mapping profiles","implementationType":"configured via AddMapsterConfiguration extension","lifetime":"unknown","factorySummary":"Calls AddMapsterConfiguration to register Mapster mapping setup for the Application project"},{"line":11,"serviceType":"MediatR handlers (from this assembly)","implementationType":"handlers discovered in this assembly","lifetime":"unknown","factorySummary":"Calls AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly)) to register MediatR handlers"}],"startupActions":[],"dependencies":["NexusReader.Application/Mappings.cs","MediatR (external package)"],"patterns":["Dependency Injection extension","Service registration"],"domainConcepts":[],"keyDetails":"Intended to be called from the composition root (e.g., Web project startup) to wire up application mapping and MediatR handler discovery; exposes Assembly for scanning.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Application/DependencyInjection.cs","purpose":"Provides Application-layer dependency registrations (mappings, MediatR) and exposes the assembly for registration discovery.","classification":{"role":"service-registration","layer":"application","confidence":0.9,"evidence":["Contains an AddApplication(IServiceCollection) extension that registers mapping and MediatR services","Exposes Assembly property used for scanning/registration (typeof(DependencyInjection).Assembly)"]},"className":"DependencyInjection","methods":[{"name":"AddApplication","line":8,"endLine":14,"signature":"(services: IServiceCollection) -> IServiceCollection","purpose":"Extension method that registers application-layer services: Mapster mapping configuration and MediatR handlers, then returns the IServiceCollection.","calls":[{"targetFile":"NexusReader.Application/Mappings","targetMethod":"AddMapsterConfiguration","callLine":10,"paramSummary":"this IServiceCollection (extension call to add mapping configuration)"}],"actions":[{"id":"service-registration_10","kind":"mapping","label":"Adds Mapster configuration to DI","line":10,"detail":"calls AddMapsterConfiguration() to register mapping config/services","visibility":"detail-only","confidence":0.7},{"id":"service-registration_11","kind":"mapping","label":"Registers MediatR and handlers from this assembly","line":11,"detail":"calls services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(DependencyInjection).Assembly)) to register MediatR services","visibility":"detail-only","confidence":0.7},{"id":"return_13","kind":"return","label":"Returns IServiceCollection","line":13,"detail":"returns services to allow chaining","visibility":"detail-only","confidence":0.7},{"id":"addapplication_return_13_0","kind":"return","label":"Returns result","line":13,"detail":"return services;","visibility":"detail-only","confidence":0.7}]},{"name":"Assembly (property getter)","line":16,"endLine":16,"signature":"() -> System.Reflection.Assembly","purpose":"Exposes the assembly containing the DependencyInjection type for registration/discovery.","calls":[],"actions":[{"id":"return_16","kind":"return","label":"Returns assembly for scanning","line":16,"detail":"returns typeof(DependencyInjection).Assembly","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[{"name":"AddApplication","line":8,"kind":"service-registration","targetCalls":[{"targetFile":"NexusReader.Application/Mappings","targetMethod":"AddMapsterConfiguration","callLine":10,"paramSummary":"IServiceCollection - mapping configuration registration"},{"targetFile":"unknown","targetMethod":"AddMediatR","callLine":11,"paramSummary":"Registers MediatR services and handlers from this assembly via RegisterServicesFromAssembly(...)"}]}],"dependencies":["NexusReader.Application/Mappings"],"patterns":["Dependency Injection","Service Registration","Composition Root (partial)"],"domainConcepts":["Mapping","MediatR handler discovery"],"keyDetails":"This static helper centralizes Application-layer DI registration: it wires mapping configuration and asks MediatR to register handlers from the assembly exposed by the Assembly property.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"startup","label":"AddApplication","line":8,"summary":"service-registration startup action","confidence":0.78,"evidencePaths":["NexusReader.Application/DependencyInjection.cs","NexusReader.Application/Mappings","unknown"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"1aff1a22608fe81d4630d0acae8f6ec801b8016f2bc6cfae482a7e7b37aa0cc3","sourceByteSize":558,"analyzedAt":"2026-05-23T16:19:41.479Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/NexusReader.Application.csproj","purpose":"Project file for the NexusReader.Application .NET project: declares project-to-project references, NuGet package dependencies, and build properties (target framework, nullable, implicit usings, runtime config generation).","classification":{"role":"config","layer":"application","confidence":0.9,"evidence":["Project references to NexusReader.Domain and NexusReader.Data (lines 4-6)","Multiple PackageReference entries including MediatR, EF Core, AI, Identity, resilience libraries (lines 9-18)","TargetFramework, Nullable, ImplicitUsings defined (lines 21-26)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["..\\NexusReader.Domain\\NexusReader.Domain.csproj","..\\NexusReader.Data\\NexusReader.Data.csproj"],"patterns":["MediatR (Mediator/CQRS)","Mapster (mapping)","EF Core repository/persistence","Resilience patterns (Microsoft.Extensions.Resilience)"],"domainConcepts":["Authentication/Identity","AI/Knowledge (Microsoft.Extensions.AI)","Vector search (Pgvector)","Persistence/EF Core","Mapping/DTOs"],"keyDetails":"TargetFramework: net10.0 (line 22); ImplicitUsings enabled (line 23); Nullable enabled (line 24); GenerateRuntimeConfigurationFiles true (line 25). NuGet packages: FluentResults, Mapster, Mapster.DependencyInjection, MediatR, Microsoft.AspNetCore.Authorization, Microsoft.EntityFrameworkCore, Microsoft.Extensions.AI, Microsoft.Extensions.Identity.Core, Pgvector.EntityFrameworkCore, Microsoft.Extensions.Resilience (lines 9-18). Project references to Domain and Data projects (lines 4-5).","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Application/NexusReader.Application.csproj","purpose":"MSBuild project file for the NexusReader.Application assembly; it declares project dependencies and NuGet package dependencies that define the Application layer's runtime capabilities and boundaries.","classification":{"role":"config","layer":"application","confidence":0.85,"evidence":["Project references to NexusReader.Domain and NexusReader.Data (lines 4-5) indicate this project sits between domain and data layers.","PackageReferences include MediatR, Microsoft.EntityFrameworkCore, Mapster, Microsoft.Extensions.AI, and Pgvector (lines 9-18), showing orchestration, mapping, persistence, AI/vector capabilities."]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["..\\NexusReader.Domain\\NexusReader.Domain.csproj","..\\NexusReader.Data\\NexusReader.Data.csproj","FluentResults (NuGet)","Mapster (NuGet)","Mapster.DependencyInjection (NuGet)","MediatR (NuGet)","Microsoft.AspNetCore.Authorization (NuGet)","Microsoft.EntityFrameworkCore (NuGet)","Microsoft.Extensions.AI (NuGet)","Microsoft.Extensions.Identity.Core (NuGet)","Pgvector.EntityFrameworkCore (NuGet)","Microsoft.Extensions.Resilience (NuGet)"],"patterns":["Mediator/CQRS (MediatR)","DTO/Mapping (Mapster)","Repository/EF Core persistence","Vector embeddings/search (Pgvector + Microsoft.Extensions.AI)","Resilience/Retry patterns (Microsoft.Extensions.Resilience)"],"domainConcepts":["Application layer orchestration","Mapping/DTO transformation","Persistence via EF Core","AI/vector search integration"],"keyDetails":"Targets net10.0 (line 22), enables implicit usings and nullable (lines 23-24), generates runtime configuration files (line 25). Project references to Domain and Data define boundaries; packages indicate MediatR-based orchestration, Mapster mapping, EF Core persistence, Pgvector for vector storage, and Microsoft.Extensions.AI for AI integrations.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"b108b2967631936f946c54fc473927e4df840b4d1cae49d0ba25f2c258a2cb67","sourceByteSize":1130,"analyzedAt":"2026-05-23T16:23:07.093Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs","purpose":"Defines a CQRS query record that carries input for extracting a knowledge graph from text within a tenant and optional ebook scope.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","File path: NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs","Type implements IQuery<GraphDataDto>"]},"className":"GetKnowledgeGraphQuery","methods":[{"name":"GetKnowledgeGraphQuery (ctor)","line":8,"endLine":8,"signature":"(Text: string, TenantId: string, EbookId: Guid? = null) -> GetKnowledgeGraphQuery","purpose":"Constructs the query DTO carrying text, tenant, and optional ebook id for knowledge-graph extraction.","calls":[],"actions":[{"id":"ctor_8","kind":"mapping","label":"Primary record constructor","line":8,"detail":"Immutable record positional parameters: Text, TenantId, EbookId (nullable, default null)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"purpose":"Represents a request to produce a GraphDataDto from provided text within a tenant and optional ebook context.","fields":[{"name":"Text","type":"string","required":true,"line":8,"description":"Chapter or page content to extract the graph from."},{"name":"TenantId","type":"string","required":true,"line":8,"description":"Tenant scope for knowledge extraction and caching."},{"name":"EbookId","type":"Guid?","required":false,"line":8,"description":"Optional Ebook ID to link the knowledge units to."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (referenced via using)","GraphDataDto (referenced in IQuery<GraphDataDto>, file unknown)"],"patterns":["CQRS Query"],"domainConcepts":["Knowledge Graph","Tenant","Ebook"],"keyDetails":"Lightweight immutable record used as the application-layer query DTO; no runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetKnowledgeGraphQuery","line":8,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}]}
{"path":"NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs","purpose":"Defines a CQRS query record used to request a knowledge graph extraction from provided text within a tenant scope and optional ebook context.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","namespace NexusReader.Application.Queries.Graph","record implements IQuery<GraphDataDto>"]},"className":"GetKnowledgeGraphQuery","methods":[],"types":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"purpose":"Represents a request to produce a GraphDataDto from input text for a given tenant and optional ebook.","fields":[{"name":"Text","type":"string","required":true,"line":8,"description":"Chapter or page content to extract the graph from (doc comment line 5)."},{"name":"TenantId","type":"string","required":true,"line":8,"description":"Tenant scope for knowledge extraction and caching (doc comment line 6)."},{"name":"EbookId","type":"Guid?","required":false,"line":8,"description":"Optional Ebook ID to link the knowledge units to (doc comment line 7)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (IQuery)","GraphDataDto (output type)"],"patterns":["CQRS","QueryObject"],"domainConcepts":["Knowledge Graph","Tenant","Ebook"],"keyDetails":"Simple immutable record used as a query DTO; no runtime logic in this file. Implements IQuery<GraphDataDto> and carries three parameters (Text, TenantId, optional EbookId).","orchestrationMethods":[],"typedContracts":[{"name":"GetKnowledgeGraphQuery","kind":"query","line":8,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetKnowledgeGraphQuery","line":8,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GetKnowledgeGraphQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"fa6e2a386c82139c846d9edde8a8b2b4a293ce1f2cce8db44521fcf94f94b903","sourceByteSize":480,"analyzedAt":"2026-05-23T16:17:25.691Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Graph/GraphViewModels.cs","purpose":"Defines simple DTO/view-model records for graph visualization: node, link, and a container holding collections of nodes and links used by application queries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.Queries.Graph indicates application query DTOs","File contains only record types named GraphNodeDto, GraphLinkDto, GraphDataDto"]},"className":"","methods":[],"types":[{"name":"GraphNodeDto","kind":"dto","line":3,"purpose":"Represents a single graph node with id, display label, group and optional type.","fields":[{"name":"Id","type":"string","required":true,"line":3,"description":"Unique identifier for the node (constructor parameter)"},{"name":"Label","type":"string","required":true,"line":3,"description":"Human-readable label for the node (constructor parameter)"},{"name":"Group","type":"string","required":true,"line":3,"description":"Grouping/category for visualization (constructor parameter)"},{"name":"Type","type":"string?","required":false,"line":3,"description":"Optional semantic type of the node (nullable constructor parameter)"}]},{"name":"GraphLinkDto","kind":"dto","line":4,"purpose":"Represents an edge/link between two nodes with a relation type and optional weight/value.","fields":[{"name":"Source","type":"string","required":true,"line":4,"description":"Source node id (constructor parameter)"},{"name":"Target","type":"string","required":true,"line":4,"description":"Target node id (constructor parameter)"},{"name":"RelationType","type":"string","required":true,"line":4,"description":"Label/type of the relationship (constructor parameter)"},{"name":"Value","type":"int","required":true,"line":4,"description":"Numeric weight/strength of the link with default 1 (constructor parameter)"}]},{"name":"GraphDataDto","kind":"dto","line":5,"purpose":"Container holding collections of GraphNodeDto and GraphLinkDto for graph results returned by queries.","fields":[{"name":"Nodes","type":"List<GraphNodeDto>","required":true,"line":7,"description":"List of nodes (init-only property, defaults to empty list)"},{"name":"Links","type":"List<GraphLinkDto>","required":true,"line":8,"description":"List of links/edges (init-only property, defaults to empty list)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","View-Model"],"domainConcepts":["Graph","Node","Link"],"keyDetails":"Minimal, immutable record types used to transport graph data in application query responses; no behavior, persistence, or external calls present.","orchestrationMethods":[],"typedContracts":[{"name":"GraphNodeDto","kind":"dto","line":3,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphLinkDto","kind":"dto","line":4,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphDataDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GraphNodeDto","line":3,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphLinkDto","line":4,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphDataDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}]}
{"path":"NexusReader.Application/Queries/Graph/GraphViewModels.cs","purpose":"Defines lightweight Graph view-model/DTO types used by application queries to represent nodes, links, and the aggregated graph data for UI or API consumption.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace NexusReader.Application.Queries.Graph indicates application-layer query/view models","File contains only record DTOs (GraphNodeDto, GraphLinkDto, GraphDataDto) used to transport graph data"]},"className":"","methods":[],"types":[{"name":"GraphNodeDto","kind":"dto","line":3,"purpose":"Represents a single graph node with an identifier, label, grouping, and optional type metadata.","fields":[{"name":"Id","type":"string","required":true,"line":3,"description":"Unique node identifier"},{"name":"Label","type":"string","required":true,"line":3,"description":"Display label for the node"},{"name":"Group","type":"string","required":true,"line":3,"description":"Grouping or cluster key for the node"},{"name":"Type","type":"string?","required":false,"line":3,"description":"Optional node type/category"}]},{"name":"GraphLinkDto","kind":"dto","line":4,"purpose":"Represents an edge/link between two nodes with a relation type and a numeric value/weight.","fields":[{"name":"Source","type":"string","required":true,"line":4,"description":"Source node id"},{"name":"Target","type":"string","required":true,"line":4,"description":"Target node id"},{"name":"RelationType","type":"string","required":true,"line":4,"description":"Semantic relation label for the link"},{"name":"Value","type":"int","required":true,"line":4,"description":"Numeric weight or strength of the link (default 1)"}]},{"name":"GraphDataDto","kind":"dto","line":5,"purpose":"Container for an in-memory graph payload: lists of nodes and links prepared for queries or UI rendering.","fields":[{"name":"Nodes","type":"List<GraphNodeDto>","required":true,"line":7,"description":"Collection of graph nodes (initialized to empty list)"},{"name":"Links","type":"List<GraphLinkDto>","required":true,"line":8,"description":"Collection of graph links/edges (initialized to empty list)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","ViewModel"],"domainConcepts":["Graph","Node","Link"],"keyDetails":"File solely defines immutable records for graph transfer; no runtime logic, external calls, or registrations present.","orchestrationMethods":[],"typedContracts":[{"name":"GraphNodeDto","kind":"dto","line":3,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphLinkDto","kind":"dto","line":4,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"name":"GraphDataDto","kind":"dto","line":5,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GraphNodeDto","line":3,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphLinkDto","line":4,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]},{"kind":"typed-contract","label":"GraphDataDto","line":5,"summary":"dto with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Graph/GraphViewModels.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"1de3956a7294f0b246b3951a48c1ee78e7cc6a9a5af9bd429127bc1e22f615eb","sourceByteSize":392,"analyzedAt":"2026-05-23T16:19:55.786Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Quiz/QuizViewModels.cs","purpose":"Defines lightweight Data Transfer Objects (records) used by the Application layer to represent quizzes and quiz questions for queries and view models.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.Queries.Quiz","File contains record types named QuizDto and QuizQuestionDto used for query/view-model purposes"]},"className":"","methods":[],"types":[{"name":"QuizQuestionDto","kind":"dto","line":3,"purpose":"Represents a single quiz question with its possible options and the index of the correct option.","fields":[{"name":"Question","type":"string","required":true,"line":3,"description":"The text of the question"},{"name":"Options","type":"List<string>","required":true,"line":3,"description":"Possible answer options"},{"name":"CorrectIndex","type":"int","required":true,"line":3,"description":"Zero-based index of the correct option in Options"}]},{"name":"QuizDto","kind":"dto","line":4,"purpose":"Holds a collection of quiz questions to represent an entire quiz payload.","fields":[{"name":"Questions","type":"List<QuizQuestionDto>","required":true,"line":4,"description":"List of quiz questions"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record"],"domainConcepts":["Quiz","Question","Options"],"keyDetails":"Very small file: only two immutable record DTOs used for query/view-model surface; no methods or external calls.","orchestrationMethods":[],"typedContracts":[{"name":"QuizQuestionDto","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"name":"QuizDto","kind":"dto","line":4,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizQuestionDto","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"kind":"typed-contract","label":"QuizDto","line":4,"summary":"dto with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}]}
{"path":"NexusReader.Application/Queries/Quiz/QuizViewModels.cs","purpose":"Defines simple immutable view-model DTOs for quiz query responses (questions and quiz payload).","classification":{"role":"dto","layer":"application","confidence":0.8,"evidence":["DTO/view-model naming pattern","Namespace: NexusReader.Application.Queries.Quiz","File contains record types named *Dto used for query/view models"]},"className":"","methods":[],"types":[{"name":"QuizQuestionDto","kind":"dto","line":3,"purpose":"Represents a single quiz question with its options and the index of the correct option.","fields":[{"name":"Question","type":"string","required":true,"line":3,"description":"The question text"},{"name":"Options","type":"List<string>","required":true,"line":3,"description":"List of possible answers for the question"},{"name":"CorrectIndex","type":"int","required":true,"line":3,"description":"Zero-based index pointing to the correct option in Options"}]},{"name":"QuizDto","kind":"dto","line":4,"purpose":"Encapsulates a collection of quiz questions as the payload for quiz-related queries/responses.","fields":[{"name":"Questions","type":"List<QuizQuestionDto>","required":true,"line":4,"description":"List of quiz questions"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record"],"domainConcepts":["Quiz","QuizQuestion"],"keyDetails":"Two positional C# record DTOs only; no methods, logic, external calls, or persistence in this file.","orchestrationMethods":[],"typedContracts":[{"name":"QuizQuestionDto","kind":"dto","line":3,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"name":"QuizDto","kind":"dto","line":4,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizQuestionDto","line":3,"summary":"dto with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]},{"kind":"typed-contract","label":"QuizDto","line":4,"summary":"dto with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Quiz/QuizViewModels.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"bf7ab46341c00695114947600cfd7fd4fea2ab38ae4ffbb71a18c31cd532fcef","sourceByteSize":197,"analyzedAt":"2026-05-23T16:19:54.711Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs","purpose":"Defines a CQRS query record that models a request to retrieve a specific chapter/page of a user's ebook (ReaderPageViewModel) and carries tenant/user context.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.Reader","Record implements IQuery<ReaderPageViewModel>","File located under Application project area"]},"className":"GetReaderPageQuery","methods":[],"types":[{"name":"GetReaderPageQuery","kind":"query","line":11,"purpose":"Represents a request to fetch a reader page (chapter) for a specific ebook and user (tenant isolation).","fields":[{"name":"EbookId","type":"Guid","required":true,"line":12,"description":"Identifier of the ebook to read"},{"name":"ChapterIndex","type":"int","required":true,"line":13,"description":"Zero-based index of the chapter/page to retrieve (defaults to 0)"},{"name":"UserId","type":"string?","required":false,"line":14,"description":"Authenticated user's ID for tenant isolation (optional)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (using at line 1)","ReaderPageViewModel (referenced in generic IQuery<>; defined elsewhere)"],"patterns":["CQRS Query","Record DTO"],"domainConcepts":["Ebook","Chapter / ReaderPage","Tenant / User isolation"],"keyDetails":"Simple immutable record used as the application-layer query message type: GetReaderPageQuery(Guid EbookId, int ChapterIndex = 0, string? UserId = null) : IQuery<ReaderPageViewModel> (declared lines 11-14).","orchestrationMethods":[],"typedContracts":[{"name":"GetReaderPageQuery","kind":"query","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetReaderPageQuery","line":11,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}]}
{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs","purpose":"Defines a CQRS query record used to request a specific ebook chapter (reader page) for a given user/tenant, returning a ReaderPageViewModel.","classification":{"role":"handler","layer":"application","confidence":0.86,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.Reader (line 3)","Record named GetReaderPageQuery implements IQuery<ReaderPageViewModel> (lines 11-14)","Using NexusReader.Application.Abstractions.Messaging suggests CQRS messaging abstractions (line 1)"]},"className":"GetReaderPageQuery","methods":[],"types":[{"name":"GetReaderPageQuery","kind":"query","line":11,"purpose":"Represents a request to retrieve a specific chapter (page) of a user's ebook, used in the application's query pipeline.","fields":[{"name":"EbookId","type":"Guid","required":true,"line":12,"description":"Identifier of the ebook to read."},{"name":"ChapterIndex","type":"int","required":false,"line":13,"description":"Zero-based chapter index with default 0."},{"name":"UserId","type":"string?","required":false,"line":14,"description":"Authenticated user's ID for tenant isolation (optional)."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (IQuery<ReaderPageViewModel>)"],"patterns":["CQRS Query"],"domainConcepts":["Ebook","Reader","Chapter","Tenant/User"],"keyDetails":"Simple immutable record implementing IQuery<ReaderPageViewModel>; carries ebook id, chapter index (default 0), and optional user id for tenant-scoped read operations.","orchestrationMethods":[],"typedContracts":[{"name":"GetReaderPageQuery","kind":"query","line":11,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetReaderPageQuery","line":11,"summary":"query with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"a2ebbaa5cc2fa8883cb2347f6494f5981cffb04e9bfb17f1cbd151ee9904e4e1","sourceByteSize":556,"analyzedAt":"2026-05-23T16:17:38.986Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","purpose":"Handles GetReaderPageQuery requests by delegating to an EPUB reader service to produce a ReaderPageViewModel result.","classification":{"role":"handler","layer":"application","confidence":0.86,"evidence":["Namespace: NexusReader.Application.Queries.Reader","Implements IQueryHandler<GetReaderPageQuery, ReaderPageViewModel>","Delegates to an injected IEpubReader service"]},"className":"GetReaderPageQueryHandler","methods":[{"name":"GetReaderPageQueryHandler","line":11,"endLine":14,"signature":"(epubReader: IEpubReader) -> void","purpose":"Constructs the handler and captures the IEpubReader dependency.","calls":[],"actions":[{"id":"assignment_13","kind":"mapping","label":"Assign DI dependency","line":13,"detail":"_epubReader = epubReader","visibility":"detail-only","confidence":0.7}]},{"name":"Handle","line":16,"endLine":19,"signature":"(request: GetReaderPageQuery, cancellationToken: CancellationToken) -> Task<Result<ReaderPageViewModel>>","purpose":"Loads EPUB content for the requested ebook/chapter/user by delegating to IEpubReader.GetEpubContentAsync and returns the Result-wrapped ReaderPageViewModel.","calls":[{"targetFile":"NexusReader.Application.Abstractions.Services/IEpubReader.cs","targetMethod":"GetEpubContentAsync","callLine":18,"paramSummary":"request.EbookId, request.ChapterIndex, request.UserId, cancellationToken"}],"actions":[{"id":"external-call_18","kind":"external-call","label":"Delegates content loading","line":18,"detail":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task<Result<ReaderPageViewModel>>","visibility":"detail-only","confidence":0.7},{"id":"return_18","kind":"return","label":"Returns delegated Task result","line":18,"detail":"No local processing; returns the Task from the EPUB reader","visibility":"detail-only","confidence":0.7},{"id":"handle_return_18_0","kind":"return","label":"Returns result","line":18,"detail":"return _epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"purpose":"Application handler that processes GetReaderPageQuery by calling the EPUB reader service.","fields":[{"name":"_epubReader","type":"IEpubReader","required":true,"line":9,"description":"Injected service used to load EPUB content"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging/IQueryHandler","NexusReader.Application.Abstractions.Services/IEpubReader","GetReaderPageQuery","ReaderPageViewModel","FluentResults/Result"],"patterns":["CQRS Handler","Dependency Injection","Adapter/Facade (delegation to service)"],"domainConcepts":["Ebook","Chapter","Reader session/content"],"keyDetails":"The handler performs no local business logic or validation; it directly returns the Task produced by IEpubReader.GetEpubContentAsync, making the EPUB reader the authority for content retrieval and error/result shaping.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["external-call","return"],"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","NexusReader.Application.Abstractions.Services/IEpubReader.cs"]}],"typedContracts":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":18,"kind":"external-call","detail":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task<Result<ReaderPageViewModel>>","evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","NexusReader.Application.Abstractions.Services/IEpubReader.cs"]},{"kind":"typed-contract","label":"GetReaderPageQueryHandler","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]},{"kind":"external-call","label":"Handle","line":18,"summary":"Calls IEpubReader.GetEpubContentAsync and directly returns its Task<Result<ReaderPageViewModel>>","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}]}
{"path":"NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","purpose":"Query handler that responds to GetReaderPageQuery by delegating to an IEpubReader to fetch a ReaderPageViewModel for a given ebook/chapter and user.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Implements IQueryHandler<GetReaderPageQuery, ReaderPageViewModel>","Namespace NexusReader.Application.Queries.Reader","Delegates to IEpubReader to produce a ReaderPageViewModel"]},"className":"GetReaderPageQueryHandler","methods":[{"name":"Handle","line":16,"endLine":19,"signature":"(request: GetReaderPageQuery, cancellationToken: CancellationToken) -> Task<Result<ReaderPageViewModel>>","purpose":"Handles GetReaderPageQuery by calling the epub reader to fetch the requested page content and returns the Result-wrapped ReaderPageViewModel.","calls":[{"targetFile":"unknown","targetMethod":"GetEpubContentAsync","callLine":18,"paramSummary":"request.EbookId, request.ChapterIndex, request.UserId, cancellationToken"}],"actions":[{"id":"external-call_18","kind":"external-call","label":"Delegate to epub reader","line":18,"detail":"_epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken)","visibility":"detail-only","confidence":0.7},{"id":"return_18","kind":"return","label":"Return epub reader result","line":18,"detail":"Returns the Task<Result<ReaderPageViewModel>> produced by IEpubReader without additional mapping","visibility":"detail-only","confidence":0.7},{"id":"handle_return_18_0","kind":"return","label":"Returns result","line":18,"detail":"return _epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"purpose":"Internal query handler class that coordinates fetching reader page content via IEpubReader.","fields":[{"name":"_epubReader","type":"IEpubReader","required":true,"line":9,"description":"Injected service used to get EPUB content"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging","NexusReader.Application.Abstractions.Services","FluentResults"],"patterns":["CQRS Handler","Dependency Injection (constructor injection)"],"domainConcepts":["Reader","Ebook","Chapter","ReaderPage","Epub"],"keyDetails":"Very thin handler: no validation, mapping, retries, or logging — it simply delegates to IEpubReader.GetEpubContentAsync and returns its Result<Task<ReaderPageViewModel>>.","orchestrationMethods":[{"name":"Handle","line":16,"confidence":0.65,"reason":"Contains 1 architectural actions relevant to business execution.","actionKinds":["external-call","return"],"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","unknown"]}],"typedContracts":[{"name":"GetReaderPageQueryHandler","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"Handle","line":18,"kind":"external-call","detail":"_epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken)","evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"Handle","line":16,"summary":"Contains 1 architectural actions relevant to business execution.","confidence":0.65,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs","unknown"]},{"kind":"typed-contract","label":"GetReaderPageQueryHandler","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]},{"kind":"external-call","label":"Handle","line":18,"summary":"_epubReader.GetEpubContentAsync(request.EbookId, request.ChapterIndex, request.UserId, cancellationToken)","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/GetReaderPageQueryHandler.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"9b485391416c21e402fd7fd61905399f9bb7e4ac6525beb753388551774f6440","sourceByteSize":715,"analyzedAt":"2026-05-23T16:17:57.261Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs","purpose":"Defines a simple data-transfer record that carries metadata extracted from a local EPUB file (title, author, cover image, description) for use by application query handlers.","classification":{"role":"dto","layer":"application","confidence":0.86,"evidence":["Namespace: NexusReader.Application.Queries.Reader","File declares a record named LocalEpubMetadata used to carry EPUB metadata"]},"className":"LocalEpubMetadata","methods":[],"types":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"purpose":"Holds extracted metadata from a local EPUB for query/transfer purposes.","fields":[{"name":"Title","type":"string","required":true,"line":11,"description":"The title of the book; non-nullable with default empty string."},{"name":"Author","type":"string","required":true,"line":16,"description":"The author(s) of the book; non-nullable with default empty string."},{"name":"CoverImage","type":"byte[]?","required":false,"line":21,"description":"Raw bytes of the cover image if available; nullable."},{"name":"Description","type":"string?","required":false,"line":26,"description":"Description or summary of the book; nullable."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO","Record"],"domainConcepts":["Epub","Book","Metadata"],"keyDetails":"Pure data holder (record) with no runtime behavior; used in Application.Queries.Reader to transport EPUB metadata between components.","orchestrationMethods":[],"typedContracts":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"LocalEpubMetadata","line":6,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}]}
{"path":"NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs","purpose":"Defines a simple data transfer shape that carries metadata extracted from a local EPUB file (title, author, cover bytes, description).","classification":{"role":"dto","layer":"application","confidence":0.8,"evidence":["namespace NexusReader.Application.Queries.Reader indicates Application-level query model","file contains a plain record with properties used to carry EPUB metadata"]},"className":"LocalEpubMetadata","methods":[],"types":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"purpose":"Represents metadata extracted from a local EPUB file for query/transfer purposes.","fields":[{"name":"Title","type":"string","required":true,"line":11,"description":"The title of the book"},{"name":"Author","type":"string","required":true,"line":16,"description":"The author(s) of the book"},{"name":"CoverImage","type":"byte[]?","required":false,"line":21,"description":"The raw bytes of the cover image, if available"},{"name":"Description","type":"string?","required":false,"line":26,"description":"The description or summary of the book"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["DTO"],"domainConcepts":["Epub","Book","Metadata"],"keyDetails":"A simple record used in the Application.Queries.Reader namespace to carry local EPUB metadata; no runtime behavior, methods, or external calls in this file.","orchestrationMethods":[],"typedContracts":[{"name":"LocalEpubMetadata","kind":"dto","line":6,"fieldCount":4,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"LocalEpubMetadata","line":6,"summary":"dto with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/LocalEpubMetadata.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"30dfd11d3617674e09f6486b969b7ec691c06b474d9dc503a0eb421f9bf9c09d","sourceByteSize":720,"analyzedAt":"2026-05-23T16:19:52.358Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/Reader/ViewModels.cs","purpose":"Defines application-level view models for the reader UI, including a polymorphic ContentBlock hierarchy (text and AI-trigger blocks) and a ReaderPageViewModel used by reader queries.","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","namespace NexusReader.Application.Queries.Reader","records named *ViewModel and ContentBlock used to carry UI/query data","JsonDerivedType attributes declare polymorphic JSON serialization for ContentBlock"]},"className":"","methods":[],"types":[{"name":"ContentBlock","kind":"model","line":7,"purpose":"Abstract base record for polymorphic content blocks shown on a reader page (polymorphic JSON root).","fields":[{"name":"Id","type":"string","required":true,"line":7,"description":"Identifier for the content block"}]},{"name":"TextSegmentBlock","kind":"model","line":8,"purpose":"Concrete ContentBlock carrying a text segment to render.","fields":[{"name":"Id","type":"string","required":true,"line":8,"description":"Inherited block identifier"},{"name":"Content","type":"string","required":true,"line":8,"description":"Text payload for the segment"}]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"purpose":"Concrete ContentBlock representing an AI-driven action trigger with dialog and selectable options.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Inherited block identifier"},{"name":"Dialogue","type":"string","required":true,"line":9,"description":"Prompt or dialogue text presented to the user"},{"name":"ActionOptions","type":"List<string>","required":true,"line":9,"description":"List of selectable action identifiers or labels"}]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"purpose":"View model for a reader page, aggregating content blocks and chapter/eBook context used by queries and UI.","fields":[{"name":"Blocks","type":"List<ContentBlock>","required":true,"line":11,"description":"Ordered list of polymorphic content blocks to render on the page"},{"name":"CurrentChapterIndex","type":"int","required":true,"line":11,"description":"Zero-based index of the current chapter"},{"name":"TotalChapters","type":"int","required":true,"line":11,"description":"Total number of chapters in the eBook"},{"name":"ChapterTitle","type":"string","required":true,"line":11,"description":"Title of the current chapter"},{"name":"EbookId","type":"Guid","required":false,"line":11,"description":"Optional eBook identifier (defaults to Guid.Empty)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["System.Text.Json.Serialization"],"patterns":["Polymorphic DTO","View Model","Record Types"],"domainConcepts":["ContentBlock","ReaderPage","Ebook","Chapter","AI Action"],"keyDetails":"Uses JsonDerivedType attributes (lines 5-6) to register two discriminators: \"text\" -> TextSegmentBlock and \"trigger\" -> AiActionTriggerBlock for System.Text.Json polymorphic serialization. File contains only immutable record types (no methods).","orchestrationMethods":[],"typedContracts":[{"name":"ContentBlock","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"TextSegmentBlock","kind":"model","line":8,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"fieldCount":5,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ContentBlock","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"TextSegmentBlock","line":8,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"AiActionTriggerBlock","line":9,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"ReaderPageViewModel","line":11,"summary":"view-model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}]}
{"path":"NexusReader.Application/Queries/Reader/ViewModels.cs","purpose":"Defines polymorphic content-block models and a reader page view model used by the application query layer to transport reader UI data (blocks, chapter indexes, ebook id).","classification":{"role":"dto","layer":"application","confidence":0.9,"evidence":["DTO/view-model naming pattern","namespace NexusReader.Application.Queries.Reader","file contains record types and a ReaderPageViewModel used for queries","uses JsonDerivedType attributes for JSON polymorphism"]},"className":"","methods":[],"types":[{"name":"ContentBlock","kind":"model","line":7,"purpose":"Abstract base record for polymorphic content blocks carrying an Id.","fields":[{"name":"Id","type":"string","required":true,"line":7,"description":"Identifier for the content block"}]},{"name":"TextSegmentBlock","kind":"model","line":8,"purpose":"Represents a text segment block containing textual content.","fields":[{"name":"Id","type":"string","required":true,"line":8,"description":"Inherited block identifier"},{"name":"Content","type":"string","required":true,"line":8,"description":"Text content of the segment"}]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"purpose":"Represents an actionable AI-trigger block with dialogue and selectable action options.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Inherited block identifier"},{"name":"Dialogue","type":"string","required":true,"line":9,"description":"Prompt or dialogue shown to the user"},{"name":"ActionOptions","type":"List<string>","required":true,"line":9,"description":"List of action option labels or keys"}]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"purpose":"Aggregates content blocks and chapter/ebook metadata for rendering a reader page.","fields":[{"name":"Blocks","type":"List<ContentBlock>","required":true,"line":11,"description":"Polymorphic list of content blocks to render"},{"name":"CurrentChapterIndex","type":"int","required":true,"line":11,"description":"Zero-based index of the current chapter"},{"name":"TotalChapters","type":"int","required":true,"line":11,"description":"Total number of chapters in the ebook"},{"name":"ChapterTitle","type":"string","required":true,"line":11,"description":"Title of the current chapter"},{"name":"EbookId","type":"Guid","required":false,"line":11,"description":"Optional ebook identifier (has default Guid value)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["ViewModel","Polymorphic DTO","JSON-discriminated union (JsonDerivedType)"],"domainConcepts":["ContentBlock","TextSegment","AiActionTrigger","ReaderPage","Ebook","Chapter"],"keyDetails":"Defines JSON polymorphism via JsonDerivedType attributes mapping discriminator values \"text\" and \"trigger\" to concrete record types; used in the Application.Queries.Reader boundary for transporting reader UI data.","orchestrationMethods":[],"typedContracts":[{"name":"ContentBlock","kind":"model","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"TextSegmentBlock","kind":"model","line":8,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"AiActionTriggerBlock","kind":"model","line":9,"fieldCount":3,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"name":"ReaderPageViewModel","kind":"view-model","line":11,"fieldCount":5,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ContentBlock","line":7,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"TextSegmentBlock","line":8,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"AiActionTriggerBlock","line":9,"summary":"model with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]},{"kind":"typed-contract","label":"ReaderPageViewModel","line":11,"summary":"view-model with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/Reader/ViewModels.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"8c4b78c0ade14be88965dd39245eeb3032b6bda405cfb8bd60cd2cf8eac9c4b7","sourceByteSize":601,"analyzedAt":"2026-05-23T16:20:04.008Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs","purpose":"Defines a CQRS query message used to request the application's initialization status (returns a string).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.System","Type implements IQuery<string> from the messaging abstractions","File placed under Application/Queries/System (query/command pattern)"]},"className":"GetInitializationStatusQuery","methods":[],"types":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"purpose":"Marker/query DTO representing a request to get the initialization status as a string.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging"],"patterns":["CQRS (Query object)"],"domainConcepts":["InitializationStatus"],"keyDetails":"A lightweight record with no payload used as a request message (IQuery<string>) to fetch initialization status; runtime behavior implemented by a separate query handler elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"fieldCount":0,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQuery","line":5,"summary":"query with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}]}
{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs","purpose":"Defines a CQRS query message used to request the application's initialization status (string) from the Application layer.","classification":{"role":"handler","layer":"application","confidence":0.8,"evidence":["Query naming pattern","Namespace: NexusReader.Application.Queries.System","Record implements IQuery<string>","File name and path indicate Application/Queries"]},"className":"GetInitializationStatusQuery","methods":[],"types":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"purpose":"Represents a request message for retrieving initialization status; a marker query returning a string result.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging (IQuery<string>)"],"patterns":["CQRS","Query Object"],"domainConcepts":["InitializationStatus"],"keyDetails":"A simple marker record implementing IQuery<string>; no behavior, fields, or methods are defined in this file. Used as a request DTO in the application's query/handler pipeline.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQuery","kind":"query","line":5,"fieldCount":0,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQuery","line":5,"summary":"query with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"0f81a28b02220ad14c6845743050fa18a3c211592dedaa057507a02c25535a08","sourceByteSize":172,"analyzedAt":"2026-05-23T16:17:51.016Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs","purpose":"Query handler that answers whether the Nexus E-Reader application is initialized; returns a constant success message.","classification":{"role":"handler","layer":"application","confidence":0.85,"evidence":["Namespace: NexusReader.Application.Queries.System","Class implements IQueryHandler<GetInitializationStatusQuery, string>","Single Handle method returning a fixed initialization status message"]},"className":"GetInitializationStatusQueryHandler","methods":[{"name":"Handle","line":8,"endLine":11,"signature":"(request: GetInitializationStatusQuery, cancellationToken: CancellationToken) -> Task<Result<string>>","purpose":"Handles the GetInitializationStatusQuery by returning a constant success message indicating the application is initialized.","calls":[],"actions":[{"id":"return_10","kind":"return","label":"Returns constant initialization message","line":10,"detail":"Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"))","visibility":"detail-only","confidence":0.7},{"id":"handle_return_10_0","kind":"return","label":"Returns result","line":10,"detail":"return Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"));","visibility":"detail-only","confidence":0.7},{"id":"constant-response_10","kind":"mapping","label":"Static successful result","line":10,"detail":"Always returns Result.Ok with a fixed string; no branching or external calls.","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"purpose":"Query handler type implementing IQueryHandler to provide initialization status.","fields":[{"name":"class-modifiers","type":"internal sealed","required":true,"line":6,"description":"Class is internal and sealed; no instance state or constructor logic present."},{"name":"implemented-interface","type":"IQueryHandler<GetInitializationStatusQuery, string>","required":true,"line":6,"description":"Indicates this class handles the GetInitializationStatusQuery via the application's messaging abstraction."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging","FluentResults"],"patterns":["Query Handler","Mediator"],"domainConcepts":["InitializationStatus","Application health / readiness"],"keyDetails":"Single-responsibility handler that always returns a fixed ready message; no external calls, no branching, suitable as a simple health/readiness query endpoint.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"fieldCount":2,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQueryHandler","line":6,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}]}
{"path":"NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs","purpose":"A simple application query handler that responds to a GetInitializationStatusQuery with a constant success message indicating the application is initialized.","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["namespace NexusReader.Application.Queries.System","class implements IQueryHandler<GetInitializationStatusQuery, string>","internal sealed class named GetInitializationStatusQueryHandler"]},"className":"GetInitializationStatusQueryHandler","methods":[{"name":"Handle","line":8,"endLine":11,"signature":"(request: GetInitializationStatusQuery, cancellationToken: CancellationToken) -> Task<Result<string>>","purpose":"Handles the GetInitializationStatusQuery by returning a successful Result<string> containing a static initialization message.","calls":[],"actions":[{"id":"implements-interface_6","kind":"mapping","label":"Implements IQueryHandler.Handle","line":6,"detail":"This method fulfills the IQueryHandler<GetInitializationStatusQuery, string> contract.","visibility":"detail-only","confidence":0.7},{"id":"no-branches_8","kind":"mapping","label":"No branching or error paths","line":8,"detail":"Method always returns a successful Result; no validation, loops, retries, or external calls.","visibility":"detail-only","confidence":0.7},{"id":"constant-return_10","kind":"mapping","label":"Returns constant initialization message","line":10,"detail":"Returns Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"))","visibility":"detail-only","confidence":0.7},{"id":"handle_return_10_0","kind":"return","label":"Returns result","line":10,"detail":"return Task.FromResult(Result.Ok(\"Nexus E-Reader Application is fully initialized and operational.\"));","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"purpose":"Query handler that provides a ready/initialized status string for the application.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.Abstractions.Messaging","NexusReader.Application.Queries.System.GetInitializationStatusQuery","FluentResults"],"patterns":["CQRS Query Handler"],"domainConcepts":["InitializationStatus","Application startup"],"keyDetails":"Trivial handler returning a static success message; no external IO, persistence, branching, or error handling. Likely used by health/initialization checks or UI status queries.","orchestrationMethods":[],"typedContracts":[{"name":"GetInitializationStatusQueryHandler","kind":"model","line":6,"fieldCount":0,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetInitializationStatusQueryHandler","line":6,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/System/GetInitializationStatusQueryHandler.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"d795f7127814e08aa510863d8558dd6bc6c744f16369f37261c42f7e79b3e7d6","sourceByteSize":492,"analyzedAt":"2026-05-23T16:17:53.997Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Application/Queries/User/GetUserProfileQuery.cs","purpose":"Defines a MediatR query message representing a request to retrieve a user's profile (returns a FluentResults Result wrapping a UserProfileDto).","classification":{"role":"handler","layer":"application","confidence":0.9,"evidence":["Command pattern","Line 7: record implements MediatR IRequest<Result<UserProfileDto>>","Namespace: NexusReader.Application.Queries.User indicates an application-layer query object"]},"className":"GetUserProfileQuery","methods":[],"types":[{"name":"GetUserProfileQuery","kind":"query","line":7,"purpose":"CQRS query message carrying the user identifier to request a UserProfileDto wrapped in a FluentResults Result.","fields":[{"name":"UserId","type":"string","required":true,"line":7,"description":"Identifier of the user whose profile is being requested"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.DTOs.User (UserProfileDto)","MediatR","FluentResults"],"patterns":["CQRS Query","MediatR Request/Response Message"],"domainConcepts":["User","UserProfile"],"keyDetails":"Single-line record type (line 7) implementing IRequest<Result<UserProfileDto>>; no runtime logic here — a simple message/DTO used by a handler elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"GetUserProfileQuery","kind":"query","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetUserProfileQuery","line":7,"summary":"query with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}]}
{"path":"NexusReader.Application/Queries/User/GetUserProfileQuery.cs","purpose":"Defines a MediatR query message used to request a user's profile (UserProfileDto) by user id.","classification":{"role":"dto","layer":"application","confidence":0.8,"evidence":["Command pattern","Namespace NexusReader.Application.Queries.User indicates application-layer query message","Implements MediatR IRequest<Result<UserProfileDto>> making it a request/DTO for CQRS-style handlers"]},"className":"GetUserProfileQuery","methods":[],"types":[{"name":"GetUserProfileQuery","kind":"query","line":7,"purpose":"Represents a request message to fetch a user's profile given a UserId.","fields":[{"name":"UserId","type":"string","required":true,"line":7,"description":"Identifier of the user whose profile is requested"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Application.DTOs.User (UserProfileDto)","MediatR","FluentResults"],"patterns":["CQRS","MediatR Request/Message"],"domainConcepts":["User","UserProfile"],"keyDetails":"Single-line record defining a MediatR IRequest<Result<UserProfileDto>>; no runtime logic in this file.","orchestrationMethods":[],"typedContracts":[{"name":"GetUserProfileQuery","kind":"query","line":7,"fieldCount":1,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"GetUserProfileQuery","line":7,"summary":"query with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Queries/User/GetUserProfileQuery.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"12d6317d9bef51ec8bbe14347dfc60aa28f90fe9bdcc2505da67d048d54cd8d7","sourceByteSize":219,"analyzedAt":"2026-05-23T16:18:03.306Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Application/Security/Authorization/ProUserRequirement.cs","purpose":"Defines a marker authorization requirement representing users with an active Pro subscription or sufficient AI tokens for policy-based authorization checks.","classification":{"role":"unknown","layer":"application","confidence":0.65,"evidence":["Namespace NexusReader.Application.Security.Authorization indicates application-layer auth policy code","Implements Microsoft.AspNetCore.Authorization.IAuthorizationRequirement which is used by ASP.NET Core authorization handlers/policies"]},"className":"ProUserRequirement","methods":[],"types":[{"name":"ProUserRequirement","kind":"model","line":8,"purpose":"Marker requirement type used in authorization policies to represent Pro users or users with sufficient AI tokens.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Microsoft.AspNetCore.Authorization"],"patterns":["Authorization Requirement","Policy-based Authorization"],"domainConcepts":["Pro subscription","AI tokens","Authorization policy"],"keyDetails":"Empty marker class implementing IAuthorizationRequirement (lines 810); actual authorization logic is expected in corresponding AuthorizationHandler(s) elsewhere.","orchestrationMethods":[],"typedContracts":[{"name":"ProUserRequirement","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ProUserRequirement","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}]}
{"path":"NexusReader.Application/Security/Authorization/ProUserRequirement.cs","purpose":"Defines an authorization requirement used to gate features to users with an active \"Pro\" subscription or sufficient AI tokens.","classification":{"role":"middleware","layer":"application","confidence":0.8,"evidence":["Implements Microsoft.AspNetCore.Authorization.IAuthorizationRequirement","Located under Security/Authorization in the Application project","Class is a marker requirement used in authorization policies"]},"className":"ProUserRequirement","methods":[],"types":[{"name":"ProUserRequirement","kind":"model","line":8,"purpose":"Marker requirement indicating the user must have an active Pro subscription or sufficient AI tokens for authorization policies.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Authorization Policy"],"domainConcepts":["Pro subscription","AI tokens","Authorization requirement"],"keyDetails":"Simple marker class implementing IAuthorizationRequirement (lines 8-10). No runtime logic, fields, or methods; intended to be used with an authorization handler elsewhere that enforces the Pro/token rules.","orchestrationMethods":[],"typedContracts":[{"name":"ProUserRequirement","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ProUserRequirement","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Security/Authorization/ProUserRequirement.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ff3407025e78eff2645f2b2f570c1ad9f337517b8f74ef7d16bdfd62afd38319","sourceByteSize":288,"analyzedAt":"2026-05-23T16:19:59.421Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs","purpose":"EF Core migration that adds a QuizResults table with columns, primary key, foreign key to AspNetUsers, and an index; and provides a Down method to drop the table.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Contains a Migration-derived class creating/dropping a database table","Namespace NexusReader.Data.Migrations and usage of MigrationBuilder.CreateTable/CreateIndex/DropTable"]},"className":"AddQuizResults","methods":[{"name":"Up","line":12,"endLine":40,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: creates the QuizResults table with columns, primary key, foreign key to AspNetUsers (cascade) and an index on UserId.","calls":[],"actions":[{"id":"create-table_14","kind":"mapping","label":"Creates QuizResults table","line":14,"detail":"migrationBuilder.CreateTable(name: \"QuizResults\", columns: ...) defines columns Id, UserId, Topic, Score, TotalQuestions, CompletedDate","visibility":"detail-only","confidence":0.7},{"id":"column_18","kind":"mapping","label":"Id column","line":18,"detail":"Id: Guid, type uuid, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_19","kind":"mapping","label":"UserId column","line":19,"detail":"UserId: string, type text, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_20","kind":"mapping","label":"Topic column","line":20,"detail":"Topic: string, type text, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_21","kind":"mapping","label":"Score column","line":21,"detail":"Score: int, type integer, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_22","kind":"mapping","label":"TotalQuestions column","line":22,"detail":"TotalQuestions: int, type integer, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"column_23","kind":"mapping","label":"CompletedDate column","line":23,"detail":"CompletedDate: DateTime, timestamp without time zone, nullable: false","visibility":"detail-only","confidence":0.7},{"id":"primary-key_27","kind":"mapping","label":"Primary key on Id","line":27,"detail":"table.PrimaryKey(\"PK_QuizResults\", x => x.Id)","visibility":"detail-only","confidence":0.7},{"id":"foreign-key_28","kind":"mapping","label":"FK to AspNetUsers on UserId (cascade)","line":28,"detail":"Foreign key references AspNetUsers(Id) with ReferentialAction.Cascade","visibility":"detail-only","confidence":0.7},{"id":"create-index_36","kind":"mapping","label":"Index on UserId","line":36,"detail":"migrationBuilder.CreateIndex(name: \"IX_QuizResults_UserId\", table: \"QuizResults\", column: \"UserId\")","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":43,"endLine":47,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration by dropping the QuizResults table.","calls":[],"actions":[{"id":"drop-table_45","kind":"mapping","label":"Drops QuizResults table","line":45,"detail":"migrationBuilder.DropTable(name: \"QuizResults\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"QuizResults (table)","kind":"entity","line":14,"purpose":"Represents persisted quiz result records for users (table created by the migration).","fields":[{"name":"Id","type":"Guid","required":true,"line":18,"description":"Primary key identifier (uuid)"},{"name":"UserId","type":"string","required":true,"line":19,"description":"FK to AspNetUsers.Id (text), non-null"},{"name":"Topic","type":"string","required":true,"line":20,"description":"Quiz topic"},{"name":"Score","type":"int","required":true,"line":21,"description":"User score for the quiz"},{"name":"TotalQuestions","type":"int","required":true,"line":22,"description":"Total number of questions in the quiz"},{"name":"CompletedDate","type":"DateTime","required":true,"line":23,"description":"Timestamp when the quiz was completed"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["QuizResult","User (AspNetUsers)"],"keyDetails":"Adds QuizResults table with non-nullable columns, primary key on Id, foreign key to AspNetUsers.Id with cascade delete, and an index on UserId; Down drops the table.","orchestrationMethods":[],"typedContracts":[{"name":"QuizResults (table)","kind":"entity","line":14,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizResults (table)","line":14,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}]}
{"path":"NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs","purpose":"EF Core migration that adds a new QuizResults table (with columns, PK, FK to AspNetUsers, and an index) and provides rollback to drop it.","classification":{"role":"database-config","layer":"data","confidence":0.78,"evidence":["class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","calls migrationBuilder.CreateTable and DropTable","namespace NexusReader.Data.Migrations"]},"className":"AddQuizResults","methods":[{"name":"Up","line":12,"endLine":40,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Creates the QuizResults table with columns, primary key, foreign key to AspNetUsers (cascade) and an index on UserId.","calls":[],"actions":[{"id":"create-table_14","kind":"mapping","label":"Creates QuizResults table","line":14,"detail":"migrationBuilder.CreateTable(name: \"QuizResults\", columns: ..., constraints: ...)","visibility":"detail-only","confidence":0.7},{"id":"define-columns_16","kind":"mapping","label":"Defines columns for QuizResults","line":16,"detail":"Id (Guid, not null), UserId (string, not null), Topic (string, not null), Score (int, not null), TotalQuestions (int, not null), CompletedDate (DateTime, not null)","visibility":"detail-only","confidence":0.7},{"id":"primary-key_27","kind":"mapping","label":"Sets PK on Id","line":27,"detail":"table.PrimaryKey(\"PK_QuizResults\", x => x.Id)","visibility":"detail-only","confidence":0.7},{"id":"foreign-key_28","kind":"mapping","label":"Adds FK to AspNetUsers.UserId with cascade delete","line":28,"detail":"FK_QuizResults_AspNetUsers_UserId -> principalTable: \"AspNetUsers\", principalColumn: \"Id\", onDelete: ReferentialAction.Cascade","visibility":"detail-only","confidence":0.7},{"id":"create-index_36","kind":"mapping","label":"Creates index on UserId","line":36,"detail":"migrationBuilder.CreateIndex(name: \"IX_QuizResults_UserId\", table: \"QuizResults\", column: \"UserId\")","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":43,"endLine":47,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Drops the QuizResults table to rollback the migration.","calls":[],"actions":[{"id":"drop-table_45","kind":"mapping","label":"Drops QuizResults table","line":45,"detail":"migrationBuilder.DropTable(name: \"QuizResults\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddQuizResults","kind":"model","line":9,"purpose":"EF Core Migration class that applies schema changes to add QuizResults and rollback.","fields":[]},{"name":"QuizResults (table schema)","kind":"entity","line":14,"purpose":"Represents the database table schema created by this migration.","fields":[{"name":"Id","type":"Guid","required":true,"line":18,"description":"Primary key column (uuid)"},{"name":"UserId","type":"string","required":true,"line":19,"description":"FK to AspNetUsers.Id (text), cascade on delete"},{"name":"Topic","type":"string","required":true,"line":20,"description":"Topic of the quiz (text)"},{"name":"Score","type":"int","required":true,"line":21,"description":"Score achieved (integer)"},{"name":"TotalQuestions","type":"int","required":true,"line":22,"description":"Total number of questions in the quiz (integer)"},{"name":"CompletedDate","type":"DateTime","required":true,"line":23,"description":"When the quiz was completed (timestamp without time zone)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["QuizResult","User (AspNetUsers)"],"keyDetails":"Adds QuizResults table with PK Id, FK UserId -> AspNetUsers.Id (cascade), and an index on UserId to support lookups by user.","orchestrationMethods":[],"typedContracts":[{"name":"AddQuizResults","kind":"model","line":9,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]},{"name":"QuizResults (table schema)","kind":"entity","line":14,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddQuizResults","line":9,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]},{"kind":"typed-contract","label":"QuizResults (table schema)","line":14,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260429080302_AddQuizResults.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"6ed80ba4c4ceea0c28d755fdacbf0d42888cbd551dc4d12f4e338b7833d70537","sourceByteSize":1877,"analyzedAt":"2026-05-23T16:23:59.210Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs","purpose":"EF Core migration that modifies the Ebooks table to add a nullable LastChapter column and a non-null Progress column with default 0.0; provides Up and Down schema change paths.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Defines Up and Down methods that add/drop columns on the Ebooks table","Located under NexusReader.Data.Migrations namespace"]},"className":"AddEbookProgressAndChapter","methods":[{"name":"Up","line":11,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies schema changes: adds LastChapter (string, nullable, maxLength 255) and Progress (double, non-null, default 0.0) columns to the Ebooks table.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"Add LastChapter column","line":13,"detail":"migrationBuilder.AddColumn<string>(name: \"LastChapter\", table: \"Ebooks\", type: \"character varying(255)\", maxLength: 255, nullable: true)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_20","kind":"mapping","label":"Add Progress column","line":20,"detail":"migrationBuilder.AddColumn<double>(name: \"Progress\", table: \"Ebooks\", type: \"double precision\", nullable: false, defaultValue: 0.0)","visibility":"detail-only","confidence":0.7},{"id":"return_26","kind":"return","label":"Complete migration Up","line":26,"detail":"Method exits after applying AddColumn calls","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":29,"endLine":38,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the Up migration: drops LastChapter and Progress columns from the Ebooks table.","calls":[],"actions":[{"id":"schema-change_31","kind":"mapping","label":"Drop LastChapter column","line":31,"detail":"migrationBuilder.DropColumn(name: \"LastChapter\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"schema-change_35","kind":"mapping","label":"Drop Progress column","line":35,"detail":"migrationBuilder.DropColumn(name: \"Progress\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"return_38","kind":"return","label":"Complete migration Down","line":38,"detail":"Method exits after DropColumn calls","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookProgressAndChapter","kind":"model","line":8,"purpose":"Represents an EF Core migration that alters the Ebooks table to track last-read chapter and reading progress.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Database Migration"],"domainConcepts":["Ebook","Chapter","Progress"],"keyDetails":"Adds LastChapter (varchar(255), nullable) and Progress (double, not nullable, default 0.0) to Ebooks; provides Down to remove them.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookProgressAndChapter","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookProgressAndChapter","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs"]}]}
{"path":"NexusReader.Data/Migrations/20260510161155_AddEbookProgressAndChapter.cs","purpose":"EF Core migration that adds two columns (LastChapter, Progress) to the Ebooks table and provides a Down method to remove them.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Namespace NexusReader.Data.Migrations","Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Methods Up and Down perform schema changes (AddColumn / DropColumn) on table 'Ebooks'"]},"className":"AddEbookProgressAndChapter","methods":[{"name":"Up","line":11,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies schema changes: adds LastChapter (string) and Progress (double) columns to the Ebooks table.","calls":[],"actions":[{"id":"add-column_13","kind":"mapping","label":"Add LastChapter column","line":13,"detail":"Adds column 'LastChapter' to table 'Ebooks' with SQL type 'character varying(255)', maxLength 255, nullable true.","visibility":"detail-only","confidence":0.7},{"id":"add-column_20","kind":"mapping","label":"Add Progress column","line":20,"detail":"Adds column 'Progress' to table 'Ebooks' with SQL type 'double precision', non-nullable, defaultValue 0.0.","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":29,"endLine":38,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts schema changes applied in Up by dropping LastChapter and Progress columns from the Ebooks table.","calls":[],"actions":[{"id":"drop-column_31","kind":"mapping","label":"Drop LastChapter column","line":31,"detail":"Drops column 'LastChapter' from table 'Ebooks'.","visibility":"detail-only","confidence":0.7},{"id":"drop-column_35","kind":"mapping","label":"Drop Progress column","line":35,"detail":"Drops column 'Progress' from table 'Ebooks'.","visibility":"detail-only","confidence":0.7}]}],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook","Progress","Chapter"],"keyDetails":"Adds a nullable string LastChapter (max 255) and a non-nullable double Progress with default 0.0 to the Ebooks table; Down removes both columns.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"87e3c968598efd778006a95e79fe5852d23be4b2a0bae4469604d5dc050349b9","sourceByteSize":1169,"analyzedAt":"2026-05-23T16:24:38.215Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs","purpose":"EF Core migration that adds a new non-nullable integer column LastChapterIndex (default 0) to the Ebooks table and provides the reverse operation.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class derives from Microsoft.EntityFrameworkCore.Migrations.Migration","Implements Up and Down methods that modify the database schema (AddColumn / DropColumn on Ebooks)"]},"className":"AddEbookLastChapterIndex","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply the migration: add LastChapterIndex integer column to the Ebooks table with default 0 and non-nullable constraint.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"AddColumn LastChapterIndex to Ebooks","line":13,"detail":"migrationBuilder.AddColumn<int>(name: \"LastChapterIndex\", table: \"Ebooks\", type: \"integer\", nullable: false, defaultValue: 0)","visibility":"detail-only","confidence":0.7},{"id":"persistence-migration_13","kind":"mapping","label":"Writes schema change to migration history when applied","line":13,"detail":"Adds a non-null integer column with default value to existing table","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the migration: remove the LastChapterIndex column from the Ebooks table.","calls":[],"actions":[{"id":"schema-change_24","kind":"mapping","label":"DropColumn LastChapterIndex from Ebooks","line":24,"detail":"migrationBuilder.DropColumn(name: \"LastChapterIndex\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7},{"id":"persistence-migration_24","kind":"mapping","label":"Removes schema change from database","line":24,"detail":"Drops the column added in Up","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates the schema change to add LastChapterIndex to Ebooks.","fields":[{"name":"Up(migrationBuilder)","type":"method","required":true,"line":11,"description":"Applies schema change (adds column)"},{"name":"Down(migrationBuilder)","type":"method","required":true,"line":22,"description":"Reverts schema change (drops column)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Migration"],"domainConcepts":["Ebook","Chapter index"],"keyDetails":"Adds a non-nullable integer column LastChapterIndex (default 0) to the Ebooks table; Down removes it. File is a standard EF Core migration with no branching, loops, retries, or external project method calls.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"fieldCount":2,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookLastChapterIndex","line":8,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}]}
{"path":"NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs","purpose":"An Entity Framework Core migration that adds an integer LastChapterIndex column (default 0) to the Ebooks table, and can remove it on rollback.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["Namespace NexusReader.Data.Migrations","Class derives from Migration and overrides Up/Down","Uses migrationBuilder.AddColumn / DropColumn to modify database schema"]},"className":"AddEbookLastChapterIndex","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: adds LastChapterIndex (integer, non-nullable, default 0) to the Ebooks table.","calls":[],"actions":[{"id":"persistence-migration_13","kind":"mapping","label":"Add column LastChapterIndex to Ebooks","line":13,"detail":"migrationBuilder.AddColumn<int>(name: \"LastChapterIndex\", table: \"Ebooks\", type: \"integer\", nullable: false, defaultValue: 0)","visibility":"detail-only","confidence":0.7},{"id":"schema-change_13","kind":"mapping","label":"Creates non-nullable integer column with default","line":13,"detail":"new column ensures existing rows receive defaultValue 0","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":27,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration: drops the LastChapterIndex column from the Ebooks table.","calls":[],"actions":[{"id":"persistence-migration_24","kind":"mapping","label":"Drop column LastChapterIndex from Ebooks","line":24,"detail":"migrationBuilder.DropColumn(name: \"LastChapterIndex\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"purpose":"EF Core migration class representing the schema change that adds/removes LastChapterIndex on Ebooks.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Migration"],"domainConcepts":["Ebook"],"keyDetails":"Adds a non-nullable integer LastChapterIndex column to the Ebooks table with default 0; Down removes it. Located in Data.Migrations namespace as an EF Core Migration.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookLastChapterIndex","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookLastChapterIndex","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260510171941_AddEbookLastChapterIndex.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"6f9ce6807f8e21c8409452618b1cf3ad50c17a420b350dc66744ceaca156f19c","sourceByteSize":813,"analyzedAt":"2026-05-23T16:24:57.321Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/NexusReader.Data.csproj","purpose":"Defines the Data project build configuration and NuGet/Project dependencies for the NexusReader data layer (Entity Framework Core persistence, DB providers, and vector support).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["References EF Core and provider packages (Microsoft.EntityFrameworkCore, Sqlite, Npgsql) at lines 11-13","Includes Pgvector.EntityFrameworkCore for vector storage at line 21","ProjectReference to NexusReader.Domain indicates this is the persistence/data implementation at line 25"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["Package: Microsoft.AspNetCore.Identity.EntityFrameworkCore (line 10)","Package: Microsoft.EntityFrameworkCore (line 11)","Package: Microsoft.EntityFrameworkCore.Sqlite (line 12)","Package: Npgsql.EntityFrameworkCore.PostgreSQL (line 13)","Package: Microsoft.Extensions.Configuration.FileExtensions (line 14)","Package: Microsoft.Extensions.Configuration.Json (line 15)","Package: Microsoft.Extensions.Configuration.EnvironmentVariables (line 16)","Package: Microsoft.EntityFrameworkCore.Design (line 17)","Package: Pgvector.EntityFrameworkCore (line 21)","Project: ../NexusReader.Domain/NexusReader.Domain.csproj (line 25)"],"patterns":["EF Core (ORM)","Repository/Repository-like data layer","Provider-based DB configuration (SQLite, PostgreSQL)"],"domainConcepts":["Persistence","Database providers (SQLite, PostgreSQL)","Vector embeddings storage (pgvector)","Configuration (JSON/env file support)"],"keyDetails":"TargetFramework net10.0, Nullable enabled, ImplicitUsings enabled. EF Core design package included with PrivateAssets=all (dev-time tooling). Supports SQLite and Postgres providers and Pgvector for vector data; references Domain project for domain types.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Data/NexusReader.Data.csproj","purpose":"Defines the .NET project configuration for the NexusReader.Data assembly, declaring target framework, NuGet package dependencies (EF Core, providers, configuration packages, Pgvector) and a project reference to the domain project.","classification":{"role":"config","layer":"data","confidence":0.9,"evidence":["Contains <TargetFramework>net10.0</TargetFramework> (line 4)","Lists EF Core and database provider PackageReference entries (lines 10-13,21)","References NexusReader.Domain project via ProjectReference (line 25)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["[object Object]","[object Object]","[object Object]","[object Object]","[object Object]","[object Object]","[object Object]","[object Object]","[object Object]","[object Object]"],"patterns":["Entity Framework Core","Repository (implied)","Provider-based DB configuration"],"domainConcepts":["Persistence / Data access","Entity Framework Core","Database providers (SQLite, PostgreSQL/Npgsql)","Vector embeddings via Pgvector"],"keyDetails":"TargetFramework net10.0 (line 4); implicit usings enabled and nullable enabled (lines 5-6); multiple EF Core providers and config packages declared; design package marked PrivateAssets; project references NexusReader.Domain for domain models (line 25).","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"19a3cf22c79a13d2a14a53bf383220b44662606470b20ad9dc852b54d58e94b2","sourceByteSize":1223,"analyzedAt":"2026-05-23T16:26:25.459Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs","purpose":"EF Core migration that adds a boolean IsReadyForReading column to the Ebooks table (and removes it on rollback).","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Namespace: NexusReader.Data.Persistence.Migrations","Class derives from Microsoft.EntityFrameworkCore.Migrations.Migration","Calls migrationBuilder.AddColumn / DropColumn to change DB schema"]},"className":"AddEbookReadyFlag","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration by adding the IsReadyForReading boolean column (default false) to the Ebooks table.","calls":[{"targetFile":"unknown","targetMethod":"migrationBuilder.AddColumn","callLine":13,"paramSummary":"name: \"IsReadyForReading\", table: \"Ebooks\", type: \"boolean\", nullable: false, defaultValue: false"}],"actions":[{"id":"migration-step_11","kind":"mapping","label":"Up migration","line":11,"detail":"Defines the forward/upgrade migration step","visibility":"detail-only","confidence":0.7},{"id":"schema-change_13","kind":"mapping","label":"Add column","line":13,"detail":"migrationBuilder.AddColumn<bool>(name: \"IsReadyForReading\", table: \"Ebooks\", type: \"boolean\", nullable: false, defaultValue: false)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration by removing the IsReadyForReading column from the Ebooks table.","calls":[{"targetFile":"unknown","targetMethod":"migrationBuilder.DropColumn","callLine":24,"paramSummary":"name: \"IsReadyForReading\", table: \"Ebooks\""}],"actions":[{"id":"migration-step_22","kind":"mapping","label":"Down migration","line":22,"detail":"Defines the rollback/downgrade migration step","visibility":"detail-only","confidence":0.7},{"id":"schema-change_24","kind":"mapping","label":"Drop column","line":24,"detail":"migrationBuilder.DropColumn(name: \"IsReadyForReading\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates schema changes to add/remove the IsReadyForReading column for Ebooks.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook"],"keyDetails":"Adds a non-nullable boolean column IsReadyForReading to the Ebooks table with default false; Down removes that column.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookReadyFlag","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}]}
{"path":"NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs","purpose":"Entity Framework Core migration that adds a boolean 'IsReadyForReading' flag to the 'Ebooks' table and provides a rollback to remove it.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits from Migration (line 8)","Calls migrationBuilder.AddColumn / DropColumn to alter Ebooks table (lines 13-18, 24-26)"]},"className":"AddEbookReadyFlag","methods":[{"name":"Up","line":11,"endLine":19,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: adds a non-nullable boolean column 'IsReadyForReading' with default false to the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"AddColumn IsReadyForReading","line":13,"detail":"migrationBuilder.AddColumn<bool>(name: \"IsReadyForReading\", table: \"Ebooks\", type: \"boolean\", nullable: false, defaultValue: false)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":22,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Rolls back the migration: removes the 'IsReadyForReading' column from the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_24","kind":"mapping","label":"DropColumn IsReadyForReading","line":24,"detail":"migrationBuilder.DropColumn(name: \"IsReadyForReading\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"purpose":"EF Core migration class that encapsulates schema changes to add/remove the IsReadyForReading flag on Ebooks.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook"],"keyDetails":"Adds non-nullable boolean column IsReadyForReading to Ebooks with default false; Down removes the column.","orchestrationMethods":[],"typedContracts":[{"name":"AddEbookReadyFlag","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddEbookReadyFlag","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513181743_AddEbookReadyFlag.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"7009845a9b63931dbf3dca2aea9f729a93c17c74a40e40ffd62e7e9517c35fe7","sourceByteSize":825,"analyzedAt":"2026-05-23T16:25:41.974Z","technology":"dotnet"}}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"path":"NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs","purpose":"EF Core code-first migration that changes the KnowledgeUnits.EbookId column to be nullable (and provides a Down method to revert the change).","classification":{"role":"database-config","layer":"data","confidence":0.88,"evidence":["class inherits from Microsoft.EntityFrameworkCore.Migrations.Migration","namespace NexusReader.Data.Persistence.Migrations and methods Up/Down altering DB column"]},"className":"MakeKnowledgeUnitEbookIdNullable","methods":[{"name":"Up","line":12,"endLine":21,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the migration: alters the KnowledgeUnits.EbookId column to be nullable (type uuid).","calls":[],"actions":[{"id":"override_12","kind":"mapping","label":"EF Migration override","line":12,"detail":"protected override void Up(MigrationBuilder migrationBuilder) - runtime entry for applying migration","visibility":"detail-only","confidence":0.7},{"id":"schema-change_14","kind":"mapping","label":"AlterColumn to make EbookId nullable","line":14,"detail":"migrationBuilder.AlterColumn<Guid>(name: \"EbookId\", table: \"KnowledgeUnits\", type: \"uuid\", nullable: true, oldClrType: typeof(Guid), oldType: \"uuid\");","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":24,"endLine":35,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the migration: alters the KnowledgeUnits.EbookId column to be non-nullable and sets a default zero GUID.","calls":[],"actions":[{"id":"override_24","kind":"mapping","label":"EF Migration override","line":24,"detail":"protected override void Down(MigrationBuilder migrationBuilder) - runtime entry for reverting migration","visibility":"detail-only","confidence":0.7},{"id":"schema-change_26","kind":"mapping","label":"AlterColumn to make EbookId non-nullable with default","line":26,"detail":"migrationBuilder.AlterColumn<Guid>(name: \"EbookId\", table: \"KnowledgeUnits\", type: \"uuid\", nullable: false, defaultValue: new Guid(\"00000000-0000-0000-0000-000000000000\"), oldClrType: typeof(Guid), oldType: \"uuid\", oldNullable: true);","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"purpose":"EF Core migration class that toggles nullability of KnowledgeUnits.EbookId.","fields":[{"name":"Up","type":"method","required":true,"line":12,"description":"Applies the migration to alter the column to nullable."},{"name":"Down","type":"method","required":true,"line":24,"description":"Reverts the migration, making the column non-nullable and adding a default GUID."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Schema Migration"],"domainConcepts":["KnowledgeUnit","Ebook","EbookId"],"keyDetails":"The Up method makes KnowledgeUnits.EbookId nullable (uuid); the Down method restores non-nullable with a zero GUID default. File is strictly a data-layer DB migration with no external calls beyond EF MigrationBuilder.","orchestrationMethods":[],"typedContracts":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"MakeKnowledgeUnitEbookIdNullable","line":9,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}]}
{"path":"NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs","purpose":"EF Core migration that makes the KnowledgeUnits.EbookId column nullable in the database schema and provides a reversible Down migration.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Contains Up and Down methods that call AlterColumn on table 'KnowledgeUnits'"]},"className":"MakeKnowledgeUnitEbookIdNullable","methods":[{"name":"Up","line":12,"endLine":21,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Applies the schema change to alter KnowledgeUnits.EbookId to be nullable.","calls":[],"actions":[{"id":"alter-column_14","kind":"mapping","label":"Make EbookId nullable on KnowledgeUnits","line":14,"detail":"migrationBuilder.AlterColumn<Guid>(name: 'EbookId', table: 'KnowledgeUnits', type: 'uuid', nullable: true, oldClrType: typeof(Guid), oldType: 'uuid')","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":24,"endLine":35,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Reverts the schema change by making KnowledgeUnits.EbookId non-nullable and setting a default Guid value.","calls":[],"actions":[{"id":"alter-column_26","kind":"mapping","label":"Revert EbookId to non-nullable with default","line":26,"detail":"migrationBuilder.AlterColumn<Guid>(name: 'EbookId', table: 'KnowledgeUnits', type: 'uuid', nullable: false, defaultValue: new Guid('00000000-0000-0000-0000-000000000000'), oldClrType: typeof(Guid), oldType: 'uuid', oldNullable: true)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"purpose":"Represents an EF Core migration that changes the EbookId nullability on KnowledgeUnits.","fields":[{"name":"Up","type":"method","required":true,"line":12,"description":"Applies the migration schema change."},{"name":"Down","type":"method","required":true,"line":24,"description":"Reverts the migration schema change."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration","Database Migration"],"domainConcepts":["KnowledgeUnit","Ebook"],"keyDetails":"Up makes KnowledgeUnits.EbookId nullable (uuid); Down makes it non-nullable and assigns an all-zero Guid default.","orchestrationMethods":[],"typedContracts":[{"name":"MakeKnowledgeUnitEbookIdNullable","kind":"model","line":9,"fieldCount":2,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"MakeKnowledgeUnitEbookIdNullable","line":9,"summary":"model with 2 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260513185108_MakeKnowledgeUnitEbookIdNullable.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"afc0075356d60a646b90a74ab84d0fbe9d63b384a28264893f6dcedced65e18f","sourceByteSize":1154,"analyzedAt":"2026-05-23T16:26:01.452Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs","purpose":"EF Core migration that adds a nullable text Description column to the Ebooks table and provides a down migration to remove it.","classification":{"role":"database-config","layer":"data","confidence":0.8,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Namespace NexusReader.Data.Persistence.Migrations","Defines Up and Down methods that alter the database schema (AddColumn/DropColumn)"]},"className":"AddDescriptionToEbook","methods":[{"name":"Up","line":11,"endLine":18,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply the migration by adding a nullable text 'Description' column to the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_13","kind":"mapping","label":"AddColumn Description on Ebooks","line":13,"detail":"migrationBuilder.AddColumn<string>(name: \"Description\", table: \"Ebooks\", type: \"text\", nullable: true)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":21,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert the migration by dropping the 'Description' column from the 'Ebooks' table.","calls":[],"actions":[{"id":"schema-change_23","kind":"mapping","label":"DropColumn Description from Ebooks","line":23,"detail":"migrationBuilder.DropColumn(name: \"Description\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"purpose":"Represents an EF Core migration that adds/removes the Description column on the Ebooks table.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["EF Core Migration"],"domainConcepts":["Ebook","Ebooks table","Description column"],"keyDetails":"This migration adds a nullable text column 'Description' to the 'Ebooks' table (Up) and removes it on rollback (Down).","orchestrationMethods":[],"typedContracts":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"fieldCount":0,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddDescriptionToEbook","line":8,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}]}
{"path":"NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs","purpose":"EF Core migration that adds a nullable text Description column to the Ebooks table and can remove it on rollback.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["Class inherits Microsoft.EntityFrameworkCore.Migrations.Migration","Namespace NexusReader.Data.Persistence.Migrations and uses MigrationBuilder.AddColumn/DropColumn"]},"className":"AddDescriptionToEbook","methods":[{"name":"Up","line":11,"endLine":18,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Apply schema change: add a nullable text 'Description' column to the 'Ebooks' table.","calls":[],"actions":[{"id":"persistence-write_13","kind":"mapping","label":"Add column 'Description' to 'Ebooks'","line":13,"detail":"migrationBuilder.AddColumn<string>(name: \"Description\", table: \"Ebooks\", type: \"text\", nullable: true)","visibility":"detail-only","confidence":0.7}]},{"name":"Down","line":21,"endLine":26,"signature":"(migrationBuilder: MigrationBuilder) -> void","purpose":"Revert schema change: remove the 'Description' column from the 'Ebooks' table.","calls":[],"actions":[{"id":"persistence-delete_23","kind":"mapping","label":"Drop column 'Description' from 'Ebooks'","line":23,"detail":"migrationBuilder.DropColumn(name: \"Description\", table: \"Ebooks\")","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"purpose":"EF Core Migration class that encapsulates the schema change to add/remove the Description column on Ebooks.","fields":[{"name":"inherits","type":"Migration","required":true,"line":8,"description":"Extends Microsoft.EntityFrameworkCore.Migrations.Migration to provide Up/Down methods."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Migration"],"domainConcepts":["Ebook"],"keyDetails":"Adds a nullable text column named 'Description' to the 'Ebooks' table in Up(); Down() drops that column.","orchestrationMethods":[],"typedContracts":[{"name":"AddDescriptionToEbook","kind":"model","line":8,"fieldCount":1,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"AddDescriptionToEbook","line":8,"summary":"model with 1 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Persistence/Migrations/20260514184243_AddDescriptionToEbook.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"675677e1fadd7c40dfa74d84a22b9e3251044cb145c560c89e1e23c3a5e859c2","sourceByteSize":777,"analyzedAt":"2026-05-23T16:26:07.372Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/Author.cs","purpose":"Domain entity representing an Author in the NexusReader domain model; declares identity, display name and a navigation collection of related Ebook entities for ORM mapping.","classification":{"role":"entity","layer":"domain","confidence":0.95,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class Author with data-annotation attributes [Key], [Required], [MaxLength] and a virtual navigation ICollection<Ebook>"]},"className":"Author","methods":[],"types":[{"name":"Author","kind":"entity","line":5,"purpose":"Represents an author record with identity, name and related ebooks for persistence via an ORM (EF Core).","fields":[{"name":"Id","type":"int","required":true,"line":8,"description":"Primary key; annotated with [Key]"},{"name":"Name","type":"string","required":true,"line":12,"description":"Author display name; annotated with [Required] and [MaxLength(255)], initialized to empty string"},{"name":"Ebooks","type":"ICollection<Ebook>","required":true,"line":14,"description":"Virtual navigation collection of related Ebook entities; initialized to new List<Ebook>() (ORM relationship)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/Ebook.cs"],"patterns":["Entity","ORM (EF Core) navigation property"],"domainConcepts":["Author","Ebook"],"keyDetails":"Uses System.ComponentModel.DataAnnotations for schema constraints; navigation property is virtual and initialized, indicating intended EF Core usage (lazy/proxy or relationship mapping).","orchestrationMethods":[],"typedContracts":[{"name":"Author","kind":"entity","line":5,"fieldCount":3,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author","line":5,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}]}
{"path":"NexusReader.Domain/Entities/Author.cs","purpose":"Domain entity representing an author with identity, name, and a collection of authored ebooks for persistence and ORM mapping.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Declared in namespace NexusReader.Domain.Entities","Class is a POCO with data annotations ([Key], [Required], [MaxLength]) and navigation collection"]},"className":"Author","methods":[],"types":[{"name":"Author","kind":"entity","line":5,"purpose":"Represents an author record for the domain/ORM layer, including primary key, name and related ebooks.","fields":[{"name":"Id","type":"int","required":true,"line":8,"description":"Primary key, annotated with [Key]."},{"name":"Name","type":"string","required":true,"line":12,"description":"Author full name, required and max length 255."},{"name":"Ebooks","type":"ICollection<Ebook>","required":true,"line":14,"description":"Navigation property for related Ebook entities; initialized to an empty list."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/Ebook.cs"],"patterns":["Entity","EF Core POCO"],"domainConcepts":["Author","Ebook"],"keyDetails":"POCO domain entity with data annotations for validation and schema ([Key], [Required], [MaxLength(255)]). Ebooks navigation collection is virtual and pre-initialized to List<Ebook>.","orchestrationMethods":[],"typedContracts":[{"name":"Author","kind":"entity","line":5,"fieldCount":3,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Author","line":5,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Author.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ee626a27e1105e3a6ac7d91732d8d89eabb494d279d0aab98a1afc74b18624ab","sourceByteSize":338,"analyzedAt":"2026-05-23T16:20:05.453Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/Ebook.cs","purpose":"Defines the domain entity Ebook with storage/ORM mapping, metadata, navigation properties (Author, NexusUser), and fields used for reading/progress and AI ingestion readiness.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities; (line 4)","Entity class Ebook with data annotations like [Key], [Required], [ForeignKey] (lines 11, 14, 21, 24, 29, 53, 56)","Contains domain properties and navigation properties Author and NexusUser (lines 21-22, 56-57)"]},"className":"Ebook","methods":[],"types":[{"name":"Ebook","kind":"entity","line":9,"purpose":"Represents an e-book owned/uploaded by a user including metadata, storage info, reading progress and AI ingestion state.","fields":[{"name":"Id","type":"Guid","required":true,"line":11,"description":"Primary key; initialized to a new Guid"},{"name":"Title","type":"string","required":true,"line":14,"description":"Book title; max length 255"},{"name":"AuthorId","type":"int","required":true,"line":18,"description":"Foreign key to Author"},{"name":"Author","type":"Author (navigation)","required":true,"line":21,"description":"Navigation property to Author (ForeignKey(nameof(AuthorId)))"},{"name":"FilePath","type":"string","required":true,"line":24,"description":"Path to stored ebook file"},{"name":"CoverUrl","type":"string?","required":false,"line":27,"description":"Optional cover image URL"},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant identifier (multi-tenant); max length 128; defaults to \"global\""},{"name":"AddedDate","type":"DateTime","required":true,"line":33,"description":"Creation/added timestamp; defaults to DateTime.UtcNow"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":35,"description":"Nullable timestamp for last time read"},{"name":"Progress","type":"double","required":true,"line":37,"description":"Reading progress percentage (0..100); defaults to 0"},{"name":"LastChapter","type":"string?","required":false,"line":39,"description":"Optional last chapter title; max length 255"},{"name":"LastChapterIndex","type":"int","required":true,"line":42,"description":"Index of last read chapter; defaults to 0"},{"name":"Description","type":"string?","required":false,"line":44,"description":"Optional description or synopsis"},{"name":"IsReadyForReading","type":"bool","required":true,"line":50,"description":"Flag indicating AI ingestion/processing completed and knowledge units are available"},{"name":"UserId","type":"string","required":true,"line":53,"description":"Owner user id (required)"},{"name":"User","type":"NexusUser? (navigation)","required":false,"line":56,"description":"Optional navigation to NexusUser (ForeignKey(nameof(UserId)))"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain.Entities.Author","NexusReader.Domain.Entities.NexusUser"],"patterns":["ORM Entity","Repository (consumer)"],"domainConcepts":["Ebook","Author","NexusUser","Tenant","AI ingestion / Knowledge Units"],"keyDetails":"Entity includes multi-tenant TenantId defaulting to 'global', navigation properties for Author and NexusUser, and an IsReadyForReading flag indicating AI processing state used by ingestion/reading flows.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":9,"fieldCount":16,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":9,"summary":"entity with 16 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}]}
{"path":"NexusReader.Domain/Entities/Ebook.cs","purpose":"Defines the domain entity representing an uploaded or owned e-book, including metadata, relationships (Author, NexusUser), tenancy and ingestion/readiness status for application use and persistence.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class annotated with [Key], [ForeignKey], and data annotations for persistence"]},"className":"Ebook","methods":[],"types":[{"name":"Ebook","kind":"entity","line":9,"purpose":"Represents an e-book record stored in the domain/data model with metadata, relationships and ingestion/readiness state.","fields":[{"name":"Id","type":"Guid","required":true,"line":11,"description":"Primary key; initialized to a new Guid by default"},{"name":"Title","type":"string","required":true,"line":14,"description":"Ebook title (max length 255)"},{"name":"AuthorId","type":"int","required":true,"line":18,"description":"Foreign key referencing Author"},{"name":"Author","type":"Author (virtual)","required":true,"line":21,"description":"Navigation property to Author entity (ForeignKey AuthorId)"},{"name":"FilePath","type":"string","required":true,"line":24,"description":"Filesystem or storage path to the ebook file"},{"name":"CoverUrl","type":"string?","required":false,"line":27,"description":"Optional URL for cover image"},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant identifier (max length 128), default 'global' for multitenancy"},{"name":"AddedDate","type":"DateTime","required":true,"line":33,"description":"UTC timestamp when ebook was added; defaults to DateTime.UtcNow"},{"name":"LastReadDate","type":"DateTime?","required":false,"line":35,"description":"Optional timestamp of last read"},{"name":"Progress","type":"double","required":true,"line":37,"description":"Reading progress (numeric), defaults to 0"},{"name":"LastChapter","type":"string?","required":false,"line":39,"description":"Optional title/name of last chapter read (max length 255)"},{"name":"LastChapterIndex","type":"int","required":true,"line":42,"description":"Index of last chapter read, defaults to 0"},{"name":"Description","type":"string?","required":false,"line":44,"description":"Optional descriptive text for the ebook"},{"name":"IsReadyForReading","type":"bool","required":true,"line":50,"description":"Flag indicating AI ingestion readiness / Knowledge Units generated; defaults to false"},{"name":"UserId","type":"string","required":true,"line":53,"description":"Identifier of owning/uploading user (required)"},{"name":"User","type":"NexusUser?","required":false,"line":56,"description":"Optional navigation property to NexusUser (ForeignKey UserId)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/Author.cs","NexusReader.Domain/Entities/NexusUser.cs"],"patterns":["Entity","ORM (EntityFramework Core) mapping via DataAnnotations"],"domainConcepts":["Ebook","Author","NexusUser","Tenancy","AI ingestion / Knowledge Units"],"keyDetails":"POCO entity with EF Core data annotations: primary key (Id), required fields, max length constraints, foreign keys to Author and NexusUser, defaults for Id, AddedDate, TenantId and Progress, and a readiness flag (IsReadyForReading) used to indicate AI processing completion.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":9,"fieldCount":16,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":9,"summary":"entity with 16 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/Ebook.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"ae3a693d3ce6fe0aaa43b2d786848e242a95ae7074f732dbf5f887a93d80f0b8","sourceByteSize":1583,"analyzedAt":"2026-05-23T16:20:19.395Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/KnowledgeUnit.cs","purpose":"Defines the domain entity KnowledgeUnit which models a piece of knowledge (content, type, provenance) and its relationships for persistence (EF Core) within the Domain project.","classification":{"role":"entity","layer":"domain","confidence":0.95,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class named KnowledgeUnit with [Key], [Required], [ForeignKey] attributes and navigation properties"]},"className":"KnowledgeUnit","methods":[],"types":[{"name":"KnowledgeUnit","kind":"entity","line":7,"purpose":"Represents a persisted unit of knowledge (content, type, version, tenant scoping) and links to other knowledge units.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Primary key (hash of Source+Content+Version), max length 128"},{"name":"EbookId","type":"Guid?","required":false,"line":13,"description":"Optional FK to an Ebook"},{"name":"Ebook","type":"Ebook?","required":false,"line":15,"description":"Navigation property to Ebook (ForeignKey on EbookId)"},{"name":"Version","type":"string","required":true,"line":18,"description":"Unit version, required, max length 50, default '1.0'"},{"name":"Type","type":"KnowledgeUnitType","required":true,"line":22,"description":"Domain enum indicating the unit type (from NexusReader.Domain.Enums)"},{"name":"Content","type":"string","required":true,"line":25,"description":"The textual content of the knowledge unit"},{"name":"MetadataJson","type":"string?","required":false,"line":28,"description":"Optional JSON string with metadata (e.g., page, path)"},{"name":"TenantId","type":"string","required":true,"line":30,"description":"Tenant scoping identifier, required, max length 128"},{"name":"CreatedAt","type":"DateTime","required":true,"line":34,"description":"Timestamp when the unit was created, defaulted to DateTime.UtcNow"},{"name":"OutgoingLinks","type":"ICollection<KnowledgeUnitLink>","required":true,"line":37,"description":"Navigation collection of outgoing links to other KnowledgeUnit instances"},{"name":"IncomingLinks","type":"ICollection<KnowledgeUnitLink>","required":true,"line":38,"description":"Navigation collection of incoming links from other KnowledgeUnit instances"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Enums (KnowledgeUnitType)","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs"],"patterns":["Entity","EF Core (Data Annotations)","Aggregate / Graph node (links to other units)"],"domainConcepts":["KnowledgeUnit","Ebook","KnowledgeUnitLink","Tenant scoping"],"keyDetails":"Primary-key is a derived hash (Source+Content+Version). The entity is EF Core oriented (DataAnnotations), includes tenant scoping, versioning, metadata JSON, created timestamp, and bidirectional link collections to model a graph of knowledge units.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnit","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnit","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}]}
{"path":"NexusReader.Domain/Entities/KnowledgeUnit.cs","purpose":"Defines the domain entity KnowledgeUnit representing a unit of extracted/ingested knowledge (content, type, metadata, links) stored per tenant with EF Core mapping attributes.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities","Class decorated with [Key], [Required], [ForeignKey] attributes","Contains navigation properties (Ebook, IncomingLinks, OutgoingLinks)"]},"className":"KnowledgeUnit","methods":[],"types":[{"name":"KnowledgeUnit","kind":"entity","line":7,"purpose":"Represents a stored piece of knowledge (content + type + metadata) with tenant scoping and links to other KnowledgeUnits and an optional Ebook.","fields":[{"name":"Id","type":"string","required":true,"line":9,"description":"Primary key; max length 128. Comment: Hash(Source + Content + Version). Initialized to empty string."},{"name":"EbookId","type":"Guid?","required":false,"line":13,"description":"Optional FK to an Ebook entity (nullable GUID)."},{"name":"Ebook","type":"Ebook?","required":false,"line":15,"description":"Virtual navigation property for the related Ebook (ForeignKey on EbookId)."},{"name":"Version","type":"string","required":true,"line":18,"description":"Version string (Required, MaxLength 50). Default '1.0'."},{"name":"Type","type":"KnowledgeUnitType","required":true,"line":22,"description":"Required enum indicating the kind of knowledge unit (referenced from NexusReader.Domain.Enums)."},{"name":"Content","type":"string","required":true,"line":25,"description":"Required textual content of the knowledge unit."},{"name":"MetadataJson","type":"string?","required":false,"line":28,"description":"Optional JSON blob for extra metadata (e.g. { \"page\": 1, \"path\": \"Chapter 1 > Intro\" })."},{"name":"TenantId","type":"string","required":true,"line":30,"description":"Tenant identifier (Required, MaxLength 128)."},{"name":"CreatedAt","type":"DateTime","required":true,"line":34,"description":"Timestamp of creation; defaulted to DateTime.UtcNow."},{"name":"OutgoingLinks","type":"ICollection<KnowledgeUnitLink>","required":true,"line":37,"description":"Navigation collection of outgoing KnowledgeUnitLink relationships; initialized to empty List."},{"name":"IncomingLinks","type":"ICollection<KnowledgeUnitLink>","required":true,"line":38,"description":"Navigation collection of incoming KnowledgeUnitLink relationships; initialized to empty List."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs","NexusReader.Domain/Enums/KnowledgeUnitType.cs"],"patterns":["Entity","EF Core (Data Annotations)","Navigation Properties"],"domainConcepts":["KnowledgeUnit","Ebook","KnowledgeUnitLink","Tenant"],"keyDetails":"Primary key Id is intended as a content hash (comment). CreatedAt defaults to UTC now. Uses EF Core data annotations for schema (Key, Required, MaxLength, ForeignKey). Navigation properties are initialized to avoid null collections.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnit","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnit","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnit.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"77eaacf204f8463e27f597c5ce709a15a2d3cc062d4032bdeb359d6b3d96d0f9","sourceByteSize":1186,"analyzedAt":"2026-05-23T16:20:18.493Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/KnowledgeUnitLink.cs","purpose":"Defines the domain entity KnowledgeUnitLink which models a directed link between two KnowledgeUnit entities with metadata (relation type) and EF Core data annotations for persistence.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities (line 4)","DataAnnotations attributes ([Key], [Required], [MaxLength], [ForeignKey]) applied to properties","Class models relationships to KnowledgeUnit (SourceUnit, TargetUnit) via foreign keys"]},"className":"KnowledgeUnitLink","methods":[],"types":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"purpose":"Represents a directed relationship/link between two KnowledgeUnit entities with a typed relation label and persistence annotations.","fields":[{"name":"Id","type":"int","required":true,"line":9,"description":"Primary key for the link (annotated with [Key])."},{"name":"SourceUnitId","type":"string","required":true,"line":13,"description":"FK string identifier of the source KnowledgeUnit; [Required], [MaxLength(128)], defaults to empty string."},{"name":"TargetUnitId","type":"string","required":true,"line":17,"description":"FK string identifier of the target KnowledgeUnit; [Required], [MaxLength(128)], defaults to empty string."},{"name":"RelationType","type":"string","required":true,"line":21,"description":"Label describing the relation (e.g., \"Next\", \"Defines\", \"Contains\"); [Required], [MaxLength(50)], default \"References\"."},{"name":"SourceUnit","type":"KnowledgeUnit","required":true,"line":24,"description":"Navigation property to the source KnowledgeUnit; annotated with [ForeignKey(nameof(SourceUnitId))]."},{"name":"TargetUnit","type":"KnowledgeUnit","required":true,"line":27,"description":"Navigation property to the target KnowledgeUnit; annotated with [ForeignKey(nameof(TargetUnitId))]."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/KnowledgeUnit.cs"],"patterns":["Entity","EF Core Data Annotations","Foreign Key Relationship"],"domainConcepts":["KnowledgeUnit","KnowledgeUnitLink","RelationType"],"keyDetails":"Simple EF Core entity with primary key (Id), two string FK identifiers (SourceUnitId, TargetUnitId) with max lengths, a RelationType with default \"References\", and navigation properties annotated with [ForeignKey] to link to KnowledgeUnit entities.","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"fieldCount":6,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnitLink","line":6,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}]}
{"path":"NexusReader.Domain/Entities/KnowledgeUnitLink.cs","purpose":"Defines the domain entity KnowledgeUnitLink which models a directed relation between two KnowledgeUnit entities with metadata (relation type) and EF Core persistence annotations.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities (line 4)","Class contains EF Core/ORM attributes like [Key], [Required], [MaxLength], [ForeignKey] (lines 8,11,12,19,23,26)"]},"className":"KnowledgeUnitLink","methods":[],"types":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"purpose":"Represents a directed link between two KnowledgeUnit entities with a typed relation for persistence via EF Core.","fields":[{"name":"Id","type":"int","required":true,"line":8,"description":"Primary key; annotated with [Key]."},{"name":"SourceUnitId","type":"string","required":true,"line":11,"description":"Foreign key id of the source KnowledgeUnit; [Required], [MaxLength(128)]."},{"name":"TargetUnitId","type":"string","required":true,"line":15,"description":"Foreign key id of the target KnowledgeUnit; [Required], [MaxLength(128)]."},{"name":"RelationType","type":"string","required":true,"line":19,"description":"Describes the link type (e.g., \"Next\",\"Defines\",\"Contains\"); [Required], [MaxLength(50)], default \"References\"."},{"name":"SourceUnit","type":"KnowledgeUnit","required":true,"line":23,"description":"Navigation property to the source KnowledgeUnit; annotated [ForeignKey(nameof(SourceUnitId))]."},{"name":"TargetUnit","type":"KnowledgeUnit","required":true,"line":26,"description":"Navigation property to the target KnowledgeUnit; annotated [ForeignKey(nameof(TargetUnitId))]."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/KnowledgeUnit.cs"],"patterns":["Entity","EFCore-annotations","ForeignKey (navigation properties)"],"domainConcepts":["KnowledgeUnit","KnowledgeUnitLink","RelationType"],"keyDetails":"Entity uses EF Core data annotations for schema constraints and navigation: Id is PK, SourceUnitId/TargetUnitId are required string FKs (max 128), RelationType is required (max 50) with default \"References\", and navigation properties reference KnowledgeUnit via [ForeignKey].","orchestrationMethods":[],"typedContracts":[{"name":"KnowledgeUnitLink","kind":"entity","line":6,"fieldCount":6,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"KnowledgeUnitLink","line":6,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/KnowledgeUnitLink.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"9fd956396568364799313686329de229e864b4c2fe32a99a8b5d75ddcfa92c80","sourceByteSize":773,"analyzedAt":"2026-05-23T16:20:15.444Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/NexusUser.cs","purpose":"Domain entity representing an application user, extending IdentityUser with tenancy, subscription, AI quota, reading state and navigation to related domain objects.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities","public class NexusUser : IdentityUser","Contains navigation properties (SubscriptionPlan, Ebooks, QuizResults) and domain-specific fields (TenantId, SubscriptionPlanId, AITokenLimit)"]},"className":"NexusUser","methods":[],"types":[{"name":"NexusUser","kind":"entity","line":7,"purpose":"Represents a user in the domain with identity integration, tenant-scoping, subscription and AI quota accounting, and reading-related state.","fields":[{"name":"DisplayName","type":"string?","required":false,"line":13,"description":"User's display name or full name (MaxLength 100)."},{"name":"AITokenLimit","type":"int","required":true,"line":18,"description":"Total AI tokens available for the user (depends on subscription)."},{"name":"AITokensUsed","type":"int","required":true,"line":23,"description":"AI tokens consumed by the user in the current billing period."},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":28,"description":"Date when the user last performed an AI-related action."},{"name":"TenantId","type":"string","required":true,"line":35,"description":"Multi-tenant identifier (Required, MaxLength 128), defaults to \"global\"."},{"name":"SubscriptionPlanId","type":"int","required":true,"line":41,"description":"Foreign key for the current subscription plan (Required)."},{"name":"SubscriptionPlan","type":"SubscriptionPlan?","required":false,"line":46,"description":"Navigation property for the current subscription plan."},{"name":"Ebooks","type":"ICollection<Ebook>","required":true,"line":51,"description":"Collection of e-books owned by the user; initialized to an empty list."},{"name":"QuizResults","type":"ICollection<QuizResult>","required":true,"line":56,"description":"Collection of quiz results completed by the user; initialized to an empty list."},{"name":"LastReadPageId","type":"string?","required":false,"line":62,"description":"ID of the last page read by the user (MaxLength 255)."},{"name":"LastReadAt","type":"DateTime?","required":false,"line":67,"description":"Last read timestamp."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/SubscriptionPlan.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/QuizResult.cs","Microsoft.AspNetCore.Identity (framework)"],"patterns":["Entity","IdentityUser-extension","ORM-navigation-properties"],"domainConcepts":["User","Tenant","SubscriptionPlan","AITokens","Ebook","QuizResult","ReadingState"],"keyDetails":"Lightweight domain entity that augments ASP.NET Identity user with tenancy, subscription linkage, AI quota tracking and reading-state navigation; no runtime methods in this file.","orchestrationMethods":[],"typedContracts":[{"name":"NexusUser","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"NexusUser","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}]}
{"path":"NexusReader.Domain/Entities/NexusUser.cs","purpose":"Domain entity representing an application user, extending ASP.NET IdentityUser with multi-tenant, subscription and usage tracking plus navigation collections for related domain data.","classification":{"role":"entity","layer":"domain","confidence":0.8,"evidence":["Domain/entity pattern","Domain path heuristic","Class NexusUser inherits IdentityUser (line 7)","Contains domain properties like TenantId, SubscriptionPlanId, navigation properties and usage counters (lines 33-51)"]},"className":"NexusUser","methods":[],"types":[{"name":"NexusUser","kind":"entity","line":7,"purpose":"Represents a user in the NexusReader domain with tenant, subscription and AI-usage metadata plus relationships to ebooks and quiz results.","fields":[{"name":"DisplayName","type":"string?","required":false,"line":13,"description":"User's display or full name (max 100 chars)."},{"name":"AITokenLimit","type":"int","required":true,"line":18,"description":"Total AI tokens allocated to the user (subscription dependent)."},{"name":"AITokensUsed","type":"int","required":true,"line":23,"description":"AI tokens consumed by the user in the current billing period."},{"name":"LastAiActionDate","type":"DateTime?","required":false,"line":28,"description":"Timestamp of the last AI-related action by the user."},{"name":"TenantId","type":"string","required":true,"line":35,"description":"Multi-tenant identifier (max 128 chars), defaulting to 'global'."},{"name":"SubscriptionPlanId","type":"int","required":true,"line":41,"description":"Foreign key id for the user's current subscription plan."},{"name":"SubscriptionPlan","type":"SubscriptionPlan?","required":false,"line":46,"description":"Navigation property to the SubscriptionPlan entity."},{"name":"Ebooks","type":"ICollection<Ebook>","required":true,"line":51,"description":"Collection of ebooks owned by the user."},{"name":"QuizResults","type":"ICollection<QuizResult>","required":true,"line":56,"description":"Collection of quiz results completed by the user."},{"name":"LastReadPageId","type":"string?","required":false,"line":62,"description":"Identifier of the last page read by the user (max 255 chars)."},{"name":"LastReadAt","type":"DateTime?","required":false,"line":67,"description":"Timestamp when the user last read content."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Microsoft.AspNetCore.Identity.IdentityUser","SubscriptionPlan (NexusReader.Domain.Entities)","Ebook (NexusReader.Domain.Entities)","QuizResult (NexusReader.Domain.Entities)"],"patterns":["Entity","EF Core navigation properties"],"domainConcepts":["User","Tenant","SubscriptionPlan","Ebook","QuizResult","AI usage / tokens"],"keyDetails":"NexusUser extends IdentityUser and embeds multi-tenancy (TenantId default 'global'), subscription linkage (SubscriptionPlanId + navigation), AI token accounting (AITokenLimit/AITokensUsed/LastAiActionDate) and collections for owned ebooks and quiz results; no runtime methods are defined in this file.","orchestrationMethods":[],"typedContracts":[{"name":"NexusUser","kind":"entity","line":7,"fieldCount":11,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"NexusUser","line":7,"summary":"entity with 11 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/NexusUser.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"60d7ad7165f5ec9f4bd2b03e0a88be4110aed0ee6f8955cdabeb39f3ee182ebb","sourceByteSize":1973,"analyzedAt":"2026-05-23T16:20:22.636Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/QuizResult.cs","purpose":"Defines the domain entity that records a user's result for an AI-generated quiz, including metadata (user, tenant, topic), score, computed percentage, and completion timestamp.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace: NexusReader.Domain.Entities","Class uses [Key], [Required], [ForeignKey] attributes (EF Core/ORM metadata)","Represents a persistent model (Id, foreign key to NexusUser)"]},"className":"QuizResult","methods":[{"name":"implicit constructor","line":9,"endLine":34,"signature":"() -> QuizResult","purpose":"Initializes instance-level default values for properties when a new QuizResult is created.","calls":[],"actions":[{"id":"metadata_11","kind":"mapping","label":"EF Core attributes applied","line":11,"detail":"Attributes such as [Key], [Required], [MaxLength], [ForeignKey] are present on properties and used by ORM","visibility":"detail-only","confidence":0.7},{"id":"init_12","kind":"mapping","label":"Set Id to new Guid","line":12,"detail":"Id property initialized to Guid.NewGuid() at declaration","visibility":"detail-only","confidence":0.7},{"id":"init_15","kind":"mapping","label":"Set UserId default","line":15,"detail":"UserId initialized to empty string","visibility":"detail-only","confidence":0.7},{"id":"init_22","kind":"mapping","label":"Set TenantId default","line":22,"detail":"TenantId initialized to \"global\"","visibility":"detail-only","confidence":0.7},{"id":"init_25","kind":"mapping","label":"Set Topic default","line":25,"detail":"Topic initialized to empty string","visibility":"detail-only","confidence":0.7},{"id":"init_33","kind":"mapping","label":"Set CompletedDate to UTC now","line":33,"detail":"CompletedDate initialized to DateTime.UtcNow at declaration","visibility":"detail-only","confidence":0.7}]},{"name":"Percentage (getter)","line":31,"endLine":31,"signature":"() -> double","purpose":"Computes the quiz score percentage as Score/TotalQuestions*100, guarding against division by zero.","calls":[],"actions":[{"id":"guard-clause_31","kind":"guard-clause","label":"Avoid divide-by-zero","line":31,"detail":"If TotalQuestions > 0 returns (double)Score/TotalQuestions*100, else returns 0","conditionSummary":"TotalQuestions > 0","outcomeLabels":["return computed percentage","return 0"],"visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"QuizResult","kind":"entity","line":9,"purpose":"Represents a persisted quiz result for a user including score, topic, tenant, and completion timestamp.","fields":[{"name":"Id","type":"Guid","required":true,"line":12,"description":"Primary key; initialized to a new Guid by default; decorated with [Key]."},{"name":"UserId","type":"string","required":true,"line":15,"description":"FK string id of the user who took the quiz; decorated with [Required]."},{"name":"User","type":"NexusUser?","required":false,"line":18,"description":"Navigation property to the NexusUser entity; marked with [ForeignKey(nameof(UserId))]."},{"name":"TenantId","type":"string","required":true,"line":22,"description":"Tenant identifier with [Required] and [MaxLength(128)], defaulting to \"global\"."},{"name":"Topic","type":"string","required":true,"line":25,"description":"Topic or subject of the quiz; [Required], default empty string."},{"name":"Score","type":"int","required":false,"line":27,"description":"Number of correct answers."},{"name":"TotalQuestions","type":"int","required":false,"line":29,"description":"Total number of questions in the quiz used to compute Percentage."},{"name":"Percentage","type":"double","required":false,"line":31,"description":"Computed read-only property returning (Score/TotalQuestions)*100 with divide-by-zero guard."},{"name":"CompletedDate","type":"DateTime","required":false,"line":33,"description":"When the quiz was completed; defaulted to DateTime.UtcNow."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/NexusUser.cs"],"patterns":["Entity","EF Core (ORM)","Computed Property"],"domainConcepts":["QuizResult","User","Tenant","Topic","Score/Percentage"],"keyDetails":"Small EF Core entity with declarative attributes, default initializers (Id->Guid.NewGuid, CompletedDate->UtcNow), and a computed Percentage getter that guards against division by zero.","orchestrationMethods":[],"typedContracts":[{"name":"QuizResult","kind":"entity","line":9,"fieldCount":9,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizResult","line":9,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}]}
{"path":"NexusReader.Domain/Entities/QuizResult.cs","purpose":"Domain entity that models and persists the result of an AI-generated quiz taken by a user, including score, totals, tenant scoping and completion timestamp.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities (line 4)","Class named QuizResult located in Entities folder and uses DataAnnotations attributes (Key, Required, ForeignKey)"]},"className":"QuizResult","methods":[{"name":".ctor (implicit)","line":9,"endLine":34,"signature":"() -> QuizResult","purpose":"Implicit object initializer that sets default values for several properties when a QuizResult is created.","calls":[],"actions":[{"id":"initialization_12","kind":"mapping","label":"Sets default Id","line":12,"detail":"Id = Guid.NewGuid() (property initializer)","visibility":"detail-only","confidence":0.7},{"id":"initialization_15","kind":"mapping","label":"Sets default UserId","line":15,"detail":"UserId = string.Empty (property initializer)","visibility":"detail-only","confidence":0.7},{"id":"initialization_22","kind":"mapping","label":"Sets default TenantId","line":22,"detail":"TenantId = \"global\" (property initializer)","visibility":"detail-only","confidence":0.7},{"id":"initialization_25","kind":"mapping","label":"Sets default Topic","line":25,"detail":"Topic = string.Empty (property initializer)","visibility":"detail-only","confidence":0.7},{"id":"initialization_33","kind":"mapping","label":"Sets CompletedDate to UTC now","line":33,"detail":"CompletedDate = DateTime.UtcNow (property initializer)","visibility":"detail-only","confidence":0.7}]},{"name":"Percentage (getter)","line":31,"endLine":31,"signature":"() -> double","purpose":"Computes the score percentage of correct answers; guards against division by zero.","calls":[],"actions":[{"id":"guard-clause_31","kind":"guard-clause","label":"Avoid divide-by-zero","line":31,"detail":"If TotalQuestions > 0 returns (double)Score / TotalQuestions * 100, else returns 0","conditionSummary":"TotalQuestions > 0","outcomeLabels":["compute-percentage","return-0"],"visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"QuizResult","kind":"entity","line":9,"purpose":"Represents a persisted quiz attempt by a user, including score details, topic and tenant context.","fields":[{"name":"Id","type":"Guid","required":true,"line":12,"description":"[Key] primary identifier; defaulted to Guid.NewGuid()"},{"name":"UserId","type":"string","required":true,"line":15,"description":"FK string identifier of the user; decorated with [Required]"},{"name":"User","type":"NexusUser?","required":false,"line":18,"description":"Navigation property to user entity; [ForeignKey(nameof(UserId))]"},{"name":"TenantId","type":"string","required":true,"line":22,"description":"[Required] tenant scoping for multi-tenant data; MaxLength(128); defaults to \"global\""},{"name":"Topic","type":"string","required":true,"line":25,"description":"The quiz topic or subject; [Required]"},{"name":"Score","type":"int","required":false,"line":27,"description":"Number of correct answers"},{"name":"TotalQuestions","type":"int","required":false,"line":29,"description":"Total number of questions in the quiz"},{"name":"Percentage","type":"double","required":false,"line":31,"description":"Computed percentage (Score/TotalQuestions*100) with guard for zero TotalQuestions"},{"name":"CompletedDate","type":"DateTime","required":false,"line":33,"description":"Timestamp for completion; defaults to DateTime.UtcNow"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Entity"],"domainConcepts":["QuizResult","User","Tenant","Quiz/Assessment"],"keyDetails":"Entity includes attribute metadata for EF (Key, Required, ForeignKey, MaxLength), default initializers (Guid.NewGuid, DateTime.UtcNow), and a computed Percentage property which guards against division by zero.","orchestrationMethods":[],"typedContracts":[{"name":"QuizResult","kind":"entity","line":9,"fieldCount":9,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"QuizResult","line":9,"summary":"entity with 9 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/QuizResult.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"51cada202683db89a2f2cb84cbf57091bcccf8f6a0dd961d50b37695c501cc1c","sourceByteSize":912,"analyzedAt":"2026-05-23T16:20:29.896Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","purpose":"Defines a domain entity that caches semantic extraction results (JSON payload, original text, model/prompt metadata) and stores an optional vector embedding for semantic search.","classification":{"role":"entity","layer":"domain","confidence":0.8,"evidence":["Domain/entity pattern","Domain path heuristic","Namespace NexusReader.Domain.Entities and folder path Entities","Class is a POCO with data annotations ([Key], [Required], [MaxLength]) used by an ORM","Uses Pgvector.Vector for embeddings (persistence of vector data)"]},"className":"SemanticKnowledgeCache","methods":[],"types":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"purpose":"Represents a persisted cache entry for semantic knowledge including raw text, JSON result, model/prompt metadata, tenant scoping, and an optional vector embedding for semantic search.","fields":[{"name":"ContentHash","type":"string","required":true,"line":11,"description":"Primary key: hash of the content used as unique identifier (MaxLength 128)."},{"name":"JsonData","type":"string","required":true,"line":14,"description":"Serialized JSON result of the semantic extraction or analysis."},{"name":"OriginalText","type":"string","required":true,"line":17,"description":"Original source text used to produce the JSONData / embedding."},{"name":"ModelId","type":"string","required":true,"line":21,"description":"Identifier of the model used to generate the semantic data (MaxLength 50). Defaults to 'gemini-1.5-flash'."},{"name":"PromptVersion","type":"string","required":true,"line":25,"description":"Version of the prompt used for generation (MaxLength 10). Defaults to '1.0'."},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant or scope identifier for multi-tenant isolation (MaxLength 128)."},{"name":"Embedding","type":"Pgvector.Vector?","required":false,"line":32,"description":"Optional vector embedding used for semantic search (comment: 768 dimensions)."},{"name":"CreatedAt","type":"DateTime","required":true,"line":34,"description":"UTC timestamp when the cache entry was created; defaulted to DateTime.UtcNow."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","Pgvector (NuGet package)","System.ComponentModel.DataAnnotations (for [Key],[Required],[MaxLength])"],"patterns":["ORM Entity","Repository (implied)","Vector embedding cache"],"domainConcepts":["Semantic cache","Embedding","Tenant scoping","Model and prompt versioning","Content hashing (cache key)"],"keyDetails":"Primary key is ContentHash (MaxLength 128). Embedding is stored via Pgvector.Vector (comment notes 768 dims). ModelId and PromptVersion have defaults and length constraints. CreatedAt defaults to UTC now.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"fieldCount":8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":7,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}]}
{"path":"NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","purpose":"Defines a domain entity that persists cached semantic knowledge (original text, model/prompt metadata, JSON payload) and its vector embedding for semantic search.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","namespace NexusReader.Domain.Entities","class SemanticKnowledgeCache declared in Entities folder","uses data-annotation attributes ([Key], [Required], [MaxLength]) typical for ORM entities"]},"className":"SemanticKnowledgeCache","methods":[],"types":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"purpose":"Represents a cached semantic artifact including original text, serialized JSON, model/prompt metadata, tenant scoping, and an optional vector embedding used for semantic search.","fields":[{"name":"ContentHash","type":"string","required":true,"line":11,"description":"Primary key / content fingerprint (MaxLength 128) used to deduplicate cache entries."},{"name":"JsonData","type":"string","required":true,"line":14,"description":"Serialized JSON payload stored alongside the cache entry."},{"name":"OriginalText","type":"string","required":true,"line":17,"description":"The original text content that was embedded / cached."},{"name":"ModelId","type":"string","required":true,"line":21,"description":"Identifier of the model used to produce the embedding (MaxLength 50). Default 'gemini-1.5-flash'."},{"name":"PromptVersion","type":"string","required":true,"line":25,"description":"Version of the prompt used when generating the cached material (MaxLength 10). Default '1.0'."},{"name":"TenantId","type":"string","required":true,"line":29,"description":"Tenant scoping identifier for multi-tenant data segregation (MaxLength 128)."},{"name":"Embedding","type":"Vector?","required":false,"line":32,"description":"Optional vector embedding (Pgvector.Vector) used for semantic search; comment notes 768 dimensions."},{"name":"CreatedAt","type":"DateTime","required":false,"line":34,"description":"Timestamp when the cache entry was created; defaulted to DateTime.UtcNow."}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["Pgvector (external package)","System.ComponentModel.DataAnnotations (framework)"],"patterns":["Entity","ORM-mapped model (EF Core style with data annotations)","Embedding cache"],"domainConcepts":["SemanticKnowledgeCache","Embedding","ModelId","PromptVersion","TenantId"],"keyDetails":"Entity stores deduplicated cached semantic artifacts keyed by ContentHash, includes model/prompt metadata, tenant scoping, JSON payload, optional Pgvector embedding (commented as 768 dims), and a UTC creation timestamp.","orchestrationMethods":[],"typedContracts":[{"name":"SemanticKnowledgeCache","kind":"entity","line":7,"fieldCount":8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SemanticKnowledgeCache","line":7,"summary":"entity with 8 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SemanticKnowledgeCache.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"b11a468239401df3d7a6cbfa2a6a26f0ad97f09313813aada85448e02f03b904","sourceByteSize":922,"analyzedAt":"2026-05-23T16:20:32.744Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Entities/SubscriptionPlan.cs","purpose":"Defines the domain entity SubscriptionPlan which models subscription tiers, pricing and AI token limits used by the application.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Contains public class SubscriptionPlan with data annotations (Key, Required, MaxLength)","Defines constants for plan names and IDs used across the domain"]},"className":"SubscriptionPlan","methods":[],"types":[{"name":"SubscriptionPlan","kind":"entity","line":5,"purpose":"Represents a subscription tier with identifiers, display name, token limits and billing identifiers/pricing.","fields":[{"name":"FreeName","type":"string (const)","required":false,"line":7,"description":"Static constant for the Free plan name"},{"name":"BasicName","type":"string (const)","required":false,"line":8,"description":"Static constant for the Basic plan name"},{"name":"ProName","type":"string (const)","required":false,"line":9,"description":"Static constant for the Pro plan name"},{"name":"EnterpriseName","type":"string (const)","required":false,"line":10,"description":"Static constant for the Enterprise plan name"},{"name":"FreeId","type":"int (const)","required":false,"line":12,"description":"Static constant for the Free plan numeric id"},{"name":"BasicId","type":"int (const)","required":false,"line":13,"description":"Static constant for the Basic plan numeric id"},{"name":"ProId","type":"int (const)","required":false,"line":14,"description":"Static constant for the Pro plan numeric id"},{"name":"EnterpriseId","type":"int (const)","required":false,"line":15,"description":"Static constant for the Enterprise plan numeric id"},{"name":"Id","type":"int","required":true,"line":18,"description":"Primary key for the subscription plan (annotated with [Key])"},{"name":"PlanName","type":"string","required":true,"line":22,"description":"Human-readable plan name (annotated with [Required] and [MaxLength(50)])"},{"name":"AITokenLimit","type":"int","required":false,"line":24,"description":"Per-period AI token allotment for this plan"},{"name":"IsUnlimitedTokens","type":"bool","required":false,"line":26,"description":"Flag indicating tokens are unlimited for this plan"},{"name":"MonthlyPrice","type":"decimal","required":false,"line":28,"description":"Monthly price for the plan"},{"name":"StripeProductId","type":"string","required":false,"line":31,"description":"Optional Stripe product identifier (MaxLength 50)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Entity","EF Core DataAnnotations"],"domainConcepts":["SubscriptionPlan","Pricing","Billing/Stripe integration","AI token limits"],"keyDetails":"Simple EF-style entity with DataAnnotations for validation and length; includes static constants for well-known plan names and numeric IDs used application-wide.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlan","kind":"entity","line":5,"fieldCount":14,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlan","line":5,"summary":"entity with 14 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}]}
{"path":"NexusReader.Domain/Entities/SubscriptionPlan.cs","purpose":"Defines the domain entity SubscriptionPlan which models subscription tiers, pricing, and token/quota limits for the application.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Domain path heuristic","Class named SubscriptionPlan in NexusReader.Domain.Entities namespace","Contains data properties and data-annotation attributes (Key, Required, MaxLength) typical of a domain/EF entity"]},"className":"SubscriptionPlan","methods":[],"types":[{"name":"SubscriptionPlan","kind":"entity","line":5,"purpose":"Represents a subscription tier including identifiers, human name, token limits, pricing, and Stripe product mapping.","fields":[{"name":"FreeName","type":"string (const)","required":false,"line":7,"description":"Constant display name for the Free plan"},{"name":"BasicName","type":"string (const)","required":false,"line":8,"description":"Constant display name for the Basic plan"},{"name":"ProName","type":"string (const)","required":false,"line":9,"description":"Constant display name for the Pro plan"},{"name":"EnterpriseName","type":"string (const)","required":false,"line":10,"description":"Constant display name for the Enterprise plan"},{"name":"FreeId","type":"int (const)","required":false,"line":12,"description":"Constant numeric id for the Free plan"},{"name":"BasicId","type":"int (const)","required":false,"line":13,"description":"Constant numeric id for the Basic plan"},{"name":"ProId","type":"int (const)","required":false,"line":14,"description":"Constant numeric id for the Pro plan"},{"name":"EnterpriseId","type":"int (const)","required":false,"line":15,"description":"Constant numeric id for the Enterprise plan"},{"name":"Id","type":"int","required":true,"line":17,"description":"Primary key for the subscription plan (annotated with [Key])"},{"name":"PlanName","type":"string","required":true,"line":20,"description":"Human-readable plan name (Required, MaxLength 50)"},{"name":"AITokenLimit","type":"int","required":false,"line":24,"description":"Numeric limit of AI tokens allocated to this plan"},{"name":"IsUnlimitedTokens","type":"bool","required":false,"line":26,"description":"Flag indicating whether the plan has unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":false,"line":28,"description":"Monthly price for the plan"},{"name":"StripeProductId","type":"string","required":false,"line":30,"description":"Stripe product identifier for billing integration (MaxLength 50)"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Entity","DataAnnotations (EF Core)"],"domainConcepts":["SubscriptionPlan","Pricing","Quota/Token limits","Billing (Stripe mapping)"],"keyDetails":"Simple POCO entity used for persisting subscription tier metadata; includes constants for well-known plan names and IDs, token quota fields (limit + unlimited flag), monthly price, and Stripe product id for billing integration.","orchestrationMethods":[],"typedContracts":[{"name":"SubscriptionPlan","kind":"entity","line":5,"fieldCount":14,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"SubscriptionPlan","line":5,"summary":"entity with 14 fields.","confidence":0.8,"evidencePaths":["NexusReader.Domain/Entities/SubscriptionPlan.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"7bbc9753c45b603eb7bd7496f1bdc07a53dfed27b3d6bcbd7365b5bf424efc7c","sourceByteSize":839,"analyzedAt":"2026-05-23T16:20:35.011Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/Enums/KnowledgeUnitType.cs","purpose":"Defines the domain-level enumeration of different knowledge unit categories used across the NexusReader system.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","namespace NexusReader.Domain.Enums","file path indicates Domain/Enums and contains a single enum declaration"]},"className":"","methods":[],"types":[{"name":"KnowledgeUnitType","kind":"enum","line":3,"purpose":"Represents possible kinds of knowledge units (e.g., Section, Table, Definition) for classification and branching in domain logic.","fields":[{"name":"Section","type":"int","required":true,"line":5,"description":"A document section"},{"name":"Table","type":"int","required":true,"line":6,"description":"A tabular data unit"},{"name":"Definition","type":"int","required":true,"line":7,"description":"A definitional entry"},{"name":"ProcedureStep","type":"int","required":true,"line":8,"description":"A step in a procedure"},{"name":"PolicyRule","type":"int","required":true,"line":9,"description":"A policy or rule item"},{"name":"KeyConcept","type":"int","required":true,"line":10,"description":"An important concept or takeaway"},{"name":"Snippet","type":"int","required":true,"line":11,"description":"A short text/code snippet"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Enum"],"domainConcepts":["KnowledgeUnit"],"keyDetails":"Simple, single-file enum used for domain classification; no runtime logic, methods, or external dependencies present.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Domain/Enums/KnowledgeUnitType.cs","purpose":"Defines the KnowledgeUnitType enumeration used to categorize different kinds of knowledge units across the domain.","classification":{"role":"entity","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","Contains a single enum declaration named KnowledgeUnitType","Placed under NexusReader.Domain.Enums namespace"]},"className":"","methods":[],"types":[{"name":"KnowledgeUnitType","kind":"enum","line":3,"purpose":"Enumerates the possible kinds of knowledge units (Section, Table, Definition, etc.) used by the domain.","fields":[{"name":"Section","type":"KnowledgeUnitType","required":true,"line":5,"description":"A document or content section"},{"name":"Table","type":"KnowledgeUnitType","required":true,"line":6,"description":"Tabular data or matrix"},{"name":"Definition","type":"KnowledgeUnitType","required":true,"line":7,"description":"A definitional entry"},{"name":"ProcedureStep","type":"KnowledgeUnitType","required":true,"line":8,"description":"A step in a procedure"},{"name":"PolicyRule","type":"KnowledgeUnitType","required":true,"line":9,"description":"A policy or rule statement"},{"name":"KeyConcept","type":"KnowledgeUnitType","required":true,"line":10,"description":"A core concept or idea"},{"name":"Snippet","type":"KnowledgeUnitType","required":true,"line":11,"description":"A small code/text snippet or excerpt"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Enum"],"domainConcepts":["KnowledgeUnit","Section","Table","Definition","ProcedureStep","PolicyRule","KeyConcept","Snippet"],"keyDetails":"Simple domain enum used to tag or switch behavior based on the type of knowledge unit; no runtime logic in this file.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"2c0d992a865988803dec96f4d92c82ff7a2cec9b8769256b5050ccbecb7d6fe9","sourceByteSize":186,"analyzedAt":"2026-05-23T16:20:29.446Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Domain/NexusReader.Domain.csproj","purpose":"Project file for the NexusReader.Domain assembly: declares build settings (TargetFramework net10.0), compiler behaviors (implicit usings, nullable), runtime configuration generation, and package dependencies used by the Domain project.","classification":{"role":"config","layer":"domain","confidence":0.9,"evidence":["Domain/entity pattern","File name and path indicate the Domain project (NexusReader.Domain)","TargetFramework set to net10.0 (line 4)","PackageReference entries for Pgvector and Microsoft.Extensions.Identity.Stores (lines 11-12)","GenerateRuntimeConfigurationFiles enabled (line 7)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["[object Object]","[object Object]"],"patterns":["project-file"],"domainConcepts":["Domain project boundary for NexusReader"],"keyDetails":"Targets .NET 10 (net10.0), enables implicit usings and nullable reference types, and instructs generation of runtime configuration files. Declares dependencies on Pgvector and Microsoft.Extensions.Identity.Stores.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Domain/NexusReader.Domain.csproj","purpose":"Proj file for the NexusReader.Domain project: declares build/runtime settings and package dependencies for the Domain assembly.","classification":{"role":"config","layer":"infrastructure","confidence":0.8,"evidence":["Domain/entity pattern","Contains <TargetFramework>, <ImplicitUsings>, <Nullable>, and <PackageReference> elements (lines 3-13).","No code or classes — it's an SDK project configuration file (lines 1-15)."]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["TargetFramework: net10.0 (line 4)","PackageReference: Pgvector (line 11)","PackageReference: Microsoft.Extensions.Identity.Stores (line 12)"],"patterns":["Project file","PackageReferences"],"domainConcepts":["Web","Web.Client","MAUI","Application","Infrastructure","Domain","Data","UI.Shared"],"keyDetails":"Project uses SDK-style csproj (Microsoft.NET.Sdk). Implicit usings enabled, nullable reference types enabled, runtime configuration files generation enabled. Declares Pgvector and Microsoft.Extensions.Identity.Stores package dependencies.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"061045365e548d1dc0efa98624b516688dae0a42f237e5d0f494de0b40e79372","sourceByteSize":450,"analyzedAt":"2026-05-23T16:23:03.290Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Infrastructure.Mobile/Class1.cs","purpose":"Placeholder/empty class in the NexusReader.Infrastructure.Mobile project; likely a template/auto-generated file with no runtime behavior.","classification":{"role":"unknown","layer":"unknown","confidence":0.6,"evidence":["Namespace: NexusReader.Infrastructure.Mobile indicates infrastructure/mobile concerns","File contains an empty class (no methods or members) so it does not implement startup or service registration"]},"className":"Class1","methods":[],"types":[{"name":"Class1","kind":"model","line":3,"purpose":"Empty placeholder class declared in the mobile infrastructure project.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":[],"domainConcepts":[],"keyDetails":"File contains only an empty Class1 declaration (lines 3-6). No runtime behavior, calls, or type members to analyze.","orchestrationMethods":[],"typedContracts":[{"name":"Class1","kind":"model","line":3,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Class1","line":3,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}]}
{"path":"NexusReader.Infrastructure.Mobile/Class1.cs","purpose":"Placeholder/infrastructure mobile file; defines an empty class in the NexusReader.Infrastructure.Mobile namespace. Likely a stub for MAUI platform-specific services but contains no runtime behavior.","classification":{"role":"unknown","layer":"infrastructure","confidence":0.7,"evidence":["namespace NexusReader.Infrastructure.Mobile","filename suggests mobile/infrastructure responsibilities but class is empty"]},"className":"Class1","methods":[],"types":[{"name":"Class1","kind":"model","line":3,"purpose":"Empty placeholder class in the mobile infrastructure namespace; no behavior or members defined.","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":[],"domainConcepts":[],"keyDetails":"File contains a single empty class (lines 3-6). No methods, fields, registrations, or startup code present.","orchestrationMethods":[],"typedContracts":[{"name":"Class1","kind":"model","line":3,"fieldCount":0,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Class1","line":3,"summary":"model with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Infrastructure.Mobile/Class1.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"e979edc20d8a1aa17b65c98b8dd805269b0918c979a0da53eb2155b8175878ab","sourceByteSize":80,"analyzedAt":"2026-05-23T17:03:28.423Z","technology":"dotnet"}}
@@ -1 +1 @@
{"path":"NexusReader.Infrastructure.Mobile/NexusReader.Infrastructure.Mobile.csproj","purpose":"MSBuild project file for the NexusReader mobile app; defines target platforms, MAUI usage, package and project dependencies, and build-time settings for the mobile application.","classification":{"role":"config","layer":"infrastructure","confidence":0.8,"evidence":["Contains TargetFrameworks and MSBuild conditionals (lines 4-6)","Enables UseMaui and references Microsoft.Maui.Essentials (lines 7-8, 20)","Has a ProjectReference to NexusReader.Application (line 16)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["[object Object]","[object Object]"],"patterns":["MAUI App","Multi-targeting"],"domainConcepts":["Mobile","MAUI","Android","iOS","macCatalyst","Windows"],"keyDetails":"Targets net10.0-android always and conditionally adds net10.0-ios, net10.0-maccatalyst on macOS and net10.0-windows10.0.19041.0 on Windows (lines 4-6). MAUI and MAUI Essentials are enabled (lines 7-8). Implicit usings and nullable are enabled (lines 10-11). Project references Application project (line 16).","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[]}
{"path":"NexusReader.Infrastructure.Mobile/NexusReader.Infrastructure.Mobile.csproj","purpose":"MSBuild project file for the NexusReader.Infrastructure.Mobile MAUI mobile app; declares target frameworks, MAUI usage, a project reference to the Application project, and a NuGet dependency on Microsoft.Maui.Essentials.","classification":{"role":"config","layer":"infrastructure","confidence":0.8,"evidence":["Line 4: <TargetFrameworks>net10.0-android</TargetFrameworks> (defines mobile target)","Line 7: <UseMaui>true</UseMaui> (enables MAUI)","Line 16: <ProjectReference Include=\"..\\NexusReader.Application\\NexusReader.Application.csproj\" /> (references application project)","Line 20: <PackageReference Include=\"Microsoft.Maui.Essentials\" Version=\"10.0.20\" /> (adds MAUI essentials dependency)"]},"className":"","methods":[],"types":[],"serviceRegistrations":[],"startupActions":[],"dependencies":["../NexusReader.Application/NexusReader.Application.csproj","Microsoft.Maui.Essentials (nuget)@10.0.20"],"patterns":["MAUI project","ProjectReference composition","TargetFramework conditional multi-targeting"],"domainConcepts":["Mobile","MAUI","Cross-platform UI"],"keyDetails":"Targets net10.0-android by default (lines 46 include conditional extensions for iOS/MacCatalyst/Windows), enables MAUI and MAUI Essentials (lines 78,20), references the application layer project (line 16). No runtime code present in this file; it configures build and package composition for the mobile infrastructure project.","orchestrationMethods":[],"typedContracts":[],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"c0a3ba820892ceadd5984441955fbef7b0c3b8018a1db07a03287d6a30cfc095","sourceByteSize":997,"analyzedAt":"2026-05-23T17:03:39.587Z","technology":"dotnet"}}

Some files were not shown because too many files have changed in this diff Show More