From cda754c1066490d817056daafe598d12f690cd1e Mon Sep 17 00:00:00 2001 From: Emil Schmitz Date: Sat, 25 Jan 2025 17:17:20 +0100 Subject: [PATCH 01/15] feat: add hitl state --- src/state/hitl.ts | 22 ++++++++++++++++++++++ src/state/store.ts | 3 +++ 2 files changed, 25 insertions(+) create mode 100644 src/state/hitl.ts diff --git a/src/state/hitl.ts b/src/state/hitl.ts new file mode 100644 index 0000000..53f997c --- /dev/null +++ b/src/state/hitl.ts @@ -0,0 +1,22 @@ +import { MyStateCreator } from "./store"; +import { Action } from "../helpers/vision-agent/parseResponse"; + +export type HitlSlice = { + proposedAction: Action | null; + setProposedAction: (action: Action | null) => void; + userDecision: "approve" | "reject" | null; + setUserDecision: (decision: "approve" | "reject" | null) => void; +}; + +export const createHitlSlice: MyStateCreator = (set) => ({ + proposedAction: null, + setProposedAction: (action) => + set((state) => { + state.hitl.proposedAction = action; + }), + userDecision: null, + setUserDecision: (decision) => + set((state) => { + state.hitl.userDecision = decision; + }), +}); diff --git a/src/state/store.ts b/src/state/store.ts index e317987..64fc67b 100644 --- a/src/state/store.ts +++ b/src/state/store.ts @@ -5,12 +5,14 @@ import { createJSONStorage, devtools, persist } from "zustand/middleware"; import { createCurrentTaskSlice, CurrentTaskSlice } from "./currentTask"; import { createUiSlice, UiSlice } from "./ui"; import { createSettingsSlice, SettingsSlice } from "./settings"; +import { createHitlSlice, HitlSlice } from "./hitl"; import { findBestMatchingModel } from "../helpers/aiSdkUtils"; export type StoreType = { currentTask: CurrentTaskSlice; ui: UiSlice; settings: SettingsSlice; + hitl: HitlSlice; }; export type MyStateCreator = StateCreator< @@ -27,6 +29,7 @@ export const useAppState = create()( currentTask: createCurrentTaskSlice(...a), ui: createUiSlice(...a), settings: createSettingsSlice(...a), + hitl: createHitlSlice(...a), })), ), { From 7f164c5a305d341de9a1db0fbd6b3d9af393385b Mon Sep 17 00:00:00 2001 From: Emil Schmitz Date: Sat, 25 Jan 2025 17:44:21 +0100 Subject: [PATCH 02/15] feat: make 'safety checkpoints' button in settings --- src/common/Settings.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/common/Settings.tsx b/src/common/Settings.tsx index fbc0aa7..94964e8 100644 --- a/src/common/Settings.tsx +++ b/src/common/Settings.tsx @@ -35,7 +35,7 @@ type SettingsProps = { }; const Settings = ({ setInSettingsView }: SettingsProps) => { - const [view, setView] = useState<"settings" | "knowledge" | "api">( + const [view, setView] = useState<"settings" | "knowledge" | "api" | "hitl">( "settings", ); const state = useAppState((state) => ({ @@ -118,6 +118,11 @@ const Settings = ({ setInSettingsView }: SettingsProps) => { API )} + {view === "hitl" && ( + + Safety Checkpoints + + )} {view === "knowledge" && } @@ -225,6 +230,18 @@ const Settings = ({ setInSettingsView }: SettingsProps) => { Edit + + + Safety Checkpoints + + Define actions that require your approval + + + + + )} From a93f59bf056c4ccdbcf9ba571ec7fc05aa0d51b6 Mon Sep 17 00:00:00 2001 From: Emil Schmitz Date: Sat, 25 Jan 2025 18:50:38 +0100 Subject: [PATCH 03/15] feat: add HITL settings form and integration in settings --- src/common/HITLSettings/NewHITLForm.tsx | 63 ++++++++++++++++++++++++ src/common/HITLSettings/index.tsx | 64 +++++++++++++++++++++++++ src/common/Settings.tsx | 7 ++- 3 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 src/common/HITLSettings/NewHITLForm.tsx create mode 100644 src/common/HITLSettings/index.tsx diff --git a/src/common/HITLSettings/NewHITLForm.tsx b/src/common/HITLSettings/NewHITLForm.tsx new file mode 100644 index 0000000..f097847 --- /dev/null +++ b/src/common/HITLSettings/NewHITLForm.tsx @@ -0,0 +1,63 @@ +import React from "react"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalBody, + ModalCloseButton, + FormControl, + FormLabel, + Input, + Textarea, + Button, + VStack, +} from "@chakra-ui/react"; + +type NewHITLFormProps = { + isOpen: boolean; + isEditMode: boolean; + editRule?: { + id: string; + pattern: string; + description: string; + }; + closeForm: () => void; +}; + +const NewHITLForm: React.FC = ({ + isOpen, + isEditMode, + // editRule, // Unused for now + closeForm, +}) => { + // TODO: Implement form logic + return ( + + + + + {isEditMode ? "Edit Safety Checkpoint" : "Add Safety Checkpoint"} + + + + + + Description + + + + Pattern +