feat: enhance canvas and node components with error handling and retry logic

- Integrated retry logic for AI image generation to handle transient errors and improve user experience.
- Updated error categorization to provide more informative feedback based on different failure scenarios.
- Enhanced node components to display retry attempts and error messages, improving visibility during image generation failures.
- Refactored canvas and node components to include retry count in status updates, ensuring accurate tracking of generation attempts.
This commit is contained in:
Matthias
2026-03-27 11:35:18 +01:00
parent 99a359f330
commit 5da0204163
28 changed files with 1180 additions and 35 deletions

View File

@@ -160,6 +160,7 @@ export const create = mutation({
width: args.width,
height: args.height,
status: "idle",
retryCount: 0,
data: args.data,
parentId: args.parentId,
zIndex: args.zIndex,
@@ -276,14 +277,19 @@ export const updateStatus = mutation({
v.literal("error")
),
statusMessage: v.optional(v.string()),
retryCount: v.optional(v.number()),
},
handler: async (ctx, { nodeId, status, statusMessage }) => {
handler: async (ctx, { nodeId, status, statusMessage, retryCount }) => {
const user = await requireAuth(ctx);
const node = await ctx.db.get(nodeId);
if (!node) throw new Error("Node not found");
await getCanvasOrThrow(ctx, node.canvasId, user.userId);
const patch: { status: typeof status; statusMessage?: string } = {
const patch: {
status: typeof status;
statusMessage?: string;
retryCount?: number;
} = {
status,
};
if (statusMessage !== undefined) {
@@ -291,6 +297,9 @@ export const updateStatus = mutation({
} else if (status === "done" || status === "executing" || status === "idle") {
patch.statusMessage = undefined;
}
if (retryCount !== undefined) {
patch.retryCount = retryCount;
}
await ctx.db.patch(nodeId, patch);
},
});