Record uploaded assets in conversation packages

This commit is contained in:
john
2026-07-02 21:28:51 +08:00
parent c2308a6ead
commit 0f48792133
7 changed files with 193 additions and 4 deletions
+62 -2
View File
@@ -294,6 +294,7 @@ export function createAssetService(pool, options = {}) {
const uploadTtlMs = Number(options.uploadTtlMs ?? 30 * 60 * 1000);
const idFactory = options.idFactory ?? (() => crypto.randomUUID());
const normalizeStoredImage = options.normalizeStoredImage ?? normalizeImageForStorage;
const conversationPackageRegistry = options.conversationPackageRegistry ?? null;
const workspaceSync = createWorkspaceAssetSync({
pool,
storageRoot,
@@ -464,8 +465,9 @@ export function createAssetService(pool, options = {}) {
await conn.query(
`INSERT INTO h5_upload_sessions
(id, user_id, space_id, category_id, filename, expected_size, declared_mime_type,
reserved_bytes, temporary_storage_key, status, expires_at, created_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'reserved', ?, ?)`,
reserved_bytes, temporary_storage_key, status, expires_at, created_at,
source_session_id, source_message_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'reserved', ?, ?, ?, ?)`,
[
uploadId,
userId,
@@ -478,6 +480,8 @@ export function createAssetService(pool, options = {}) {
temporaryStorageKey,
now + uploadTtlMs,
now,
input.sourceSessionId ?? input.source_session_id ?? null,
input.sourceMessageId ?? input.source_message_id ?? null,
],
);
await conn.commit();
@@ -733,6 +737,16 @@ export function createAssetService(pool, options = {}) {
if (finalStorageKey !== upload.temporary_storage_key) {
await fs.rm(temporaryPath, { force: true }).catch(() => {});
}
await registerUploadArtifactForConversation({
registry: conversationPackageRegistry,
userId,
upload,
asset: result,
assetId,
storageKey: finalStorageKey,
canonicalUrl: result.publicUrl,
now,
});
return result;
} catch (error) {
await conn.rollback();
@@ -1277,9 +1291,55 @@ export function createAssetService(pool, options = {}) {
};
}
async function registerUploadArtifactForConversation({
registry,
userId,
upload,
asset,
assetId,
storageKey,
canonicalUrl,
now,
}) {
const sessionId = String(upload?.source_session_id ?? '').trim();
if (!registry || !sessionId || !assetId) return null;
try {
const packageRecord = await registry.ensurePackage({
userId,
sessionId,
now,
});
const isImage = String(asset?.mimeType ?? '').startsWith('image/');
const artifact = await registry.recordArtifact({
id: `ca_${assetId}`,
packageId: packageRecord.id,
artifactKind: isImage ? 'input_image' : 'input_file',
role: 'user',
assetId,
messageId: upload.source_message_id ?? null,
displayName: asset?.displayName ?? asset?.filename ?? upload.filename,
mimeType: asset?.mimeType ?? upload.detected_mime_type ?? null,
sizeBytes: asset?.sizeBytes ?? upload.actual_size ?? null,
storageKey,
canonicalUrl,
sortOrder: Number.isFinite(Number(now)) ? Number(now) : 0,
now,
});
await registry.writeManifestForSession({ userId, sessionId });
return artifact;
} catch (error) {
console.warn(
'[MindSpace] conversation package upload artifact registration failed:',
error instanceof Error ? error.message : error,
);
return null;
}
}
export const assetInternals = {
detectMimeType,
normalizeFilename,
expectedMimeType,
assetTypeForMime,
registerUploadArtifactForConversation,
};