diff --git a/surfsense_web/components/tool-ui/onedrive/create-file.tsx b/surfsense_web/components/tool-ui/onedrive/create-file.tsx index 244b894dc..502394986 100644 --- a/surfsense_web/components/tool-ui/onedrive/create-file.tsx +++ b/surfsense_web/components/tool-ui/onedrive/create-file.tsx @@ -16,6 +16,8 @@ import { SelectValue, } from "@/components/ui/select"; import { useHitlPhase } from "@/hooks/use-hitl-phase"; +import { isInterruptResult, useHitlDecision } from "@/lib/hitl"; +import type { InterruptResult, HitlDecision } from "@/lib/hitl"; interface OneDriveAccount { id: number; @@ -24,20 +26,10 @@ interface OneDriveAccount { auth_expired?: boolean; } -interface InterruptResult { - __interrupt__: true; - __decided__?: "approve" | "reject" | "edit"; - __completed__?: boolean; - action_requests: Array<{ name: string; args: Record }>; - review_configs: Array<{ - action_name: string; - allowed_decisions: Array<"approve" | "edit" | "reject">; - }>; - context?: { - accounts?: OneDriveAccount[]; - parent_folders?: Record>; - error?: string; - }; +interface OneDriveCreateFileContext { + accounts?: OneDriveAccount[]; + parent_folders?: Record>; + error?: string; } interface SuccessResult { @@ -59,16 +51,7 @@ interface AuthErrorResult { connector_type?: string; } -type CreateOneDriveFileResult = InterruptResult | SuccessResult | ErrorResult | AuthErrorResult; - -function isInterruptResult(result: unknown): result is InterruptResult { - return ( - typeof result === "object" && - result !== null && - "__interrupt__" in result && - (result as InterruptResult).__interrupt__ === true - ); -} +type CreateOneDriveFileResult = InterruptResult | SuccessResult | ErrorResult | AuthErrorResult; function isErrorResult(result: unknown): result is ErrorResult { return ( @@ -94,12 +77,8 @@ function ApprovalCard({ onDecision, }: { args: { name: string; content?: string }; - interruptData: InterruptResult; - onDecision: (decision: { - type: "approve" | "reject" | "edit"; - message?: string; - edited_action?: { name: string; args: Record }; - }) => void; + interruptData: InterruptResult; + onDecision: (decision: HitlDecision) => void; }) { const { phase, setProcessing, setRejected } = useHitlPhase(interruptData); const [isPanelOpen, setIsPanelOpen] = useState(false); @@ -434,17 +413,14 @@ export const CreateOneDriveFileToolUI = ({ args, result, }: ToolCallMessagePartProps<{ name: string; content?: string }, CreateOneDriveFileResult>) => { + const { dispatch } = useHitlDecision(); if (!result) return null; if (isInterruptResult(result)) { return ( { - window.dispatchEvent( - new CustomEvent("hitl-decision", { detail: { decisions: [decision] } }) - ); - }} + interruptData={result as InterruptResult} + onDecision={(decision) => dispatch([decision])} /> ); } diff --git a/surfsense_web/components/tool-ui/onedrive/trash-file.tsx b/surfsense_web/components/tool-ui/onedrive/trash-file.tsx index b5d2e3d67..5735363c0 100644 --- a/surfsense_web/components/tool-ui/onedrive/trash-file.tsx +++ b/surfsense_web/components/tool-ui/onedrive/trash-file.tsx @@ -7,6 +7,8 @@ import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { useHitlPhase } from "@/hooks/use-hitl-phase"; +import { isInterruptResult, useHitlDecision } from "@/lib/hitl"; +import type { InterruptResult, HitlDecision } from "@/lib/hitl"; interface OneDriveAccount { id: number; @@ -22,13 +24,10 @@ interface OneDriveFile { web_url?: string; } -interface InterruptResult { - __interrupt__: true; - __decided__?: "approve" | "reject"; - __completed__?: boolean; - action_requests: Array<{ name: string; args: Record }>; - review_configs: Array<{ action_name: string; allowed_decisions: Array<"approve" | "reject"> }>; - context?: { account?: OneDriveAccount; file?: OneDriveFile; error?: string }; +interface OneDriveTrashFileContext { + account?: OneDriveAccount; + file?: OneDriveFile; + error?: string; } interface SuccessResult { @@ -52,20 +51,11 @@ interface AuthErrorResult { } type DeleteOneDriveFileResult = - | InterruptResult + | InterruptResult | SuccessResult | ErrorResult | NotFoundResult | AuthErrorResult; - -function isInterruptResult(result: unknown): result is InterruptResult { - return ( - typeof result === "object" && - result !== null && - "__interrupt__" in result && - (result as InterruptResult).__interrupt__ === true - ); -} function isErrorResult(result: unknown): result is ErrorResult { return ( typeof result === "object" && @@ -95,12 +85,8 @@ function ApprovalCard({ interruptData, onDecision, }: { - interruptData: InterruptResult; - onDecision: (decision: { - type: "approve" | "reject"; - message?: string; - edited_action?: { name: string; args: Record }; - }) => void; + interruptData: InterruptResult; + onDecision: (decision: HitlDecision) => void; }) { const { phase, setProcessing, setRejected } = useHitlPhase(interruptData); const [deleteFromKb, setDeleteFromKb] = useState(false); @@ -311,16 +297,13 @@ export const DeleteOneDriveFileToolUI = ({ { file_name: string; delete_from_kb?: boolean }, DeleteOneDriveFileResult >) => { + const { dispatch } = useHitlDecision(); if (!result) return null; if (isInterruptResult(result)) { return ( { - window.dispatchEvent( - new CustomEvent("hitl-decision", { detail: { decisions: [decision] } }) - ); - }} + interruptData={result as InterruptResult} + onDecision={(decision) => dispatch([decision])} /> ); }