Files
Jyotisha/frontend/src/lib/rectification-activity-receipt.ts
T
Jesse_Chen 2e17ccad64
Independent Staging Quality Gate / validate (push) Failing after 30m22s
Independent Staging Quality Gate / publish (push) Has been skipped
fix(rectification): restore message actions and retry receipts
2026-08-14 00:10:22 +08:00

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 } : {}),
};
}