UNPKG

@assistant-ui/react

Version:

Typescript/React library for AI Chat

1 lines 5.29 kB
{"version":3,"sources":["../../src/model-context/makeAssistantVisible.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useEffect,\n useRef,\n forwardRef,\n ComponentType,\n ForwardedRef,\n PropsWithoutRef,\n useId,\n createContext,\n useContext,\n} from \"react\";\nimport { z } from \"zod\";\nimport { useAssistantRuntime } from \"../context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { tool } from \"./tool\";\n\nconst click = tool({\n parameters: z.object({\n clickId: z.string(),\n }),\n execute: async ({ clickId }) => {\n const escapedClickId = CSS.escape(clickId);\n const el = document.querySelector(`[data-click-id='${escapedClickId}']`);\n if (el instanceof HTMLElement) {\n el.click();\n\n // todo make adjustable\n await new Promise((resolve) => setTimeout(resolve, 2000));\n return {};\n } else {\n return \"Element not found\";\n }\n },\n});\n\nconst edit = tool({\n parameters: z.object({\n editId: z.string(),\n value: z.string(),\n }),\n execute: async ({ editId, value }) => {\n const escapedEditId = CSS.escape(editId);\n const el = document.querySelector(`[data-edit-id='${escapedEditId}']`);\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = value;\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n // todo make adjustable\n await new Promise((resolve) => setTimeout(resolve, 2000));\n return {};\n } else {\n return \"Element not found\";\n }\n },\n});\n\nconst ReadableContext = createContext<boolean>(false);\n\nexport const makeAssistantVisible = <T extends ComponentType<any>>(\n Component: T,\n config?: { clickable?: boolean | undefined; editable?: boolean | undefined },\n) => {\n const ReadableComponent = forwardRef(\n (props: PropsWithoutRef<T>, outerRef: ForwardedRef<any>) => {\n const isNestedReadable = useContext(ReadableContext);\n\n const clickId = useId();\n const componentRef = useRef<HTMLElement>(null);\n\n const assistant = useAssistantRuntime();\n useEffect(() => {\n return assistant.registerModelContextProvider({\n getModelContext: () => {\n return {\n tools: {\n ...(config?.clickable ? { click } : {}),\n ...(config?.editable ? { edit } : {}),\n },\n system: !isNestedReadable // only pass content if this readable isn't nested in another readable\n ? componentRef.current?.outerHTML\n : undefined,\n };\n },\n });\n }, [config?.clickable, config?.editable, isNestedReadable, assistant]);\n\n const ref = useComposedRefs(componentRef, outerRef);\n\n return (\n <ReadableContext.Provider value={true}>\n <Component\n {...(props as any)}\n {...(config?.clickable ? { \"data-click-id\": clickId } : {})}\n {...(config?.editable ? { \"data-edit-id\": clickId } : {})}\n ref={ref}\n />\n </ReadableContext.Provider>\n );\n },\n );\n\n ReadableComponent.displayName = Component.displayName;\n\n return ReadableComponent as unknown as T;\n};\n\nexport default makeAssistantVisible;\n"],"mappings":";;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAClB,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,YAAY;AA6EX;AA3EV,IAAM,QAAQ,KAAK;AAAA,EACjB,YAAY,EAAE,OAAO;AAAA,IACnB,SAAS,EAAE,OAAO;AAAA,EACpB,CAAC;AAAA,EACD,SAAS,OAAO,EAAE,QAAQ,MAAM;AAC9B,UAAM,iBAAiB,IAAI,OAAO,OAAO;AACzC,UAAM,KAAK,SAAS,cAAc,mBAAmB,cAAc,IAAI;AACvE,QAAI,cAAc,aAAa;AAC7B,SAAG,MAAM;AAGT,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AACxD,aAAO,CAAC;AAAA,IACV,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAED,IAAM,OAAO,KAAK;AAAA,EAChB,YAAY,EAAE,OAAO;AAAA,IACnB,QAAQ,EAAE,OAAO;AAAA,IACjB,OAAO,EAAE,OAAO;AAAA,EAClB,CAAC;AAAA,EACD,SAAS,OAAO,EAAE,QAAQ,MAAM,MAAM;AACpC,UAAM,gBAAgB,IAAI,OAAO,MAAM;AACvC,UAAM,KAAK,SAAS,cAAc,kBAAkB,aAAa,IAAI;AACrE,QAAI,cAAc,oBAAoB,cAAc,qBAAqB;AACvE,SAAG,QAAQ;AACX,SAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACtD,SAAG,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAGvD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AACxD,aAAO,CAAC;AAAA,IACV,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAED,IAAM,kBAAkB,cAAuB,KAAK;AAE7C,IAAM,uBAAuB,CAClC,WACA,WACG;AACH,QAAM,oBAAoB;AAAA,IACxB,CAAC,OAA2B,aAAgC;AAC1D,YAAM,mBAAmB,WAAW,eAAe;AAEnD,YAAM,UAAU,MAAM;AACtB,YAAM,eAAe,OAAoB,IAAI;AAE7C,YAAM,YAAY,oBAAoB;AACtC,gBAAU,MAAM;AACd,eAAO,UAAU,6BAA6B;AAAA,UAC5C,iBAAiB,MAAM;AACrB,mBAAO;AAAA,cACL,OAAO;AAAA,gBACL,GAAI,QAAQ,YAAY,EAAE,MAAM,IAAI,CAAC;AAAA,gBACrC,GAAI,QAAQ,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,cACrC;AAAA,cACA,QAAQ,CAAC,mBACL,aAAa,SAAS,YACtB;AAAA,YACN;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,GAAG,CAAC,QAAQ,WAAW,QAAQ,UAAU,kBAAkB,SAAS,CAAC;AAErE,YAAM,MAAM,gBAAgB,cAAc,QAAQ;AAElD,aACE,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,MAC/B;AAAA,QAAC;AAAA;AAAA,UACE,GAAI;AAAA,UACJ,GAAI,QAAQ,YAAY,EAAE,iBAAiB,QAAQ,IAAI,CAAC;AAAA,UACxD,GAAI,QAAQ,WAAW,EAAE,gBAAgB,QAAQ,IAAI,CAAC;AAAA,UACvD;AAAA;AAAA,MACF,GACF;AAAA,IAEJ;AAAA,EACF;AAEA,oBAAkB,cAAc,UAAU;AAE1C,SAAO;AACT;AAEA,IAAO,+BAAQ;","names":[]}