Files
lda-wf/web/apps/console/src/execution/trace-model.ts
T

63 lines
1.8 KiB
TypeScript

export type TraceFrameView = {
readonly nodeId: string;
readonly stepType: string;
readonly outcome: string;
readonly inputSummary: string;
readonly outputSummary: string;
readonly stateChangeCount: number;
readonly raw: Record<string, unknown>;
};
type TraceFrame = {
readonly nodeId: string;
readonly stepType: string;
readonly resolvedInput: Record<string, unknown>;
readonly outcome: string;
readonly output: Record<string, unknown>;
readonly stateChanges: Record<string, unknown>;
};
type TracePage = {
readonly frames: ReadonlyArray<TraceFrame>;
readonly traceStart: number;
readonly traceLimit: number;
readonly traceTruncated: boolean;
};
type TraceFramesResult = {
readonly frames: ReadonlyArray<TraceFrameView>;
readonly traceStart: number;
readonly traceLimit: number;
readonly traceTruncated: boolean;
};
const summarizeObject = (obj: Record<string, unknown>, maxKeys = 3): string => {
const keys = Object.keys(obj);
if (keys.length === 0) return "{}";
const displayed = keys.slice(0, maxKeys);
const parts = displayed.map((k) => `${k}: ${typeof obj[k]}`);
if (keys.length > maxKeys) {
parts.push(`+${keys.length - maxKeys} more`);
}
return `{ ${parts.join(", ")} }`;
};
export const buildTraceFrames = (page: TracePage): TraceFramesResult => {
const frames: TraceFrameView[] = page.frames.map((frame) => ({
nodeId: frame.nodeId,
stepType: frame.stepType,
outcome: frame.outcome,
inputSummary: summarizeObject(frame.resolvedInput),
outputSummary: summarizeObject(frame.output),
stateChangeCount: Object.keys(frame.stateChanges).length,
raw: frame as unknown as Record<string, unknown>,
}));
return {
frames,
traceStart: page.traceStart,
traceLimit: page.traceLimit,
traceTruncated: page.traceTruncated,
};
};