From a3d0c97d23de7e7fc6ac32e879eae9e9bc229a37 Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 20 May 2026 22:48:44 +0800 Subject: [PATCH] auto-save 2026-05-20 22:48 (~2) --- .memory/worklog.json | 7 +++++++ src/lib/packGenerator.ts | 15 +++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 4a67e18..a1d9658 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1839,6 +1839,13 @@ "message": "fix: make video prompts material adaptive", "hash": "7106f3a", "files_changed": 1 + }, + { + "ts": "2026-05-20T22:43:19+08:00", + "type": "commit", + "message": "auto-save 2026-05-20 22:43 (~2)", + "hash": "33f87eb", + "files_changed": 2 } ] } diff --git a/src/lib/packGenerator.ts b/src/lib/packGenerator.ts index 6659239..cdede29 100644 --- a/src/lib/packGenerator.ts +++ b/src/lib/packGenerator.ts @@ -1,6 +1,7 @@ import { randomBytes } from 'node:crypto'; import type { AssetPack, + AssetTemplate, CharacterSpec, ExportManifest, GenImage, @@ -289,11 +290,13 @@ export async function generateAssetPack(opts: { }); const characterSpec = cleaned.characterSpec; const version = 'v01'; - const packId = `pack_${opts.kind}_${Date.now().toString(36)}_${randomBytes(3).toString('hex')}`; - const createdAt = Date.now(); + const existingPack = opts.session.packs?.find(pack => pack.kind === opts.kind && pack.sourceImageId === opts.sourceImage.id && pack.status !== 'complete'); + const packId = existingPack?.id ?? `pack_${opts.kind}_${Date.now().toString(36)}_${randomBytes(3).toString('hex')}`; + const createdAt = existingPack?.createdAt ?? Date.now(); const provider = detectProvider(); - const assets: ToyAsset[] = []; + const templateIds = new Set(templates.map(template => template.id)); + const assets: ToyAsset[] = (existingPack?.assets ?? []).filter(asset => templateIds.has(asset.templateId)); const pack: AssetPack = { id: packId, kind: opts.kind, @@ -302,14 +305,14 @@ export async function generateAssetPack(opts: { sourceImageUrl: opts.sourceImage.url, characterSpec, assets, - manifestId: `manifest_${packId}`, + manifestId: existingPack?.manifestId ?? `manifest_${packId}`, createdAt, version, status: 'draft', }; - const remainingTemplates = [...templates]; - const generatedTemplateIds = new Set(); + const generatedTemplateIds = new Set(assets.map(asset => asset.templateId)); + const remainingTemplates = templates.filter(template => !generatedTemplateIds.has(template.id)); async function createAsset(template: AssetTemplate): Promise { const assetId = `${opts.kind}_${template.filenamePart}_${randomBytes(3).toString('hex')}`; const anchorAsset = template.anchorTemplateId