{"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":[]}