Add Git overlay, operation tools, and virtualized preview so large folders stay responsive.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-24 15:04:04 +02:00
parent 9bf451932f
commit a3c54bbb03
127 changed files with 14748 additions and 633 deletions

View File

@@ -15,6 +15,10 @@ public interface IIndexStore
IAnalysisStore Analysis { get; }
IHistoryStore History { get; }
IHashStore Hashes { get; }
IFileRelationStore Relations { get; }
IRenameBatchStore RenameBatches { get; }
ISyncProfileStore SyncProfiles { get; }
IOperationProfileStore OperationProfiles { get; }
Task RunWriteAsync(Func<IIndexStore, Task> work, CancellationToken cancellationToken = default);
Task<T> RunWriteAsync<T>(Func<IIndexStore, Task<T>> work, CancellationToken cancellationToken = default);
@@ -78,6 +82,8 @@ public interface ITransferStore
{
Task<long> InsertAsync(TransferJob job, CancellationToken cancellationToken = default);
Task UpdateAsync(TransferJob job, CancellationToken cancellationToken = default);
Task<IReadOnlyList<TransferJob>> GetIncompleteAsync(CancellationToken cancellationToken = default);
Task<IReadOnlyList<TransferJob>> GetHistoryAsync(int take, CancellationToken cancellationToken = default);
}
public interface ISearchStore
@@ -161,6 +167,36 @@ public interface IHashStore
Task<IReadOnlyList<DuplicateGroup>> GetDuplicateGroupsAsync(long? sourceId, string? pathPrefix, int take, CancellationToken cancellationToken = default);
}
public interface IFileRelationStore
{
Task<IReadOnlyList<FileRelation>> GetAmongAsync(IReadOnlyList<long> entryIds, CancellationToken cancellationToken = default);
Task UpsertAsync(FileRelation relation, CancellationToken cancellationToken = default);
Task DeleteAmongAsync(IReadOnlyList<long> entryIds, IReadOnlyList<FileRelationKind> kinds, CancellationToken cancellationToken = default);
}
public interface IRenameBatchStore
{
Task<long> CreateAsync(IReadOnlyList<RenameBatchItem> items, CancellationToken cancellationToken = default);
Task<RenameBatch?> GetLatestUndoableAsync(CancellationToken cancellationToken = default);
Task MarkUndoneAsync(long id, CancellationToken cancellationToken = default);
}
public interface ISyncProfileStore
{
Task<IReadOnlyList<SyncProfile>> ListAsync(CancellationToken cancellationToken = default);
Task<SyncProfile?> GetAsync(long id, CancellationToken cancellationToken = default);
Task<long> UpsertAsync(SyncProfile profile, CancellationToken cancellationToken = default);
Task DeleteAsync(long id, CancellationToken cancellationToken = default);
}
public interface IOperationProfileStore
{
Task<IReadOnlyList<OperationProfile>> ListAsync(CancellationToken cancellationToken = default);
Task<OperationProfile?> GetAsync(long id, CancellationToken cancellationToken = default);
Task<long> UpsertAsync(OperationProfile profile, CancellationToken cancellationToken = default);
Task DeleteAsync(long id, CancellationToken cancellationToken = default);
}
public sealed class HashWorkItem
{
public long EntryId { get; init; }