77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import type {
|
|
PublicRectificationMethod,
|
|
PublicRectificationTool,
|
|
RectificationActivityStatus,
|
|
} from "./rectification-agentic/v9/public-receipt";
|
|
|
|
export type CompletedActivityReceiptView = Readonly<{
|
|
steps: readonly PublicRectificationTool[];
|
|
methods: readonly PublicRectificationMethod[];
|
|
failedTool?: PublicRectificationTool;
|
|
}>;
|
|
|
|
type ToolTerminalStatus = "completed" | "failed";
|
|
|
|
export type RectificationActivityReceiptState = Readonly<{
|
|
completedSteps: readonly PublicRectificationTool[];
|
|
methods: readonly PublicRectificationMethod[];
|
|
terminalStatus: Readonly<Partial<Record<PublicRectificationTool, ToolTerminalStatus>>>;
|
|
failureOrder: readonly PublicRectificationTool[];
|
|
}>;
|
|
|
|
type ReceiptActivityEvent = Readonly<{
|
|
tool: PublicRectificationTool;
|
|
status: RectificationActivityStatus;
|
|
methods?: readonly PublicRectificationMethod[];
|
|
}>;
|
|
|
|
export function createRectificationActivityReceiptState(): RectificationActivityReceiptState {
|
|
return {
|
|
completedSteps: [],
|
|
methods: [],
|
|
terminalStatus: {},
|
|
failureOrder: [],
|
|
};
|
|
}
|
|
|
|
export function reduceRectificationActivityReceipt(
|
|
state: RectificationActivityReceiptState,
|
|
event: ReceiptActivityEvent,
|
|
): RectificationActivityReceiptState {
|
|
if (event.status === "started") return state;
|
|
|
|
const terminalStatus = { ...state.terminalStatus, [event.tool]: event.status };
|
|
if (event.status === "completed") {
|
|
return {
|
|
completedSteps: state.completedSteps.includes(event.tool)
|
|
? state.completedSteps
|
|
: [...state.completedSteps, event.tool],
|
|
methods: [...new Set([...state.methods, ...(event.methods ?? [])])],
|
|
terminalStatus,
|
|
failureOrder: state.failureOrder.filter((tool) => tool !== event.tool),
|
|
};
|
|
}
|
|
|
|
return {
|
|
...state,
|
|
terminalStatus,
|
|
failureOrder: [
|
|
...state.failureOrder.filter((tool) => tool !== event.tool),
|
|
event.tool,
|
|
],
|
|
};
|
|
}
|
|
|
|
export function receiptFromRectificationActivityState(
|
|
state: RectificationActivityReceiptState,
|
|
): CompletedActivityReceiptView {
|
|
const failedTool = [...state.failureOrder]
|
|
.reverse()
|
|
.find((tool) => state.terminalStatus[tool] === "failed");
|
|
return {
|
|
steps: [...state.completedSteps],
|
|
methods: [...state.methods],
|
|
...(failedTool ? { failedTool } : {}),
|
|
};
|
|
}
|