Files
Nexus.Reader/src/.documentation/domains/application-layer.md
T
2026-05-22 09:04:42 +02:00

421 lines
113 KiB
Markdown

## Application Layer: Commands, Queries and DTOs
Overview: Describes the Application project's command/query patterns, key handlers (ebook ingestion, AI verification, semantic search, reader and user queries), DTO shapes, and mapping/startup registration.
```mermaid
---
config:
flowchart:
defaultRenderer: "elk"
---
flowchart TD
flow_file_nexusreader_application_abstractions_services_iknowledgeservice_cs_file_1["IKnowledgeService"]
flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1["ICommand.cs"]
flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1["ICommandHandler"]
flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1["IQuery.cs"]
flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1["IQueryHandler<TQuery, TResponse>"]
flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1["VerifyGroundednessCommandHandler"]
flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1["IngestEbookCommand"]
flow_file_nexusreader_application_commands_library_ingestebookcommandhandler_cs_file_1["IngestEbookCommandHandler"]
flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1["IngestEbookRequest"]
flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1["SubmitAnswerCommand"]
flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6[/"ICommand"/]
flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10[/"ICommand<TResponse>"/]
flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6[/"ICommandHandler<TCommand>"/]
flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11[/"ICommandHandler<TCommand, TResponse>"/]
flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6[/"IQuery<TResponse>"/]
flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6[/"IQueryHandler"/]
flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7[/"VerifyGroundednessCommand"/]
flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15[/"IngestEbookCommand"/]
flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3[/"IngestEbookRequest"/]
flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5[/"SubmitAnswerCommand"/]
flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1 -->|interface ICommand| flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6
flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1 -->|interface ICommand TResponse>| flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10
flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1 -->|interface ICommandHandler TCommand>| flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6
flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1 -->|interface ICommandHandler TCommand, TResponse>| flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11
flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1 -->|interface IQuery TResponse>| flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6
flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1 -->|interface IQueryHandler| flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6
flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1 -->|command VerifyGroundednessCommand| flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7
flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1 -->|command IngestEbookCommand| flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15
flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1 -->|command IngestEbookRequest| flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3
flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1 -->|command SubmitAnswerCommand| flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5
click flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommand.cs:1:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommand.cs:6:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommand.cs:10:1" "Open source"
click flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs:1:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs:6:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11 href "vscode://file/NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs:11:1" "Open source"
click flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1 href "vscode://file/NexusReader.Application/Abstractions/Messaging/IQuery.cs:1:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6 href "vscode://file/NexusReader.Application/Abstractions/Messaging/IQuery.cs:6:1" "Open source"
click flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1 href "vscode://file/NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs:1:1" "Open source"
click flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6 href "vscode://file/NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs:6:1" "Open source"
click flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1 href "vscode://file/NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs:1:1" "Open source"
click flow_file_nexusreader_application_abstractions_services_iknowledgeservice_cs_file_1 href "vscode://file/NexusReader.Application/Abstractions/Services/IKnowledgeService.cs:1:1" "Open source"
click flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7 href "vscode://file/NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs:7:1" "Open source"
click flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1 href "vscode://file/NexusReader.Application/Commands/Library/IngestEbookCommand.cs:1:1" "Open source"
click flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15 href "vscode://file/NexusReader.Application/Commands/Library/IngestEbookCommand.cs:15:1" "Open source"
click flow_file_nexusreader_application_commands_library_ingestebookcommandhandler_cs_file_1 href "vscode://file/NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs:1:1" "Open source"
click flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1 href "vscode://file/NexusReader.Application/Commands/Library/IngestEbookRequest.cs:1:1" "Open source"
click flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3 href "vscode://file/NexusReader.Application/Commands/Library/IngestEbookRequest.cs:3:1" "Open source"
click flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1 href "vscode://file/NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs:1:1" "Open source"
click flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5 href "vscode://file/NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs:5:1" "Open source"
```
This diagram maps messaging abstractions (ICommand/IQuery and handler interfaces) to concrete commands and handlers such as IngestEbookCommand/Handler and VerifyGroundednessCommandHandler. It shows the ICommand/IQuery generic contracts used by the mediator-like invocation pattern and links IKnowledgeService and DTO request types.
```mermaid
---
config:
flowchart:
defaultRenderer: "elk"
---
flowchart TD
subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"]
end
flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"]
flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88["FindAuthorByNameAsync"]
flow_method_nexusreader_web_client_program_cs_getservice_71["GetService"]
flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15["Program (top-level startup)"]
flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"]
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1["GroundedResponseDto"]
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1["SemanticSearchResultDto"]
flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1["MappingConfig"]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11[/"CitationDto"/]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5[/"GroundedResponseDto"/]
flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3[/"SemanticSearchResultDto"/]
flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20[/"ServiceMapper"/]
flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19[/"TypeAdapterConfig (instance)"/]
flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/]
flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/]
flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/]
flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/]
flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/]
flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/]
flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/]
flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"])
flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1 -->|IMapper| flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20
flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1 -->|TypeAdapterConfig| flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19
flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40
flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33
flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49
flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38
flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18
click flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:5:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:11:1" "Open source"
click flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:3:1" "Open source"
click flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1 href "vscode://file/NexusReader.Application/Mappings/MappingConfig.cs:1:1" "Open source"
click flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19 href "vscode://file/NexusReader.Application/Mappings/MappingConfig.cs:19:1" "Open source"
click flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20 href "vscode://file/NexusReader.Application/Mappings/MappingConfig.cs:20:1" "Open source"
click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 href "vscode://file/NexusReader.Web.Client/Program.cs:15:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_getservice_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source"
```
This startup/service-registration view shows MappingConfig registering mapping adapters and DTO types (GroundedResponseDto, SemanticSearchResultDto). It also shows Program.cs providing platform and knowledge service implementations (WasmKnowledgeService, WebPlatformService) and some test/throwing stubs.
```mermaid
---
config:
flowchart:
defaultRenderer: "elk"
---
flowchart TD
subgraph flow_1_nexusreader_web_client_program_cs["Program.cs"]
end
flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"]
flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88["FindAuthorByNameAsync"]
flow_method_nexusreader_web_client_program_cs_getservice_71["GetService"]
flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15["Program (top-level startup)"]
flow_method_nexusreader_web_client_program_cs_run_wasm_host_59["Run WASM Host"]
flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"]
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1["GroundedResponseDto"]
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1["SemanticSearchResultDto"]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11[/"CitationDto"/]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5[/"GroundedResponseDto"/]
flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3[/"SemanticSearchResultDto"/]
flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/]
flow_type_nexusreader_web_client_program_cs_n_a_55[/"N/A"/]
flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/]
flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/]
flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/]
flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/]
flow_type_nexusreader_web_client_program_cs_wasmepubreader_56[/"WasmEpubReader"/]
flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/]
flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/]
flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"])
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 -->|dto CitationDto| flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 -->|dto GroundedResponseDto| flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 -->|dto SemanticSearchResultDto| flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3
flow_file_nexusreader_web_client_program_cs_file_1 -->|FindAuthorByNameAsync| flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88
flow_file_nexusreader_web_client_program_cs_file_1 -->|GetService| flow_method_nexusreader_web_client_program_cs_getservice_71
flow_file_nexusreader_web_client_program_cs_file_1 -->|Program top-level startup| flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15
flow_file_nexusreader_web_client_program_cs_file_1 -->|unknown| flow_method_nexusreader_web_client_program_cs_run_wasm_host_59
flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40
flow_file_nexusreader_web_client_program_cs_file_1 -->|application services via extension| flow_type_nexusreader_web_client_program_cs_n_a_55
flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74
flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94
flow_file_nexusreader_web_client_program_cs_file_1 -->|IEpubReader| flow_type_nexusreader_web_client_program_cs_wasmepubreader_56
flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38
flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18
flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 -->|Reads repository or persistence state| flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88
flow_method_nexusreader_web_client_program_cs_getservice_71 -->|returns null| flow_action_nexusreader_web_client_program_cs_getservice_return_71_71
click flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:5:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:11:1" "Open source"
click flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:3:1" "Open source"
click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 href "vscode://file/NexusReader.Web.Client/Program.cs:15:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_getservice_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source"
```
Program.cs flow highlights startup vs runtime flows: Run WASM host, FindAuthorByNameAsync reading persistence, and the DTOs bound into mapping. It surfaces which services are provided to the frontend (e.g., WasmEpubReader, WasmKnowledgeService) and where test stubs are used.
```mermaid
flowchart TD
subgraph NexusReader_Web_Client_Program["Program"]
end
flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"]
flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88["FindAuthorByNameAsync"]
flow_method_nexusreader_web_client_program_cs_getservice_71["GetService"]
flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15["Program (top-level startup)"]
flow_method_nexusreader_web_client_program_cs_run_wasm_host_59["Run WASM Host"]
flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"]
flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"])
flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 -->|Reads repository or persistence state| flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88
flow_method_nexusreader_web_client_program_cs_getservice_71 -->|returns null| flow_action_nexusreader_web_client_program_cs_getservice_return_71_71
click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15 href "vscode://file/NexusReader.Web.Client/Program.cs:15:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_getservice_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_method_nexusreader_web_client_program_cs_run_wasm_host_59 href "vscode://file/NexusReader.Web.Client/Program.cs:59:1" "Open source"
```
This control-flow view isolates the key Program methods and shows where repository access occurs (FindAuthorByNameAsync) and that GetService may return null in some contexts. Use this to trace invocation paths for queries.
```mermaid
classDiagram
class flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"]
class flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1["GroundedResponseDto"]
class flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1["SemanticSearchResultDto"]
class flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11["CitationDto"]
class flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5["GroundedResponseDto"]
class flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3["SemanticSearchResultDto"]
class flow_type_nexusreader_web_client_program_cs_configured_httpclient_40["configured HttpClient"]
class flow_type_nexusreader_web_client_program_cs_n_a_55["N/A"]
class flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33["NexusAuthenticationStateProvider"]
class flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74["ThrowingBookStorageService"]
class flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49["ThrowingDbContextFactory"]
class flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61["ThrowingDbContextFactory"]
class flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84["ThrowingEbookRepository"]
class flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66["ThrowingEmbeddingGenerator"]
class flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94["ThrowingSyncBroadcaster"]
class flow_type_nexusreader_web_client_program_cs_wasmepubreader_56["WasmEpubReader"]
class flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38["WasmKnowledgeService"]
class flow_type_nexusreader_web_client_program_cs_webplatformservice_18["WebPlatformService"]
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 --> flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11 : dto CitationDto
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 --> flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5 : dto GroundedResponseDto
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 --> flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3 : dto SemanticSearchResultDto
flow_file_nexusreader_web_client_program_cs_file_1 --> flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 : model ThrowingBookStorageService
flow_file_nexusreader_web_client_program_cs_file_1 --> flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 : model ThrowingDbContextFactory
flow_file_nexusreader_web_client_program_cs_file_1 --> flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 : model ThrowingEbookRepository
flow_file_nexusreader_web_client_program_cs_file_1 --> flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 : model ThrowingEmbeddingGenerator
flow_file_nexusreader_web_client_program_cs_file_1 --> flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 : model ThrowingSyncBroadcaster
click flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:5:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:11:1" "Open source"
click flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:3:1" "Open source"
click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source"
```
This class-diagram view shows DTO classes (GroundedResponseDto, CitationDto, SemanticSearchResultDto) and Program-level service/test doubles. Use it to inspect DTO shapes and which runtime implementations are wired.
```mermaid
---
config:
flowchart:
defaultRenderer: "elk"
---
flowchart LR
subgraph layer_application["application"]
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1["GroundedResponseDto"]
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1["SemanticSearchResultDto"]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11[/"CitationDto"/]
flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5[/"GroundedResponseDto"/]
flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3[/"SemanticSearchResultDto"/]
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 -->|dto CitationDto| flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11
flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 -->|dto GroundedResponseDto| flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5
flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 -->|dto SemanticSearchResultDto| flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3
end
subgraph layer_frontend["frontend"]
flow_file_nexusreader_web_client_program_cs_file_1["Program.cs"]
flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88["Reads repository or persistence state"]
flow_type_nexusreader_web_client_program_cs_configured_httpclient_40[/"configured HttpClient"/]
flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33[/"NexusAuthenticationStateProvider"/]
flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74[/"ThrowingBookStorageService"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61[/"ThrowingDbContextFactory"/]
flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84[/"ThrowingEbookRepository"/]
flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66[/"ThrowingEmbeddingGenerator"/]
flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94[/"ThrowingSyncBroadcaster"/]
flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38[/"WasmKnowledgeService"/]
flow_type_nexusreader_web_client_program_cs_webplatformservice_18[/"WebPlatformService"/]
flow_action_nexusreader_web_client_program_cs_getservice_return_71_71(["returns null"])
flow_file_nexusreader_web_client_program_cs_file_1 -->|uses| flow_type_nexusreader_web_client_program_cs_configured_httpclient_40
flow_file_nexusreader_web_client_program_cs_file_1 -->|NexusAuthenticationStateProvider| flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingBookStorageService| flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74
flow_file_nexusreader_web_client_program_cs_file_1 -->|IDbContextFactory AppDbContext>| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingDbContextFactory| flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEbookRepository| flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingEmbeddingGenerator| flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66
flow_file_nexusreader_web_client_program_cs_file_1 -->|model ThrowingSyncBroadcaster| flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94
flow_file_nexusreader_web_client_program_cs_file_1 -->|IKnowledgeService| flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38
flow_file_nexusreader_web_client_program_cs_file_1 -->|IPlatformService| flow_type_nexusreader_web_client_program_cs_webplatformservice_18
end
click flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:5:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11 href "vscode://file/NexusReader.Application/DTOs/AI/GroundedResponseDto.cs:11:1" "Open source"
click flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:1:1" "Open source"
click flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3 href "vscode://file/NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs:3:1" "Open source"
click flow_file_nexusreader_web_client_program_cs_file_1 href "vscode://file/NexusReader.Web.Client/Program.cs:1:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_getservice_return_71_71 href "vscode://file/NexusReader.Web.Client/Program.cs:71:1" "Open source"
click flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88 href "vscode://file/NexusReader.Web.Client/Program.cs:88:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61 href "vscode://file/NexusReader.Web.Client/Program.cs:61:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66 href "vscode://file/NexusReader.Web.Client/Program.cs:66:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74 href "vscode://file/NexusReader.Web.Client/Program.cs:74:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84 href "vscode://file/NexusReader.Web.Client/Program.cs:84:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94 href "vscode://file/NexusReader.Web.Client/Program.cs:94:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_webplatformservice_18 href "vscode://file/NexusReader.Web.Client/Program.cs:18:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33 href "vscode://file/NexusReader.Web.Client/Program.cs:33:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38 href "vscode://file/NexusReader.Web.Client/Program.cs:38:1" "Open source"
click flow_type_nexusreader_web_client_program_cs_configured_httpclient_40 href "vscode://file/NexusReader.Web.Client/Program.cs:40:1" "Open source"
```
Layer view separates application DTOs from frontend wiring, making it clear which DTOs (AI responses, citations, semantic results) are part of the Application layer and which runtime services the frontend depends on.
```mermaid
flowchart TD
subgraph NexusReader_Infrastructure_RealTime_SyncHub["SyncHub"]
end
subgraph NexusReader_Infrastructure_Services_EpubReaderService["EpubReaderService"]
end
subgraph NexusReader_Infrastructure_Services_BookStorageService["BookStorageService"]
end
flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1["BookStorageService"]
flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1["EpubReaderService"]
flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28["OnConnectedAsync"]
flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38["OnDisconnectedAsync"]
flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14["SyncHub"]
flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19["UpdateProgress"]
flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66["EnsureDirectoryExists"]
flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175["CountWords"]
flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30["Reads repository or persistence state"]
flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40["Reads repository or persistence state"]
flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21["Reads repository or persistence state"]
flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68{"Check directory existence"}
flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177{"Empty text check"}
flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237{"Evaluates branch condition"}
flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1["SyncHub"]
flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237 -->|SyncHub| flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14
flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|OnConnectedAsync| flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28
flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|OnDisconnectedAsync| flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38
flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|UpdateProgress| flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19
flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|EnsureDirectoryExists| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66
flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1 -->|CountWords| flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175
flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30
flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40
flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21
flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 -->|create-directory / noop| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68
flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175 -->|return 0 / continue| flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177
click flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237 href "vscode://file/NexusReader.Web/Program.cs:237:1" "Open source"
click flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:1:1" "Open source"
click flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:14:1" "Open source"
click flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:1:1" "Open source"
click flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:1:1" "Open source"
click flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:19:1" "Open source"
click flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:21:1" "Open source"
click flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:28:1" "Open source"
click flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:30:1" "Open source"
click flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:38:1" "Open source"
click flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:40:1" "Open source"
click flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:175:1" "Open source"
click flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwo
```
Method-flow focuses on SyncHub and infrastructure services used during ingestion and reader progress updates. It shows UpdateProgress/OnConnectedAsync reading persistence and EpubReaderService/BookStorageService guard clauses relevant to ingestion and counting.
### Key Files
- NexusReader.Application/Abstractions/Messaging/ICommand.cs
- NexusReader.Application/Abstractions/Messaging/IQuery.cs
- NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs
- NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs
- NexusReader.Application/Commands/Library/IngestEbookCommand.cs
- NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs
- NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs
- NexusReader.Application/DTOs/AI/GroundedResponseDto.cs
- NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs
- NexusReader.Application/Mappings/MappingConfig.cs
- NexusReader.Web.Client/Program.cs
<div hidden data-ai-mermaid-metadata-appendix>
<script type="application/json" data-ai-mermaid-metadata="0" data-ai-mermaid-diagram-id="dependency_map_graph">{"edges":[{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6_defines_type_6","from":"flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6","relation":"transforms","semanticLabel":"interface ICommand","payload":{"outputSummary":"Marker/contract for a command that produces a FluentResults.Result when handled via MediatR.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10_defines_type_10","from":"flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10","relation":"transforms","semanticLabel":"interface ICommand<TResponse>","payload":{"outputSummary":"Generic command contract that produces a FluentResults.Result<TResponse> when handled via MediatR.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6_defines_type_6","from":"flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6","relation":"transforms","semanticLabel":"interface ICommandHandler<TCommand>","payload":{"outputSummary":"Represents a command handler that processes a command and returns a FluentResults.Result (no data).","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11_defines_type_11","from":"flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11","relation":"transforms","semanticLabel":"interface ICommandHandler<TCommand, TResponse>","payload":{"outputSummary":"Represents a command handler that processes a command and returns a FluentResults.Result with a typed response.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6_defines_type_6","from":"flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6","relation":"transforms","semanticLabel":"interface IQuery<TResponse>","payload":{"outputSummary":"Marker interface representing a CQRS query that returns a Result-wrapped TResponse via MediatR.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1_flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6_defines_type_6","from":"flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1","to":"flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6","relation":"transforms","semanticLabel":"interface IQueryHandler","payload":{"outputSummary":"Generic abstraction for query handlers that process TQuery and return Result<TResponse> via MediatR.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1_flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7_defines_type_7","from":"flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1","to":"flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7","relation":"transforms","semanticLabel":"command VerifyGroundednessCommand","payload":{"outputSummary":"Carries the answer, context, and tenant id for a groundedness verification request through MediatR.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1_flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15_defines_type_15","from":"flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1","to":"flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15","relation":"transforms","semanticLabel":"command IngestEbookCommand","payload":{"outputSummary":"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.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1_flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3_defines_type_3","from":"flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1","to":"flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3","relation":"transforms","semanticLabel":"command IngestEbookRequest","payload":{"outputSummary":"Represents the data required to ingest an ebook: metadata, optional cover image, and the EPUB payload (base64).","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1_flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5_defines_type_5","from":"flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1","to":"flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5","relation":"transforms","semanticLabel":"command SubmitAnswerCommand","payload":{"outputSummary":"Represents a request to submit an answer for a quiz question carrying the selected and correct indices.","expandedLabel":"defines-type"}}],"nodes":[{"id":"flow_file_nexusreader_application_abstractions_messaging_icommand_cs_file_1","kind":"dependency","label":"ICommand.cs","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_6","kind":"dependency","label":"ICommand","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","sourceLine":6},{"id":"flow_type_nexusreader_application_abstractions_messaging_icommand_cs_icommand_tresponse_10","kind":"dependency","label":"ICommand<TResponse>","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommand.cs","sourceLine":10},{"id":"flow_file_nexusreader_application_abstractions_messaging_icommandhandler_cs_file_1","kind":"dependency","label":"ICommandHandler","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_6","kind":"dependency","label":"ICommandHandler<TCommand>","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","sourceLine":6},{"id":"flow_type_nexusreader_application_abstractions_messaging_icommandhandler_cs_icommandhandler_tcommand_tresponse_11","kind":"dependency","label":"ICommandHandler<TCommand, TResponse>","sourcePath":"NexusReader.Application/Abstractions/Messaging/ICommandHandler.cs","sourceLine":11},{"id":"flow_file_nexusreader_application_abstractions_messaging_iquery_cs_file_1","kind":"dependency","label":"IQuery.cs","sourcePath":"NexusReader.Application/Abstractions/Messaging/IQuery.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_abstractions_messaging_iquery_cs_iquery_tresponse_6","kind":"dependency","label":"IQuery<TResponse>","sourcePath":"NexusReader.Application/Abstractions/Messaging/IQuery.cs","sourceLine":6},{"id":"flow_file_nexusreader_application_abstractions_messaging_iqueryhandler_cs_file_1","kind":"dependency","label":"IQueryHandler<TQuery, TResponse>","sourcePath":"NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_abstractions_messaging_iqueryhandler_cs_iqueryhandler_6","kind":"dependency","label":"IQueryHandler","sourcePath":"NexusReader.Application/Abstractions/Messaging/IQueryHandler.cs","sourceLine":6},{"id":"flow_file_nexusreader_application_commands_ai_verifygroundednesscommand_cs_file_1","kind":"dependency","label":"VerifyGroundednessCommandHandler","sourcePath":"NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs","sourceLine":1},{"id":"flow_file_nexusreader_application_abstractions_services_iknowledgeservice_cs_file_1","kind":"service","label":"IKnowledgeService","sourcePath":"NexusReader.Application/Abstractions/Services/IKnowledgeService.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_commands_ai_verifygroundednesscommand_cs_verifygroundednesscommand_7","kind":"dependency","label":"VerifyGroundednessCommand","sourcePath":"NexusReader.Application/Commands/AI/VerifyGroundednessCommand.cs","sourceLine":7},{"id":"flow_file_nexusreader_application_commands_library_ingestebookcommand_cs_file_1","kind":"dependency","label":"IngestEbookCommand","sourcePath":"NexusReader.Application/Commands/Library/IngestEbookCommand.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_commands_library_ingestebookcommand_cs_ingestebookcommand_15","kind":"dependency","label":"IngestEbookCommand","sourcePath":"NexusReader.Application/Commands/Library/IngestEbookCommand.cs","sourceLine":15},{"id":"flow_file_nexusreader_application_commands_library_ingestebookcommandhandler_cs_file_1","kind":"dependency","label":"IngestEbookCommandHandler","sourcePath":"NexusReader.Application/Commands/Library/IngestEbookCommandHandler.cs","sourceLine":1},{"id":"flow_file_nexusreader_application_commands_library_ingestebookrequest_cs_file_1","kind":"dependency","label":"IngestEbookRequest","sourcePath":"NexusReader.Application/Commands/Library/IngestEbookRequest.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_commands_library_ingestebookrequest_cs_ingestebookrequest_3","kind":"dependency","label":"IngestEbookRequest","sourcePath":"NexusReader.Application/Commands/Library/IngestEbookRequest.cs","sourceLine":3},{"id":"flow_file_nexusreader_application_commands_quiz_submitanswercommand_cs_file_1","kind":"dependency","label":"SubmitAnswerCommand","sourcePath":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_commands_quiz_submitanswercommand_cs_submitanswercommand_5","kind":"dependency","label":"SubmitAnswerCommand","sourcePath":"NexusReader.Application/Commands/Quiz/SubmitAnswerCommand.cs","sourceLine":5}]}</script>
<script type="application/json" data-ai-mermaid-metadata="1" data-ai-mermaid-diagram-id="startup_runtime_graph">{"edges":[{"id":"edge_flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1_flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19_registers_service_19","from":"flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1","to":"flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19","relation":"uses","semanticLabel":"TypeAdapterConfig","payload":{"outputSummary":"Registers the global Mapster TypeAdapterConfig instance as a singleton","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1_flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20_registers_service_20","from":"flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1","to":"flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20","relation":"uses","semanticLabel":"IMapper","payload":{"outputSummary":"Registers Mapster ServiceMapper as the application's IMapper implementation","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","relation":"uses","semanticLabel":"IPlatformService","payload":{"outputSummary":"Registers platform abstraction for browser.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","relation":"uses","semanticLabel":"NexusAuthenticationStateProvider","payload":{"outputSummary":"Authentication state provider and wiring to AuthenticationStateProvider.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","relation":"uses","semanticLabel":"IKnowledgeService","payload":{"outputSummary":"Registers a WASM-specific knowledge service implementation.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","relation":"uses","semanticLabel":"HttpClient (named 'NexusAPI')","payload":{"outputSummary":"Adds named HTTP client with base address and authentication header handler.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","relation":"uses","semanticLabel":"IDbContextFactory<AppDbContext>","payload":{"outputSummary":"Registers throw-only stub to avoid using DbContext in WASM.","expandedLabel":"registers-service"}}],"nodes":[{"id":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":5},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","kind":"dependency","label":"CitationDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":11},{"id":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":3},{"id":"flow_file_nexusreader_application_mappings_mappingconfig_cs_file_1","kind":"dependency","label":"MappingConfig","sourcePath":"NexusReader.Application/Mappings/MappingConfig.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_mappings_mappingconfig_cs_typeadapterconfig_instance_19","kind":"dependency","label":"TypeAdapterConfig (instance)","sourcePath":"NexusReader.Application/Mappings/MappingConfig.cs","sourceLine":19},{"id":"flow_type_nexusreader_application_mappings_mappingconfig_cs_servicemapper_20","kind":"dependency","label":"ServiceMapper","sourcePath":"NexusReader.Application/Mappings/MappingConfig.cs","sourceLine":20},{"id":"flow_file_nexusreader_web_client_program_cs_file_1","kind":"service","label":"Program.cs","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":1},{"id":"flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15","kind":"method","label":"Program (top-level startup)","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":15},{"id":"flow_method_nexusreader_web_client_program_cs_getservice_71","kind":"method","label":"GetService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","kind":"return","label":"returns null","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","kind":"method","label":"FindAuthorByNameAsync","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":61},{"id":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","kind":"dependency","label":"ThrowingEmbeddingGenerator","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":66},{"id":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","kind":"dependency","label":"ThrowingBookStorageService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":74},{"id":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","kind":"dependency","label":"ThrowingEbookRepository","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":84},{"id":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","kind":"dependency","label":"ThrowingSyncBroadcaster","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":94},{"id":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","kind":"dependency","label":"WebPlatformService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":18},{"id":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","kind":"dependency","label":"NexusAuthenticationStateProvider","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":33},{"id":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","kind":"dependency","label":"WasmKnowledgeService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":38},{"id":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","kind":"dependency","label":"configured HttpClient","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":40},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":49}]}</script>
<script type="application/json" data-ai-mermaid-metadata="2" data-ai-mermaid-diagram-id="primary_runtime_flow_1_nexusreader_web_client_program_cs">{"edges":[{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5_maps_dto_5","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","relation":"transforms","semanticLabel":"dto GroundedResponseDto","payload":{"outputSummary":"Carries an AI-generated answer and a list of provenance citations back to callers.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11_maps_dto_11","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","relation":"transforms","semanticLabel":"dto CitationDto","payload":{"outputSummary":"Represents a single provenance item (chunk id, snippet, and source) used to justify the answer.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1_flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3_maps_dto_3","from":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","relation":"transforms","semanticLabel":"dto SemanticSearchResultDto","payload":{"outputSummary":"Carries the result of a semantic search (content identifier, snippet, unit type, relevance and optional source/metadata) across application boundaries.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15_invokes_15","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15","relation":"calls","semanticLabel":"Program (top-level startup)","payload":{"outputSummary":"Create the WebAssemblyHostBuilder, register application and platform services, add HTTP client and dummy server-only stubs, then build and run the WASM host.","expandedLabel":"handles-route"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_getservice_71_invokes_71","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_method_nexusreader_web_client_program_cs_getservice_71","relation":"calls","semanticLabel":"GetService","payload":{"outputSummary":"Fallback service resolver stub that always returns null.","expandedLabel":"handles-route"}},{"id":"edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71","from":"flow_method_nexusreader_web_client_program_cs_getservice_71","to":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","relation":"returns","semanticLabel":"returns null","payload":{"outputSummary":"public object? GetService(...) => null","expandedLabel":"returns"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_invokes_88","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","relation":"calls","semanticLabel":"FindAuthorByNameAsync","payload":{"outputSummary":"Repository lookup stub that throws because repository access is unsupported in WASM.","expandedLabel":"handles-route"}},{"id":"edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88","from":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","to":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","relation":"calls","semanticLabel":"Reads repository or persistence state","payload":{"outputSummary":"public Task<Author?> FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);","expandedLabel":"invokes"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","relation":"transforms","semanticLabel":"model ThrowingDbContextFactory","payload":{"outputSummary":"IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","relation":"transforms","semanticLabel":"model ThrowingEmbeddingGenerator","payload":{"outputSummary":"IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","relation":"transforms","semanticLabel":"model ThrowingBookStorageService","payload":{"outputSummary":"IBookStorageService implementation that throws for all file storage operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","relation":"transforms","semanticLabel":"model ThrowingEbookRepository","payload":{"outputSummary":"IEbookRepository implementation that throws for all repository operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","relation":"transforms","semanticLabel":"model ThrowingSyncBroadcaster","payload":{"outputSummary":"ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","relation":"uses","semanticLabel":"IPlatformService","payload":{"outputSummary":"Registers platform abstraction for browser.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","relation":"uses","semanticLabel":"NexusAuthenticationStateProvider","payload":{"outputSummary":"Authentication state provider and wiring to AuthenticationStateProvider.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","relation":"uses","semanticLabel":"IKnowledgeService","payload":{"outputSummary":"Registers a WASM-specific knowledge service implementation.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","relation":"uses","semanticLabel":"HttpClient (named 'NexusAPI')","payload":{"outputSummary":"Adds named HTTP client with base address and authentication header handler.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","relation":"uses","semanticLabel":"IDbContextFactory<AppDbContext>","payload":{"outputSummary":"Registers throw-only stub to avoid using DbContext in WASM.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_n_a_55_registers_service_55","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_n_a_55","relation":"uses","semanticLabel":"application services (via extension)","payload":{"outputSummary":"Calls AddApplication() to register application-layer services.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmepubreader_56_registers_service_56","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_wasmepubreader_56","relation":"uses","semanticLabel":"IEpubReader","payload":{"outputSummary":"Registers WASM epub reader implementation.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_method_nexusreader_web_client_program_cs_run_wasm_host_59_configures_pipeline_59","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_method_nexusreader_web_client_program_cs_run_wasm_host_59","relation":"calls","semanticLabel":"unknown","payload":{"outputSummary":"unknown","expandedLabel":"configures-pipeline"}}],"nodes":[{"id":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":5},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","kind":"dependency","label":"CitationDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":11},{"id":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":3},{"id":"flow_file_nexusreader_web_client_program_cs_file_1","kind":"service","label":"Program.cs","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":1},{"id":"flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15","kind":"method","label":"Program (top-level startup)","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":15},{"id":"flow_method_nexusreader_web_client_program_cs_getservice_71","kind":"method","label":"GetService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","kind":"return","label":"returns null","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","kind":"method","label":"FindAuthorByNameAsync","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":61},{"id":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","kind":"dependency","label":"ThrowingEmbeddingGenerator","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":66},{"id":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","kind":"dependency","label":"ThrowingBookStorageService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":74},{"id":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","kind":"dependency","label":"ThrowingEbookRepository","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":84},{"id":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","kind":"dependency","label":"ThrowingSyncBroadcaster","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":94},{"id":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","kind":"dependency","label":"WebPlatformService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":18},{"id":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","kind":"dependency","label":"NexusAuthenticationStateProvider","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":33},{"id":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","kind":"dependency","label":"WasmKnowledgeService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":38},{"id":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","kind":"dependency","label":"configured HttpClient","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":40},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":49},{"id":"flow_type_nexusreader_web_client_program_cs_n_a_55","kind":"dependency","label":"N/A","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":55},{"id":"flow_type_nexusreader_web_client_program_cs_wasmepubreader_56","kind":"dependency","label":"WasmEpubReader","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":56},{"id":"flow_method_nexusreader_web_client_program_cs_run_wasm_host_59","kind":"method","label":"Run WASM Host","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":59}]}</script>
<script type="application/json" data-ai-mermaid-metadata="3" data-ai-mermaid-diagram-id="control_flow_flow_1_nexusreader_web_client_program_cs">{"edges":[{"id":"edge_flow_method_nexusreader_web_client_program_cs_getservice_71_flow_action_nexusreader_web_client_program_cs_getservice_return_71_71_returns_71","from":"flow_method_nexusreader_web_client_program_cs_getservice_71","to":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","relation":"returns","semanticLabel":"returns null","payload":{"outputSummary":"public object? GetService(...) => null","expandedLabel":"returns"}},{"id":"edge_flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88_flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88_invokes_88","from":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","to":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","relation":"calls","semanticLabel":"Reads repository or persistence state","payload":{"outputSummary":"public Task<Author?> FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default) => throw new NotSupportedException(ErrorMessage);","expandedLabel":"invokes"}}],"nodes":[{"id":"flow_file_nexusreader_web_client_program_cs_file_1","kind":"service","label":"Program.cs","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":1},{"id":"flow_method_nexusreader_web_client_program_cs_program_top_level_startup_15","kind":"method","label":"Program (top-level startup)","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":15},{"id":"flow_method_nexusreader_web_client_program_cs_getservice_71","kind":"method","label":"GetService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","kind":"return","label":"returns null","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_method_nexusreader_web_client_program_cs_findauthorbynameasync_88","kind":"method","label":"FindAuthorByNameAsync","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_method_nexusreader_web_client_program_cs_run_wasm_host_59","kind":"method","label":"Run WASM Host","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":59}]}</script>
<script type="application/json" data-ai-mermaid-metadata="4" data-ai-mermaid-diagram-id="contracts_flow_1_nexusreader_web_client_program_cs">{"edges":[{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5_maps_dto_5","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","relation":"transforms","semanticLabel":"dto GroundedResponseDto","payload":{"outputSummary":"Carries an AI-generated answer and a list of provenance citations back to callers.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11_maps_dto_11","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","relation":"transforms","semanticLabel":"dto CitationDto","payload":{"outputSummary":"Represents a single provenance item (chunk id, snippet, and source) used to justify the answer.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1_flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3_maps_dto_3","from":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","relation":"transforms","semanticLabel":"dto SemanticSearchResultDto","payload":{"outputSummary":"Carries the result of a semantic search (content identifier, snippet, unit type, relevance and optional source/metadata) across application boundaries.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","relation":"transforms","semanticLabel":"model ThrowingDbContextFactory","payload":{"outputSummary":"IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","relation":"transforms","semanticLabel":"model ThrowingEmbeddingGenerator","payload":{"outputSummary":"IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","relation":"transforms","semanticLabel":"model ThrowingBookStorageService","payload":{"outputSummary":"IBookStorageService implementation that throws for all file storage operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","relation":"transforms","semanticLabel":"model ThrowingEbookRepository","payload":{"outputSummary":"IEbookRepository implementation that throws for all repository operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","relation":"transforms","semanticLabel":"model ThrowingSyncBroadcaster","payload":{"outputSummary":"ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.","expandedLabel":"defines-type"}}],"nodes":[{"id":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":5},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","kind":"dependency","label":"CitationDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":11},{"id":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":3},{"id":"flow_file_nexusreader_web_client_program_cs_file_1","kind":"service","label":"Program.cs","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":1},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":61},{"id":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","kind":"dependency","label":"ThrowingEmbeddingGenerator","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":66},{"id":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","kind":"dependency","label":"ThrowingBookStorageService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":74},{"id":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","kind":"dependency","label":"ThrowingEbookRepository","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":84},{"id":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","kind":"dependency","label":"ThrowingSyncBroadcaster","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":94},{"id":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","kind":"dependency","label":"WebPlatformService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":18},{"id":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","kind":"dependency","label":"NexusAuthenticationStateProvider","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":33},{"id":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","kind":"dependency","label":"WasmKnowledgeService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":38},{"id":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","kind":"dependency","label":"configured HttpClient","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":40},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":49},{"id":"flow_type_nexusreader_web_client_program_cs_n_a_55","kind":"dependency","label":"N/A","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":55},{"id":"flow_type_nexusreader_web_client_program_cs_wasmepubreader_56","kind":"dependency","label":"WasmEpubReader","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":56}]}</script>
<script type="application/json" data-ai-mermaid-metadata="5" data-ai-mermaid-diagram-id="layer_flow_1_nexusreader_web_client_program_cs">{"edges":[{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5_maps_dto_5","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","relation":"transforms","semanticLabel":"dto GroundedResponseDto","payload":{"outputSummary":"Carries an AI-generated answer and a list of provenance citations back to callers.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1_flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11_maps_dto_11","from":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","relation":"transforms","semanticLabel":"dto CitationDto","payload":{"outputSummary":"Represents a single provenance item (chunk id, snippet, and source) used to justify the answer.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1_flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3_maps_dto_3","from":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","to":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","relation":"transforms","semanticLabel":"dto SemanticSearchResultDto","payload":{"outputSummary":"Carries the result of a semantic search (content identifier, snippet, unit type, relevance and optional source/metadata) across application boundaries.","expandedLabel":"maps-dto"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61_defines_type_61","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","relation":"transforms","semanticLabel":"model ThrowingDbContextFactory","payload":{"outputSummary":"IDbContextFactory implementation that prevents use of EF DbContext in WASM by throwing on creation.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66_defines_type_66","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","relation":"transforms","semanticLabel":"model ThrowingEmbeddingGenerator","payload":{"outputSummary":"IEmbeddingGenerator implementation that disables local embedding generation in WASM (throws on GenerateAsync).","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74_defines_type_74","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","relation":"transforms","semanticLabel":"model ThrowingBookStorageService","payload":{"outputSummary":"IBookStorageService implementation that throws for all file storage operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84_defines_type_84","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","relation":"transforms","semanticLabel":"model ThrowingEbookRepository","payload":{"outputSummary":"IEbookRepository implementation that throws for all repository operations in WASM.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94_defines_type_94","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","relation":"transforms","semanticLabel":"model ThrowingSyncBroadcaster","payload":{"outputSummary":"ISyncBroadcaster implementation that throws because real-time broadcasting must run on the server.","expandedLabel":"defines-type"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_webplatformservice_18_registers_service_18","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","relation":"uses","semanticLabel":"IPlatformService","payload":{"outputSummary":"Registers platform abstraction for browser.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33_registers_service_33","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","relation":"uses","semanticLabel":"NexusAuthenticationStateProvider","payload":{"outputSummary":"Authentication state provider and wiring to AuthenticationStateProvider.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38_registers_service_38","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","relation":"uses","semanticLabel":"IKnowledgeService","payload":{"outputSummary":"Registers a WASM-specific knowledge service implementation.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_configured_httpclient_40_registers_service_40","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","relation":"uses","semanticLabel":"HttpClient (named 'NexusAPI')","payload":{"outputSummary":"Adds named HTTP client with base address and authentication header handler.","expandedLabel":"registers-service"}},{"id":"edge_flow_file_nexusreader_web_client_program_cs_file_1_flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49_registers_service_49","from":"flow_file_nexusreader_web_client_program_cs_file_1","to":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","relation":"uses","semanticLabel":"IDbContextFactory<AppDbContext>","payload":{"outputSummary":"Registers throw-only stub to avoid using DbContext in WASM.","expandedLabel":"registers-service"}}],"nodes":[{"id":"flow_file_nexusreader_application_dtos_ai_groundedresponsedto_cs_file_1","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_groundedresponsedto_5","kind":"dependency","label":"GroundedResponseDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":5},{"id":"flow_type_nexusreader_application_dtos_ai_groundedresponsedto_cs_citationdto_11","kind":"dependency","label":"CitationDto","sourcePath":"NexusReader.Application/DTOs/AI/GroundedResponseDto.cs","sourceLine":11},{"id":"flow_file_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_file_1","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":1},{"id":"flow_type_nexusreader_application_dtos_ai_semanticsearchresultdto_cs_semanticsearchresultdto_3","kind":"dependency","label":"SemanticSearchResultDto","sourcePath":"NexusReader.Application/DTOs/AI/SemanticSearchResultDto.cs","sourceLine":3},{"id":"flow_file_nexusreader_web_client_program_cs_file_1","kind":"service","label":"Program.cs","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":1},{"id":"flow_action_nexusreader_web_client_program_cs_getservice_return_71_71","kind":"return","label":"returns null","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":71},{"id":"flow_action_nexusreader_web_client_program_cs_findauthorbynameasync_repository_read_88_88","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":88},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_61","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":61},{"id":"flow_type_nexusreader_web_client_program_cs_throwingembeddinggenerator_66","kind":"dependency","label":"ThrowingEmbeddingGenerator","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":66},{"id":"flow_type_nexusreader_web_client_program_cs_throwingbookstorageservice_74","kind":"dependency","label":"ThrowingBookStorageService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":74},{"id":"flow_type_nexusreader_web_client_program_cs_throwingebookrepository_84","kind":"dependency","label":"ThrowingEbookRepository","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":84},{"id":"flow_type_nexusreader_web_client_program_cs_throwingsyncbroadcaster_94","kind":"dependency","label":"ThrowingSyncBroadcaster","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":94},{"id":"flow_type_nexusreader_web_client_program_cs_webplatformservice_18","kind":"dependency","label":"WebPlatformService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":18},{"id":"flow_type_nexusreader_web_client_program_cs_nexusauthenticationstateprovider_33","kind":"dependency","label":"NexusAuthenticationStateProvider","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":33},{"id":"flow_type_nexusreader_web_client_program_cs_wasmknowledgeservice_38","kind":"dependency","label":"WasmKnowledgeService","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":38},{"id":"flow_type_nexusreader_web_client_program_cs_configured_httpclient_40","kind":"dependency","label":"configured HttpClient","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":40},{"id":"flow_type_nexusreader_web_client_program_cs_throwingdbcontextfactory_49","kind":"dependency","label":"ThrowingDbContextFactory","sourcePath":"NexusReader.Web.Client/Program.cs","sourceLine":49}]}</script>
<script type="application/json" data-ai-mermaid-metadata="6" data-ai-mermaid-diagram-id="method_flows_graph">{"edges":[{"id":"edge_flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237_flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14_uses_service_247","from":"flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237","to":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14","relation":"uses","semanticLabel":"SyncHub","payload":{"outputSummary":"Hub mapping for realtime sync","expandedLabel":"uses-service"}},{"id":"edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_invokes_19","from":"flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1","to":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19","relation":"calls","semanticLabel":"UpdateProgress","payload":{"outputSummary":"Receives client progress updates, obtains the calling user id and forwards an UpdateReadingProgressCommand via MediatR when user is present.","expandedLabel":"handles-route"}},{"id":"edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19_flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21_invokes_21","from":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19","to":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21","relation":"calls","semanticLabel":"Reads repository or persistence state","payload":{"outputSummary":"var userId = Context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;","expandedLabel":"invokes"}},{"id":"edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_invokes_28","from":"flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1","to":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28","relation":"calls","semanticLabel":"OnConnectedAsync","payload":{"outputSummary":"When a client connects, adds their connection to a per-user SignalR group (User_{userId}) and calls base connection logic.","expandedLabel":"handles-route"}},{"id":"edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28_flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30_invokes_30","from":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28","to":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30","relation":"calls","semanticLabel":"Reads repository or persistence state","payload":{"outputSummary":"var userId = Context.UserIdentifier;","expandedLabel":"invokes"}},{"id":"edge_flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_invokes_38","from":"flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1","to":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38","relation":"calls","semanticLabel":"OnDisconnectedAsync","payload":{"outputSummary":"When a client disconnects, removes their connection from the per-user SignalR group and invokes base disconnect logic.","expandedLabel":"handles-route"}},{"id":"edge_flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38_flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40_invokes_40","from":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38","to":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40","relation":"calls","semanticLabel":"Reads repository or persistence state","payload":{"outputSummary":"var userId = Context.UserIdentifier;","expandedLabel":"invokes"}},{"id":"edge_flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_invokes_175","from":"flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1","to":"flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175","relation":"calls","semanticLabel":"CountWords","payload":{"outputSummary":"Count words in a string using whitespace separators; returns 0 for null/whitespace.","expandedLabel":"invokes"}},{"id":"edge_flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175_flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177_evaluates_condition_177","from":"flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175","to":"flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177","relation":"calls","semanticLabel":"return 0 / continue","payload":{"outputSummary":"Empty text check","expandedLabel":"evaluates-condition"}},{"id":"edge_flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_invokes_66","from":"flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1","to":"flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66","relation":"calls","semanticLabel":"EnsureDirectoryExists","payload":{"outputSummary":"Checks for directory existence and creates it if missing.","expandedLabel":"invokes"}},{"id":"edge_flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66_flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68_evaluates_condition_68","from":"flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66","to":"flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68","relation":"calls","semanticLabel":"create-directory / noop","payload":{"outputSummary":"if (!Directory.Exists(path)) { Directory.CreateDirectory(path); }","expandedLabel":"evaluates-condition"}}],"nodes":[{"id":"flow_action_nexusreader_web_program_cs_program_top_level_branch_237_237","kind":"step","label":"Evaluates branch condition","sourcePath":"NexusReader.Web/Program.cs","sourceLine":237},{"id":"flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1","kind":"dependency","label":"SyncHub","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":1},{"id":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_synchub_14","kind":"method","label":"SyncHub","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":14},{"id":"flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1","kind":"service","label":"EpubReaderService","sourcePath":"NexusReader.Infrastructure/Services/EpubReaderService.cs","sourceLine":1},{"id":"flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1","kind":"service","label":"BookStorageService","sourcePath":"NexusReader.Infrastructure/Services/BookStorageService.cs","sourceLine":1},{"id":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19","kind":"method","label":"UpdateProgress","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":19},{"id":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":21},{"id":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28","kind":"method","label":"OnConnectedAsync","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":28},{"id":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":30},{"id":"flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38","kind":"method","label":"OnDisconnectedAsync","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":38},{"id":"flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40","kind":"step","label":"Reads repository or persistence state","sourcePath":"NexusReader.Infrastructure/RealTime/SyncHub.cs","sourceLine":40},{"id":"flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175","kind":"method","label":"CountWords","sourcePath":"NexusReader.Infrastructure/Services/EpubReaderService.cs","sourceLine":175},{"id":"flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177","kind":"step","label":"Empty text check","sourcePath":"NexusReader.Infrastructure/Services/EpubReaderService.cs","sourceLine":177},{"id":"flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66","kind":"method","label":"EnsureDirectoryExists","sourcePath":"NexusReader.Infrastructure/Services/BookStorageService.cs","sourceLine":66},{"id":"flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68","kind":"step","label":"Check directory existence","sourcePath":"NexusReader.Infrastructure/Services/BookStorageService.cs","sourceLine":68}]}</script>
</div>
---
## See Also
- [Data Layer, EF Core and Repositories](data-and-persistence.md)
- [Infrastructure Services: Knowledge, AI, Billing, Storage, Epub](infrastructure-services.md)
- [Real-Time Sync, SignalR and Broadcast](../flows/realtime-and-sync.md)
- [Security, Identity and Authorization](../flows/security-identity-auth.md)
- [Blazor WebAssembly Client: hosting, handlers, and platform services](../flows/web-client-wasm.md)
- [MAUI Mobile Host: App wiring and platform services](maui-mobile.md)
- [Project Overview and Architecture](../collections/overview.md)