ai-chatbot/components/canvas/chat-panel/clawd-request-state.ts

61 lines
1.5 KiB
TypeScript

export type ClawdRequestState<TProgress> = {
userMessageId: string;
hint: string | null;
progressEvents: TProgress[];
};
export type ClawdRequestStateByChatId<TProgress> = Record<
string,
ClawdRequestState<TProgress>
>;
export function startClawdRequestState<TProgress>(
previousState: ClawdRequestStateByChatId<TProgress>,
chatSessionId: string,
userMessageId: string,
hint: string | null
): ClawdRequestStateByChatId<TProgress> {
return {
...previousState,
[chatSessionId]: {
userMessageId,
hint,
progressEvents: [],
},
};
}
export function updateClawdRequestState<TProgress>(
previousState: ClawdRequestStateByChatId<TProgress>,
chatSessionId: string,
userMessageId: string,
updater: (
currentState: ClawdRequestState<TProgress>
) => ClawdRequestState<TProgress>
): ClawdRequestStateByChatId<TProgress> {
const currentState = previousState[chatSessionId];
if (!currentState || currentState.userMessageId !== userMessageId) {
return previousState;
}
return {
...previousState,
[chatSessionId]: updater(currentState),
};
}
export function clearClawdRequestState<TProgress>(
previousState: ClawdRequestStateByChatId<TProgress>,
chatSessionId: string,
userMessageId: string
): ClawdRequestStateByChatId<TProgress> {
const currentState = previousState[chatSessionId];
if (!currentState || currentState.userMessageId !== userMessageId) {
return previousState;
}
const nextState = { ...previousState };
delete nextState[chatSessionId];
return nextState;
}