Files
patchy631--ai-engineering-hub/open-agent-builder/convex/executions.ts
T
2026-07-13 12:37:47 +08:00

85 lines
2.0 KiB
TypeScript

import { v } from "convex/values";
import { query, mutation } from "./_generated/server";
/**
* Workflow Execution State Management
*/
// Create execution record
export const createExecution = mutation({
args: {
workflowId: v.id("workflows"),
input: v.optional(v.any()),
threadId: v.optional(v.string()),
},
handler: async ({ db }, { workflowId, input, threadId }) => {
const executionId = await db.insert("executions", {
workflowId,
status: "running",
input,
threadId,
nodeResults: {},
variables: {},
startedAt: new Date().toISOString(),
});
return executionId;
},
});
// Update execution state
export const updateExecution = mutation({
args: {
id: v.id("executions"),
status: v.optional(v.string()),
currentNodeId: v.optional(v.string()),
nodeResults: v.optional(v.any()),
variables: v.optional(v.any()),
output: v.optional(v.any()),
error: v.optional(v.string()),
},
handler: async ({ db }, { id, ...updates }) => {
await db.patch(id, updates);
return id;
},
});
// Complete execution
export const completeExecution = mutation({
args: {
id: v.id("executions"),
output: v.optional(v.any()),
error: v.optional(v.string()),
},
handler: async ({ db }, { id, output, error }) => {
await db.patch(id, {
status: error ? "failed" : "completed",
output,
error,
completedAt: new Date().toISOString(),
});
return id;
},
});
// Get execution by ID
export const getExecution = query({
args: { id: v.id("executions") },
handler: async ({ db }, { id }) => {
const execution = await db.get(id);
return execution;
},
});
// Get executions for a workflow
export const getWorkflowExecutions = query({
args: { workflowId: v.id("workflows") },
handler: async ({ db }, { workflowId }) => {
const executions = await db
.query("executions")
.withIndex("by_workflow", (q) => q.eq("workflowId", workflowId))
.order("desc")
.collect();
return executions;
},
});