Record uploaded assets in conversation packages
This commit is contained in:
+62
-2
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user