@@ -98,7 +98,10 @@ await connection.ExecuteAsync(
9898 """
9999 SELECT id AS Id, skill_id AS SkillId, version AS Version, description AS Description,
100100 category AS Category, skill_type AS SkillType, sha256 AS Sha256,
101- size_bytes AS SizeBytes, published_at AS PublishedAt, is_latest AS IsLatest
101+ size_bytes AS SizeBytes,
102+ COALESCE(artifact_sha256, sha256) AS ArtifactSha256,
103+ COALESCE(artifact_size_bytes, size_bytes) AS ArtifactSizeBytes,
104+ published_at AS PublishedAt, is_latest AS IsLatest
102105 FROM skill_versions
103106 WHERE skill_id = @skillId AND is_latest = 1
104107 """ ,
@@ -112,7 +115,10 @@ FROM skill_versions
112115 """
113116 SELECT id AS Id, skill_id AS SkillId, version AS Version, description AS Description,
114117 category AS Category, skill_type AS SkillType, sha256 AS Sha256,
115- size_bytes AS SizeBytes, published_at AS PublishedAt, is_latest AS IsLatest
118+ size_bytes AS SizeBytes,
119+ COALESCE(artifact_sha256, sha256) AS ArtifactSha256,
120+ COALESCE(artifact_size_bytes, size_bytes) AS ArtifactSizeBytes,
121+ published_at AS PublishedAt, is_latest AS IsLatest
116122 FROM skill_versions
117123 WHERE skill_id = @skillId AND version = @version
118124 """ ,
@@ -126,7 +132,10 @@ public async Task<IReadOnlyList<SkillVersion>> GetAllVersionsAsync(long skillId,
126132 """
127133 SELECT id AS Id, skill_id AS SkillId, version AS Version, description AS Description,
128134 category AS Category, skill_type AS SkillType, sha256 AS Sha256,
129- size_bytes AS SizeBytes, published_at AS PublishedAt, is_latest AS IsLatest
135+ size_bytes AS SizeBytes,
136+ COALESCE(artifact_sha256, sha256) AS ArtifactSha256,
137+ COALESCE(artifact_size_bytes, size_bytes) AS ArtifactSizeBytes,
138+ published_at AS PublishedAt, is_latest AS IsLatest
130139 FROM skill_versions
131140 WHERE skill_id = @skillId
132141 ORDER BY published_at DESC
@@ -135,14 +144,37 @@ ORDER BY published_at DESC
135144 return versions . ToList ( ) ;
136145 }
137146
147+ public async Task < IReadOnlyList < SkillVersion > > GetResourcefulVersionsWithoutArchiveAsync ( CancellationToken ct = default )
148+ {
149+ await using var connection = new SqliteConnection ( _connectionString ) ;
150+ var versions = await connection . QueryAsync < SkillVersion > (
151+ """
152+ SELECT sv.id AS Id, sv.skill_id AS SkillId, sv.version AS Version, sv.description AS Description,
153+ sv.category AS Category, sv.skill_type AS SkillType, sv.sha256 AS Sha256,
154+ sv.size_bytes AS SizeBytes,
155+ COALESCE(sv.artifact_sha256, sv.sha256) AS ArtifactSha256,
156+ COALESCE(sv.artifact_size_bytes, sv.size_bytes) AS ArtifactSizeBytes,
157+ sv.published_at AS PublishedAt, sv.is_latest AS IsLatest
158+ FROM skill_versions sv
159+ WHERE sv.skill_type != @archiveType
160+ AND EXISTS (SELECT 1 FROM skill_files sf WHERE sf.skill_version_id = sv.id)
161+ ORDER BY sv.id
162+ """ ,
163+ new { archiveType = SkillTypes . Archive } ) ;
164+ return versions . ToList ( ) ;
165+ }
166+
138167 public async Task < IReadOnlyList < SkillVersionWithFileCount > > GetAllVersionsWithFileCountAsync ( long skillId , CancellationToken ct = default )
139168 {
140169 await using var connection = new SqliteConnection ( _connectionString ) ;
141170 var versions = await connection . QueryAsync < SkillVersionWithFileCount > (
142171 """
143172 SELECT sv.id AS Id, sv.skill_id AS SkillId, sv.version AS Version, sv.description AS Description,
144173 sv.category AS Category, sv.skill_type AS SkillType, sv.sha256 AS Sha256,
145- sv.size_bytes AS SizeBytes, sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
174+ sv.size_bytes AS SizeBytes,
175+ COALESCE(sv.artifact_sha256, sv.sha256) AS ArtifactSha256,
176+ COALESCE(sv.artifact_size_bytes, sv.size_bytes) AS ArtifactSizeBytes,
177+ sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
146178 (SELECT COUNT(*) FROM skill_files sf WHERE sf.skill_version_id = sv.id) AS FileCount
147179 FROM skill_versions sv
148180 WHERE sv.skill_id = @skillId
@@ -162,7 +194,10 @@ public async Task<IReadOnlyList<SkillVersionWithMetadata>> GetAllLatestVersionsW
162194 var sql = """
163195 SELECT sv.id AS Id, sv.skill_id AS SkillId, sv.version AS Version, sv.description AS Description,
164196 sv.category AS Category, sv.skill_type AS SkillType, sv.sha256 AS Sha256,
165- sv.size_bytes AS SizeBytes, sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
197+ sv.size_bytes AS SizeBytes,
198+ COALESCE(sv.artifact_sha256, sv.sha256) AS ArtifactSha256,
199+ COALESCE(sv.artifact_size_bytes, sv.size_bytes) AS ArtifactSizeBytes,
200+ sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
166201 s.name AS SkillName, s.created_at AS SkillCreatedAt, s.updated_at AS SkillUpdatedAt,
167202 (SELECT COUNT(*) FROM skill_versions sv2 WHERE sv2.skill_id = s.id) AS VersionCount
168203 FROM skill_versions sv
@@ -196,7 +231,9 @@ public async Task<long> CreateVersionAsync(
196231 string skillType ,
197232 string sha256 ,
198233 long sizeBytes ,
199- CancellationToken ct = default )
234+ CancellationToken ct = default ,
235+ string ? artifactSha256 = null ,
236+ long ? artifactSizeBytes = null )
200237 {
201238 await using var connection = new SqliteConnection ( _connectionString ) ;
202239 await connection . OpenAsync ( ct ) ;
@@ -215,11 +252,23 @@ await connection.ExecuteAsync(
215252
216253 var versionId = await connection . ExecuteScalarAsync < long > (
217254 """
218- INSERT INTO skill_versions (skill_id, version, description, category, skill_type, sha256, size_bytes, published_at, is_latest)
219- VALUES (@skillId, @version, @description, @category, @typeString, @sha256, @sizeBytes, @now, 1);
255+ INSERT INTO skill_versions (skill_id, version, description, category, skill_type, sha256, size_bytes, artifact_sha256, artifact_size_bytes, published_at, is_latest)
256+ VALUES (@skillId, @version, @description, @category, @typeString, @sha256, @sizeBytes, @artifactSha256, @artifactSizeBytes, @ now, 1);
220257 SELECT last_insert_rowid();
221258 """ ,
222- new { skillId , version , description , category , typeString , sha256 , sizeBytes , now } ,
259+ new
260+ {
261+ skillId ,
262+ version ,
263+ description ,
264+ category ,
265+ typeString ,
266+ sha256 ,
267+ sizeBytes ,
268+ artifactSha256 = artifactSha256 ?? sha256 ,
269+ artifactSizeBytes = artifactSizeBytes ?? sizeBytes ,
270+ now
271+ } ,
223272 transaction ) ;
224273
225274 await transaction . CommitAsync ( ct ) ;
@@ -232,6 +281,25 @@ INSERT INTO skill_versions (skill_id, version, description, category, skill_type
232281 }
233282 }
234283
284+ public async Task UpdateVersionArtifactAsync (
285+ long versionId ,
286+ string skillType ,
287+ string artifactSha256 ,
288+ long artifactSizeBytes ,
289+ CancellationToken ct = default )
290+ {
291+ await using var connection = new SqliteConnection ( _connectionString ) ;
292+ await connection . ExecuteAsync (
293+ """
294+ UPDATE skill_versions
295+ SET skill_type = @skillType,
296+ artifact_sha256 = @artifactSha256,
297+ artifact_size_bytes = @artifactSizeBytes
298+ WHERE id = @versionId
299+ """ ,
300+ new { versionId , skillType , artifactSha256 , artifactSizeBytes } ) ;
301+ }
302+
235303 public async Task < IReadOnlyList < SkillFile > > GetFilesAsync ( long versionId , CancellationToken ct = default )
236304 {
237305 await using var connection = new SqliteConnection ( _connectionString ) ;
@@ -275,7 +343,10 @@ public async Task<IReadOnlyList<SkillVersionWithMetadata>> SearchSkillsAsync(
275343 var sql = """
276344 SELECT sv.id AS Id, sv.skill_id AS SkillId, sv.version AS Version, sv.description AS Description,
277345 sv.category AS Category, sv.skill_type AS SkillType, sv.sha256 AS Sha256,
278- sv.size_bytes AS SizeBytes, sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
346+ sv.size_bytes AS SizeBytes,
347+ COALESCE(sv.artifact_sha256, sv.sha256) AS ArtifactSha256,
348+ COALESCE(sv.artifact_size_bytes, sv.size_bytes) AS ArtifactSizeBytes,
349+ sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
279350 s.name AS SkillName, s.created_at AS SkillCreatedAt, s.updated_at AS SkillUpdatedAt,
280351 (SELECT COUNT(*) FROM skill_versions sv2 WHERE sv2.skill_id = s.id) AS VersionCount
281352 FROM skills_fts
@@ -309,7 +380,10 @@ private static string EscapeFtsToken(string token)
309380 """
310381 SELECT sv.id AS Id, sv.skill_id AS SkillId, sv.version AS Version, sv.description AS Description,
311382 sv.category AS Category, sv.skill_type AS SkillType, sv.sha256 AS Sha256,
312- sv.size_bytes AS SizeBytes, sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
383+ sv.size_bytes AS SizeBytes,
384+ COALESCE(sv.artifact_sha256, sv.sha256) AS ArtifactSha256,
385+ COALESCE(sv.artifact_size_bytes, sv.size_bytes) AS ArtifactSizeBytes,
386+ sv.published_at AS PublishedAt, sv.is_latest AS IsLatest,
313387 (SELECT COUNT(*) FROM skill_files sf WHERE sf.skill_version_id = sv.id) AS FileCount
314388 FROM skill_versions sv
315389 JOIN skills s ON s.id = sv.skill_id
0 commit comments