mirror of
https://github.com/simstudioai/sim.git
synced 2026-02-12 23:45:07 -05:00
* v0 * v1 * Basic ss tes * Ss tests * Stuff * Add mcp * mcp v1 * Improvement * Fix * BROKEN * Checkpoint * Streaming * Fix abort * Things are broken * Streaming seems to work but copilot is dumb * Fix edge issue * LUAAAA * Fix stream buffer * Fix lint * Checkpoint * Initial temp state, in the middle of a refactor * Initial test shows diff store still working * Tool refactor * First cleanup pass complete - untested * Continued cleanup * Refactor * Refactor complete - no testing yet * Fix - cursor makes me sad * Fix mcp * Clean up mcp * Updated mcp * Add respond to subagents * Fix definitions * Add tools * Add tools * Add copilot mcp tracking * Fix lint * Fix mcp * Fix * Updates * Clean up mcp * Fix copilot mcp tool names to be sim prefixed * Add opus 4.6 * Fix discovery tool * Fix * Remove logs * Fix go side tool rendering * Update docs * Fix hydration * Fix tool call resolution * Fix * Fix lint * Fix superagent and autoallow integrations * Fix always allow * Update block * Remove plan docs * Fix hardcoded ff * Fix dropped provider * Fix lint * Fix tests * Fix dead messages array * Fix discovery * Fix run workflow * Fix run block * Fix run from block in copilot * Fix lint * Fix skip and mtb * Fix typing * Fix tool call * Bump api version * Fix bun lock * Nuke bad files
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { db } from '@sim/db'
|
|
import { workflowExecutionLogs } from '@sim/db/schema'
|
|
import { and, desc, eq, sql } from 'drizzle-orm'
|
|
import type { SerializableExecutionState } from '@/executor/execution/types'
|
|
|
|
function isSerializableExecutionState(value: unknown): value is SerializableExecutionState {
|
|
if (!value || typeof value !== 'object') return false
|
|
const state = value as Record<string, unknown>
|
|
return (
|
|
typeof state.blockStates === 'object' &&
|
|
Array.isArray(state.executedBlocks) &&
|
|
Array.isArray(state.blockLogs) &&
|
|
typeof state.decisions === 'object' &&
|
|
Array.isArray(state.completedLoops) &&
|
|
Array.isArray(state.activeExecutionPath)
|
|
)
|
|
}
|
|
|
|
function extractExecutionState(executionData: unknown): SerializableExecutionState | null {
|
|
if (!executionData || typeof executionData !== 'object') return null
|
|
const state = (executionData as Record<string, unknown>).executionState
|
|
return isSerializableExecutionState(state) ? state : null
|
|
}
|
|
|
|
export async function getExecutionState(
|
|
executionId: string
|
|
): Promise<SerializableExecutionState | null> {
|
|
const [row] = await db
|
|
.select({ executionData: workflowExecutionLogs.executionData })
|
|
.from(workflowExecutionLogs)
|
|
.where(eq(workflowExecutionLogs.executionId, executionId))
|
|
.limit(1)
|
|
|
|
return extractExecutionState(row?.executionData)
|
|
}
|
|
|
|
export async function getLatestExecutionState(
|
|
workflowId: string
|
|
): Promise<SerializableExecutionState | null> {
|
|
const [row] = await db
|
|
.select({ executionData: workflowExecutionLogs.executionData })
|
|
.from(workflowExecutionLogs)
|
|
.where(
|
|
and(
|
|
eq(workflowExecutionLogs.workflowId, workflowId),
|
|
sql`${workflowExecutionLogs.executionData} -> 'executionState' IS NOT NULL`
|
|
)
|
|
)
|
|
.orderBy(desc(workflowExecutionLogs.startedAt))
|
|
.limit(1)
|
|
|
|
return extractExecutionState(row?.executionData)
|
|
}
|