85 lines
2.0 KiB
TypeScript
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;
|
|
},
|
|
});
|