main 53e84711ff98 cached
682 files
7.3 MB
2.0M tokens
2207 symbols
1 requests
Download .txt
Showing preview only (7,827K chars total). Download the full file or copy to clipboard to get everything.
Repository: microsoft/Document-Knowledge-Mining-Solution-Accelerator
Branch: main
Commit: 53e84711ff98
Files: 682
Total size: 7.3 MB

Directory structure:
gitextract_t4t3jckk/

├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── subtask.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── CI.yml
│       ├── Create-Release.yml
│       ├── azd-template-validation.yml
│       ├── azure-dev.yml
│       ├── broken-links-checker.yml
│       ├── codeql.yml
│       ├── deploy-orchestrator.yml
│       ├── deploy-v2.yml
│       ├── job-cleanup-deployment.yml
│       ├── job-deploy-linux.yml
│       ├── job-deploy.yml
│       ├── job-send-notification.yml
│       ├── pr-title-checker.yml
│       ├── scheduled-Dependabot-PRs-Auto-Merge.yml
│       ├── stale-bot.yml
│       ├── test-automation-v2.yml
│       ├── test-automation.yml
│       └── validate-bicep-params.yml
├── .gitignore
├── App/
│   ├── backend-api/
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── Dockerfile
│   │   ├── Microsoft.GS.DPS/
│   │   │   ├── API/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   └── ChatHost.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   └── KernelMemory.cs
│   │   │   │   └── UserInterface/
│   │   │   │       ├── DataCacheManager.cs
│   │   │   │       └── Documents.cs
│   │   │   ├── Images/
│   │   │   │   └── FileThumbnailService.cs
│   │   │   ├── Microsoft.GS.DPS.csproj
│   │   │   ├── Model/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   ├── Answer.cs
│   │   │   │   │   ├── ChatRequest.cs
│   │   │   │   │   └── ChatResponse.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   ├── AskParameter.cs
│   │   │   │   │   ├── DocumentDeletedResult.cs
│   │   │   │   │   ├── DocumentImportedResult.cs
│   │   │   │   │   ├── DocumentReadyStatusResult.cs
│   │   │   │   │   └── SearchParameter.cs
│   │   │   │   └── UserInterface/
│   │   │   │       ├── DocumentQuerySet.cs
│   │   │   │       ├── Paging.cs
│   │   │   │       └── PagingRequestWithSearch.cs
│   │   │   ├── Prompts/
│   │   │   │   ├── Chat_SystemPrompt.txt
│   │   │   │   └── KeywordExtract_SystemPrompt.txt
│   │   │   └── Storage/
│   │   │       ├── AISearch/
│   │   │       │   └── TagUpdater.cs
│   │   │       ├── ChatSessions/
│   │   │       │   ├── ChatSessionRepository.cs
│   │   │       │   └── Entities/
│   │   │       │       └── ChatSession.cs
│   │   │       ├── Components/
│   │   │       │   ├── BusinessTransactionRepository.cs
│   │   │       │   ├── CosmosDBEntityBase.cs
│   │   │       │   ├── GenericSpecification.cs
│   │   │       │   ├── IDataRepositoryProvider.cs
│   │   │       │   ├── IEntityModel.cs
│   │   │       │   ├── IRepository.cs
│   │   │       │   ├── ISpecification.cs
│   │   │       │   └── MongoEntityCollectionBase.cs
│   │   │       ├── Documents/
│   │   │       │   ├── DocumentRepository.cs
│   │   │       │   ├── Entities/
│   │   │       │   │   └── Document.cs
│   │   │       │   └── QueryResultSet.cs
│   │   │       └── KeywordsSerializer.cs
│   │   ├── Microsoft.GS.DPS.Host/
│   │   │   ├── API/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   └── Chat.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   └── KernelMemory.cs
│   │   │   │   ├── Operation/
│   │   │   │   │   └── Operation.cs
│   │   │   │   └── UserInterface/
│   │   │   │       └── UserInterface.cs
│   │   │   ├── AppConfiguration/
│   │   │   │   ├── AIServices.cs
│   │   │   │   ├── AppConfiguration.cs
│   │   │   │   └── Services.cs
│   │   │   ├── DependencyConfiguration/
│   │   │   │   └── ServiceDependencies.cs
│   │   │   ├── Helpers/
│   │   │   │   ├── AzureCredentialHelper.cs
│   │   │   │   └── TelemetryHelper.cs
│   │   │   ├── Microsoft.GS.DPS.Host.csproj
│   │   │   ├── Program.cs
│   │   │   ├── appsettings.json
│   │   │   └── dpspilot-host.http
│   │   ├── Microsoft.GS.DPS.sln
│   │   ├── RAI/
│   │   │   ├── prompt_chat.txt
│   │   │   ├── prompt_extract_information.txt
│   │   │   └── prompt_get_context_image.txt
│   │   ├── documents/
│   │   │   ├── .$Architecture.drawio.bkp
│   │   │   ├── Architecture.drawio
│   │   │   ├── DPS - Environment.postman_environment.json
│   │   │   └── DPS.postman_collection.json
│   │   └── pipelines/
│   │       └── dspapi_build.yaml
│   ├── frontend-app/
│   │   ├── .dockerignore
│   │   ├── .eslintignore
│   │   ├── .eslintrc.cjs
│   │   ├── .gitignore
│   │   ├── .prettierignore
│   │   ├── .prettierrc.json
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── jest-setup.ts
│   │   ├── jest.config.ts
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── public/
│   │   │   ├── config.env.js
│   │   │   ├── config.js
│   │   │   ├── locales/
│   │   │   │   └── en/
│   │   │   │       └── translation.json
│   │   │   ├── staticwebapp.config.json
│   │   │   └── web.config
│   │   ├── src/
│   │   │   ├── @types/
│   │   │   │   └── react-tiff.d.tsx
│   │   │   ├── App.tsx
│   │   │   ├── AppContext.tsx
│   │   │   ├── AppRoutes.tsx
│   │   │   ├── api/
│   │   │   │   ├── apiTypes/
│   │   │   │   │   ├── chatTypes.ts
│   │   │   │   │   ├── coverImage.ts
│   │   │   │   │   ├── documentResults.ts
│   │   │   │   │   ├── embedded.ts
│   │   │   │   │   └── singleDocument.ts
│   │   │   │   ├── chatService.ts
│   │   │   │   ├── documentsService.ts
│   │   │   │   └── storageService.ts
│   │   │   ├── assets/
│   │   │   │   ├── icons/
│   │   │   │   │   ├── azureIcon.tsx
│   │   │   │   │   ├── gitHubLogoIcon.tsx
│   │   │   │   │   └── mailIcon.tsx
│   │   │   │   └── scss/
│   │   │   │       └── global.scss
│   │   │   ├── components/
│   │   │   │   ├── chat/
│   │   │   │   │   ├── FeedbackForm.tsx
│   │   │   │   │   ├── OptionsPanel.css
│   │   │   │   │   ├── chatRoom.module.scss
│   │   │   │   │   ├── chatRoom.tsx
│   │   │   │   │   ├── modelSwitch.tsx
│   │   │   │   │   ├── optionsPanel.scss
│   │   │   │   │   └── optionsPanel.tsx
│   │   │   │   ├── datePicker/
│   │   │   │   │   ├── customDatePicker.tsx
│   │   │   │   │   └── dateFilterDropdownMenu.tsx
│   │   │   │   ├── dialogConfirm/
│   │   │   │   │   └── dialogConfirm.tsx
│   │   │   │   ├── documentViewer/
│   │   │   │   │   ├── PagesTab.tsx
│   │   │   │   │   ├── aIKnowledgeTab.tsx
│   │   │   │   │   ├── dialogContentComponent.tsx
│   │   │   │   │   ├── dialogTitleBar.tsx
│   │   │   │   │   ├── documentViewer.tsx
│   │   │   │   │   ├── iFrameComponent.tsx
│   │   │   │   │   ├── imageCarousel.tsx
│   │   │   │   │   ├── metadataTable.tsx
│   │   │   │   │   ├── pageNumberTab.tsx
│   │   │   │   │   ├── tableTab.tsx
│   │   │   │   │   └── tempIframe.tsx
│   │   │   │   ├── filter/
│   │   │   │   │   ├── filter.tsx
│   │   │   │   │   └── showHideFilterButton.tsx
│   │   │   │   ├── footer/
│   │   │   │   │   └── footer.tsx
│   │   │   │   ├── header/
│   │   │   │   │   ├── header.test.tsx
│   │   │   │   │   └── header.tsx
│   │   │   │   ├── headerBar/
│   │   │   │   │   └── headerBar.tsx
│   │   │   │   ├── headerMenu/
│   │   │   │   │   └── HeaderMenuTabs.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   └── layout.tsx
│   │   │   │   ├── orderBy/
│   │   │   │   │   └── orderBy.tsx
│   │   │   │   ├── pagination/
│   │   │   │   │   └── pagination.tsx
│   │   │   │   ├── resizer/
│   │   │   │   │   ├── panelResizer.scss
│   │   │   │   │   └── panelResizer.tsx
│   │   │   │   ├── searchBox/
│   │   │   │   │   ├── searchBox.tsx
│   │   │   │   │   └── searchInput.scss
│   │   │   │   ├── searchResult/
│   │   │   │   │   ├── old.tsx
│   │   │   │   │   ├── searchResultCard.scss
│   │   │   │   │   └── searchResultCard.tsx
│   │   │   │   ├── sidecarCopilot/
│   │   │   │   │   ├── sidecar.module.scss
│   │   │   │   │   └── sidecar.tsx
│   │   │   │   ├── snackbar/
│   │   │   │   │   ├── notistackVariants.ts
│   │   │   │   │   ├── snackbarError.tsx
│   │   │   │   │   └── snackbarSuccess.tsx
│   │   │   │   └── uploadButton/
│   │   │   │       ├── uploadButton.tsx
│   │   │   │       └── uploadButton2.tsx
│   │   │   ├── index.scss
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── chat/
│   │   │   │   │   └── chatPage.tsx
│   │   │   │   └── home/
│   │   │   │       ├── home.module.scss
│   │   │   │       └── home.tsx
│   │   │   ├── styles.tsx
│   │   │   ├── types/
│   │   │   │   ├── apiError.ts
│   │   │   │   ├── appRoles.ts
│   │   │   │   ├── facets.ts
│   │   │   │   ├── paged.ts
│   │   │   │   └── searchRequest.ts
│   │   │   ├── utils/
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.ts
│   │   │   │   │   └── roles.ts
│   │   │   │   ├── customHooks/
│   │   │   │   │   └── usePagination.ts
│   │   │   │   ├── httpClient/
│   │   │   │   │   ├── authFetch.ts
│   │   │   │   │   └── httpClient.ts
│   │   │   │   ├── i18n/
│   │   │   │   │   └── i18n.ts
│   │   │   │   ├── mapper/
│   │   │   │   │   └── metadataMapper.ts
│   │   │   │   ├── react/
│   │   │   │   │   ├── misc.ts
│   │   │   │   │   └── useEffectOnce.ts
│   │   │   │   └── telemetry/
│   │   │   │       └── telemetry.ts
│   │   │   └── vite-env.d.ts
│   │   ├── tailwind.config.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── vite.config.ts
│   │   └── vite.config.ts.timestamp-1728339681134-f3f43d813d5c6.mjs
│   └── kernel-memory/
│       ├── .dockerignore
│       ├── .editorconfig
│       ├── .gitattributes
│       ├── .gitignore
│       ├── .vscode/
│       │   ├── launch.json
│       │   ├── settings.json
│       │   └── tasks.json
│       ├── CODE_OF_CONDUCT.md
│       ├── COMMUNITY.md
│       ├── CONTRIBUTING.md
│       ├── Directory.Build.props
│       ├── Directory.Packages.props
│       ├── Dockerfile
│       ├── KernelMemory.sln
│       ├── KernelMemory.sln.DotSettings
│       ├── LICENSE
│       ├── README.md
│       ├── SECURITY.md
│       ├── clients/
│       │   ├── dotnet/
│       │   │   ├── SemanticKernelPlugin/
│       │   │   │   ├── .editorconfig
│       │   │   │   ├── Internals/
│       │   │   │   │   └── TypeConverter.cs
│       │   │   │   ├── MemoryPlugin.cs
│       │   │   │   └── SemanticKernelPlugin.csproj
│       │   │   └── WebClient/
│       │   │       ├── .editorconfig
│       │   │       ├── Internals/
│       │   │       │   └── Verify.cs
│       │   │       ├── MemoryWebClient.cs
│       │   │       ├── StringExtensions.cs
│       │   │       └── WebClient.csproj
│       │   └── python/
│       │       └── .gitignore
│       ├── extensions/
│       │   ├── AWS/
│       │   │   └── S3/
│       │   │       ├── AWSS3Config.cs
│       │   │       ├── AWSS3Storage.cs
│       │   │       ├── DependencyInjection.cs
│       │   │       ├── README.md
│       │   │       └── S3.csproj
│       │   ├── Anthropic/
│       │   │   ├── Anthropic.csproj
│       │   │   ├── AnthropicConfig.cs
│       │   │   ├── AnthropicTextGeneration.cs
│       │   │   ├── Client/
│       │   │   │   ├── CallClaudeStreamingParams.cs
│       │   │   │   ├── ContentBlockDelta.cs
│       │   │   │   ├── ContentResponse.cs
│       │   │   │   ├── Delta.cs
│       │   │   │   ├── Message.cs
│       │   │   │   ├── MessageRequest.cs
│       │   │   │   ├── MessageResponse.cs
│       │   │   │   ├── RawAnthropicClient.cs
│       │   │   │   └── StreamingResponseMessage.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureAIDocIntel/
│       │   │   ├── AzureAIDocIntel.csproj
│       │   │   ├── AzureAIDocIntelConfig.cs
│       │   │   ├── AzureAIDocIntelEngine.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureAISearch/
│       │   │   ├── AzureAISearch/
│       │   │   │   ├── AzureAISearch.csproj
│       │   │   │   ├── AzureAISearchConfig.cs
│       │   │   │   ├── AzureAISearchMemory.cs
│       │   │   │   ├── AzureAISearchMemoryException.cs
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   └── Internals/
│       │   │   │       ├── .editorconfig
│       │   │   │       ├── AzureAISearchFiltering.cs
│       │   │   │       ├── AzureAISearchMemoryRecord.cs
│       │   │   │       ├── MemoryDbField.cs
│       │   │   │       └── MemoryDbSchema.cs
│       │   │   └── README.md
│       │   ├── AzureBlobs/
│       │   │   ├── AzureBlobs.csproj
│       │   │   ├── AzureBlobsConfig.cs
│       │   │   ├── AzureBlobsStorage.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureOpenAI/
│       │   │   ├── AzureOpenAI.csproj
│       │   │   ├── AzureOpenAIConfig.cs
│       │   │   ├── AzureOpenAITextEmbeddingGenerator.cs
│       │   │   ├── AzureOpenAITextGenerator.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   ├── Internals/
│       │   │   │   └── SequentialDelayStrategy.cs
│       │   │   └── README.md
│       │   ├── AzureQueues/
│       │   │   ├── AzureQueues.csproj
│       │   │   ├── AzureQueuesConfig.cs
│       │   │   ├── AzureQueuesPipeline.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── Discord/
│       │   │   └── Discord/
│       │   │       ├── Discord.csproj
│       │   │       ├── DiscordConnector.cs
│       │   │       ├── DiscordConnectorConfig.cs
│       │   │       └── DiscordMessage.cs
│       │   ├── Elasticsearch/
│       │   │   ├── Elasticsearch/
│       │   │   │   ├── CREDITS.txt
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Elasticsearch.csproj
│       │   │   │   ├── ElasticsearchConfig.cs
│       │   │   │   ├── ElasticsearchConfigBuilder.cs
│       │   │   │   ├── ElasticsearchMemory.cs
│       │   │   │   ├── Exceptions/
│       │   │   │   │   ├── ElasticsearchException.cs
│       │   │   │   │   └── InvalidIndexNameException.cs
│       │   │   │   └── Internals/
│       │   │   │       ├── ElasticsearchConfigExtensions.cs
│       │   │   │       ├── ElasticsearchMemoryRecord.cs
│       │   │   │       ├── ElasticsearchTag.cs
│       │   │   │       ├── IndexNameHelper.cs
│       │   │   │       └── MemoryFilterExtensions.cs
│       │   │   └── README.md
│       │   ├── LlamaSharp/
│       │   │   ├── LlamaSharp/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── LlamaSharp.csproj
│       │   │   │   ├── LlamaSharpConfig.cs
│       │   │   │   └── LlamaSharpTextGenerator.cs
│       │   │   └── README.md
│       │   ├── MongoDbAtlas/
│       │   │   ├── Docker/
│       │   │   │   ├── Local6/
│       │   │   │   │   ├── Dockerfile
│       │   │   │   │   └── startatlas6.sh
│       │   │   │   └── Local7/
│       │   │   │       ├── Dockerfile
│       │   │   │       └── startatlas.sh
│       │   │   ├── MongoDbAtlas/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── MongoDbAtlasDatabaseHelper.cs
│       │   │   │   │   ├── MongoDbAtlasMemoryRecord.cs
│       │   │   │   │   └── MongoDbAtlasSearchHelper.cs
│       │   │   │   ├── MongoDbAtlas.csproj
│       │   │   │   ├── MongoDbAtlasBaseStorage.cs
│       │   │   │   ├── MongoDbAtlasConfig.cs
│       │   │   │   ├── MongoDbAtlasException.cs
│       │   │   │   ├── MongoDbAtlasMemory.cs
│       │   │   │   └── MongoDbAtlasStorage.cs
│       │   │   └── README.md
│       │   ├── OpenAI/
│       │   │   ├── OpenAI/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── ChangeEndpointPolicy.cs
│       │   │   │   │   ├── OpenAIClientBuilder.cs
│       │   │   │   │   └── SequentialDelayStrategy.cs
│       │   │   │   ├── OpenAI.csproj
│       │   │   │   ├── OpenAIConfig.cs
│       │   │   │   ├── OpenAITextEmbeddingGenerator.cs
│       │   │   │   ├── OpenAITextGenerator.cs
│       │   │   │   └── Tokenizers/
│       │   │   │       ├── DefaultGPTTokenizer.cs
│       │   │   │       ├── GPT2Tokenizer.cs
│       │   │   │       ├── GPT3Tokenizer.cs
│       │   │   │       ├── GPT4Tokenizer.cs
│       │   │   │       └── GPT4oTokenizer.cs
│       │   │   └── README.md
│       │   ├── Postgres/
│       │   │   ├── Postgres/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── PostgresDbClient.cs
│       │   │   │   │   ├── PostgresMemoryRecord.cs
│       │   │   │   │   └── PostgresSchema.cs
│       │   │   │   ├── Postgres.csproj
│       │   │   │   ├── PostgresConfig.cs
│       │   │   │   ├── PostgresException.cs
│       │   │   │   ├── PostgresMemory.cs
│       │   │   │   └── PostgresMemoryFilter.cs
│       │   │   └── README.md
│       │   ├── Qdrant/
│       │   │   ├── Qdrant/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── DefaultQdrantPayload.cs
│       │   │   │   │   ├── Http/
│       │   │   │   │   │   ├── CreateCollectionRequest.cs
│       │   │   │   │   │   ├── DeleteCollectionRequest.cs
│       │   │   │   │   │   ├── DeleteVectorsRequest.cs
│       │   │   │   │   │   ├── Filter.cs
│       │   │   │   │   │   ├── GetCollectionRequest.cs
│       │   │   │   │   │   ├── GetVectorsRequest.cs
│       │   │   │   │   │   ├── GetVectorsResponse.cs
│       │   │   │   │   │   ├── HttpRequest.cs
│       │   │   │   │   │   ├── ListCollectionsRequest.cs
│       │   │   │   │   │   ├── ListCollectionsResponse.cs
│       │   │   │   │   │   ├── QdrantResponse.cs
│       │   │   │   │   │   ├── ScrollVectorsRequest.cs
│       │   │   │   │   │   ├── ScrollVectorsResponse.cs
│       │   │   │   │   │   ├── SearchVectorsRequest.cs
│       │   │   │   │   │   ├── SearchVectorsResponse.cs
│       │   │   │   │   │   ├── UpsertVectorRequest.cs
│       │   │   │   │   │   └── UpsertVectorResponse.cs
│       │   │   │   │   ├── QdrantClient.cs
│       │   │   │   │   ├── QdrantConstants.cs
│       │   │   │   │   ├── QdrantDistanceType.cs
│       │   │   │   │   └── QdrantPoint.cs
│       │   │   │   ├── Qdrant.csproj
│       │   │   │   ├── QdrantConfig.cs
│       │   │   │   ├── QdrantException.cs
│       │   │   │   └── QdrantMemory.cs
│       │   │   └── README.md
│       │   ├── RabbitMQ/
│       │   │   ├── DependencyInjection.cs
│       │   │   ├── README.md
│       │   │   ├── RabbitMQ.csproj
│       │   │   ├── RabbitMQPipeline.cs
│       │   │   └── RabbitMqConfig.cs
│       │   ├── Redis/
│       │   │   ├── README.md
│       │   │   └── Redis/
│       │   │       ├── DependencyInjection.cs
│       │   │       ├── Internals/
│       │   │       │   ├── .editorconfig
│       │   │       │   ├── RedisEmbeddingExtensions.cs
│       │   │       │   └── Scripts.cs
│       │   │       ├── Redis.csproj
│       │   │       ├── RedisConfig.cs
│       │   │       ├── RedisException.cs
│       │   │       └── RedisMemory.cs
│       │   └── SQLServer/
│       │       ├── README.md
│       │       └── SQLServer/
│       │           ├── DependencyInjection.cs
│       │           ├── SQLServer.csproj
│       │           ├── SqlServerConfig.cs
│       │           ├── SqlServerMemory.cs
│       │           └── SqlServerMemoryException.cs
│       ├── nuget.config
│       ├── pipelines/
│       │   └── km_build.yaml
│       ├── service/
│       │   ├── Abstractions/
│       │   │   ├── AI/
│       │   │   │   ├── Embedding.cs
│       │   │   │   ├── ITextEmbeddingBatchGenerator.cs
│       │   │   │   ├── ITextEmbeddingGenerator.cs
│       │   │   │   ├── ITextGenerator.cs
│       │   │   │   ├── ITextTokenizer.cs
│       │   │   │   └── TextGenerationOptions.cs
│       │   │   ├── Abstractions.csproj
│       │   │   ├── AppBuilders/
│       │   │   │   ├── ServiceCollectionExtensions.cs
│       │   │   │   └── ServiceCollectionPool.cs
│       │   │   ├── Configuration/
│       │   │   │   ├── ConfigurationException.cs
│       │   │   │   ├── ConfigurationExtensions.cs
│       │   │   │   └── TextPartitioningOptions.cs
│       │   │   ├── Constants.cs
│       │   │   ├── Context/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── IContext.cs
│       │   │   │   ├── IContextProvider.cs
│       │   │   │   ├── RequestContext.cs
│       │   │   │   └── RequestContextProvider.cs
│       │   │   ├── DataFormats/
│       │   │   │   ├── FileContent.cs
│       │   │   │   ├── FileSection.cs
│       │   │   │   ├── IContentDecoder.cs
│       │   │   │   ├── IOcrEngine.cs
│       │   │   │   └── WebPages/
│       │   │   │       ├── IWebScraper.cs
│       │   │   │       └── WebScraperResult.cs
│       │   │   ├── Diagnostics/
│       │   │   │   ├── ArgumentNullExceptionEx.cs
│       │   │   │   ├── ArgumentOutOfRangeExceptionEx.cs
│       │   │   │   ├── DefaultLogger.cs
│       │   │   │   └── Telemetry.cs
│       │   │   ├── DocumentStorage/
│       │   │   │   ├── DocumentStorageException.cs
│       │   │   │   ├── EmbeddingFileContent.cs
│       │   │   │   └── IDocumentStorage.cs
│       │   │   ├── IKernelMemory.cs
│       │   │   ├── IKernelMemoryBuilder.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── KernelMemoryException.cs
│       │   │   ├── KernelMemoryExtensions.cs
│       │   │   ├── KernelMemoryWebException.cs
│       │   │   ├── MemoryStorage/
│       │   │   │   ├── IMemoryDb.cs
│       │   │   │   ├── IMemoryDbUpsertBatch.cs
│       │   │   │   ├── IndexNotFoundException.cs
│       │   │   │   └── MemoryRecord.cs
│       │   │   ├── Models/
│       │   │   │   ├── .editorconfig
│       │   │   │   ├── Citation.cs
│       │   │   │   ├── DataPipelineStatus.cs
│       │   │   │   ├── DeleteAccepted.cs
│       │   │   │   ├── Document.cs
│       │   │   │   ├── DocumentUploadRequest.cs
│       │   │   │   ├── FileCollection.cs
│       │   │   │   ├── IndexCollection.cs
│       │   │   │   ├── IndexDetails.cs
│       │   │   │   ├── MemoryAnswer.cs
│       │   │   │   ├── MemoryFilter.cs
│       │   │   │   ├── MemoryQuery.cs
│       │   │   │   ├── SearchQuery.cs
│       │   │   │   ├── SearchResult.cs
│       │   │   │   ├── StreamableFileContent.cs
│       │   │   │   ├── TagCollection.cs
│       │   │   │   ├── TagCollectionExtensions.cs
│       │   │   │   └── UploadAccepted.cs
│       │   │   ├── Pipeline/
│       │   │   │   ├── DataPipeline.cs
│       │   │   │   ├── DataPipelinePointer.cs
│       │   │   │   ├── IPipelineOrchestrator.cs
│       │   │   │   ├── IPipelineStepHandler.cs
│       │   │   │   ├── MimeTypes.cs
│       │   │   │   ├── OrchestrationException.cs
│       │   │   │   ├── PipelineException.cs
│       │   │   │   └── Queue/
│       │   │   │       ├── AsyncMessageHandler.cs
│       │   │   │       ├── IQueue.cs
│       │   │   │       ├── QueueClientFactory.cs
│       │   │   │       └── QueueOptions.cs
│       │   │   ├── Prompts/
│       │   │   │   └── IPromptProvider.cs
│       │   │   ├── Search/
│       │   │   │   ├── ISearchClient.cs
│       │   │   │   └── SearchClientConfig.cs
│       │   │   └── SemanticKernel/
│       │   │       ├── .editorconfig
│       │   │       ├── KernelFunctionExtensions.cs
│       │   │       └── TextEmbeddingGenerationExtensions.cs
│       │   ├── Core/
│       │   │   ├── AI/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── NoEmbeddingGenerator.cs
│       │   │   │   └── NoTextGenerator.cs
│       │   │   ├── Configuration/
│       │   │   │   ├── HandlerConfig.cs
│       │   │   │   ├── InternalConstants.cs
│       │   │   │   ├── KernelMemoryConfig.cs
│       │   │   │   ├── ServiceAuthorizationConfig.cs
│       │   │   │   └── ServiceConfig.cs
│       │   │   ├── Core.csproj
│       │   │   ├── DataFormats/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Image/
│       │   │   │   │   ├── ImageContextDecoder.cs
│       │   │   │   │   └── ImageDecoder.cs
│       │   │   │   ├── Office/
│       │   │   │   │   ├── MsExcelDecoder.cs
│       │   │   │   │   ├── MsExcelDecoderConfig.cs
│       │   │   │   │   ├── MsPowerPointDecoder.cs
│       │   │   │   │   ├── MsPowerPointDecoderConfig.cs
│       │   │   │   │   └── MsWordDecoder.cs
│       │   │   │   ├── Pdf/
│       │   │   │   │   ├── PdfDecoder.cs
│       │   │   │   │   └── PdfMarkdownDecoder.cs
│       │   │   │   ├── Text/
│       │   │   │   │   ├── MarkDownDecoder.cs
│       │   │   │   │   ├── TextChunker.cs
│       │   │   │   │   └── TextDecoder.cs
│       │   │   │   └── WebPages/
│       │   │   │       ├── HtmlDecoder.cs
│       │   │   │       └── WebScraper.cs
│       │   │   ├── Diagnostics/
│       │   │   │   ├── LoggerExtensions.cs
│       │   │   │   ├── PipelineCompletedException.cs
│       │   │   │   └── Verify.cs
│       │   │   ├── DocumentStorage/
│       │   │   │   └── DevTools/
│       │   │   │       ├── DependencyInjection.cs
│       │   │   │       ├── SimpleFileStorage.cs
│       │   │   │       └── SimpleFileStorageConfig.cs
│       │   │   ├── Extensions/
│       │   │   │   └── BinaryDataExtensions.cs
│       │   │   ├── FileSystem/
│       │   │   │   └── DevTools/
│       │   │   │       ├── DiskFileSystem.cs
│       │   │   │       ├── FileSystemTypes.cs
│       │   │   │       ├── IFileSystem.cs
│       │   │   │       ├── StreamExtensions.cs
│       │   │   │       ├── StringExtensions.cs
│       │   │   │       └── VolatileFileSystem.cs
│       │   │   ├── Handlers/
│       │   │   │   ├── DeleteDocumentHandler.cs
│       │   │   │   ├── DeleteGeneratedFilesHandler.cs
│       │   │   │   ├── DeleteIndexHandler.cs
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── GenerateEmbeddingsHandler.cs
│       │   │   │   ├── GenerateEmbeddingsHandlerBase.cs
│       │   │   │   ├── GenerateEmbeddingsParallelHandler.cs
│       │   │   │   ├── HandlerAsAHostedService.cs
│       │   │   │   ├── HandlerTypeLoader.cs
│       │   │   │   ├── KeywordExtractingHandler.cs
│       │   │   │   ├── SaveRecordsHandler.cs
│       │   │   │   ├── SummarizationHandler.cs
│       │   │   │   ├── SummarizationParallelHandler.cs
│       │   │   │   ├── TextExtractionHandler.cs
│       │   │   │   └── TextPartitioningHandler.cs
│       │   │   ├── KernelMemoryBuilder.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── MemoryServerless.cs
│       │   │   ├── MemoryService.cs
│       │   │   ├── MemoryStorage/
│       │   │   │   ├── DevTools/
│       │   │   │   │   ├── DependencyInjection.cs
│       │   │   │   │   ├── SimpleTextDb.cs
│       │   │   │   │   ├── SimpleTextDbConfig.cs
│       │   │   │   │   ├── SimpleVectorDb.cs
│       │   │   │   │   ├── SimpleVectorDbConfig.cs
│       │   │   │   │   └── SimpleVectorDbException.cs
│       │   │   │   └── MemoryRecordExtensions.cs
│       │   │   ├── Models/
│       │   │   │   └── IndexName.cs
│       │   │   ├── Pipeline/
│       │   │   │   ├── BaseOrchestrator.cs
│       │   │   │   ├── DistributedPipelineOrchestrator.cs
│       │   │   │   ├── InProcessPipelineOrchestrator.cs
│       │   │   │   └── Queue/
│       │   │   │       └── DevTools/
│       │   │   │           ├── DependencyInjection.cs
│       │   │   │           ├── SimpleQueues.cs
│       │   │   │           └── SimpleQueuesConfig.cs
│       │   │   ├── Prompts/
│       │   │   │   ├── EmbeddedPromptProvider.cs
│       │   │   │   ├── PromptUtils.cs
│       │   │   │   ├── answer-with-facts.txt
│       │   │   │   ├── extract-keywords.txt
│       │   │   │   └── summarize.txt
│       │   │   ├── Search/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   └── SearchClient.cs
│       │   │   ├── SemanticKernel/
│       │   │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   │   ├── SemanticKernelConfig.cs
│       │   │   │   ├── SemanticKernelTextEmbeddingGenerator.cs
│       │   │   │   └── SemanticKernelTextGenerator.cs
│       │   │   └── ServiceCollectionExtensions.cs
│       │   ├── Service/
│       │   │   ├── .editorconfig
│       │   │   ├── Auth/
│       │   │   │   └── HttpAuthHandler.cs
│       │   │   ├── ConfigurationBuilderExtensions.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── OpenAPI.cs
│       │   │   ├── Program.cs
│       │   │   ├── README.md
│       │   │   ├── Service.csproj
│       │   │   ├── Service.sln
│       │   │   ├── ServiceConfiguration.cs
│       │   │   ├── appsettings.json
│       │   │   ├── run.cmd
│       │   │   ├── run.sh
│       │   │   ├── setup.cmd
│       │   │   └── setup.sh
│       │   └── Service.AspNetCore/
│       │       ├── Models/
│       │       │   ├── HttpDocumentUploadRequest.cs
│       │       │   └── HttpDocumentUploadRequestExtensions.cs
│       │       ├── Service.AspNetCore.csproj
│       │       ├── WebAPIEndpoints.cs
│       │       └── WebApplicationBuilderExtensions.cs
│       └── tools/
│           ├── AzureBlobUpload/
│           │   ├── AzureBlobUpload.csproj
│           │   ├── Program.cs
│           │   ├── Properties/
│           │   │   └── .gitignore
│           │   ├── build.sh
│           │   └── upload.sh
│           ├── InteractiveSetup/
│           │   ├── AppSettings.cs
│           │   ├── Context.cs
│           │   ├── InteractiveSetup.csproj
│           │   ├── Main.cs
│           │   ├── Service/
│           │   │   ├── KMService.cs
│           │   │   ├── Logger.cs
│           │   │   └── Webservice.cs
│           │   ├── Services/
│           │   │   ├── AWSS3.cs
│           │   │   ├── AzureAIDocIntel.cs
│           │   │   ├── AzureAISearch.cs
│           │   │   ├── AzureBlobs.cs
│           │   │   ├── AzureOpenAIEmbedding.cs
│           │   │   ├── AzureOpenAIText.cs
│           │   │   ├── AzureQueue.cs
│           │   │   ├── LlamaSharp.cs
│           │   │   ├── MongoDbAtlasDocumentStorage.cs
│           │   │   ├── MongoDbAtlasMemoryDb.cs
│           │   │   ├── OpenAI.cs
│           │   │   ├── Postgres.cs
│           │   │   ├── Qdrant.cs
│           │   │   ├── RabbitMQ.cs
│           │   │   ├── Redis.cs
│           │   │   ├── SimpleFileStorage.cs
│           │   │   ├── SimpleQueues.cs
│           │   │   └── SimpleVectorDb.cs
│           │   ├── SetupException.cs
│           │   └── UI/
│           │       ├── Answer.cs
│           │       ├── BoundedBoolean.cs
│           │       ├── DictionaryExtensions.cs
│           │       ├── QuestionWithOptions.cs
│           │       └── SetupUI.cs
│           ├── README.md
│           ├── ask.sh
│           ├── dev/
│           │   ├── build.sh
│           │   ├── changes-since-last-release.sh
│           │   ├── create-azure-webapp-publish-artifacts.sh
│           │   └── run-unit-tests.sh
│           ├── run-elasticsearch.sh
│           ├── run-km-service.sh
│           ├── run-mongodb-atlas.sh
│           ├── run-mssql.sh
│           ├── run-qdrant.sh
│           ├── run-rabbitmq.sh
│           ├── run-redis.sh
│           ├── run-s3ninja.sh
│           ├── search.sh
│           ├── setup-km-service.sh
│           └── upload-file.sh
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Deployment/
│   ├── .gitignore
│   ├── appconfig/
│   │   ├── aiservice/
│   │   │   ├── appconfig.jsonl
│   │   │   └── appsettings.Development.json.template
│   │   └── kernelmemory/
│   │       └── appsettings.Development.json.template
│   ├── checkquota.ps1
│   ├── kubernetes/
│   │   ├── deploy.certclusterissuer.yaml.template
│   │   ├── deploy.deployment.yaml.template
│   │   ├── deploy.ingress.waf.yaml.template
│   │   ├── deploy.ingress.yaml.template
│   │   ├── deploy.networkpolicy.yaml.template
│   │   ├── deploy.service.yaml
│   │   └── enable_approuting.psm1
│   ├── quota_check_params.sh
│   ├── resourcePrefix.bicep
│   ├── resourcedeployment.ps1
│   ├── send-filestoendpoint.psm1
│   ├── uploadfiles.ps1
│   └── validate_bicep_params.py
├── LICENSE
├── README.md
├── SECURITY.md
├── SUPPORT.md
├── TRANSPARENCY_FAQ.md
├── azure.yaml
├── docs/
│   ├── AVMPostDeploymentGuide.md
│   ├── AzureAIModelQuotaSettings.md
│   ├── AzureAccountSetUp.md
│   ├── CustomizingAzdParameters.md
│   ├── DataProcessing.md
│   ├── DeleteResourceGroup.md
│   ├── DeploymentGuide.md
│   ├── LocalDevelopmentSetup.md
│   ├── LogAnalyticsReplicationDisable.md
│   ├── PowershellSetup.md
│   ├── QuotaCheck.md
│   ├── SampleQuestions.md
│   ├── TechnicalArchitecture.md
│   ├── TroubleShootingSteps.md
│   └── re-use-log-analytics.md
├── infra/
│   ├── README.md
│   ├── build-main.json.sh
│   ├── main.bicep
│   ├── main.json
│   ├── main.parameters.json
│   ├── main.waf.parameters.json
│   └── modules/
│       ├── container-registry.bicep
│       └── virtualNetwork.bicep
└── tests/
    └── e2e-test/
        ├── .gitignore
        ├── README.md
        ├── base/
        │   ├── __init__.py
        │   └── base.py
        ├── config/
        │   └── constants.py
        ├── pages/
        │   ├── __init__.py
        │   ├── dkmPage.py
        │   └── loginPage.py
        ├── pytest.ini
        ├── requirements.txt
        ├── sample_dotenv_file.txt
        └── tests/
            ├── __init__.py
            ├── conftest.py
            ├── test_dkm_functional.py
            └── test_poc_dkm.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/CODEOWNERS
================================================
# Lines starting with '#' are comments.
# Each line is a file pattern followed by one or more owners.

# These owners will be the default owners for everything in the repo.
* @Avijit-Microsoft @Roopan-Microsoft @Prajwal-Microsoft @dongbumlee @Vinay-Microsoft @aniaroramsft @toherman-msft @nchandhi @dgp10801


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

# Describe the bug
A clear and concise description of what the bug is.

# Expected behavior
A clear and concise description of what you expected to happen.

# How does this bug make you feel?
_Share a gif from [giphy](https://giphy.com/) to tells us how you'd feel_

---

# Debugging information

## Steps to reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

## Screenshots
If applicable, add screenshots to help explain your problem.

## Logs

If applicable, add logs to help the engineer debug the problem.

---

# Tasks

_To be filled in by the engineer picking up the issue_

- [ ] Task 1
- [ ] Task 2
- [ ] ...


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''

---

# Motivation

A clear and concise description of why this feature would be useful and the value it would bring.
Explain any alternatives considered and why they are not sufficient.

# How would you feel if this feature request was implemented?

_Share a gif from [giphy](https://giphy.com/) to tells us how you'd feel. Format: ![alt_text](https://media.giphy.com/media/xxx/giphy.gif)_

# Requirements

A list of requirements to consider this feature delivered
- Requirement 1
- Requirement 2
- ...

# Tasks

_To be filled in by the engineer picking up the issue_

- [ ] Task 1
- [ ] Task 2
- [ ] ...


================================================
FILE: .github/ISSUE_TEMPLATE/subtask.md
================================================
---
name: Sub task
about: A sub task
title: ''
labels: subtask
assignees: ''

---

Required by <link to parent issue>

# Description

A clear and concise description of what this subtask is.

# Tasks

_To be filled in by the engineer picking up the subtask

- [ ] Task 1
- [ ] Task 2
- [ ] ...


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Purpose
<!-- Describe the intention of the changes being proposed. What problem does it solve or functionality does it add? -->
* ...

## Does this introduce a breaking change?
<!-- Mark one with an "x". -->

- [ ] Yes
- [ ] No

<!-- Please prefix your PR title with one of the following:
  * `feat`: A new feature
  * `fix`: A bug fix
  * `docs`: Documentation only changes
  * `style`: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  * `refactor`: A code change that neither fixes a bug nor adds a feature
  * `perf`: A code change that improves performance
  * `test`: Adding missing tests or correcting existing tests
  * `build`: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
  * `ci`: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
  * `chore`: Other changes that don't modify src or test files
  * `revert`: Reverts a previous commit
  * !: A breaking change is indicated with a `!` after the listed prefixes above, e.g. `feat!`, `fix!`, `refactor!`, etc.
-->

## Golden Path Validation
- [ ] I have tested the primary workflows (the "golden path") to ensure they function correctly without errors.

## Deployment Validation
- [ ] I have validated the deployment process successfully and all services are running as expected with this change.

## What to Check
Verify that the following are valid
* ...

## Other Information
<!-- Add any other helpful information that may be needed here. -->


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# For more details, refer to the documentation:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  # GitHub Actions dependencies (grouped)
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      all-actions:
        patterns:
          - "*"

  # .NET NuGet dependencies (grouped)
  - package-ecosystem: "nuget"
    directory: "/App/backend-api/Microsoft.GS.DPS"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      nuget-deps:
        patterns:
          - "*"

  - package-ecosystem: "nuget"
    directory: "/App/backend-api/Microsoft.GS.DPS.Host"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      nuget-deps:
        patterns:
          - "*"

  - package-ecosystem: "nuget"
    directory: "/App/kernel-memory/clients/dotnet/SemanticKernelPlugin"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      nuget-deps:
        patterns:
          - "*"

  - package-ecosystem: "nuget"
    directory: "/App/kernel-memory/clients/dotnet/WebClient"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      nuget-deps:
        patterns:
          - "*"

  # npm dependencies for Frontend App (grouped)
  - package-ecosystem: "npm"
    directory: "/App/frontend-app"
    schedule:
      interval: "monthly"
    commit-message:
      prefix: "build"
    target-branch: "dependabotchanges"
    open-pull-requests-limit: 10
    groups:
      frontend-deps:
        patterns:
          - "*"

================================================
FILE: .github/workflows/CI.yml
================================================
name: Deploy-Test-Cleanup Pipeline
on:
  push:
    branches:
      - main # Adjust this to the branch you want to trigger the deployment on
      - dev
      - demo
    paths:
      - 'infra/**'
      - 'App/**'
      - 'Deployment/**'
      - 'azure.yaml'
      - '.github/workflows/CI.yml'
      - '.github/workflows/test-automation.yml'
      - 'tests/**'
  schedule:
    - cron: "0 10,22 * * *" # Runs at 10:00 AM and 10:00 PM GMT
permissions:
  id-token: write
  contents: read
  actions: read
env:
  GPT_CAPACITY: 150
  TEXT_EMBEDDING_CAPACITY: 200

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    outputs:
      RESOURCE_GROUP_NAME: ${{ steps.get_webapp_url.outputs.RESOURCE_GROUP_NAME }}
      KUBERNETES_RESOURCE_GROUP_NAME: ${{ steps.get_webapp_url.outputs.KUBERNETES_RESOURCE_GROUP_NAME }}
      WEBAPP_URL: ${{ steps.get_webapp_url.outputs.WEBAPP_URL }}
      OPENAI_RESOURCE_NAME: ${{ steps.get_webapp_url.outputs.OPENAI_RESOURCE_NAME }}
      DOCUMENT_INTELLIGENCE_RESOURCE_NAME: ${{ steps.get_webapp_url.outputs.DOCUMENT_INTELLIGENCE_RESOURCE_NAME }}
      VALID_REGION: ${{ steps.get_webapp_url.outputs.VALID_REGION }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6 # Checks out your repository

      - name: Install Kubernetes CLI (kubectl)
        shell: bash
        run: |
          az aks install-cli
          az extension add --name aks-preview

      - name: Install Helm
        shell: bash
        run: |
          # If helm is already available on the runner, print version and skip installation
              if command -v helm >/dev/null 2>&1; then
              echo "helm already installed: $(helm version --short 2>/dev/null || true)"
              exit 0
            fi

          # Ensure prerequisites are present
            sudo apt-get update
            sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

          # Ensure keyrings dir exists
          sudo mkdir -p /usr/share/keyrings

          # Add Helm GPG key (use -fS to fail fast on curl errors)
          curl -fsSL https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg >/dev/null

          # Add the Helm apt repository
          echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

          # Install helm
          sudo apt-get update
          sudo apt-get install -y helm

          # Verify
          echo "Installed helm version:"
          helm version          

      - name: Set up Docker
        uses: docker/setup-buildx-action@v4
        with:
          driver: docker

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          enable-AzPSSession: true

      - name: Run Quota Check
        id: quota-check
        shell: pwsh
        run: |
          $ErrorActionPreference = "Stop"  # Ensure that any error stops the pipeline

          # Path to the PowerShell script for quota check
          $quotaCheckScript = "Deployment/checkquota.ps1"

          # Check if the script exists and is executable (not needed for PowerShell like chmod)
          if (-not (Test-Path $quotaCheckScript)) {
            Write-Host "❌ Error: Quota check script not found."
            exit 1
          }

          # Run the script
          .\Deployment\checkquota.ps1

          # If the script fails, check for the failure message
          $quotaFailedMessage = "No region with sufficient quota found"
          $output = Get-Content "Deployment/checkquota.ps1"

          if ($output -contains $quotaFailedMessage) {
            echo "QUOTA_FAILED=true" >> $GITHUB_ENV
          }
        env:
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          GPT_MIN_CAPACITY: ${{ env.GPT_CAPACITY }}
          TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_CAPACITY }}
          AZURE_REGIONS: "${{ vars.AZURE_REGIONS }}"

      - name: Send Notification on Quota Failure
        if: env.QUOTA_FAILED == 'true'
        shell: pwsh
        run: |
          $RUN_URL = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"

          # Construct the email body
          $EMAIL_BODY = @"
          {
            "body": "<p>Dear Team,</p><p>The quota check has failed, and the pipeline cannot proceed.</p><p><strong>Build URL:</strong> <a href='$RUN_URL'>$RUN_URL</a></p><p>Please take necessary action.</p><p>Best regards,<br>Your Automation Team</p>"
          }
          "@

          # Send the notification
          try {
            $response = Invoke-RestMethod -Uri "${{ secrets.LOGIC_APP_URL }}" -Method Post -ContentType "application/json" -Body $EMAIL_BODY
            Write-Host "Notification sent successfully."
          } catch {
            Write-Host "❌ Failed to send notification."
          }

      - name: Fail Pipeline if Quota Check Fails
        if: env.QUOTA_FAILED == 'true'
        run: exit 1
        
      - name: Install Bicep CLI
        run: az bicep install

      - name: Install azd
        uses: Azure/setup-azd@v2
        
      - name: Set Deployment Region
        run: |
          echo "Selected Region: $VALID_REGION"
          echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV

      - name: Generate Resource Group Name
        id: generate_rg_name
        run: |
          echo "Generating a unique resource group name..."
          ACCL_NAME="dkm"  # Account name as specified
          SHORT_UUID=$(uuidgen | cut -d'-' -f1)
          UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}"
          echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV
          echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}"

      - name: Check and Create Resource Group
        id: check_create_rg
        run: |
          set -e  
          echo "Checking if resource group exists..."
          rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
          if [ "$rg_exists" = "false" ]; then
            echo "Resource group does not exist. Creating..."
            az group create --name ${{ env.RESOURCE_GROUP_NAME }} --location ${{ env.AZURE_LOCATION }} || { echo "Error creating resource group"; exit 1; }
          else
            echo "Resource group already exists."
          fi
          echo "RESOURCE_GROUP_NAME=${{ env.RESOURCE_GROUP_NAME }}" >> $GITHUB_OUTPUT      

      - name: Generate Unique Solution Prefix
        id: generate_solution_prefix
        run: |
          set -e
          COMMON_PART="psldkm"
          TIMESTAMP=$(date +%s)  
          UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) 
          UNIQUE_SOLUTION_PREFIX="${COMMON_PART}${UPDATED_TIMESTAMP}"
          echo "SOLUTION_PREFIX=${UNIQUE_SOLUTION_PREFIX}" >> $GITHUB_ENV
          echo "Generated SOLUTION_PREFIX: ${UNIQUE_SOLUTION_PREFIX}" 

      - name: Deploy Bicep Template
        id: deploy
        run: |
          set -e

          # Generate current timestamp in desired format: YYYY-MM-DDTHH:MM:SS.SSSSSSSZ
            current_date=$(date -u +"%Y-%m-%dT%H:%M:%S.%7NZ")
          
          az deployment group create \
            --name ${{ env.SOLUTION_PREFIX }}-deployment \
            --resource-group ${{ env.RESOURCE_GROUP_NAME }} \
            --template-file infra/main.bicep \
            --parameters \
                solutionName="${{ env.SOLUTION_PREFIX }}" \
                location=${{ env.AZURE_LOCATION }} \
                azureAiServiceLocation=${{ env.AZURE_LOCATION }} \
                deploymentType="GlobalStandard" \
                gptModelName="gpt-4.1-mini" \
                gptDeploymentCapacity=${{ env.GPT_CAPACITY }} \
                gptModelVersion="2025-04-14" \
                embeddingModelName="text-embedding-3-large" \
                embeddingDeploymentCapacity=${{ env.TEXT_EMBEDDING_CAPACITY }} \
                embeddingModelVersion="1" \
                enablePrivateNetworking=false \
                enableMonitoring=false \
                enableTelemetry=true \
                enableRedundancy=false \
                enableScalability=false \
                createdBy="Pipeline" \
                tags="{'Purpose':'Deploying and Cleaning Up Resources for Validation','CreatedDate':'$current_date'}"

      - name: Get Deployment Output and extract Values
        id: get_output
        run: |
          set -e
          echo "Fetching deployment output..."
          BICEP_OUTPUT=$(az deployment group show \
            --name ${{ env.SOLUTION_PREFIX }}-deployment \
            --resource-group ${{ env.RESOURCE_GROUP_NAME }} \
            --query "properties.outputs" -o json)

          echo "Deployment outputs:"
          echo "$BICEP_OUTPUT"

          # Write outputs to GitHub env
          # Loop through keys, normalize to uppercase, and export
          for key in $(echo "$BICEP_OUTPUT" | jq -r 'keys[]'); do
            value=$(echo "$BICEP_OUTPUT" | jq -r ".[\"$key\"].value")
            upper_key=$(echo "$key" | tr '[:lower:]' '[:upper:]')
            echo "$upper_key=$value" >> $GITHUB_ENV
          done

      - name: Run Deployment Script with Input
        shell: pwsh
        run: |
          cd Deployment
          $input = @"
          ${{ secrets.EMAIL }}
          yes
          "@
          $input | pwsh ./resourcedeployment.ps1
          Write-Host "Resource Group Name is ${{ env.RESOURCE_GROUP_NAME }}"
          Write-Host "Kubernetes resource group is ${{ env.AZURE_AKS_NAME }}"
        env:
          # From GitHub secrets
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

          # From deployment outputs step (these come from $GITHUB_ENV)
          RESOURCE_GROUP_NAME:          ${{ env.RESOURCE_GROUP_NAME }}
          AZURE_RESOURCE_GROUP_ID:       ${{ env.AZURE_RESOURCE_GROUP_ID }}
          STORAGE_ACCOUNT_NAME:          ${{ env.STORAGE_ACCOUNT_NAME }}
          AZURE_SEARCH_SERVICE_NAME:     ${{ env.AZURE_SEARCH_SERVICE_NAME }}
          AZURE_AKS_NAME:                ${{ env.AZURE_AKS_NAME }}
          AZURE_AKS_MI_ID:               ${{ env.AZURE_AKS_MI_ID }}
          AZURE_CONTAINER_REGISTRY_NAME: ${{ env.AZURE_CONTAINER_REGISTRY_NAME }}
          AZURE_COGNITIVE_SERVICE_NAME:  ${{ env.AZURE_COGNITIVE_SERVICE_NAME }}
          AZURE_COGNITIVE_SERVICE_ENDPOINT: ${{ env.AZURE_COGNITIVE_SERVICE_ENDPOINT }}
          AZURE_OPENAI_SERVICE_NAME:     ${{ env.AZURE_OPENAI_SERVICE_NAME }}
          AZURE_OPENAI_SERVICE_ENDPOINT: ${{ env.AZURE_OPENAI_SERVICE_ENDPOINT }}
          AZURE_COSMOSDB_NAME:           ${{ env.AZURE_COSMOSDB_NAME }}
          AZ_GPT4O_MODEL_NAME:           ${{ env.AZ_GPT4O_MODEL_NAME }}
          AZ_GPT4O_MODEL_ID:             ${{ env.AZ_GPT4O_MODEL_ID }}
          AZ_GPT_EMBEDDING_MODEL_NAME:   ${{ env.AZ_GPT_EMBEDDING_MODEL_NAME }}
          AZ_GPT_EMBEDDING_MODEL_ID:     ${{ env.AZ_GPT_EMBEDDING_MODEL_ID }}
          AZURE_APP_CONFIG_ENDPOINT:     ${{ env.AZURE_APP_CONFIG_ENDPOINT }}
          AZURE_APP_CONFIG_NAME:         ${{ env.AZURE_APP_CONFIG_NAME }}

      - name: Extract Web App URL and Increase TPM
        id: get_webapp_url
        shell: bash
        run: |
          # Save the resource group name and Kubernetes resource group name to GITHUB_OUTPUT
          echo "RESOURCE_GROUP_NAME=${{ env.RESOURCE_GROUP_NAME }}" >> $GITHUB_OUTPUT
          echo "KUBERNETES_RESOURCE_GROUP_NAME=${{ env.krg_name }}" >> $GITHUB_OUTPUT
          echo "VALID_REGION=${{ env.VALID_REGION }}" >> $GITHUB_OUTPUT
          echo "OPENAI_RESOURCE_NAME=${{ env.AZURE_OPENAI_SERVICE_NAME }}" >> $GITHUB_OUTPUT
          echo "DOCUMENT_INTELLIGENCE_RESOURCE_NAME=${{ env.AZURE_COGNITIVE_SERVICE_NAME }}" >> $GITHUB_OUTPUT

          if az account show &> /dev/null; then
            echo "Azure CLI is authenticated."
          else
            echo "Azure CLI is not authenticated. Please check the OIDC login step."
            exit 1
          fi

          # Get the Web App URL and save it to GITHUB_OUTPUT
          echo "Retrieving Web App URL..."
          public_ip_name=$(az network public-ip list --resource-group ${{ env.krg_name }} --query "[?contains(name, 'kubernetes-')].name" -o tsv)
          fqdn=$(az network public-ip show --resource-group ${{ env.krg_name }} --name $public_ip_name --query "dnsSettings.fqdn" -o tsv)
          if [ -n "$fqdn" ]; then
            echo "WEBAPP_URL=https://$fqdn" >> $GITHUB_OUTPUT
            echo "Web App URL is https://$fqdn"
          else
            echo "Failed to retrieve Web App URL."
            exit 1
          fi

      - name: Validate Deployment
        shell: bash
        run: |
          webapp_url="${{ steps.get_webapp_url.outputs.WEBAPP_URL }}"
          echo "Validating web app at: $webapp_url"

          # Enhanced health check with retry logic
          max_attempts=7
          attempt=1
          success=false

          while [ $attempt -le $max_attempts ] && [ "$success" = false ]; do
            echo "Attempt $attempt/$max_attempts: Checking web app health..."

            # Check if web app responds
            http_code=$(curl -s -o /dev/null -w "%{http_code}" "$webapp_url" || echo "000")

            if [ "$http_code" -eq 200 ]; then
              echo "✅ Web app is healthy (HTTP $http_code)"
              success=true
            elif [ "$http_code" -eq 404 ]; then
              echo "❌ Web app not found (HTTP 404)"
              break
            elif [ "$http_code" -eq 503 ] || [ "$http_code" -eq 502 ]; then
              echo "⚠️ Web app temporarily unavailable (HTTP $http_code), retrying..."
              sleep 20
            else
              echo "⚠️ Web app returned HTTP $http_code, retrying..."
              sleep 20
            fi

            attempt=$((attempt + 1))
          done

          if [ "$success" = false ]; then
            echo "❌ Web app validation failed after $max_attempts attempts"
            exit 1
          fi

      - name: Run Post Deployment Script
        shell: pwsh
        continue-on-error: true
        run: |
          Write-Host "Running post deployment script to upload files..."
          cd Deployment
          try {
            .\uploadfiles.ps1 -EndpointUrl ${{ steps.get_webapp_url.outputs.WEBAPP_URL }}
            Write-Host "ExitCode: $LASTEXITCODE"
            if ($LASTEXITCODE -eq $null -or $LASTEXITCODE -eq 0) {
              Write-Host "✅ Post deployment script completed successfully."
            } else {
              Write-Host "❌ Post deployment script failed with exit code: $LASTEXITCODE"
              exit 1
            }
          }
          catch {
            Write-Host "❌ Post deployment script failed with error: $($_.Exception.Message)"
            exit 1
          }

      - name: Logout from Azure
        if: always()
        shell: bash
        run: |
          if az account show &> /dev/null; then
            echo "Logging out from Azure..."
            az logout
            echo "Logged out from Azure successfully."
          else
            echo "Azure CLI is not authenticated. Skipping logout."
          fi

  e2e-test:
    needs: deploy
    uses: ./.github/workflows/test-automation.yml
    with:
      DKM_URL: ${{ needs.deploy.outputs.WEBAPP_URL }}
    secrets: inherit


  cleanup-deployment:
    if: always()
    needs: [deploy, e2e-test]
    runs-on: ubuntu-latest
    environment: production
    env:
      RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
      KUBERNETES_RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.KUBERNETES_RESOURCE_GROUP_NAME }}
      OPENAI_RESOURCE_NAME: ${{ needs.deploy.outputs.OPENAI_RESOURCE_NAME }}
      DOCUMENT_INTELLIGENCE_RESOURCE_NAME: ${{ needs.deploy.outputs.DOCUMENT_INTELLIGENCE_RESOURCE_NAME }}
      VALID_REGION: ${{ needs.deploy.outputs.VALID_REGION }}

    steps:
      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Delete Resource Groups
        if: env.RESOURCE_GROUP_NAME != ''
        shell: bash
        run: |
          az group delete --name ${{ env.RESOURCE_GROUP_NAME }} --yes --no-wait
          az group delete --name ${{ env.KUBERNETES_RESOURCE_GROUP_NAME }} --yes --no-wait

      - name: Wait for Resource Deletion to Complete
        shell: bash
        run: |
          echo "Waiting for Azure OpenaAI and Document Intelligence resources to be deleted..."
          sleep 60 
          retries=0
          max_retries=3
          sleep_duration=60
          while [ $retries -lt $max_retries ]; do
            aoai_exists=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --name ${{ env.OPENAI_RESOURCE_NAME }} --query "[0].name" -o tsv)
            di_exists=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --name ${{ env.DOCUMENT_INTELLIGENCE_RESOURCE_NAME }} --query "[0].name" -o tsv)

            if [ -z "$aoai_exists" ] && [ -z "$di_exists" ]; then
              echo "Resources deleted successfully."
              break
            else
              echo "Resources still exist, retrying in $((sleep_duration * (retries + 1))) seconds..."
              sleep $((sleep_duration * (retries + 1)))
              retries=$((retries + 1))
            fi
          done

      - name: Purging the Resources
        if: success()
        shell: bash
        run: |
          echo "Purging the Azure OpenAI and Document Intelligence resources..."
          if [ -z "${{ env.OPENAI_RESOURCE_NAME }}" ]; then
            echo "No Azure OpenAI resource to purge."
          else
            echo "Purging Azure OpenAI resource..."
            az cognitiveservices account purge --name ${{ env.OPENAI_RESOURCE_NAME }} --resource-group ${{ env.RESOURCE_GROUP_NAME }} --location ${{ env.VALID_REGION }}
          fi

          if [ -z "${{ env.DOCUMENT_INTELLIGENCE_RESOURCE_NAME }}" ]; then
            echo "No Azure Document Intelligence resource to purge."
          else
            echo "Purging Azure Document Intelligence resources..."
            az cognitiveservices account purge --name ${{ env.DOCUMENT_INTELLIGENCE_RESOURCE_NAME }} --resource-group ${{ env.RESOURCE_GROUP_NAME }} --location ${{ env.VALID_REGION }}
          fi

      - name: Send Notification on Failure
        if: failure() || needs.deploy.result == 'failure'
        shell: pwsh
        run: |
          # Define the RUN_URL variable
          $RUN_URL = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"

          # Construct the email body using a Here-String
          $EMAIL_BODY = @"
          {
            "body": "<p>Dear Team,</p><p>The Document Knowledge Mining Automation process encountered an issue.</p><p><strong>Build URL:</strong> <a href='$RUN_URL'>$RUN_URL</a></p><p>Please investigate promptly.</p><p>Best regards,<br>Your Automation Team</p>"
          }
          "@

          # Send the notification with error handling
          try {
              curl -X POST "${{ secrets.LOGIC_APP_URL }}" `
                   -H "Content-Type: application/json" `
                   -d "$EMAIL_BODY"
          } catch {
              Write-Output "Failed to send notification."
          }

      - name: Logout from Azure
        if: always()
        shell: bash
        run: |
          if az account show &> /dev/null; then
            echo "Logging out from Azure..."
            az logout
            echo "Logged out from Azure successfully."
          else
            echo "Azure CLI is not authenticated. Skipping logout."
          fi

================================================
FILE: .github/workflows/Create-Release.yml
================================================
on:
    push:
     branches:
       - main

permissions:
  contents: write
  pull-requests: write

name: Create-Release
 
jobs:
   create-release:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
         uses: actions/checkout@v6
         with:
           ref: ${{ github.event.workflow_run.head_sha }}
 
       - uses: codfish/semantic-release-action@v5
         id: semantic
         with:
           tag-format: 'v${version}'
           additional-packages: |
             ['conventional-changelog-conventionalcommits@7']
           plugins: |
             [
               [
                 "@semantic-release/commit-analyzer",
                 {
                   "preset": "conventionalcommits"
                 }
               ],
               [
                 "@semantic-release/release-notes-generator",
                 {
                   "preset": "conventionalcommits",
                   "presetConfig": {
                     "types": [
                       { type: 'feat', section: 'Features', hidden: false },
                       { type: 'fix', section: 'Bug Fixes', hidden: false },
                       { type: 'perf', section: 'Performance Improvements', hidden: false },
                       { type: 'revert', section: 'Reverts', hidden: false },
                       { type: 'docs', section: 'Other Updates', hidden: false },
                       { type: 'style', section: 'Other Updates', hidden: false },
                       { type: 'chore', section: 'Other Updates', hidden: false },
                       { type: 'refactor', section: 'Other Updates', hidden: false },
                       { type: 'test', section: 'Other Updates', hidden: false },
                       { type: 'build', section: 'Other Updates', hidden: false },
                       { type: 'ci', section: 'Other Updates', hidden: false }
                     ]
                   }
                 }
               ],
               '@semantic-release/github'
             ]
         env:
             GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
       - run: echo ${{ steps.semantic.outputs.release-version }}
 
       - run: echo "$OUTPUTS"
         env:
           OUTPUTS: ${{ toJson(steps.semantic.outputs) }}
           


================================================
FILE: .github/workflows/azd-template-validation.yml
================================================
name: AZD Template Validation
on:
  schedule:
    - cron: '30 1 * * 4' # Every Thursday at 7:00 AM IST (1:30 AM UTC)
  workflow_dispatch:

permissions:
  contents: read
  id-token: write
  pull-requests: write

jobs:
  template_validation:
    runs-on: ubuntu-latest
    name: azd template validation
    environment: production
    steps:
      - uses: actions/checkout@v4

      - name: Set timestamp
        run: echo "HHMM=$(date -u +'%H%M')" >> $GITHUB_ENV

      - uses: microsoft/template-validation-action@v0.4.3
        with:
          validateAzd: ${{ vars.TEMPLATE_VALIDATE_AZD }}
          validateTests: ${{ vars.TEMPLATE_VALIDATE_TESTS }}
          useDevContainer: ${{ vars.TEMPLATE_USE_DEV_CONTAINER }}
        id: validation
        env:
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          AZURE_ENV_NAME: azd-${{ vars.AZURE_ENV_NAME }}-${{ env.HHMM }}
          AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
          AZURE_ENV_AI_SERVICE_LOCATION: ${{ vars.AZURE_LOCATION }}
          AZURE_ENV_GPT_MODEL_CAPACITY: 10 # keep low to avoid potential quota issues
          AZURE_ENV_EMBEDDING_DEPLOYMENT_CAPACITY: 10 # keep low to avoid potential quota issues
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: print result
        run: cat ${{ steps.validation.outputs.resultFile }}

================================================
FILE: .github/workflows/azure-dev.yml
================================================
name: Azure Dev Deploy

on:
  workflow_dispatch:

permissions:
  contents: read
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    env:
      AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}${{ github.run_number }}
      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
      AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Set timestamp and env name
        run: |
          HHMM=$(date -u +'%H%M')
          echo "AZURE_ENV_NAME=azd-${{ vars.AZURE_ENV_NAME }}-${HHMM}" >> $GITHUB_ENV

      - name: Install azd
        uses: Azure/setup-azd@v2

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Login to AZD
        shell: bash
        run: |
          azd auth login \
            --client-id "$AZURE_CLIENT_ID" \
            --federated-credential-provider "github" \
            --tenant-id "$AZURE_TENANT_ID"

      - name: Provision and Deploy
        shell: bash
        run: |
          if ! azd env select "$AZURE_ENV_NAME"; then
            azd env new "$AZURE_ENV_NAME" --subscription "$AZURE_SUBSCRIPTION_ID" --location "$AZURE_LOCATION" --no-prompt
          fi
          azd config set defaults.subscription "$AZURE_SUBSCRIPTION_ID"
          azd env set AZURE_ENV_AI_SERVICE_LOCATION="$AZURE_LOCATION"
          azd up --no-prompt

================================================
FILE: .github/workflows/broken-links-checker.yml
================================================
name: Broken Link Checker

on:
  pull_request:
    paths:
      - '**/*.md'
  workflow_dispatch:

permissions:
  contents: read

jobs:
  markdown-link-check:
    name: Check Markdown Broken Links
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repo
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # For PR : Get only changed markdown files
      - name: Get changed markdown files (PR only)
        id: changed-markdown-files
        if: github.event_name == 'pull_request'
        uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v46
        with:
          files: |
            **/*.md


      # For PR: Check broken links only in changed files
      - name: Check Broken Links in Changed Markdown Files
        id: lychee-check-pr
        if: github.event_name == 'pull_request' && steps.changed-markdown-files.outputs.any_changed == 'true'
        uses: lycheeverse/lychee-action@v2.8.0
        with:
          args: >
            --verbose --no-progress --exclude ^https?://
            ${{ steps.changed-markdown-files.outputs.all_changed_files }}
          failIfEmpty: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      # For manual trigger: Check all markdown files in repo
      - name: Check Broken Links in All Markdown Files in Entire Repo (Manual Trigger)
        id: lychee-check-manual
        if: github.event_name == 'workflow_dispatch'
        uses: lycheeverse/lychee-action@v2.8.0
        with:
          args: >
            --verbose --no-progress --exclude ^https?://
            '**/*.md'
          failIfEmpty: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL Advanced"

on:
  push:
    branches: [ "main", "dev", "demo" ]
    paths:
      - 'App/backend-api/**'
      - 'App/frontend-app/**'
      - 'App/kernel-memory/**'
      - '.github/workflows/codeql.yml'
  pull_request:
    branches: [ "main", "dev", "demo" ]
    paths:
      - 'App/backend-api/**'
      - 'App/frontend-app/**'
      - 'App/kernel-memory/**'
      - '.github/workflows/codeql.yml'
  schedule:
    - cron: '37 2 * * 5'

jobs:
  analyze:
    name: Analyze (${{ matrix.language }})
    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
    permissions:
      security-events: write
      packages: read
      actions: read
      contents: read

    strategy:
      fail-fast: false
      matrix:
        include:
          - language: csharp
            build-mode: none
          - language: javascript-typescript
            build-mode: none
          # Additional languages can be added here
          
    steps:
    - name: Checkout repository
      uses: actions/checkout@v6

    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: ${{ matrix.language }}
        build-mode: ${{ matrix.build-mode }}

    - if: matrix.build-mode == 'manual'
      shell: bash
      run: |
        echo 'If you are using a "manual" build mode for one or more of the languages you are analyzing, replace this with the commands to build your code.'
        exit 1

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4
      with:
        category: "/language:${{matrix.language}}"


================================================
FILE: .github/workflows/deploy-orchestrator.yml
================================================
name: Deployment orchestrator

on:
  workflow_call:
    inputs:
      azure_location:
        description: 'Azure Location For Deployment'
        required: false
        default: 'australiaeast'
        type: string
      resource_group_name:
        description: 'Resource Group Name (Optional)'
        required: false
        default: ''
        type: string
      waf_enabled:
        description: 'Enable WAF'
        required: false
        default: false
        type: boolean
      EXP:
        description: 'Enable EXP'
        required: false
        default: false
        type: boolean
      cleanup_resources:
        description: 'Cleanup Deployed Resources'
        required: false
        default: false
        type: boolean
      run_e2e_tests:
        description: 'Run End-to-End Tests'
        required: false
        default: 'GoldenPath-Testing'
        type: string
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID:
        description: 'Log Analytics Workspace ID (Optional)'
        required: false
        default: ''
        type: string
      existing_webapp_url:
        description: 'Existing Container WebApp URL (Skips Deployment)'
        required: false
        default: ''
        type: string
      trigger_type:
        description: 'Trigger type (workflow_dispatch, pull_request, schedule)'
        required: true
        type: string

env:
  AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}

jobs:
  deploy:
    if: "!cancelled() && (inputs.trigger_type != 'workflow_dispatch' || inputs.existing_webapp_url == '' || inputs.existing_webapp_url == null)"
    uses: ./.github/workflows/job-deploy.yml
    with:
      trigger_type: ${{ inputs.trigger_type }}
      azure_location: ${{ inputs.azure_location }}
      resource_group_name: ${{ inputs.resource_group_name }}
      waf_enabled: ${{ inputs.waf_enabled }}
      EXP: ${{ inputs.EXP }}
      existing_webapp_url: ${{ inputs.existing_webapp_url }}
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
      run_e2e_tests: ${{ inputs.run_e2e_tests }}
      cleanup_resources: ${{ inputs.cleanup_resources }}
    secrets: inherit

  e2e-test:
    if: "!cancelled() && ((needs.deploy.outputs.WEB_APPURL != '' && needs.deploy.outputs.WEB_APPURL != null) || (inputs.existing_webapp_url != '' && inputs.existing_webapp_url != null)) && (inputs.trigger_type != 'workflow_dispatch' || (inputs.run_e2e_tests != 'None' && inputs.run_e2e_tests != '' && inputs.run_e2e_tests != null))"
    needs: [deploy]
    uses: ./.github/workflows/test-automation-v2.yml
    with:
      TEST_URL: ${{ needs.deploy.outputs.WEB_APPURL || inputs.existing_webapp_url }}
      TEST_SUITE: ${{ inputs.trigger_type == 'workflow_dispatch' && inputs.run_e2e_tests || 'GoldenPath-Testing' }}
    secrets: inherit

  cleanup-deployment:
    if: "!cancelled() && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' && inputs.existing_webapp_url == '' && (inputs.trigger_type != 'workflow_dispatch' || inputs.cleanup_resources)"
    needs: [deploy, e2e-test]
    uses: ./.github/workflows/job-cleanup-deployment.yml
    with:
      trigger_type: ${{ inputs.trigger_type }}
      cleanup_resources: ${{ inputs.cleanup_resources }}
      existing_webapp_url: ${{ inputs.existing_webapp_url }}
      RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
      AZURE_LOCATION: ${{ needs.deploy.outputs.AZURE_LOCATION }}
      AZURE_ENV_AI_SERVICE_LOCATION: ${{ needs.deploy.outputs.AZURE_ENV_AI_SERVICE_LOCATION }}
      ENV_NAME: ${{ needs.deploy.outputs.ENV_NAME }}
      IMAGE_TAG: ${{ needs.deploy.outputs.IMAGE_TAG }}
    secrets: inherit

  send-notification:
    if: "!cancelled()"
    needs: [deploy, e2e-test, cleanup-deployment]
    uses: ./.github/workflows/job-send-notification.yml
    with:
      trigger_type: ${{ inputs.trigger_type }}
      waf_enabled: ${{ inputs.waf_enabled }}
      EXP: ${{ inputs.EXP }}
      run_e2e_tests: ${{ inputs.run_e2e_tests }}
      existing_webapp_url: ${{ inputs.existing_webapp_url }}
      deploy_result: ${{ needs.deploy.result }}
      e2e_test_result: ${{ needs.e2e-test.result }}
      WEB_APPURL: ${{ needs.deploy.outputs.WEB_APPURL || inputs.existing_webapp_url }}
      RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
      QUOTA_FAILED: ${{ needs.deploy.outputs.QUOTA_FAILED }}
      TEST_SUCCESS: ${{ needs.e2e-test.outputs.TEST_SUCCESS }}
      TEST_REPORT_URL: ${{ needs.e2e-test.outputs.TEST_REPORT_URL }}
      cleanup_result: ${{ needs.cleanup-deployment.result }}
    secrets: inherit


================================================
FILE: .github/workflows/deploy-v2.yml
================================================
name: Deploy-Test-Cleanup (v2)
on:
  push:
    branches:
      - main # Adjust this to the branch you want to trigger the deployment on
      - dev
      - demo
    paths:
      - 'infra/**'
      - 'App/**'
      - 'Deployment/**'
      - 'azure.yaml'
      - '.github/workflows/deploy-v2.yml'
      - '.github/workflows/deploy-orchestrator.yml'
      - '.github/workflows/job-deploy.yml'
      - '.github/workflows/job-deploy-linux.yml'
      - '.github/workflows/job-cleanup-deployment.yml'
      - '.github/workflows/job-send-notification.yml'
      - '.github/workflows/test-automation-v2.yml'
      - 'tests/**'
  schedule:
    - cron: "0 10,22 * * *" # Runs at 10:00 AM and 10:00 PM UTC
  
  workflow_dispatch:
    inputs:
      azure_location:
        description: 'Azure Location For Deployment'
        required: false
        default: 'australiaeast'
        type: choice
        options:
          - 'australiaeast'
          - 'centralus'
          - 'eastasia'
          - 'eastus2'
          - 'japaneast'
          - 'northeurope'
          - 'southeastasia'
          - 'uksouth'
      resource_group_name:
        description: 'Resource Group Name (Optional)'
        required: false
        default: ''
        type: string

      waf_enabled:
        description: 'Enable WAF'
        required: false
        default: false
        type: boolean
      EXP:
        description: 'Enable EXP'
        required: false
        default: false
        type: boolean
      
      cleanup_resources:
        description: 'Cleanup Deployed Resources'
        required: false
        default: false
        type: boolean

      run_e2e_tests:
        description: 'Run End-to-End Tests'
        required: false
        default: 'GoldenPath-Testing'
        type: choice
        options:
          - 'GoldenPath-Testing'
          - 'Smoke-Testing'
          - 'None'
      
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID:
        description: 'Log Analytics Workspace ID (Optional)'
        required: false
        default: ''
        type: string
      existing_webapp_url:
        description: 'Existing WebApp URL (Skips Deployment)'
        required: false
        default: ''
        type: string

permissions:
  id-token: write
  contents: read
  actions: read

jobs:
  validate-inputs:
    name: Validate Input Parameters
    runs-on: ubuntu-latest
    outputs:
      validation_passed: ${{ steps.validate.outputs.passed }}
      azure_location: ${{ steps.validate.outputs.azure_location }}
      resource_group_name: ${{ steps.validate.outputs.resource_group_name }}
      waf_enabled: ${{ steps.validate.outputs.waf_enabled }}
      exp: ${{ steps.validate.outputs.exp }}
      cleanup_resources: ${{ steps.validate.outputs.cleanup_resources }}
      run_e2e_tests: ${{ steps.validate.outputs.run_e2e_tests }}
      azure_env_existing_log_analytics_workspace_rid: ${{ steps.validate.outputs.azure_env_existing_log_analytics_workspace_rid }}
      existing_webapp_url: ${{ steps.validate.outputs.existing_webapp_url }}

    steps:
      - name: Validate Workflow Input Parameters
        id: validate
        shell: bash
        env:
          INPUT_AZURE_LOCATION: ${{ github.event.inputs.azure_location }}
          INPUT_RESOURCE_GROUP_NAME: ${{ github.event.inputs.resource_group_name }}
          INPUT_WAF_ENABLED: ${{ github.event.inputs.waf_enabled }}
          INPUT_EXP: ${{ github.event.inputs.EXP }}
          INPUT_CLEANUP_RESOURCES: ${{ github.event.inputs.cleanup_resources }}
          INPUT_RUN_E2E_TESTS: ${{ github.event.inputs.run_e2e_tests }}
          INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ github.event.inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
          INPUT_EXISTING_WEBAPP_URL: ${{ github.event.inputs.existing_webapp_url }}

        run: |
          echo "🔍 Validating workflow input parameters..."
          VALIDATION_FAILED=false

          # Validate azure_location (Azure region format)
          LOCATION="${INPUT_AZURE_LOCATION:-australiaeast}"

          if [[ ! "$LOCATION" =~ ^[a-z0-9]+$ ]]; then
            echo "❌ ERROR: azure_location '$LOCATION' is invalid. Must contain only lowercase letters and numbers"
            VALIDATION_FAILED=true
          else
            echo "✅ azure_location: '$LOCATION' is valid"
          fi

          # Validate resource_group_name (Azure naming convention, optional)
          if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then
            if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then
              echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period."
              VALIDATION_FAILED=true
            elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then
              echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters (length: ${#INPUT_RESOURCE_GROUP_NAME})"
              VALIDATION_FAILED=true
            else
              echo "✅ resource_group_name: '$INPUT_RESOURCE_GROUP_NAME' is valid"
            fi
          else
            echo "✅ resource_group_name: Not provided (will be auto-generated)"
          fi

          # Validate waf_enabled (boolean)
          WAF_ENABLED="${INPUT_WAF_ENABLED:-false}"
          if [[ "$WAF_ENABLED" != "true" && "$WAF_ENABLED" != "false" ]]; then
            echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$WAF_ENABLED'"
            VALIDATION_FAILED=true
          else
            echo "✅ waf_enabled: '$WAF_ENABLED' is valid"
          fi

          # Validate EXP (boolean)
          EXP_ENABLED="${INPUT_EXP:-false}"
          if [[ "$EXP_ENABLED" != "true" && "$EXP_ENABLED" != "false" ]]; then
            echo "❌ ERROR: EXP must be 'true' or 'false', got: '$EXP_ENABLED'"
            VALIDATION_FAILED=true
          else
            echo "✅ EXP: '$EXP_ENABLED' is valid"
          fi

          # Validate cleanup_resources (boolean)
          CLEANUP_RESOURCES="${INPUT_CLEANUP_RESOURCES:-false}"
          if [[ "$CLEANUP_RESOURCES" != "true" && "$CLEANUP_RESOURCES" != "false" ]]; then
            echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got: '$CLEANUP_RESOURCES'"
            VALIDATION_FAILED=true
          else
            echo "✅ cleanup_resources: '$CLEANUP_RESOURCES' is valid"
          fi

          # Validate run_e2e_tests (specific allowed values)
          TEST_OPTION="${INPUT_RUN_E2E_TESTS:-GoldenPath-Testing}"
          if [[ "$TEST_OPTION" != "GoldenPath-Testing" && "$TEST_OPTION" != "Smoke-Testing" && "$TEST_OPTION" != "None" ]]; then
            echo "❌ ERROR: run_e2e_tests must be one of: GoldenPath-Testing, Smoke-Testing, None, got: '$TEST_OPTION'"
            VALIDATION_FAILED=true
          else
            echo "✅ run_e2e_tests: '$TEST_OPTION' is valid"
          fi

          # Validate AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID (optional, Azure Resource ID format)
          if [[ -n "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" ]]; then
            if [[ ! "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then
              echo "❌ ERROR: AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID is invalid. Must be a valid Azure Resource ID format:"
              echo "   /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}"
              echo "   Got: '$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID'"
              VALIDATION_FAILED=true
            else
              echo "✅ AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: Valid Resource ID format"
            fi
          else
            echo "✅ AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: Not provided (optional)"
          fi

          # Validate existing_webapp_url (optional, must start with https)
          if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then
            if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then
              echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'"
              VALIDATION_FAILED=true
            else
              echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid"
            fi
          else
            echo "✅ existing_webapp_url: Not provided (will perform deployment)"
          fi

          # Fail workflow if any validation failed
          if [[ "$VALIDATION_FAILED" == "true" ]]; then
            echo ""
            echo "❌ Parameter validation failed. Please correct the errors above and try again."
            exit 1
          fi

          echo ""
          echo "✅ All input parameters validated successfully!"

          # Output validated values
          echo "passed=true" >> $GITHUB_OUTPUT
          echo "azure_location=$LOCATION" >> $GITHUB_OUTPUT
          echo "resource_group_name=$INPUT_RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT
          echo "waf_enabled=$WAF_ENABLED" >> $GITHUB_OUTPUT
          echo "exp=$EXP_ENABLED" >> $GITHUB_OUTPUT
          echo "cleanup_resources=$CLEANUP_RESOURCES" >> $GITHUB_OUTPUT
          echo "run_e2e_tests=$TEST_OPTION" >> $GITHUB_OUTPUT
          echo "azure_env_existing_log_analytics_workspace_rid=$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" >> $GITHUB_OUTPUT
          echo "existing_webapp_url=$INPUT_EXISTING_WEBAPP_URL" >> $GITHUB_OUTPUT

  Run:
    needs: validate-inputs
    if: needs.validate-inputs.outputs.validation_passed == 'true'
    uses: ./.github/workflows/deploy-orchestrator.yml
    with:
      azure_location: ${{ needs.validate-inputs.outputs.azure_location || 'australiaeast' }}
      resource_group_name: ${{ needs.validate-inputs.outputs.resource_group_name || '' }}
      waf_enabled: ${{ needs.validate-inputs.outputs.waf_enabled == 'true' }}
      EXP: ${{ needs.validate-inputs.outputs.exp == 'true' }}
      cleanup_resources: ${{ needs.validate-inputs.outputs.cleanup_resources == 'true' }}
      run_e2e_tests: ${{ needs.validate-inputs.outputs.run_e2e_tests || 'GoldenPath-Testing' }}
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ needs.validate-inputs.outputs.azure_env_existing_log_analytics_workspace_rid || '' }}
      existing_webapp_url: ${{ needs.validate-inputs.outputs.existing_webapp_url || '' }}
      trigger_type: ${{ github.event_name }}
    secrets: inherit


================================================
FILE: .github/workflows/job-cleanup-deployment.yml
================================================
name: Cleanup Deployment Job
on:
  workflow_call:
    inputs:
      trigger_type:
        description: 'Trigger type (workflow_dispatch, pull_request, schedule)'
        required: true
        type: string
      cleanup_resources:
        description: 'Cleanup Deployed Resources'
        required: false
        default: false
        type: boolean
      existing_webapp_url:
        description: 'Existing Container WebApp URL (Skips Deployment)'
        required: false
        default: ''
        type: string
      RESOURCE_GROUP_NAME:
        description: 'Resource Group Name to cleanup'
        required: true
        type: string
      AZURE_LOCATION:
        description: 'Azure Location'
        required: true
        type: string
      AZURE_ENV_AI_SERVICE_LOCATION:
        description: 'Azure OpenAI Location'
        required: true
        type: string
      ENV_NAME:
        description: 'Environment Name'
        required: true
        type: string
      IMAGE_TAG:
        description: 'Docker Image Tag'
        required: true
        type: string

jobs:
  cleanup-deployment:
    runs-on: ubuntu-latest
    environment: production
    continue-on-error: true
    env:
      RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
      AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }}
      AZURE_ENV_AI_SERVICE_LOCATION: ${{ inputs.AZURE_ENV_AI_SERVICE_LOCATION }}
      ENV_NAME: ${{ inputs.ENV_NAME }}
      IMAGE_TAG: ${{ inputs.IMAGE_TAG }}
    steps:
      - name: Validate Workflow Input Parameters
        shell: bash
        env:
          INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }}
          INPUT_CLEANUP_RESOURCES: ${{ inputs.cleanup_resources }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          INPUT_AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }}
          INPUT_AZURE_ENV_AI_SERVICE_LOCATION: ${{ inputs.AZURE_ENV_AI_SERVICE_LOCATION }}
          INPUT_ENV_NAME: ${{ inputs.ENV_NAME }}
          INPUT_IMAGE_TAG: ${{ inputs.IMAGE_TAG }}
        run: |
          echo "🔍 Validating workflow input parameters..."
          VALIDATION_FAILED=false

          # Validate trigger_type (required - alphanumeric with underscores)
          if [[ -z "$INPUT_TRIGGER_TYPE" ]]; then
            echo "❌ ERROR: trigger_type is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_TRIGGER_TYPE" =~ ^[a-zA-Z0-9_]+$ ]]; then
            echo "❌ ERROR: trigger_type '$INPUT_TRIGGER_TYPE' is invalid. Must contain only alphanumeric characters and underscores"
            VALIDATION_FAILED=true
          fi

          # Validate cleanup_resources (boolean)
          if [[ "$INPUT_CLEANUP_RESOURCES" != "true" && "$INPUT_CLEANUP_RESOURCES" != "false" ]]; then
            echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got '$INPUT_CLEANUP_RESOURCES'"
            VALIDATION_FAILED=true
          fi

          # Validate existing_webapp_url (optional - must start with https if provided)
          if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then
            if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then
              echo "❌ ERROR: existing_webapp_url must start with 'https://', got '$INPUT_EXISTING_WEBAPP_URL'"
              VALIDATION_FAILED=true
            fi
          fi

          # Validate RESOURCE_GROUP_NAME (required - Azure resource group naming convention)
          if [[ -z "$INPUT_RESOURCE_GROUP_NAME" ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period."
            VALIDATION_FAILED=true
          elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME exceeds 90 characters"
            VALIDATION_FAILED=true
          fi

          # Validate AZURE_LOCATION (required - Azure region format)
          if [[ -z "$INPUT_AZURE_LOCATION" ]]; then
            echo "❌ ERROR: AZURE_LOCATION is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then
            echo "❌ ERROR: AZURE_LOCATION '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers"
            VALIDATION_FAILED=true
          fi

          # Validate AZURE_ENV_AI_SERVICE_LOCATION (required - Azure region format)
          if [[ -z "$INPUT_AZURE_ENV_AI_SERVICE_LOCATION" ]]; then
            echo "❌ ERROR: AZURE_ENV_AI_SERVICE_LOCATION is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_AZURE_ENV_AI_SERVICE_LOCATION" =~ ^[a-z0-9]+$ ]]; then
            echo "❌ ERROR: AZURE_ENV_AI_SERVICE_LOCATION '$INPUT_AZURE_ENV_AI_SERVICE_LOCATION' is invalid. Must contain only lowercase letters and numbers"
            VALIDATION_FAILED=true
          fi

          # Validate ENV_NAME (required - alphanumeric with underscores and hyphens)
          if [[ -z "$INPUT_ENV_NAME" ]]; then
            echo "❌ ERROR: ENV_NAME is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_ENV_NAME" =~ ^[a-zA-Z0-9_-]+$ ]]; then
            echo "❌ ERROR: ENV_NAME '$INPUT_ENV_NAME' is invalid. Must contain only alphanumeric characters, underscores, and hyphens"
            VALIDATION_FAILED=true
          fi

          # Validate IMAGE_TAG (required - Docker tag pattern)
          if [[ -z "$INPUT_IMAGE_TAG" ]]; then
            echo "❌ ERROR: IMAGE_TAG is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_IMAGE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}$ ]]; then
            echo "❌ ERROR: IMAGE_TAG '$INPUT_IMAGE_TAG' is invalid. Must be a valid Docker tag (alphanumeric start, up to 128 chars)"
            VALIDATION_FAILED=true
          fi

          if [[ "$VALIDATION_FAILED" == "true" ]]; then
            echo "❌ Input validation failed. Please check the errors above."
            exit 1
          fi

          echo "✅ All input parameters validated successfully"

      - name: Setup Azure CLI
        shell: bash
        run: |
          if [[ "${{ runner.os }}" == "Linux" ]]; then
            curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
          fi
          az --version

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Delete Resource Group (Optimized Cleanup)
        id: delete_rg
        shell: bash
        run: |
          set -e
          echo "🗑️ Starting optimized resource cleanup..."
          echo "Deleting resource group: ${{ env.RESOURCE_GROUP_NAME }}"
          
          az group delete \
            --name "${{ env.RESOURCE_GROUP_NAME }}" \
            --yes \
            --no-wait
          
          echo "✅ Resource group deletion initiated (running asynchronously)"
          echo "Note: Resources will be cleaned up in the background"

      - name: Logout from Azure
        if: always()
        shell: bash
        run: |
          az logout || echo "Warning: Failed to logout from Azure CLI"
          echo "Logged out from Azure."
      
      - name: Generate Cleanup Job Summary
        if: always()
        shell: bash
        run: |
          echo "## 🧹 Cleanup Job Summary" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
          echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
          echo "| **Resource Group deletion Status** | ${{ steps.delete_rg.outcome == 'success' && '✅ Initiated' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY
          echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          if [[ "${{ steps.delete_rg.outcome }}" == "success" ]]; then
            echo "### ✅ Cleanup Details" >> $GITHUB_STEP_SUMMARY
            echo "- Successfully initiated deletion for Resource Group \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
          else
            echo "### ❌ Cleanup Failed" >> $GITHUB_STEP_SUMMARY
            echo "- Cleanup process encountered an error" >> $GITHUB_STEP_SUMMARY
            echo "- Manual cleanup may be required for:" >> $GITHUB_STEP_SUMMARY
            echo "  - Resource Group: \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY
            echo "- Check the cleanup-deployment job logs for detailed error information" >> $GITHUB_STEP_SUMMARY
          fi


================================================
FILE: .github/workflows/job-deploy-linux.yml
================================================
name: Deploy Steps

on:
  workflow_call:
    inputs:
      ENV_NAME:
        required: true
        type: string
      AZURE_ENV_AI_SERVICE_LOCATION:
        required: true
        type: string
      AZURE_LOCATION:
        required: true
        type: string
      RESOURCE_GROUP_NAME:
        required: true
        type: string
      IMAGE_TAG:
        required: true
        type: string
      EXP:
        required: true
        type: string
      WAF_ENABLED:
        required: false
        type: string
        default: 'false'
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID:
        required: false
        type: string
    outputs:
      WEB_APPURL:
        description: "Container Web App URL"
        value: ${{ jobs.deploy-linux.outputs.WEB_APPURL }}

jobs:
  deploy-linux:
    runs-on: ubuntu-latest
    environment: production
    env:
      AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}
    outputs:
      WEB_APPURL: ${{ steps.get_webapp_url.outputs.WEB_APPURL }}
    steps:
      - name: Validate Workflow Input Parameters
        shell: bash
        env:
          INPUT_ENV_NAME: ${{ inputs.ENV_NAME }}
          INPUT_AZURE_ENV_AI_SERVICE_LOCATION: ${{ inputs.AZURE_ENV_AI_SERVICE_LOCATION }}
          INPUT_AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          INPUT_IMAGE_TAG: ${{ inputs.IMAGE_TAG }}
          INPUT_EXP: ${{ inputs.EXP }}
          INPUT_WAF_ENABLED: ${{ inputs.WAF_ENABLED }}
          INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
        run: |
          echo "🔍 Validating workflow input parameters..."
          VALIDATION_FAILED=false
          
          # Validate ENV_NAME (required - alphanumeric)
          if [[ -z "$INPUT_ENV_NAME" ]]; then
            echo "❌ ERROR: ENV_NAME is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_ENV_NAME" =~ ^[a-zA-Z0-9_-]+$ ]]; then
            echo "❌ ERROR: ENV_NAME '$INPUT_ENV_NAME' is invalid. Must contain only alphanumeric characters, underscores, and hyphens"
            VALIDATION_FAILED=true
          else
            echo "✅ ENV_NAME: '$INPUT_ENV_NAME' is valid"
          fi
          
          # Validate AZURE_ENV_AI_SERVICE_LOCATION (required - Azure region format)
          if [[ -z "$INPUT_AZURE_ENV_AI_SERVICE_LOCATION" ]]; then
            echo "❌ ERROR: AZURE_ENV_AI_SERVICE_LOCATION is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_AZURE_ENV_AI_SERVICE_LOCATION" =~ ^[a-z0-9]+$ ]]; then
            echo "❌ ERROR: AZURE_ENV_AI_SERVICE_LOCATION '$INPUT_AZURE_ENV_AI_SERVICE_LOCATION' is invalid. Must contain only lowercase letters and numbers (e.g., 'australiaeast', 'westus2')"
            VALIDATION_FAILED=true
          else
            echo "✅ AZURE_ENV_AI_SERVICE_LOCATION: '$INPUT_AZURE_ENV_AI_SERVICE_LOCATION' is valid"
          fi
          
          # Validate AZURE_LOCATION (required - Azure region format)
          if [[ -z "$INPUT_AZURE_LOCATION" ]]; then
            echo "❌ ERROR: AZURE_LOCATION is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then
            echo "❌ ERROR: AZURE_LOCATION '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers (e.g., 'australiaeast', 'westus2')"
            VALIDATION_FAILED=true
          else
            echo "✅ AZURE_LOCATION: '$INPUT_AZURE_LOCATION' is valid"
          fi
          
          # Validate RESOURCE_GROUP_NAME (required - Azure resource group naming convention)
          if [[ -z "$INPUT_RESOURCE_GROUP_NAME" ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period."
            VALIDATION_FAILED=true
          elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then
            echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters"
            VALIDATION_FAILED=true
          else
            echo "✅ RESOURCE_GROUP_NAME: '$INPUT_RESOURCE_GROUP_NAME' is valid"
          fi
          
          # Validate IMAGE_TAG (required - Docker tag pattern)
          if [[ -z "$INPUT_IMAGE_TAG" ]]; then
            echo "❌ ERROR: IMAGE_TAG is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_IMAGE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}$ ]]; then
            echo "❌ ERROR: IMAGE_TAG '$INPUT_IMAGE_TAG' is invalid. Must start with alphanumeric or underscore, contain only alphanumerics, underscores, periods, hyphens, and be max 128 characters"
            VALIDATION_FAILED=true
          else
            echo "✅ IMAGE_TAG: '$INPUT_IMAGE_TAG' is valid"
          fi
          
          # Validate EXP (required - must be 'true' or 'false')
          if [[ -z "$INPUT_EXP" ]]; then
            echo "❌ ERROR: EXP is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then
            echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'"
            VALIDATION_FAILED=true
          else
            echo "✅ EXP: '$INPUT_EXP' is valid"
          fi
          
          # Validate WAF_ENABLED (must be 'true' or 'false')
          if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then
            echo "❌ ERROR: WAF_ENABLED must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'"
            VALIDATION_FAILED=true
          else
            echo "✅ WAF_ENABLED: '$INPUT_WAF_ENABLED' is valid"
          fi
          
          # Validate AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID (optional - Azure Resource ID format)
          if [[ -n "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" ]]; then
            if [[ ! "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then
              echo "❌ ERROR: AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID is invalid. Must be a valid Azure Resource ID format:"
              echo "   /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}"
              echo "   Got: '$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID'"
              VALIDATION_FAILED=true
            else
              echo "✅ AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: Valid Resource ID format"
            fi
          fi
          
          # Fail workflow if any validation failed
          if [[ "$VALIDATION_FAILED" == "true" ]]; then
            echo ""
            echo "❌ Parameter validation failed. Please correct the errors above and try again."
            exit 1
          fi
          
          echo ""
          echo "✅ All input parameters validated successfully!"

      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Configure Parameters Based on WAF Setting
        shell: bash
        env:
          INPUT_WAF_ENABLED: ${{ inputs.WAF_ENABLED }}
        run: |
          if [[ "$INPUT_WAF_ENABLED" == "true" ]]; then
            cp infra/main.waf.parameters.json infra/main.parameters.json
            echo "✅ Successfully copied WAF parameters to main parameters file"
          else
            echo "🔧 Configuring Non-WAF deployment - using default main.parameters.json..."
          fi

      - name: Install Azure CLI
        shell: bash
        run: |
          curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
          az --version  # Verify installation

      - name: Install Kubernetes CLI (kubectl)
        shell: bash
        run: |
          az aks install-cli
          az extension add --name aks-preview

      - name: Install Helm
        shell: bash
        run: |
          # If helm is already available on the runner, print version and skip installation
          if command -v helm >/dev/null 2>&1; then
            echo "helm already installed: $(helm version --short 2>/dev/null || true)"
            exit 0
          fi

          # Ensure prerequisites are present
          sudo apt-get update
          sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

          # Ensure keyrings dir exists
          sudo mkdir -p /usr/share/keyrings

          # Add Helm GPG key (use -fS to fail fast on curl errors)
          curl -fsSL https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg >/dev/null

          # Add the Helm apt repository
          echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

          # Install helm
          sudo apt-get update
          sudo apt-get install -y helm

          # Verify
          echo "Installed helm version:"
          helm version          

      - name: Set up Docker
        uses: docker/setup-buildx-action@v3
        with:
          driver: docker

      - name: Setup Azure Developer CLI
        uses: Azure/setup-azd@v2

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Login to azd
        run: |
          azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --federated-credential-provider "github" --tenant-id ${{ secrets.AZURE_TENANT_ID }}


      - name: Deploy using azd up
        id: azd_deploy
        shell: pwsh
        env:
          INPUT_ENV_NAME: ${{ inputs.ENV_NAME }}
          INPUT_AZURE_ENV_AI_SERVICE_LOCATION: ${{ inputs.AZURE_ENV_AI_SERVICE_LOCATION }}
          INPUT_AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          INPUT_IMAGE_TAG: ${{ inputs.IMAGE_TAG }}
          INPUT_EXP: ${{ inputs.EXP }}
          INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
        run: |
          # Create azd environment
          azd env new $env:INPUT_ENV_NAME --no-prompt
          
          # Set environment variables
          azd config set defaults.subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          azd env set AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}"
          azd env set AZURE_ENV_AI_SERVICE_LOCATION="$env:INPUT_AZURE_ENV_AI_SERVICE_LOCATION"
          azd env set AZURE_LOCATION="$env:INPUT_AZURE_LOCATION"
          azd env set AZURE_RESOURCE_GROUP="$env:INPUT_RESOURCE_GROUP_NAME"
          azd env set AZURE_ENV_IMAGE_TAG="$env:INPUT_IMAGE_TAG"
          
          # Set AI model capacity parameters
          azd env set AZURE_ENV_GPT_MODEL_CAPACITY="150"
          azd env set AZURE_ENV_EMBEDDING_DEPLOYMENT_CAPACITY="200"

          if ($env:INPUT_EXP -eq "true") {
            Write-Host "✅ EXP ENABLED - Setting EXP parameters..."
           
            # Set EXP variables dynamically
            if ($env:INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID -ne "") {
              $EXP_LOG_ANALYTICS_ID = $env:INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID
            } else {
              $EXP_LOG_ANALYTICS_ID = "${{ secrets.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}"
            }
           
            Write-Host "AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: $EXP_LOG_ANALYTICS_ID"
            azd env set AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID="$EXP_LOG_ANALYTICS_ID"
          } else {
            Write-Host "❌ EXP DISABLED - Skipping EXP parameters"
          }
          
          # Deploy
          azd up --no-prompt
          
          echo "✅ Azure Developer CLI (azd) deployment completed"

      - name: Get Deployment Outputs
        id: get_output
        env:
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
        run: |
          # Get outputs from azd
          azd env get-values --output json > /tmp/azd_output.json
          cat /tmp/azd_output.json
          
          # Extract values and write to GITHUB_ENV using bash
          while IFS='=' read -r key value; do
            # Remove quotes from value
            value=$(echo "$value" | tr -d '"')
            echo "${key}=${value}" >> $GITHUB_ENV
          done < <(jq -r 'to_entries[] | "\(.key)=\(.value)"' /tmp/azd_output.json)
          
          # Get AKS node resource group if AKS exists
          if [ -n "$AZURE_AKS_NAME" ]; then
            krg_name=$(az aks show --name "$AZURE_AKS_NAME" --resource-group "$INPUT_RESOURCE_GROUP_NAME" --query "nodeResourceGroup" -o tsv || echo "")
            if [ -n "$krg_name" ]; then
              echo "krg_name=$krg_name" >> $GITHUB_ENV
              echo "AKS node resource group: $krg_name"
            fi
          fi
      
      - name: Login to Azure to refresh credentials for subsequent steps
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          enable-AzPSSession: true

      - name: Run Deployment Script with Input
        shell: pwsh
        env:
          # From GitHub secrets
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

          # From workflow inputs and deployment outputs
          RESOURCE_GROUP_NAME:          ${{ inputs.RESOURCE_GROUP_NAME }}
          AZURE_RESOURCE_GROUP_ID:       ${{ env.AZURE_RESOURCE_GROUP_ID }}
          STORAGE_ACCOUNT_NAME:          ${{ env.STORAGE_ACCOUNT_NAME }}
          AZURE_SEARCH_SERVICE_NAME:     ${{ env.AZURE_SEARCH_SERVICE_NAME }}
          AZURE_AKS_NAME:                ${{ env.AZURE_AKS_NAME }}
          AZURE_AKS_MI_ID:               ${{ env.AZURE_AKS_MI_ID }}
          AZURE_CONTAINER_REGISTRY_NAME: ${{ env.AZURE_CONTAINER_REGISTRY_NAME }}
          AZURE_COGNITIVE_SERVICE_NAME:  ${{ env.AZURE_COGNITIVE_SERVICE_NAME }}
          AZURE_COGNITIVE_SERVICE_ENDPOINT: ${{ env.AZURE_COGNITIVE_SERVICE_ENDPOINT }}
          AZURE_OPENAI_SERVICE_NAME:     ${{ env.AZURE_OPENAI_SERVICE_NAME }}
          AZURE_OPENAI_SERVICE_ENDPOINT: ${{ env.AZURE_OPENAI_SERVICE_ENDPOINT }}
          AZURE_COSMOSDB_NAME:           ${{ env.AZURE_COSMOSDB_NAME }}
          AZ_GPT4O_MODEL_NAME:           ${{ env.AZ_GPT4O_MODEL_NAME }}
          AZ_GPT4O_MODEL_ID:             ${{ env.AZ_GPT4O_MODEL_ID }}
          AZ_GPT_EMBEDDING_MODEL_NAME:   ${{ env.AZ_GPT_EMBEDDING_MODEL_NAME }}
          AZ_GPT_EMBEDDING_MODEL_ID:     ${{ env.AZ_GPT_EMBEDDING_MODEL_ID }}
          AZURE_APP_CONFIG_ENDPOINT:     ${{ env.AZURE_APP_CONFIG_ENDPOINT }}
          AZURE_APP_CONFIG_NAME:         ${{ env.AZURE_APP_CONFIG_NAME }}
        run: |
          cd Deployment
          $input = @"
          ${{ secrets.EMAIL }}
          yes
          "@
          $input | pwsh ./resourcedeployment.ps1
          Write-Host "Resource Group: $env:RESOURCE_GROUP_NAME"
          Write-Host "AKS Cluster Name: $env:AZURE_AKS_NAME"
          Write-Host "AKS Node Resource Group: $env:krg_name"

      - name: Retrieve Web App URL
        id: get_webapp_url
        shell: bash
        run: |
          # Get the Web App URL and save it to GITHUB_OUTPUT
          echo "Retrieving Web App URL..."
          public_ip_name=$(az network public-ip list --resource-group ${{ env.krg_name }} --query "[?contains(name, 'kubernetes-')].name" -o tsv)
          fqdn=$(az network public-ip show --resource-group ${{ env.krg_name }} --name $public_ip_name --query "dnsSettings.fqdn" -o tsv)
          if [ -n "$fqdn" ]; then
            echo "WEB_APPURL=https://$fqdn" >> $GITHUB_OUTPUT
            echo "Web App URL is https://$fqdn"
          else
            echo "Failed to retrieve Web App URL."
            exit 1
          fi

      - name: Validate Deployment
        shell: bash
        run: |
          webapp_url="${{ steps.get_webapp_url.outputs.WEB_APPURL }}"
          echo "Validating web app at: $webapp_url"

          # Enhanced health check with retry logic
          max_attempts=7
          attempt=1
          success=false

          while [ $attempt -le $max_attempts ] && [ "$success" = false ]; do
            echo "Attempt $attempt/$max_attempts: Checking web app health..."

            # Check if web app responds
            http_code=$(curl -s -o /dev/null -w "%{http_code}" "$webapp_url" || echo "000")

            if [ "$http_code" -eq 200 ]; then
              echo "✅ Web app is healthy (HTTP $http_code)"
              success=true
            elif [ "$http_code" -eq 404 ]; then
              echo "❌ Web app not found (HTTP 404)"
              break
            elif [ "$http_code" -eq 503 ] || [ "$http_code" -eq 502 ]; then
              echo "⚠️ Web app temporarily unavailable (HTTP $http_code), retrying..."
              sleep 20
            else
              echo "⚠️ Web app returned HTTP $http_code, retrying..."
              sleep 20
            fi

            attempt=$((attempt + 1))
          done

          if [ "$success" = false ]; then
            echo "❌ Web app validation failed after $max_attempts attempts"
            exit 1
          fi

      - name: Run Post Deployment Script
        continue-on-error: true
        shell: pwsh
        run: |
          Write-Host "Running post deployment script to upload files..."
          cd Deployment
          try {
            .\uploadfiles.ps1 -EndpointUrl ${{ steps.get_webapp_url.outputs.WEB_APPURL }}
            Write-Host "ExitCode: $LASTEXITCODE"
            if ($LASTEXITCODE -eq $null -or $LASTEXITCODE -eq 0) {
              Write-Host "✅ Post deployment script completed successfully."
            } else {
              Write-Host "❌ Post deployment script failed with exit code: $LASTEXITCODE"
              exit 1
            }
          }
          catch {
            Write-Host "❌ Post deployment script failed with error: $($_.Exception.Message)"
            exit 1
          }

      - name: Generate Deploy Job Summary
        if: always()
        shell: bash
        run: |
          echo "## 🚀 Deploy Job Summary (Linux)" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
          echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
          echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY
          echo "| **Resource Group** | \`${{ inputs.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Configuration Type** | \`${{ inputs.WAF_ENABLED == 'true' && inputs.EXP == 'true' && 'WAF + EXP' || inputs.WAF_ENABLED == 'true' && inputs.EXP != 'true' && 'WAF + Non-EXP' || inputs.WAF_ENABLED != 'true' && inputs.EXP == 'true' && 'Non-WAF + EXP' || 'Non-WAF + Non-EXP' }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Azure Region (Infrastructure)** | \`${{ inputs.AZURE_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Azure OpenAI Region** | \`${{ inputs.AZURE_ENV_AI_SERVICE_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Docker Image Tag** | \`${{ inputs.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          if [[ "${{ job.status }}" == "success" ]]; then
            echo "### ✅ Deployment Details" >> $GITHUB_STEP_SUMMARY
            echo "- **Web App URL**: [${{ steps.get_webapp_url.outputs.WEB_APPURL }}](${{ steps.get_webapp_url.outputs.WEB_APPURL }})" >> $GITHUB_STEP_SUMMARY
            echo "- Successfully deployed to Azure with all resources configured" >> $GITHUB_STEP_SUMMARY
            echo "- Post-deployment scripts executed successfully" >> $GITHUB_STEP_SUMMARY
          else
            echo "### ❌ Deployment Failed" >> $GITHUB_STEP_SUMMARY
            echo "- Deployment process encountered an error" >> $GITHUB_STEP_SUMMARY
            echo "- Check the deploy job for detailed error information" >> $GITHUB_STEP_SUMMARY
          fi

      - name: Logout from Azure
        if: always()
        shell: bash
        run: |
          az logout || true
          echo "Logged out from Azure."


================================================
FILE: .github/workflows/job-deploy.yml
================================================
name: Deploy Job 

on:
  workflow_call:
    inputs:
      trigger_type:
        description: 'Trigger type (workflow_dispatch, pull_request, schedule)'
        required: true
        type: string
      azure_location:
        description: 'Azure Location For Deployment'
        required: false
        default: 'australiaeast'
        type: string
      resource_group_name:
        description: 'Resource Group Name (Optional)'
        required: false
        default: ''
        type: string
      waf_enabled:
        description: 'Enable WAF'
        required: false
        default: false
        type: boolean
      EXP:
        description: 'Enable EXP'
        required: false
        default: false
        type: boolean
      cleanup_resources:
        description: 'Cleanup Deployed Resources'
        required: false
        default: false
        type: boolean
      run_e2e_tests:
        description: 'Run End-to-End Tests'
        required: false
        default: 'GoldenPath-Testing'
        type: string
      existing_webapp_url:
        description: 'Existing Container WebApp URL (Skips Deployment)'
        required: false
        default: ''
        type: string
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID:
        description: 'Log Analytics Workspace ID (Optional)'
        required: false
        default: ''
        type: string
    outputs:
      RESOURCE_GROUP_NAME:
        description: "Resource Group Name"
        value: ${{ jobs.azure-setup.outputs.RESOURCE_GROUP_NAME }}
      WEB_APPURL:
        description: "Container Web App URL"
        value: ${{ jobs.deploy-linux.outputs.WEB_APPURL }}
      ENV_NAME:
        description: "Environment Name"
        value: ${{ jobs.azure-setup.outputs.ENV_NAME }}
      AZURE_LOCATION:
        description: "Azure Location"
        value: ${{ jobs.azure-setup.outputs.AZURE_LOCATION }}
      AZURE_ENV_AI_SERVICE_LOCATION:
        description: "Azure OpenAI Location"
        value: ${{ jobs.azure-setup.outputs.AZURE_ENV_AI_SERVICE_LOCATION }}
      IMAGE_TAG:
        description: "Docker Image Tag Used"
        value: ${{ jobs.azure-setup.outputs.IMAGE_TAG }}
      QUOTA_FAILED:
        description: "Quota Check Failed Flag"
        value: ${{ jobs.azure-setup.outputs.QUOTA_FAILED }}

env:
  GPT_MIN_CAPACITY: 150
  TEXT_EMBEDDING_MIN_CAPACITY: 80
  BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }}
  WAF_ENABLED: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.waf_enabled || false) || false }}
  EXP: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.EXP || false) || false }}
  CLEANUP_RESOURCES: ${{ inputs.trigger_type != 'workflow_dispatch' || inputs.cleanup_resources }}
  RUN_E2E_TESTS: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.run_e2e_tests || 'GoldenPath-Testing') || 'GoldenPath-Testing' }}
  RG_TAGS: ${{ vars.RG_TAGS }}

jobs:
  azure-setup:
    name: Azure Setup
    if: inputs.trigger_type != 'workflow_dispatch' || inputs.existing_webapp_url == '' || inputs.existing_webapp_url == null
    runs-on: ubuntu-latest
    environment: production
    outputs:
      RESOURCE_GROUP_NAME: ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }}
      ENV_NAME: ${{ steps.generate_env_name.outputs.ENV_NAME }}
      AZURE_LOCATION: ${{ steps.set_region.outputs.AZURE_LOCATION }}
      AZURE_ENV_AI_SERVICE_LOCATION: ${{ steps.set_region.outputs.AZURE_ENV_AI_SERVICE_LOCATION }}
      IMAGE_TAG: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }}
      QUOTA_FAILED: ${{ steps.quota_failure_output.outputs.QUOTA_FAILED }}
      EXP_ENABLED: ${{ steps.configure_exp.outputs.EXP_ENABLED }}
      
    steps:
      - name: Validate Workflow Input Parameters
        shell: bash
        env:
          INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }}
          INPUT_AZURE_LOCATION: ${{ inputs.azure_location }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }}
          INPUT_WAF_ENABLED: ${{ inputs.waf_enabled }}
          INPUT_EXP: ${{ inputs.EXP }}
          INPUT_CLEANUP_RESOURCES: ${{ inputs.cleanup_resources }}
          INPUT_RUN_E2E_TESTS: ${{ inputs.run_e2e_tests }}
          INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
        run: |
          echo "🔍 Validating workflow input parameters..."
          VALIDATION_FAILED=false
          
          # Validate trigger_type (required - alphanumeric with underscores)
          if [[ -z "$INPUT_TRIGGER_TYPE" ]]; then
            echo "❌ ERROR: trigger_type is required but was not provided"
            VALIDATION_FAILED=true
          elif [[ ! "$INPUT_TRIGGER_TYPE" =~ ^[a-zA-Z0-9_]+$ ]]; then
            echo "❌ ERROR: trigger_type '$INPUT_TRIGGER_TYPE' is invalid. Must contain only alphanumeric characters and underscores"
            VALIDATION_FAILED=true
          else
            echo "✅ trigger_type: '$INPUT_TRIGGER_TYPE' is valid"
          fi
          
          # Validate azure_location (Azure region format)
          if [[ -n "$INPUT_AZURE_LOCATION" ]]; then
            if [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then
              echo "❌ ERROR: azure_location '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers (e.g., 'australiaeast', 'westus2')"
              VALIDATION_FAILED=true
            else
              echo "✅ azure_location: '$INPUT_AZURE_LOCATION' is valid"
            fi
          fi
          
          # Validate resource_group_name (Azure resource group naming convention)
          if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then
            if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then
              echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period."
              VALIDATION_FAILED=true
            elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then
              echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters"
              VALIDATION_FAILED=true
            else
              echo "✅ resource_group_name: '$INPUT_RESOURCE_GROUP_NAME' is valid"
            fi
          fi
          
          # Validate waf_enabled (boolean)
          if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then
            echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'"
            VALIDATION_FAILED=true
          else
            echo "✅ waf_enabled: '$INPUT_WAF_ENABLED' is valid"
          fi
          
          # Validate EXP (boolean)
          if [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then
            echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'"
            VALIDATION_FAILED=true
          else
            echo "✅ EXP: '$INPUT_EXP' is valid"
          fi
          
          # Validate cleanup_resources (boolean)
          if [[ "$INPUT_CLEANUP_RESOURCES" != "true" && "$INPUT_CLEANUP_RESOURCES" != "false" ]]; then
            echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got: '$INPUT_CLEANUP_RESOURCES'"
            VALIDATION_FAILED=true
          else
            echo "✅ cleanup_resources: '$INPUT_CLEANUP_RESOURCES' is valid"
          fi
          
          # Validate run_e2e_tests (specific allowed values)
          if [[ -n "$INPUT_RUN_E2E_TESTS" ]]; then
            ALLOWED_VALUES=("None" "GoldenPath-Testing" "Smoke-Testing")
            if [[ ! " ${ALLOWED_VALUES[@]} " =~ " ${INPUT_RUN_E2E_TESTS} " ]]; then
              echo "❌ ERROR: run_e2e_tests '$INPUT_RUN_E2E_TESTS' is invalid. Allowed values: ${ALLOWED_VALUES[*]}"
              VALIDATION_FAILED=true
            else
              echo "✅ run_e2e_tests: '$INPUT_RUN_E2E_TESTS' is valid"
            fi
          fi
          
          # Validate AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID (Azure Resource ID format)
          if [[ -n "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" ]]; then
            if [[ ! "$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then
              echo "❌ ERROR: AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID is invalid. Must be a valid Azure Resource ID format:"
              echo "   /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}"
              echo "   Got: '$INPUT_AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID'"
              VALIDATION_FAILED=true
            else
              echo "✅ AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: Valid Resource ID format"
            fi
          fi
          
          # Validate existing_webapp_url (must start with https)
          if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then
            if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then
              echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'"
              VALIDATION_FAILED=true
            else
              echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid"
            fi
          fi
          
          # Fail workflow if any validation failed
          if [[ "$VALIDATION_FAILED" == "true" ]]; then
            echo ""
            echo "❌ Parameter validation failed. Please correct the errors above and try again."
            exit 1
          fi
          
          echo ""
          echo "✅ All input parameters validated successfully!"

      - name: Validate and Auto-Configure EXP
        id: configure_exp
        shell: bash
        env:
          INPUT_EXP: ${{ inputs.EXP }}
          INPUT_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
        run: |
          echo "🔍 Validating EXP configuration..."
          
          EXP_ENABLED="false"
          
          if [[ "$INPUT_EXP" == "true" ]]; then
            EXP_ENABLED="true"
            echo "✅ EXP explicitly enabled by user input"
          elif [[ -n "$INPUT_LOG_ANALYTICS_WORKSPACE_ID" ]]; then
            echo "🔧 AUTO-ENABLING EXP: Log Analytics Workspace ID was provided but EXP was not explicitly enabled."
            echo ""
            echo "You provided values for:"
            echo "  - Azure Log Analytics Workspace ID: '$INPUT_LOG_ANALYTICS_WORKSPACE_ID'"
            echo ""
            echo "✅ Automatically enabling EXP to use these values."
            EXP_ENABLED="true"
          fi
          
          echo "EXP_ENABLED=$EXP_ENABLED" >> $GITHUB_ENV
          echo "EXP_ENABLED=$EXP_ENABLED" >> $GITHUB_OUTPUT
          echo "Final EXP status: $EXP_ENABLED"
          
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          enable-AzPSSession: true
      
      - name: Run Quota Check
        id: quota-check
        shell: pwsh
        run: |
          $ErrorActionPreference = "Stop"  # Ensure that any error stops the pipeline

          # Path to the PowerShell script for quota check
          $quotaCheckScript = "Deployment/checkquota.ps1"

          # Check if the script exists
          if (-not (Test-Path $quotaCheckScript)) {
            Write-Host "❌ Error: Quota check script not found."
            exit 1
          }

          # Run the script and capture its output (stdout and stderr)
          $output = & $quotaCheckScript 2>&1
          $exitCode = $LASTEXITCODE

          # Check the execution output for the quota failure message
          $quotaFailedMessage = "No region with sufficient quota found"
          if ($output -match [Regex]::Escape($quotaFailedMessage) -or $exitCode -ne 0) {
            echo "QUOTA_FAILED=true" >> $env:GITHUB_ENV
          }
        env:
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          GPT_MIN_CAPACITY: ${{ env.GPT_MIN_CAPACITY }}
          TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_MIN_CAPACITY }}
          AZURE_REGIONS: "${{ vars.AZURE_REGIONS }}"

      - name: Set Quota Failure Output
        id: quota_failure_output
        if: env.QUOTA_FAILED == 'true'
        shell: bash
        run: |
          echo "QUOTA_FAILED=true" >> $GITHUB_OUTPUT
          echo "Quota check failed - will notify via separate notification job"
      
      - name: Fail Pipeline if Quota Check Fails
        if: env.QUOTA_FAILED == 'true'
        shell: bash
        run: exit 1
      
      - name: Set Deployment Region
        id: set_region
        shell: bash
        env:
          INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }}
          INPUT_AZURE_LOCATION: ${{ inputs.azure_location }}
        run: |
          if [[ -z "$VALID_REGION" ]]; then
            echo "❌ ERROR: VALID_REGION is not set. The quota check script (Deployment/checkquota.ps1) must set this variable before this step runs." >&2
            exit 1
          fi
          echo "Selected Region from Quota Check: $VALID_REGION"
          echo "AZURE_ENV_AI_SERVICE_LOCATION=$VALID_REGION" >> $GITHUB_ENV
          echo "AZURE_ENV_AI_SERVICE_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT
          
          if [[ "$INPUT_TRIGGER_TYPE" == "workflow_dispatch" && -n "$INPUT_AZURE_LOCATION" ]]; then
            USER_SELECTED_LOCATION="$INPUT_AZURE_LOCATION"
            echo "Using user-selected Azure location: $USER_SELECTED_LOCATION"
            echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_ENV
            echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_OUTPUT
          else
            echo "Using location from quota check for automatic triggers: $VALID_REGION"
            echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV
            echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT
          fi

      - name: Generate Resource Group Name
        id: generate_rg_name
        shell: bash
        env:
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }}
        run: |
          # Check if a resource group name was provided as input
          if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then
            echo "Using provided Resource Group name: $INPUT_RESOURCE_GROUP_NAME"
            echo "RESOURCE_GROUP_NAME=$INPUT_RESOURCE_GROUP_NAME" >> $GITHUB_ENV
          else
            echo "Generating a unique resource group name..."
            ACCL_NAME="dkm"  # Account name as specified
            SHORT_UUID=$(uuidgen | cut -d'-' -f1)
            UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}"
            echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV
            echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}"
          fi

      - name: Install Bicep CLI
        shell: bash
        run: az bicep install

      - name: Check and Create Resource Group
        id: check_create_rg
        shell: bash
        run: |
          set -e  
          echo "🔍 Checking if resource group '$RESOURCE_GROUP_NAME' exists..."
          rg_exists=$(az group exists --name $RESOURCE_GROUP_NAME)
          if [ "$rg_exists" = "false" ]; then
            echo "📦 Resource group does not exist. Creating new resource group '$RESOURCE_GROUP_NAME' in location '$AZURE_LOCATION'..."
            az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION --tags ${{ env.RG_TAGS }} || { echo "❌ Error creating resource group"; exit 1; }
            echo "✅ Resource group '$RESOURCE_GROUP_NAME' created successfully."
          else
            echo "✅ Resource group '$RESOURCE_GROUP_NAME' already exists. Deploying to existing resource group."
          fi
          echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT
          echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_ENV

      - name: Determine Docker Image Tag
        id: determine_image_tag
        run: |
          echo "🏷️ Using existing Docker image based on branch..."
          BRANCH_NAME="${{ env.BRANCH_NAME }}"
          echo "Current branch: $BRANCH_NAME"
          
          # Determine image tag based on branch
          if [[ "$BRANCH_NAME" == "main" ]]; then
            IMAGE_TAG="latest_waf"
            echo "Using main branch - image tag: latest_waf"
          elif [[ "$BRANCH_NAME" == "dev" ]]; then
            IMAGE_TAG="dev"
            echo "Using dev branch - image tag: dev"
          elif [[ "$BRANCH_NAME" == "demo" ]]; then
            IMAGE_TAG="demo"
            echo "Using demo branch - image tag: demo"
          else
            IMAGE_TAG="latest_waf"
            echo "Using default for branch '$BRANCH_NAME' - image tag: latest_waf"
          fi
          
          echo "Using existing Docker image tag: $IMAGE_TAG"
          
          echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV
          echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Generate Unique Environment Name
        id: generate_env_name
        shell: bash
        run: |
          COMMON_PART="pslc"
          TIMESTAMP=$(date +%s)
          UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6)
          UNIQUE_ENV_NAME="${COMMON_PART}${UPDATED_TIMESTAMP}"
          echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_ENV
          echo "Generated Environment Name: ${UNIQUE_ENV_NAME}"
          echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_OUTPUT

      - name: Display Workflow Configuration to GitHub Summary
        shell: bash
        env:
          INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }}
          INPUT_AZURE_LOCATION: ${{ inputs.azure_location }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }}
          STEP_EVENT_NAME: ${{ github.event_name }}
          STEP_BRANCH_NAME: ${{ env.BRANCH_NAME }}
          STEP_WAF_ENABLED: ${{ env.WAF_ENABLED }}
          STEP_EXP: ${{ env.EXP }}
          STEP_RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
          STEP_CLEANUP_RESOURCES: ${{ env.CLEANUP_RESOURCES }}
        run: |
          echo "## 📋 Workflow Configuration Summary" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "| Configuration | Value |" >> $GITHUB_STEP_SUMMARY
          echo "|---------------|-------|" >> $GITHUB_STEP_SUMMARY
          echo "| **WAF Enabled** | ${{ env.WAF_ENABLED == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY
          echo "| **EXP Enabled** | ${{ env.EXP == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY
          echo "| **Run E2E Tests** | \`${{ env.RUN_E2E_TESTS }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Cleanup Resources** | ${{ env.CLEANUP_RESOURCES == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY
          
          if [[ "${{ inputs.trigger_type }}" == "workflow_dispatch" && -n "${{ inputs.azure_location }}" ]]; then
            echo "| **Azure Location** | \`${{ inputs.azure_location }}\` (User Selected) |" >> $GITHUB_STEP_SUMMARY
          fi
          
          if [[ -n "${{ inputs.resource_group_name }}" ]]; then
            echo "| **Resource Group** | \`${{ inputs.resource_group_name }}\` (Pre-specified) |" >> $GITHUB_STEP_SUMMARY
          else
            echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` (Auto-generated) |" >> $GITHUB_STEP_SUMMARY
          fi
          
          echo "" >> $GITHUB_STEP_SUMMARY
          
          if [[ "${{ inputs.trigger_type }}" != "workflow_dispatch" ]]; then
            echo "ℹ️ **Note:** Automatic Trigger - Using Non-WAF + Non-EXP configuration" >> $GITHUB_STEP_SUMMARY
          else
            echo "ℹ️ **Note:** Manual Trigger - Using user-specified configuration" >> $GITHUB_STEP_SUMMARY
          fi

  deploy-linux:
    name: Deploy
    needs: azure-setup
    if: "!cancelled() && needs.azure-setup.result == 'success'"
    uses: ./.github/workflows/job-deploy-linux.yml
    with:
      ENV_NAME: ${{ needs.azure-setup.outputs.ENV_NAME }}
      AZURE_ENV_AI_SERVICE_LOCATION: ${{ needs.azure-setup.outputs.AZURE_ENV_AI_SERVICE_LOCATION }}
      AZURE_LOCATION: ${{ needs.azure-setup.outputs.AZURE_LOCATION }}
      RESOURCE_GROUP_NAME: ${{ needs.azure-setup.outputs.RESOURCE_GROUP_NAME }}
      IMAGE_TAG: ${{ needs.azure-setup.outputs.IMAGE_TAG }}
      EXP: ${{ needs.azure-setup.outputs.EXP_ENABLED || inputs.EXP || 'false' }}
      WAF_ENABLED: ${{ inputs.waf_enabled == true && 'true' || 'false' }}
      AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID: ${{ inputs.AZURE_ENV_EXISTING_LOG_ANALYTICS_WORKSPACE_RID }}
    secrets: inherit


================================================
FILE: .github/workflows/job-send-notification.yml
================================================
name: Send Notification Job

on:
  workflow_call:
    inputs:
      trigger_type:
        description: 'Trigger type (workflow_dispatch, pull_request, schedule)'
        required: true
        type: string
      waf_enabled:
        description: 'Enable WAF'
        required: false
        default: false
        type: boolean
      EXP:
        description: 'Enable EXP'
        required: false
        default: false
        type: boolean
      run_e2e_tests:
        description: 'Run End-to-End Tests'
        required: false
        default: 'GoldenPath-Testing'
        type: string
      existing_webapp_url:
        description: 'Existing Container WebApp URL (Skips Deployment)'
        required: false
        default: ''
        type: string
      deploy_result:
        description: 'Deploy job result (success, failure, skipped)'
        required: true
        type: string
      e2e_test_result:
        description: 'E2E test job result (success, failure, skipped)'
        required: false
        default: ''
        type: string
      WEB_APPURL:
        description: 'Container Web App URL'
        required: false
        default: ''
        type: string
      RESOURCE_GROUP_NAME:
        description: 'Resource Group Name'
        required: false
        default: ''
        type: string
      QUOTA_FAILED:
        description: 'Quota Check Failed Flag'
        required: false
        default: 'false'
        type: string
      TEST_SUCCESS:
        description: 'Test Success Flag'
        required: false
        default: ''
        type: string
      TEST_REPORT_URL:
        description: 'Test Report URL'
        required: false
        default: ''
        type: string
      cleanup_result:
        description: 'Cleanup job result (success, failure, skipped)'
        required: false
        default: 'skipped'
        type: string

env:
  GPT_MIN_CAPACITY: 100
  BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }}
  WAF_ENABLED: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.waf_enabled || false) || false }}
  EXP: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.EXP || false) || false }}
  RUN_E2E_TESTS: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.run_e2e_tests || 'GoldenPath-Testing') || 'GoldenPath-Testing' }}

jobs:
  send-notification:
    runs-on: ubuntu-latest
    continue-on-error: true
    env:
      accelerator_name: "DKM"
    steps:
      - name: Determine Test Suite Display Name
        id: test_suite
        shell: bash
        env:
          RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
        run: |
          if [ "$RUN_E2E_TESTS" = "GoldenPath-Testing" ]; then
            TEST_SUITE_NAME="Golden Path Testing"
          elif [ "$RUN_E2E_TESTS" = "Smoke-Testing" ]; then
            TEST_SUITE_NAME="Smoke Testing"
          elif [ "$RUN_E2E_TESTS" = "None" ]; then
            TEST_SUITE_NAME="None"
          else
            TEST_SUITE_NAME="$RUN_E2E_TESTS"
          fi
          echo "TEST_SUITE_NAME=$TEST_SUITE_NAME" >> $GITHUB_OUTPUT
          echo "Test Suite: $TEST_SUITE_NAME"

      - name: Determine Cleanup Status
        id: cleanup
        shell: bash
        env:
          CLEANUP_RESULT: ${{ inputs.cleanup_result }}
        run: |
          case "$CLEANUP_RESULT" in
            success) echo "CLEANUP_STATUS=✅ SUCCESS" >> $GITHUB_OUTPUT ;;
            failure) echo "CLEANUP_STATUS=❌ FAILED (Needs Manual Cleanup)" >> $GITHUB_OUTPUT ;;
            *) echo "CLEANUP_STATUS=⏭️ SKIPPED (Needs Manual Cleanup)" >> $GITHUB_OUTPUT ;;
          esac

      - name: Determine Configuration Label
        id: config
        shell: bash
        env:
          WAF_ENABLED: ${{ env.WAF_ENABLED }}
          EXP: ${{ env.EXP }}
        run: |
          WAF_LABEL=$( [ "$WAF_ENABLED" = "true" ] && echo "WAF" || echo "Non-WAF" )
          EXP_LABEL=$( [ "$EXP" = "true" ] && echo "EXP" || echo "Non-EXP" )
          echo "CONFIG_LABEL=${WAF_LABEL} + ${EXP_LABEL}" >> $GITHUB_OUTPUT

      - name: Send Quota Failure Notification
        if: inputs.deploy_result == 'failure' && inputs.QUOTA_FAILED == 'true'
        shell: bash
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}
          GITHUB_RUN_ID: ${{ github.run_id }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
          CONFIG_LABEL: ${{ steps.config.outputs.CONFIG_LABEL }}
        run: |
          RUN_URL="https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
          EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>We would like to inform you that the ${ACCELERATOR_NAME} deployment has failed due to insufficient quota.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>❌ FAILED (Insufficient Quota)</td></tr><tr><td>E2E Tests</td><td>⏭️ SKIPPED</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Configuration:</strong> ${CONFIG_LABEL}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Please resolve the quota issue and retry the deployment.</p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "❌[CI/CD-Automation] [${ACCELERATOR_NAME}] Insufficient Quota"
          }
          EOF
          )

          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send quota failure notification"

      - name: Send Deployment Failure Notification
        if: inputs.deploy_result == 'failure' && inputs.QUOTA_FAILED != 'true'
        shell: bash
        env:
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          CONFIG_LABEL: ${{ steps.config.outputs.CONFIG_LABEL }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
        run: |
          RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
          RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME"
          
          EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>We would like to inform you that the ${ACCELERATOR_NAME} deployment has failed.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>❌ FAILED (Deployment Issue)</td></tr><tr><td>E2E Tests</td><td>⏭️ SKIPPED</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Deployment Details:</strong><br>• Resource Group: ${RESOURCE_GROUP}</p><p><strong>Configuration:</strong> ${CONFIG_LABEL}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Please investigate the deployment failure at your earliest convenience.</p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "❌[CI/CD-Automation] [${ACCELERATOR_NAME}] Deployment-Failed"
          }
          EOF
          )
          
          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send deployment failure notification"

      - name: Send Success Notification
        if: inputs.deploy_result == 'success' && (inputs.e2e_test_result == 'skipped' || inputs.TEST_SUCCESS == 'true')
        shell: bash
        env:
          INPUT_WEB_APPURL: ${{ inputs.WEB_APPURL }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }}
          INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          GITHUB_REPOSITORY: ${{ github.repository }}
          GITHUB_RUN_ID: ${{ github.run_id }}
          CONFIG_LABEL: ${{ steps.config.outputs.CONFIG_LABEL }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
          RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
          TEST_SUITE_NAME: ${{ steps.test_suite.outputs.TEST_SUITE_NAME }}
          
        run: |
          RUN_URL="https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
          WEBAPP_URL="${INPUT_WEB_APPURL:-$INPUT_EXISTING_WEBAPP_URL}"
          RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME"
          TEST_REPORT_URL="$INPUT_TEST_REPORT_URL"
          
          if [ "$INPUT_E2E_TEST_RESULT" = "skipped" ]; then
            EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>We would like to inform you that the ${ACCELERATOR_NAME} deployment has completed successfully.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>✅ SUCCESS</td></tr><tr><td>E2E Tests</td><td>⏭️ SKIPPED</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Deployment Details:</strong><br>• Resource Group: ${RESOURCE_GROUP}<br>• Web App URL: <a href='${WEBAPP_URL}'>${WEBAPP_URL}</a></p><p><strong>Configuration:</strong> ${CONFIG_LABEL}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "✅[CI/CD-Automation] [${ACCELERATOR_NAME}] Success"
          }
          EOF
            )
          else
            EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>We would like to inform you that the ${ACCELERATOR_NAME} deployment and test automation has completed successfully.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>✅ SUCCESS</td></tr><tr><td>E2E Tests</td><td>✅ SUCCESS</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Deployment Details:</strong><br>• Resource Group: ${RESOURCE_GROUP}<br>• Web App URL: <a href='${WEBAPP_URL}'>${WEBAPP_URL}</a><br>• Test Suite: ${TEST_SUITE_NAME}<br>• Test Report: <a href='${TEST_REPORT_URL}'>View Report</a></p><p><strong>Configuration:</strong> ${CONFIG_LABEL}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "✅[CI/CD-Automation] [${ACCELERATOR_NAME}] Success"
          }
          EOF
            )
          fi
          
          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send success notification"

      - name: Send Test Failure Notification
        if: inputs.deploy_result == 'success' && inputs.e2e_test_result != 'skipped' && inputs.TEST_SUCCESS != 'true'
        shell: bash
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}
          GITHUB_RUN_ID: ${{ github.run_id }}
          INPUT_WEB_APPURL: ${{ inputs.WEB_APPURL }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
          INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
          CONFIG_LABEL: ${{ steps.config.outputs.CONFIG_LABEL }}
          RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
          TEST_SUITE_NAME: ${{ steps.test_suite.outputs.TEST_SUITE_NAME }}
          INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }}
        run: |
          RUN_URL="https://github.com/${{ env.GITHUB_REPOSITORY }}/actions/runs/${{ env.GITHUB_RUN_ID }}"
          TEST_REPORT_URL="$INPUT_TEST_REPORT_URL"
          WEBAPP_URL="${INPUT_WEB_APPURL:-$INPUT_EXISTING_WEBAPP_URL}"
          RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME"
          
          EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>We would like to inform you that ${ACCELERATOR_NAME} test automation has failed.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>✅ SUCCESS</td></tr><tr><td>E2E Tests</td><td>❌ FAILED</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Deployment Details:</strong><br>• Resource Group: ${RESOURCE_GROUP}<br>• Web App URL: <a href='${WEBAPP_URL}'>${WEBAPP_URL}</a><br>• Test Suite: ${TEST_SUITE_NAME}<br>• Test Report: <a href='${TEST_REPORT_URL}'>View Report</a></p><p><strong>Configuration:</strong> ${CONFIG_LABEL}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Please investigate the matter at your earliest convenience.</p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "❌[CI/CD-Automation] [${ACCELERATOR_NAME}] E2E Test-Failed"
          }
          EOF
          )

          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send test failure notification"

      - name: Send Existing URL Success Notification
        if: inputs.deploy_result == 'skipped' && inputs.existing_webapp_url != '' && inputs.e2e_test_result == 'success' && (inputs.TEST_SUCCESS == 'true' || inputs.TEST_SUCCESS == '')
        shell: bash
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}
          GITHUB_RUN_ID: ${{ github.run_id }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
          INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
          RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
          TEST_SUITE_NAME: ${{ steps.test_suite.outputs.TEST_SUITE_NAME }}
        run: |
          RUN_URL="https://github.com/${{ env.GITHUB_REPOSITORY }}/actions/runs/${{ env.GITHUB_RUN_ID }}"
          EXISTING_URL="$INPUT_EXISTING_WEBAPP_URL"
          TEST_REPORT_URL="$INPUT_TEST_REPORT_URL"
          
          EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>The ${ACCELERATOR_NAME} pipeline executed against the <strong>specified Target URL</strong> and test automation has completed successfully.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>⏭️ SKIPPED (Tests executed on Pre-deployed RG)</td></tr><tr><td>E2E Tests</td><td>✅ SUCCESS</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Test Results:</strong><br>• Test Suite: ${TEST_SUITE_NAME}<br>${TEST_REPORT_URL:+• Test Report: <a href='${TEST_REPORT_URL}'>View Report</a>}<br>• Target URL: <a href='${EXISTING_URL}'>${EXISTING_URL}</a></p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "✅[CI/CD-Automation] [${ACCELERATOR_NAME}] Success"
          }
          EOF
          )

          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send existing URL success notification"

      - name: Send Existing URL Test Failure Notification
        if: inputs.deploy_result == 'skipped' && inputs.existing_webapp_url != '' && inputs.e2e_test_result == 'failure'
        shell: bash
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}
          GITHUB_RUN_ID: ${{ github.run_id }}
          INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }}
          INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          CLEANUP_STATUS: ${{ steps.cleanup.outputs.CLEANUP_STATUS }}
          RUN_E2E_TESTS: ${{ env.RUN_E2E_TESTS }}
          TEST_SUITE_NAME: ${{ steps.test_suite.outputs.TEST_SUITE_NAME }}
        run: |
          RUN_URL="https://github.com/${{ env.GITHUB_REPOSITORY }}/actions/runs/${{ env.GITHUB_RUN_ID }}"
          EXISTING_URL="$INPUT_EXISTING_WEBAPP_URL"
          TEST_REPORT_URL="$INPUT_TEST_REPORT_URL"
          
          EMAIL_BODY=$(cat <<EOF
          {
            "body": "<p>Dear Team,</p><p>The ${ACCELERATOR_NAME} pipeline executed against the <strong>specified Target URL</strong> and test automation has failed.</p><p><strong>Status Summary:</strong><br><table border='1' cellpadding='5' cellspacing='0'><tr><th>Stage</th><th>Status</th></tr><tr><td>Deployment</td><td>⏭️ SKIPPED (Tests executed on Pre-deployed RG)</td></tr><tr><td>E2E Tests</td><td>❌ FAILED</td></tr><tr><td>Cleanup</td><td>${CLEANUP_STATUS}</td></tr></table></p><p><strong>Failure Details:</strong><br>• Target URL: <a href='${EXISTING_URL}'>${EXISTING_URL}</a><br>${TEST_REPORT_URL:+• Test Report: <a href='${TEST_REPORT_URL}'>View Report</a>}<br>• Test Suite: ${TEST_SUITE_NAME}</p><p><strong>Run URL:</strong> <a href='${RUN_URL}'>${RUN_URL}</a></p><p>Best regards,<br>Your Automation Team</p>",
            "subject": "❌[CI/CD-Automation] [${ACCELERATOR_NAME}] E2E Test-Failed"
          }
          EOF
          )

          curl -X POST "${LOGICAPP_URL}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send existing URL test failure notification"


================================================
FILE: .github/workflows/pr-title-checker.yml
================================================
name: "PR Title Checker"

on:
  pull_request_target:
    types:
      - opened
      - edited
      - synchronize
  merge_group:

permissions:
  pull-requests: read

jobs:
  main:
    name: Validate PR title
    runs-on: ubuntu-latest
    if: ${{ github.event_name != 'merge_group' }}
    steps:
      - uses: amannn/action-semantic-pull-request@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml
================================================
# ------------------------------------------------------------------------------
# Scheduled Dependabot PRs Auto-Merge Workflow
#
# Purpose:
#   - Automatically detect, rebase (if needed), and merge Dependabot PRs targeting
#     the `dependabotchanges` branch, supporting different merge strategies.
#
# Features:
#   ✅ Filters PRs authored by Dependabot and targets the specific base branch
#   ✅ Rebases PRs with conflicts and auto-resolves using "prefer-theirs" strategy
#   ✅ Attempts all three merge strategies: merge, squash, rebase (first success wins)
#   ✅ Handles errors gracefully, logs clearly
#
# Triggers:
#   - Scheduled daily run (midnight UTC)
#   - Manual trigger (via GitHub UI)
#
# Required Permissions:
#   - contents: write
#   - pull-requests: write
# ------------------------------------------------------------------------------

name: Scheduled Dependabot PRs Auto-Merge

on:
  schedule:
    - cron: '0 0 * * *'  # Runs once a day at midnight UTC
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  merge-dependabot:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Install GitHub CLI
        run: |
          sudo apt update
          sudo apt install -y gh
      - name: Fetch & Filter Dependabot PRs
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          echo "🔍 Fetching all Dependabot PRs targeting 'dependabotchanges'..."
          > matched_prs.txt
          pr_batch=$(gh pr list --state open --json number,title,author,baseRefName,url \
            --jq '.[] | "\(.number)|\(.title)|\(.author.login)|\(.baseRefName)|\(.url)"')
          while IFS='|' read -r number title author base url; do
            author=$(echo "$author" | xargs)
            base=$(echo "$base" | xargs)
            if [[ "$author" == "app/dependabot" && "$base" == "dependabotchanges" ]]; then
              echo "$url" >> matched_prs.txt
              echo "✅ Matched PR #$number - $title"
            else
              echo "❌ Skipped PR #$number - $title (Author: $author, Base: $base)"
            fi
          done <<< "$pr_batch"
          echo "👉 Matched PRs:"
          cat matched_prs.txt || echo "None"
      - name: Rebase PR if Conflicts Exist
        if: success()
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          if [[ ! -s matched_prs.txt ]]; then
            echo "⚠️ No matching PRs to process."
            exit 0
          fi
          while IFS= read -r pr_url; do
            pr_number=$(basename "$pr_url")
            echo "🔁 Checking PR #$pr_number for conflicts..."
            mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable')
            if [[ "$mergeable" == "CONFLICTING" ]]; then
              echo "⚠️ Merge conflicts detected. Performing manual rebase for PR #$pr_number..."
              head_branch=$(gh pr view "$pr_number" --json headRefName --jq '.headRefName')
              base_branch=$(gh pr view "$pr_number" --json baseRefName --jq '.baseRefName')
              git fetch origin "$base_branch":"$base_branch"
              git fetch origin "$head_branch":"$head_branch"
              git checkout "$head_branch"
              git config user.name "github-actions"
              git config user.email "action@github.com"
              # Attempt rebase with 'theirs' strategy
              if git rebase --strategy=recursive -X theirs "$base_branch"; then
                echo "✅ Rebase successful. Pushing..."
                git push origin "$head_branch" --force
              else
                echo "❌ Rebase failed. Aborting..."
                git rebase --abort || true
              fi
            else
              echo "✅ PR #$pr_number is mergeable. Skipping rebase."
            fi
          done < matched_prs.txt
          
      - name: Auto-Merge PRs using available strategy
        if: success()
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          if [[ ! -s matched_prs.txt ]]; then
            echo "⚠️ No matching PRs to process."
            exit 0
          fi
          while IFS= read -r pr_url; do
            pr_number=$(basename "$pr_url")
            echo "🔍 Checking mergeability for PR #$pr_number"
            attempt=0
            max_attempts=8
            mergeable=""
            sleep 5  # Let GitHub calculate mergeable status
            while [[ $attempt -lt $max_attempts ]]; do
              mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable' 2>/dev/null || echo "UNKNOWN")
              echo "🔁 Attempt $((attempt+1))/$max_attempts: mergeable=$mergeable"
              if [[ "$mergeable" == "MERGEABLE" ]]; then
                success=0
                for strategy in rebase squash merge; do
                  echo "🚀 Trying to auto-merge PR #$pr_number using '$strategy' strategy..."
                  set -x
                  merge_output=$(gh pr merge --auto --"$strategy" "$pr_url" 2>&1)
                  merge_status=$?
                  set +x
                  echo "$merge_output"
                  if [[ $merge_status -eq 0 ]]; then
                    echo "✅ Auto-merge succeeded using '$strategy'."
                    success=1
                    break
                  else
                    echo "❌ Auto-merge failed using '$strategy'. Trying next strategy..."
                  fi
                done
                if [[ $success -eq 0 ]]; then
                  echo "❌ All merge strategies failed for PR #$pr_number"
                fi
                break
              elif [[ "$mergeable" == "CONFLICTING" ]]; then
                echo "❌ Cannot merge due to conflicts. Skipping PR #$pr_number"
                break
              else
                echo "🕒 Waiting for GitHub to determine mergeable status..."
                sleep 15
              fi
              ((attempt++))
            done
            if [[ "$mergeable" != "MERGEABLE" && "$mergeable" != "CONFLICTING" ]]; then
              echo "❌ Mergeability undetermined after $max_attempts attempts. Skipping PR #$pr_number"
            fi
          done < matched_prs.txt || echo "⚠️ Completed loop with some errors, but continuing gracefully."

================================================
FILE: .github/workflows/stale-bot.yml
================================================
name: "Manage Stale Issues, PRs & Unmerged Branches"
on:
  schedule:
    - cron: '30 1 * * *'  # Runs daily at 1:30 AM UTC
  workflow_dispatch:  # Allows manual triggering
permissions:
  contents: write
  issues: write
  pull-requests: write
jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - name: Mark Stale Issues and PRs
        uses: actions/stale@v10
        with:
          stale-issue-message: "This issue is stale because it has been open 180 days with no activity. Remove stale label or comment, or it will be closed in 30 days."
          stale-pr-message: "This PR is stale because it has been open 180 days with no activity. Please update or it will be closed in 30 days."
          days-before-stale: 180
          days-before-close: 30
          exempt-issue-labels: "keep"
          exempt-pr-labels: "keep"
  cleanup-branches:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0  # Fetch full history for accurate branch checks
      - name: Fetch All Branches
        run: git fetch --all --prune
      - name: List Merged Branches With No Activity in Last 3 Months
        run: |
          
          echo "Branch Name,Last Commit Date,Committer,Committed In Branch,Action" > merged_branches_report.csv
          
          for branch in $(git for-each-ref --format '%(refname:short) %(committerdate:unix)' refs/remotes/origin | awk -v date=$(date -d '3 months ago' +%s) '$2 < date {print $1}'); do
            if [[ "$branch" != "origin/main" && "$branch" != "origin/dev" ]]; then
              branch_name=${branch#origin/}
              # Ensure the branch exists locally before getting last commit date
              git fetch origin "$branch_name" || echo "Could not fetch branch: $branch_name"
              last_commit_date=$(git log -1 --format=%ci "origin/$branch_name" || echo "Unknown")
              committer_name=$(git log -1 --format=%cn "origin/$branch_name" || echo "Unknown")
              committed_in_branch=$(git branch -r --contains "origin/$branch_name" | tr -d ' ' | paste -sd "," -)
              echo "$branch_name,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv
            fi
          done
      - name: List PR Approved and Merged Branches Older Than 30 Days
        run: |
          
          for branch in $(gh api repos/${{ github.repository }}/pulls --jq '.[] | select(.merged_at != null and (.base.ref == "main" or .base.ref == "dev")) | select(.merged_at | fromdateiso8601 < (now - 2592000)) | .head.ref'); do
            # Ensure the branch exists locally before getting last commit date
            git fetch origin "$branch" || echo "Could not fetch branch: $branch"
            last_commit_date=$(git log -1 --format=%ci origin/$branch || echo "Unknown")
            committer_name=$(git log -1 --format=%cn origin/$branch || echo "Unknown")
            committed_in_branch=$(git branch -r --contains "origin/$branch" | tr -d ' ' | paste -sd "," -)
            echo "$branch,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv
          done
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: List Open PR Branches With No Activity in Last 3 Months
        run: |
          
          for branch in $(gh api repos/${{ github.repository }}/pulls --state open --jq '.[] | select(.base.ref == "main" or .base.ref == "dev") | .head.ref'); do
            # Ensure the branch exists locally before getting last commit date
            git fetch origin "$branch" || echo "Could not fetch branch: $branch"
            last_commit_date=$(git log -1 --format=%ci origin/$branch || echo "Unknown")
            committer_name=$(git log -1 --format=%cn origin/$branch || echo "Unknown")
            if [[ $(date -d "$last_commit_date" +%s) -lt $(date -d '3 months ago' +%s) ]]; then
              # If no commit in the last 3 months, mark for deletion
              committed_in_branch=$(git branch -r --contains "origin/$branch" | tr -d ' ' | paste -sd "," -)
              echo "$branch,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv
            fi
          done
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Upload CSV Report of Inactive Branches
        uses: actions/upload-artifact@v7
        with:
          name: merged-branches-report
          path: merged_branches_report.csv
          retention-days: 30


================================================
FILE: .github/workflows/test-automation-v2.yml
================================================
name: Test Automation Dkm-v2

on:
    workflow_call:
        inputs:
          TEST_URL:
            required: true
            type: string
            description: "Web URL for Dkm"
          TEST_SUITE:
            required: false
            type: string
            default: "GoldenPath-Testing"
            description: "Test suite to run: 'Smoke-Testing', 'GoldenPath-Testing' "
        outputs:
          TEST_SUCCESS:
            description: "Whether tests passed"
            value: ${{ jobs.test.outputs.TEST_SUCCESS }}
          TEST_REPORT_URL:
            description: "URL to test report artifact"
            value: ${{ jobs.test.outputs.TEST_REPORT_URL }}

env:
    url: ${{ inputs.TEST_URL }}
    accelerator_name: "DKM"
    test_suite: ${{ inputs.TEST_SUITE }}

jobs:
  test:
    runs-on: ubuntu-latest
    environment: production
    outputs:
      TEST_SUCCESS: ${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}
      TEST_REPORT_URL: ${{ steps.upload_report.outputs.artifact-url }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v5

      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.13'

      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r tests/e2e-test/requirements.txt

      - name: Ensure browsers are installed
        run: python -m playwright install --with-deps chromium

      - name: Validate URL
        run: |
          if [ -z "${{ env.url }}" ]; then
            echo "ERROR: No URL provided for testing"
            exit 1
          fi
          
          echo "Testing URL: ${{ env.url }}"
          echo "Test Suite: ${{ env.test_suite }}"


      - name: Wait for Application to be Ready
        run: |
          echo "Waiting for application to be ready at ${{ env.url }} "
          max_attempts=10
          attempt=1
          
          while [ $attempt -le $max_attempts ]; do
            echo "Attempt $attempt: Checking if application is ready..."
            if curl -f -s "${{ env.url }}" > /dev/null; then
              echo "Application is ready!"
              break

            fi
            
            if [ $attempt -eq $max_attempts ]; then
              echo "Application is not ready after $max_attempts attempts"
              exit 1
            fi
            
            echo "Application not ready, waiting 30 seconds..."
            sleep 30
            attempt=$((attempt + 1))
          done

      - name: Run tests(1)
        id: test1
        run: |
          if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then
            xvfb-run pytest -m goldenpath --headed --html=report/report.html --self-contained-html
          else
            xvfb-run pytest --headed --html=report/report.html --self-contained-html
          fi
        working-directory: tests/e2e-test
        continue-on-error: true

      - name: Sleep for 30 seconds
        if: ${{ steps.test1.outcome == 'failure' }}
        run: sleep 30s
        shell: bash

      - name: Run tests(2)
        id: test2
        if: ${{ steps.test1.outcome == 'failure' }}
        run: |
          if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then
            xvfb-run pytest -m goldenpath --headed --html=report/report.html --self-contained-html
          else
            xvfb-run pytest --headed --html=report/report.html --self-contained-html
          fi
        working-directory: tests/e2e-test
        continue-on-error: true

      - name: Sleep for 60 seconds
        if: ${{ steps.test2.outcome == 'failure' }}
        run: sleep 60s
        shell: bash

      - name: Run tests(3)
        id: test3
        if: ${{ steps.test2.outcome == 'failure' }}
        run: |
          if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then
            xvfb-run pytest -m goldenpath --headed --html=report/report.html --self-contained-html
          else
            xvfb-run pytest --headed --html=report/report.html --self-contained-html
          fi
        working-directory: tests/e2e-test

      - name: Upload test report
        id: upload_report
        uses: actions/upload-artifact@v4
        if: ${{ !cancelled() }}
        with:
          name: test-report
          path: tests/e2e-test/report/*

      - name: Generate E2E Test Summary
        if: always()
        run: |
          # Determine test suite type for title
          if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then
            echo "## 🧪 E2E Test Job Summary : Golden Path Testing" >> $GITHUB_STEP_SUMMARY
          else
            echo "## 🧪 E2E Test Job Summary : Smoke Testing" >> $GITHUB_STEP_SUMMARY
          fi
          echo "" >> $GITHUB_STEP_SUMMARY
          echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
          echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
          
          # Determine overall test result
          OVERALL_SUCCESS="${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}"
          if [[ "$OVERALL_SUCCESS" == "true" ]]; then
            echo "| **Job Status** | ✅ Success |" >> $GITHUB_STEP_SUMMARY
          else
            echo "| **Job Status** | ❌ Failed |" >> $GITHUB_STEP_SUMMARY
          fi
          
          echo "| **Target URL** | [${{ env.url }}](${{ env.url }}) |" >> $GITHUB_STEP_SUMMARY
          echo "| **Test Suite** | \`${{ env.test_suite }}\` |" >> $GITHUB_STEP_SUMMARY
          echo "| **Test Report** | [Download Artifact](${{ steps.upload_report.outputs.artifact-url }}) |" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          
          echo "### 📋 Test Execution Details" >> $GITHUB_STEP_SUMMARY
          echo "| Attempt | Status | Notes |" >> $GITHUB_STEP_SUMMARY
          echo "|---------|--------|-------|" >> $GITHUB_STEP_SUMMARY
          echo "| **Test Run 1** | ${{ steps.test1.outcome == 'success' && '✅ Passed' || '❌ Failed' }} | Initial test execution |" >> $GITHUB_STEP_SUMMARY
          
          if [[ "${{ steps.test1.outcome }}" == "failure" ]]; then
            echo "| **Test Run 2** | ${{ steps.test2.outcome == 'success' && '✅ Passed' || steps.test2.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Retry after 30s delay |" >> $GITHUB_STEP_SUMMARY
          fi
          
          if [[ "${{ steps.test2.outcome }}" == "failure" ]]; then
            echo "| **Test Run 3** | ${{ steps.test3.outcome == 'success' && '✅ Passed' || steps.test3.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Final retry after 60s delay |" >> $GITHUB_STEP_SUMMARY
          fi
          
          echo "" >> $GITHUB_STEP_SUMMARY
          
          if [[ "$OVERALL_SUCCESS" == "true" ]]; then
            echo "### ✅ Test Results" >> $GITHUB_STEP_SUMMARY
            echo "- End-to-end tests completed successfully" >> $GITHUB_STEP_SUMMARY
            echo "- Application is functioning as expected" >> $GITHUB_STEP_SUMMARY
          else
            echo "### ❌ Test Results" >> $GITHUB_STEP_SUMMARY
            echo "- All test attempts failed" >> $GITHUB_STEP_SUMMARY
            echo "- Check the e2e-test/test job for detailed error information" >> $GITHUB_STEP_SUMMARY
          fi

================================================
FILE: .github/workflows/test-automation.yml
================================================
name: Test Automation DKM

on:
  workflow_call:
    inputs:
      DKM_URL:
        required: true
        type: string
        description: "Web URL for DKM"
    secrets:
      EMAILNOTIFICATION_LOGICAPP_URL_TA:
        required: false
        description: "Logic App URL for email notifications"

env:
    url: ${{ inputs.DKM_URL }}
    accelerator_name: "DKM"
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.13'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r tests/e2e-test/requirements.txt

      - name: Ensure browsers are installed
        run: python -m playwright install --with-deps chromium

      - name: Open URL
        run: |
          echo "Opening URL: ${{ env.url }}"
          python -m webbrowser "${{ env.url }}"

      - name: Sleep for 30 seconds
        run: sleep 30s
        shell: bash

      - name: Run tests(1)
        id: test1
        run: |
          xvfb-run pytest --headed --html=report/report.html --self-contained-html
        working-directory: tests/e2e-test
        continue-on-error: true

      - name: Sleep for 30 seconds
        if: ${{ steps.test1.outcome == 'failure' }}
        run: sleep 30s
        shell: bash

      - name: Run tests(2)
        id: test2
        if: ${{ steps.test1.outcome == 'failure' }}
        run: |
          xvfb-run pytest --headed --html=report/report.html --self-contained-html
        working-directory: tests/e2e-test
        continue-on-error: true

      - name: Sleep for 60 seconds
        if: ${{ steps.test2.outcome == 'failure' }}
        run: sleep 60s
        shell: bash

      - name: Run tests(3)
        id: test3
        if: ${{ steps.test2.outcome == 'failure' }}
        run: |
          xvfb-run pytest --headed --html=report/report.html --self-contained-html
        working-directory: tests/e2e-test

      - name: Upload test report
        id: upload_report
        uses: actions/upload-artifact@v7
        if: ${{ !cancelled() }}
        with:
          name: test-report
          path: tests/e2e-test/report/*

      - name: Send Notification
        if: always()
        run: |
          RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
          REPORT_URL=${{ steps.upload_report.outputs.artifact-url }}
          IS_SUCCESS=${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}
          # Construct the email body
          if [ "$IS_SUCCESS" = "true" ]; then
            EMAIL_BODY=$(cat <<EOF
            {
              "body": "<p>Dear Team,</p><p>We would like to inform you that the ${{ env.accelerator_name }} Test Automation process has completed successfully.</p><p><strong>Run URL:</strong> <a href=\"${RUN_URL}\">${RUN_URL}</a><br></p><p><strong>Test Report:</strong> <a href=\"${REPORT_URL}\">${REPORT_URL}</a></p><p>Best regards,<br>Your Automation Team</p>",
              "subject": "${{ env.accelerator_name }} Test Automation - Success"
            }
          EOF
            )
          else
            EMAIL_BODY=$(cat <<EOF
            {
              "body": "<p>Dear Team,</p><p>We would like to inform you that the ${{ env.accelerator_name }} Test Automation process has encountered an issue and has failed to complete successfully.</p><p><strong>Run URL:</strong> <a href=\"${RUN_URL}\">${RUN_URL}</a><br></p><p><strong>Test Report:</strong> <a href=\"${REPORT_URL}\">${REPORT_URL}</a></p><p>Please investigate the matter at your earliest convenience.</p><p>Best regards,<br>Your Automation Team</p>",
              "subject": "${{ env.accelerator_name }} Test Automation - Failure"
            }
          EOF
            )
          fi

          # Send the notification
          curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \
            -H "Content-Type: application/json" \
            -d "$EMAIL_BODY" || echo "Failed to send notification"

================================================
FILE: .github/workflows/validate-bicep-params.yml
================================================
name: Validate Bicep Parameters

permissions:
  contents: read

on:
  schedule:
    - cron: '30 6 * * 3' # Wednesday 12:00 PM IST (6:30 AM UTC)
  pull_request:
    branches:
      - main
      - dev
    paths:
      - 'infra/**/*.bicep'
      - 'infra/**/*.parameters.json'
      - 'Deployment/validate_bicep_params.py'
  workflow_dispatch:

env:
  accelerator_name: "DKM"

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Validate infra/ parameters
        id: validate_infra
        continue-on-error: true
        env:
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
        run: |
          set +e
          RUN_URL="https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
          python Deployment/validate_bicep_params.py --dir infra --strict --no-color \
            --json-output infra_results.json \
            --html-output email_body.html \
            --accelerator-name "${ACCELERATOR_NAME}" \
            --run-url "${RUN_URL}" 2>&1 | tee infra_output.txt
          EXIT_CODE=${PIPESTATUS[0]}
          set -e
          echo "## Infra Param Validation" >> "$GITHUB_STEP_SUMMARY"
          echo '```' >> "$GITHUB_STEP_SUMMARY"
          cat infra_output.txt >> "$GITHUB_STEP_SUMMARY"
          echo '```' >> "$GITHUB_STEP_SUMMARY"
          exit $EXIT_CODE

      - name: Set overall result
        id: result
        run: |
          if [[ "${{ steps.validate_infra.outcome }}" == "failure" ]]; then
            echo "status=failure" >> "$GITHUB_OUTPUT"
          else
            echo "status=success" >> "$GITHUB_OUTPUT"
          fi

      - name: Upload validation results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: bicep-validation-results
          path: |
            infra_results.json
            email_body.html
          retention-days: 30

      - name: Send schedule notification on failure
        if: github.event_name == 'schedule' && steps.result.outputs.status == 'failure'
        env:
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
        run: |
          EMAIL_BODY=$(cat email_body.html)

          jq -n \
            --arg name "${ACCELERATOR_NAME}" \
            --arg body "$EMAIL_BODY" \
            '{subject: ("Bicep Parameter Validation Report - " + $name + " - Issues Detected"), body: $body}' \
            | curl -X POST "${LOGICAPP_URL}" \
              -H "Content-Type: application/json" \
              -d @- || echo "Failed to send notification"

      - name: Send schedule notification on success
        if: github.event_name == 'schedule' && steps.result.outputs.status == 'success'
        env:
          LOGICAPP_URL: ${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}
          ACCELERATOR_NAME: ${{ env.accelerator_name }}
        run: |
          EMAIL_BODY=$(cat email_body.html)

          jq -n \
            --arg name "${ACCELERATOR_NAME}" \
            --arg body "$EMAIL_BODY" \
            '{subject: ("Bicep Parameter Validation Report - " + $name + " - Passed"), body: $body}' \
            | curl -X POST "${LOGICAPP_URL}" \
              -H "Content-Type: application/json" \
              -d @- || echo "Failed to send notification"

      - name: Fail if errors found
        if: steps.result.outputs.status == 'failure'
        run: exit 1


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from `dotnet new gitignore`

# dotenv files
.env

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET
project.lock.json
project.fragment.lock.json
artifacts/

# Tye
.tye/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml
.idea/

##
## Visual studio for Mac
##


# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/

# Mac bundle stuff
*.dmg
*.app

# content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

# Vim temporary swap files
*.swp


================================================
FILE: App/backend-api/.dockerignore
================================================
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**

================================================
FILE: App/backend-api/.gitignore
================================================
KernelMemoryDev.*

dotnet/.config
tmp/
_tmp/
tmp-*/
out/
_files/
_vectors/
_queues/
_textdb/
.chromaenv
.chromadb
*.patch

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
# **/[Pp]ackages/*
**/[Pp]ackages/*.sh
**/[Pp]ackages/*.nupkg
**/[Pp]ackages/*.snupkg
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml
*.tmp
*.log
*.bck
*.tgz
*.tar
*.zip
*.cer
*.crt
*.key
*.pem

.env
certs/

# to make sure we don't commit local settings which might contain credentials
launchSettings.json
*launchSettings.json*
config.development.yaml
*.development.config
*.development.json
*.development.json*
appsettings.*.json

.DS_Store
.idea/
node_modules/
obj/
bin/
_dev/
.dev/
*.devis.*
*.devis
.vs/
*.user
**/.vscode/chrome
**/.vscode/.ropeproject/objectdb
*.pyc
.ipynb_checkpoints
.jython_cache/
__pycache__/
.mypy_cache/
__pypackages__/
.pdm.toml
global.json

# doxfx
**/DROP/
**/TEMP/
# **/packages/
**/bin/
**/obj/
_site

# Yarn
.yarn
.yarnrc.yml

# Python Environments
.env
.venv
.myenv
env/
venv/
myvenv/
ENV/

# Python dist
dist/

# Peristant storage
data/qdrant
data/chatstore*

# Java build
java/**/target
java/.mvn/wrapper/maven-wrapper.jar

# Java settings
conf.properties

# Playwright
playwright-report/

# Static Web App deployment config
swa-cli.config.json
**/copilot-chat-app/webapp/build
**/copilot-chat-app/webapp/node_modules

*.orig


Microsoft.GS.DPS.Playground/
buildandpush_dpshost.ps1
rollout.ps1

================================================
FILE: App/backend-api/Dockerfile
================================================
# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 9001

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release

WORKDIR /src
COPY ["Microsoft.GS.DPS.Host/Microsoft.GS.DPS.Host.csproj", "./Microsoft.GS.DPS.Host/"]
COPY ["Microsoft.GS.DPS/Microsoft.GS.DPS.csproj", "./Microsoft.GS.DPS/"]
RUN dotnet restore "./Microsoft.GS.DPS.Host/Microsoft.GS.DPS.Host.csproj"
COPY . .
WORKDIR "/src/Microsoft.GS.DPS.Host"
RUN dotnet build "./Microsoft.GS.DPS.Host.csproj" -c $BUILD_CONFIGURATION -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Microsoft.GS.DPS.Host.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
USER root
RUN apt-get update \
    && apt-get install -y libfontconfig

WORKDIR /app
COPY --from=publish /app/publish .

ENV ASPNETCORE_ENVIRONMENT=Development
ENV ASPNETCORE_URLS=http://+:9001
ENV ASPNETCORE_HTTP_PORTS=9001

EXPOSE 9001

ENTRYPOINT ["dotnet", "Microsoft.GS.DPS.Host.dll"]

================================================
FILE: App/backend-api/Microsoft.GS.DPS/API/ChatHost/ChatHost.cs
================================================
using Microsoft.GS.DPS.Model.ChatHost;
using Microsoft.GS.DPS.Storage.ChatSessions.Entities;
using Microsoft.GS.DPS.Storage.ChatSessions;
using Microsoft.KernelMemory;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Text.Json;
using System.Runtime.CompilerServices;
using System.Text.Json.Serialization;
using Microsoft.KernelMemory.Context;

namespace Microsoft.GS.DPS.API
{
    internal static class JsonSerializationOptionsCache
    {
        static internal JsonSerializerOptions JsonSerializationOptionsIgnoreCase { get; set; } = new JsonSerializerOptions() { 
            PropertyNameCaseInsensitive = true,
            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
        };
    }

    public class ChatHost(MemoryWebClient kmClient, Kernel kernel, API.KernelMemory kernelMemory, ChatSessionRepository chatSessions)
    {
        private MemoryWebClient _kmClient = kmClient;
        private Kernel _kernel = kernel;
        private API.KernelMemory _kernelMemory = kernelMemory;
        private IChatCompletionService _chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
        private ChatSessionRepository _chatSessions = chatSessions;
        private static string s_systemPrompt;
        private static string s_assistancePrompt;
        private static string s_additionalPrompt;


        string sessionId = string.Empty;
        ChatHistory chatHistory = null;
        ChatSession chatSession = null;

        //static constructor to load the system prompt text at once
        static ChatHost()
        {
            //Set Location of the System Prompt under running Assembly directory location.
            var assemblyLocation = Assembly.GetExecutingAssembly().Location;
            var assemblyDirectory = System.IO.Path.GetDirectoryName(assemblyLocation);
            // binding assembly directory with file path (Prompts/Chat_SystemPrompt.txt)
            var systemPromptFilePath = System.IO.Path.Combine(assemblyDirectory, "Prompts", "Chat_SystemPrompt.txt");
            ChatHost.s_systemPrompt = System.IO.File.ReadAllText(systemPromptFilePath);
            ChatHost.s_assistancePrompt =
                    @"
                        Hello, I can provide you with knowledge based on registered documents and contents. 
                        Please feel free to ask me any questions related to those documents and contents.
                        However, please note that I cannot provide answers for forecasting, prediction, or projections.
                        ";

            // ChatHost.s_additionalPrompt = """
            //             If available, please include the name of the referencing document and its page number in your responses.
            //             Show the detail as much as possible in your answers.
            //             Data should be provided in the form of a table or a list.
            //             Do not use your own or general knowledge to formulate an answer.
            //             You should choose one of actions 
            //             - Make an answer with contents and recent chat history 
            //             - List up chatting history between user and you.
            //             """;

            ChatHost.s_additionalPrompt = "\n You should add citation (Document name and Page) per each every your answer statements.";

        }

        private async Task<ChatSession> makeNewSession(string? chatSessionId)
        {
            var sessionId = string.IsNullOrEmpty(chatSessionId) ? Guid.NewGuid().ToString() : chatSessionId;

            //Create New Chat History
            this.chatHistory = new ChatHistory();
            //Add the system prompt to the chat history
            this.chatHistory.AddSystemMessage(ChatHost.s_systemPrompt);

            //Create a new ChatSession Entity for Saving into Azure Cosmos
            return new ChatSession()
            {
                SessionId = this.sessionId, // New Session ID
                StartTime = DateTime.UtcNow // Session Created Time
            };

        }


        private async IAsyncEnumerable<string> GetAnswerWords(string answer)
        {
            var words = answer.Split(' ');
            foreach (var word in words)
            {
                yield return word;
                await Task.Delay(30);
            }
        }

        public async Task<ChatResponseAsync> ChatAsync(ChatRequest chatRequest)
        {
            var chatResponse = await Chat(chatRequest);
            return new ChatResponseAsync()
            {
                ChatSessionId = chatResponse.ChatSessionId,
                AnswerWords = GetAnswerWords(chatResponse.Answer),
                Answer = chatResponse.Answer,
                DocumentIds = chatResponse.DocumentIds,
                SuggestingQuestions = chatResponse.SuggestingQuestions
            };
        }

        public async Task<ChatResponse> Chat(ChatRequest chatRequest)
        {
            this.chatSession = await _chatSessions.GetSessionAsync(chatRequest.ChatSessionId);
            //just in case there is no chatSession in persistant storage
            //create a new chatSession
            if (this.chatSession == null) this.chatSession = await makeNewSession(chatRequest.ChatSessionId);

            //Rehydrate the ChatHistory from the ChatSession.ChatHistoryJson Field.
            //Due to BSON Deserializer issue, we are using JSON Deserializer
            if (this.chatSession != null && !String.IsNullOrEmpty(this.chatSession.ChatHistoryJson))
            {
                ChatHistory deserializedChatHistory = JsonSerializer.Deserialize<ChatHistory>(chatSession.ChatHistoryJson);
                this.chatHistory = deserializedChatHistory;
            }

            if (chatRequest.DocumentIds == null) chatRequest.DocumentIds = Array.Empty<string>();

            //define custom context for asking the question (max token)
            RequestContext context = new RequestContext()
            {
                Arguments = new Dictionary<string, object?>()
                {
                    { Microsoft.KernelMemory.Constants.CustomContext.Rag.Temperature, 0},
                    { Microsoft.KernelMemory.Constants.CustomContext.Rag.MaxTokens, 10000 }
                }
            };

            //Calculate prompt token size of prompt for the question and additional prompt with using Tiktoken
            
            
            //var tokenSize = chatRequest.Question.Length + ChatHost.s_additionalPrompt.Length;



            //Get the answer from the Kernel Memory
            var answer = await _kernelMemory.Ask(chatRequest.Question + ChatHost.s_additionalPrompt, chatRequest.DocumentIds, context: context);

            answer.Result = System.Text.Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(answer.Result));
            Console.WriteLine($"Question: {answer.Question}");
            Console.WriteLine($"Answer: {answer.Result}");

            //UpdateAsync System Prompt with the answer
            //replace {$answer} place holder in s_systemPrompt with the actual answer
            this.chatHistory[0].Content = s_systemPrompt.Replace("{$answer}", answer.Result);
            this.chatHistory[0].Role = AuthorRole.System;


            //Add User Message to the Chat History
            this.chatHistory.AddUserMessage("Currently Selected Documents are as below: \n" + string.Join("\n", answer.RelevantSources.Select(x => x.SourceName)) + "\n" + chatRequest.Question + ChatHost.s_additionalPrompt);

            ////Check History Rows and remove the oldest row if it exceeds max history count
            var historyCount = 10;
            // System prompt and first assistant prompt will be always there
            if (this.chatHistory.Count > historyCount + 2)
            {
                //Remove the oldest rows - Question and Answer
                this.chatHistory.RemoveRange(2, this.chatHistory.Count - (historyCount));
            }

            //UpdateAsync PromptExecutionSettings with the temperature
            var executionSettings = new PromptExecutionSettings()
            {
                ExtensionData = new Dictionary<string, object>
                                        {
                                            { "Temperature", 0.5 },
                                            { "MaxTokens", 16384  }
                                        }
            };

            ChatMessageContent returnedChatMessageContent;
            try
            {

                //Get Response from ChatCompletionService
                returnedChatMessageContent = await _chatCompletionService.GetChatMessageContentAsync(chatHistory, executionSettings);
            }
            catch (HttpOperationException ex) when (ex.Message.Contains("content_filter", StringComparison.OrdinalIgnoreCase))
            {
                
                Console.WriteLine($"Exception Message: {ex.Message}");
                
                //if content filter triggered providing fallback response
                returnedChatMessageContent = new ChatMessageContent
                {
                    Content = "Sorry, your request couldn't be processed as it may contain sensitive or restricted content. Please rephrase your query and try again."
                };
            }
            catch(Exception ex)
            {
                Console.WriteLine($"unexpected error: {ex.Message}");
             
                    returnedChatMessageContent = new ChatMessageContent
                    {
                        Content = "An error occured while processing request, try again"
                    };
                
            }
            if (returnedChatMessageContent == null)
            {
                returnedChatMessageContent = new ChatMessageContent
                {
                    Content = "No response"
                };
            }
            //Just in case returnedChatMessageContent.Content has ```json ``` block, Strip it first
            if (returnedChatMessageContent.Content != null && returnedChatMessageContent.Content.Contains("```json", StringComparison.OrdinalIgnoreCase))
                returnedChatMessageContent.Content = returnedChatMessageContent.Content.Replace("```json", "").Replace("```", "");

            Answer answerObject = null;

            try
            {
                if (returnedChatMessageContent != null && !string.IsNullOrWhiteSpace(returnedChatMessageContent.Content))
                {

                    //Adding for non English Response.
                    returnedChatMessageContent.Content = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.UTF8.GetBytes(returnedChatMessageContent.Content));
                    answerObject = JsonSerializer.Deserialize<Answer>(returnedChatMessageContent.Content, options: new JsonSerializerOptions
                    {
                        PropertyNameCaseInsensitive = true,
                        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
                    });
                }
                else
                {
                    throw new NullReferenceException("returnedChatMessageContent or its Content is null.");
                }
            }
            catch
            {
                answerObject = new Answer()
                {
                    Response = returnedChatMessageContent.Content,
                    Followings = new string[] { }
                };
            }

            if (returnedChatMessageContent.Content.Contains("I don't have enough information to provide an answer.", StringComparison.OrdinalIgnoreCase) ||
                returnedChatMessageContent.Content.Contains("No Information", StringComparison.OrdinalIgnoreCase))
            {
                answerObject.Response = "I don't have enough information to provide an answer. Would you please rephrase your question and ask me again?";
            }


            //Add Assistant Message and Data to the Chat History
            this.chatHistory.AddAssistantMessage($"this is the content for creating answer :\n{answer.Result}");
            this.chatHistory.AddAssistantMessage(returnedChatMessageContent.Content);
            

            //UpdateAsync last message updated Time
            this.chatSession.EndTime = DateTime.UtcNow;

            //Hydrate Chathistory back to ChatSession.ChatHistoryJson Field
            this.chatSession.ChatHistoryJson = JsonSerializer.Serialize<ChatHistory>(chatHistory);

            //UpdateAsync ChatSession Entity
            await _chatSessions.UpdateSessionAsync(this.chatSession);


            return new ChatResponse()
            {
                ChatSessionId = this.chatSession.SessionId,
                Answer = answerObject.Response,
                DocumentIds = chatRequest.DocumentIds,
                SuggestingQuestions = answerObject.Followings,
                Keywords = answerObject.Keywords
            };
        }
    }
}

================================================
FILE: App/backend-api/Microsoft.GS.DPS/API/KernelMemory/KernelMemory.cs
================================================
using DnsClient.Internal;
using Microsoft.GS.DPS.Images;
using Microsoft.GS.DPS.Model.KernelMemory;
using Microsoft.GS.DPS.Storage.Document;
using Microsoft.KernelMemory;
using Microsoft.KernelMemory.Context;
using Microsoft.KernelMemory.Pipeline;
using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Document = Microsoft.GS.DPS.Storage.Document.Entities.Document;
using Microsoft.GS.DPS.API.UserInterface;
using Microsoft.GS.DPS.Storage.AISearch;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace Microsoft.GS.DPS.API
{
    public class KernelMemory
    {
        private MemoryWebClient _kmClient;
        private DocumentRepository _documentRepository;
        private DataCacheManager _dataCache;
        private TagUpdater _tagUpdator;
        private static string keywordExtractorPrompt = "";

        static KernelMemory()
        {
            //Set Location of the System Prompt under running Assembly directory location.
            var assemblyLocation = Assembly.GetExecutingAssembly().Location;
            var assemblyDirectory = System.IO.Path.GetDirectoryName(assemblyLocation);
            // binding assembly directory with file path (Prompts/KeywordExtract_SystemPrompt.txt)
            var systemPromptFilePath = System.IO.Path.Combine(assemblyDirectory, "Prompts", "KeywordExtract_SystemPrompt.txt");
            KernelMemory.keywordExtractorPrompt = System.IO.File.ReadAllText(systemPromptFilePath);
        }

        public KernelMemory(MemoryWebClient kmClient, DocumentRepository documentRepository, DataCacheManager dataCache, TagUpdater tagUpdator)
        {
            _kmClient = kmClient;
            _documentRepository = documentRepository;
            _dataCache = dataCache;
            _tagUpdator = tagUpdator;
        }

        public async Task<DocumentImportedResult> ImportDocument(Stream documentStream,
                                                                 string fileName, 
                                                                 string contentType)
        {
            // Implementation of the file upload
            var documentId = await _kmClient.ImportDocumentAsync(documentStream, fileName, steps: [
                                    Constants.PipelineStepsExtract,
                                    "keyword_extract",
                                    Constants.PipelineStepsSummarize,
                                    Constants.PipelineStepsPartition,
                                    Constants.PipelineStepsGenEmbeddings,
                                    Constants.PipelineStepsSaveRecords
                            ]);
            // Check the processing status of the document with Timeout 3mins
            var startTime = DateTime.Now;
            var elapsedTime = DateTime.Now - startTime;

            // Set Timeout 60 mins - Document Processing Time
            var timeout = TimeSpan.FromMinutes(60);

            while (true)
            {
                var isReady = await _kmClient.IsDocumentReadyAsync(documentId);
                if (isReady) break;

                await Task.Delay(5000);
                elapsedTime = DateTime.Now - startTime;
                if (elapsedTime > timeout)
                {
                    throw new TimeoutException("Document processing timeout");
                }
            }

            var importedResult = new DocumentImportedResult
            {
                DocumentId = documentId,
                ImportedTime = DateTime.UtcNow,
                MimeType = contentType,
                FileName = fileName,
                ProcessingTime = elapsedTime,
                Keywords = await getKeywords(documentId, fileName),
                Summary = await getSummary(documentId, fileName)
            };


            // Save the document to the repository
            Document document = new Document
            {
                DocumentId = documentId,
                FileName = fileName,
                ImportedTime = importedResult.ImportedTime,
                MimeType = contentType,
                ProcessingTime = importedResult.ProcessingTime,
                Summary = importedResult.Summary,
                Keywords = importedResult.Keywords
            };

            await _documentRepository.RegisterAsync(document);

            //Cache Refresh
            _dataCache.ManualRefresh();

            return importedResult;
        }

        public async Task<bool> DeleteDocument(string documentId)
        {
            if (string.IsNullOrEmpty(documentId))
            {
                throw new ArgumentException("DocumentId is required");
            }

            // DeleteAsync the document from the repository
            Document registeredDocument = await _documentRepository.FindByDocumentIdAsync(documentId);
            //var document = registeredDocument.Results.FirstOrDefault();
            if (registeredDocument != null)  await _documentRepository.DeleteAsync(registeredDocument.id);
            
            // DeleteAsync the document from the Kernel Memory
            await _kmClient.DeleteDocumentAsync(documentId);

            return true;
        }


        private async Task<string> getSummary(string documentId, string fileName)
        {
            // Summary file
            var summaryFileName = $"{fileName}.summarize.0.txt";
            // Download Summary file
            var summaryFile = await _kmClient.ExportFileAsync(documentId, summaryFileName);
            var summaryFileStream = await summaryFile.GetStreamAsync();
            // Read Stream to string
            return await new StreamReader(summaryFileStream).ReadToEndAsync();
        }


        private async Task<Dictionary<string, string>?> getKeywords(string documentId, string fileName)
        {
            // Get Keyword file
            var keywordFileName = $"{fileName}.tags.json";
            // Download Keyword file
            var keywordFile = await _kmClient.ExportFileAsync(documentId, keywordFileName);
            var keywordFileStream = await keywordFile.GetStreamAsync();
            // Read Stream to string
            string? keywordContent = await new StreamReader(keywordFileStream).ReadToEndAsync();

            if (string.IsNullOrEmpty(keywordContent))
            {
                return new Dictionary<string,string>();
            }else
            {
                // Read the keyword file then parse to KeyValuePair<string, string[]>
                try
                {
                    var result =  JsonSerializer.Deserialize<List<Dictionary<string, List<string>>>>(keywordContent);

                    if (result.Count == 0)
                    {
                        //Just in case the document is large, get keywords via KM.
                        var answer = await _kmClient.AskAsync(question: KernelMemory.keywordExtractorPrompt, filters: new List<MemoryFilter> { new MemoryFilter().ByDocument(documentId) });
                        result = JsonSerializer.Deserialize<List<Dictionary<string, List<string>>>>(answer.Result);
                        var listKeyValueString = new List<string>();
                        foreach (var dict in result)
                        {
                            foreach (var kvp in dict)
                            {
                                foreach (var value in kvp.Value)
                                {
                                    listKeyValueString.Add($"{kvp.Key.Trim()}:{value.Trim()}");
                                }
                            }
                        }
                        //Update Azure Search tags collection.
                        await _tagUpdator.UpdateTags(documentId, listKeyValueString);
                    }

                    //convert result to Dictionary<string, string>
                    var keywordDict = new Dictionary<string, string>();

                    foreach (var item in result)
                    {
                        foreach (var key in item.Keys)
                        {
                            keywordDict.Add(key, string.Join(", ", item[key]));
                        }
                    }

                    return keywordDict;
                }
                catch (Exception)
                {
                    return new Dictionary<string, string>();
                }
            }
        }

        public async Task<MemoryAnswer> Ask(string question, string[] documents, ICollection<MemoryFilter>? filters = null, RequestContext? context = null)
        {
            ICollection<MemoryFilter>? memFilters = null;

            if (documents.Length > 0)
            {
                memFilters = new List<MemoryFilter>();
                foreach (var documentId in documents)
                {
                    memFilters.Add(new MemoryFilter().ByDocument(documentId));
                }
            }

            var answer = await _kmClient.AskAsync(question: question, filters: memFilters, context: context, minRelevance: 0.012);
            return answer;
        }

        public async Task<StreamableFileContent> ExportFile(string documentId, string fileName)
        {
            var fileContent = await _kmClient.ExportFileAsync(documentId, fileName);
            return fileContent;
        }

        
    }
}


================================================
FILE: App/backend-api/Microsoft.GS.DPS/API/UserInterface/DataCacheManager.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Timers;
using Microsoft.GS.DPS.Storage.Document;
using Timers =System.Timers;

namespace Microsoft.GS.DPS.API.UserInterface
{
    public class DataCacheManager
    {
        private readonly DocumentRepository _documentRepository;
        private Dictionary<string, List<string>> _keywordCache;
        private readonly Timers.Timer _cacheTimer;
        private readonly object _cacheLock = new object();

        public DataCacheManager(DocumentRepository documentRepository)
        {
            _documentRepository = documentRepository;
            _keywordCache = new Dictionary<string, List<string>>();
            _cacheTimer = new Timers.Timer(5 * 60 * 1000); // 5 minutes
            _cacheTimer.Elapsed += async (sender, e) => await RefreshCacheAsync();
            _cacheTimer.Start();
        }

        public async Task<Dictionary<string, List<string>>> GetConsolidatedKeywordsAsync()
        {
            if (_keywordCache.Count == 0)
            {
                await RefreshCacheAsync();
            }

            lock (_cacheLock)
            {
                return new Dictionary<string, List<string>>(_keywordCache);
            }
        }

        public async Task RefreshCacheAsync()
        {
            var consolidatedKeywords = new Dictionary<string, List<string>>();
            var documents = await _documentRepository.GetAllDocuments();

            foreach (var document in documents.Where(d => d.Keywords != null))
            {
                foreach (var keywordDict in document.Keywords)
                {
                    if (!consolidatedKeywords.ContainsKey(keywordDict.Key))
                    {
                        consolidatedKeywords[keywordDict.Key] = new List<string>();
                    }

                    var values = keywordDict.Value.Split(',').Select(v => v.Trim()).ToArray();

                    foreach (var value in values)
                    {
                        if (!consolidatedKeywords[keywordDict.Key].Contains(value))
                        {
                            consolidatedKeywords[keywordDict.Key].Add(value);
                        }
                    }

                    consolidatedKeywords[keywordDict.Key] = consolidatedKeywords[keywordDict.Key].OrderBy(v => v).ToList();
                }
            }

            consolidatedKeywords = consolidatedKeywords.OrderBy(k => k.Key).ToDictionary(k => k.Key, v => v.Value);

            lock (_cacheLock)
            {
                _keywordCache = consolidatedKeywords;
            }
        }

        public void ManualRefresh()
        {
            _cacheTimer.Stop();
            _cacheTimer.Start();
            Task.Run(async () => await RefreshCacheAsync());
        }
    }
}


================================================
FILE: App/backend-api/Microsoft.GS.DPS/API/UserInterface/Documents.cs
================================================
using Microsoft.GS.DPS.Storage.Document;
using Entities = Microsoft.GS.DPS.Storage.Document.Entities;
using Microsoft.KernelMemory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.GS.DPS.Storage.Document.Entities;
using System.Reflection.Metadata;
using System.Text.Json;
using static Microsoft.Extensions.Logging.EventSource.LoggingEventSource;
namespace Microsoft.GS.DPS.API.UserInterface
{
    public class Documents
    {
        private readonly DocumentRepository _documentRepository;
        private readonly MemoryWebClient _memoryWebClient;
        private readonly DataCacheManager _dataCache;

        public Documents(DocumentRepository documentRepository, MemoryWebClient memoryWebClient, DataCacheManager dataCache)
        {
            _documentRepository = documentRepository;
            _memoryWebClient = memoryWebClient;
            _dataCache = dataCache;
        }

        private async Task<QueryResultSet> GetAllDocumentsByPageAsync(int pageNumber, 
                                                                      int pageSize, 
                                                                      DateTime? startDate, 
                                                                      DateTime? endDate)
        {
            return await _documentRepository.GetAllDocumentsByPageAsync(pageNumber, pageSize, startDate, endDate);
        }


        public async Task<Model.UserInterface.DocumentQuerySet> GetDocuments(int pageNumber, 
                                                                             int pageSize, 
                                                                             DateTime? startDate, 
                                                                             DateTime? endDate)
        {
            var resultSet = await this.GetAllDocumentsByPageAsync(pageNumber, pageSize,startDate, endDate);
            //var keywordFilterInfo = GetConsolidatedKeywords(resultSet.Results);
            //var keywordFilterInfo = await GetConsolidatedKeywords();
            var keywordFilterInfo = await _dataCache.GetConsolidatedKeywordsAsync();


            return new Model.UserInterface.DocumentQuerySet
            {
                documents = resultSet.Results,
                keywordFilterInfo = keywordFilterInfo,
                TotalPages = resultSet.TotalPages,
                CurrentPage = resultSet.CurrentPage,
                TotalRecords = resultSet.TotalRecords
            };
        }

        public async Task<Entities.Document> GetDocument(string documentId)
        {
            return await _documentRepository.FindByDocumentIdAsync(documentId);
        }

        //public async Task<Model.UserInterface.DocumentQuerySet> GetDocumentsByDocumentIds(string[] documentIds)
        //{
        //    var documents = await _documentRepository.FindByDocumentIdsAsync(documentIds);
        //    return new Model.UserInterface.DocumentQuerySet
        //    {
        //        documents = documents.Results,
        //        keywordFilterInfo = GetConsolidatedKeywords(documents.Results),
        //        TotalPages = documents.TotalPages,
        //        CurrentPage = documents.CurrentPage,
        //        TotalRecords = documents.TotalRecords
        //    };
        //}

        //public async Task<Model.UserInterface.DocumentQuerySet> GetDocumentsByTagAsync(Dictionary<string,string> tags, int pageNumber, int pageSize)
        //{
        //    var documents = await _documentRepository.FindByTagsAsync(tags, pageNumber, pageSize);

        //    return new Model.UserInterface.DocumentQuerySet
        //    {
        //        documents = documents.Results,
        //        keywordFilterInfo = GetConsolidatedKeywords(documents.Results),
        //        TotalPages = documents.TotalPages,
        //        CurrentPage = documents.CurrentPage,
        //        TotalRecords = documents.TotalRecords
        //    };
        //}

        //private async Task<string> DownloadSummaryFromBlob(string documentId, string fileName)
        //{
        //    StreamableFileContent file = await _memoryWebClient.ExportFileAsync(documentId, $"{fileName}.summarize.0.txt");
        //    Stream summarizedFileStream = await file.GetStreamAsync();
        //    return await new StreamReader(summarizedFileStream).ReadToEndAsync();
        //}

        /// <summary>
        /// Search by Keywords and Tags with Paging
        /// </summary>
        /// <param name="pageNumber">Page Number</param>
        /// <param name="pageSize">Page Size (Item Numbers per Page)</param>
        /// <param name="query">Search Keyword</param>
        /// <param name="tags">Tags</param>
        /// <returns></returns>
        public async Task<Model.UserInterface.DocumentQuerySet> GetDocumentsWithQuery(int pageNumber, 
                                                                                      int pageSize, 
                                                                                      string? query, 
                                                                                      Dictionary<string, string>? tags,
                                                                                      DateTime? searchStartDate,
                                                                                      DateTime? searchEndDate)
        {
            //Search from Memory then get the documents
            List<MemoryFilter> filters = new List<MemoryFilter>();

            if (tags != null && tags.Count > 0)
            {
                //The payload will be key and string values with comma separated
                //every values should be added to the filter with same key
                foreach (var kvp in tags)
                {
                    var values = kvp.Value.Split(',').Select(v => v.Trim()).ToArray();
                    foreach (var item in values)
                    {
                        filters.Add(new MemoryFilter().ByTag(kvp.Key, item));
                    }
                }
            }

            if ((string.IsNullOrEmpty(query) || query.Contains("*")) && filters.Count == 0)
            {
                return await this.GetDocuments(pageNumber, pageSize, searchStartDate, searchEndDate);
            }
            else
            {
                //whe
Download .txt
gitextract_t4t3jckk/

├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── subtask.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── CI.yml
│       ├── Create-Release.yml
│       ├── azd-template-validation.yml
│       ├── azure-dev.yml
│       ├── broken-links-checker.yml
│       ├── codeql.yml
│       ├── deploy-orchestrator.yml
│       ├── deploy-v2.yml
│       ├── job-cleanup-deployment.yml
│       ├── job-deploy-linux.yml
│       ├── job-deploy.yml
│       ├── job-send-notification.yml
│       ├── pr-title-checker.yml
│       ├── scheduled-Dependabot-PRs-Auto-Merge.yml
│       ├── stale-bot.yml
│       ├── test-automation-v2.yml
│       ├── test-automation.yml
│       └── validate-bicep-params.yml
├── .gitignore
├── App/
│   ├── backend-api/
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── Dockerfile
│   │   ├── Microsoft.GS.DPS/
│   │   │   ├── API/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   └── ChatHost.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   └── KernelMemory.cs
│   │   │   │   └── UserInterface/
│   │   │   │       ├── DataCacheManager.cs
│   │   │   │       └── Documents.cs
│   │   │   ├── Images/
│   │   │   │   └── FileThumbnailService.cs
│   │   │   ├── Microsoft.GS.DPS.csproj
│   │   │   ├── Model/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   ├── Answer.cs
│   │   │   │   │   ├── ChatRequest.cs
│   │   │   │   │   └── ChatResponse.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   ├── AskParameter.cs
│   │   │   │   │   ├── DocumentDeletedResult.cs
│   │   │   │   │   ├── DocumentImportedResult.cs
│   │   │   │   │   ├── DocumentReadyStatusResult.cs
│   │   │   │   │   └── SearchParameter.cs
│   │   │   │   └── UserInterface/
│   │   │   │       ├── DocumentQuerySet.cs
│   │   │   │       ├── Paging.cs
│   │   │   │       └── PagingRequestWithSearch.cs
│   │   │   ├── Prompts/
│   │   │   │   ├── Chat_SystemPrompt.txt
│   │   │   │   └── KeywordExtract_SystemPrompt.txt
│   │   │   └── Storage/
│   │   │       ├── AISearch/
│   │   │       │   └── TagUpdater.cs
│   │   │       ├── ChatSessions/
│   │   │       │   ├── ChatSessionRepository.cs
│   │   │       │   └── Entities/
│   │   │       │       └── ChatSession.cs
│   │   │       ├── Components/
│   │   │       │   ├── BusinessTransactionRepository.cs
│   │   │       │   ├── CosmosDBEntityBase.cs
│   │   │       │   ├── GenericSpecification.cs
│   │   │       │   ├── IDataRepositoryProvider.cs
│   │   │       │   ├── IEntityModel.cs
│   │   │       │   ├── IRepository.cs
│   │   │       │   ├── ISpecification.cs
│   │   │       │   └── MongoEntityCollectionBase.cs
│   │   │       ├── Documents/
│   │   │       │   ├── DocumentRepository.cs
│   │   │       │   ├── Entities/
│   │   │       │   │   └── Document.cs
│   │   │       │   └── QueryResultSet.cs
│   │   │       └── KeywordsSerializer.cs
│   │   ├── Microsoft.GS.DPS.Host/
│   │   │   ├── API/
│   │   │   │   ├── ChatHost/
│   │   │   │   │   └── Chat.cs
│   │   │   │   ├── KernelMemory/
│   │   │   │   │   └── KernelMemory.cs
│   │   │   │   ├── Operation/
│   │   │   │   │   └── Operation.cs
│   │   │   │   └── UserInterface/
│   │   │   │       └── UserInterface.cs
│   │   │   ├── AppConfiguration/
│   │   │   │   ├── AIServices.cs
│   │   │   │   ├── AppConfiguration.cs
│   │   │   │   └── Services.cs
│   │   │   ├── DependencyConfiguration/
│   │   │   │   └── ServiceDependencies.cs
│   │   │   ├── Helpers/
│   │   │   │   ├── AzureCredentialHelper.cs
│   │   │   │   └── TelemetryHelper.cs
│   │   │   ├── Microsoft.GS.DPS.Host.csproj
│   │   │   ├── Program.cs
│   │   │   ├── appsettings.json
│   │   │   └── dpspilot-host.http
│   │   ├── Microsoft.GS.DPS.sln
│   │   ├── RAI/
│   │   │   ├── prompt_chat.txt
│   │   │   ├── prompt_extract_information.txt
│   │   │   └── prompt_get_context_image.txt
│   │   ├── documents/
│   │   │   ├── .$Architecture.drawio.bkp
│   │   │   ├── Architecture.drawio
│   │   │   ├── DPS - Environment.postman_environment.json
│   │   │   └── DPS.postman_collection.json
│   │   └── pipelines/
│   │       └── dspapi_build.yaml
│   ├── frontend-app/
│   │   ├── .dockerignore
│   │   ├── .eslintignore
│   │   ├── .eslintrc.cjs
│   │   ├── .gitignore
│   │   ├── .prettierignore
│   │   ├── .prettierrc.json
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── jest-setup.ts
│   │   ├── jest.config.ts
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── public/
│   │   │   ├── config.env.js
│   │   │   ├── config.js
│   │   │   ├── locales/
│   │   │   │   └── en/
│   │   │   │       └── translation.json
│   │   │   ├── staticwebapp.config.json
│   │   │   └── web.config
│   │   ├── src/
│   │   │   ├── @types/
│   │   │   │   └── react-tiff.d.tsx
│   │   │   ├── App.tsx
│   │   │   ├── AppContext.tsx
│   │   │   ├── AppRoutes.tsx
│   │   │   ├── api/
│   │   │   │   ├── apiTypes/
│   │   │   │   │   ├── chatTypes.ts
│   │   │   │   │   ├── coverImage.ts
│   │   │   │   │   ├── documentResults.ts
│   │   │   │   │   ├── embedded.ts
│   │   │   │   │   └── singleDocument.ts
│   │   │   │   ├── chatService.ts
│   │   │   │   ├── documentsService.ts
│   │   │   │   └── storageService.ts
│   │   │   ├── assets/
│   │   │   │   ├── icons/
│   │   │   │   │   ├── azureIcon.tsx
│   │   │   │   │   ├── gitHubLogoIcon.tsx
│   │   │   │   │   └── mailIcon.tsx
│   │   │   │   └── scss/
│   │   │   │       └── global.scss
│   │   │   ├── components/
│   │   │   │   ├── chat/
│   │   │   │   │   ├── FeedbackForm.tsx
│   │   │   │   │   ├── OptionsPanel.css
│   │   │   │   │   ├── chatRoom.module.scss
│   │   │   │   │   ├── chatRoom.tsx
│   │   │   │   │   ├── modelSwitch.tsx
│   │   │   │   │   ├── optionsPanel.scss
│   │   │   │   │   └── optionsPanel.tsx
│   │   │   │   ├── datePicker/
│   │   │   │   │   ├── customDatePicker.tsx
│   │   │   │   │   └── dateFilterDropdownMenu.tsx
│   │   │   │   ├── dialogConfirm/
│   │   │   │   │   └── dialogConfirm.tsx
│   │   │   │   ├── documentViewer/
│   │   │   │   │   ├── PagesTab.tsx
│   │   │   │   │   ├── aIKnowledgeTab.tsx
│   │   │   │   │   ├── dialogContentComponent.tsx
│   │   │   │   │   ├── dialogTitleBar.tsx
│   │   │   │   │   ├── documentViewer.tsx
│   │   │   │   │   ├── iFrameComponent.tsx
│   │   │   │   │   ├── imageCarousel.tsx
│   │   │   │   │   ├── metadataTable.tsx
│   │   │   │   │   ├── pageNumberTab.tsx
│   │   │   │   │   ├── tableTab.tsx
│   │   │   │   │   └── tempIframe.tsx
│   │   │   │   ├── filter/
│   │   │   │   │   ├── filter.tsx
│   │   │   │   │   └── showHideFilterButton.tsx
│   │   │   │   ├── footer/
│   │   │   │   │   └── footer.tsx
│   │   │   │   ├── header/
│   │   │   │   │   ├── header.test.tsx
│   │   │   │   │   └── header.tsx
│   │   │   │   ├── headerBar/
│   │   │   │   │   └── headerBar.tsx
│   │   │   │   ├── headerMenu/
│   │   │   │   │   └── HeaderMenuTabs.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   └── layout.tsx
│   │   │   │   ├── orderBy/
│   │   │   │   │   └── orderBy.tsx
│   │   │   │   ├── pagination/
│   │   │   │   │   └── pagination.tsx
│   │   │   │   ├── resizer/
│   │   │   │   │   ├── panelResizer.scss
│   │   │   │   │   └── panelResizer.tsx
│   │   │   │   ├── searchBox/
│   │   │   │   │   ├── searchBox.tsx
│   │   │   │   │   └── searchInput.scss
│   │   │   │   ├── searchResult/
│   │   │   │   │   ├── old.tsx
│   │   │   │   │   ├── searchResultCard.scss
│   │   │   │   │   └── searchResultCard.tsx
│   │   │   │   ├── sidecarCopilot/
│   │   │   │   │   ├── sidecar.module.scss
│   │   │   │   │   └── sidecar.tsx
│   │   │   │   ├── snackbar/
│   │   │   │   │   ├── notistackVariants.ts
│   │   │   │   │   ├── snackbarError.tsx
│   │   │   │   │   └── snackbarSuccess.tsx
│   │   │   │   └── uploadButton/
│   │   │   │       ├── uploadButton.tsx
│   │   │   │       └── uploadButton2.tsx
│   │   │   ├── index.scss
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── chat/
│   │   │   │   │   └── chatPage.tsx
│   │   │   │   └── home/
│   │   │   │       ├── home.module.scss
│   │   │   │       └── home.tsx
│   │   │   ├── styles.tsx
│   │   │   ├── types/
│   │   │   │   ├── apiError.ts
│   │   │   │   ├── appRoles.ts
│   │   │   │   ├── facets.ts
│   │   │   │   ├── paged.ts
│   │   │   │   └── searchRequest.ts
│   │   │   ├── utils/
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.ts
│   │   │   │   │   └── roles.ts
│   │   │   │   ├── customHooks/
│   │   │   │   │   └── usePagination.ts
│   │   │   │   ├── httpClient/
│   │   │   │   │   ├── authFetch.ts
│   │   │   │   │   └── httpClient.ts
│   │   │   │   ├── i18n/
│   │   │   │   │   └── i18n.ts
│   │   │   │   ├── mapper/
│   │   │   │   │   └── metadataMapper.ts
│   │   │   │   ├── react/
│   │   │   │   │   ├── misc.ts
│   │   │   │   │   └── useEffectOnce.ts
│   │   │   │   └── telemetry/
│   │   │   │       └── telemetry.ts
│   │   │   └── vite-env.d.ts
│   │   ├── tailwind.config.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── vite.config.ts
│   │   └── vite.config.ts.timestamp-1728339681134-f3f43d813d5c6.mjs
│   └── kernel-memory/
│       ├── .dockerignore
│       ├── .editorconfig
│       ├── .gitattributes
│       ├── .gitignore
│       ├── .vscode/
│       │   ├── launch.json
│       │   ├── settings.json
│       │   └── tasks.json
│       ├── CODE_OF_CONDUCT.md
│       ├── COMMUNITY.md
│       ├── CONTRIBUTING.md
│       ├── Directory.Build.props
│       ├── Directory.Packages.props
│       ├── Dockerfile
│       ├── KernelMemory.sln
│       ├── KernelMemory.sln.DotSettings
│       ├── LICENSE
│       ├── README.md
│       ├── SECURITY.md
│       ├── clients/
│       │   ├── dotnet/
│       │   │   ├── SemanticKernelPlugin/
│       │   │   │   ├── .editorconfig
│       │   │   │   ├── Internals/
│       │   │   │   │   └── TypeConverter.cs
│       │   │   │   ├── MemoryPlugin.cs
│       │   │   │   └── SemanticKernelPlugin.csproj
│       │   │   └── WebClient/
│       │   │       ├── .editorconfig
│       │   │       ├── Internals/
│       │   │       │   └── Verify.cs
│       │   │       ├── MemoryWebClient.cs
│       │   │       ├── StringExtensions.cs
│       │   │       └── WebClient.csproj
│       │   └── python/
│       │       └── .gitignore
│       ├── extensions/
│       │   ├── AWS/
│       │   │   └── S3/
│       │   │       ├── AWSS3Config.cs
│       │   │       ├── AWSS3Storage.cs
│       │   │       ├── DependencyInjection.cs
│       │   │       ├── README.md
│       │   │       └── S3.csproj
│       │   ├── Anthropic/
│       │   │   ├── Anthropic.csproj
│       │   │   ├── AnthropicConfig.cs
│       │   │   ├── AnthropicTextGeneration.cs
│       │   │   ├── Client/
│       │   │   │   ├── CallClaudeStreamingParams.cs
│       │   │   │   ├── ContentBlockDelta.cs
│       │   │   │   ├── ContentResponse.cs
│       │   │   │   ├── Delta.cs
│       │   │   │   ├── Message.cs
│       │   │   │   ├── MessageRequest.cs
│       │   │   │   ├── MessageResponse.cs
│       │   │   │   ├── RawAnthropicClient.cs
│       │   │   │   └── StreamingResponseMessage.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureAIDocIntel/
│       │   │   ├── AzureAIDocIntel.csproj
│       │   │   ├── AzureAIDocIntelConfig.cs
│       │   │   ├── AzureAIDocIntelEngine.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureAISearch/
│       │   │   ├── AzureAISearch/
│       │   │   │   ├── AzureAISearch.csproj
│       │   │   │   ├── AzureAISearchConfig.cs
│       │   │   │   ├── AzureAISearchMemory.cs
│       │   │   │   ├── AzureAISearchMemoryException.cs
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   └── Internals/
│       │   │   │       ├── .editorconfig
│       │   │   │       ├── AzureAISearchFiltering.cs
│       │   │   │       ├── AzureAISearchMemoryRecord.cs
│       │   │   │       ├── MemoryDbField.cs
│       │   │   │       └── MemoryDbSchema.cs
│       │   │   └── README.md
│       │   ├── AzureBlobs/
│       │   │   ├── AzureBlobs.csproj
│       │   │   ├── AzureBlobsConfig.cs
│       │   │   ├── AzureBlobsStorage.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── AzureOpenAI/
│       │   │   ├── AzureOpenAI.csproj
│       │   │   ├── AzureOpenAIConfig.cs
│       │   │   ├── AzureOpenAITextEmbeddingGenerator.cs
│       │   │   ├── AzureOpenAITextGenerator.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   ├── Internals/
│       │   │   │   └── SequentialDelayStrategy.cs
│       │   │   └── README.md
│       │   ├── AzureQueues/
│       │   │   ├── AzureQueues.csproj
│       │   │   ├── AzureQueuesConfig.cs
│       │   │   ├── AzureQueuesPipeline.cs
│       │   │   ├── DependencyInjection.cs
│       │   │   └── README.md
│       │   ├── Discord/
│       │   │   └── Discord/
│       │   │       ├── Discord.csproj
│       │   │       ├── DiscordConnector.cs
│       │   │       ├── DiscordConnectorConfig.cs
│       │   │       └── DiscordMessage.cs
│       │   ├── Elasticsearch/
│       │   │   ├── Elasticsearch/
│       │   │   │   ├── CREDITS.txt
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Elasticsearch.csproj
│       │   │   │   ├── ElasticsearchConfig.cs
│       │   │   │   ├── ElasticsearchConfigBuilder.cs
│       │   │   │   ├── ElasticsearchMemory.cs
│       │   │   │   ├── Exceptions/
│       │   │   │   │   ├── ElasticsearchException.cs
│       │   │   │   │   └── InvalidIndexNameException.cs
│       │   │   │   └── Internals/
│       │   │   │       ├── ElasticsearchConfigExtensions.cs
│       │   │   │       ├── ElasticsearchMemoryRecord.cs
│       │   │   │       ├── ElasticsearchTag.cs
│       │   │   │       ├── IndexNameHelper.cs
│       │   │   │       └── MemoryFilterExtensions.cs
│       │   │   └── README.md
│       │   ├── LlamaSharp/
│       │   │   ├── LlamaSharp/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── LlamaSharp.csproj
│       │   │   │   ├── LlamaSharpConfig.cs
│       │   │   │   └── LlamaSharpTextGenerator.cs
│       │   │   └── README.md
│       │   ├── MongoDbAtlas/
│       │   │   ├── Docker/
│       │   │   │   ├── Local6/
│       │   │   │   │   ├── Dockerfile
│       │   │   │   │   └── startatlas6.sh
│       │   │   │   └── Local7/
│       │   │   │       ├── Dockerfile
│       │   │   │       └── startatlas.sh
│       │   │   ├── MongoDbAtlas/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── MongoDbAtlasDatabaseHelper.cs
│       │   │   │   │   ├── MongoDbAtlasMemoryRecord.cs
│       │   │   │   │   └── MongoDbAtlasSearchHelper.cs
│       │   │   │   ├── MongoDbAtlas.csproj
│       │   │   │   ├── MongoDbAtlasBaseStorage.cs
│       │   │   │   ├── MongoDbAtlasConfig.cs
│       │   │   │   ├── MongoDbAtlasException.cs
│       │   │   │   ├── MongoDbAtlasMemory.cs
│       │   │   │   └── MongoDbAtlasStorage.cs
│       │   │   └── README.md
│       │   ├── OpenAI/
│       │   │   ├── OpenAI/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── ChangeEndpointPolicy.cs
│       │   │   │   │   ├── OpenAIClientBuilder.cs
│       │   │   │   │   └── SequentialDelayStrategy.cs
│       │   │   │   ├── OpenAI.csproj
│       │   │   │   ├── OpenAIConfig.cs
│       │   │   │   ├── OpenAITextEmbeddingGenerator.cs
│       │   │   │   ├── OpenAITextGenerator.cs
│       │   │   │   └── Tokenizers/
│       │   │   │       ├── DefaultGPTTokenizer.cs
│       │   │   │       ├── GPT2Tokenizer.cs
│       │   │   │       ├── GPT3Tokenizer.cs
│       │   │   │       ├── GPT4Tokenizer.cs
│       │   │   │       └── GPT4oTokenizer.cs
│       │   │   └── README.md
│       │   ├── Postgres/
│       │   │   ├── Postgres/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── PostgresDbClient.cs
│       │   │   │   │   ├── PostgresMemoryRecord.cs
│       │   │   │   │   └── PostgresSchema.cs
│       │   │   │   ├── Postgres.csproj
│       │   │   │   ├── PostgresConfig.cs
│       │   │   │   ├── PostgresException.cs
│       │   │   │   ├── PostgresMemory.cs
│       │   │   │   └── PostgresMemoryFilter.cs
│       │   │   └── README.md
│       │   ├── Qdrant/
│       │   │   ├── Qdrant/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Internals/
│       │   │   │   │   ├── .editorconfig
│       │   │   │   │   ├── DefaultQdrantPayload.cs
│       │   │   │   │   ├── Http/
│       │   │   │   │   │   ├── CreateCollectionRequest.cs
│       │   │   │   │   │   ├── DeleteCollectionRequest.cs
│       │   │   │   │   │   ├── DeleteVectorsRequest.cs
│       │   │   │   │   │   ├── Filter.cs
│       │   │   │   │   │   ├── GetCollectionRequest.cs
│       │   │   │   │   │   ├── GetVectorsRequest.cs
│       │   │   │   │   │   ├── GetVectorsResponse.cs
│       │   │   │   │   │   ├── HttpRequest.cs
│       │   │   │   │   │   ├── ListCollectionsRequest.cs
│       │   │   │   │   │   ├── ListCollectionsResponse.cs
│       │   │   │   │   │   ├── QdrantResponse.cs
│       │   │   │   │   │   ├── ScrollVectorsRequest.cs
│       │   │   │   │   │   ├── ScrollVectorsResponse.cs
│       │   │   │   │   │   ├── SearchVectorsRequest.cs
│       │   │   │   │   │   ├── SearchVectorsResponse.cs
│       │   │   │   │   │   ├── UpsertVectorRequest.cs
│       │   │   │   │   │   └── UpsertVectorResponse.cs
│       │   │   │   │   ├── QdrantClient.cs
│       │   │   │   │   ├── QdrantConstants.cs
│       │   │   │   │   ├── QdrantDistanceType.cs
│       │   │   │   │   └── QdrantPoint.cs
│       │   │   │   ├── Qdrant.csproj
│       │   │   │   ├── QdrantConfig.cs
│       │   │   │   ├── QdrantException.cs
│       │   │   │   └── QdrantMemory.cs
│       │   │   └── README.md
│       │   ├── RabbitMQ/
│       │   │   ├── DependencyInjection.cs
│       │   │   ├── README.md
│       │   │   ├── RabbitMQ.csproj
│       │   │   ├── RabbitMQPipeline.cs
│       │   │   └── RabbitMqConfig.cs
│       │   ├── Redis/
│       │   │   ├── README.md
│       │   │   └── Redis/
│       │   │       ├── DependencyInjection.cs
│       │   │       ├── Internals/
│       │   │       │   ├── .editorconfig
│       │   │       │   ├── RedisEmbeddingExtensions.cs
│       │   │       │   └── Scripts.cs
│       │   │       ├── Redis.csproj
│       │   │       ├── RedisConfig.cs
│       │   │       ├── RedisException.cs
│       │   │       └── RedisMemory.cs
│       │   └── SQLServer/
│       │       ├── README.md
│       │       └── SQLServer/
│       │           ├── DependencyInjection.cs
│       │           ├── SQLServer.csproj
│       │           ├── SqlServerConfig.cs
│       │           ├── SqlServerMemory.cs
│       │           └── SqlServerMemoryException.cs
│       ├── nuget.config
│       ├── pipelines/
│       │   └── km_build.yaml
│       ├── service/
│       │   ├── Abstractions/
│       │   │   ├── AI/
│       │   │   │   ├── Embedding.cs
│       │   │   │   ├── ITextEmbeddingBatchGenerator.cs
│       │   │   │   ├── ITextEmbeddingGenerator.cs
│       │   │   │   ├── ITextGenerator.cs
│       │   │   │   ├── ITextTokenizer.cs
│       │   │   │   └── TextGenerationOptions.cs
│       │   │   ├── Abstractions.csproj
│       │   │   ├── AppBuilders/
│       │   │   │   ├── ServiceCollectionExtensions.cs
│       │   │   │   └── ServiceCollectionPool.cs
│       │   │   ├── Configuration/
│       │   │   │   ├── ConfigurationException.cs
│       │   │   │   ├── ConfigurationExtensions.cs
│       │   │   │   └── TextPartitioningOptions.cs
│       │   │   ├── Constants.cs
│       │   │   ├── Context/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── IContext.cs
│       │   │   │   ├── IContextProvider.cs
│       │   │   │   ├── RequestContext.cs
│       │   │   │   └── RequestContextProvider.cs
│       │   │   ├── DataFormats/
│       │   │   │   ├── FileContent.cs
│       │   │   │   ├── FileSection.cs
│       │   │   │   ├── IContentDecoder.cs
│       │   │   │   ├── IOcrEngine.cs
│       │   │   │   └── WebPages/
│       │   │   │       ├── IWebScraper.cs
│       │   │   │       └── WebScraperResult.cs
│       │   │   ├── Diagnostics/
│       │   │   │   ├── ArgumentNullExceptionEx.cs
│       │   │   │   ├── ArgumentOutOfRangeExceptionEx.cs
│       │   │   │   ├── DefaultLogger.cs
│       │   │   │   └── Telemetry.cs
│       │   │   ├── DocumentStorage/
│       │   │   │   ├── DocumentStorageException.cs
│       │   │   │   ├── EmbeddingFileContent.cs
│       │   │   │   └── IDocumentStorage.cs
│       │   │   ├── IKernelMemory.cs
│       │   │   ├── IKernelMemoryBuilder.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── KernelMemoryException.cs
│       │   │   ├── KernelMemoryExtensions.cs
│       │   │   ├── KernelMemoryWebException.cs
│       │   │   ├── MemoryStorage/
│       │   │   │   ├── IMemoryDb.cs
│       │   │   │   ├── IMemoryDbUpsertBatch.cs
│       │   │   │   ├── IndexNotFoundException.cs
│       │   │   │   └── MemoryRecord.cs
│       │   │   ├── Models/
│       │   │   │   ├── .editorconfig
│       │   │   │   ├── Citation.cs
│       │   │   │   ├── DataPipelineStatus.cs
│       │   │   │   ├── DeleteAccepted.cs
│       │   │   │   ├── Document.cs
│       │   │   │   ├── DocumentUploadRequest.cs
│       │   │   │   ├── FileCollection.cs
│       │   │   │   ├── IndexCollection.cs
│       │   │   │   ├── IndexDetails.cs
│       │   │   │   ├── MemoryAnswer.cs
│       │   │   │   ├── MemoryFilter.cs
│       │   │   │   ├── MemoryQuery.cs
│       │   │   │   ├── SearchQuery.cs
│       │   │   │   ├── SearchResult.cs
│       │   │   │   ├── StreamableFileContent.cs
│       │   │   │   ├── TagCollection.cs
│       │   │   │   ├── TagCollectionExtensions.cs
│       │   │   │   └── UploadAccepted.cs
│       │   │   ├── Pipeline/
│       │   │   │   ├── DataPipeline.cs
│       │   │   │   ├── DataPipelinePointer.cs
│       │   │   │   ├── IPipelineOrchestrator.cs
│       │   │   │   ├── IPipelineStepHandler.cs
│       │   │   │   ├── MimeTypes.cs
│       │   │   │   ├── OrchestrationException.cs
│       │   │   │   ├── PipelineException.cs
│       │   │   │   └── Queue/
│       │   │   │       ├── AsyncMessageHandler.cs
│       │   │   │       ├── IQueue.cs
│       │   │   │       ├── QueueClientFactory.cs
│       │   │   │       └── QueueOptions.cs
│       │   │   ├── Prompts/
│       │   │   │   └── IPromptProvider.cs
│       │   │   ├── Search/
│       │   │   │   ├── ISearchClient.cs
│       │   │   │   └── SearchClientConfig.cs
│       │   │   └── SemanticKernel/
│       │   │       ├── .editorconfig
│       │   │       ├── KernelFunctionExtensions.cs
│       │   │       └── TextEmbeddingGenerationExtensions.cs
│       │   ├── Core/
│       │   │   ├── AI/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── NoEmbeddingGenerator.cs
│       │   │   │   └── NoTextGenerator.cs
│       │   │   ├── Configuration/
│       │   │   │   ├── HandlerConfig.cs
│       │   │   │   ├── InternalConstants.cs
│       │   │   │   ├── KernelMemoryConfig.cs
│       │   │   │   ├── ServiceAuthorizationConfig.cs
│       │   │   │   └── ServiceConfig.cs
│       │   │   ├── Core.csproj
│       │   │   ├── DataFormats/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── Image/
│       │   │   │   │   ├── ImageContextDecoder.cs
│       │   │   │   │   └── ImageDecoder.cs
│       │   │   │   ├── Office/
│       │   │   │   │   ├── MsExcelDecoder.cs
│       │   │   │   │   ├── MsExcelDecoderConfig.cs
│       │   │   │   │   ├── MsPowerPointDecoder.cs
│       │   │   │   │   ├── MsPowerPointDecoderConfig.cs
│       │   │   │   │   └── MsWordDecoder.cs
│       │   │   │   ├── Pdf/
│       │   │   │   │   ├── PdfDecoder.cs
│       │   │   │   │   └── PdfMarkdownDecoder.cs
│       │   │   │   ├── Text/
│       │   │   │   │   ├── MarkDownDecoder.cs
│       │   │   │   │   ├── TextChunker.cs
│       │   │   │   │   └── TextDecoder.cs
│       │   │   │   └── WebPages/
│       │   │   │       ├── HtmlDecoder.cs
│       │   │   │       └── WebScraper.cs
│       │   │   ├── Diagnostics/
│       │   │   │   ├── LoggerExtensions.cs
│       │   │   │   ├── PipelineCompletedException.cs
│       │   │   │   └── Verify.cs
│       │   │   ├── DocumentStorage/
│       │   │   │   └── DevTools/
│       │   │   │       ├── DependencyInjection.cs
│       │   │   │       ├── SimpleFileStorage.cs
│       │   │   │       └── SimpleFileStorageConfig.cs
│       │   │   ├── Extensions/
│       │   │   │   └── BinaryDataExtensions.cs
│       │   │   ├── FileSystem/
│       │   │   │   └── DevTools/
│       │   │   │       ├── DiskFileSystem.cs
│       │   │   │       ├── FileSystemTypes.cs
│       │   │   │       ├── IFileSystem.cs
│       │   │   │       ├── StreamExtensions.cs
│       │   │   │       ├── StringExtensions.cs
│       │   │   │       └── VolatileFileSystem.cs
│       │   │   ├── Handlers/
│       │   │   │   ├── DeleteDocumentHandler.cs
│       │   │   │   ├── DeleteGeneratedFilesHandler.cs
│       │   │   │   ├── DeleteIndexHandler.cs
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   ├── GenerateEmbeddingsHandler.cs
│       │   │   │   ├── GenerateEmbeddingsHandlerBase.cs
│       │   │   │   ├── GenerateEmbeddingsParallelHandler.cs
│       │   │   │   ├── HandlerAsAHostedService.cs
│       │   │   │   ├── HandlerTypeLoader.cs
│       │   │   │   ├── KeywordExtractingHandler.cs
│       │   │   │   ├── SaveRecordsHandler.cs
│       │   │   │   ├── SummarizationHandler.cs
│       │   │   │   ├── SummarizationParallelHandler.cs
│       │   │   │   ├── TextExtractionHandler.cs
│       │   │   │   └── TextPartitioningHandler.cs
│       │   │   ├── KernelMemoryBuilder.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── MemoryServerless.cs
│       │   │   ├── MemoryService.cs
│       │   │   ├── MemoryStorage/
│       │   │   │   ├── DevTools/
│       │   │   │   │   ├── DependencyInjection.cs
│       │   │   │   │   ├── SimpleTextDb.cs
│       │   │   │   │   ├── SimpleTextDbConfig.cs
│       │   │   │   │   ├── SimpleVectorDb.cs
│       │   │   │   │   ├── SimpleVectorDbConfig.cs
│       │   │   │   │   └── SimpleVectorDbException.cs
│       │   │   │   └── MemoryRecordExtensions.cs
│       │   │   ├── Models/
│       │   │   │   └── IndexName.cs
│       │   │   ├── Pipeline/
│       │   │   │   ├── BaseOrchestrator.cs
│       │   │   │   ├── DistributedPipelineOrchestrator.cs
│       │   │   │   ├── InProcessPipelineOrchestrator.cs
│       │   │   │   └── Queue/
│       │   │   │       └── DevTools/
│       │   │   │           ├── DependencyInjection.cs
│       │   │   │           ├── SimpleQueues.cs
│       │   │   │           └── SimpleQueuesConfig.cs
│       │   │   ├── Prompts/
│       │   │   │   ├── EmbeddedPromptProvider.cs
│       │   │   │   ├── PromptUtils.cs
│       │   │   │   ├── answer-with-facts.txt
│       │   │   │   ├── extract-keywords.txt
│       │   │   │   └── summarize.txt
│       │   │   ├── Search/
│       │   │   │   ├── DependencyInjection.cs
│       │   │   │   └── SearchClient.cs
│       │   │   ├── SemanticKernel/
│       │   │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   │   ├── SemanticKernelConfig.cs
│       │   │   │   ├── SemanticKernelTextEmbeddingGenerator.cs
│       │   │   │   └── SemanticKernelTextGenerator.cs
│       │   │   └── ServiceCollectionExtensions.cs
│       │   ├── Service/
│       │   │   ├── .editorconfig
│       │   │   ├── Auth/
│       │   │   │   └── HttpAuthHandler.cs
│       │   │   ├── ConfigurationBuilderExtensions.cs
│       │   │   ├── KernelMemoryBuilderExtensions.cs
│       │   │   ├── OpenAPI.cs
│       │   │   ├── Program.cs
│       │   │   ├── README.md
│       │   │   ├── Service.csproj
│       │   │   ├── Service.sln
│       │   │   ├── ServiceConfiguration.cs
│       │   │   ├── appsettings.json
│       │   │   ├── run.cmd
│       │   │   ├── run.sh
│       │   │   ├── setup.cmd
│       │   │   └── setup.sh
│       │   └── Service.AspNetCore/
│       │       ├── Models/
│       │       │   ├── HttpDocumentUploadRequest.cs
│       │       │   └── HttpDocumentUploadRequestExtensions.cs
│       │       ├── Service.AspNetCore.csproj
│       │       ├── WebAPIEndpoints.cs
│       │       └── WebApplicationBuilderExtensions.cs
│       └── tools/
│           ├── AzureBlobUpload/
│           │   ├── AzureBlobUpload.csproj
│           │   ├── Program.cs
│           │   ├── Properties/
│           │   │   └── .gitignore
│           │   ├── build.sh
│           │   └── upload.sh
│           ├── InteractiveSetup/
│           │   ├── AppSettings.cs
│           │   ├── Context.cs
│           │   ├── InteractiveSetup.csproj
│           │   ├── Main.cs
│           │   ├── Service/
│           │   │   ├── KMService.cs
│           │   │   ├── Logger.cs
│           │   │   └── Webservice.cs
│           │   ├── Services/
│           │   │   ├── AWSS3.cs
│           │   │   ├── AzureAIDocIntel.cs
│           │   │   ├── AzureAISearch.cs
│           │   │   ├── AzureBlobs.cs
│           │   │   ├── AzureOpenAIEmbedding.cs
│           │   │   ├── AzureOpenAIText.cs
│           │   │   ├── AzureQueue.cs
│           │   │   ├── LlamaSharp.cs
│           │   │   ├── MongoDbAtlasDocumentStorage.cs
│           │   │   ├── MongoDbAtlasMemoryDb.cs
│           │   │   ├── OpenAI.cs
│           │   │   ├── Postgres.cs
│           │   │   ├── Qdrant.cs
│           │   │   ├── RabbitMQ.cs
│           │   │   ├── Redis.cs
│           │   │   ├── SimpleFileStorage.cs
│           │   │   ├── SimpleQueues.cs
│           │   │   └── SimpleVectorDb.cs
│           │   ├── SetupException.cs
│           │   └── UI/
│           │       ├── Answer.cs
│           │       ├── BoundedBoolean.cs
│           │       ├── DictionaryExtensions.cs
│           │       ├── QuestionWithOptions.cs
│           │       └── SetupUI.cs
│           ├── README.md
│           ├── ask.sh
│           ├── dev/
│           │   ├── build.sh
│           │   ├── changes-since-last-release.sh
│           │   ├── create-azure-webapp-publish-artifacts.sh
│           │   └── run-unit-tests.sh
│           ├── run-elasticsearch.sh
│           ├── run-km-service.sh
│           ├── run-mongodb-atlas.sh
│           ├── run-mssql.sh
│           ├── run-qdrant.sh
│           ├── run-rabbitmq.sh
│           ├── run-redis.sh
│           ├── run-s3ninja.sh
│           ├── search.sh
│           ├── setup-km-service.sh
│           └── upload-file.sh
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Deployment/
│   ├── .gitignore
│   ├── appconfig/
│   │   ├── aiservice/
│   │   │   ├── appconfig.jsonl
│   │   │   └── appsettings.Development.json.template
│   │   └── kernelmemory/
│   │       └── appsettings.Development.json.template
│   ├── checkquota.ps1
│   ├── kubernetes/
│   │   ├── deploy.certclusterissuer.yaml.template
│   │   ├── deploy.deployment.yaml.template
│   │   ├── deploy.ingress.waf.yaml.template
│   │   ├── deploy.ingress.yaml.template
│   │   ├── deploy.networkpolicy.yaml.template
│   │   ├── deploy.service.yaml
│   │   └── enable_approuting.psm1
│   ├── quota_check_params.sh
│   ├── resourcePrefix.bicep
│   ├── resourcedeployment.ps1
│   ├── send-filestoendpoint.psm1
│   ├── uploadfiles.ps1
│   └── validate_bicep_params.py
├── LICENSE
├── README.md
├── SECURITY.md
├── SUPPORT.md
├── TRANSPARENCY_FAQ.md
├── azure.yaml
├── docs/
│   ├── AVMPostDeploymentGuide.md
│   ├── AzureAIModelQuotaSettings.md
│   ├── AzureAccountSetUp.md
│   ├── CustomizingAzdParameters.md
│   ├── DataProcessing.md
│   ├── DeleteResourceGroup.md
│   ├── DeploymentGuide.md
│   ├── LocalDevelopmentSetup.md
│   ├── LogAnalyticsReplicationDisable.md
│   ├── PowershellSetup.md
│   ├── QuotaCheck.md
│   ├── SampleQuestions.md
│   ├── TechnicalArchitecture.md
│   ├── TroubleShootingSteps.md
│   └── re-use-log-analytics.md
├── infra/
│   ├── README.md
│   ├── build-main.json.sh
│   ├── main.bicep
│   ├── main.json
│   ├── main.parameters.json
│   ├── main.waf.parameters.json
│   └── modules/
│       ├── container-registry.bicep
│       └── virtualNetwork.bicep
└── tests/
    └── e2e-test/
        ├── .gitignore
        ├── README.md
        ├── base/
        │   ├── __init__.py
        │   └── base.py
        ├── config/
        │   └── constants.py
        ├── pages/
        │   ├── __init__.py
        │   ├── dkmPage.py
        │   └── loginPage.py
        ├── pytest.ini
        ├── requirements.txt
        ├── sample_dotenv_file.txt
        └── tests/
            ├── __init__.py
            ├── conftest.py
            ├── test_dkm_functional.py
            └── test_poc_dkm.py
Download .txt
Showing preview only (236K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2207 symbols across 434 files)

FILE: App/backend-api/Microsoft.GS.DPS.Host/API/ChatHost/Chat.cs
  class Chat (line 11) | public class Chat
    method AddAPIs (line 13) | public static void AddAPIs(WebApplication app)

FILE: App/backend-api/Microsoft.GS.DPS.Host/API/KernelMemory/KernelMemory.cs
  class KernelMemory (line 17) | public class KernelMemory
    method AddAPIs (line 19) | public static void AddAPIs(WebApplication app)

FILE: App/backend-api/Microsoft.GS.DPS.Host/API/Operation/Operation.cs
  class Operation (line 5) | public class Operation
    method AddAPIs (line 7) | public static void AddAPIs(WebApplication app)

FILE: App/backend-api/Microsoft.GS.DPS.Host/API/UserInterface/UserInterface.cs
  class UserInterface (line 12) | public class UserInterface
    method AddAPIs (line 17) | public static void AddAPIs(WebApplication app)
    method SanitizeHeaderValue (line 116) | private static string SanitizeHeaderValue(string value)

FILE: App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/AIServices.cs
  class AIServices (line 5) | public class AIServices
    class ServiceConfig (line 15) | public class ServiceConfig

FILE: App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/AppConfiguration.cs
  class AppConfiguration (line 8) | public class AppConfiguration
    method Config (line 10) | public static void Config(IHostApplicationBuilder builder)

FILE: App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/Services.cs
  class Services (line 3) | public class Services
    class AzureAISearchConfig (line 10) | public class AzureAISearchConfig
    class CognitiveServiceConfig (line 16) | public class CognitiveServiceConfig
      class DocumentIntelligenceConfig (line 20) | public class DocumentIntelligenceConfig
    class KernelMemoryConfig (line 27) | public class KernelMemoryConfig
    class PersistentStorageConfig (line 32) | public class PersistentStorageConfig
      class CosmosMongoConfig (line 36) | public class CosmosMongoConfig
        class CosmosServiceConfig (line 41) | public class CosmosServiceConfig
          class ChatHistoryConfig (line 46) | public class ChatHistoryConfig
          class DocumentStorageConfig (line 52) | public class DocumentStorageConfig

FILE: App/backend-api/Microsoft.GS.DPS.Host/DependencyConfiguration/ServiceDependencies.cs
  class ServiceDependencies (line 19) | public class ServiceDependencies
    method Inject (line 21) | public static void Inject(IHostApplicationBuilder builder)

FILE: App/backend-api/Microsoft.GS.DPS.Host/Helpers/AzureCredentialHelper.cs
  class AzureCredentialHelper (line 11) | public static class AzureCredentialHelper
    method GetAzureCredential (line 18) | public static TokenCredential GetAzureCredential(string? clientId = null)

FILE: App/backend-api/Microsoft.GS.DPS.Host/Helpers/TelemetryHelper.cs
  class TelemetryHelper (line 10) | public class TelemetryHelper
    method TelemetryHelper (line 16) | public TelemetryHelper(TelemetryClient? telemetryClient, ILogger<Telem...
    method TrackEvent (line 42) | public void TrackEvent(string eventName, Dictionary<string, string>? p...
    method TrackException (line 65) | public void TrackException(Exception exception, Dictionary<string, str...
    method TrackDependency (line 90) | public void TrackDependency(string dependencyName, string commandName,...
    method TrackMetric (line 113) | public void TrackMetric(string metricName, double value, Dictionary<st...
    method SetActivityTag (line 135) | public void SetActivityTag(string key, string value)
    method Flush (line 155) | public void Flush()

FILE: App/backend-api/Microsoft.GS.DPS/API/ChatHost/ChatHost.cs
  class JsonSerializationOptionsCache (line 21) | internal static class JsonSerializationOptionsCache
  class ChatHost (line 29) | public class ChatHost(MemoryWebClient kmClient, Kernel kernel, API.Kerne...
    method ChatHost (line 46) | static ChatHost()
    method makeNewSession (line 75) | private async Task<ChatSession> makeNewSession(string? chatSessionId)
    method GetAnswerWords (line 94) | private async IAsyncEnumerable<string> GetAnswerWords(string answer)
    method ChatAsync (line 104) | public async Task<ChatResponseAsync> ChatAsync(ChatRequest chatRequest)
    method Chat (line 117) | public async Task<ChatResponse> Chat(ChatRequest chatRequest)

FILE: App/backend-api/Microsoft.GS.DPS/API/KernelMemory/KernelMemory.cs
  class KernelMemory (line 24) | public class KernelMemory
    method KernelMemory (line 32) | static KernelMemory()
    method KernelMemory (line 42) | public KernelMemory(MemoryWebClient kmClient, DocumentRepository docum...
    method ImportDocument (line 50) | public async Task<DocumentImportedResult> ImportDocument(Stream docume...
    method DeleteDocument (line 115) | public async Task<bool> DeleteDocument(string documentId)
    method getSummary (line 134) | private async Task<string> getSummary(string documentId, string fileName)
    method getKeywords (line 146) | private async Task<Dictionary<string, string>?> getKeywords(string doc...
    method Ask (line 206) | public async Task<MemoryAnswer> Ask(string question, string[] document...
    method ExportFile (line 223) | public async Task<StreamableFileContent> ExportFile(string documentId,...

FILE: App/backend-api/Microsoft.GS.DPS/API/UserInterface/DataCacheManager.cs
  class DataCacheManager (line 11) | public class DataCacheManager
    method DataCacheManager (line 18) | public DataCacheManager(DocumentRepository documentRepository)
    method GetConsolidatedKeywordsAsync (line 27) | public async Task<Dictionary<string, List<string>>> GetConsolidatedKey...
    method RefreshCacheAsync (line 40) | public async Task RefreshCacheAsync()
    method ManualRefresh (line 76) | public void ManualRefresh()

FILE: App/backend-api/Microsoft.GS.DPS/API/UserInterface/Documents.cs
  class Documents (line 15) | public class Documents
    method Documents (line 21) | public Documents(DocumentRepository documentRepository, MemoryWebClien...
    method GetAllDocumentsByPageAsync (line 28) | private async Task<QueryResultSet> GetAllDocumentsByPageAsync(int page...
    method GetDocuments (line 37) | public async Task<Model.UserInterface.DocumentQuerySet> GetDocuments(i...
    method GetDocument (line 58) | public async Task<Entities.Document> GetDocument(string documentId)
    method GetDocumentsWithQuery (line 105) | public async Task<Model.UserInterface.DocumentQuerySet> GetDocumentsWi...
    method GetConsolidatedKeywords (line 169) | public Dictionary<string, List<string>> GetConsolidatedKeywords(IEnume...
    method GetConsolidatedKeywords (line 207) | public async Task<Dictionary<string, List<string>>> GetConsolidatedKey...

FILE: App/backend-api/Microsoft.GS.DPS/Images/FileThumbnailService.cs
  class FileThumbnailService (line 12) | public class FileThumbnailService
    method GetThumbnail (line 14) | public static byte[] GetThumbnail(string contentType)

FILE: App/backend-api/Microsoft.GS.DPS/Model/ChatHost/Answer.cs
  class Answer (line 9) | public class Answer

FILE: App/backend-api/Microsoft.GS.DPS/Model/ChatHost/ChatRequest.cs
  class ChatRequest (line 11) | public class ChatRequest
  class ChatRequestValidator (line 20) | public class ChatRequestValidator : AbstractValidator<ChatRequest>
    method ChatRequestValidator (line 22) | public ChatRequestValidator()

FILE: App/backend-api/Microsoft.GS.DPS/Model/ChatHost/ChatResponse.cs
  class ChatResponse (line 10) | public class ChatResponse
  class ChatResponseAsync (line 19) | public class ChatResponseAsync

FILE: App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/AskParameter.cs
  class AskParameter (line 6) | public class AskParameter
    method AskParameter (line 8) | public AskParameter()

FILE: App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentDeletedResult.cs
  class DocumentDeletedResult (line 3) | public class DocumentDeletedResult

FILE: App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentImportedResult.cs
  class DocumentImportedResult (line 3) | public class DocumentImportedResult

FILE: App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentReadyStatusResult.cs
  class DocumentReadyStatusResult (line 3) | public class DocumentReadyStatusResult

FILE: App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/SearchParameter.cs
  class SearchParameter (line 6) | public class SearchParameter
    method SearchParameter (line 8) | public SearchParameter()

FILE: App/backend-api/Microsoft.GS.DPS/Model/UserInterface/DocumentQuerySet.cs
  class DocumentQuerySet (line 9) | public class DocumentQuerySet

FILE: App/backend-api/Microsoft.GS.DPS/Model/UserInterface/Paging.cs
  class PagingRequest (line 11) | public class PagingRequest
  class PagingRequestValidator (line 25) | public class PagingRequestValidator : AbstractValidator<PagingRequest>
    method PagingRequestValidator (line 27) | public PagingRequestValidator()

FILE: App/backend-api/Microsoft.GS.DPS/Model/UserInterface/PagingRequestWithSearch.cs
  class PagingRequestWithSearch (line 11) | public class PagingRequestWithSearch : PagingRequest
  class PagingRequestWithSearchValidator (line 19) | public class PagingRequestWithSearchValidator : AbstractValidator<Paging...
    method PagingRequestWithSearchValidator (line 21) | public PagingRequestWithSearchValidator()

FILE: App/backend-api/Microsoft.GS.DPS/Storage/AISearch/TagUpdater.cs
  class TagUpdater (line 12) | public class TagUpdater
    method TagUpdater (line 16) | public TagUpdater(string searchEndPoint, TokenCredential tokenCredenti...
    method UpdateTags (line 21) | public async Task UpdateTags(string documentId, List<string> updatingT...

FILE: App/backend-api/Microsoft.GS.DPS/Storage/ChatSessions/ChatSessionRepository.cs
  class ChatSessionRepository (line 14) | public class ChatSessionRepository
    method ChatSessionRepository (line 18) | public ChatSessionRepository(IMongoDatabase database, string collectio...
    method RegisterSessionAsync (line 34) | public async Task<Entities.ChatSession> RegisterSessionAsync(Entities....
    method GetSessionAsync (line 46) | public async Task<Entities.ChatSession> GetSessionAsync(string sessionId)
    method UpdateSessionAsync (line 51) | public async Task<Entities.ChatSession> UpdateSessionAsync(Entities.Ch...
    method DeleteSessionAsync (line 67) | public async Task<bool> DeleteSessionAsync(string sessionId)
    method GetSessionBySessionIdAsync (line 73) | private async Task<Entities.ChatSession> GetSessionBySessionIdAsync(st...

FILE: App/backend-api/Microsoft.GS.DPS/Storage/ChatSessions/Entities/ChatSession.cs
  class ChatSession (line 6) | public class ChatSession : CosmosDBEntityBase

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/BusinessTransactionRepository.cs
  class BusinessTransactionRepository (line 15) | public class BusinessTransactionRepository<TEntity, TIdentifier> : IRepo...
    method BusinessTransactionRepository (line 20) | public BusinessTransactionRepository(IMongoClient client, string datab...
    method GetAsync (line 28) | public async Task<TEntity> GetAsync(TIdentifier id)
    method FindAsync (line 34) | public async Task<TEntity> FindAsync(ISpecification<TEntity> specifica...
    method FindAllAsync (line 41) | public async Task<IEnumerable<TEntity>> FindAllAsync(FilterDefinition<...
    method FindAllAsync (line 49) | public async Task<IEnumerable<TEntity>> FindAllAsync(ISpecification<TE...
    method GetAllAsync (line 75) | public async Task<IEnumerable<TEntity>> GetAllAsync()
    method GetAllAsync (line 81) | public async Task<IEnumerable<TEntity>> GetAllAsync(IEnumerable<TIdent...
    method SaveAsync (line 91) | public async Task<TEntity> SaveAsync(TEntity entity)
    method AddAsync (line 103) | public async Task<TEntity> AddAsync(TEntity entity)
    method DeleteAsync (line 115) | public async Task DeleteAsync(TIdentifier entityId, dynamic partitionK...
    method DeleteAsync (line 122) | public async Task DeleteAsync(TEntity entity, dynamic partitionKeyValu...

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/CosmosDBEntityBase.cs
  class CosmosDBEntityBase (line 13) | public class CosmosDBEntityBase : IEntityModel<Guid>
    method CosmosDBEntityBase (line 15) | public CosmosDBEntityBase()
    method GetKey (line 39) | public static string GetKey(Guid id, int numberofPartitions)

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/GenericSpecification.cs
  class GenericSpecification (line 13) | public class GenericSpecification<TEntity> : ISpecification<TEntity>
    method GenericSpecification (line 15) | public GenericSpecification(Expression<Func<TEntity, bool>> predicate,...
  type Order (line 29) | public enum Order

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/IDataRepositoryProvider.cs
  type IDataRepositoryProvider (line 17) | public interface IDataRepositoryProvider<TEntity, TIdentifier>

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/IEntityModel.cs
  type IEntityModel (line 17) | public interface IEntityModel<TIdentifier>

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/IRepository.cs
  type IRepository (line 17) | public interface IRepository<TEntity, TIdentifier>
    method AddAsync (line 19) | Task<TEntity> AddAsync(TEntity entity);
    method DeleteAsync (line 20) | Task DeleteAsync(TEntity entity, dynamic? partitionKeyValue = null);
    method DeleteAsync (line 21) | Task DeleteAsync(TIdentifier entityId, dynamic? partitionKeyValue = nu...
    method FindAsync (line 22) | Task<TEntity> FindAsync(ISpecification<TEntity> specification);
    method FindAllAsync (line 23) | Task<IEnumerable<TEntity>> FindAllAsync(ISpecification<TEntity> specif...
    method GetAsync (line 24) | Task<TEntity> GetAsync(TIdentifier id);
    method GetAllAsync (line 25) | Task<IEnumerable<TEntity>> GetAllAsync();
    method GetAllAsync (line 26) | Task<IEnumerable<TEntity>> GetAllAsync(IEnumerable<TIdentifier> identi...
    method SaveAsync (line 27) | Task<TEntity> SaveAsync(TEntity entity);

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/ISpecification.cs
  type ISpecification (line 9) | public interface ISpecification<TEntity>

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Components/MongoEntityCollectionBase.cs
  class MongoEntntyCollectionBase (line 16) | public class MongoEntntyCollectionBase<TEntity, TIdentifier> : IDataRepo...
    method MongoEntntyCollectionBase (line 21) | public MongoEntntyCollectionBase(string DataConnectionString, string C...
  class CosmosMongoClientManager (line 33) | public sealed class CosmosMongoClientManager
    method CosmosMongoClientManager (line 35) | private CosmosMongoClientManager() { }
    method CosmosMongoClientManager (line 37) | static CosmosMongoClientManager()

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Documents/DocumentRepository.cs
  class DocumentRepository (line 14) | public class DocumentRepository
    method DocumentRepository (line 17) | public DocumentRepository(IMongoDatabase database, string collectionName)
    method EnsureIndexesOnField (line 34) | private void EnsureIndexesOnField(string indexFieldName)
    method GetAllDocuments (line 49) | public async Task<IEnumerable<Entities.Document>> GetAllDocuments()
    method GetAllDocumentsByPageAsync (line 58) | public async Task<QueryResultSet> GetAllDocumentsByPageAsync(int pageN...
    method FindByTagsAsync (line 85) | public async Task<QueryResultSet> FindByTagsAsync(Dictionary<string,st...
    method GetDocumentsByPageAsync (line 106) | private async Task<QueryResultSet> GetDocumentsByPageAsync(FilterDefin...
    method GetTotalCountAsync (line 130) | private async Task<int> GetTotalCountAsync(FilterDefinition<Entities.D...
    method GetTotalPages (line 135) | private int GetTotalPages(int pageSize, double recordsCount)
    method RegisterAsync (line 140) | public async Task<Entities.Document> RegisterAsync(Entities.Document d...
    method UpdateAsync (line 146) | public async Task<Entities.Document> UpdateAsync(Entities.Document doc...
    method DeleteAsync (line 152) | public async Task DeleteAsync(Guid id)
    method FindByIdAsync (line 157) | async public Task<Entities.Document> FindByIdAsync(Guid id)
    method FindByDocumentIdAsync (line 163) | async public Task<Entities.Document> FindByDocumentIdAsync(string docu...
    method FindByDocumentIdsAsync (line 170) | async public Task<QueryResultSet> FindByDocumentIdsAsync(string[] docu...
    method FindByDocumentIdsAsync (line 175) | async public Task<QueryResultSet> FindByDocumentIdsAsync(string[] docu...

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Documents/Entities/Document.cs
  class Document (line 14) | public class Document: CosmosDBEntityBase

FILE: App/backend-api/Microsoft.GS.DPS/Storage/Documents/QueryResultSet.cs
  class QueryResultSet (line 9) | public class QueryResultSet

FILE: App/backend-api/Microsoft.GS.DPS/Storage/KeywordsSerializer.cs
  class MongoDbConfig (line 13) | public class MongoDbConfig
    method RegisterClassMaps (line 15) | public static void RegisterClassMaps()
  class KeywordsSerializer (line 25) | public class KeywordsSerializer : SerializerBase<List<Dictionary<string,...
    method Serialize (line 27) | public override void Serialize(BsonSerializationContext context, BsonS...
    method Deserialize (line 48) | public override List<Dictionary<string, List<string>>> Deserialize(Bso...

FILE: App/frontend-app/src/@types/react-tiff.d.tsx
  type TiffProps (line 4) | interface TiffProps {

FILE: App/frontend-app/src/App.tsx
  function App (line 23) | function App() {

FILE: App/frontend-app/src/AppContext.tsx
  type IAppContext (line 4) | interface IAppContext {

FILE: App/frontend-app/src/AppRoutes.tsx
  function App (line 6) | function App() {
  function NotFound (line 20) | function NotFound() {

FILE: App/frontend-app/src/api/apiTypes/chatTypes.ts
  type ChatOptions (line 1) | interface ChatOptions {
  type ChatMessage (line 8) | type ChatMessage = {
  type HistoryItem (line 13) | type HistoryItem = {
  type History (line 19) | type History = HistoryItem[];
  type ChatRequest (line 21) | type ChatRequest = {
  type ChatApiResponse (line 27) | type ChatApiResponse = {
  type Reference (line 34) | type Reference = {
  type AskResponse (line 41) | type AskResponse = {
  type FeedbackRequest (line 45) | interface FeedbackRequest {

FILE: App/frontend-app/src/api/apiTypes/coverImage.ts
  type CoverImage (line 1) | interface CoverImage {

FILE: App/frontend-app/src/api/apiTypes/documentResults.ts
  type DocumentResults (line 2) | interface DocumentResults {
  type Result (line 24) | interface Result {
  type SemanticSearch (line 31) | interface SemanticSearch {
  type Document (line 36) | interface Document {
  type Parent (line 119) | interface Parent {
  type Image (line 128) | interface Image {
  type Document2 (line 144) | interface Document2 {
  type Tokens (line 151) | interface Tokens {

FILE: App/frontend-app/src/api/apiTypes/embedded.ts
  type Embedded (line 5) | interface Embedded {
  type Result (line 22) | interface Result {
  type SemanticSearch (line 29) | interface SemanticSearch {
  type Document (line 34) | interface Document {
  type Parent (line 118) | interface Parent {
  type Image (line 127) | interface Image {
  type Document2 (line 143) | interface Document2 {
  type Tokens (line 150) | interface Tokens {
  type Facets (line 157) | interface Facets {}

FILE: App/frontend-app/src/api/apiTypes/singleDocument.ts
  type SingleDocument (line 1) | interface SingleDocument {
  type Result (line 18) | interface Result {
  type Parent (line 84) | interface Parent {
  type Document (line 93) | interface Document {
  type Tokens (line 100) | interface Tokens {

FILE: App/frontend-app/src/api/chatService.ts
  function Completion (line 11) | async function Completion(request: ChatRequest): Promise<ChatApiResponse> {
  function PostFeedback (line 33) | async function PostFeedback(request: FeedbackRequest){

FILE: App/frontend-app/src/api/documentsService.ts
  function searchDocuments (line 8) | async function searchDocuments(payload: SearchRequest): Promise<Document...
  function getEmbedded (line 116) | async function getEmbedded(indexKey: string) {

FILE: App/frontend-app/src/api/storageService.ts
  function UploadFile (line 4) | async function UploadFile(formData: FormData){
  function UploadMultipleFiles (line 10) | async function UploadMultipleFiles(files: File[]){
  function GetFile (line 22) | async function GetFile(path: string){
  function GetImage (line 35) | async function GetImage(path: string){
  function downloadFile (line 47) | async function downloadFile(path: string, fileName: string) {

FILE: App/frontend-app/src/assets/icons/azureIcon.tsx
  function AzureIcon (line 3) | function AzureIcon({ className }: { className?: string }): React.JSX.Ele...

FILE: App/frontend-app/src/assets/icons/gitHubLogoIcon.tsx
  function GitHubIcon (line 3) | function GitHubIcon({ className }: { className?: string }): React.JSX.El...

FILE: App/frontend-app/src/assets/icons/mailIcon.tsx
  function MailIcon (line 3) | function MailIcon({ className }: { className?: string }): React.JSX.Elem...

FILE: App/frontend-app/src/components/chat/FeedbackForm.tsx
  type FeedbackFormProps (line 23) | interface FeedbackFormProps {
  function FeedbackForm (line 33) | function FeedbackForm({

FILE: App/frontend-app/src/components/chat/chatRoom.tsx
  type ChatRoomProps (line 38) | interface ChatRoomProps {
  function ChatRoom (line 47) | function ChatRoom({ searchResultDocuments, selectedDocuments, chatWithDo...
  function uuidv4 (line 576) | function uuidv4() {

FILE: App/frontend-app/src/components/chat/modelSwitch.tsx
  type ModelSwitchProps (line 4) | interface ModelSwitchProps {
  function ModelSwitch (line 8) | function ModelSwitch({ onSwitchChange }: ModelSwitchProps) {

FILE: App/frontend-app/src/components/chat/optionsPanel.tsx
  type OptionsPanelProps (line 6) | interface OptionsPanelProps {
  function OptionsPanel (line 15) | function OptionsPanel({

FILE: App/frontend-app/src/components/datePicker/customDatePicker.tsx
  function CustomDatePicker (line 18) | function CustomDatePicker(props: Partial<DatePickerProps>) {

FILE: App/frontend-app/src/components/datePicker/dateFilterDropdownMenu.tsx
  type DateFilterDropdownMenuProps (line 16) | interface DateFilterDropdownMenuProps {
  function DateFilterDropdownMenu (line 22) | function DateFilterDropdownMenu({

FILE: App/frontend-app/src/components/dialogConfirm/dialogConfirm.tsx
  type DialogConfirmProps (line 16) | interface DialogConfirmProps {
  function DialogConfirm (line 24) | function DialogConfirm({ open, onOpenChange, title, children, onOk }: Di...

FILE: App/frontend-app/src/components/documentViewer/PagesTab.tsx
  type IPagesTabProps (line 6) | interface IPagesTabProps {
  function PagesTab (line 12) | function PagesTab({ className, pageMetadata, handlePageClick }: IPagesTa...

FILE: App/frontend-app/src/components/documentViewer/aIKnowledgeTab.tsx
  type AIKnowledgeTabProps (line 3) | interface AIKnowledgeTabProps {

FILE: App/frontend-app/src/components/documentViewer/dialogContentComponent.tsx
  type IDialogContentComponentProps (line 6) | interface IDialogContentComponentProps {
  function DialogContentComponent (line 14) | function DialogContentComponent({

FILE: App/frontend-app/src/components/documentViewer/dialogTitleBar.tsx
  type IDialogTitleBarProps (line 12) | interface IDialogTitleBarProps {
  function DialogTitleBar (line 30) | function DialogTitleBar({

FILE: App/frontend-app/src/components/documentViewer/documentViewer.tsx
  type DocDialogProps (line 44) | interface DocDialogProps {
  type Cell (line 52) | interface Cell {
  function DocDialog (line 61) | function DocDialog(

FILE: App/frontend-app/src/components/documentViewer/iFrameComponent.tsx
  type IIFrameComponentProps (line 6) | interface IIFrameComponentProps {
  function IFrameComponent (line 13) | function IFrameComponent({ className, metadata, urlWithSasToken, iframeK...

FILE: App/frontend-app/src/components/documentViewer/imageCarousel.tsx
  type ImageCarouselProps (line 7) | interface ImageCarouselProps {

FILE: App/frontend-app/src/components/documentViewer/metadataTable.tsx
  type MetadataTableProps (line 7) | interface MetadataTableProps {
  function MetadataTable (line 11) | function MetadataTable({ metadata }: MetadataTableProps) {

FILE: App/frontend-app/src/components/documentViewer/pageNumberTab.tsx
  type IPageNumberTabProps (line 5) | interface IPageNumberTabProps {

FILE: App/frontend-app/src/components/documentViewer/tableTab.tsx
  type TableTabProps (line 3) | interface TableTabProps {
  type TableData (line 7) | interface TableData {
  type Cell (line 13) | interface Cell {
  function TableTab (line 22) | function TableTab({tableValues}: TableTabProps) {

FILE: App/frontend-app/src/components/documentViewer/tempIframe.tsx
  type IFrameComponentProps (line 15) | interface IFrameComponentProps {
  constant MIME_TYPES (line 22) | const MIME_TYPES = {
  function IFrameComponent (line 33) | function IFrameComponent({ className, metadata, urlWithSasToken, iframeK...

FILE: App/frontend-app/src/components/filter/filter.tsx
  type MemoizedCheckboxProps (line 20) | interface MemoizedCheckboxProps {
  type FilterProps (line 34) | interface FilterProps {
  function Filter (line 43) | function Filter({

FILE: App/frontend-app/src/components/filter/showHideFilterButton.tsx
  type FilterButtonProps (line 6) | interface FilterButtonProps {
  function FilterButton (line 11) | function FilterButton({ className, onFilterPress }: FilterButtonProps) {

FILE: App/frontend-app/src/components/footer/footer.tsx
  function Footer (line 4) | function Footer() {

FILE: App/frontend-app/src/components/header/header.tsx
  type HeaderProps (line 3) | interface HeaderProps {
  function Header (line 20) | function Header({ children, className, size }: HeaderProps) {

FILE: App/frontend-app/src/components/headerBar/headerBar.tsx
  type NavLocation (line 31) | enum NavLocation {
  type NavItem (line 37) | interface NavItem {
  function HeaderBar (line 48) | function HeaderBar({ location }: { location?: NavLocation }) {

FILE: App/frontend-app/src/components/headerMenu/HeaderMenuTabs.tsx
  type HeaderMenuTabsTabsProps (line 18) | interface HeaderMenuTabsTabsProps {
  function HeaderMenuTabs (line 26) | function HeaderMenuTabs({

FILE: App/frontend-app/src/components/layout/layout.tsx
  function Layout (line 5) | function Layout({ children }: { children?: React.ReactNode }) {

FILE: App/frontend-app/src/components/orderBy/orderBy.tsx
  type OrderByProps (line 5) | interface OrderByProps {
  function OrderBy (line 9) | function OrderBy({ onSortSelected }: OrderByProps) {

FILE: App/frontend-app/src/components/pagination/pagination.tsx
  type PaginagtionProps (line 5) | interface PaginagtionProps {
  function Pagination (line 13) | function Pagination({ totalCount, pageSize, currentPage, siblingCount = ...

FILE: App/frontend-app/src/components/resizer/panelResizer.tsx
  type PanelResizerProps (line 3) | interface PanelResizerProps {

FILE: App/frontend-app/src/components/searchBox/searchBox.tsx
  type SearchBoxHandle (line 14) | interface SearchBoxHandle {
  type SearchBoxProps (line 19) | interface SearchBoxProps {
  function onChange (line 94) | function onChange(_ev: ChangeEvent<HTMLInputElement>, data: InputOnChang...
  function handleKeyDown (line 101) | function handleKeyDown(ev: KeyboardEvent<HTMLInputElement>) {

FILE: App/frontend-app/src/components/searchResult/old.tsx
  type SearchResultCardProps (line 10) | interface SearchResultCardProps {
  function SearchResultCard (line 19) | function SearchResultCard({

FILE: App/frontend-app/src/components/searchResult/searchResultCard.tsx
  type SearchResultCardProps (line 9) | interface SearchResultCardProps {
  function SearchResultCard (line 17) | function SearchResultCard({

FILE: App/frontend-app/src/components/sidecarCopilot/sidecar.tsx
  type ISidecarCopilotProps (line 16) | interface ISidecarCopilotProps {
  function SidecarCopilot (line 23) | function SidecarCopilot({

FILE: App/frontend-app/src/components/snackbar/notistackVariants.ts
  type VariantOverrides (line 2) | interface VariantOverrides {

FILE: App/frontend-app/src/components/snackbar/snackbarError.tsx
  type SnackbarErrorProps (line 7) | interface SnackbarErrorProps extends CustomContentProps {
  function onClick (line 15) | function onClick() {

FILE: App/frontend-app/src/components/snackbar/snackbarSuccess.tsx
  type SnackbarSuccessProps (line 7) | interface SnackbarSuccessProps extends CustomContentProps {}
  function onClick (line 13) | function onClick() {

FILE: App/frontend-app/src/components/uploadButton/uploadButton.tsx
  function toBoolean (line 32) | function toBoolean(value: unknown): boolean {

FILE: App/frontend-app/src/main.tsx
  type Window (line 10) | interface Window {

FILE: App/frontend-app/src/pages/chat/chatPage.tsx
  function ChatPage (line 9) | function ChatPage() {

FILE: App/frontend-app/src/pages/home/home.tsx
  type HomeProps (line 29) | interface HomeProps {
  function Home (line 32) | function Home({ isSearchResultsPage }: HomeProps) {

FILE: App/frontend-app/src/types/apiError.ts
  type ApiError (line 1) | interface ApiError {

FILE: App/frontend-app/src/types/appRoles.ts
  type AppRoles (line 1) | enum AppRoles {

FILE: App/frontend-app/src/types/facets.ts
  type Facets (line 1) | interface Facets {
  type Location (line 16) | interface Location {
  type DocumentSegment (line 23) | interface DocumentSegment {
  type Language (line 30) | interface Language {
  type Caption (line 37) | interface Caption {
  type Tag (line 44) | interface Tag {
  type KeyPhrase (line 51) | interface KeyPhrase {
  type Author (line 58) | interface Author {
  type ContentGroup (line 65) | interface ContentGroup {
  type Category (line 72) | interface Category {
  type Person (line 79) | interface Person {
  type Organization (line 86) | interface Organization {
  type Country (line 93) | interface Country {

FILE: App/frontend-app/src/types/paged.ts
  type Paged (line 1) | type Paged<T, U = undefined> = {

FILE: App/frontend-app/src/types/searchRequest.ts
  type SearchRequest (line 1) | interface SearchRequest {
  type FacetValue (line 16) | interface FacetValue {
  type SearchFacet (line 23) | interface SearchFacet {

FILE: App/frontend-app/src/utils/auth/auth.ts
  type B2cPolicy (line 17) | interface B2cPolicy {
  type B2cPolicies (line 22) | interface B2cPolicies {
  type Resources (line 28) | interface Resources {
  type Resource (line 32) | interface Resource {
  class Auth (line 37) | class Auth {
    method initAuth (line 51) | public static initAuth(
    method getAccessTokenAsync (line 79) | public static async getAccessTokenAsync(resourceName = "api"): Promise...
    method getAuthenticationRequest (line 106) | public static getAuthenticationRequest(resourceName = "api"): PopupReq...
    method logout (line 118) | public static logout(): void {
    method msalConfig (line 132) | private static msalConfig(
    method msalEventCallbackFactory (line 185) | private static msalEventCallbackFactory(
    method postLogin (line 239) | private static postLogin(account: AccountInfo): void {
    method postLogout (line 243) | private static postLogout(): void {

FILE: App/frontend-app/src/utils/auth/roles.ts
  function isPlatformAdmin (line 4) | function isPlatformAdmin(accounts: AccountInfo[]): boolean {
  function checkRole (line 8) | function checkRole(accounts: AccountInfo[], role: string): boolean {
  function getActiveUser (line 16) | function getActiveUser(accounts: AccountInfo[]): AccountInfo | undefined {

FILE: App/frontend-app/src/utils/customHooks/usePagination.ts
  type PaginationOptions (line 3) | interface PaginationOptions {
  constant DOTS (line 10) | const DOTS = "...";

FILE: App/frontend-app/src/utils/httpClient/authFetch.ts
  function authFetch (line 9) | async function authFetch(endpoint: RequestInfo, init: RequestInit): Prom...

FILE: App/frontend-app/src/utils/httpClient/httpClient.ts
  function fetch (line 14) | async function fetch<T>(endpoint: RequestInfo, init: RequestInit & { not...
  function fetchRaw (line 42) | async function fetchRaw(endpoint: RequestInfo, init: RequestInit & { not...
  function get (line 62) | async function get<T>(path: string, config?: RequestInit & { notifyOnErr...
  function post (line 67) | async function post<T, U>(path: string, body?: T, config?: RequestInit &...
  function put (line 72) | async function put<T, U>(path: string, body?: T, config?: RequestInit & ...
  function _delete (line 77) | async function _delete<T>(path: string, config?: RequestInit & { notifyO...
  function download (line 82) | async function download(path: string, fileName: string, config?: Request...
  function patch (line 97) | async function patch<T, U>(path: string, body: T, config?: RequestInit &...
  function upload (line 102) | async function upload<T>(path: string, formData: FormData, config?: Requ...
  function notifyError (line 107) | function notifyError(_message: string) {
  function parseHttpException (line 111) | function parseHttpException(ex: any, t: (key: string) => string): string...

FILE: App/frontend-app/src/utils/i18n/i18n.ts
  function initializeLanguage (line 6) | function initializeLanguage() {

FILE: App/frontend-app/src/utils/mapper/metadataMapper.ts
  type MetadataKeysMapping (line 1) | interface MetadataKeysMapping {
  constant METADATA_KEYS_MAPPING (line 5) | const METADATA_KEYS_MAPPING: MetadataKeysMapping = {
  function mapMetadataKeys (line 68) | function mapMetadataKeys(metadata: any) {

FILE: App/frontend-app/src/utils/react/misc.ts
  function getEnumKeyByEnumValue (line 1) | function getEnumKeyByEnumValue<T extends { [index: string]: string }>(
  function sleep (line 9) | async function sleep(ms: number) {
  function convertBase64Async (line 13) | function convertBase64Async(file: Blob): Promise<string | ArrayBuffer | ...

FILE: App/frontend-app/src/utils/telemetry/telemetry.ts
  class Telemetry (line 4) | class Telemetry {
    method initAppInsights (line 8) | public static initAppInsights(connectionString: string, autostart: boo...
    method disableAppInsights (line 22) | public static disableAppInsights(): void {
    method enableAppInsights (line 28) | public static enableAppInsights(): void {

FILE: App/frontend-app/src/vite-env.d.ts
  type ImportMetaEnv (line 3) | interface ImportMetaEnv {
  type ImportMeta (line 9) | interface ImportMeta {

FILE: App/kernel-memory/clients/dotnet/SemanticKernelPlugin/Internals/TypeConverter.cs
  class TagCollectionWrapper (line 14) | [TypeConverter(typeof(TypeConverter))]
  class ListOfStringsWrapper (line 20) | [TypeConverter(typeof(TypeConverter))]
  class TypeConverter (line 24) | internal sealed class TypeConverter : System.ComponentModel.TypeConverter
    method CanConvertFrom (line 26) | public override bool CanConvertFrom(ITypeDescriptorContext? context, T...
    method ConvertFrom (line 32) | public override object? ConvertFrom(ITypeDescriptorContext? context, C...
    method ConvertTo (line 41) | public override object? ConvertTo(ITypeDescriptorContext? context, Cul...

FILE: App/kernel-memory/clients/dotnet/SemanticKernelPlugin/MemoryPlugin.cs
  class MemoryPlugin (line 30) | public class MemoryPlugin
    method MemoryPlugin (line 142) | public MemoryPlugin(
    method MemoryPlugin (line 167) | public MemoryPlugin(
    method MemoryPlugin (line 187) | public MemoryPlugin(
    method SaveAsync (line 223) | [KernelFunction, Description("Store in memory the given text")]
    method SaveFileAsync (line 272) | [KernelFunction, Description("Store in memory the information extracte...
    method SaveWebPageAsync (line 312) | [KernelFunction, Description("Store in memory the information extracte...
    method SearchAsync (line 351) | [KernelFunction, Description("Return up to N memories related to the i...
    method AskAsync (line 391) | [KernelFunction, Description("Use long term memory to answer a questio...
    method DeleteAsync (line 418) | [KernelFunction, Description("Remove from memory all the information e...
    method WaitForDocumentReadinessAsync (line 432) | private async Task WaitForDocumentReadinessAsync(string documentId, Ca...
    method TagsToMemoryFilter (line 455) | private static MemoryFilter? TagsToMemoryFilter(TagCollection? tags)

FILE: App/kernel-memory/clients/dotnet/WebClient/Internals/Verify.cs
  class Verify (line 7) | internal static class Verify
    method ValidateUrl (line 9) | public static void ValidateUrl(

FILE: App/kernel-memory/clients/dotnet/WebClient/MemoryWebClient.cs
  class MemoryWebClient (line 24) | public sealed class MemoryWebClient : IKernelMemory
    method MemoryWebClient (line 36) | public MemoryWebClient(string endpoint, string? apiKey = "", string ap...
    method MemoryWebClient (line 48) | public MemoryWebClient(string endpoint, HttpClient client, string? api...
    method ImportDocumentAsync (line 67) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 79) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 94) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 103) | public Task<string> ImportDocumentAsync(
    method ImportTextAsync (line 119) | public async Task<string> ImportTextAsync(
    method ImportWebPageAsync (line 145) | public async Task<string> ImportWebPageAsync(
    method ListIndexesAsync (line 174) | public async Task<IEnumerable<IndexDetails>> ListIndexesAsync(Cancella...
    method DeleteIndexAsync (line 188) | public async Task DeleteIndexAsync(string? index = null, CancellationT...
    method DeleteDocumentAsync (line 212) | public async Task DeleteDocumentAsync(string documentId, string? index...
    method IsDocumentReadyAsync (line 242) | public async Task<bool> IsDocumentReadyAsync(
    method GetDocumentStatusAsync (line 252) | public async Task<DataPipelineStatus?> GetDocumentStatusAsync(
    method ExportFileAsync (line 276) | public async Task<StreamableFileContent> ExportFileAsync(
    method SearchAsync (line 303) | public async Task<SearchResult> SearchAsync(
    method AskAsync (line 340) | public async Task<MemoryAnswer> AskAsync(
    method GetFileDetails (line 376) | private static (string contentType, long contentLength, DateTimeOffset...
    method ImportInternalAsync (line 421) | private async Task<string> ImportInternalAsync(

FILE: App/kernel-memory/clients/dotnet/WebClient/StringExtensions.cs
  class StringExtensions (line 5) | internal static class StringExtensions
    method CleanBaseAddress (line 7) | public static string CleanBaseAddress(this string endpoint)
    method CleanUrlPath (line 14) | public static string CleanUrlPath(this string path)

FILE: App/kernel-memory/extensions/AWS/S3/AWSS3Config.cs
  class AWSS3Config (line 9) | public class AWSS3Config
    type AuthTypes (line 11) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method Validate (line 41) | public void Validate()

FILE: App/kernel-memory/extensions/AWS/S3/AWSS3Storage.cs
  class AWSS3Storage (line 16) | public sealed class AWSS3Storage : IDocumentStorage, IDisposable
    method AWSS3Storage (line 22) | public AWSS3Storage(
    method CreateIndexDirectoryAsync (line 54) | public Task CreateIndexDirectoryAsync(
    method DeleteIndexDirectoryAsync (line 68) | public async Task DeleteIndexDirectoryAsync(string index, Cancellation...
    method CreateDocumentDirectoryAsync (line 80) | public Task CreateDocumentDirectoryAsync(
    method EmptyDocumentDirectoryAsync (line 92) | public async Task EmptyDocumentDirectoryAsync(string index, string doc...
    method DeleteDocumentDirectoryAsync (line 104) | public async Task DeleteDocumentDirectoryAsync(
    method WriteFileAsync (line 119) | public async Task WriteFileAsync(
    method ReadFileAsync (line 147) | public async Task<StreamableFileContent> ReadFileAsync(
    method Dispose (line 188) | public void Dispose()
    method DeleteObjectsByPrefixAsync (line 195) | private async Task DeleteObjectsByPrefixAsync(string prefix, Cancellat...

FILE: App/kernel-memory/extensions/AWS/S3/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithAWSS3DocumentStorage (line 16) | public static IKernelMemoryBuilder WithAWSS3DocumentStorage(this IKern...
  class DependencyInjection (line 26) | public static partial class DependencyInjection
    method AddAWSS3AsDocumentStorage (line 28) | public static IServiceCollection AddAWSS3AsDocumentStorage(this IServi...

FILE: App/kernel-memory/extensions/Anthropic/AnthropicConfig.cs
  class AnthropicConfig (line 10) | public class AnthropicConfig
    method Validate (line 66) | public void Validate()

FILE: App/kernel-memory/extensions/Anthropic/AnthropicTextGeneration.cs
  class AnthropicTextGeneration (line 19) | public sealed class AnthropicTextGeneration : ITextGenerator, IDisposable
    method AnthropicTextGeneration (line 39) | public AnthropicTextGeneration(
    method CountTokens (line 83) | public int CountTokens(string text)
    method GetTokens (line 89) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateTextAsync (line 95) | public async IAsyncEnumerable<string> GenerateTextAsync(
    method Dispose (line 127) | public void Dispose()

FILE: App/kernel-memory/extensions/Anthropic/Client/CallClaudeStreamingParams.cs
  class CallClaudeStreamingParams (line 5) | internal sealed class CallClaudeStreamingParams
    method CallClaudeStreamingParams (line 7) | public CallClaudeStreamingParams(string modelName, string prompt)

FILE: App/kernel-memory/extensions/Anthropic/Client/ContentBlockDelta.cs
  class ContentBlockDelta (line 7) | internal sealed class ContentBlockDelta : StreamingResponseMessage

FILE: App/kernel-memory/extensions/Anthropic/Client/ContentResponse.cs
  class ContentResponse (line 7) | internal sealed class ContentResponse

FILE: App/kernel-memory/extensions/Anthropic/Client/Delta.cs
  class Delta (line 7) | internal sealed class Delta

FILE: App/kernel-memory/extensions/Anthropic/Client/Message.cs
  class Message (line 7) | internal sealed class Message

FILE: App/kernel-memory/extensions/Anthropic/Client/MessageRequest.cs
  class MessageRequest (line 7) | internal sealed class MessageRequest

FILE: App/kernel-memory/extensions/Anthropic/Client/MessageResponse.cs
  class MessageResponse (line 7) | internal sealed class MessageResponse

FILE: App/kernel-memory/extensions/Anthropic/Client/RawAnthropicClient.cs
  class RawAnthropicClient (line 15) | internal sealed class RawAnthropicClient
    method RawAnthropicClient (line 25) | internal RawAnthropicClient(HttpClient httpClient, string endpoint, st...
    method CallClaudeStreamingAsync (line 34) | internal async IAsyncEnumerable<StreamingResponseMessage> CallClaudeSt...

FILE: App/kernel-memory/extensions/Anthropic/Client/StreamingResponseMessage.cs
  class StreamingResponseMessage (line 5) | internal abstract class StreamingResponseMessage;

FILE: App/kernel-memory/extensions/Anthropic/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 16) | public static partial class KernelMemoryBuilderExtensions
    method WithAnthropicTextGeneration (line 24) | public static IKernelMemoryBuilder WithAnthropicTextGeneration(
  class DependencyInjection (line 37) | public static partial class DependencyInjection
    method AddAnthropicTextGeneration (line 45) | public static IServiceCollection AddAnthropicTextGeneration(

FILE: App/kernel-memory/extensions/AzureAIDocIntel/AzureAIDocIntelConfig.cs
  class AzureAIDocIntelConfig (line 10) | public class AzureAIDocIntelConfig
    type AuthTypes (line 12) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method Validate (line 29) | public void Validate()

FILE: App/kernel-memory/extensions/AzureAIDocIntel/AzureAIDocIntelEngine.cs
  class AzureAIDocIntelEngine (line 19) | [Experimental("KMEXP02")]
    method AzureAIDocIntelEngine (line 30) | public AzureAIDocIntelEngine(
    method ExtractTextFromImageAsync (line 59) | public async Task<string> ExtractTextFromImageAsync(Stream imageConten...

FILE: App/kernel-memory/extensions/AzureAIDocIntel/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithAzureAIDocIntel (line 16) | public static IKernelMemoryBuilder WithAzureAIDocIntel(
    method WithAzureAIDocIntel (line 24) | public static IKernelMemoryBuilder WithAzureAIDocIntel(
  class DependencyInjection (line 42) | public static partial class DependencyInjection
    method AddAzureAIDocIntel (line 44) | public static IServiceCollection AddAzureAIDocIntel(
    method AddAzureAIDocIntel (line 53) | public static IServiceCollection AddAzureAIDocIntel(

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/AzureAISearchConfig.cs
  class AzureAISearchConfig (line 11) | public class AzureAISearchConfig
    type AuthTypes (line 15) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method SetCredential (line 34) | public void SetCredential(TokenCredential credential)
    method GetTokenCredential (line 40) | public TokenCredential GetTokenCredential()

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemory.cs
  class AzureAISearchMemory (line 32) | public class AzureAISearchMemory : IMemoryDb, IMemoryDbUpsertBatch
    method AzureAISearchMemory (line 44) | public AzureAISearchMemory(
    method CreateIndexAsync (line 100) | public Task CreateIndexAsync(string index, int vectorSize, Cancellatio...
    method GetIndexesAsync (line 108) | public async Task<IEnumerable<string>> GetIndexesAsync(CancellationTok...
    method DeleteIndexAsync (line 121) | public Task DeleteIndexAsync(string index, CancellationToken cancellat...
    method UpsertAsync (line 128) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method UpsertBatchAsync (line 136) | public async IAsyncEnumerable<string> UpsertBatchAsync(
    method GetSimilarListAsync (line 163) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 246) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 311) | public async Task DeleteAsync(string index, MemoryRecord record, Cance...
    method CreateIndexAsync (line 351) | private async Task CreateIndexAsync(string index, MemoryDbSchema schem...
    method DoesIndexExistAsync (line 370) | private async Task<bool> DoesIndexExistAsync(string index, Cancellatio...
    method GetSearchClient (line 403) | private SearchClient GetSearchClient(string index)
    method IsIndexNotFoundException (line 418) | private static bool IsIndexNotFoundException(RequestFailedException e)
    method ValidateSchema (line 425) | private static void ValidateSchema(MemoryDbSchema schema)
    method GetClientOptions (line 442) | private static SearchClientOptions GetClientOptions()
    method NormalizeIndexName (line 461) | private string NormalizeIndexName(string index)
    method PrepareIndexSchema (line 483) | private SearchIndex PrepareIndexSchema(string index, MemoryDbSchema sc...
    method ScoreToCosineSimilarity (line 633) | private static double ScoreToCosineSimilarity(double score)
    method CosineSimilarityToScore (line 638) | private static double CosineSimilarityToScore(double similarity)

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemoryException.cs
  class AzureAISearchMemoryException (line 7) | public class AzureAISearchMemoryException : KernelMemoryException
    method AzureAISearchMemoryException (line 10) | public AzureAISearchMemoryException()
    method AzureAISearchMemoryException (line 15) | public AzureAISearchMemoryException(string? message) : base(message)
    method AzureAISearchMemoryException (line 20) | public AzureAISearchMemoryException(string? message, Exception? innerE...

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithAzureAISearchMemoryDb (line 16) | public static IKernelMemoryBuilder WithAzureAISearchMemoryDb(this IKer...
    method WithAzureAISearchMemoryDb (line 22) | public static IKernelMemoryBuilder WithAzureAISearchMemoryDb(this IKer...
  class DependencyInjection (line 32) | public static partial class DependencyInjection
    method AddAzureAISearchAsMemoryDb (line 34) | public static IServiceCollection AddAzureAISearchAsMemoryDb(this IServ...
    method AddAzureAISearchAsMemoryDb (line 41) | public static IServiceCollection AddAzureAISearchAsMemoryDb(this IServ...

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/Internals/AzureAISearchFiltering.cs
  class AzureAISearchFiltering (line 9) | internal static class AzureAISearchFiltering
    method BuildSearchFilter (line 24) | internal static string BuildSearchFilter(IEnumerable<MemoryFilter> fil...

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/Internals/AzureAISearchMemoryRecord.cs
  class AzureAISearchMemoryRecord (line 14) | internal sealed class AzureAISearchMemoryRecord
    method GetSchema (line 45) | public static MemoryDbSchema GetSchema(int vectorSize)
    method ToMemoryRecord (line 59) | public MemoryRecord ToMemoryRecord(bool withEmbedding = true)
    method FromMemoryRecord (line 83) | public static AzureAISearchMemoryRecord FromMemoryRecord(MemoryRecord ...
    method EncodeId (line 100) | private static string EncodeId(string realId)
    method DecodeId (line 106) | private static string DecodeId(string encodedId)

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/Internals/MemoryDbField.cs
  class MemoryDbField (line 5) | internal sealed class MemoryDbField
    type FieldType (line 8) | public enum FieldType
    type VectorMetricType (line 20) | public enum VectorMetricType

FILE: App/kernel-memory/extensions/AzureAISearch/AzureAISearch/Internals/MemoryDbSchema.cs
  class MemoryDbSchema (line 8) | internal sealed class MemoryDbSchema
    method Validate (line 12) | public void Validate(bool vectorSizeRequired = false)

FILE: App/kernel-memory/extensions/AzureBlobs/AzureBlobsConfig.cs
  class AzureBlobsConfig (line 13) | public class AzureBlobsConfig
    type AuthTypes (line 19) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method SetCredential (line 38) | public void SetCredential(StorageSharedKeyCredential credential)
    method SetCredential (line 44) | public void SetCredential(AzureSasCredential credential)
    method SetCredential (line 50) | public void SetCredential(TokenCredential credential)
    method GetStorageSharedKeyCredential (line 56) | public StorageSharedKeyCredential GetStorageSharedKeyCredential()
    method GetAzureSasCredential (line 62) | public AzureSasCredential GetAzureSasCredential()
    method GetTokenCredential (line 68) | public TokenCredential GetTokenCredential()

FILE: App/kernel-memory/extensions/AzureBlobs/AzureBlobsStorage.cs
  class AzureBlobsStorage (line 22) | [Experimental("KMEXP03")]
    method AzureBlobsStorage (line 33) | public AzureBlobsStorage(
    method CreateIndexDirectoryAsync (line 113) | public async Task CreateIndexDirectoryAsync(
    method DeleteIndexDirectoryAsync (line 131) | public Task DeleteIndexDirectoryAsync(string index, CancellationToken ...
    method CreateDocumentDirectoryAsync (line 142) | public async Task CreateDocumentDirectoryAsync(
    method EmptyDocumentDirectoryAsync (line 161) | public Task EmptyDocumentDirectoryAsync(string index, string documentI...
    method DeleteDocumentDirectoryAsync (line 173) | public Task DeleteDocumentDirectoryAsync(
    method WriteFileAsync (line 188) | public Task WriteFileAsync(
    method ReadFileAsync (line 206) | public async Task<StreamableFileContent> ReadFileAsync(
    method JoinPaths (line 254) | private static string JoinPaths(string index, string documentId)
    method InternalWriteAsync (line 259) | private async Task InternalWriteAsync(
    method DeleteBlobsByPrefixAsync (line 310) | private async Task DeleteBlobsByPrefixAsync(string prefix, Cancellatio...
    method GetBlobClient (line 348) | private BlobClient GetBlobClient(string blobName)
    method GetBlobLeaseClient (line 359) | private BlobLeaseClient GetBlobLeaseClient(BlobClient blobClient)
    method LeaseBlobAsync (line 370) | private async Task<BlobLease> LeaseBlobAsync(BlobLeaseClient blobLease...
    method ReleaseBlobAsync (line 387) | private async Task ReleaseBlobAsync(BlobLeaseClient? blobLeaseClient, ...
    method ValidateAccountName (line 399) | private void ValidateAccountName(string value)
    method ValidateAccountKey (line 408) | private void ValidateAccountKey(string value)
    method ValidateConnectionString (line 417) | private void ValidateConnectionString(string value)
    method ValidateEndpointSuffix (line 426) | private string ValidateEndpointSuffix(string value)

FILE: App/kernel-memory/extensions/AzureBlobs/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithAzureBlobsDocumentStorage (line 16) | public static IKernelMemoryBuilder WithAzureBlobsDocumentStorage(this ...
  class DependencyInjection (line 26) | public static partial class DependencyInjection
    method AddAzureBlobsAsDocumentStorage (line 28) | public static IServiceCollection AddAzureBlobsAsDocumentStorage(this I...

FILE: App/kernel-memory/extensions/AzureOpenAI/AzureOpenAIConfig.cs
  class AzureOpenAIConfig (line 14) | public class AzureOpenAIConfig
    type AuthTypes (line 18) | public enum AuthTypes
    type APITypes (line 26) | public enum APITypes
    method SetCredential (line 90) | public void SetCredential(TokenCredential credential)
    method GetTokenCredential (line 99) | public TokenCredential GetTokenCredential()
    method Validate (line 108) | public void Validate()

FILE: App/kernel-memory/extensions/AzureOpenAI/AzureOpenAITextEmbeddingGenerator.cs
  class AzureOpenAITextEmbeddingGenerator (line 19) | [Experimental("KMEXP01")]
    method AzureOpenAITextEmbeddingGenerator (line 27) | public AzureOpenAITextEmbeddingGenerator(
    method CountTokens (line 96) | public int CountTokens(string text)
    method GetTokens (line 102) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateEmbeddingAsync (line 108) | public Task<Embedding> GenerateEmbeddingAsync(string text, Cancellatio...
    method GenerateEmbeddingBatchAsync (line 115) | public async Task<Embedding[]> GenerateEmbeddingBatchAsync(IEnumerable...

FILE: App/kernel-memory/extensions/AzureOpenAI/AzureOpenAITextGenerator.cs
  class AzureOpenAITextGenerator (line 21) | [Experimental("KMEXP01")]
    method AzureOpenAITextGenerator (line 30) | public AzureOpenAITextGenerator(
    method CountTokens (line 105) | public int CountTokens(string text)
    method GetTokens (line 111) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateTextAsync (line 117) | public async IAsyncEnumerable<string> GenerateTextAsync(

FILE: App/kernel-memory/extensions/AzureOpenAI/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 16) | public static partial class KernelMemoryBuilderExtensions
    method WithAzureOpenAITextEmbeddingGeneration (line 28) | public static IKernelMemoryBuilder WithAzureOpenAITextEmbeddingGenerat...
    method WithAzureOpenAITextGeneration (line 59) | public static IKernelMemoryBuilder WithAzureOpenAITextGeneration(
  class DependencyInjection (line 73) | public static partial class DependencyInjection
    method AddAzureOpenAIEmbeddingGeneration (line 75) | public static IServiceCollection AddAzureOpenAIEmbeddingGeneration(
    method AddAzureOpenAITextGeneration (line 97) | public static IServiceCollection AddAzureOpenAITextGeneration(

FILE: App/kernel-memory/extensions/AzureOpenAI/Internals/SequentialDelayStrategy.cs
  class SequentialDelayStrategy (line 9) | internal sealed class SequentialDelayStrategy : DelayStrategy
    method SequentialDelayStrategy (line 25) | public SequentialDelayStrategy() : base(s_maxDelay, 0)
    method GetNextDelayCore (line 29) | protected override TimeSpan GetNextDelayCore(Response? response, int r...

FILE: App/kernel-memory/extensions/AzureQueues/AzureQueuesConfig.cs
  class AzureQueuesConfig (line 14) | public class AzureQueuesConfig
    type AuthTypes (line 22) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method SetCredential (line 65) | public void SetCredential(StorageSharedKeyCredential credential)
    method SetCredential (line 71) | public void SetCredential(AzureSasCredential credential)
    method SetCredential (line 77) | public void SetCredential(TokenCredential credential)
    method GetStorageSharedKeyCredential (line 83) | public StorageSharedKeyCredential GetStorageSharedKeyCredential()
    method GetAzureSasCredential (line 89) | public AzureSasCredential GetAzureSasCredential()
    method GetTokenCredential (line 95) | public TokenCredential GetTokenCredential()
    method Validate (line 104) | public void Validate()

FILE: App/kernel-memory/extensions/AzureQueues/AzureQueuesPipeline.cs
  class AzureQueuesPipeline (line 22) | [Experimental("KMEXP04")]
    class MessageEventArgs (line 30) | private sealed class MessageEventArgs : EventArgs
    method AzureQueuesPipeline (line 66) | public AzureQueuesPipeline(
    method ConnectToQueueAsync (line 132) | public async Task<IQueue> ConnectToQueueAsync(string queueName, QueueO...
    method EnqueueAsync (line 169) | public async Task EnqueueAsync(string message, CancellationToken cance...
    method OnDequeue (line 183) | public void OnDequeue(Func<string, Task<bool>> processMessageAction)
    method Dispose (line 237) | public void Dispose()
    method DispatchMessages (line 247) | private void DispatchMessages(object? sender, ElapsedEventArgs ev)
    method DeleteMessageAsync (line 313) | private async Task DeleteMessageAsync(QueueMessage message, Cancellati...
    method UnlockMessageAsync (line 318) | private async Task UnlockMessageAsync(QueueMessage message, TimeSpan d...
    method MoveMessageToPoisonQueueAsync (line 323) | private async Task MoveMessageToPoisonQueueAsync(QueueMessage message,...
    method ValidateAccountName (line 343) | private void ValidateAccountName(string value)
    method ValidateAccountKey (line 352) | private void ValidateAccountKey(string value)
    method ValidateConnectionString (line 361) | private void ValidateConnectionString(string value)
    method ValidateEndpointSuffix (line 370) | private string ValidateEndpointSuffix(string value)
    method ToJson (line 381) | private static string ToJson(object data, bool indented = false)
    method CleanQueueName (line 386) | private static string CleanQueueName(string? name)

FILE: App/kernel-memory/extensions/AzureQueues/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 15) | public static partial class KernelMemoryBuilderExtensions
    method WithAzureQueuesOrchestration (line 17) | public static IKernelMemoryBuilder WithAzureQueuesOrchestration(this I...
  class DependencyInjection (line 27) | public static partial class DependencyInjection
    method AddAzureQueuesOrchestration (line 29) | public static IServiceCollection AddAzureQueuesOrchestration(this ISer...

FILE: App/kernel-memory/extensions/Discord/Discord/DiscordConnector.cs
  class DiscordConnector (line 23) | public sealed class DiscordConnector : IHostedService, IDisposable, IAsy...
    method DiscordConnector (line 39) | public DiscordConnector(
    method StartAsync (line 65) | public async Task StartAsync(CancellationToken cancellationToken)
    method StopAsync (line 72) | public async Task StopAsync(CancellationToken cancellationToken)
    method Dispose (line 79) | public void Dispose()
    method DisposeAsync (line 85) | public async ValueTask DisposeAsync()
    method OnMessage (line 102) | private Task OnMessage(SocketMessage message)
    method OnLog (line 167) | private Task OnLog(LogMessage msg)

FILE: App/kernel-memory/extensions/Discord/Discord/DiscordConnectorConfig.cs
  class DiscordConnectorConfig (line 10) | public class DiscordConnectorConfig

FILE: App/kernel-memory/extensions/Discord/Discord/DiscordMessage.cs
  class DiscordMessage (line 8) | public class DiscordMessage

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 16) | public static partial class KernelMemoryBuilderExtensions
    method WithElasticsearchMemoryDb (line 23) | public static IKernelMemoryBuilder WithElasticsearchMemoryDb(
    method WithElasticsearch (line 37) | public static IKernelMemoryBuilder WithElasticsearch(
  class DependencyInjection (line 54) | public static partial class DependencyInjection
    method AddElasticsearchAsMemoryDb (line 59) | public static IServiceCollection AddElasticsearchAsMemoryDb(
    method AddElasticsearchAsMemoryDb (line 82) | public static IServiceCollection AddElasticsearchAsMemoryDb(

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/ElasticsearchConfig.cs
  class ElasticsearchConfig (line 15) | public class ElasticsearchConfig
    method ElasticsearchConfig (line 17) | public ElasticsearchConfig()

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/ElasticsearchConfigBuilder.cs
  class ElasticsearchConfigBuilder (line 10) | public class ElasticsearchConfigBuilder
    method ElasticsearchConfigBuilder (line 38) | public ElasticsearchConfigBuilder()
    method WithEndpoint (line 52) | public ElasticsearchConfigBuilder WithEndpoint(string endpoint)
    method WithUserNameAndPassword (line 65) | public ElasticsearchConfigBuilder WithUserNameAndPassword(string userN...
    method WithCertificateFingerPrint (line 78) | public ElasticsearchConfigBuilder WithCertificateFingerPrint(string ce...
    method WithIndexPrefix (line 89) | public ElasticsearchConfigBuilder WithIndexPrefix(string indexPrefix)
    method Validate (line 99) | public ElasticsearchConfigBuilder Validate()
    method WithConfiguration (line 132) | public ElasticsearchConfigBuilder WithConfiguration(IConfiguration con...
    method WithShardsAndReplicas (line 156) | public ElasticsearchConfigBuilder WithShardsAndReplicas(int shards, in...
    method Build (line 168) | public ElasticsearchConfig Build(bool skipValidation = false)

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/ElasticsearchMemory.cs
  class ElasticsearchMemory (line 18) | public class ElasticsearchMemory : IMemoryDb
    method ElasticsearchMemory (line 32) | public ElasticsearchMemory(
    method CreateIndexAsync (line 48) | public async Task CreateIndexAsync(
    method GetIndexesAsync (line 101) | public async Task<IEnumerable<string>> GetIndexesAsync(
    method DeleteIndexAsync (line 116) | public async Task DeleteIndexAsync(
    method DeleteAsync (line 137) | public async Task DeleteAsync(
    method UpsertAsync (line 166) | public async Task<string> UpsertAsync(
    method GetSimilarListAsync (line 202) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 253) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method ConvertTagFilters (line 305) | private QueryDescriptor<ElasticsearchMemoryRecord> ConvertTagFilters(

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Exceptions/ElasticsearchException.cs
  class ElasticsearchException (line 10) | public class ElasticsearchException : KernelMemoryException
    method ElasticsearchException (line 13) | public ElasticsearchException() { }
    method ElasticsearchException (line 16) | public ElasticsearchException(string message) : base(message) { }
    method ElasticsearchException (line 19) | public ElasticsearchException(string message, Exception? innerExceptio...

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Exceptions/InvalidIndexNameException.cs
  class InvalidIndexNameException (line 10) | public class InvalidIndexNameException : ElasticsearchException
    method InvalidIndexNameException (line 13) | public InvalidIndexNameException(string indexName, IEnumerable<string>...
    method InvalidIndexNameException (line 21) | public InvalidIndexNameException(

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Internals/ElasticsearchConfigExtensions.cs
  class ElasticsearchConfigExtensions (line 11) | internal static class ElasticsearchConfigExtensions
    method ToElasticsearchClientSettings (line 17) | public static ElasticsearchClientSettings ToElasticsearchClientSetting...

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Internals/ElasticsearchMemoryRecord.cs
  class ElasticsearchMemoryRecord (line 12) | public sealed class ElasticsearchMemoryRecord
    method ToMemoryRecord (line 72) | public MemoryRecord ToMemoryRecord(bool withEmbedding = true)
    method FromMemoryRecord (line 101) | public static ElasticsearchMemoryRecord FromMemoryRecord(MemoryRecord ...

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Internals/ElasticsearchTag.cs
  class ElasticsearchTag (line 10) | public class ElasticsearchTag
    method ElasticsearchTag (line 22) | public ElasticsearchTag(string name, string? value = default)
    method ToString (line 43) | public override string ToString()

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Internals/IndexNameHelper.cs
  class IndexNameHelper (line 5) | internal static class IndexNameHelper
    method TryConvert (line 10) | public static bool TryConvert(string indexName, ElasticsearchConfig co...
    method Convert (line 70) | public static string Convert(string indexName, ElasticsearchConfig con...

FILE: App/kernel-memory/extensions/Elasticsearch/Elasticsearch/Internals/MemoryFilterExtensions.cs
  class MemoryFilterExtensions (line 8) | internal static class MemoryFilterExtensions
    method ToDebugString (line 15) | public static string ToDebugString(this MemoryFilter? filter)
    method ToDebugString (line 32) | public static string ToDebugString(this IEnumerable<MemoryFilter?>? fi...

FILE: App/kernel-memory/extensions/LlamaSharp/LlamaSharp/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 15) | public static partial class KernelMemoryBuilderExtensions
    method WithLlamaTextGeneration (line 17) | public static IKernelMemoryBuilder WithLlamaTextGeneration(
    method WithLlamaTextGeneration (line 34) | public static IKernelMemoryBuilder WithLlamaTextGeneration(
  class DependencyInjection (line 47) | public static partial class DependencyInjection
    method AddLlamaTextGeneration (line 49) | public static IServiceCollection AddLlamaTextGeneration(

FILE: App/kernel-memory/extensions/LlamaSharp/LlamaSharp/LlamaSharpConfig.cs
  class LlamaSharpConfig (line 9) | public class LlamaSharpConfig
    method Validate (line 31) | public void Validate(bool allowIO = true)

FILE: App/kernel-memory/extensions/LlamaSharp/LlamaSharp/LlamaSharpTextGenerator.cs
  class LlamaSharpTextGenerator (line 21) | [Experimental("KMEXP01")]
    method LlamaSharpTextGenerator (line 35) | public LlamaSharpTextGenerator(
    method CountTokens (line 81) | public int CountTokens(string text)
    method GetTokens (line 93) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateTextAsync (line 99) | public IAsyncEnumerable<string> GenerateTextAsync(
    method Dispose (line 140) | public void Dispose()
    method Dispose (line 146) | private void Dispose(bool disposing)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 15) | public static partial class KernelMemoryBuilderExtensions
    method WithMongoDbAtlasMemoryDb (line 22) | public static IKernelMemoryBuilder WithMongoDbAtlasMemoryDb(
    method WithMongoDbAtlasStorage (line 35) | public static IKernelMemoryBuilder WithMongoDbAtlasStorage(
    method WithMongoDbAtlasMemoryDbAndDocumentStorage (line 48) | public static IKernelMemoryBuilder WithMongoDbAtlasMemoryDbAndDocument...
  class DependencyInjection (line 60) | public static partial class DependencyInjection
    method AddMongoDbAtlasAsMemoryDb (line 67) | public static IServiceCollection AddMongoDbAtlasAsMemoryDb(
    method AddMongoDbAtlasAsDocumentStorage (line 81) | public static IServiceCollection AddMongoDbAtlasAsDocumentStorage(
    method AddMongoDbAtlasAsMemoryDbAndDocumentStorage (line 95) | public static IServiceCollection AddMongoDbAtlasAsMemoryDbAndDocumentS...

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/Internals/MongoDbAtlasDatabaseHelper.cs
  class MongoDbAtlasDatabaseHelper (line 11) | internal static class MongoDbAtlasDatabaseHelper
    method GetDatabase (line 15) | internal static IMongoDatabase GetDatabase(string connectionString, st...
    method GetClient (line 28) | internal static IMongoClient GetClient(string connectionString)
    method GetConnectionKey (line 47) | private static string GetConnectionKey(string connectionString)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/Internals/MongoDbAtlasMemoryRecord.cs
  class MongoDbAtlasMemoryRecord (line 7) | internal sealed class MongoDbAtlasMemoryRecord
    class Payload (line 19) | internal sealed class Payload
      method Payload (line 21) | public Payload(string key, object value)
    class Tag (line 31) | internal sealed class Tag
      method Tag (line 33) | public Tag(string key, string?[] values)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/Internals/MongoDbAtlasSearchHelper.cs
  class MongoDbAtlasSearchHelper (line 20) | internal sealed class MongoDbAtlasSearchHelper
    method MongoDbAtlasSearchHelper (line 29) | public MongoDbAtlasSearchHelper(string connection, string dbName)
    method GetIndexName (line 40) | public string GetIndexName(string collectionName) => $"searchix_{colle...
    method CreateIndexAsync (line 49) | public async Task<IndexInfo> CreateIndexAsync(string collectionName, i...
    method DeleteIndicesAsync (line 91) | public async Task DeleteIndicesAsync(string collectionName)
    method WaitForIndexToBeReadyAsync (line 127) | public async Task WaitForIndexToBeReadyAsync(string collectionName, in...
    method CreateCreationCommand (line 149) | public BsonDocument CreateCreationCommand(string collectionName, int e...
    method DropDatabaseAsync (line 203) | public async Task DropDatabaseAsync()
    method DropAllDocumentsFromCollectionsAsync (line 220) | public async Task DropAllDocumentsFromCollectionsAsync()
    type IndexInfo (line 232) | public sealed record IndexInfo(bool Exists, string Status, Boolean Que...
    method GetAnalyzersList (line 238) | private BsonArray GetAnalyzersList()
    method CollectionExistsAsync (line 245) | private async Task<bool> CollectionExistsAsync(string connectionName)
    method GetIndexInfoAsync (line 256) | private async Task<IndexInfo> GetIndexInfoAsync(string collectionName)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasBaseStorage.cs
  class MongoDbAtlasBaseStorage (line 14) | [Experimental("KMEXP03")]
    method MongoDbAtlasBaseStorage (line 37) | protected MongoDbAtlasBaseStorage(MongoDbAtlasConfig config)
    method GetCollection (line 48) | protected IMongoCollection<BsonDocument> GetCollection(string collecti...
    method GetBucketForIndex (line 59) | protected GridFSBucket<string> GetBucketForIndex(string indexName)
    method GetCollection (line 75) | protected IMongoCollection<T> GetCollection<T>(string collectionName)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasConfig.cs
  class MongoDbAtlasConfig (line 11) | public sealed class MongoDbAtlasConfig
    method WithConnectionString (line 42) | public MongoDbAtlasConfig WithConnectionString(string mongoConnection)
    method WithDatabaseName (line 53) | public MongoDbAtlasConfig WithDatabaseName(string databaseName)
    method WithSingleCollectionForVectorSearch (line 65) | public MongoDbAtlasConfig WithSingleCollectionForVectorSearch(bool use...
    method WithAfterIndexCallback (line 76) | public MongoDbAtlasConfig WithAfterIndexCallback(Func<Task> afterIndex...

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasException.cs
  class MongoDbAtlasException (line 7) | public class MongoDbAtlasException : KernelMemoryException
    method MongoDbAtlasException (line 10) | public MongoDbAtlasException() { }
    method MongoDbAtlasException (line 13) | public MongoDbAtlasException(string message) : base(message) { }
    method MongoDbAtlasException (line 16) | public MongoDbAtlasException(string message, Exception? innerException...

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasMemory.cs
  class MongoDbAtlasMemory (line 23) | [Experimental("KMEXP03")]
    method MongoDbAtlasMemory (line 38) | public MongoDbAtlasMemory(
    method CreateIndexAsync (line 51) | public async Task CreateIndexAsync(string index, int vectorSize, Cance...
    method DeleteIndexAsync (line 68) | public async Task DeleteIndexAsync(string index, CancellationToken can...
    method GetIndexesAsync (line 89) | public async Task<IEnumerable<string>> GetIndexesAsync(CancellationTok...
    method DeleteAsync (line 98) | public Task DeleteAsync(string index, MemoryRecord record, Cancellatio...
    method GetListAsync (line 105) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method GetSimilarListAsync (line 140) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method UpsertAsync (line 198) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method TranslateFilters (line 216) | private FilterDefinition<MongoDbAtlasMemoryRecord>? TranslateFilters(I...
    method GetCollectionFromIndexName (line 278) | private IMongoCollection<MongoDbAtlasMemoryRecord> GetCollectionFromIn...
    method GetCollectionName (line 284) | private string GetCollectionName(string indexName)
    method CosineSim (line 300) | private static double CosineSim(Embedding vec1, float[] vec2)
    method GetIndexListCollectionName (line 320) | private static string GetIndexListCollectionName()
    method FromMongodbMemoryRecord (line 325) | private static MemoryRecord FromMongodbMemoryRecord(MongoDbAtlasMemory...
    method NormalizeIndexName (line 346) | private static string NormalizeIndexName(string indexName)

FILE: App/kernel-memory/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasStorage.cs
  class MongoDbAtlasStorage (line 16) | [Experimental("KMEXP03")]
    method MongoDbAtlasStorage (line 21) | public MongoDbAtlasStorage(
    method CreateIndexDirectoryAsync (line 28) | public Task CreateIndexDirectoryAsync(string index, CancellationToken ...
    method DeleteIndexDirectoryAsync (line 34) | public async Task DeleteIndexDirectoryAsync(string index, Cancellation...
    method EmptyDocumentDirectoryAsync (line 44) | public async Task EmptyDocumentDirectoryAsync(
    method DeleteDocumentDirectoryAsync (line 66) | public Task DeleteDocumentDirectoryAsync(string index, string document...
    method WriteFileAsync (line 72) | public async Task WriteFileAsync(
    method CreateDocumentDirectoryAsync (line 134) | public Task CreateDocumentDirectoryAsync(string index, string document...
    method ReadFileAsync (line 141) | public async Task<StreamableFileContent> ReadFileAsync(
    method SaveDocumentAsync (line 233) | private async Task SaveDocumentAsync(string index, string id, BsonDocu...
    method GetFromBucketByIdAsync (line 246) | private static async Task<IAsyncCursor<GridFSFileInfo<string>>> GetFro...
    method GetBucketFilterById (line 251) | private static FilterDefinition<GridFSFileInfo<string>> GetBucketFilte...

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 17) | public static partial class KernelMemoryBuilderExtensions
    method WithOpenAIDefaults (line 39) | public static IKernelMemoryBuilder WithOpenAIDefaults(
    method WithOpenAI (line 85) | public static IKernelMemoryBuilder WithOpenAI(
    method WithOpenAI (line 109) | public static IKernelMemoryBuilder WithOpenAI(
    method WithOpenAITextEmbeddingGeneration (line 132) | public static IKernelMemoryBuilder WithOpenAITextEmbeddingGeneration(
    method WithOpenAITextEmbeddingGeneration (line 159) | public static IKernelMemoryBuilder WithOpenAITextEmbeddingGeneration(
    method WithOpenAITextGeneration (line 185) | public static IKernelMemoryBuilder WithOpenAITextGeneration(
    method WithOpenAITextGeneration (line 204) | public static IKernelMemoryBuilder WithOpenAITextGeneration(
  class DependencyInjection (line 219) | public static partial class DependencyInjection
    method AddOpenAITextEmbeddingGeneration (line 221) | public static IServiceCollection AddOpenAITextEmbeddingGeneration(
    method AddOpenAITextEmbeddingGeneration (line 237) | public static IServiceCollection AddOpenAITextEmbeddingGeneration(
    method AddOpenAITextGeneration (line 253) | public static IServiceCollection AddOpenAITextGeneration(
    method AddOpenAITextGeneration (line 268) | public static IServiceCollection AddOpenAITextGeneration(

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Internals/ChangeEndpointPolicy.cs
  class ChangeEndpointPolicy (line 10) | internal sealed class ChangeEndpointPolicy : HttpPipelinePolicy
    method ChangeEndpointPolicy (line 15) | public ChangeEndpointPolicy(string endpoint)
    method ProcessAsync (line 20) | public override ValueTask ProcessAsync(HttpMessage message, ReadOnlyMe...
    method Process (line 27) | public override void Process(HttpMessage message, ReadOnlyMemory<HttpP...

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Internals/OpenAIClientBuilder.cs
  class OpenAIClientBuilder (line 12) | internal static class OpenAIClientBuilder
    method BuildOpenAIClient (line 14) | internal static OpenAIClient BuildOpenAIClient(

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Internals/SequentialDelayStrategy.cs
  class SequentialDelayStrategy (line 9) | internal sealed class SequentialDelayStrategy : DelayStrategy
    method SequentialDelayStrategy (line 25) | public SequentialDelayStrategy() : base(s_maxDelay, 0)
    method GetNextDelayCore (line 29) | protected override TimeSpan GetNextDelayCore(Response? response, int r...

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/OpenAIConfig.cs
  class OpenAIConfig (line 12) | public class OpenAIConfig
    type TextGenerationTypes (line 14) | [JsonConverter(typeof(JsonStringEnumConverter))]
    method Validate (line 91) | public void Validate()

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/OpenAITextEmbeddingGenerator.cs
  class OpenAITextEmbeddingGenerator (line 22) | [Experimental("KMEXP01")]
    method OpenAITextEmbeddingGenerator (line 38) | public OpenAITextEmbeddingGenerator(
    method OpenAITextEmbeddingGenerator (line 59) | public OpenAITextEmbeddingGenerator(
    method OpenAITextEmbeddingGenerator (line 75) | public OpenAITextEmbeddingGenerator(
    method CountTokens (line 95) | public int CountTokens(string text)
    method GetTokens (line 101) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateEmbeddingAsync (line 107) | public Task<Embedding> GenerateEmbeddingAsync(string text, Cancellatio...
    method GenerateEmbeddingBatchAsync (line 114) | public async Task<Embedding[]> GenerateEmbeddingBatchAsync(IEnumerable...
    method OpenAITextEmbeddingGenerator (line 128) | private OpenAITextEmbeddingGenerator(

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/OpenAITextGenerator.cs
  class OpenAITextGenerator (line 20) | [Experimental("KMEXP01")]
    method OpenAITextGenerator (line 53) | public OpenAITextGenerator(
    method OpenAITextGenerator (line 73) | public OpenAITextGenerator(
    method CountTokens (line 97) | public int CountTokens(string text)
    method GetTokens (line 103) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateTextAsync (line 109) | public async IAsyncEnumerable<string> GenerateTextAsync(
    method SetCompletionType (line 184) | private void SetCompletionType(OpenAIConfig config)

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Tokenizers/DefaultGPTTokenizer.cs
  class DefaultGPTTokenizer (line 9) | public static class DefaultGPTTokenizer
    method StaticCountTokens (line 14) | public static int StaticCountTokens(string text)

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Tokenizers/GPT2Tokenizer.cs
  class GPT2Tokenizer (line 13) | public sealed class GPT2Tokenizer : ITextTokenizer
    method CountTokens (line 18) | public int CountTokens(string text)
    method GetTokens (line 24) | public IReadOnlyList<string> GetTokens(string text)

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Tokenizers/GPT3Tokenizer.cs
  class GPT3Tokenizer (line 13) | public sealed class GPT3Tokenizer : ITextTokenizer
    method CountTokens (line 18) | public int CountTokens(string text)
    method GetTokens (line 24) | public IReadOnlyList<string> GetTokens(string text)

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Tokenizers/GPT4Tokenizer.cs
  class GPT4Tokenizer (line 13) | public sealed class GPT4Tokenizer : ITextTokenizer
    method CountTokens (line 19) | public int CountTokens(string text)
    method GetTokens (line 25) | public IReadOnlyList<string> GetTokens(string text)

FILE: App/kernel-memory/extensions/OpenAI/OpenAI/Tokenizers/GPT4oTokenizer.cs
  class GPT4oTokenizer (line 14) | public sealed class GPT4oTokenizer : ITextTokenizer
    method CountTokens (line 20) | public int CountTokens(string text)
    method GetTokens (line 26) | public IReadOnlyList<string> GetTokens(string text)

FILE: App/kernel-memory/extensions/Postgres/Postgres/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithPostgresMemoryDb (line 21) | public static IKernelMemoryBuilder WithPostgresMemoryDb(this IKernelMe...
    method WithPostgresMemoryDb (line 32) | public static IKernelMemoryBuilder WithPostgresMemoryDb(this IKernelMe...
  class DependencyInjection (line 42) | public static partial class DependencyInjection
    method AddPostgresAsMemoryDb (line 49) | public static IServiceCollection AddPostgresAsMemoryDb(this IServiceCo...
    method AddPostgresAsMemoryDb (line 61) | public static IServiceCollection AddPostgresAsMemoryDb(this IServiceCo...

FILE: App/kernel-memory/extensions/Postgres/Postgres/Internals/PostgresDbClient.cs
  class PostgresDbClient (line 22) | internal sealed class PostgresDbClient : IDisposable
    method PostgresDbClient (line 50) | public PostgresDbClient(PostgresConfig config, ILoggerFactory? loggerF...
    method DoesTableExistAsync (line 92) | public async Task<bool> DoesTableExistAsync(
    method CreateTableAsync (line 151) | public async Task CreateTableAsync(
    method GetTablesAsync (line 260) | public async IAsyncEnumerable<string> GetTablesAsync(
    method DeleteTableAsync (line 303) | public async Task DeleteTableAsync(
    method UpsertAsync (line 342) | public async Task UpsertAsync(
    method GetSimilarAsync (line 414) | public async IAsyncEnumerable<(PostgresMemoryRecord record, double sim...
    method GetListAsync (line 524) | public async IAsyncEnumerable<PostgresMemoryRecord> GetListAsync(
    method DeleteAsync (line 623) | public async Task DeleteAsync(
    method Dispose (line 662) | public void Dispose()
    method Dispose (line 671) | private void Dispose(bool disposing)
    method ConnectAsync (line 684) | private async Task<NpgsqlConnection> ConnectAsync(CancellationToken ca...
    method CleanContent (line 705) | private static string CleanContent(string input)
    method ReadEntry (line 712) | private PostgresMemoryRecord ReadEntry(NpgsqlDataReader dataReader, bo...
    method WithSchemaAndTableNamePrefix (line 738) | private string WithSchemaAndTableNamePrefix(string tableName)
    method WithTableNamePrefix (line 746) | private string WithTableNamePrefix(string tableName)
    method IsDbNotFoundException (line 751) | private static bool IsDbNotFoundException(Npgsql.PostgresException e)
    method IsTableNotFoundException (line 756) | private static bool IsTableNotFoundException(Npgsql.PostgresException e)
    method IsVectorTypeDoesNotExistException (line 761) | private static bool IsVectorTypeDoesNotExistException(Npgsql.PostgresE...
    method GenLockId (line 776) | private static long GenLockId(string resourceId)

FILE: App/kernel-memory/extensions/Postgres/Postgres/Internals/PostgresMemoryRecord.cs
  class PostgresMemoryRecord (line 15) | internal sealed class PostgresMemoryRecord
    method ToMemoryRecord (line 56) | public static MemoryRecord ToMemoryRecord(PostgresMemoryRecord pgRecord)
    method FromMemoryRecord (line 83) | public static PostgresMemoryRecord FromMemoryRecord(MemoryRecord record)

FILE: App/kernel-memory/extensions/Postgres/Postgres/Internals/PostgresSchema.cs
  class PostgresSchema (line 7) | internal static class PostgresSchema
    method ValidateSchemaName (line 16) | public static void ValidateSchemaName(string name)
    method ValidateTableName (line 23) | public static void ValidateTableName(string name)
    method ValidateTableNamePrefix (line 30) | public static void ValidateTableNamePrefix(string name)
    method ValidateFieldName (line 37) | public static void ValidateFieldName(string name)

FILE: App/kernel-memory/extensions/Postgres/Postgres/PostgresConfig.cs
  class PostgresConfig (line 13) | public class PostgresConfig
    method PostgresConfig (line 113) | public PostgresConfig()
    method Validate (line 128) | public void Validate()

FILE: App/kernel-memory/extensions/Postgres/Postgres/PostgresException.cs
  class PostgresException (line 10) | public class PostgresException : KernelMemoryException
    method PostgresException (line 13) | public PostgresException() { }
    method PostgresException (line 16) | public PostgresException(string message) : base(message) { }
    method PostgresException (line 19) | public PostgresException(string message, Exception? innerException) : ...

FILE: App/kernel-memory/extensions/Postgres/Postgres/PostgresMemory.cs
  class PostgresMemory (line 23) | [Experimental("KMEXP03")]
    method PostgresMemory (line 36) | public PostgresMemory(
    method CreateIndexAsync (line 56) | public async Task CreateIndexAsync(
    method GetIndexesAsync (line 80) | public async Task<IEnumerable<string>> GetIndexesAsync(
    method DeleteIndexAsync (line 102) | public async Task DeleteIndexAsync(
    method UpsertAsync (line 120) | public async Task<string> UpsertAsync(
    method GetSimilarListAsync (line 144) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 176) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 202) | public Task DeleteAsync(
    method Dispose (line 213) | public void Dispose()
    method Dispose (line 222) | private void Dispose(bool disposing)
    method NormalizeIndexName (line 236) | private static string NormalizeIndexName(string index)
    method NormalizeTableNamePrefix (line 246) | private static string NormalizeTableNamePrefix(string? name)
    method PrepareSql (line 256) | private (string sql, Dictionary<string, object> unsafeSqlUserValues) P...

FILE: App/kernel-memory/extensions/Postgres/Postgres/PostgresMemoryFilter.cs
  class PostgresMemoryFilter (line 8) | public sealed class PostgresMemoryFilter : MemoryFilter

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithQdrantMemoryDb (line 16) | public static IKernelMemoryBuilder WithQdrantMemoryDb(this IKernelMemo...
    method WithQdrantMemoryDb (line 22) | public static IKernelMemoryBuilder WithQdrantMemoryDb(this IKernelMemo...
  class DependencyInjection (line 32) | public static partial class DependencyInjection
    method AddQdrantAsMemoryDb (line 34) | public static IServiceCollection AddQdrantAsMemoryDb(this IServiceColl...
    method AddQdrantAsMemoryDb (line 41) | public static IServiceCollection AddQdrantAsMemoryDb(this IServiceColl...

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/DefaultQdrantPayload.cs
  class DefaultQdrantPayload (line 10) | internal class DefaultQdrantPayload

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/CreateCollectionRequest.cs
  class CreateCollectionRequest (line 9) | internal sealed class CreateCollectionRequest
    class VectorSettings (line 11) | internal sealed class VectorSettings
      method VectorSettings (line 34) | public VectorSettings(int vectorSize, QdrantDistanceType distanceType)
      method Validate (line 40) | internal void Validate()
    method Create (line 60) | public static CreateCollectionRequest Create(string collectionName, in...
    method Build (line 65) | public HttpRequestMessage Build()
    method CreateCollectionRequest (line 73) | private CreateCollectionRequest(string collectionName, int vectorSize,...

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/DeleteCollectionRequest.cs
  class DeleteCollectionRequest (line 7) | internal sealed class DeleteCollectionRequest
    method Create (line 11) | public static DeleteCollectionRequest Create(string collectionName)
    method Build (line 16) | public HttpRequestMessage Build()
    method DeleteCollectionRequest (line 22) | private DeleteCollectionRequest(string collectionName)
    method Validate (line 27) | private void Validate()

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/DeleteVectorsRequest.cs
  class DeleteVectorsRequest (line 10) | internal sealed class DeleteVectorsRequest
    method DeleteFrom (line 17) | public static DeleteVectorsRequest DeleteFrom(string collectionName)
    method DeleteVector (line 22) | public DeleteVectorsRequest DeleteVector(Guid qdrantPointId)
    method DeleteRange (line 29) | public DeleteVectorsRequest DeleteRange(IEnumerable<Guid> qdrantPointIds)
    method Build (line 36) | public HttpRequestMessage Build()
    method DeleteVectorsRequest (line 44) | private DeleteVectorsRequest(string collectionName)
    method Validate (line 50) | private void Validate()

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/Filter.cs
  class Filter (line 8) | internal sealed class Filter
    class OrClause (line 10) | internal sealed class OrClause
      method OrClause (line 15) | internal OrClause()
      method Or (line 20) | internal OrClause Or(object condition)
      method OrValue (line 26) | internal OrClause OrValue(string key, object value)
      method Validate (line 31) | internal void Validate()
    class AndClause (line 55) | internal sealed class AndClause
      method AndClause (line 60) | internal AndClause()
      method And (line 65) | internal AndClause And(object condition)
      method AndValue (line 71) | internal AndClause AndValue(string key, object value)
      method Validate (line 76) | internal void Validate()
    class MatchValueClause (line 99) | internal sealed class MatchValueClause
      method MatchValueClause (line 107) | public MatchValueClause()
      method MatchValueClause (line 113) | public MatchValueClause(string key, object value) : this()
      method Validate (line 119) | internal void Validate()
    class MatchValue (line 126) | internal sealed class MatchValue
      method MatchValue (line 131) | public MatchValue()

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/GetCollectionRequest.cs
  class GetCollectionsRequest (line 7) | internal sealed class GetCollectionsRequest
    method Create (line 11) | public static GetCollectionsRequest Create(string collectionName)
    method Build (line 16) | public HttpRequestMessage Build()
    method GetCollectionsRequest (line 21) | private GetCollectionsRequest(string collectionName)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/GetVectorsRequest.cs
  class GetVectorsRequest (line 10) | internal sealed class GetVectorsRequest
    method Create (line 42) | public static GetVectorsRequest Create(string collectionName)
    method WithPointId (line 47) | public GetVectorsRequest WithPointId(string pointId)
    method WithPointIDs (line 53) | public GetVectorsRequest WithPointIDs(IEnumerable<string> pointIds)
    method WithPayloads (line 59) | public GetVectorsRequest WithPayloads(bool withPayloads)
    method WithVectors (line 65) | public GetVectorsRequest WithVectors(bool withEmbeddings)
    method Build (line 71) | public HttpRequestMessage Build()
    method GetVectorsRequest (line 78) | private GetVectorsRequest(string collectionName)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/GetVectorsResponse.cs
  class GetVectorsResponse (line 8) | internal sealed class GetVectorsResponse<T> : QdrantResponse where T : D...

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/HttpRequest.cs
  class HttpRequest (line 11) | internal static class HttpRequest
    method CreateGetRequest (line 15) | public static HttpRequestMessage CreateGetRequest(string url, object? ...
    method CreatePostRequest (line 18) | public static HttpRequestMessage CreatePostRequest(string url, object?...
    method CreatePostRequest (line 21) | public static HttpRequestMessage CreatePostRequest(Uri url, object? pa...
    method CreatePutRequest (line 24) | public static HttpRequestMessage CreatePutRequest(string url, object? ...
    method CreatePatchRequest (line 27) | public static HttpRequestMessage CreatePatchRequest(string url, object...
    method CreateDeleteRequest (line 30) | public static HttpRequestMessage CreateDeleteRequest(string url, objec...
    method CreateRequest (line 33) | private static HttpRequestMessage CreateRequest(HttpMethod method, str...
    method CreateRequest (line 36) | private static HttpRequestMessage CreateRequest(HttpMethod method, Uri...
    method CreateJsonContent (line 39) | private static HttpContent? CreateJsonContent(object? payload)
    method CreateSerializerOptions (line 57) | private static JsonSerializerOptions CreateSerializerOptions()

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/ListCollectionsRequest.cs
  class ListCollectionsRequest (line 7) | internal sealed class ListCollectionsRequest
    method Create (line 9) | public static ListCollectionsRequest Create()
    method Build (line 14) | public HttpRequestMessage Build()

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/ListCollectionsResponse.cs
  class ListCollectionsResponse (line 8) | internal sealed class ListCollectionsResponse : QdrantResponse
    class CollectionResult (line 10) | internal sealed class CollectionResult
      class CollectionDescription (line 12) | internal sealed class CollectionDescription

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/QdrantResponse.cs
  class QdrantResponse (line 10) | internal abstract class QdrantResponse

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/ScrollVectorsRequest.cs
  class ScrollVectorsRequest (line 10) | internal sealed class ScrollVectorsRequest
    method Create (line 29) | public static ScrollVectorsRequest Create(string collectionName)
    method HavingExternalId (line 34) | public ScrollVectorsRequest HavingExternalId(string id)
    method HavingAllTags (line 41) | public ScrollVectorsRequest HavingAllTags(IEnumerable<string>? tags)
    method HavingSomeTags (line 56) | public ScrollVectorsRequest HavingSomeTags(IEnumerable<IEnumerable<str...
    method IncludePayLoad (line 88) | public ScrollVectorsRequest IncludePayLoad()
    method IncludeVectorData (line 94) | public ScrollVectorsRequest IncludeVectorData(bool withVector)
    method FromPosition (line 100) | public ScrollVectorsRequest FromPosition(int offset)
    method Take (line 106) | public ScrollVectorsRequest Take(int count)
    method TakeFirst (line 112) | public ScrollVectorsRequest TakeFirst()
    method Build (line 117) | public HttpRequestMessage Build()
    method Validate (line 125) | private void Validate()
    method ScrollVectorsRequest (line 133) | private ScrollVectorsRequest(string collectionName)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/ScrollVectorsResponse.cs
  class ScrollVectorsResponse (line 8) | internal sealed class ScrollVectorsResponse<T> : QdrantResponse where T ...
    class ScoredPoint (line 10) | internal sealed class ScoredPoint : QdrantPoint<T>
    class ScrollResult (line 19) | internal sealed class ScrollResult

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/SearchVectorsRequest.cs
  class SearchVectorsRequest (line 10) | internal sealed class SearchVectorsRequest
    method Create (line 36) | public static SearchVectorsRequest Create(string collectionName)
    method Create (line 41) | public static SearchVectorsRequest Create(string collectionName, int v...
    method SimilarTo (line 46) | public SearchVectorsRequest SimilarTo(Embedding vector)
    method HavingExternalId (line 52) | public SearchVectorsRequest HavingExternalId(string externalId)
    method HavingAllTags (line 59) | public SearchVectorsRequest HavingAllTags(IEnumerable<string>? tags)
    method HavingSomeTags (line 74) | public SearchVectorsRequest HavingSomeTags(IEnumerable<IEnumerable<str...
    method WithScoreThreshold (line 106) | public SearchVectorsRequest WithScoreThreshold(double scoreThreshold)
    method IncludePayLoad (line 112) | public SearchVectorsRequest IncludePayLoad()
    method IncludeVectorData (line 118) | public SearchVectorsRequest IncludeVectorData(bool withVector)
    method FromPosition (line 124) | public SearchVectorsRequest FromPosition(int offset)
    method Take (line 130) | public SearchVectorsRequest Take(int count)
    method TakeFirst (line 136) | public SearchVectorsRequest TakeFirst()
    method Build (line 141) | public HttpRequestMessage Build()
    method Validate (line 149) | private void Validate()
    method SearchVectorsRequest (line 158) | private SearchVectorsRequest(string collectionName)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/SearchVectorsResponse.cs
  class SearchVectorsResponse (line 8) | internal sealed class SearchVectorsResponse<T> : QdrantResponse where T ...
    class ScoredPoint (line 10) | internal sealed class ScoredPoint : QdrantPoint<T>

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/UpsertVectorRequest.cs
  class UpsertVectorRequest (line 10) | internal sealed class UpsertVectorRequest<T> where T : DefaultQdrantPayl...
    class BatchRequest (line 12) | internal sealed class BatchRequest
    method Create (line 29) | public static UpsertVectorRequest<T> Create(string collectionName)
    method UpsertVector (line 34) | public UpsertVectorRequest<T> UpsertVector(QdrantPoint<T> vectorRecord)
    method UpsertRange (line 42) | public UpsertVectorRequest<T> UpsertRange(IEnumerable<QdrantPoint<T>> ...
    method Build (line 52) | public HttpRequestMessage Build()
    method UpsertVectorRequest (line 59) | private UpsertVectorRequest(string collectionName)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/Http/UpsertVectorResponse.cs
  class UpsertVectorResponse (line 7) | internal sealed class UpsertVectorResponse : QdrantResponse
    class UpdateResult (line 9) | internal sealed class UpdateResult
    method UpsertVectorResponse (line 35) | [JsonConstructor]

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/QdrantClient.cs
  class QdrantClient (line 23) | internal sealed class QdrantClient<T> where T : DefaultQdrantPayload, new()
    class NonDisposableHttpClientHandler (line 30) | private sealed class NonDisposableHttpClientHandler : HttpClientHandler
      method NonDisposableHttpClientHandler (line 40) | private NonDisposableHttpClientHandler()
      method Dispose (line 51) | protected override void Dispose(bool disposing)
    method QdrantClient (line 67) | public QdrantClient(
    method CreateCollectionAsync (line 85) | public async Task CreateCollectionAsync(
    method GetCollectionsAsync (line 108) | public async IAsyncEnumerable<string> GetCollectionsAsync([EnumeratorC...
    method DeleteCollectionAsync (line 142) | public async Task DeleteCollectionAsync(
    method UpsertVectorsAsync (line 167) | public async Task UpsertVectorsAsync(
    method GetVectorByPayloadIdAsync (line 200) | public async Task<QdrantPoint<T>?> GetVectorByPayloadIdAsync(
    method DeleteVectorsAsync (line 252) | public async Task DeleteVectorsAsync(string collectionName, IList<Guid...
    method GetListAsync (line 280) | public async Task<List<QdrantPoint<T>>> GetListAsync(
    method GetSimilarListAsync (line 336) | public async Task<List<(QdrantPoint<T>, double)>> GetSimilarListAsync(
    method ValidateResponse (line 400) | private void ValidateResponse(HttpResponseMessage response, string con...
    method ExecuteHttpRequestAsync (line 413) | private async Task<(HttpResponseMessage response, string responseConte...
    method SanitizeEndpoint (line 446) | private static Uri SanitizeEndpoint(string endpoint, int? port = null)
    method ValidateUrl (line 456) | private static void ValidateUrl(string name, string url)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/QdrantConstants.cs
  class QdrantConstants (line 5) | internal static class QdrantConstants

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/QdrantDistanceType.cs
  type QdrantDistanceType (line 10) | [JsonConverter(typeof(JsonStringEnumConverter))]

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/Internals/QdrantPoint.cs
  class QdrantPoint (line 15) | internal class QdrantPoint<T> where T : DefaultQdrantPayload, new()
    method ToMemoryRecord (line 27) | public MemoryRecord ToMemoryRecord(bool withEmbedding = true)
    method FromMemoryRecord (line 51) | public static QdrantPoint<T> FromMemoryRecord(MemoryRecord record)

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/QdrantConfig.cs
  class QdrantConfig (line 9) | public class QdrantConfig

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/QdrantException.cs
  class QdrantException (line 7) | public class QdrantException : KernelMemoryException
    method QdrantException (line 10) | public QdrantException() { }
    method QdrantException (line 13) | public QdrantException(string message) : base(message) { }
    method QdrantException (line 16) | public QdrantException(string message, Exception? innerException) : ba...

FILE: App/kernel-memory/extensions/Qdrant/Qdrant/QdrantMemory.cs
  class QdrantMemory (line 24) | [Experimental("KMEXP03")]
    method QdrantMemory (line 37) | public QdrantMemory(
    method CreateIndexAsync (line 54) | public Task CreateIndexAsync(
    method GetIndexesAsync (line 63) | public async Task<IEnumerable<string>> GetIndexesAsync(CancellationTok...
    method DeleteIndexAsync (line 72) | public Task DeleteIndexAsync(
    method UpsertAsync (line 90) | public async Task<string> UpsertAsync(
    method UpsertBatchAsync (line 101) | public async IAsyncEnumerable<string> UpsertBatchAsync(string index, I...
    method GetSimilarListAsync (line 151) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 200) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 244) | public async Task DeleteAsync(
    method NormalizeIndexName (line 277) | private static string NormalizeIndexName(string index)

FILE: App/kernel-memory/extensions/RabbitMQ/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 15) | public static partial class KernelMemoryBuilderExtensions
    method WithRabbitMQOrchestration (line 17) | public static IKernelMemoryBuilder WithRabbitMQOrchestration(this IKer...
  class DependencyInjection (line 27) | public static partial class DependencyInjection
    method AddRabbitMQOrchestration (line 29) | public static IServiceCollection AddRabbitMQOrchestration(this IServic...

FILE: App/kernel-memory/extensions/RabbitMQ/RabbitMQPipeline.cs
  class RabbitMQPipeline (line 16) | [Experimental("KMEXP04")]
    method RabbitMQPipeline (line 29) | public RabbitMQPipeline(RabbitMqConfig config, ILoggerFactory? loggerF...
    method ConnectToQueueAsync (line 57) | public Task<IQueue> ConnectToQueueAsync(string queueName, QueueOptions...
    method EnqueueAsync (line 85) | public Task EnqueueAsync(string message, CancellationToken cancellatio...
    method OnDequeue (line 116) | public void OnDequeue(Func<string, Task<bool>> processMessageAction)
    method Dispose (line 156) | public void Dispose()

FILE: App/kernel-memory/extensions/RabbitMQ/RabbitMqConfig.cs
  class RabbitMqConfig (line 7) | public class RabbitMqConfig

FILE: App/kernel-memory/extensions/Redis/Redis/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 15) | public static partial class KernelMemoryBuilderExtensions
    method WithRedisMemoryDb (line 22) | public static IKernelMemoryBuilder WithRedisMemoryDb(
    method WithRedisMemoryDb (line 35) | public static IKernelMemoryBuilder WithRedisMemoryDb(
  class DependencyInjection (line 47) | public static partial class DependencyInjection
    method AddRedisAsMemoryDb (line 54) | public static IServiceCollection AddRedisAsMemoryDb(

FILE: App/kernel-memory/extensions/Redis/Redis/Internals/RedisEmbeddingExtensions.cs
  class RedisEmbeddingExtensions (line 8) | internal static class RedisEmbeddingExtensions
    method VectorBlob (line 10) | public static byte[] VectorBlob(this Embedding embedding) => embedding...

FILE: App/kernel-memory/extensions/Redis/Redis/Internals/Scripts.cs
  class Scripts (line 5) | internal static class Scripts

FILE: App/kernel-memory/extensions/Redis/Redis/RedisConfig.cs
  class RedisConfig (line 12) | public class RedisConfig
    method RedisConfig (line 55) | public RedisConfig(string appPrefix = DefaultIndexPrefix, Dictionary<s...

FILE: App/kernel-memory/extensions/Redis/Redis/RedisException.cs
  class RedisException (line 5) | public class RedisException : KernelMemoryException
    method RedisException (line 8) | public RedisException() { }
    method RedisException (line 11) | public RedisException(string message) : base(message) { }
    method RedisException (line 14) | public RedisException(string message, Exception? innerException) : bas...

FILE: App/kernel-memory/extensions/Redis/Redis/RedisMemory.cs
  class RedisMemory (line 24) | [Experimental("KMEXP03")]
    method RedisMemory (line 41) | public RedisMemory(
    method CreateIndexAsync (line 56) | public async Task CreateIndexAsync(string index, int vectorSize, Cance...
    method GetIndexesAsync (line 89) | public async Task<IEnumerable<string>> GetIndexesAsync(CancellationTok...
    method DeleteIndexAsync (line 96) | public async Task DeleteIndexAsync(string index, CancellationToken can...
    method UpsertAsync (line 114) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method GetSimilarListAsync (line 167) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 248) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(string index,...
    method DeleteAsync (line 327) | public Task DeleteAsync(string index, MemoryRecord record, Cancellatio...
    method FromDocument (line 361) | private (MemoryRecord, double) FromDocument(NRedisStack.Search.Documen...
    method NormalizeIndexName (line 402) | private static string NormalizeIndexName(string index, string? prefix ...
    method EscapeTagField (line 418) | private static string EscapeTagField(string text)
    method Key (line 434) | private static RedisKey Key(string indexWithPrefix, string id) => $"{i...
    method ByteArrayToFloatArray (line 436) | private static float[] ByteArrayToFloatArray(byte[] bytes)

FILE: App/kernel-memory/extensions/SQLServer/SQLServer/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithSqlServerMemoryDb (line 21) | public static IKernelMemoryBuilder WithSqlServerMemoryDb(
    method WithSqlServerMemoryDb (line 34) | public static IKernelMemoryBuilder WithSqlServerMemoryDb(
  class DependencyInjection (line 46) | public static partial class DependencyInjection
    method AddSqlServerAsMemoryDb (line 53) | public static IServiceCollection AddSqlServerAsMemoryDb(
    method AddSqlServerAsMemoryDb (line 67) | public static IServiceCollection AddSqlServerAsMemoryDb(

FILE: App/kernel-memory/extensions/SQLServer/SQLServer/SqlServerConfig.cs
  class SqlServerConfig (line 8) | public class SqlServerConfig

FILE: App/kernel-memory/extensions/SQLServer/SQLServer/SqlServerMemory.cs
  class SqlServerMemory (line 20) | public sealed class SqlServerMemory : IMemoryDb, IMemoryDbUpsertBatch, I...
    method SqlServerMemory (line 58) | public SqlServerMemory(
    method CreateIndexAsync (line 69) | public async Task CreateIndexAsync(string index, int vectorSize, Cance...
    method DeleteAsync (line 130) | public async Task DeleteAsync(string index, MemoryRecord record, Cance...
    method DeleteIndexAsync (line 183) | public async Task DeleteIndexAsync(string index, CancellationToken can...
    method GetIndexesAsync (line 224) | public async Task<IEnumerable<string>> GetIndexesAsync(CancellationTok...
    method GetListAsync (line 257) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method GetSimilarListAsync (line 331) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method UpsertAsync (line 431) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method UpsertBatchAsync (line 444) | public async IAsyncEnumerable<string> UpsertBatchAsync(string index, I...
    method Dispose (line 547) | public void Dispose()
    method InitAsync (line 561) | private async Task InitAsync(CancellationToken cancellationToken)
    method CacheSqlServerMajorVersionNumberAsync (line 583) | private async Task CacheSqlServerMajorVersionNumberAsync(CancellationT...
    method CreateTablesIfNotExistsAsync (line 607) | private async Task CreateTablesIfNotExistsAsync(CancellationToken canc...
    method DoesIndexExistsAsync (line 654) | private async Task<bool> DoesIndexExistsAsync(string indexName,
    method GetFullTableName (line 666) | private string GetFullTableName(string tableName)
    method GenerateFilters (line 678) | private string GenerateFilters(
    method ReadEntryAsync (line 735) | private async Task<MemoryRecord> ReadEntryAsync(SqlDataReader dataRead...
    method NormalizeIndexName (line 760) | private static string NormalizeIndexName(string index)

FILE: App/kernel-memory/extensions/SQLServer/SQLServer/SqlServerMemoryException.cs
  class SqlServerMemoryException (line 8) | public class SqlServerMemoryException : KernelMemoryException
    method SqlServerMemoryException (line 11) | public SqlServerMemoryException()
    method SqlServerMemoryException (line 16) | public SqlServerMemoryException(string? message) : base(message)
    method SqlServerMemoryException (line 21) | public SqlServerMemoryException(string? message, Exception? innerExcep...

FILE: App/kernel-memory/service/Abstractions/AI/Embedding.cs
  type Embedding (line 22) | public struct Embedding : IEquatable<Embedding>
    method Embedding (line 36) | public Embedding(float[] vector)
    method Embedding (line 41) | public Embedding(ReadOnlyMemory<float> vector)
    method Embedding (line 46) | public Embedding(int size)
    method CosineSimilarity (line 51) | public double CosineSimilarity(Embedding embedding)
    method Equals (line 75) | public bool Equals(Embedding other) => this.Data.Equals(other.Data);
    method Equals (line 77) | public override bool Equals(object? obj) => (obj is Embedding other &&...
    method GetHashCode (line 83) | public override int GetHashCode() => this.Data.GetHashCode();
    class JsonConverter (line 92) | public sealed class JsonConverter : JsonConverter<Embedding>
      method Read (line 98) | public override Embedding Read(ref Utf8JsonReader reader, Type typeT...
      method Write (line 103) | public override void Write(Utf8JsonWriter writer, Embedding value, J...

FILE: App/kernel-memory/service/Abstractions/AI/ITextEmbeddingBatchGenerator.cs
  type ITextEmbeddingBatchGenerator (line 13) | public interface ITextEmbeddingBatchGenerator
    method GenerateEmbeddingBatchAsync (line 28) | Task<Embedding[]> GenerateEmbeddingBatchAsync(

FILE: App/kernel-memory/service/Abstractions/AI/ITextEmbeddingGenerator.cs
  type ITextEmbeddingGenerator (line 8) | public interface ITextEmbeddingGenerator : ITextTokenizer
    method GenerateEmbeddingAsync (line 21) | public Task<Embedding> GenerateEmbeddingAsync(

FILE: App/kernel-memory/service/Abstractions/AI/ITextGenerator.cs
  type ITextGenerator (line 8) | public interface ITextGenerator : ITextTokenizer
    method GenerateTextAsync (line 22) | public IAsyncEnumerable<string> GenerateTextAsync(

FILE: App/kernel-memory/service/Abstractions/AI/ITextTokenizer.cs
  type ITextTokenizer (line 11) | [Experimental("KMEXP00")]
    method CountTokens (line 19) | public int CountTokens(string text);
    method GetTokens (line 26) | IReadOnlyList<string> GetTokens(string text);

FILE: App/kernel-memory/service/Abstractions/AI/TextGenerationOptions.cs
  class TextGenerationOptions (line 11) | public class TextGenerationOptions

FILE: App/kernel-memory/service/Abstractions/AppBuilders/ServiceCollectionExtensions.cs
  class ServiceCollectionExtensions (line 11) | [Experimental("KMEXP00")]
    method HasService (line 20) | public static bool HasService<T>(this IServiceCollection services)

FILE: App/kernel-memory/service/Abstractions/AppBuilders/ServiceCollectionPool.cs
  class ServiceCollectionPool (line 22) | [Experimental("KMEXP00")]
    method ServiceCollectionPool (line 53) | public ServiceCollectionPool(IServiceCollection primaryCollection)
    method AddServiceCollection (line 65) | public void AddServiceCollection(IServiceCollection? serviceCollection)
    method Add (line 78) | public void Add(ServiceDescriptor item)
    method Contains (line 88) | public bool Contains(ServiceDescriptor item)
    method GetEnumerator (line 97) | IEnumerator IEnumerable.GetEnumerator()
    method GetEnumerator (line 104) | public IEnumerator<ServiceDescriptor> GetEnumerator()
    method Remove (line 111) | public bool Remove(ServiceDescriptor item)
    method Clear (line 125) | public void Clear()
    method CopyTo (line 137) | public void CopyTo(ServiceDescriptor[] array, int arrayIndex)
    method Insert (line 150) | public void Insert(int index, ServiceDescriptor item)
    method IndexOf (line 163) | public int IndexOf(ServiceDescriptor item)
    method RemoveAt (line 177) | public void RemoveAt(int index)
    method Lock (line 220) | private void Lock()
    method AccessByPositionNotAllowed (line 226) | private static InvalidOperationException AccessByPositionNotAllowed()

FILE: App/kernel-memory/service/Abstractions/Configuration/ConfigurationException.cs
  class ConfigurationException (line 8) | public class ConfigurationException : KernelMemoryException
    method ConfigurationException (line 11) | public ConfigurationException()
    method ConfigurationException (line 16) | public ConfigurationException(string? message) : base(message)
    method ConfigurationException (line 21) | public ConfigurationException(string? message, Exception? innerExcepti...

FILE: App/kernel-memory/service/Abstractions/Configuration/ConfigurationExtensions.cs
  class ConfigurationExtensions (line 11) | public static partial class ConfigurationExtensions
    method BindSection (line 21) | public static IConfiguration BindSection(this IConfiguration configura...

FILE: App/kernel-memory/service/Abstractions/Configuration/TextPartitioningOptions.cs
  class TextPartitioningOptions (line 8) | public class TextPartitioningOptions
    method Validate (line 31) | public void Validate()

FILE: App/kernel-memory/service/Abstractions/Constants.cs
  class Constants (line 5) | public static class Constants
    class WebService (line 7) | public static class WebService
    class CustomContext (line 28) | public static class CustomContext
      class Partitioning (line 30) | public static class Partitioning
      class EmbeddingGeneration (line 42) | public static class EmbeddingGeneration
      class Rag (line 48) | public static class Rag
      class Summary (line 70) | public static class Summary

FILE: App/kernel-memory/service/Abstractions/Context/DependencyInjection.cs
  class DependencyInjection (line 13) | public static partial class DependencyInjection
    method AddRequestContextProvider (line 15) | public static IServiceCollection AddRequestContextProvider(this IServi...

FILE: App/kernel-memory/service/Abstractions/Context/IContext.cs
  type IContext (line 10) | public interface IContext
  class ContextExtensions (line 15) | public static class ContextExtensions
    method InitArgs (line 17) | public static IContext? InitArgs(this IContext? context, IDictionary<s...
    method SetArgs (line 25) | public static IContext? SetArgs(this IContext? context, IDictionary<st...
    method SetArg (line 37) | public static IContext? SetArg(this IContext? context, string key, obj...
    method ResetArgs (line 50) | public static IContext? ResetArgs(this IContext? context)
    method TryGetArg (line 58) | public static bool TryGetArg<T>(this IContext? context, string key, [N...
    method TryGetArg (line 78) | public static bool TryGetArg(this IContext? context, string key, [NotN...
  class CustomContextExtensions (line 91) | public static class CustomContextExtensions
    method GetCustomEmptyAnswerTextOrDefault (line 93) | public static string GetCustomEmptyAnswerTextOrDefault(this IContext? ...
    method GetCustomRagFactTemplateOrDefault (line 103) | public static string GetCustomRagFactTemplateOrDefault(this IContext? ...
    method GetCustomRagPromptOrDefault (line 113) | public static string GetCustomRagPromptOrDefault(this IContext? contex...
    method GetCustomRagMaxTokensOrDefault (line 123) | public static int GetCustomRagMaxTokensOrDefault(this IContext? contex...
    method GetCustomRagTemperatureOrDefault (line 133) | public static double GetCustomRagTemperatureOrDefault(this IContext? c...
    method GetCustomRagNucleusSamplingOrDefault (line 143) | public static double GetCustomRagNucleusSamplingOrDefault(this IContex...
    method GetCustomSummaryPromptOrDefault (line 153) | public static string GetCustomSummaryPromptOrDefault(this IContext? co...
    method GetCustomSummaryTargetTokenSizeOrDefault (line 163) | public static int GetCustomSummaryTargetTokenSizeOrDefault(this IConte...
    method GetCustomSummaryOverlappingTokensOrDefault (line 173) | public static int GetCustomSummaryOverlappingTokensOrDefault(this ICon...
    method GetCustomPartitioningMaxTokensPerParagraphOrDefault (line 183) | public static int GetCustomPartitioningMaxTokensPerParagraphOrDefault(...
    method GetCustomPartitioningOverlappingTokensOrDefault (line 193) | public static int GetCustomPartitioningOverlappingTokensOrDefault(this...
    method GetCustomPartitioningChunkHeaderOrDefault (line 203) | public static string? GetCustomPartitioningChunkHeaderOrDefault(this I...
    method GetCustomEmbeddingGenerationBatchSizeOrDefault (line 213) | public static int GetCustomEmbeddingGenerationBatchSizeOrDefault(this ...

FILE: App/kernel-memory/service/Abstractions/Context/IContextProvider.cs
  type IContextProvider (line 7) | public interface IContextProvider
    method GetContext (line 13) | IContext GetContext();
  class ContextProviderExtensions (line 16) | public static class ContextProviderExtensions
    method InitContextArgs (line 18) | public static IContextProvider? InitContextArgs(this IContextProvider?...
    method SetContextArgs (line 26) | public static IContextProvider? SetContextArgs(this IContextProvider? ...
    method SetContextArg (line 34) | public static IContextProvider? SetContextArg(this IContextProvider? p...

FILE: App/kernel-memory/service/Abstractions/Context/RequestContext.cs
  class RequestContext (line 7) | public sealed class RequestContext : IContext
    method RequestContext (line 11) | public RequestContext() { }
    method RequestContext (line 13) | public RequestContext(IDictionary<string, object?>? args)

FILE: App/kernel-memory/service/Abstractions/Context/RequestContextProvider.cs
  class RequestContextProvider (line 11) | public class RequestContextProvider : IContextProvider
    method GetContext (line 14) | public IContext GetContext()

FILE: App/kernel-memory/service/Abstractions/DataFormats/FileContent.cs
  class FileContent (line 8) | public class FileContent
    method FileContent (line 18) | public FileContent(string mimeType)

FILE: App/kernel-memory/service/Abstractions/DataFormats/FileSection.cs
  class FileSection (line 7) | public class FileSection
    method FileSection (line 36) | public FileSection(int number, string? content, bool sentencesAreCompl...

FILE: App/kernel-memory/service/Abstractions/DataFormats/IContentDecoder.cs
  type IContentDecoder (line 13) | public interface IContentDecoder
    method SupportsMimeType (line 20) | bool SupportsMimeType(string mimeType);
    method DecodeAsync (line 28) | Task<FileContent> DecodeAsync(string filename, CancellationToken cance...
    method DecodeAsync (line 36) | Task<FileContent> DecodeAsync(BinaryData data, CancellationToken cance...
    method DecodeAsync (line 44) | Task<FileContent> DecodeAsync(Stream data, CancellationToken cancellat...

FILE: App/kernel-memory/service/Abstractions/DataFormats/IOcrEngine.cs
  type IOcrEngine (line 12) | public interface IOcrEngine
    method ExtractTextFromImageAsync (line 19) | Task<string> ExtractTextFromImageAsync(Stream imageContent, Cancellati...

FILE: App/kernel-memory/service/Abstractions/DataFormats/WebPages/IWebScraper.cs
  type IWebScraper (line 11) | public interface IWebScraper
    method GetContentAsync (line 19) | Task<WebScraperResult> GetContentAsync(string url, CancellationToken c...

FILE: App/kernel-memory/service/Abstractions/DataFormats/WebPages/WebScraperResult.cs
  class WebScraperResult (line 7) | public class WebScraperResult

FILE: App/kernel-memory/service/Abstractions/Diagnostics/ArgumentNullExceptionEx.cs
  class ArgumentNullExceptionEx (line 11) | public static class ArgumentNullExceptionEx
    method ThrowIfNull (line 13) | public static void ThrowIfNull([NotNull] object? argument, string? par...
    method ThrowIfNullOrWhiteSpace (line 20) | public static void ThrowIfNullOrWhiteSpace([NotNull] string? argument,...
    method ThrowIfNullOrEmpty (line 27) | public static void ThrowIfNullOrEmpty([NotNull] string? argument, stri...
    method ThrowIfEmpty (line 34) | public static void ThrowIfEmpty<T>([NotNull] IList<T>? argument, strin...

FILE: App/kernel-memory/service/Abstractions/Diagnostics/ArgumentOutOfRangeExceptionEx.cs
  class ArgumentOutOfRangeExceptionEx (line 9) | public static class ArgumentOutOfRangeExceptionEx
    method ThrowIfEqual (line 13) | public static void ThrowIfEqual<T>(T value, T other, string? paramName...
    method ThrowIfNotEqual (line 20) | public static void ThrowIfNotEqual<T>(T value, T other, string? paramN...
    method ThrowIf (line 27) | public static void ThrowIf(bool condition, string? paramName, string m...
    method ThrowIfNot (line 34) | public static void ThrowIfNot(bool condition, string? paramName, strin...
    method ThrowIfZero (line 43) | public static void ThrowIfZero(int value, string paramName, string mes...
    method ThrowIfNegative (line 50) | public static void ThrowIfNegative(int value, string paramName, string...
    method ThrowIfZeroOrNegative (line 57) | public static void ThrowIfZeroOrNegative(int value, string paramName, ...
    method ThrowIfLessThan (line 64) | public static void ThrowIfLessThan(int value, int other, string paramN...
    method ThrowIfEqualToOrLessThan (line 71) | public static void ThrowIfEqualToOrLessThan(int value, int other, stri...
    method ThrowIfGreaterThan (line 78) | public static void ThrowIfGreaterThan(int value, int other, string par...
    method ThrowIfEqualToOrGreaterThan (line 85) | public static void ThrowIfEqualToOrGreaterThan(int value, int other, s...
    method ThrowIfZero (line 94) | public static void ThrowIfZero(uint value, string paramName, string me...
    method ThrowIfNegative (line 101) | public static void ThrowIfNegative(uint value, string paramName, strin...
    method ThrowIfZeroOrNegative (line 108) | public static void ThrowIfZeroOrNegative(uint value, string paramName,...
    method ThrowIfLessThan (line 115) | public static void ThrowIfLessThan(uint value, uint other, string para...
    method ThrowIfEqualToOrLessThan (line 122) | public static void ThrowIfEqualToOrLessThan(uint value, uint other, st...
    method ThrowIfGreaterThan (line 129) | public static void ThrowIfGreaterThan(uint value, uint other, string p...
    method ThrowIfEqualToOrGreaterThan (line 136) | public static void ThrowIfEqualToOrGreaterThan(uint value, uint other,...
    method ThrowIfZero (line 145) | public static void ThrowIfZero(float value, string paramName, string m...
    method ThrowIfNegative (line 152) | public static void ThrowIfNegative(float value, string paramName, stri...
    method ThrowIfZeroOrNegative (line 159) | public static void ThrowIfZeroOrNegative(float value, string paramName...
    method ThrowIfLessThan (line 166) | public static void ThrowIfLessThan(float value, float other, string pa...
    method ThrowIfEqualToOrLessThan (line 173) | public static void ThrowIfEqualToOrLessThan(float value, float other, ...
    method ThrowIfGreaterThan (line 180) | public static void ThrowIfGreaterThan(float value, float other, string...
    method ThrowIfEqualToOrGreaterThan (line 187) | public static void ThrowIfEqualToOrGreaterThan(float value, float othe...
    method ThrowIfZero (line 196) | public static void ThrowIfZero(double value, string paramName, string ...
    method ThrowIfNegative (line 203) | public static void ThrowIfNegative(double value, string paramName, str...
    method ThrowIfZeroOrNegative (line 210) | public static void ThrowIfZeroOrNegative(double value, string paramNam...
    method ThrowIfLessThan (line 217) | public static void ThrowIfLessThan(double value, double other, string ...
    method ThrowIfEqualToOrLessThan (line 224) | public static void ThrowIfEqualToOrLessThan(double value, double other...
    method ThrowIfGreaterThan (line 231) | public static void ThrowIfGreaterThan(double value, double other, stri...
    method ThrowIfEqualToOrGreaterThan (line 238) | public static void ThrowIfEqualToOrGreaterThan(double value, double ot...

FILE: App/kernel-memory/service/Abstractions/Diagnostics/DefaultLogger.cs
  class DefaultLogger (line 15) | public static class DefaultLogger<T>
    method DefaultLogFactory (line 39) | private static ILoggerFactory DefaultLogFactory()
    method TryGetLogLevel (line 62) | private static bool TryGetLogLevel(string? value, out LogLevel level)
  class DefaultLogger (line 24) | public static class DefaultLogger
    method DefaultLogFactory (line 39) | private static ILoggerFactory DefaultLogFactory()
    method TryGetLogLevel (line 62) | private static bool TryGetLogLevel(string? value, out LogLevel level)

FILE: App/kernel-memory/service/Abstractions/Diagnostics/Telemetry.cs
  class Telemetry (line 7) | public static class Telemetry
    method GetBoolEnvVar (line 31) | private static bool? GetBoolEnvVar(string name)

FILE: App/kernel-memory/service/Abstractions/DocumentStorage/DocumentStorageException.cs
  class DocumentStorageException (line 7) | public class DocumentStorageException : KernelMemoryException
    method DocumentStorageException (line 10) | public DocumentStorageException() { }
    method DocumentStorageException (line 13) | public DocumentStorageException(string message) : base(message) { }
    method DocumentStorageException (line 16) | public DocumentStorageException(string message, Exception? innerExcept...
  class DocumentStorageFileNotFoundException (line 19) | public class DocumentStorageFileNotFoundException : DocumentStorageExcep...
    method DocumentStorageFileNotFoundException (line 22) | public DocumentStorageFileNotFoundException() { }
    method DocumentStorageFileNotFoundException (line 25) | public DocumentStorageFileNotFoundException(string message) : base(mes...
    method DocumentStorageFileNotFoundException (line 28) | public DocumentStorageFileNotFoundException(string message, Exception?...

FILE: App/kernel-memory/service/Abstractions/DocumentStorage/EmbeddingFileContent.cs
  class EmbeddingFileContent (line 8) | public class EmbeddingFileContent

FILE: App/kernel-memory/service/Abstractions/DocumentStorage/IDocumentStorage.cs
  type IDocumentStorage (line 9) | public interface IDocumentStorage
    method CreateIndexDirectoryAsync (line 16) | Task CreateIndexDirectoryAsync(
    method DeleteIndexDirectoryAsync (line 25) | Task DeleteIndexDirectoryAsync(
    method CreateDocumentDirectoryAsync (line 35) | Task CreateDocumentDirectoryAsync(
    method EmptyDocumentDirectoryAsync (line 46) | Task EmptyDocumentDirectoryAsync(
    method DeleteDocumentDirectoryAsync (line 57) | Task DeleteDocumentDirectoryAsync(
    method WriteFileAsync (line 70) | Task WriteFileAsync(
    method ReadFileAsync (line 86) | Task<StreamableFileContent> ReadFileAsync(

FILE: App/kernel-memory/service/Abstractions/IKernelMemory.cs
  type IKernelMemory (line 11) | public interface IKernelMemory
    method ImportDocumentAsync (line 22) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 40) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 56) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 73) | public Task<string> ImportDocumentAsync(
    method ImportTextAsync (line 94) | public Task<string> ImportTextAsync(
    method ImportWebPageAsync (line 114) | public Task<string> ImportWebPageAsync(
    method ListIndexesAsync (line 128) | public Task<IEnumerable<IndexDetails>> ListIndexesAsync(CancellationTo...
    method DeleteIndexAsync (line 135) | public Task DeleteIndexAsync(
    method DeleteDocumentAsync (line 145) | public Task DeleteDocumentAsync(
    method IsDocumentReadyAsync (line 159) | public Task<bool> IsDocumentReadyAsync(
    method GetDocumentStatusAsync (line 171) | public Task<DataPipelineStatus?> GetDocumentStatusAsync(
    method ExportFileAsync (line 184) | public Task<StreamableFileContent> ExportFileAsync(
    method SearchAsync (line 202) | public Task<SearchResult> SearchAsync(
    method AskAsync (line 223) | public Task<MemoryAnswer> AskAsync(

FILE: App/kernel-memory/service/Abstractions/IKernelMemoryBuilder.cs
  type IKernelMemoryBuilder (line 14) | public interface IKernelMemoryBuilder
    method Build (line 31) | public IKernelMemory Build();
    method Build (line 39) | public T Build<T>() where T : class, IKernelMemory;
    method AddSingleton (line 46) | public IKernelMemoryBuilder AddSingleton<TService>(TService implementa...
    method AddSingleton (line 54) | public IKernelMemoryBuilder AddSingleton<TService, TImplementation>()
    method WithoutDefaultHandlers (line 62) | public IKernelMemoryBuilder WithoutDefaultHandlers();
    method AddIngestionMemoryDb (line 69) | public IKernelMemoryBuilder AddIngestionMemoryDb(IMemoryDb service);
    method AddIngestionEmbeddingGenerator (line 76) | public IKernelMemoryBuilder AddIngestionEmbeddingGenerator(ITextEmbedd...
    method GetOrchestrator (line 81) | public IPipelineOrchestrator GetOrchestrator();

FILE: App/kernel-memory/service/Abstractions/KernelMemoryBuilderExtensions.cs
  class KernelMemoryBuilderExtensions (line 18) | public static partial class KernelMemoryBuilderExtensions
    method Configure (line 26) | public static IKernelMemoryBuilder Configure(
    method Configure (line 42) | public static IKernelMemoryBuilder Configure(
    method With (line 67) | public static IKernelMemoryBuilder With<T>(
    method WithCustomIngestionQueueClientFactory (line 74) | public static IKernelMemoryBuilder WithCustomIngestionQueueClientFactory(
    method WithCustomIngestionQueueClientFactory (line 82) | public static IKernelMemoryBuilder WithCustomIngestionQueueClientFacto...
    method WithCustomDocumentStorage (line 89) | public static IKernelMemoryBuilder WithCustomDocumentStorage(
    method WithCustomDocumentStorage (line 97) | public static IKernelMemoryBuilder WithCustomDocumentStorage<T>(
    method WithCustomMimeTypeDetection (line 104) | public static IKernelMemoryBuilder WithCustomMimeTypeDetection(
    method WithCustomMimeTypeDetection (line 112) | public static IKernelMemoryBuilder WithCustomMimeTypeDetection<T>(
    method WithCustomEmbeddingGenerator (line 119) | public static IKernelMemoryBuilder WithCustomEmbeddingGenerator(
    method WithCustomEmbeddingGenerator (line 140) | public static IKernelMemoryBuilder WithCustomEmbeddingGenerator<T>(
    method WithCustomMemoryDb (line 147) | public static IKernelMemoryBuilder WithCustomMemoryDb(
    method WithCustomMemoryDb (line 168) | public static IKernelMemoryBuilder WithCustomMemoryDb<T>(
    method WithCustomTextGenerator (line 175) | public static IKernelMemoryBuilder WithCustomTextGenerator(
    method WithCustomTextGenerator (line 184) | public static IKernelMemoryBuilder WithCustomTextGenerator<T>(
    method WithCustomImageOcr (line 191) | public static IKernelMemoryBuilder WithCustomImageOcr(
    method WithCustomImageOcr (line 200) | public static IKernelMemoryBuilder WithCustomImageOcr<T>(
    method WithCustomPromptProvider (line 207) | public static IKernelMemoryBuilder WithCustomPromptProvider(
    method WithCustomPromptProvider (line 215) | public static IKernelMemoryBuilder WithCustomPromptProvider<T>(
    method WithCustomTextPartitioningOptions (line 227) | public static IKernelMemoryBuilder WithCustomTextPartitioningOptions(

FILE: App/kernel-memory/service/Abstractions/KernelMemoryException.cs
  class KernelMemoryException (line 10) | public class KernelMemoryException : Exception
    method KernelMemoryException (line 15) | public KernelMemoryException()
    method KernelMemoryException (line 23) | public KernelMemoryException(string? message) : base(message)
    method KernelMemoryException (line 32) | public KernelMemoryException(string? message, Exception? innerExceptio...

FILE: App/kernel-memory/service/Abstractions/KernelMemoryExtensions.cs
  class KernelMemoryExtensions (line 12) | public static class KernelMemoryExtensions
    method SearchSyntheticsAsync (line 24) | public static async Task<List<Citation>> SearchSyntheticsAsync(
    method SearchSummariesAsync (line 66) | public static Task<List<Citation>> SearchSummariesAsync(

FILE: App/kernel-memory/service/Abstractions/KernelMemoryWebException.cs
  class KernelMemoryWebException (line 7) | public class KernelMemoryWebException : KernelMemoryException
    method KernelMemoryWebException (line 10) | public KernelMemoryWebException()
    method KernelMemoryWebException (line 15) | public KernelMemoryWebException(string? message) : base(message)
    method KernelMemoryWebException (line 20) | public KernelMemoryWebException(string? message, Exception? innerExcep...

FILE: App/kernel-memory/service/Abstractions/MemoryStorage/IMemoryDb.cs
  type IMemoryDb (line 12) | public interface IMemoryDb
    method CreateIndexAsync (line 20) | Task CreateIndexAsync(
    method GetIndexesAsync (line 30) | Task<IEnumerable<string>> GetIndexesAsync(CancellationToken cancellati...
    method DeleteIndexAsync (line 37) | Task DeleteIndexAsync(
    method UpsertAsync (line 49) | Task<string> UpsertAsync(
    method GetSimilarListAsync (line 65) | IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAsync(
    method GetListAsync (line 84) | IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 97) | Task DeleteAsync(

FILE: App/kernel-memory/service/Abstractions/MemoryStorage/IMemoryDbUpsertBatch.cs
  type IMemoryDbUpsertBatch (line 13) | public interface IMemoryDbUpsertBatch
    method UpsertBatchAsync (line 23) | IAsyncEnumerable<string> UpsertBatchAsync(

FILE: App/kernel-memory/service/Abstractions/MemoryStorage/IndexNotFoundException.cs
  class IndexNotFoundException (line 7) | public class IndexNotFoundException : KernelMemoryException
    method IndexNotFoundException (line 10) | public IndexNotFoundException() { }
    method IndexNotFoundException (line 13) | public IndexNotFoundException(string message) : base(message) { }
    method IndexNotFoundException (line 16) | public IndexNotFoundException(string message, Exception? innerExceptio...

FILE: App/kernel-memory/service/Abstractions/MemoryStorage/MemoryRecord.cs
  class MemoryRecord (line 8) | public class MemoryRecord
    method UpgradeRequired (line 95) | private bool UpgradeRequired()
    method Upgrade (line 111) | private void Upgrade()

FILE: App/kernel-memory/service/Abstractions/Models/Citation.cs
  class Citation (line 9) | public class Citation
    class Partition (line 70) | public class Partition

FILE: App/kernel-memory/service/Abstractions/Models/DataPipelineStatus.cs
  class DataPipelineStatus (line 9) | public class DataPipelineStatus

FILE: App/kernel-memory/service/Abstractions/Models/DeleteAccepted.cs
  class DeleteAccepted (line 7) | public class DeleteAccepted

FILE: App/kernel-memory/service/Abstractions/Models/Document.cs
  class Document (line 16) | public class Document
    method Document (line 42) | public Document(string? id = null, TagCollection? tags = null, IEnumer...
    method AddTag (line 58) | public Document AddTag(string name, string value)
    method AddFile (line 70) | public Document AddFile(string filePath)
    method AddFiles (line 82) | public Document AddFiles(IEnumerable<string>? filePaths)
    method AddFiles (line 93) | public Document AddFiles(string[]? filePaths)
    method AddStream (line 111) | public Document AddStream(string? fileName, Stream content)
    method ValidateId (line 125) | public static string ValidateId(string? id)
    method ReplaceInvalidChars (line 140) | public static string ReplaceInvalidChars(string? value)
    method IsValid (line 151) | private static bool IsValid(string? value)
    method IsValidChar (line 158) | private static bool IsValidChar(char c)
    method RandomId (line 163) | private static string RandomId()

FILE: App/kernel-memory/service/Abstractions/Models/DocumentUploadRequest.cs
  class DocumentUploadRequest (line 12) | public class DocumentUploadRequest
    class UploadedFile (line 14) | public class UploadedFile
      method UploadedFile (line 27) | public UploadedFile()
      method UploadedFile (line 31) | public UploadedFile(string fileName, Stream fileContent)
    method DocumentUploadRequest (line 66) | public DocumentUploadRequest()
    method DocumentUploadRequest (line 76) | public DocumentUploadRequest(Document document, string? index = null, ...

FILE: App/kernel-memory/service/Abstractions/Models/FileCollection.cs
  class FileCollection (line 15) | public class FileCollection
    method AddFile (line 36) | public void AddFile(string filePath)
    method AddStream (line 64) | public void AddStream(string? fileName, Stream content)
    method GetStreams (line 86) | public IEnumerable<(string name, Stream content)> GetStreams()
    method CalculateSHA256 (line 107) | private static string CalculateSHA256(string value)
    method ToHexString (line 129) | public static string ToHexString(byte[] byteArray)

FILE: App/kernel-memory/service/Abstractions/Models/IndexCollection.cs
  class IndexCollection (line 8) | public class IndexCollection

FILE: App/kernel-memory/service/Abstractions/Models/IndexDetails.cs
  class IndexDetails (line 7) | public class IndexDetails

FILE: App/kernel-memory/service/Abstractions/Models/MemoryAnswer.cs
  class MemoryAnswer (line 12) | public class MemoryAnswer
    method ToJson (line 59) | public string ToJson(bool indented = false)
    method FromJson (line 64) | public MemoryAnswer FromJson(string json)
    method ToString (line 70) | public override string ToString()

FILE: App/kernel-memory/service/Abstractions/Models/MemoryFilter.cs
  class MemoryFilter (line 7) | public class MemoryFilter : TagCollection
    method IsEmpty (line 9) | public bool IsEmpty()
    method ByTag (line 14) | public MemoryFilter ByTag(string name, string value)
    method ByDocument (line 20) | public MemoryFilter ByDocument(string docId)
    method GetFilters (line 26) | public IEnumerable<KeyValuePair<string, string?>> GetFilters()
  class MemoryFilters (line 37) | public static class MemoryFilters
    method ByTag (line 39) | public static MemoryFilter ByTag(string name, string value)
    method ByDocument (line 44) | public static MemoryFilter ByDocument(string docId)

FILE: App/kernel-memory/service/Abstractions/Models/MemoryQuery.cs
  class MemoryQuery (line 8) | public class MemoryQuery

FILE: App/kernel-memory/service/Abstractions/Models/SearchQuery.cs
  class SearchQuery (line 8) | public class SearchQuery

FILE: App/kernel-memory/service/Abstractions/Models/SearchResult.cs
  class SearchResult (line 9) | public class SearchResult
    method ToJson (line 51) | public string ToJson(bool indented = false)
    method FromJson (line 56) | public MemoryAnswer FromJson(string json)

FILE: App/kernel-memory/service/Abstractions/Models/StreamableFileContent.cs
  class StreamableFileContent (line 9) | public sealed class StreamableFileContent : IDisposable
    method StreamableFileContent (line 19) | public StreamableFileContent()
    method StreamableFileContent (line 24) | public StreamableFileContent(
    method Dispose (line 46) | public void Dispose()

FILE: App/kernel-memory/service/Abstractions/Models/TagCollection.cs
  class TagCollection (line 12) | public class TagCollection : IDictionary<string, List<string?>>
    method GetEnumerator (line 44) | public IEnumerator<KeyValuePair<string, List<string?>>> GetEnumerator()
    method GetEnumerator (line 49) | IEnumerator IEnumerable.GetEnumerator()
    method Add (line 54) | public void Add(KeyValuePair<string, List<string?>> item)
    method Add (line 60) | public void Add(string key)
    method Add (line 68) | public void Add(string key, string? value)
    method Add (line 83) | public void Add(string key, List<string?> value)
    method TryGetValue (line 89) | public bool TryGetValue(string key, out List<string?> value)
    method Contains (line 96) | public bool Contains(KeyValuePair<string, List<string?>> item)
    method ContainsKey (line 101) | public bool ContainsKey(string key)
    method CopyTo (line 106) | public void CopyTo(KeyValuePair<string, List<string?>>[] array, int ar...
    method CopyTo (line 111) | public void CopyTo(TagCollection tagCollection)
    method ToKeyValueList (line 129) | public IEnumerable<KeyValuePair<string, string?>> ToKeyValueList()
    method Remove (line 134) | public bool Remove(KeyValuePair<string, List<string?>> item)
    method Remove (line 139) | public bool Remove(string key)
    method Clear (line 144) | public void Clear()
    method ToString (line 149) | public override string ToString()
    method ToStringExcludeReserved (line 154) | public string ToStringExcludeReserved()
    method ToString (line 159) | private static string ToString(IEnumerable<KeyValuePair<string, List<s...
    method ValidateKey (line 180) | private static void ValidateKey(string key)

FILE: App/kernel-memory/service/Abstractions/Models/TagCollectionExtensions.cs
  class TagCollectionExtensions (line 8) | public static class TagCollectionExtensions
    method Clone (line 15) | public static TagCollection Clone(this TagCollection tagCollection)
    method AddSyntheticTag (line 28) | public static TagCollection AddSyntheticTag(this TagCollection tagColl...

FILE: App/kernel-memory/service/Abstractions/Models/UploadAccepted.cs
  class UploadAccepted (line 7) | public class UploadAccepted

FILE: App/kernel-memory/service/Abstractions/Pipeline/DataPipeline.cs
  class DataPipeline (line 17) | public sealed class DataPipeline
    type ArtifactTypes (line 19) | [JsonConverter(typeof(JsonStringEnumConverter))]
    class PipelineLogEntry (line 30) | public sealed class PipelineLogEntry
      method PipelineLogEntry (line 44) | public PipelineLogEntry(string source, string text)
    class FileDetailsBase (line 51) | public abstract class FileDetailsBase
      method AlreadyProcessedBy (line 132) | public bool AlreadyProcessedBy(IPipelineStepHandler handler, string?...
      method MarkProcessedBy (line 143) | public void MarkProcessedBy(IPipelineStepHandler handler, string? su...
      method Log (line 155) | public void Log(IPipelineStepHandler handler, string text)
    class GeneratedFileDetails (line 166) | public class GeneratedFileDetails : FileDetailsBase
    class FileDetails (line 191) | public class FileDetails : FileDetailsBase
      method GetPartitionFileName (line 200) | public string GetPartitionFileName(int partitionNumber)
      method GetHandlerOutputFileName (line 205) | public string GetHandlerOutputFileName(IPipelineStepHandler handler,...
    method Then (line 303) | public DataPipeline Then(string stepName)
    method AddUploadFile (line 309) | public DataPipeline AddUploadFile(string name, string filename, string...
    method AddUploadFile (line 314) | public DataPipeline AddUploadFile(string name, string filename, byte[]...
    method AddUploadFile (line 319) | public DataPipeline AddUploadFile(string name, string filename, Binary...
    method AddUploadFile (line 324) | public DataPipeline AddUploadFile(string name, string filename, Stream...
    method Build (line 331) | public DataPipeline Build()
    method MoveToNextStep (line 351) | public string MoveToNextStep()
    method RollbackToPreviousStep (line 368) | public string RollbackToPreviousStep()
    method IsDocumentDeletionPipeline (line 382) | public bool IsDocumentDeletionPipeline()
    method IsIndexDeletionPipeline (line 387) | public bool IsIndexDeletionPipeline()
    method Validate (line 392) | public void Validate()
    method GetFile (line 426) | public FileDetails GetFile(string id)
    method ToDataPipelineStatus (line 436) | public DataPipelineStatus ToDataPipelineStatus()
  class DataPipelineExtensions (line 455) | public static partial class DataPipelineExtensions
    method GetContext (line 457) | public static IContext GetContext(this DataPipeline pipeline)

FILE: App/kernel-memory/service/Abstractions/Pipeline/DataPipelinePointer.cs
  class DataPipelinePointer (line 8) | public sealed class DataPipelinePointer
    method DataPipelinePointer (line 40) | public DataPipelinePointer()
    method DataPipelinePointer (line 44) | public DataPipelinePointer(DataPipeline pipeline)

FILE: App/kernel-memory/service/Abstractions/Pipeline/IPipelineOrchestrator.cs
  type IPipelineOrchestrator (line 13) | public interface IPipelineOrchestrator
    method AddHandlerAsync (line 26) | Task AddHandlerAsync(IPipelineStepHandler handler, CancellationToken c...
    method TryAddHandlerAsync (line 33) | Task TryAddHandlerAsync(IPipelineStepHandler handler, CancellationToke...
    method ImportDocumentAsync (line 43) | Task<string> ImportDocumentAsync(string index, DocumentUploadRequest u...
    method PrepareNewDocumentUpload (line 54) | DataPipeline PrepareNewDocumentUpload(string index, string documentId,...
    method RunPipelineAsync (line 61) | Task RunPipelineAsync(DataPipeline pipeline, CancellationToken cancell...
    method ReadPipelineStatusAsync (line 70) | Task<DataPipeline?> ReadPipelineStatusAsync(string index, string docum...
    method ReadPipelineSummaryAsync (line 79) | Task<DataPipelineStatus?> ReadPipelineSummaryAsync(string index, strin...
    method IsDocumentReadyAsync (line 90) | public Task<bool> IsDocumentReadyAsync(string index, string documentId...
    method StopAllPipelinesAsync (line 95) | Task StopAllPipelinesAsync();
    method ReadFileAsStreamAsync (line 104) | Task<StreamableFileContent> ReadFileAsStreamAsync(DataPipeline pipelin...
    method ReadFileAsync (line 112) | Task<BinaryData> ReadFileAsync(DataPipeline pipeline, string fileName,...
    method ReadTextFileAsync (line 120) | Task<string> ReadTextFileAsync(DataPipeline pipeline, string fileName,...
    method WriteTextFileAsync (line 129) | Task WriteTextFileAsync(DataPipeline pipeline, string fileName, string...
    method WriteFileAsync (line 138) | Task WriteFileAsync(DataPipeline pipeline, string fileName, BinaryData...
    method GetEmbeddingGenerators (line 161) | List<ITextEmbeddingGenerator> GetEmbeddingGenerators();
    method GetMemoryDbs (line 166) | List<IMemoryDb> GetMemoryDbs();
    method GetTextGenerator (line 174) | ITextGenerator GetTextGenerator();
    method StartIndexDeletionAsync (line 183) | Task StartIndexDeletionAsync(string? index = null, CancellationToken c...
    method StartDocumentDeletionAsync (line 193) | Task StartDocumentDeletionAsync(

FILE: App/kernel-memory/service/Abstractions/Pipeline/IPipelineStepHandler.cs
  type IPipelineStepHandler (line 8) | public interface IPipelineStepHandler
    method InvokeAsync (line 23) | Task<(bool success, DataPipeline updatedPipeline)> InvokeAsync(DataPip...

FILE: App/kernel-memory/service/Abstractions/Pipeline/MimeTypes.cs
  class MimeTypes (line 9) | public static class MimeTypes
  class FileExtensions (line 77) | public static class FileExtensions
  type IMimeTypeDetection (line 141) | public interface IMimeTypeDetection
    method GetFileType (line 143) | public string GetFileType(string filename);
  class MimeTypesDetection (line 146) | public class MimeTypesDetection : IMimeTypeDetection
    method GetFileType (line 214) | public string GetFileType(string filename)

FILE: App/kernel-memory/service/Abstractions/Pipeline/OrchestrationException.cs
  class OrchestrationException (line 7) | public class OrchestrationException : KernelMemoryException
    method OrchestrationException (line 10) | public OrchestrationException() { }
    method OrchestrationException (line 13) | public OrchestrationException(string message) : base(message) { }
    method OrchestrationException (line 16) | public OrchestrationException(string message, Exception? innerExceptio...

FILE: App/kernel-memory/service/Abstractions/Pipeline/PipelineException.cs
  class PipelineException (line 10) | public class PipelineException : KernelMemoryException
    method PipelineException (line 13) | public PipelineException() { }
    method PipelineException (line 16) | public PipelineException(string message) : base(message) { }
    method PipelineException (line 19) | public PipelineException(string message, Exception? innerException) : ...
  class InvalidPipelineDataException (line 25) | public class InvalidPipelineDataException : PipelineException
    method InvalidPipelineDataException (line 28) | public InvalidPipelineDataException() { }
    method InvalidPipelineDataException (line 31) | public InvalidPipelineDataException(string message) : base(message) { }
    method InvalidPipelineDataException (line 34) | public InvalidPipelineDataException(string message, Exception? innerEx...
  class PipelineNotFoundException (line 40) | public class PipelineNotFoundException : PipelineException
    method PipelineNotFoundException (line 43) | public PipelineNotFoundException() { }
    method PipelineNotFoundException (line 46) | public PipelineNotFoundException(string message) : base(message) { }
    method PipelineNotFoundException (line 49) | public PipelineNotFoundException(string message, Exception? innerExcep...

FILE: App/kernel-memory/service/Abstractions/Pipeline/Queue/IQueue.cs
  type IQueue (line 9) | public interface IQueue : IDisposable
    method ConnectToQueueAsync (line 18) | Task<IQueue> ConnectToQueueAsync(string queueName, QueueOptions option...
    method EnqueueAsync (line 25) | Task EnqueueAsync(string message, CancellationToken cancellationToken ...
    method OnDequeue (line 31) | void OnDequeue(Func<string, Task<bool>> processMessageAction);

FILE: App/kernel-memory/service/Abstractions/Pipeline/Queue/QueueClientFactory.cs
  class QueueClientFactory (line 7) | public class QueueClientFactory
    method QueueClientFactory (line 11) | public QueueClientFactory(Func<IQueue> queueBuilder)
    method Build (line 20) | public IQueue Build()

FILE: App/kernel-memory/service/Abstractions/Pipeline/Queue/QueueOptions.cs
  type QueueOptions (line 7) | public struct QueueOptions : IEquatable<QueueOptions>
    method QueueOptions (line 14) | public QueueOptions()
    method Equals (line 18) | public override bool Equals(object? obj)
    method Equals (line 23) | public bool Equals(QueueOptions other)
    method GetHashCode (line 28) | public override int GetHashCode()

FILE: App/kernel-memory/service/Abstractions/Prompts/IPromptProvider.cs
  type IPromptProvider (line 5) | public interface IPromptProvider
    method ReadPrompt (line 12) | public string ReadPrompt(string promptName);

FILE: App/kernel-memory/service/Abstractions/Search/ISearchClient.cs
  type ISearchClient (line 13) | public interface ISearchClient
    method SearchAsync (line 26) | Task<SearchResult> SearchAsync(
    method AskAsync (line 45) | Task<MemoryAnswer> AskAsync(
    method ListIndexesAsync (line 58) | Task<IEnumerable<string>> ListIndexesAsync(CancellationToken cancellat...

FILE: App/kernel-memory/service/Abstractions/Search/SearchClientConfig.cs
  class SearchClientConfig (line 12) | public class SearchClientConfig
    method Validate (line 95) | public void Validate()

FILE: App/kernel-memory/service/Abstractions/SemanticKernel/KernelFunctionExtensions.cs
  class KernelFunctionExtensions (line 11) | public static partial class KernelFunctionExtensions
    method InvokeAsync (line 24) | public static Task<FunctionResult> InvokeAsync(

FILE: App/kernel-memory/service/Abstractions/SemanticKernel/TextEmbeddingGenerationExtensions.cs
  class TextEmbeddingGenerationExtensions (line 16) | public static partial class TextEmbeddingGenerationExtensions
    method GenerateEmbeddingAsync (line 25) | public static async Task<Embedding> GenerateEmbeddingAsync(

FILE: App/kernel-memory/service/Core/AI/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 12) | public static partial class KernelMemoryBuilderExtensions
    method WithoutEmbeddingGenerator (line 18) | public static IKernelMemoryBuilder WithoutEmbeddingGenerator(this IKer...
    method WithoutTextGenerator (line 28) | public static IKernelMemoryBuilder WithoutTextGenerator(this IKernelMe...
  class DependencyInjection (line 38) | public static partial class DependencyInjection
    method AddNoEmbeddingGenerator (line 44) | public static IServiceCollection AddNoEmbeddingGenerator(this IService...
    method AddNoTextGenerator (line 53) | public static IServiceCollection AddNoTextGenerator(this IServiceColle...

FILE: App/kernel-memory/service/Core/AI/NoEmbeddingGenerator.cs
  class NoEmbeddingGenerator (line 16) | public class NoEmbeddingGenerator : ITextEmbeddingGenerator
    method NoEmbeddingGenerator (line 20) | public NoEmbeddingGenerator(ILoggerFactory? loggerFactory = null)
    method CountTokens (line 29) | public int CountTokens(string text)
    method GetTokens (line 35) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateEmbeddingAsync (line 41) | public Task<Embedding> GenerateEmbeddingAsync(string text, Cancellatio...
    method Error (line 46) | private NotImplementedException Error()

FILE: App/kernel-memory/service/Core/AI/NoTextGenerator.cs
  class NoTextGenerator (line 15) | public class NoTextGenerator : ITextGenerator
    method NoTextGenerator (line 19) | public NoTextGenerator(ILoggerFactory? loggerFactory = null)
    method CountTokens (line 28) | public int CountTokens(string text)
    method GetTokens (line 34) | public IReadOnlyList<string> GetTokens(string text)
    method GenerateTextAsync (line 40) | public IAsyncEnumerable<string> GenerateTextAsync(string prompt, TextG...
    method Error (line 45) | private NotImplementedException Error()

FILE: App/kernel-memory/service/Core/Configuration/HandlerConfig.cs
  class HandlerConfig (line 5) | public class HandlerConfig
    method HandlerConfig (line 17) | public HandlerConfig()
    method HandlerConfig (line 23) | public HandlerConfig(string assembly, string className)

FILE: App/kernel-memory/service/Core/Configuration/InternalConstants.cs
  class InternalConstants (line 10) | internal static class InternalConstants

FILE: App/kernel-memory/service/Core/Configuration/KernelMemoryConfig.cs
  class KernelMemoryConfig (line 13) | public class KernelMemoryConfig
    class DataIngestionConfig (line 18) | public class DataIngestionConfig
      class DistributedOrchestrationConfig (line 20) | public class DistributedOrchestrationConfig
      method GetDefaultStepsOrDefaults (line 92) | public List<string> GetDefaultStepsOrDefaults()
    class RetrievalConfig (line 103) | public class RetrievalConfig
    method GetServiceConfig (line 193) | public T GetServiceConfig<T>(IConfiguration cfg, string serviceName, s...

FILE: App/kernel-memory/service/Core/Configuration/ServiceAuthorizationConfig.cs
  class ServiceAuthorizationConfig (line 7) | public class ServiceAuthorizationConfig
    method Validate (line 46) | public void Validate()
    method ValidateAccessKey (line 67) | private static void ValidateAccessKey(string key, int keyNumber)
    method IsValidChar (line 85) | private static bool IsValidChar(char c)

FILE: App/kernel-memory/service/Core/Configuration/ServiceConfig.cs
  class ServiceConfig (line 7) | public class ServiceConfig

FILE: App/kernel-memory/service/Core/DataFormats/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 17) | public static partial class KernelMemoryBuilderExtensions
    method WithContentDecoder (line 19) | public static IKernelMemoryBuilder WithContentDecoder<T>(
    method WithContentDecoder (line 26) | public static IKernelMemoryBuilder WithContentDecoder(
    method WithDefaultContentDecoders (line 33) | public static IKernelMemoryBuilder WithDefaultContentDecoders(
    method WithDefaultWebScraper (line 40) | public static IKernelMemoryBuilder WithDefaultWebScraper(
    method WithCustomWebScraper (line 47) | public static IKernelMemoryBuilder WithCustomWebScraper(
    method WithCustomWebScraper (line 54) | public static IKernelMemoryBuilder WithCustomWebScraper<T>(
  class DependencyInjection (line 65) | public static partial class DependencyInjection
    method AddContentDecoder (line 67) | public static IServiceCollection AddContentDecoder<T>(
    method AddContentDecoder (line 74) | public static IServiceCollection AddContentDecoder(
    method AddDefaultContentDecoders (line 81) | public static IServiceCollection AddDefaultContentDecoders(
    method AddDefaultWebScraper (line 98) | public static IServiceCollection AddDefaultWebScraper(
    method AddCustomWebScraper (line 110) | public static IServiceCollection AddCustomWebScraper(
    method AddCustomWebScraper (line 117) | public static IServiceCollection AddCustomWebScraper<T>(

FILE: App/kernel-memory/service/Core/DataFormats/Image/ImageContextDecoder.cs
  class ImageContextDecoder (line 19) | public sealed class ImageContextDecoder : IContentDecoder
    method ImageContextDecoder (line 27) | public ImageContextDecoder(KernelMemoryConfig config, ILoggerFactory? ...
    method DecodeAsync (line 40) | public async Task<FileContent> DecodeAsync(string filename, Cancellati...
    method DecodeAsync (line 46) | public async Task<FileContent> DecodeAsync(BinaryData data, Cancellati...
    method DecodeAsync (line 85) | public async Task<FileContent> DecodeAsync(Stream data, CancellationTo...
    method SupportsMimeType (line 95) | public bool SupportsMimeType(string mimeType)

FILE: App/kernel-memory/service/Core/DataFormats/Image/ImageDecoder.cs
  class ImageDecoder (line 14) | [Experimental("KMEXP00")]
    method ImageDecoder (line 20) | public ImageDecoder(IOcrEngine? ocrEngine = null, ILoggerFactory? logg...
    method SupportsMimeType (line 27) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 37) | public async Task<FileContent> DecodeAsync(string filename, Cancellati...
    method DecodeAsync (line 49) | public async Task<FileContent> DecodeAsync(BinaryData data, Cancellati...
    method DecodeAsync (line 61) | public async Task<FileContent> DecodeAsync(Stream data, CancellationTo...
    method ImageToTextAsync (line 72) | private async Task<string> ImageToTextAsync(string filename, Cancellat...
    method ImageToTextAsync (line 81) | private async Task<string> ImageToTextAsync(BinaryData data, Cancellat...
    method ImageToTextAsync (line 90) | private Task<string> ImageToTextAsync(Stream data, CancellationToken c...

FILE: App/kernel-memory/service/Core/DataFormats/Office/MsExcelDecoder.cs
  class MsExcelDecoder (line 17) | [Experimental("KMEXP00")]
    method MsExcelDecoder (line 23) | public MsExcelDecoder(MsExcelDecoderConfig? config = null, ILoggerFact...
    method SupportsMimeType (line 30) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 36) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 43) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 50) | public Task<FileContent> DecodeAsync(Stream data, CancellationToken ca...

FILE: App/kernel-memory/service/Core/DataFormats/Office/MsExcelDecoderConfig.cs
  class MsExcelDecoderConfig (line 8) | public class MsExcelDecoderConfig

FILE: App/kernel-memory/service/Core/DataFormats/Office/MsPowerPointDecoder.cs
  class MsPowerPointDecoder (line 19) | [Experimental("KMEXP00")]
    method MsPowerPointDecoder (line 25) | public MsPowerPointDecoder(MsPowerPointDecoderConfig? config = null, I...
    method SupportsMimeType (line 32) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 38) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 45) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 52) | public Task<FileContent> DecodeAsync(Stream data, CancellationToken ca...

FILE: App/kernel-memory/service/Core/DataFormats/Office/MsPowerPointDecoderConfig.cs
  class MsPowerPointDecoderConfig (line 5) | public class MsPowerPointDecoderConfig

FILE: App/kernel-memory/service/Core/DataFormats/Office/MsWordDecoder.cs
  class MsWordDecoder (line 18) | [Experimental("KMEXP00")]
    method MsWordDecoder (line 23) | public MsWordDecoder(ILoggerFactory? loggerFactory = null)
    method SupportsMimeType (line 29) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 35) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 42) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 49) | public Task<FileContent> DecodeAsync(Stream data, CancellationToken ca...

FILE: App/kernel-memory/service/Core/DataFormats/Pdf/PdfDecoder.cs
  class PdfDecoder (line 18) | [Experimental("KMEXP00")]
    method PdfDecoder (line 23) | public PdfDecoder(ILoggerFactory? loggerFactory = null)
    method SupportsMimeType (line 29) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 36) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 43) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 50) | public Task<FileContent> DecodeAsync(Stream data, CancellationToken ca...

FILE: App/kernel-memory/service/Core/DataFormats/Pdf/PdfMarkdownDecoder.cs
  class PdfMarkdownDecoder (line 21) | public sealed class PdfMarkdownDecoder(KernelMemoryConfig config, ILogge...
    method SupportsMimeType (line 28) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 33) | public async Task<FileContent> DecodeAsync(string filename, Cancellati...
    method DecodeAsync (line 39) | public async Task<FileContent> DecodeAsync(BinaryData data, Cancellati...
    method DecodeAsync (line 66) | public async Task<FileContent> DecodeAsync(Stream data, CancellationTo...

FILE: App/kernel-memory/service/Core/DataFormats/Text/MarkDownDecoder.cs
  class MarkDownDecoder (line 14) | [Experimental("KMEXP00")]
    method MarkDownDecoder (line 19) | public MarkDownDecoder(ILoggerFactory? loggerFactory = null)
    method SupportsMimeType (line 25) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 31) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 38) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 49) | public async Task<FileContent> DecodeAsync(Stream data, CancellationTo...

FILE: App/kernel-memory/service/Core/DataFormats/Text/TextChunker.cs
  class TextChunker (line 18) | [Experimental("KMEXP00")]
    method SplitPlainTextLines (line 39) | public static List<string> SplitPlainTextLines(
    method SplitMarkDownLines (line 56) | public static List<string> SplitMarkDownLines(
    method SplitPlainTextParagraphs (line 76) | public static List<string> SplitPlainTextParagraphs(
    method SplitMarkdownParagraphs (line 104) | public static List<string> SplitMarkdownParagraphs(
    method InternalSplitTextParagraphs (line 123) | private static List<string> InternalSplitTextParagraphs(
    method BuildParagraph (line 163) | private static List<string> BuildParagraph(
    method ProcessParagraphs (line 204) | private static List<string> ProcessParagraphs(
    method InternalSplitLines (line 274) | private static List<string> InternalSplitLines(
    method Split (line 300) | private static (List<string>, bool) Split(
    method Split (line 320) | private static (List<string>, bool) Split(
    method GetTokenCount (line 399) | private static int GetTokenCount(string input, TokenCounter? tokenCoun...

FILE: App/kernel-memory/service/Core/DataFormats/Text/TextDecoder.cs
  class TextDecoder (line 14) | [Experimental("KMEXP00")]
    method TextDecoder (line 19) | public TextDecoder(ILoggerFactory? loggerFactory = null)
    method SupportsMimeType (line 25) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 34) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 41) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 52) | public async Task<FileContent> DecodeAsync(Stream data, CancellationTo...

FILE: App/kernel-memory/service/Core/DataFormats/WebPages/HtmlDecoder.cs
  class HtmlDecoder (line 15) | [Experimental("KMEXP00")]
    method HtmlDecoder (line 20) | public HtmlDecoder(ILoggerFactory? loggerFactory = null)
    method SupportsMimeType (line 26) | public bool SupportsMimeType(string mimeType)
    method DecodeAsync (line 32) | public Task<FileContent> DecodeAsync(string filename, CancellationToke...
    method DecodeAsync (line 39) | public Task<FileContent> DecodeAsync(BinaryData data, CancellationToke...
    method DecodeAsync (line 46) | public Task<FileContent> DecodeAsync(Stream data, CancellationToken ca...

FILE: App/kernel-memory/service/Core/DataFormats/WebPages/WebScraper.cs
  class WebScraper (line 20) | [Experimental("KMEXP00")]
    method WebScraper (line 26) | public WebScraper(
    method GetContentAsync (line 37) | public async Task<WebScraperResult> GetContentAsync(string url, Cancel...
    method Dispose (line 42) | public void Dispose()
    method GetAsync (line 47) | private async Task<WebScraperResult> GetAsync(Uri url, CancellationTok...
    method FixContentType (line 85) | private static string FixContentType(string contentType, Uri url)
    method RetryLogic (line 111) | private static ResiliencePipeline<HttpResponseMessage> RetryLogic()

FILE: App/kernel-memory/service/Core/Diagnostics/LoggerExtensions.cs
  class LoggerExtensions (line 7) | public static class LoggerExtensions
    method GetLogLevelName (line 9) | public static string GetLogLevelName(this ILogger log)

FILE: App/kernel-memory/service/Core/Diagnostics/PipelineCompletedException.cs
  class PipelineCompletedException (line 7) | public class PipelineCompletedException : KernelMemoryException
    method PipelineCompletedException (line 12) | public PipelineCompletedException()
    method PipelineCompletedException (line 21) | public PipelineCompletedException(string? message)
    method PipelineCompletedException (line 31) | public PipelineCompletedException(string? message, Exception? innerExc...

FILE: App/kernel-memory/service/Core/Diagnostics/Verify.cs
  class Verify (line 7) | internal static class Verify
    method ValidateUrl (line 9) | public static void ValidateUrl(

FILE: App/kernel-memory/service/Core/DocumentStorage/DevTools/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithSimpleFileStorage (line 16) | public static IKernelMemoryBuilder WithSimpleFileStorage(this IKernelM...
    method WithSimpleFileStorage (line 22) | public static IKernelMemoryBuilder WithSimpleFileStorage(this IKernelM...
  class DependencyInjection (line 32) | public static partial class DependencyInjection
    method AddSimpleFileStorageAsDocumentStorage (line 34) | public static IServiceCollection AddSimpleFileStorageAsDocumentStorage...
    method AddSimpleFileStorageAsDocumentStorage (line 41) | public static IServiceCollection AddSimpleFileStorageAsDocumentStorage...

FILE: App/kernel-memory/service/Core/DocumentStorage/DevTools/SimpleFileStorage.cs
  class SimpleFileStorage (line 15) | [Experimental("KMEXP03")]
    method SimpleFileStorage (line 21) | public SimpleFileStorage(
    method CreateIndexDirectoryAsync (line 43) | public Task CreateIndexDirectoryAsync(string index, CancellationToken ...
    method DeleteIndexDirectoryAsync (line 49) | public Task DeleteIndexDirectoryAsync(string index, CancellationToken ...
    method CreateDocumentDirectoryAsync (line 55) | public Task CreateDocumentDirectoryAsync(
    method EmptyDocumentDirectoryAsync (line 64) | public async Task EmptyDocumentDirectoryAsync(
    method DeleteDocumentDirectoryAsync (line 80) | public Task DeleteDocumentDirectoryAsync(
    method WriteFileAsync (line 89) | public async Task WriteFileAsync(
    method ReadFileAsync (line 101) | public async Task<StreamableFileContent> ReadFileAsync(

FILE: App/kernel-memory/service/Core/DocumentStorage/DevTools/SimpleFileStorageConfig.cs
  class SimpleFileStorageConfig (line 7) | public class SimpleFileStorageConfig

FILE: App/kernel-memory/service/Core/Extensions/BinaryDataExtensions.cs
  class BinaryDataExtensions (line 8) | internal static class BinaryDataExtensions
    method CalculateSHA256 (line 10) | public static string CalculateSHA256(this BinaryData binaryData)

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/DiskFileSystem.cs
  class DiskFileSystem (line 21) | internal sealed class DiskFileSystem : IFileSystem
    method DiskFileSystem (line 30) | public DiskFileSystem(
    method CreateVolumeAsync (line 44) | public Task CreateVolumeAsync(string volume, CancellationToken cancell...
    method VolumeExistsAsync (line 55) | public Task<bool> VolumeExistsAsync(string volume, CancellationToken c...
    method DeleteVolumeAsync (line 63) | public async Task DeleteVolumeAsync(string volume, CancellationToken c...
    method ListVolumesAsync (line 88) | public Task<IEnumerable<string>> ListVolumesAsync(CancellationToken ca...
    method CreateDirectoryAsync (line 105) | public Task CreateDirectoryAsync(string volume, string relPath, Cancel...
    method DeleteDirectoryAsync (line 115) | public Task DeleteDirectoryAsync(string volume, string relPath, Cancel...
    method WriteFileAsync (line 133) | public async Task WriteFileAsync(string volume, string relPath, string...
    method WriteFileAsync (line 149) | public async Task WriteFileAsync(string volume, string relPath, string...
    method ReadFileAsBinaryAsync (line 164) | public async Task<BinaryData> ReadFileAsBinaryAsync(string volume, str...
    method ReadFileInfoAsync (line 189) | public Task<StreamableFileContent> ReadFileInfoAsync(string volume, st...
    method ReadFileAsTextAsync (line 218) | public async Task<string> ReadFileAsTextAsync(string volume, string re...
    method GetAllFileNamesAsync (line 225) | public Task<IEnumerable<string>> GetAllFileNamesAsync(string volume, s...
    method FileExistsAsync (line 254) | public Task<bool> FileExistsAsync(string volume, string relPath, strin...
    method DeleteFileAsync (line 263) | public Task DeleteFileAsync(string volume, string relPath, string file...
    method ReadAllFilesAsTextAsync (line 275) | public async Task<IDictionary<string, string>> ReadAllFilesAsTextAsync...
    method ValidateVolumeName (line 299) | private static string ValidateVolumeName(string volume)
    method ValidatePath (line 314) | private static string ValidatePath(string path)
    method ValidateFileName (line 330) | private static string ValidateFileName(string fileName)
    method CreateDirectory (line 351) | private void CreateDirectory(string path)

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/FileSystemTypes.cs
  type FileSystemTypes (line 8) | public enum FileSystemTypes

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/IFileSystem.cs
  type IFileSystem (line 11) | internal interface IFileSystem
    method CreateVolumeAsync (line 15) | Task CreateVolumeAsync(string volume, CancellationToken cancellationTo...
    method VolumeExistsAsync (line 16) | Task<bool> VolumeExistsAsync(string volume, CancellationToken cancella...
    method DeleteVolumeAsync (line 17) | Task DeleteVolumeAsync(string volume, CancellationToken cancellationTo...
    method ListVolumesAsync (line 18) | Task<IEnumerable<string>> ListVolumesAsync(CancellationToken cancellat...
    method CreateDirectoryAsync (line 24) | Task CreateDirectoryAsync(string volume, string relPath, CancellationT...
    method DeleteDirectoryAsync (line 25) | Task DeleteDirectoryAsync(string volume, string relPath, CancellationT...
    method WriteFileAsync (line 31) | Task WriteFileAsync(string volume, string relPath, string fileName, St...
    method WriteFileAsync (line 32) | Task WriteFileAsync(string volume, string relPath, string fileName, st...
    method FileExistsAsync (line 34) | Task<bool> FileExistsAsync(string volume, string relPath, string fileN...
    method ReadFileAsBinaryAsync (line 36) | Task<BinaryData> ReadFileAsBinaryAsync(string volume, string relPath, ...
    method ReadFileInfoAsync (line 37) | Task<StreamableFileContent> ReadFileInfoAsync(string volume, string re...
    method ReadFileAsTextAsync (line 38) | Task<string> ReadFileAsTextAsync(string volume, string relPath, string...
    method ReadAllFilesAsTextAsync (line 39) | Task<IDictionary<string, string>> ReadAllFilesAsTextAsync(string volum...
    method GetAllFileNamesAsync (line 40) | Task<IEnumerable<string>> GetAllFileNamesAsync(string volume, string r...
    method DeleteFileAsync (line 42) | Task DeleteFileAsync(string volume, string relPath, string fileName, C...

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/StreamExtensions.cs
  class StreamExtensions (line 7) | internal static class StreamExtensions
    method ReadAllBytes (line 9) | public static byte[] ReadAllBytes(this Stream stream)

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/StringExtensions.cs
  class StringExtensions (line 5) | public static class StringExtensions
    method RemoveBOM (line 7) | public static string RemoveBOM(this string x)

FILE: App/kernel-memory/service/Core/FileSystem/DevTools/VolatileFileSystem.cs
  class VolatileFileSystem (line 20) | internal sealed class VolatileFileSystem : IFileSystem
    method VolatileFileSystem (line 39) | internal VolatileFileSystem(IMimeTypeDetection? mimeTypeDetection = nu...
    method GetInstance (line 50) | public static VolatileFileSystem GetInstance(string directory, IMimeTy...
    method CreateVolumeAsync (line 67) | public Task CreateVolumeAsync(string volume, CancellationToken cancell...
    method VolumeExistsAsync (line 79) | public Task<bool> VolumeExistsAsync(string volume, CancellationToken c...
    method DeleteVolumeAsync (line 86) | public Task DeleteVolumeAsync(string volume, CancellationToken cancell...
    method ListVolumesAsync (line 94) | public Task<IEnumerable<string>> ListVolumesAsync(CancellationToken ca...
    method CreateDirectoryAsync (line 104) | public async Task CreateDirectoryAsync(string volume, string relPath, ...
    method DeleteDirectoryAsync (line 118) | public async Task DeleteDirectoryAsync(string volume, string relPath, ...
    method WriteFileAsync (line 141) | public async Task WriteFileAsync(string volume, string relPath, string...
    method WriteFileAsync (line 164) | public async Task WriteFileAsync(string volume, string relPath, string...
    method ReadFileAsTextAsync (line 182) | public async Task<string> ReadFileAsTextAsync(string volume, string re...
    method ReadFileAsBinaryAsync (line 189) | public Task<BinaryData> ReadFileAsBinaryAsync(string volume, string re...
    method ReadFileInfoAsync (line 219) | public Task<StreamableFileContent> ReadFileInfoAsync(string volume, st...
    method GetAllFileNamesAsync (line 255) | public Task<IEnumerable<string>> GetAllFileNamesAsync(string volume, s...
    method FileExistsAsync (line 281) | public Task<bool> FileExistsAsync(string volume, string relPath, strin...
    method DeleteFileAsync (line 299) | public Task DeleteFileAsync(string volume, string relPath, string file...
    method ReadAllFilesAsTextAsync (line 313) | public Task<IDictionary<string, string>> ReadAllFilesAsTextAsync(strin...
    method GetInternalState (line 339) | internal ConcurrentDictionary<string, ConcurrentDictionary<string, Bin...
    method ValidateVolumeExistsAsync (line 345) | private Task ValidateVolumeExistsAsync(string volume, CancellationToke...
    method ThrowVolumeNotFound (line 355) | private void ThrowVolumeNotFound(string volume)
    method ValidateVolumeName (line 361) | private static string ValidateVolumeName(string volume)
    method ValidatePath (line 376) | private static string ValidatePath(string path)
    method ValidateFileName (line 392) | private static string ValidateFileName(string fileName)
    method JoinPaths (line 413) | private static string JoinPaths(string a, string b)

FILE: App/kernel-memory/service/Core/Handlers/DeleteDocumentHandler.cs
  class DeleteDocumentHandler (line 14) | public sealed class DeleteDocumentHandler : IPipelineStepHandler
    method DeleteDocumentHandler (line 22) | public DeleteDocumentHandler(
    method InvokeAsync (line 37) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...

FILE: App/kernel-memory/service/Core/Handlers/DeleteGeneratedFilesHandler.cs
  class DeleteGeneratedFilesHandler (line 12) | public sealed class DeleteGeneratedFilesHandler : IPipelineStepHandler
    method DeleteGeneratedFilesHandler (line 19) | public DeleteGeneratedFilesHandler(
    method InvokeAsync (line 32) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...

FILE: App/kernel-memory/service/Core/Handlers/DeleteIndexHandler.cs
  class DeleteIndexHandler (line 14) | public sealed class DeleteIndexHandler : IPipelineStepHandler
    method DeleteIndexHandler (line 22) | public DeleteIndexHandler(
    method InvokeAsync (line 37) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...

FILE: App/kernel-memory/service/Core/Handlers/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 17) | public static partial class KernelMemoryBuilderExtensions
    method WithDefaultHandlersAsHostedServices (line 22) | public static IKernelMemoryBuilder WithDefaultHandlersAsHostedServices...
  class DependencyInjection (line 32) | public static partial class DependencyInjection
    method AddDefaultHandlers (line 38) | public static InProcessPipelineOrchestrator AddDefaultHandlers(this In...
    method AddDefaultHandlersAsHostedServices (line 61) | public static IServiceCollection AddDefaultHandlersAsHostedServices(th...
    method AddHandlerAsHostedService (line 86) | public static IServiceCollection AddHandlerAsHostedService<THandler>(
    method AddHandlerAsHostedService (line 104) | public static IServiceCollection AddHandlerAsHostedService(
    method AddHandlerAsHostedService (line 133) | public static IServiceCollection AddHandlerAsHostedService(
    method AddHandlerAsHostedService (line 151) | public static IServiceCollection AddHandlerAsHostedService(

FILE: App/kernel-memory/service/Core/Handlers/GenerateEmbeddingsHandler.cs
  class GenerateEmbeddingsHandler (line 18) | public sealed class GenerateEmbeddingsHandler : GenerateEmbeddingsHandle...
    method GenerateEmbeddingsHandler (line 34) | public GenerateEmbeddingsHandler(
    method InvokeAsync (line 61) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method GenerateEmbeddingsWithBatchingAsync (line 92) | private async Task GenerateEmbeddingsWithBatchingAsync(
    method GenerateEmbeddingsOneAtATimeAsync (line 121) | private async Task GenerateEmbeddingsOneAtATimeAsync(

FILE: App/kernel-memory/service/Core/Handlers/GenerateEmbeddingsHandlerBase.cs
  class GenerateEmbeddingsHandlerBase (line 15) | public abstract class GenerateEmbeddingsHandlerBase
    method GenerateEmbeddingsHandlerBase (line 22) | protected GenerateEmbeddingsHandlerBase(IPipelineOrchestrator orchestr...
    method GetListOfPartitionsToProcessAsync (line 28) | protected async Task<List<PartitionInfo>> GetListOfPartitionsToProcess...
    method SaveEmbeddingsToDocumentStorageAsync (line 79) | protected async Task SaveEmbeddingsToDocumentStorageAsync(
    method SaveEmbeddingToDocumentStorageAsync (line 102) | protected async Task SaveEmbeddingToDocumentStorageAsync(
    method GetSubStepName (line 137) | protected static string GetSubStepName(object generator)
    method GetSubStepName (line 142) | protected static string GetSubStepName(string providerName, string gen...
    method GetEmbeddingProviderName (line 147) | protected static string GetEmbeddingProviderName(object generator)
    method GetEmbeddingGeneratorName (line 153) | protected static string GetEmbeddingGeneratorName(object generator)
    class PartitionInfo (line 159) | protected class PartitionInfo(
    method TrackNewFileInPipelineStatus (line 172) | private void TrackNewFileInPipelineStatus(
    method GetEmbeddingFileName (line 201) | private static string GetEmbeddingFileName(string srcFilename, string ...

FILE: App/kernel-memory/service/Core/Handlers/GenerateEmbeddingsParallelHandler.cs
  class GenerateEmbeddingsParallelHandler (line 18) | public sealed class GenerateEmbeddingsParallelHandler : GenerateEmbeddin...
    method GenerateEmbeddingsParallelHandler (line 34) | public GenerateEmbeddingsParallelHandler(
    method InvokeAsync (line 61) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method GenerateEmbeddingsWithBatchingAsync (line 92) | private async Task GenerateEmbeddingsWithBatchingAsync(
    method GenerateEmbeddingsOneAtATimeAsync (line 121) | private async Task GenerateEmbeddingsOneAtATimeAsync(

FILE: App/kernel-memory/service/Core/Handlers/HandlerAsAHostedService.cs
  class HandlerAsAHostedService (line 18) | public sealed class HandlerAsAHostedService<T> : IHostedService where T ...
    method HandlerAsAHostedService (line 25) | public HandlerAsAHostedService(
    method StartAsync (line 39) | public Task StartAsync(CancellationToken cancellationToken = default)
    method StopAsync (line 45) | public Task StopAsync(CancellationToken cancellationToken = default)

FILE: App/kernel-memory/service/Core/Handlers/HandlerTypeLoader.cs
  class HandlerTypeLoader (line 13) | internal static class HandlerTypeLoader
    method TryGetHandlerType (line 15) | internal static bool TryGetHandlerType(HandlerConfig config, [NotNullW...

FILE: App/kernel-memory/service/Core/Handlers/KeywordExtractingHandler.cs
  class KeywordExtractingHandler (line 18) | public sealed class KeywordExtractingHandler : IPipelineStepHandler
    method KeywordExtractingHandler (line 26) | public KeywordExtractingHandler(
    method InvokeAsync (line 46) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...

FILE: App/kernel-memory/service/Core/Handlers/SaveRecordsHandler.cs
  class SaveRecordsHandler (line 18) | public sealed class SaveRecordsHandler : IPipelineStepHandler
    class FileDetailsWithRecordId (line 20) | private sealed class FileDetailsWithRecordId
      method FileDetailsWithRecordId (line 26) | public FileDetailsWithRecordId(DataPipeline pipeline, DataPipeline.G...
      method GetRecordId (line 32) | private static string GetRecordId(string documentId, string partId)
    method SaveRecordsHandler (line 66) | public SaveRecordsHandler(
    method InvokeAsync (line 106) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method GetListOfEmbeddingFiles (line 247) | private static IEnumerable<FileDetailsWithRecordId> GetListOfEmbedding...
    method GetListOfPartitionAndSyntheticFiles (line 254) | private static IEnumerable<FileDetailsWithRecordId> GetListOfPartition...
    method SaveRecordAsync (line 261) | private async Task SaveRecordAsync(DataPipeline pipeline, IMemoryDb db...
    method SaveRecordsBatchAsync (line 278) | private async Task SaveRecordsBatchAsync(DataPipeline pipeline, IMemor...
    method DeletePreviousRecordsAsync (line 297) | private async Task DeletePreviousRecordsAsync(DataPipeline pipeline, C...
    method CreateIndexOnceAsync (line 325) | private async Task CreateIndexOnceAsync(
    method GetSourceUrlAsync (line 343) | private async Task<string> GetSourceUrlAsync(
    method PrepareRecord (line 375) | private static MemoryRecord PrepareRecord(

FILE: App/kernel-memory/service/Core/Handlers/SummarizationHandler.cs
  class SummarizationHandler (line 19) | public sealed class SummarizationHandler : IPipelineStepHandler
    method SummarizationHandler (line 39) | public SummarizationHandler(
    method InvokeAsync (line 57) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method SummarizeAsync (line 131) | private async Task<(string summary, bool skip)> SummarizeAsync(string ...

FILE: App/kernel-memory/service/Core/Handlers/SummarizationParallelHandler.cs
  class SummarizationParallelHandler (line 18) | public sealed class SummarizationParallelHandler : IPipelineStepHandler
    method SummarizationParallelHandler (line 38) | public SummarizationParallelHandler(
    method InvokeAsync (line 56) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method SummarizeAsync (line 139) | private async Task<(string summary, bool skip)> SummarizeAsync(string ...

FILE: App/kernel-memory/service/Core/Handlers/TextExtractionHandler.cs
  class TextExtractionHandler (line 21) | public sealed class TextExtractionHandler : IPipelineStepHandler, IDispo...
    method TextExtractionHandler (line 40) | public TextExtractionHandler(
    method InvokeAsync (line 57) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method Dispose (line 141) | public void Dispose()
    method DownloadContentAsync (line 148) | private async Task<(DataPipeline.FileDetails downloadedPage, BinaryDat...
    method ExtractTextAsync (line 185) | private async Task<(string text, FileContent content, bool skipFile)> ...

FILE: App/kernel-memory/service/Core/Handlers/TextPartitioningHandler.cs
  class TextPartitioningHandler (line 18) | public sealed class TextPartitioningHandler : IPipelineStepHandler
    method TextPartitioningHandler (line 37) | public TextPartitioningHandler(
    method InvokeAsync (line 70) | public async Task<(bool success, DataPipeline updatedPipeline)> Invoke...
    method ParagraphsTooBigForEmbeddingsException (line 204) | private static ConfigurationException ParagraphsTooBigForEmbeddingsExc...

FILE: App/kernel-memory/service/Core/KernelMemoryBuilder.cs
  class KernelMemoryBuilder (line 23) | public sealed class KernelMemoryBuilder : IKernelMemoryBuilder
    type ClientTypes (line 25) | private enum ClientTypes
    method KernelMemoryBuilder (line 75) | public KernelMemoryBuilder(IServiceCollection? hostServiceCollection =...
    method Build (line 119) | public IKernelMemory Build()
    method Build (line 141) | public T Build<T>() where T : class, IKernelMemory
    method AddSingleton (line 169) | public IKernelMemoryBuilder AddSingleton<TService>(TService implementa...
    method AddSingleton (line 177) | public IKernelMemoryBuilder AddSingleton<TService, TImplementation>()
    method WithoutDefaultHandlers (line 186) | public IKernelMemoryBuilder WithoutDefaultHandlers()
    method AddIngestionMemoryDb (line 193) | public IKernelMemoryBuilder AddIngestionMemoryDb(IMemoryDb service)
    method AddIngestionEmbeddingGenerator (line 200) | public IKernelMemoryBuilder AddIngestionEmbeddingGenerator(ITextEmbedd...
    method GetOrchestrator (line 207) | public IPipelineOrchestrator GetOrchestrator()
    method CopyServiceCollection (line 215) | private static void CopyServiceCollection(
    method BuildServerlessClient (line 229) | private MemoryServerless BuildServerlessClient()
    method BuildAsyncClient (line 260) | private MemoryService BuildAsyncClient()
    method CompleteServerlessClient (line 288) | private KernelMemoryBuilder CompleteServerlessClient(ServiceProvider s...
    method CompleteAsyncClient (line 296) | private KernelMemoryBuilder CompleteAsyncClient(ServiceProvider servic...
    method CheckForMissingDependencies (line 304) | private void CheckForMissingDependencies()
    method RequireEmbeddingGenerator (line 311) | private void RequireEmbeddingGenerator()
    method RequireOneMemoryDbForIngestion (line 319) | private void RequireOneMemoryDbForIngestion()
    method RequireOneMemoryDbForRetrieval (line 327) | private void RequireOneMemoryDbForRetrieval()
    method UseDefaultSearchClientIfNecessary (line 335) | private void UseDefaultSearchClientIfNecessary(ServiceProvider service...
    method ReuseRetrievalEmbeddingGeneratorIfNecessary (line 343) | private void ReuseRetrievalEmbeddingGeneratorIfNecessary(IServiceProvi...
    method ReuseRetrievalMemoryDbIfNecessary (line 352) | private void ReuseRetrievalMemoryDbIfNecessary(IServiceProvider servic...
    method IsEmbeddingGeneratorEnabled (line 361) | private bool IsEmbeddingGeneratorEnabled()
    method GetBuildType (line 366) | private ClientTypes GetBuildType()
    method ShowException (line 397) | private static void ShowException(Exception e)

FILE: App/kernel-memory/service/Core/KernelMemoryBuilderExtensions.cs
  class KernelMemoryBuilderExtensions (line 11) | public static partial class KernelMemoryBuilderExtensions
    method WithDefaultMimeTypeDetection (line 13) | public static IKernelMemoryBuilder WithDefaultMimeTypeDetection(
    method WithDefaultPromptProvider (line 20) | public static IKernelMemoryBuilder WithDefaultPromptProvider(

FILE: App/kernel-memory/service/Core/MemoryServerless.cs
  class MemoryServerless (line 25) | public sealed class MemoryServerless : IKernelMemory
    method MemoryServerless (line 41) | public MemoryServerless(
    method ImportDocumentAsync (line 55) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 67) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 82) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 92) | public Task<string> ImportDocumentAsync(
    method ImportTextAsync (line 108) | public async Task<string> ImportTextAsync(
    method ImportWebPageAsync (line 133) | public async Task<string> ImportWebPageAsync(
    method ListIndexesAsync (line 162) | public async Task<IEnumerable<IndexDetails>> ListIndexesAsync(Cancella...
    method DeleteIndexAsync (line 169) | public Task DeleteIndexAsync(string? index = null, CancellationToken c...
    method DeleteDocumentAsync (line 176) | public Task DeleteDocumentAsync(string documentId, string? index = nul...
    method IsDocumentReadyAsync (line 183) | public async Task<bool> IsDocumentReadyAsync(
    method GetDocumentStatusAsync (line 193) | public async Task<DataPipelineStatus?> GetDocumentStatusAsync(
    method ExportFileAsync (line 211) | public Task<StreamableFileContent> ExportFileAsync(
    method SearchAsync (line 226) | public Task<SearchResult> SearchAsync(
    method AskAsync (line 255) | public Task<MemoryAnswer> AskAsync(

FILE: App/kernel-memory/service/Core/MemoryService.cs
  class MemoryService (line 19) | public sealed class MemoryService : IKernelMemory
    method MemoryService (line 25) | public MemoryService(
    method ImportDocumentAsync (line 39) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 51) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 66) | public Task<string> ImportDocumentAsync(
    method ImportDocumentAsync (line 76) | public Task<string> ImportDocumentAsync(
    method ImportTextAsync (line 92) | public async Task<string> ImportTextAsync(
    method ImportWebPageAsync (line 117) | public async Task<string> ImportWebPageAsync(
    method ListIndexesAsync (line 146) | public async Task<IEnumerable<IndexDetails>> ListIndexesAsync(Cancella...
    method DeleteIndexAsync (line 153) | public Task DeleteIndexAsync(string? index = null, CancellationToken c...
    method DeleteDocumentAsync (line 160) | public Task DeleteDocumentAsync(string documentId, string? index = nul...
    method IsDocumentReadyAsync (line 167) | public Task<bool> IsDocumentReadyAsync(
    method GetDocumentStatusAsync (line 177) | public Task<DataPipelineStatus?> GetDocumentStatusAsync(
    method ExportFileAsync (line 187) | public Task<StreamableFileContent> ExportFileAsync(
    method SearchAsync (line 202) | public Task<SearchResult> SearchAsync(
    method AskAsync (line 231) | public Task<MemoryAnswer> AskAsync(

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/DependencyInjection.cs
  class KernelMemoryBuilderExtensions (line 14) | public static partial class KernelMemoryBuilderExtensions
    method WithSimpleVectorDb (line 16) | public static IKernelMemoryBuilder WithSimpleVectorDb(this IKernelMemo...
    method WithSimpleVectorDb (line 22) | public static IKernelMemoryBuilder WithSimpleVectorDb(this IKernelMemo...
    method WithSimpleTextDb (line 28) | public static IKernelMemoryBuilder WithSimpleTextDb(this IKernelMemory...
    method WithSimpleTextDb (line 34) | public static IKernelMemoryBuilder WithSimpleTextDb(this IKernelMemory...
  class DependencyInjection (line 44) | public static partial class DependencyInjection
    method AddSimpleVectorDbAsMemoryDb (line 46) | public static IServiceCollection AddSimpleVectorDbAsMemoryDb(this ISer...
    method AddSimpleVectorDbAsMemoryDb (line 53) | public static IServiceCollection AddSimpleVectorDbAsMemoryDb(this ISer...
    method AddSimpleTextDbAsMemoryDb (line 59) | public static IServiceCollection AddSimpleTextDbAsMemoryDb(this IServi...
    method AddSimpleTextDbAsMemoryDb (line 66) | public static IServiceCollection AddSimpleTextDbAsMemoryDb(this IServi...

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/SimpleTextDb.cs
  class SimpleTextDb (line 24) | [Experimental("KMEXP03")]
    method SimpleTextDb (line 30) | public SimpleTextDb(
    method CreateIndexAsync (line 51) | public Task CreateIndexAsync(string index, int vectorSize, Cancellatio...
    method GetIndexesAsync (line 58) | public Task<IEnumerable<string>> GetIndexesAsync(CancellationToken can...
    method DeleteIndexAsync (line 64) | public Task DeleteIndexAsync(string index, CancellationToken cancellat...
    method UpsertAsync (line 71) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method GetSimilarListAsync (line 79) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 137) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 177) | public Task DeleteAsync(string index, MemoryRecord record, Cancellatio...
    method NormalizeIndexName (line 189) | private static string NormalizeIndexName(string index)
    method TagsMatchFilters (line 197) | private static bool TagsMatchFilters(TagCollection tags, ICollection<M...
    method EncodeId (line 222) | private static string EncodeId(string realId)
    method DecodeId (line 228) | private static string DecodeId(string encodedId)

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/SimpleTextDbConfig.cs
  class SimpleTextDbConfig (line 7) | public class SimpleTextDbConfig

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/SimpleVectorDb.cs
  class SimpleVectorDb (line 25) | [Experimental("KMEXP03")]
    method SimpleVectorDb (line 38) | public SimpleVectorDb(
    method CreateIndexAsync (line 67) | public Task CreateIndexAsync(string index, int vectorSize, Cancellatio...
    method GetIndexesAsync (line 74) | public Task<IEnumerable<string>> GetIndexesAsync(CancellationToken can...
    method DeleteIndexAsync (line 80) | public Task DeleteIndexAsync(string index, CancellationToken cancellat...
    method UpsertAsync (line 87) | public async Task<string> UpsertAsync(string index, MemoryRecord recor...
    method GetSimilarListAsync (line 96) | public async IAsyncEnumerable<(MemoryRecord, double)> GetSimilarListAs...
    method GetListAsync (line 145) | public async IAsyncEnumerable<MemoryRecord> GetListAsync(
    method DeleteAsync (line 185) | public Task DeleteAsync(string index, MemoryRecord record, Cancellatio...
    method NormalizeIndexName (line 197) | private static string NormalizeIndexName(string index)
    method TagsMatchFilters (line 205) | private static bool TagsMatchFilters(TagCollection tags, ICollection<M...
    method EncodeId (line 230) | private static string EncodeId(string realId)
    method DecodeId (line 236) | private static string DecodeId(string encodedId)

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/SimpleVectorDbConfig.cs
  class SimpleVectorDbConfig (line 7) | public class SimpleVectorDbConfig

FILE: App/kernel-memory/service/Core/MemoryStorage/DevTools/SimpleVectorDbException.cs
  class SimpleVectorDbException (line 7) | pub
Condensed preview — 682 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,008K chars).
[
  {
    "path": ".github/CODEOWNERS",
    "chars": 308,
    "preview": "# Lines starting with '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n\n# These owners wi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 787,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n# Describe the "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 716,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n# Mo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/subtask.md",
    "chars": 294,
    "preview": "---\nname: Sub task\nabout: A sub task\ntitle: ''\nlabels: subtask\nassignees: ''\n\n---\n\nRequired by <link to parent issue>\n\n#"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1575,
    "preview": "## Purpose\n<!-- Describe the intention of the changes being proposed. What problem does it solve or functionality does i"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 2260,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/CI.yml",
    "chars": 19942,
    "preview": "name: Deploy-Test-Cleanup Pipeline\non:\n  push:\n    branches:\n      - main # Adjust this to the branch you want to trigge"
  },
  {
    "path": ".github/workflows/Create-Release.yml",
    "chars": 2266,
    "preview": "on:\n    push:\n     branches:\n       - main\n\npermissions:\n  contents: write\n  pull-requests: write\n\nname: Create-Release\n"
  },
  {
    "path": ".github/workflows/azd-template-validation.yml",
    "chars": 1457,
    "preview": "name: AZD Template Validation\non:\n  schedule:\n    - cron: '30 1 * * 4' # Every Thursday at 7:00 AM IST (1:30 AM UTC)\n  w"
  },
  {
    "path": ".github/workflows/azure-dev.yml",
    "chars": 1765,
    "preview": "name: Azure Dev Deploy\n\non:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  id-token: write\n\njobs:\n  deploy:\n    r"
  },
  {
    "path": ".github/workflows/broken-links-checker.yml",
    "chars": 1705,
    "preview": "name: Broken Link Checker\n\non:\n  pull_request:\n    paths:\n      - '**/*.md'\n  workflow_dispatch:\n\npermissions:\n  content"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1601,
    "preview": "name: \"CodeQL Advanced\"\n\non:\n  push:\n    branches: [ \"main\", \"dev\", \"demo\" ]\n    paths:\n      - 'App/backend-api/**'\n   "
  },
  {
    "path": ".github/workflows/deploy-orchestrator.yml",
    "chars": 4623,
    "preview": "name: Deployment orchestrator\n\non:\n  workflow_call:\n    inputs:\n      azure_location:\n        description: 'Azure Locati"
  },
  {
    "path": ".github/workflows/deploy-v2.yml",
    "chars": 10608,
    "preview": "name: Deploy-Test-Cleanup (v2)\non:\n  push:\n    branches:\n      - main # Adjust this to the branch you want to trigger th"
  },
  {
    "path": ".github/workflows/job-cleanup-deployment.yml",
    "chars": 9024,
    "preview": "name: Cleanup Deployment Job\non:\n  workflow_call:\n    inputs:\n      trigger_type:\n        description: 'Trigger type (wo"
  },
  {
    "path": ".github/workflows/job-deploy-linux.yml",
    "chars": 20838,
    "preview": "name: Deploy Steps\n\non:\n  workflow_call:\n    inputs:\n      ENV_NAME:\n        required: true\n        type: string\n      A"
  },
  {
    "path": ".github/workflows/job-deploy.yml",
    "chars": 20923,
    "preview": "name: Deploy Job \n\non:\n  workflow_call:\n    inputs:\n      trigger_type:\n        description: 'Trigger type (workflow_dis"
  },
  {
    "path": ".github/workflows/job-send-notification.yml",
    "chars": 17846,
    "preview": "name: Send Notification Job\n\non:\n  workflow_call:\n    inputs:\n      trigger_type:\n        description: 'Trigger type (wo"
  },
  {
    "path": ".github/workflows/pr-title-checker.yml",
    "chars": 414,
    "preview": "name: \"PR Title Checker\"\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n  merg"
  },
  {
    "path": ".github/workflows/scheduled-Dependabot-PRs-Auto-Merge.yml",
    "chars": 6292,
    "preview": "# ------------------------------------------------------------------------------\n# Scheduled Dependabot PRs Auto-Merge W"
  },
  {
    "path": ".github/workflows/stale-bot.yml",
    "chars": 4552,
    "preview": "name: \"Manage Stale Issues, PRs & Unmerged Branches\"\non:\n  schedule:\n    - cron: '30 1 * * *'  # Runs daily at 1:30 AM U"
  },
  {
    "path": ".github/workflows/test-automation-v2.yml",
    "chars": 7571,
    "preview": "name: Test Automation Dkm-v2\n\non:\n    workflow_call:\n        inputs:\n          TEST_URL:\n            required: true\n    "
  },
  {
    "path": ".github/workflows/test-automation.yml",
    "chars": 4155,
    "preview": "name: Test Automation DKM\n\non:\n  workflow_call:\n    inputs:\n      DKM_URL:\n        required: true\n        type: string\n "
  },
  {
    "path": ".github/workflows/validate-bicep-params.yml",
    "chars": 3570,
    "preview": "name: Validate Bicep Parameters\n\npermissions:\n  contents: read\n\non:\n  schedule:\n    - cron: '30 6 * * 3' # Wednesday 12:"
  },
  {
    "path": ".gitignore",
    "chars": 7946,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "App/backend-api/.dockerignore",
    "chars": 393,
    "preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
  },
  {
    "path": "App/backend-api/.gitignore",
    "chars": 8148,
    "preview": "KernelMemoryDev.*\n\ndotnet/.config\ntmp/\n_tmp/\ntmp-*/\nout/\n_files/\n_vectors/\n_queues/\n_textdb/\n.chromaenv\n.chromadb\n*.patc"
  },
  {
    "path": "App/backend-api/Dockerfile",
    "chars": 1543,
    "preview": "# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this D"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/API/ChatHost/ChatHost.cs",
    "chars": 13237,
    "preview": "using Microsoft.GS.DPS.Model.ChatHost;\nusing Microsoft.GS.DPS.Storage.ChatSessions.Entities;\nusing Microsoft.GS.DPS.St"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/API/KernelMemory/KernelMemory.cs",
    "chars": 9511,
    "preview": "using DnsClient.Internal;\nusing Microsoft.GS.DPS.Images;\nusing Microsoft.GS.DPS.Model.KernelMemory;\nusing Microsoft.GS."
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/API/UserInterface/DataCacheManager.cs",
    "chars": 2941,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing System.Timers"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/API/UserInterface/Documents.cs",
    "chars": 11837,
    "preview": "using Microsoft.GS.DPS.Storage.Document;\r\nusing Entities = Microsoft.GS.DPS.Storage.Document.Entities;\r\nusing Microsoft"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Images/FileThumbnailService.cs",
    "chars": 2874,
    "preview": "using Microsoft.KernelMemory.Pipeline;\nusing System;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.N"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Microsoft.GS.DPS.csproj",
    "chars": 1568,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <ImplicitUsings>e"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/ChatHost/Answer.cs",
    "chars": 341,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/ChatHost/ChatRequest.cs",
    "chars": 788,
    "preview": "using FluentValidation;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Sys"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/ChatHost/ChatResponse.cs",
    "chars": 848,
    "preview": "using Microsoft.SemanticKernel;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nu"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/AskParameter.cs",
    "chars": 755,
    "preview": "using Microsoft.KernelMemory;\nusing Microsoft.KernelMemory.Context;\n\nnamespace Microsoft.GS.DPS.Model.KernelMemory\n{\n  "
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentDeletedResult.cs",
    "chars": 146,
    "preview": "namespace Microsoft.GS.DPS.Model.KernelMemory\n{\n    public class DocumentDeletedResult\n    {\n        public bool IsDele"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentImportedResult.cs",
    "chars": 454,
    "preview": "namespace Microsoft.GS.DPS.Model.KernelMemory\n{\n    public class DocumentImportedResult\n    {\n        public string Doc"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/DocumentReadyStatusResult.cs",
    "chars": 148,
    "preview": "namespace Microsoft.GS.DPS.Model.KernelMemory\n{\n    public class DocumentReadyStatusResult\n    {\n        public bool Is"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/KernelMemory/SearchParameter.cs",
    "chars": 707,
    "preview": "using Microsoft.KernelMemory.Context;\nusing Microsoft.KernelMemory;\n\nnamespace Microsoft.GS.DPS.Model.KernelMemory\n{\n  "
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/UserInterface/DocumentQuerySet.cs",
    "chars": 556,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/UserInterface/Paging.cs",
    "chars": 1123,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json.Serializat"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Model/UserInterface/PagingRequestWithSearch.cs",
    "chars": 1548,
    "preview": "using FluentValidation;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Sys"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Prompts/Chat_SystemPrompt.txt",
    "chars": 4312,
    "preview": "[ROLE]\nYour role is to provide knowledgeable and helpful responses to user questions. \nYou should not deviate from this"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Prompts/KeywordExtract_SystemPrompt.txt",
    "chars": 607,
    "preview": "You are an assistant to analyze Content and Extract Tags by Content.\n[EXTRACT TAGS RULES]\nIT SHOULD BE A LIST OF DICTIO"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/AISearch/TagUpdater.cs",
    "chars": 2145,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Azure;\nusing Azu"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/ChatSessions/ChatSessionRepository.cs",
    "chars": 2853,
    "preview": "using Microsoft.GS.DPS.Storage.Components;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.ChatCompletio"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/ChatSessions/Entities/ChatSession.cs",
    "chars": 408,
    "preview": "using Microsoft.GS.DPS.Storage.Components;\nusing Microsoft.SemanticKernel.ChatCompletion;\n\nnamespace Microsoft.GS.DPS.S"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/BusinessTransactionRepository.cs",
    "chars": 4790,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing MongoDB.Bson.Serialization;\n"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/CosmosDBEntityBase.cs",
    "chars": 1815,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/GenericSpecification.cs",
    "chars": 1018,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/IDataRepositoryProvider.cs",
    "chars": 660,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/IEntityModel.cs",
    "chars": 582,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/IRepository.cs",
    "chars": 1100,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/ISpecification.cs",
    "chars": 521,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Sy"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Components/MongoEntityCollectionBase.cs",
    "chars": 1921,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Documents/DocumentRepository.cs",
    "chars": 9348,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.GS.DPS.Storage.Com"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Documents/Entities/Document.cs",
    "chars": 750,
    "preview": "// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collect"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/Documents/QueryResultSet.cs",
    "chars": 413,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS/Storage/KeywordsSerializer.cs",
    "chars": 2762,
    "preview": "using MongoDB.Bson.Serialization.Serializers;\nusing MongoDB.Bson.Serialization;\nusing MongoDB.Bson;\nusing System;\nusing"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/API/ChatHost/Chat.cs",
    "chars": 19648,
    "preview": "using Microsoft.GS.DPS.Model.ChatHost;\nusing Microsoft.GS.DPS.API;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspN"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/API/KernelMemory/KernelMemory.cs",
    "chars": 26864,
    "preview": "using Microsoft.GS.DPSHost.AppConfiguration;\nusing Microsoft.Extensions.Options;\nusing Microsoft.KernelMemory;\nusing Mi"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/API/Operation/Operation.cs",
    "chars": 361,
    "preview": "using System.Diagnostics;\n\nnamespace Microsoft.GS.DPSHost.API \n{ \n    public class Operation\n    {\n        public stati"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/API/UserInterface/UserInterface.cs",
    "chars": 6377,
    "preview": "using Amazon.Runtime.Internal.Transform;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.GS.DPS.API.UserInterface;\nusin"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/AIServices.cs",
    "chars": 574,
    "preview": "using System.Text.Json.Serialization;\n\nnamespace Microsoft.GS.DPSHost.AppConfiguration\n{\n    public class AIServices\n  "
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/AppConfiguration.cs",
    "chars": 1237,
    "preview": "using Azure.Identity;\nusing Microsoft.Extensions.Azure;\nusing Microsoft.GS.DPSHost.AppConfiguration;\nusing Microsoft.GS"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/AppConfiguration/Services.cs",
    "chars": 1965,
    "preview": "namespace Microsoft.GS.DPSHost.AppConfiguration\n{\n    public class Services\n    {\n        public CognitiveServiceConfig"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/DependencyConfiguration/ServiceDependencies.cs",
    "chars": 4010,
    "preview": "using Microsoft.GS.DPSHost.API;\nusing Microsoft.KernelMemory;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticK"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/Helpers/AzureCredentialHelper.cs",
    "chars": 1199,
    "preview": "using System;\r\nusing System.Threading.Tasks;\r\nusing Azure.Core;\r\nusing Azure.Identity;\r\n\r\nnamespace Microsoft.GS.DPSHost"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/Helpers/TelemetryHelper.cs",
    "chars": 6047,
    "preview": "using Microsoft.ApplicationInsights;\nusing Microsoft.ApplicationInsights.DataContracts;\nusing System.Diagnostics;\n\nnames"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/Microsoft.GS.DPS.Host.csproj",
    "chars": 1859,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <Nullable>ena"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/Program.cs",
    "chars": 3030,
    "preview": "using Microsoft.GS.DPSHost.AppConfiguration;\nusing Microsoft.GS.DPSHost.ServiceConfiguration;\nusing Microsoft.GS.DPSHost"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/appsettings.json",
    "chars": 1142,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\",\n      \"Azure"
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.Host/dpspilot-host.http",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "App/backend-api/Microsoft.GS.DPS.sln",
    "chars": 1639,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.12.352"
  },
  {
    "path": "App/backend-api/RAI/prompt_chat.txt",
    "chars": 3857,
    "preview": "[ROLE]\nYour role is to provide knowledgeable and helpful responses to user questions. \nYou should not deviate from this "
  },
  {
    "path": "App/backend-api/RAI/prompt_extract_information.txt",
    "chars": 502,
    "preview": "You are an assistant to analyze Content and Extract Tags by Content.\n[EXTRACT TAGS RULES]\nIT SHOULD BE A LIST OF DICTION"
  },
  {
    "path": "App/backend-api/RAI/prompt_get_context_image.txt",
    "chars": 231,
    "preview": "Analyze Image and show your detail investigation result less than 4000 tokens.\nDon't say 'The image depicts a ...' or 'T"
  },
  {
    "path": "App/backend-api/documents/.$Architecture.drawio.bkp",
    "chars": 876700,
    "preview": "<mxfile host=\"Electron\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/"
  },
  {
    "path": "App/backend-api/documents/Architecture.drawio",
    "chars": 1129747,
    "preview": "<mxfile host=\"Electron\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/"
  },
  {
    "path": "App/backend-api/documents/DPS - Environment.postman_environment.json",
    "chars": 473,
    "preview": "{\n\t\"id\": \"5e684f46-604e-45f8-ba2f-f1ef490944cb\",\n\t\"name\": \"DPS - Environment\",\n\t\"values\": [\n\t\t{\n\t\t\t\"key\": \"km-local\",\n\t\t"
  },
  {
    "path": "App/backend-api/documents/DPS.postman_collection.json",
    "chars": 5169,
    "preview": "{\n\t\"info\": {\n\t\t\"_postman_id\": \"7c4cb09e-5449-4890-aba3-043382ffead6\",\n\t\t\"name\": \"DPS\",\n\t\t\"schema\": \"https://schema.getpo"
  },
  {
    "path": "App/backend-api/pipelines/dspapi_build.yaml",
    "chars": 1061,
    "preview": "trigger:\n- main\n\npool:\n  vmImage: 'ubuntu-latest'\n\nvariables:\n  imageName: 'acrdps.azurecr.io/dps/dpsapi'\n\nstages:\n- sta"
  },
  {
    "path": "App/frontend-app/.dockerignore",
    "chars": 13,
    "preview": "node_modules\n"
  },
  {
    "path": "App/frontend-app/.eslintignore",
    "chars": 56,
    "preview": "node_modules/\ndist/\n.prettierrc.js\n.eslintrc.js\nenv.d.ts"
  },
  {
    "path": "App/frontend-app/.eslintrc.cjs",
    "chars": 2021,
    "preview": "module.exports = {\n    extends: [\n        // By extending from a plugin config, we can get recommended rules without hav"
  },
  {
    "path": "App/frontend-app/.gitignore",
    "chars": 293,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
  },
  {
    "path": "App/frontend-app/.prettierignore",
    "chars": 36,
    "preview": "node_modules/\ndist/\n.prettierrc.json"
  },
  {
    "path": "App/frontend-app/.prettierrc.json",
    "chars": 222,
    "preview": "{\n    \"tabWidth\": 4,\n    \"singleQuote\": false,\n    \"jsxSingleQuote\": false,\n    \"useTabs\": false,\n    \"printWidth\": 120,"
  },
  {
    "path": "App/frontend-app/Dockerfile",
    "chars": 458,
    "preview": "# Use the official Node.js image from the Docker Hub\nFROM node:20\n\n# Set the working directory inside the container\nWORK"
  },
  {
    "path": "App/frontend-app/README.md",
    "chars": 947,
    "preview": "# Setup local environment\n\nInstall:\n\n- Node 18\n- Yarn\n- Volta (optional) - https://volta.sh/\n\n### Add your PAT into %USE"
  },
  {
    "path": "App/frontend-app/index.html",
    "chars": 612,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
  },
  {
    "path": "App/frontend-app/jest-setup.ts",
    "chars": 36,
    "preview": "import \"@testing-library/jest-dom\";\n"
  },
  {
    "path": "App/frontend-app/jest.config.ts",
    "chars": 1150,
    "preview": "/** @type {import('ts-jest').JestConfigWithTsJest} */\nmodule.exports = {\n    preset: \"ts-jest\",\n    testEnvironment: \"js"
  },
  {
    "path": "App/frontend-app/package.json",
    "chars": 3525,
    "preview": "{\n    \"name\": \"km-app\",\n    \"private\": true,\n    \"version\": \"1.0.0\",\n    \"type\": \"module\",\n    \"scripts\": {\n        \"dev"
  },
  {
    "path": "App/frontend-app/postcss.config.js",
    "chars": 201,
    "preview": "import tailwind from \"tailwindcss\";\nimport autoprefixer from \"autoprefixer\";\nimport tailwindConfig from \"./tailwind.conf"
  },
  {
    "path": "App/frontend-app/public/config.env.js",
    "chars": 697,
    "preview": "window.ENV = {\n    ENVIRONMENT: \"__environment__\",\n    API_URL: \"__api_url__\",\n    APP_INSIGHTS_CS: \"__app_insights_cs__"
  },
  {
    "path": "App/frontend-app/public/config.js",
    "chars": 1086,
    "preview": "window.ENV = {\n    ENVIRONMENT: \"local\",\n    API_URL: \"\",\n    APP_INSIGHTS_CS: \"InstrumentationKey=?;IngestionEndpoint=?"
  },
  {
    "path": "App/frontend-app/public/locales/en/translation.json",
    "chars": 7028,
    "preview": "{\n    \"common\": {\n        \"title\": \"Document Search and Knowledge Mining\",\n        \"loading\": \"Loading...\",\n        \"add"
  },
  {
    "path": "App/frontend-app/public/staticwebapp.config.json",
    "chars": 804,
    "preview": "{\n    \"navigationFallback\": {\n        \"rewrite\": \"/\"\n    },\n    \"globalHeaders\": {\n        \"strict-transport-security\": "
  },
  {
    "path": "App/frontend-app/public/web.config",
    "chars": 673,
    "preview": "<?xml version=\"1.0\"?>\n<configuration>\n\t<system.webServer>\n\t\t<rewrite>\n\t\t\t<rules>\n\t\t\t\t<rule name=\"React Routes\" stopProce"
  },
  {
    "path": "App/frontend-app/src/@types/react-tiff.d.tsx",
    "chars": 285,
    "preview": "declare module \"react-tiff\" {\n    import * as React from \"react\";\n\n    interface TiffProps {\n        // Define the props"
  },
  {
    "path": "App/frontend-app/src/App.tsx",
    "chars": 2052,
    "preview": "import React, { Suspense } from \"react\";\nimport { BrowserRouter } from \"react-router-dom\";\nimport { Layout } from \"./com"
  },
  {
    "path": "App/frontend-app/src/AppContext.tsx",
    "chars": 1517,
    "preview": "import { ReactNode, createContext, useState } from 'react';\nimport { ChatApiResponse } from './api/apiTypes/chatTypes';\n"
  },
  {
    "path": "App/frontend-app/src/AppRoutes.tsx",
    "chars": 2190,
    "preview": "import { Routes, Route } from \"react-router-dom\";\nimport { Home } from \"./pages/home/home\";\nimport { ChatPage } from \"./"
  },
  {
    "path": "App/frontend-app/src/api/apiTypes/chatTypes.ts",
    "chars": 1064,
    "preview": "export interface ChatOptions {\n    model?: string;\n    source?: string;\n    temperature?: number;\n    maxTokens?: number"
  },
  {
    "path": "App/frontend-app/src/api/apiTypes/coverImage.ts",
    "chars": 45,
    "preview": "interface CoverImage {\n    base64: string;\n}\n"
  },
  {
    "path": "App/frontend-app/src/api/apiTypes/documentResults.ts",
    "chars": 4033,
    "preview": "\nexport interface DocumentResults {\n    documents: Document[]\n    currentPage: number\n    keywordFilterInfo: {[key:strin"
  },
  {
    "path": "App/frontend-app/src/api/apiTypes/embedded.ts",
    "chars": 4655,
    "preview": "import { SlotRenderFunction } from \"@fluentui/react-components\"\nimport { DetailedHTMLProps, HTMLAttributes, JSXElementCo"
  },
  {
    "path": "App/frontend-app/src/api/apiTypes/singleDocument.ts",
    "chars": 2264,
    "preview": "export interface SingleDocument {\n    indexName: any\n    result: Result\n    results: any\n    count: any\n    tokens: Toke"
  },
  {
    "path": "App/frontend-app/src/api/chatService.ts",
    "chars": 1286,
    "preview": "import { ChatApiResponse, ChatRequest, FeedbackRequest } from \"./apiTypes/chatTypes\";\nimport { httpClient } from \"../uti"
  },
  {
    "path": "App/frontend-app/src/api/documentsService.ts",
    "chars": 5102,
    "preview": "import { SearchRequest } from \"../types/searchRequest\";\nimport { httpClient } from \"../utils/httpClient/httpClient\";\nimp"
  },
  {
    "path": "App/frontend-app/src/api/storageService.ts",
    "chars": 1563,
    "preview": "import { fetchRaw, httpClient } from \"../utils/httpClient/httpClient\";\n\n\nexport async function UploadFile(formData: Form"
  },
  {
    "path": "App/frontend-app/src/assets/icons/azureIcon.tsx",
    "chars": 922,
    "preview": "import React from \"react\";\n\nexport function AzureIcon({ className }: { className?: string }): React.JSX.Element {\n    re"
  },
  {
    "path": "App/frontend-app/src/assets/icons/gitHubLogoIcon.tsx",
    "chars": 1627,
    "preview": "import React from \"react\";\n\nexport function GitHubIcon({ className }: { className?: string }): React.JSX.Element {\n    r"
  },
  {
    "path": "App/frontend-app/src/assets/icons/mailIcon.tsx",
    "chars": 739,
    "preview": "import React from \"react\";\n\nexport function MailIcon({ className }: { className?: string }): React.JSX.Element {\n    ret"
  },
  {
    "path": "App/frontend-app/src/assets/scss/global.scss",
    "chars": 2597,
    "preview": "/* Tailwind customizations */\n$max-content-width: 1600px;\n\n@layer base {\n    html {\n        overflow-x: hidden;\n    }\n\n "
  },
  {
    "path": "App/frontend-app/src/components/chat/FeedbackForm.tsx",
    "chars": 14098,
    "preview": "import {\n    Button,\n    Dialog,\n    DialogBody,\n    DialogContent,\n    DialogSurface,\n    DialogTitle,\n    DialogTrigge"
  },
  {
    "path": "App/frontend-app/src/components/chat/OptionsPanel.css",
    "chars": 2000,
    "preview": ".options-panel-container {\n    padding-bottom: 20px; /* Add more padding below the toggle */\n    margin-top: 2px;\n    wi"
  },
  {
    "path": "App/frontend-app/src/components/chat/chatRoom.module.scss",
    "chars": 3277,
    "preview": "// .scrollbar-hide::-webkit-scrollbar {\n//     display: none;\n// }\n\n// .scrollbar-hide {\n//     -ms-overflow-style: none"
  },
  {
    "path": "App/frontend-app/src/components/chat/chatRoom.tsx",
    "chars": 27323,
    "preview": "import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport { ChatApiResponse, ChatOptions, ChatRe"
  },
  {
    "path": "App/frontend-app/src/components/chat/modelSwitch.tsx",
    "chars": 3181,
    "preview": "import { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface ModelSwitchProps {\n    onSw"
  },
  {
    "path": "App/frontend-app/src/components/chat/optionsPanel.scss",
    "chars": 653,
    "preview": ".switch {\n    @apply relative inline-block align-middle cursor-pointer bg-gray-200 w-24 h-6 rounded-full transition-colo"
  },
  {
    "path": "App/frontend-app/src/components/chat/optionsPanel.tsx",
    "chars": 2011,
    "preview": "import { } from \"@fluentui/react-components\";\nimport { useState, useEffect } from \"react\";\nimport { useTranslation } fro"
  },
  {
    "path": "App/frontend-app/src/components/datePicker/customDatePicker.tsx",
    "chars": 2606,
    "preview": "import React, { useCallback, useState, useRef } from \"react\";\nimport { Field, makeStyles } from \"@fluentui/react-compone"
  },
  {
    "path": "App/frontend-app/src/components/datePicker/dateFilterDropdownMenu.tsx",
    "chars": 2498,
    "preview": "import React, { useState, useEffect, useCallback } from \"react\";\nimport { Dropdown, Option, makeStyles } from \"@fluentui"
  },
  {
    "path": "App/frontend-app/src/components/dialogConfirm/dialogConfirm.tsx",
    "chars": 1443,
    "preview": "import React, { MouseEventHandler } from \"react\";\nimport {\n    Button,\n    Dialog,\n    DialogActions,\n    DialogBody,\n  "
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/PagesTab.tsx",
    "chars": 1464,
    "preview": "import React from 'react';\nimport { Text } from '@fluentui/react-components';\nimport { Document } from \"../../api/apiTyp"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/aIKnowledgeTab.tsx",
    "chars": 823,
    "preview": "import { Text } from '@fluentui/react-components';\n\ninterface AIKnowledgeTabProps {\n    metadata: Record<string, any>;\n}"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/dialogContentComponent.tsx",
    "chars": 2725,
    "preview": "import { Document } from \"../../api/apiTypes/embedded\";\nimport { DialogContent, Tag } from \"@fluentui/react-components\";"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/dialogTitleBar.tsx",
    "chars": 6133,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Button, Divider, Text, Tab, TabList, SelectTabEvent, Select"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/documentViewer.tsx",
    "chars": 12516,
    "preview": "import {\n    Dialog,\n    DialogBody,\n    DialogSurface,\n    SelectTabData,\n    SelectTabEvent,\n    TabListProps,\n    mak"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/iFrameComponent.tsx",
    "chars": 3577,
    "preview": "import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Document } from \"../../api/apiTypes/"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/imageCarousel.tsx",
    "chars": 2518,
    "preview": "import { useEffect, useState } from \"react\";\nimport { Document } from \"../../api/apiTypes/embedded\";\nimport { GetImage }"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/metadataTable.tsx",
    "chars": 5297,
    "preview": "import { Table, TableBody, TableCell, TableHeader, TableHeaderCell, TableRow } from \"@fluentui/react-components\";\nimport"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/pageNumberTab.tsx",
    "chars": 1251,
    "preview": "import React from 'react';\nimport { Text, Image } from '@fluentui/react-components';\nimport { Document } from \"../../api"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/tableTab.tsx",
    "chars": 1372,
    "preview": "import { Table, TableBody, TableCell, TableRow } from \"@fluentui/react-components\";\n\ninterface TableTabProps {\n    table"
  },
  {
    "path": "App/frontend-app/src/components/documentViewer/tempIframe.tsx",
    "chars": 3212,
    "preview": "import React from 'react';\nimport { useTranslation } from \"react-i18next\";\nimport { Document } from \"../../api/apiTypes/"
  },
  {
    "path": "App/frontend-app/src/components/filter/filter.tsx",
    "chars": 6454,
    "preview": "import React, { useEffect, useState, memo, useRef } from \"react\"; \nimport { Checkbox } from \"@fluentui/react-checkbox\";\n"
  },
  {
    "path": "App/frontend-app/src/components/filter/showHideFilterButton.tsx",
    "chars": 614,
    "preview": "import React from \"react\";\nimport { Button } from \"@fluentui/react-components\";\nimport { Filter20Filled } from \"@fluentu"
  },
  {
    "path": "App/frontend-app/src/components/footer/footer.tsx",
    "chars": 529,
    "preview": "import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nexport function Footer() {\n    const { t } ="
  },
  {
    "path": "App/frontend-app/src/components/header/header.test.tsx",
    "chars": 758,
    "preview": "import React from \"react\";\nimport { render, screen } from \"@testing-library/react\";\nimport \"@testing-library/jest-dom\";\n"
  },
  {
    "path": "App/frontend-app/src/components/header/header.tsx",
    "chars": 984,
    "preview": "import React from \"react\";\n\ninterface HeaderProps {\n    children: React.ReactNode;\n    className?: string;\n    size?: \"t"
  },
  {
    "path": "App/frontend-app/src/components/headerBar/headerBar.tsx",
    "chars": 8193,
    "preview": "import React, { MouseEventHandler, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimp"
  },
  {
    "path": "App/frontend-app/src/components/headerMenu/HeaderMenuTabs.tsx",
    "chars": 5943,
    "preview": "import {\r\n    Button,\r\n    Menu,\r\n    MenuItem,\r\n    MenuList,\r\n    MenuPopover,\r\n    MenuTrigger,\r\n    Tab,\r\n    TabLis"
  },
  {
    "path": "App/frontend-app/src/components/layout/layout.tsx",
    "chars": 382,
    "preview": "import React from \"react\";\nimport { InteractionStatus } from \"@azure/msal-browser\";\nimport { useMsal } from \"@azure/msal"
  },
  {
    "path": "App/frontend-app/src/components/orderBy/orderBy.tsx",
    "chars": 2648,
    "preview": "import { Select, SelectProps, useId } from \"@fluentui/react-components\";\nimport { useEffect, useState } from \"react\";\nim"
  },
  {
    "path": "App/frontend-app/src/components/pagination/pagination.tsx",
    "chars": 2172,
    "preview": "import { Button } from \"@fluentui/react-components\";\nimport { DOTS, usePagination } from \"../../utils/customHooks/usePag"
  },
  {
    "path": "App/frontend-app/src/components/resizer/panelResizer.scss",
    "chars": 1053,
    "preview": ".panel-resizer {\n  width: 8px;\n  background: #f0f0f0;\n  border-left: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  c"
  },
  {
    "path": "App/frontend-app/src/components/resizer/panelResizer.tsx",
    "chars": 3448,
    "preview": "import React, { useState, useRef, useEffect } from 'react';\n\ninterface PanelResizerProps {\n  onResize?: (leftWidth: numb"
  },
  {
    "path": "App/frontend-app/src/components/searchBox/searchBox.tsx",
    "chars": 4721,
    "preview": "import React, { forwardRef, useImperativeHandle, ChangeEvent, KeyboardEvent, useRef, useState } from \"react\";\nimport { I"
  },
  {
    "path": "App/frontend-app/src/components/searchBox/searchInput.scss",
    "chars": 226,
    "preview": ".input_wrapper {\n    border-radius: 0px !important;\n    width: 100%;\n    height: 48px;\n}\n/* Focus element */\n.input_wrap"
  },
  {
    "path": "App/frontend-app/src/components/searchResult/old.tsx",
    "chars": 6466,
    "preview": "import { Button, Checkbox, Text } from \"@fluentui/react-components\";\nimport { Tag, TagGroup } from \"@fluentui/react-tags"
  },
  {
    "path": "App/frontend-app/src/components/searchResult/searchResultCard.scss",
    "chars": 189,
    "preview": ".filename{\n    margin-bottom: 0px !important;\n    text-overflow: ellipsis !important;\n    overflow-wrap: anywhere;\n    p"
  },
  {
    "path": "App/frontend-app/src/components/searchResult/searchResultCard.tsx",
    "chars": 6554,
    "preview": "import { Button, Checkbox, Text } from \"@fluentui/react-components\";\nimport { Tag, TagGroup } from \"@fluentui/react-tags"
  },
  {
    "path": "App/frontend-app/src/components/sidecarCopilot/sidecar.module.scss",
    "chars": 507,
    "preview": ".new-topic {\n  transition: max-width 1s !important;\n  min-width: 32px !important;\n  max-width: 32px;\n  height: 32px;\n  p"
  },
  {
    "path": "App/frontend-app/src/components/sidecarCopilot/sidecar.tsx",
    "chars": 9499,
    "preview": "import { CopilotChat, UserMessage, CopilotMessage } from \"@fluentai/react-copilot-chat\";\nimport { CopilotProvider, Texta"
  },
  {
    "path": "App/frontend-app/src/components/snackbar/notistackVariants.ts",
    "chars": 388,
    "preview": "declare module \"notistack\" {\n    interface VariantOverrides {\n        // removes the `warning` variant\n        warning: "
  },
  {
    "path": "App/frontend-app/src/components/snackbar/snackbarError.tsx",
    "chars": 1843,
    "preview": "import React from \"react\";\nimport { SnackbarContent, CustomContentProps, closeSnackbar } from \"notistack\";\nimport { Aler"
  },
  {
    "path": "App/frontend-app/src/components/snackbar/snackbarSuccess.tsx",
    "chars": 1149,
    "preview": "import React from \"react\";\nimport { SnackbarContent, CustomContentProps, closeSnackbar } from \"notistack\";\nimport { Aler"
  },
  {
    "path": "App/frontend-app/src/components/uploadButton/uploadButton.tsx",
    "chars": 8107,
    "preview": "import React, { useState, useCallback, useEffect } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport {\n"
  },
  {
    "path": "App/frontend-app/src/components/uploadButton/uploadButton2.tsx",
    "chars": 1750,
    "preview": "import React, { useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { Text, Input, Button }"
  },
  {
    "path": "App/frontend-app/src/index.scss",
    "chars": 95,
    "preview": "@use \"./assets/scss/global.scss\";\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n"
  },
  {
    "path": "App/frontend-app/src/main.tsx",
    "chars": 765,
    "preview": "import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { initializeLanguage } from \"./utils/i18n/i18"
  },
  {
    "path": "App/frontend-app/src/pages/chat/chatPage.tsx",
    "chars": 4133,
    "preview": "import { Header } from \"../../components/header/header\";\nimport { HeaderBar, NavLocation } from \"../../components/header"
  },
  {
    "path": "App/frontend-app/src/pages/home/home.module.scss",
    "chars": 2595,
    "preview": ".sidecar-hidden {\n  transform: translateX(100%);\n  transition: transform 0.3s ease-in-out;\n}\n\n.sidecar-shown {\n  transfo"
  },
  {
    "path": "App/frontend-app/src/pages/home/home.tsx",
    "chars": 28932,
    "preview": "import React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\n\nimport { Text } from \"@fluentui/re"
  },
  {
    "path": "App/frontend-app/src/styles.tsx",
    "chars": 3029,
    "preview": "import {\n    BrandVariants,\n    GriffelStyle,\n    Theme,\n    createDarkTheme,\n    createLightTheme,\n    makeStyles,\n    "
  },
  {
    "path": "App/frontend-app/src/types/apiError.ts",
    "chars": 146,
    "preview": "export interface ApiError {\n    type: string;\n    title: string;\n    status: number;\n    traceId: string;\n    errors: Re"
  },
  {
    "path": "App/frontend-app/src/types/appRoles.ts",
    "chars": 62,
    "preview": "export enum AppRoles {\n    PlatformAdmin = \"PlatformAdmin\",\n}\n"
  },
  {
    "path": "App/frontend-app/src/types/facets.ts",
    "chars": 1775,
    "preview": "export interface Facets {\n    locations: Location[]\n    document_segments: DocumentSegment[]\n    language: Language[]\n  "
  },
  {
    "path": "App/frontend-app/src/types/paged.ts",
    "chars": 254,
    "preview": "export declare type Paged<T, U = undefined> = {\n    values: T[];\n    page: number;\n    pageSize: number;\n    totalResult"
  },
  {
    "path": "App/frontend-app/src/types/searchRequest.ts",
    "chars": 648,
    "preview": "export interface SearchRequest {\n    queryText: string;\n    searchFacets: SearchFacet[];\n    currentPage: number;\n    in"
  },
  {
    "path": "App/frontend-app/src/utils/auth/auth.ts",
    "chars": 10722,
    "preview": "import {\n    BrowserAuthError,\n    LogLevel,\n    PopupRequest,\n    RedirectRequest,\n    SsoSilentRequest,\n    EventType,"
  },
  {
    "path": "App/frontend-app/src/utils/auth/roles.ts",
    "chars": 634,
    "preview": "import { AccountInfo } from \"@azure/msal-browser\";\nimport { AppRoles } from \"../../types/appRoles\";\n\nexport function isP"
  },
  {
    "path": "App/frontend-app/src/utils/customHooks/usePagination.ts",
    "chars": 2883,
    "preview": "import { useMemo } from \"react\";\n\ninterface PaginationOptions {\n    totalCount: number;\n    pageSize: number;\n    siblin"
  },
  {
    "path": "App/frontend-app/src/utils/httpClient/authFetch.ts",
    "chars": 1181,
    "preview": "import { Auth } from \"../auth/auth\";\n\n/**\n * Performs an authenticated REST call.\n * @param {RequestInfo} endpoint The e"
  },
  {
    "path": "App/frontend-app/src/utils/httpClient/httpClient.ts",
    "chars": 4542,
    "preview": "\nexport const httpClient = {\n    fetch,\n    get,\n    post,\n    put,\n    delete: _delete,\n    download,\n    patch,\n    up"
  },
  {
    "path": "App/frontend-app/src/utils/i18n/i18n.ts",
    "chars": 1530,
    "preview": "import { use } from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport Backend from \"i18next-http-backe"
  },
  {
    "path": "App/frontend-app/src/utils/mapper/metadataMapper.ts",
    "chars": 2363,
    "preview": "export interface MetadataKeysMapping {\n  [key: string]: string;\n}\n\nexport const METADATA_KEYS_MAPPING: MetadataKeysMappi"
  },
  {
    "path": "App/frontend-app/src/utils/react/misc.ts",
    "chars": 763,
    "preview": "export function getEnumKeyByEnumValue<T extends { [index: string]: string }>(\n    myEnum: T,\n    enumValue: string\n): ke"
  },
  {
    "path": "App/frontend-app/src/utils/react/useEffectOnce.ts",
    "chars": 2053,
    "preview": "import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Custom hook that can be used instead of useEffect() with ze"
  },
  {
    "path": "App/frontend-app/src/utils/telemetry/telemetry.ts",
    "chars": 1178,
    "preview": "import { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\nimport { ReactPlugin } from \"@microsoft/applic"
  },
  {
    "path": "App/frontend-app/src/vite-env.d.ts",
    "chars": 245,
    "preview": "/// <reference types=\"vite/client\" />\n\ninterface ImportMetaEnv {\n    VITE_API_ENDPOINT: string\n    VITE_ENABLE_UPLOAD_BU"
  },
  {
    "path": "App/frontend-app/tailwind.config.ts",
    "chars": 2099,
    "preview": "/* If we\"d like to reference a value in the default theme we can import it from tailwindcss/defaultTheme */\nimport color"
  },
  {
    "path": "App/frontend-app/tsconfig.json",
    "chars": 693,
    "preview": "{\n    \"compilerOptions\": {\n        \"target\": \"ESNext\",\n        \"useDefineForClassFields\": true,\n        \"lib\": [\"DOM\", \""
  },
  {
    "path": "App/frontend-app/tsconfig.node.json",
    "chars": 184,
    "preview": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSynthe"
  },
  {
    "path": "App/frontend-app/vite.config.ts",
    "chars": 995,
    "preview": "import { defineConfig, loadEnv } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport postcss from \"./postcss.c"
  },
  {
    "path": "App/frontend-app/vite.config.ts.timestamp-1728339681134-f3f43d813d5c6.mjs",
    "chars": 11487,
    "preview": "// vite.config.ts\nimport { defineConfig } from \"file:///C:/Users/gpickett/OneDrive%20-%20Microsoft/Documents/AzureDevops"
  },
  {
    "path": "App/kernel-memory/.dockerignore",
    "chars": 273,
    "preview": ".dockerignore\n.env\n.git\n.gitignore\n.vs\n.vscode\ndocker-compose.yml\ndocker-compose.*.yml\n*/bin\n*/obj\n\n# To make sure that "
  },
  {
    "path": "App/kernel-memory/.editorconfig",
    "chars": 36033,
    "preview": "# To learn more about .editorconfig see https://aka.ms/editorconfigdocs\n###############################\n# Core EditorCon"
  },
  {
    "path": "App/kernel-memory/.gitattributes",
    "chars": 126,
    "preview": "# Auto-detect text files, ensure they use LF.\n* text=auto eol=lf working-tree-encoding=UTF-8\n\n# Bash scripts\n*.sh text e"
  },
  {
    "path": "App/kernel-memory/.gitignore",
    "chars": 8293,
    "preview": "KernelMemoryDev.*\n\ndotnet/.config\ntmp/\n_tmp/\ntmp-*/\nout/\n_files/\n_vectors/\n_queues/\n_textdb/\n.chromaenv\n.chromadb\n*.patc"
  },
  {
    "path": "App/kernel-memory/.vscode/launch.json",
    "chars": 1122,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            // Use IntelliSense to find out which attributes"
  },
  {
    "path": "App/kernel-memory/.vscode/settings.json",
    "chars": 721,
    "preview": "{\n  \"prettier.enable\": true,\n  \"editor.formatOnSave\": true,\n  \"editor.formatOnPaste\": true,\n  \"editor.formatOnType\": tru"
  },
  {
    "path": "App/kernel-memory/.vscode/tasks.json",
    "chars": 1163,
    "preview": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n      "
  },
  {
    "path": "App/kernel-memory/CODE_OF_CONDUCT.md",
    "chars": 444,
    "preview": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://op"
  },
  {
    "path": "App/kernel-memory/COMMUNITY.md",
    "chars": 1025,
    "preview": "# Welcome to the Semantic Kernel / Kernel Memory Community!\n\nBelow are some ways that you can get involved.\n\n## Engage o"
  }
]

// ... and 482 more files (download for full content)

About this extraction

This page contains the full source code of the microsoft/Document-Knowledge-Mining-Solution-Accelerator GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 682 files (7.3 MB), approximately 2.0M tokens, and a symbol index with 2207 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!