feat(*): 云端 Agent - 增强画布上下文读取并接入 Gemini 缓存

This commit is contained in:
ddcat666
2026-09-26 02:21:47 +08:00
parent 2ce50bbb9d
commit 2cedc4c66b
35 changed files with 1927 additions and 266 deletions

View File

@@ -35,13 +35,6 @@ func TestPurgeAssetsBatchSharedResourcesAndHistory(t *testing.T) {
t.Fatal(err)
}
}
// Force an error late in the resource transaction, after asset and outbox writes.
if err := db.Exec("CREATE TRIGGER fail_batch_resource_delete BEFORE DELETE ON resources BEGIN SELECT RAISE(ABORT, 'forced failure'); END;").Error; err != nil {
t.Fatal(err)
}
if err := svc.PurgeUserAssets("user-1", []string{"first", "second"}); err == nil {
t.Fatal("expected rollback")
}
assertCount := func(record any, want int64) {
t.Helper()
var count int64
@@ -49,15 +42,44 @@ func TestPurgeAssetsBatchSharedResourcesAndHistory(t *testing.T) {
t.Fatalf("%T count=%d want=%d err=%v", record, count, want, err)
}
}
// Active task, canvas and history references must block deletion.
if err := svc.PurgeUserAssets("user-1", []string{"first", "second"}); err == nil {
t.Fatal("expected referenced assets to remain protected")
}
assertCount(&model.Asset{}, 3)
assertCount(&model.Resource{}, 4)
assertCount(&model.ResourceDeletionJob{}, 0)
assertCount(&model.CanvasSnapshotResource{}, 1)
assertCount(&model.AssetVersion{}, 2)
assertCount(&model.AssetRepresentation{}, 2)
// Once references are released, a late database error must still roll back.
if err := db.Model(&model.Task{}).Where("id = ?", "batch-task").Update("input_json", `{}`).Error; err != nil {
t.Fatal(err)
}
if err := db.Model(&model.CanvasProject{}).Where("id = ?", "batch-canvas").Update("payload_json", `{}`).Error; err != nil {
t.Fatal(err)
}
if err := db.Delete(&model.CanvasSnapshotResource{}, "snapshot_id = ?", "batch-snapshot").Error; err != nil {
t.Fatal(err)
}
if err := db.Exec("CREATE TRIGGER fail_batch_resource_delete BEFORE DELETE ON resources BEGIN SELECT RAISE(ABORT, 'forced failure'); END;").Error; err != nil {
t.Fatal(err)
}
if err := svc.PurgeUserAssets("user-1", []string{"first", "second"}); err == nil {
t.Fatal("expected rollback")
}
assertCount(&model.Asset{}, 3)
assertCount(&model.Resource{}, 4)
assertCount(&model.ResourceDeletionJob{}, 0)
assertCount(&model.CanvasSnapshotResource{}, 0)
assertCount(&model.AssetVersion{}, 2)
assertCount(&model.AssetRepresentation{}, 2)
if err := db.Exec("DROP TRIGGER fail_batch_resource_delete").Error; err != nil {
t.Fatal(err)
}
if err := svc.PurgeUserAssets("user-1", []string{"first", " second ", "first"}); err != nil {
t.Fatal(err)
}