Implement backlog issues 021, 025, 028: vector store abstraction, citation capture, user profile extraction#40
Merged
matt-goldman merged 5 commits intomainfrom Feb 28, 2026
Conversation
… (Issue 021) - Rename QdrantSearchResult → VectorSearchResult - Rename IQdrantService → IVectorStore - Rename QdrantService → QdrantVectorStore - Add VectorStoreOptions with Provider config key - Update Program.cs to use switch-driven IVectorStore registration - Add VectorStore section to appsettings.json - Update all consumers: RagService, EmbeddingService, SearchMemoriesTool, SearchEndpoints, DiagnosticsEndpoints - Update all test fakes: FakeVectorStore, ThrowingVectorStore, FakeSearchVectorStore, ThrowingSearchVectorStore - All 150 tests pass Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add MessageCitation, CitationMetadata, MessageContentReference to ChatGptExport.cs - Add Citations and ContentReferences properties to MessageMetadata - Add StoredCitation and StoredContentReference model classes - Add Citations and ContentReferences properties to StoredMessage - Parse citations and non-hidden content references in StoredMessage.From() - Include citation name/URL context in BuildEmbeddingText() - Add unit tests for citation parsing, content reference filtering, and embedding citation context Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…citation name lookup Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add UserProfile model with UserProfileText, UserInstructions, SourceCreateTime, LastUpdated - Add IUserProfileRepository interface and UserProfileRepository MongoDB implementation - Update ImportProcessingService to scan user_editable_context messages during import and store the latest user profile (by create_time) via TryUpdateUserProfileAsync - Update RagService.BuildMessages to accept optional UserProfile parameter and include USER CONTEXT section in system prompt when profile data is present - ChatAsync and ChatStreamAsync fetch user profile from repository and pass to BuildMessages - Register IUserProfileRepository/UserProfileRepository as singleton in Program.cs - Add FakeUserProfileRepository to test helpers - Add UserProfileTests: BuildMessages profile injection and import extraction tests - Update ImportProcessingService tests to pass FakeUserProfileRepository - Mark issue 028 Done; update docs/index.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Delegate independent backlog items to individual agents
Implement backlog issues 021, 025, 028: vector store abstraction, citation capture, user profile extraction
Feb 28, 2026
matt-goldman
approved these changes
Feb 28, 2026
Owner
matt-goldman
left a comment
There was a problem hiding this comment.
LGTM - tested and ran locally. All working, identified the next batch of issues.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three independent backlog items with no interdependencies, implemented in parallel via sub-agents.
Issue 021 — Abstract Vector Store Interface
Replaces the Qdrant-coupled
IQdrantServicewith a provider-agnosticIVectorStoreabstraction, mirroring the existingLlmOptionspattern.IQdrantService→IVectorStore,QdrantSearchResult→VectorSearchResult,QdrantService→QdrantVectorStoreVectorStoreOptionswithProviderconfig key; startup selects implementation via switch (only"Qdrant"for now)RagService,EmbeddingService,SearchMemoriesTool, endpoints) and test fakes updatedIssue 025 — Capture Citations and Content References
Parses and stores
metadata.citations[]andmetadata.content_references[]from ChatGPT export messages (previously dropped entirely).MessageCitation,CitationMetadata,MessageContentReferenceonMessageMetadataStoredCitation,StoredContentReferenceonStoredMessage; populated inStoredMessage.From()hiddencontent references filtered at parse time (internally generated, not useful for RAG)BuildEmbeddingText()appends[Cited: <name/url>]lines so file/web source attribution contributes to embedding contextIssue 028 — Extract User Profile from Custom Instructions
Extracts the latest
user_editable_contextcontent (ChatGPT custom instructions) during import and surfaces it as personalisation context in chat.UserProfileMongoDB model (single document, fixedId = "user-profile");IUserProfileRepository/UserProfileRepositoryImportProcessingServicescans messages during import, upserts only ifcreate_timeis newer than what's storedRagService.BuildMessages()accepts optionalUserProfile?; injects a=== USER CONTEXT ===block into the system prompt with "About the user" and "User's preferences for responses" sectionsuser_editable_contextmessages already excluded from embedding via existingIsHiddenfilter — no change needed there🔒 GitHub Advanced Security automatically protects Copilot coding agent pull requests. You can protect all pull requests by enabling Advanced Security for your repositories. Learn more about Advanced Security.