@sanity/assist
6.2.36.2.4
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{x: 0, y: 0}","() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }","[]","scrollParent","relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n }","boundsScroll.x","useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )","relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n }","scroll.x","useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )","{bounds, element, ref}","_c","() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }","[bounds, element, onRectsChange]","<div {...restProps} ref={ref}>\n {children}\n </div>","_c","() => store.from.subscribe(key, {zIndex})","from","[key, store, zIndex]","() => {\n if (rects) store.from.next(key, rects)\n }","[key, rects, store]","<ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>","_c","createConnectorsStore()","useMemo(() => createConnectorsStore(), [])","() => onConnectorsChange && store.connectors.subscribe(onConnectorsChange)","[onConnectorsChange, store]","<ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>","ConnectorsStoreContext.Provider","_c","getPathKey(path)","useMemo(() => {\n return getPathKey(path)\n }, [path])","_c","firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined","(member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType)","useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])","<FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>","children","FirstAssistedPathContext.Provider","_c","_temp","{\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps","assistDocumentId(documentTypeName)","assistTasksStatusId(documentId ?? '')","documentId ?? ''","{apiVersion: '2023-01-01'}","() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }","[client, assistDocument, documentTypeName, initDoc]","() => {\n // best effort\n }","useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n // oxlint-disable-next-line no-map-spread\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])","typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })","assistDocument?.fields","tasks","id","assistDocument?.fields ?? []","fields","instruction","task","_c","_temp","{documentId, schemaType: documentSchemaType}","() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }","id","tasks\n ?.filter","(run) => [run._key, run]","task","(task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date())","[tasks, previousTasks, toast, currentUser, assistDocLoaded]","_c","_temp","_temp2","<AssistInput {...props} />","props.renderDefault(props)","props.renderDefault","<AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />","props as ObjectInputProps","{documentId, ...props}: ObjectInputProps & {documentId: string}","useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as ObjectSchemaType\n }, [props.schemaType])","{\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n }","type","{\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","schemaType","props.renderDefault({...props, schemaType})","<FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>","members","props.members","{minWidth: 0}","<ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>","`${paneKey}_${pathKey}`","_c","getTypePath(doc, pathString)","useMemo(() => getTypePath(doc, pathString), [doc, pathString])","documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : []","useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : [],\n [documentSchemaType, getFieldRefs],\n )","path ? selectableFields?.find((f) => f.key === path) : undefined","selectableFields?.find","useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])","paneRouter.params ?? {}","params","{...paneRouter, params: paneRouter.params ?? {}}","useMemo(() => ({...paneRouter, params: paneRouter.params ?? {}}), [paneRouter])","_c","{apiVersion: API_VERSION_WITH_EXTENDED_TYPES}","customApiClient ? customApiClient(client) : client","useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )","({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","id","{\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest","useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n translate,\n loading,\n }","useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )","({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","{path, documentId}: {path: string; documentId: string}","useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n generateCaption,\n loading,\n }","useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )","({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n generateImage,\n loading,\n }","useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )","() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }","useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])","{\n loading,\n initInstruct,\n }","{assist: assistConfig}","(request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n }","assistConfig?.localeSettings","useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )","{\n runInstruction,\n loading,\n }","useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )","_c","async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }","{title, inputs}","inputs","(input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n })","useCallback(async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }, [])","(req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n }","userInputBlocks","(block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block]","useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )","() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }","useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }, [resolveUserInput])","() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }","request","instruction","([key, value]) => ({\n blockKey: key,\n userInput: value,\n })","i","input","useCallback(() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs, resolveUserInput])","Object.entries(inputs).filter(([, value]) => !!value)","([, value]) => !!value","{width: '100%'}","<Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />","{runInstruction, getUserInput, instructionLoading: loading}","useMemo(\n () => ({runInstruction, getUserInput, instructionLoading: loading}),\n [getUserInput, loading, runInstruction],\n )","open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null","block","<RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>","children","RunInstructionContext.Provider","value","[, value]","[key, value]","(e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n }","useCallback(\n // oxlint-disable-next-line no-deprecated\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )","() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }","[autoFocus]","<FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />","description","block?.message ?? 'Provide more context'","{resize: 'vertical'}","<TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />","<Stack padding={2} gap={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>","_c","_temp","_temp2","_temp3","_temp4","isSyncing = false","(signals: DocumentSignals) => {\n queuedRef.current = advance(queuedRef.current, signals, {documentOnChange, task})\n }","() => {\n advanceQueue({isDocAssistable, isSyncing})\n }","[isDocAssistable, isSyncing]","(taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n }","useCallback(\n (taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n },\n [isDocAssistable, isSyncing, documentOnChange, task],\n )","_c","{\n ...args,\n task: runInstruction,\n }","{\n instructionLoading,\n requestRunInstruction,\n }","_c","useMemo(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])","schema.get(documentType)","getFieldRefs(documentType)","getFieldRefsByTypePath(documentType)","{\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }","useMemo(() => {\n return {\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }\n }, [getFieldRefs, getFieldRefsByTypePath, documentType])","editState || {}","getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType.liveEdit,\n releaseId: selectedReleaseId,\n })","liveEdit","selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)","getPublishedId(documentId)","{\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n }","useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n documentIsSyncing,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n ])","{\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }","{...base, loading: true, assistDocument: undefined}","{\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }","() => []","(task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }","useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }, [])","(task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }","current","task","useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }, [])","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSyntheticTasks([])\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","[assistableDocumentId]","{\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }","_c","value","_temp","<AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>","children","AssistDocumentContext.Provider","_c","props.renderDefault(props)","props.renderDefault","<AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>","_c","{\n children,\n durationMs = 250,\n ref,\n}: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n ref?: Ref<HTMLDivElement>\n}","durationMs = 250","{animationDuration: `${durationMs}ms`}","`${durationMs}ms`","<FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>","_c","state = 'present'","useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }, [scheme])","{\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","{\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","<Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>","{color: 'inherit'}","<IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>","<Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>","_c","{position: 'relative', background: 'transparent'}","<Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>","<Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>","_c","useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && statusSegment && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])","path.length","tasks\n ?.filter","(task) => !task.ended","(task) => task.presence ?? []","(p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs","(status) => aiPresence(status, path)","task","_c","_temp","_temp2","_temp3","props.renderDefault(props)","props.renderDefault","<AssistField {...props}>{props.children}</AssistField>","isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)","schemaType","singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )","<Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n </Flex>","props.renderDefault({\n ...props,\n\n actions: props.actions,\n\n // Render presence in the internal slot (between presence and the field actions)\n // oxlint-disable-next-line no-deprecated -- the slot is deprecated for external use but exists specifically for this plugin\n __internal_slot: actions,\n })","_c","<PteValueFixer {...props} />","<ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>","onChange","(params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }","useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])","() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }","useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])","() => setError(undefined)","useCallback(() => setError(undefined), [])","<ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>","children","error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack gap={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )","props.renderDefault({...props, value: undefined})","props.renderDefault(props)","props.renderDefault","_c","(patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n }","useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )","props.renderDefault(props)","props.renderDefault","<Box flex={1}>{props.renderDefault(props)}</Box>","singlePresence && <AiFieldPresence presence={singlePresence} />","<Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>","<ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>","_c","props.renderDefault(props)","props.renderDefault","<>{props.renderDefault(props)}</>","<InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>","value","InlineBlockValueContext.Provider","props.value","_c","_Fragment","{position: 'relative'}","props.renderDefault({...props})","<Box flex={1}>{props.renderDefault({...props})}</Box>","presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))","(pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n )","<Flex align=\"center\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>","_c","_temp","createPatchChannel()","useMemo(() => createPatchChannel(), [])","() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }","pair","[documentId, documentStore, documentType, patchChannel]","() => {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n }","() => {\n if (hasRev) {\n // React to changes in hasRev only\n patchChannelPublish()\n }\n }","[hasRev]","() => {\n focusFirstDescendant(formRef.current!)\n }","[]","<Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>","<Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>","ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )","<Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>","_c","DEFAULT_MAX_DEPTH","ABSOLUTE_MAX_DEPTH","<div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>","<Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>","<Box padding={4}>\n <Container width={0}>\n <Stack gap={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>","_c","() => !isFeatureOnboardingDismissed(featureKey)","() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }","useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])","{showOnboarding, dismissOnboarding}","_c","useMemo(() => {\n const refs = getFieldRefs(schemaType.name)\n if (includeDocument) {\n return [getDocumentFieldRef(schemaType), ...refs]\n }\n return refs\n }, [schemaType, includeDocument, getFieldRefs])","schemaType.name","getDocumentFieldRef(schemaType)","fieldRefs.find((f) => f.key === fieldPath)","(f) => f.key === fieldPath","useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )","fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field}))","(field) => (filter ? filter(field) : true)","(f) => !isType(f.schemaType, 'reference')","(field) => ({value: field.key, field})","useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )","useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>\n <field.icon />\n </Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])","useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])","useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])","<Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />","currentField ? currentField.icon : SearchIcon","currentField?.key","option","value","field","field.icon","f","Breadcrumbs","Box","{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }","<Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>","1","splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))","\"none\"","title","(pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n )","<Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>","splitTitle[splitTitle.length - 1]","<Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>","<Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>","_c","_temp","_temp2","_temp3","_temp4","_temp5","_temp6","(n) => n + 1","() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }","[ms]","{date}: {date?: string}","formatDistanceToNow(date ? new Date(date) : new Date())","<span title={timeSince}>{timeSince} ago</span>","_c","_temp","{apiVersion: '2023-01-01'}","(taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n }","useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )","instructions?.find","tasks\n ?.filter","(task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs","task","(a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime()","useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n // oxlint-disable-next-line no-map-spread\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])","titledTasks.some((r) => !r.ended)","(r) => !r.ended","useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])","titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout')","(r) => r.reason === 'error' || r.reason === 'timeout'","useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )","() => setOpen((v) => !v)","(v) => !v","useCallback(() => setOpen((v) => !v), [])","() => {\n setOpen(false)\n }","useCallback(() => {\n setOpen(false)\n }, [])","() => [button, popover]","() => {\n setOpen(false)\n button?.focus()\n }","button?.focus","useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])","<TaskList onEscape={handleEscape} tasks={titledTasks} />","<TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />","!titledTasks?.length","<Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>","open && !!titledTasks?.length","r","<StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />","isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon","hasErrors ? 'critical' : undefined","(event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n }","useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n )","tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))","(task) => (\n <TaskItem key={task._key} task={task} />\n )","<Stack padding={1} gap={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>","TaskIcon && <TaskIcon />","!task.reason && <Spinner />","reason","<Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>","task.title && <>: {task.title}</>","title","<Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>","taskType ? taskType.title : 'Running'","task.message ? <Text size={1}>{task.message}</Text> : null","message","<Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>","task.ended ?? task.started","<Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>","<Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>","!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )","cancel","ended","<Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>","<Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>","taskType && taskType?.tone","_c","_temp","_temp2","_temp3","_temp4","_temp5","_Fragment","isEqual","<Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack gap={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>","<DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />","onClose","<Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>","<a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>","<Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>","<Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>\n </Flex>","context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null","error","!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null","initialized","!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null","status?.initialized","context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )","!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )","context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined","initLoading","<Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />","init","context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`","<Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>","<Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>","<AssistInspector {...props} />","(nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n }","useCallback<PaneRouterContextValue['setParams']>(\n (nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n },\n [parentParams, parentSetParams],\n )","{...parentParams, path: localPath}","{\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }","useMemo<PaneRouterContextValue>(\n () => ({\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }),\n [parentRouter, parentParams, localPath, setParams],\n )","<PaneRouterContext.Provider value={value}>{props.children}</PaneRouterContext.Provider>","children","PaneRouterContext.Provider","{marginTop: '-4px'}","<Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>","<Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>","<Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>","<Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>","showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />","<CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>","_c","_Fragment","mapConnectorToLine(options, {from, to})","useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])","drawConnectorPath(options, line)","<path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />","strokeWidth + 4","bg","rgba(theme.sanity.color.base.border, 0.5)","border","<path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />","line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )","bounds","isAbove","x","options.arrow.marginX","line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )","isBelow","<>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>","_c","_Fragment","() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n // oxlint-disable-next-line react/set-state-in-effect\n setRedraw(true)\n }","[]","{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }","connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))","(connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n )","<svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>","DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })","({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n }","<>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>","{key, from, to}","_c","_temp","_Fragment","() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }","useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])","{\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n }","config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES","(\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n }","maxPathDepth","translationOutputs","languages","l","(l) => l.id","useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )","(\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n }","toLanguages","useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )","async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n }","config?.selectLanguageParams","params","fromLanguage","useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )","{\n openFieldTranslation,\n translationLoading: false,\n }","useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])","!fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)","fieldLanguageMaps?.length","fieldTranslationParams.translatePath","length","() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }","conditionalMembers","documentSchema","translatePath","toLanguages?.find","useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])","{width: '100%'}","<Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />","dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null","<FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>","children","FieldTranslationContext.Provider","() => toggleToLanguage(checkboxLanguage, toLanguages, languages)","useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )","langId === fromLanguage?.id ? {opacity: 0.5} : undefined","id","langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)","<Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />","langId === fromLanguage?.id","<Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>","checkboxLanguage.title ?? langId","<Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>","() => selectFromLanguage(radioLanguage, languages, fieldTranslationParams)","useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )","<Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />","<Text>{radioLanguage.title ?? radioLanguage.id}</Text>","radioLanguage.title ?? radioLanguage.id","<Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>","_c","_temp","_temp2","createFieldRefs","serializeSchema(schema, {leanFormat: true})","useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])","() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n })\n }","[getInstructStatus]","async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }","status","e","useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])","{\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }","useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }\n }, [\n config,\n status,\n init,\n statusLoading,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n ])","<AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>","AiAssistanceConfigContext.Provider","createFieldRefCache(maxFieldSelectionDepth)","function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }","{\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }","documentType","useMemo(() => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n\n function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }\n\n return {\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }\n }, [schema, maxFieldSelectionDepth])","_c","[]","props.renderDefault(props)","props.renderDefault","<ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>","<RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>","<AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>","config","props.config","_c","{\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n }","() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !documentIsSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n // oxlint-disable-next-line react/set-state-in-effect\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaptionWhenDraftReady({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }","[\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaptionWhenDraftReady,\n documentIsSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ]","descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined","imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined","descriptionField","{\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }","useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])","props.renderDefault(props)","props.renderDefault","<ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>","ImageContext.Provider","_c","Object.keys(icons)\n .filter(isIconSymbol)","Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />)","useMemo(\n () =>\n Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />),\n [onChange],\n )","getIcon(value)","useMemo(() => getIcon(value), [value])","<Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />","{maxHeight: 300}","<Menu style={{maxHeight: 300}}>{items}</Menu>","{portal: true}","<MenuButton\n button={\n <Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />","{\n iconKey: key,\n onChange,\n}: {\n iconKey: IconSymbol\n onChange: StringInputProps['onChange']\n}","() => onChange(set(key))","useCallback(() => onChange(set(key)), [onChange, key])","<Icon symbol={key} />","<MenuItem icon={<Icon symbol={key} />} title={key} text={key} onClick={onClick} />","_c","isAssistSupported(schemaType)","useMemo(() => isAssistSupported(schemaType), [schemaType])","_c","node","node","node","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>","['bottom']","<Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>","_c","<Icon symbol={getIcon(instruction.icon)} />","_c","useMemo(() => {\n const anyPresence = [...(assistDocument?.tasks ?? []), ...(syntheticTasks ?? [])]\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n // oxlint-disable-next-line react/purity\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n // oxlint-disable-next-line react/purity\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks, syntheticTasks])","tasks","(run) => !run.ended && !run.reason","(run) => run.presence ?? []","(f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000","anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined","anyPresence","anyPresence && <AiFieldPresence presence={anyPresence} />","<Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>","f","run","_c","_temp","_temp2","_temp3","_temp4","() => openInspector(aiInspectorId, {[instructionParam]: undefined as any})","useCallback(\n // oxlint-disable-next-line no-unsafe-type-assertion\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )","<div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n gap={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>","_c","<Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>","<AssistDocumentFormEditable {...props} />","useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])","(fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key","useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])","['fields', {_key: activeKey}]","instruction ? [...base, 'instructions', {_key: instruction}] : base","useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])","schema.get(targetDocumentType)","{\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }","fieldSchema ?? documentSchema","useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )","() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }","[title, documentSchema, onChange, id]","id?.startsWith","useFormCallbacks()","(path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n }","{\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }","useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )","() => {\n if (activePath && !instruction) {\n onPathOpen(activePath)\n }\n }","[activePath, instruction, onPathOpen]","useMemo(() => {\n const fieldError = props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )\n if (fieldError) {\n return <MemberFieldError member={fieldError} />\n }\n return undefined\n }, [props.members])","props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )","members","(m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields'","<MemberFieldError member={fieldError} />","fieldError","<FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />","instruction && <BackToInstructionListLink />","activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )","!activePath && props.renderDefault(props)","props.renderDefault","<Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>","<SelectedFieldContextProvider value={context}>\n <Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>","useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])","stringToPath(fieldPath)","{\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}","{__presets: presets}","fields?.find((f) => f._key === pathKey)","fields?.find","useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])","presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )","fields","existingInstructions?.some","f","() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map((preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","missingPresetInstructions?.length","(preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })","[activePath, onChange, pathKey, existingField, missingPresetInstructions]","(p) => ({markDefs: [], ...p})","_c","_temp","_temp3","_temp2","{width: '100%'}","<Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>","selectedField?.title ?? 'Select field'","<Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {/* oxlint-disable-next-line no-unsafe-type-assertion */}\n {actions as any}\n </Flex>","actions as any","_c","() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }","id","useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])","{margin: '-3px 0'}","<div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>","elementProps","`${!value}`","!value","<Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>","<Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>","_c","() => {\n ref.current?.querySelector('input')?.focus()\n }","[]","(path: string) => onChange(set(path))","useCallback((path: string) => onChange(set(path)), [onChange])","(field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n }","(s) => s.includes('|')","useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )","props.renderDefault(props)","props.renderDefault","{minWidth: 300}","<Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>","value","_c","_temp","[4, 4, 4, 5]","<Stack gap={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>","{fieldName, ...props}: ObjectInputProps & {fieldName: string}","findFieldMember(props.members, fieldName)","members","member ? <ObjectInputMember {...props} member={member} /> : null","useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])","{\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n }","titleMember?.field.schemaType","{\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n }","titleMember?.field","{\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }","<Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>","<Text muted size={1}>\n How this instruction appears in menus\n </Text>","iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )","moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )","<Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>","<Stack gap={5}>\n <Stack gap={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>","findFieldMember(members, 'userId')","visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />","<>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>","_c","_Fragment","<EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>","{\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}","() => setOpen(true)","useCallback(() => setOpen(true), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","_c","<ObjectOutputInput {...props} fieldSchema={fieldSchema} />","<ArrayOutputInput {...props} fieldSchema={fieldSchema} />","() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }","[allowedValues, value, onChange]","value?.filter","{\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}","fieldSchema.fields.filter((field) => isAssistSupported(field.type))","fields","(field) => isAssistSupported(field.type)","useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )","(checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n }","length","(field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n })","useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )","fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })","(field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n }","field","<Stack gap={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>","{\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}","fieldSchema.of.filter((itemType) => isAssistSupported(itemType))","of","(itemType) => isAssistSupported(itemType)","useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )","(checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n }","(field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n })","useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )","ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })","(itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n }","itemType","<Stack gap={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>","{\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}","!arrayValue?.length || !!arrayValue?.find((v) => v._key === value)","arrayValue?.length","() => onChange(checked, value)","useCallback(() => onChange(checked, value), [onChange, checked, value])","<Checkbox checked={checked} onChange={handleChange} />","{cursor: 'default'}","<Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>","<Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>","<Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>","_c","_temp","_temp2","<Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>","props.renderDefault(props)","props.renderDefault","<PteMods>\n <Stack gap={3}>\n <Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n\n {props.renderDefault(props)}\n </Stack>\n </PteMods>","() => {\n // Legacy alpha documents only need this conversion once on first load.\n if (didRunRef.current) {\n return\n }\n didRunRef.current = true\n\n let needsFix = false\n // oxlint-disable-next-line no-unsafe-type-assertion\n const val = ((value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block],\n })\n })\n\n if (needsFix) {\n onChange(set(val))\n }\n }","[onChange, value]","_c","originalValue ?? []","(originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id)","id","(v) => !v.userId || v.userId === user?.id","useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )","originalMembers ?? []","(originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n })","(v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }","v","value","useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )","props.renderDefault({...props, value, members})","_c","() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }","[ref]","props.renderDefault(props)","props.renderDefault","<Box ref={ref}>{props.renderDefault(props)}</Box>","_c","params: Params = DEFAULT_PARAMS","options: ListenQueryOptions = DEFAULT_OPTIONS","{apiVersion: `v2022-05-09`}","() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(true)\n setLoading(false)\n setData(null)\n\n return of(null)\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }","[query, params, options, client]","{loading, error, data}","_c","isEqual","{apiVersion: '2023-01-01'}","{\n type: assistSerializedTypeName,\n }","serializeSchema(schema)","useMemo(() => {\n return serializeSchema(schema)\n }, [schema])","() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }","types.length","useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])","{height: 'calc(100vh - 81px)'}","saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon","<Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>","<Label>Studio schema</Label>","types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))","(type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n )","<Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>","<Label>Stored schema</Label>","(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))","data ?? NO_DATA","<Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>","<Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>","<Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack gap={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>","type","{schemaStub}: {schemaStub: SerializedSchemaType}","JSON.stringify(schemaStub, null, 2)","useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])","<pre>{out}</pre>","_c","\"fontSize\"","\"rev\"","\"title\""],"sources":["../src/_lib/connector/helpers.ts","../src/_lib/connector/useRegionRects.ts","../src/_lib/connector/ConnectorRegion.tsx","../src/_lib/connector/ConnectorsStoreContext.ts","../src/_lib/connector/useConnectorsStore.ts","../src/_lib/connector/ConnectFromRegion.tsx","../src/_lib/connector/ConnectorsStore.ts","../src/_lib/connector/ConnectorsProvider.tsx","../src/_lib/connector/mapConnectorToLine.ts","../src/_lib/form/constants.ts","../src/types.ts","../src/helpers/misc.ts","../src/helpers/typeUtils.ts","../src/helpers/assistSupported.ts","../src/onboarding/FirstAssistedPathProvider.tsx","../src/constants.ts","../src/helpers/ids.ts","../src/assistDocument/hooks/useDocumentState.ts","../src/assistDocument/hooks/useStudioAssistDocument.ts","../src/assistDocument/hooks/useInstructionToaster.tsx","../src/assistDocument/AssistDocumentInput.tsx","../src/assistDocument/AssistDocumentContext.tsx","../src/assistLayout/AiAssistanceConfigContext.tsx","../src/assistInspector/helpers.ts","../src/useApiClient.ts","../src/assistLayout/RunInstructionProvider.tsx","../src/assistDocument/useDraftDelayedTask.ts","../src/assistDocument/RequestRunInstructionProvider.tsx","../src/assistDocument/hooks/useAssistDocumentContextValue.tsx","../src/assistDocument/AssistDocumentContextProvider.tsx","../src/assistDocument/AssistDocumentLayout.tsx","../src/components/FadeInContent.tsx","../src/presence/AssistAvatar.tsx","../src/presence/AiFieldPresence.tsx","../src/presence/useAssistPresence.ts","../src/assistFormComponents/AssistField.tsx","../src/components/SafeValueInput.tsx","../src/assistFormComponents/AssistFormBlock.tsx","../src/assistFormComponents/AssistInlineFormBlock.tsx","../src/assistFormComponents/AssistItem.tsx","../src/_lib/form/DocumentForm.tsx","../src/assistDocument/components/AssistTypeContext.tsx","../src/helpers/conditionalMembers.ts","../src/onboarding/InspectorOnboarding.tsx","../src/onboarding/onboardingStore.ts","../src/assistInspector/FieldAutocomplete.tsx","../src/components/TimeAgo.tsx","../src/assistInspector/InstructionTaskHistoryButton.tsx","../src/assistInspector/isolatePathParams.ts","../src/assistInspector/AssistInspector.tsx","../src/assistInspector/constants.ts","../src/assistInspector/index.ts","../src/assistConnectors/draw/arrowPath.ts","../src/assistConnectors/draw/connectorPath.ts","../src/assistConnectors/ConnectorPath.tsx","../src/assistConnectors/AssistConnectorsOverlay.tsx","../src/helpers/styleguide.ts","../src/translate/getLanguageParams.ts","../src/translate/languageStore.ts","../src/_lib/randomKey.ts","../src/translate/paths.ts","../src/translate/FieldTranslationProvider.tsx","../src/schemas/serialize/schemaUtils.ts","../src/schemas/serialize/serializeSchema.ts","../src/assistLayout/fieldRefCache.tsx","../src/assistLayout/AiAssistanceConfigProvider.tsx","../src/assistLayout/AssistLayout.tsx","../src/components/ImageContext.tsx","../src/assistDocument/components/instruction/appearance/IconInput.tsx","../src/helpers/useAssistSupported.ts","../src/translate/translateActions.tsx","../src/fieldActions/customFieldActions.tsx","../src/fieldActions/generateCaptionActions.tsx","../src/fieldActions/generateImageActions.tsx","../src/fieldActions/PrivateIcon.tsx","../src/fieldActions/assistFieldActions.tsx","../src/presence/AssistDocumentPresence.tsx","../src/assistDocument/components/instruction/BackToInstructionsLink.tsx","../src/assistDocument/components/SelectedFieldContext.tsx","../src/assistDocument/components/AssistDocumentForm.tsx","../src/assistDocument/components/FieldRefPreview.tsx","../src/assistDocument/components/generic/HiddenFieldTitle.tsx","../src/assistDocument/components/instruction/appearance/InstructionVisibility.tsx","../src/assistDocument/components/instruction/FieldRefInput.tsx","../src/assistDocument/components/helpers.ts","../src/assistDocument/components/instruction/InstructionInput.tsx","../src/assistDocument/components/instruction/InstructionOutputField.tsx","../src/assistDocument/components/instruction/InstructionOutputInput.tsx","../src/assistDocument/components/instruction/PromptInput.tsx","../src/assistDocument/components/InstructionsArrayField.tsx","../src/assistDocument/components/InstructionsArrayInput.tsx","../src/components/HideReferenceChangedBannerInput.tsx","../src/schemas/contextDocumentSchema.tsx","../src/schemas/assistDocumentSchema.tsx","../src/schemas/index.ts","../src/plugin.tsx","../src/_lib/fixedListenQuery.ts","../src/_lib/useListeningQuery.ts","../src/schemas/serialize/SchemTypeTool.tsx","../src/fieldActions/useUserInput.ts"],"sourcesContent":["export function hasOverflowScroll(el: HTMLElement): boolean {\n const overflow = getComputedStyle(el).overflow\n\n return overflow.includes('auto') || overflow.includes('hidden') || overflow.includes('scroll')\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {hasOverflowScroll} from './helpers'\nimport type {Rect, Scroll} from './types'\n\nexport function useRegionRects() {\n const ref = useRef<HTMLDivElement>(null)\n\n const [relativeBoundsRect, setRelativeBoundsRect] = useState<Rect | null>(null)\n const [relativeElementRect, setRelativeElementRect] = useState<Rect | null>(null)\n const [boundsScroll, setBoundsScroll] = useState<Scroll>({x: 0, y: 0})\n const [scroll, setScroll] = useState<Scroll>({x: 0, y: 0})\n\n const boundsScrollXRef = useRef(0)\n const boundsScrollYRef = useRef(0)\n\n const elementScrollXRef = useRef(0)\n const elementScrollYRef = useRef(0)\n\n useEffect(() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const bounds: Rect | null = useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )\n\n const element: Rect | null = useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )\n\n return {bounds, element, ref}\n}\n","import {type HTMLProps, useEffect} from 'react'\n\nimport type {ConnectorRegionRects} from './types'\nimport {useRegionRects} from './useRegionRects'\n\nexport function ConnectorRegion(\n props: {\n onRectsChange?: (rects: ConnectorRegionRects | null) => void\n } & HTMLProps<HTMLDivElement>,\n) {\n const {children, onRectsChange, ...restProps} = props\n\n const {bounds, element, ref} = useRegionRects()\n\n useEffect(() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }, [bounds, element, onRectsChange])\n\n return (\n <div {...restProps} ref={ref}>\n {children}\n </div>\n )\n}\n","import {createContext} from 'react'\n\nimport type {ConnectorsStore} from './ConnectorsStore'\n\nexport const ConnectorsStoreContext = createContext<ConnectorsStore | null>(null)\n","import {useContext} from 'react'\n\nimport type {ConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\n\nexport function useConnectorsStore(): ConnectorsStore {\n const store = useContext(ConnectorsStoreContext)\n\n if (!store) {\n throw new Error('Missing connectors store context')\n }\n\n return store\n}\n","import {type HTMLProps, useEffect, useState} from 'react'\n\nimport {ConnectorRegion} from './ConnectorRegion'\nimport type {ConnectorRegionRects} from './types'\nimport {useConnectorsStore} from './useConnectorsStore'\n\nexport function ConnectFromRegion(\n props: {_key: string; zIndex: number} & HTMLProps<HTMLDivElement>,\n) {\n const {children, _key: key, zIndex, ...restProps} = props\n const store = useConnectorsStore()\n const [rects, setRects] = useState<ConnectorRegionRects | null>(null)\n\n useEffect(() => store.from.subscribe(key, {zIndex}), [key, store, zIndex])\n\n useEffect(() => {\n if (rects) store.from.next(key, rects)\n }, [key, rects, store])\n\n return (\n <ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>\n )\n}\n","import type {Connector, ConnectorRegionRects} from './types'\n\nexport interface ConnectorsStore {\n connectors: {\n subscribe: (observer: (connectors: Connector[]) => void) => () => void\n }\n\n from: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n\n to: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n}\n\nexport function createConnectorsStore(): ConnectorsStore {\n const configKeys: string[] = []\n const fieldKeys: string[] = []\n\n const channels = {\n from: new Map<string, ConnectorRegionRects | null>(),\n to: new Map<string, ConnectorRegionRects | null>(),\n }\n\n const payloads = {\n from: new Map<string, Record<string, unknown> | undefined>(),\n to: new Map<string, Record<string, unknown> | undefined>(),\n }\n\n const observers: ((connectors: Connector[]) => void)[] = []\n\n function notifyObservers() {\n const connectors: Connector[] = []\n\n for (const key of configKeys) {\n const toRects = channels.to.get(key)\n const toPayload = payloads.from.get(key)\n\n const fromRects = channels.from.get(key)\n const fromPayload = payloads.from.get(key)\n\n if (toRects && fromRects) {\n connectors.push({\n key,\n from: {...fromRects, payload: fromPayload},\n to: {...toRects, payload: toPayload},\n })\n }\n }\n\n for (const observer of observers) {\n observer(connectors)\n }\n }\n\n return {\n to: {\n subscribe(key, payload) {\n channels.to.set(key, null)\n payloads.to.set(key, payload)\n\n configKeys.push(key)\n\n return () => {\n channels.to.delete(key)\n payloads.to.delete(key)\n\n const idx = configKeys.indexOf(key)\n\n if (idx > -1) configKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.to.set(key, rects)\n\n if (fieldKeys.includes(key)) notifyObservers()\n },\n },\n\n connectors: {\n subscribe(observer) {\n observers.push(observer)\n\n return () => {\n const idx = observers.indexOf(observer)\n\n if (idx > -1) observers.splice(idx, 1)\n }\n },\n },\n\n from: {\n subscribe(key, payload) {\n channels.from.set(key, null)\n payloads.from.set(key, payload)\n\n fieldKeys.push(key)\n\n return () => {\n channels.from.delete(key)\n payloads.from.delete(key)\n\n const idx = fieldKeys.indexOf(key)\n\n if (idx > -1) fieldKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.from.set(key, rects)\n\n if (configKeys.includes(key)) notifyObservers()\n },\n },\n }\n}\n","import {type ReactNode, useEffect, useMemo} from 'react'\n\nimport {type ConnectorsStore, createConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\nimport type {Connector} from './types'\n\nexport function ConnectorsProvider(props: {\n children?: ReactNode\n onConnectorsChange?: (connectors: Connector[]) => void\n}) {\n const {children, onConnectorsChange} = props\n const store: ConnectorsStore = useMemo(() => createConnectorsStore(), [])\n\n useEffect(\n () => onConnectorsChange && store.connectors.subscribe(onConnectorsChange),\n [onConnectorsChange, store],\n )\n\n return <ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>\n}\n","import type {\n ConnectorLine,\n ConnectorLinePoint,\n ConnectorOptions,\n ConnectorRegionRects,\n Rect,\n} from './types'\n\nfunction getConnectorLinePoint(\n options: ConnectorOptions,\n rect: Rect,\n bounds: Rect,\n): ConnectorLinePoint {\n const centerY = rect.y + rect.h / 2\n const isAbove = rect.y + rect.h < bounds.y + options.arrow.marginY\n const isBelow = rect.y > bounds.y + bounds.h - options.arrow.marginY\n\n return {\n bounds,\n x: rect.x,\n y: centerY,\n centerY,\n startY: rect.y + options.path.marginY,\n endY: rect.y + rect.h - options.path.marginY,\n isAbove,\n isBelow,\n outOfBounds: isAbove || isBelow,\n }\n}\n\nexport function mapConnectorToLine(\n options: ConnectorOptions,\n connector: {from: ConnectorRegionRects; to: ConnectorRegionRects},\n): ConnectorLine {\n const fromBounds: Rect = {\n y: connector.from.bounds.y + options.arrow.threshold,\n // bottom: connector.from.bounds.y + connector.from.bounds.h - options.arrow.threshold,\n x: connector.from.bounds.x,\n // right: connector.from.bounds.x + connector.from.bounds.w,\n w: connector.from.bounds.w,\n h: connector.from.bounds.h - options.arrow.threshold * 2,\n }\n\n const from = getConnectorLinePoint(options, connector.from.element, fromBounds)\n from.x = connector.from.element.x + connector.from.element.w // + 1\n\n const fromBottom = fromBounds.y + fromBounds.h\n\n const toBounds: Rect = {\n y: connector.to.bounds.y + options.arrow.threshold,\n // bottom: connector.to.bounds.y + connector.to.bounds.h - options.arrow.threshold,\n x: connector.to.bounds.x,\n // right: connector.to.bounds.x + connector.to.bounds.w,\n w: connector.to.bounds.w,\n h: connector.to.bounds.h - options.arrow.threshold * 2,\n }\n\n const toBottom = toBounds.y + toBounds.h\n\n const to = getConnectorLinePoint(options, connector.to.element, toBounds)\n\n const maxStartY = Math.max(to.startY, from.startY)\n\n // Align from <-> to vertically\n from.y = Math.min(maxStartY, from.endY)\n if (from.y < toBounds.y) {\n from.y = Math.min(toBounds.y, from.endY)\n } else if (from.y > toBottom) {\n from.y = Math.max(toBottom, from.startY)\n }\n to.y = Math.min(maxStartY, to.endY)\n if (to.y < fromBounds.y) {\n to.y = Math.min(fromBounds.y, to.endY)\n } else if (to.y > fromBottom) {\n to.y = Math.max(fromBottom, to.startY)\n }\n\n // Keep within bounds\n from.y = Math.min(Math.max(from.y, fromBounds.y), fromBottom)\n to.y = Math.min(Math.max(to.y, toBounds.y), toBottom)\n\n return {from, to}\n}\n","export const assistFormId = 'assist'\n","import type {\n PortableTextBlock,\n PortableTextMarkDefinition,\n PortableTextSpan,\n} from '@portabletext/types'\nimport type {SanityDocument} from 'sanity'\n\n//id prefixes\nexport const assistDocumentIdPrefix = 'sanity.assist.schemaType.'\nexport const assistDocumentStatusIdPrefix = 'sanity.assist.status.'\nexport const assistSchemaIdPrefix = 'sanity.assist.schema.'\n\n// type names\nexport const assistDocumentTypeName = 'sanity.assist.schemaType.annotations' as const\nexport const assistFieldTypeName = 'sanity.assist.schemaType.field' as const\nexport const instructionTypeName = 'sanity.assist.instruction' as const\nexport const promptTypeName = 'sanity.assist.instruction.prompt' as const\n\nexport const userInputTypeName = 'sanity.assist.instruction.userInput' as const\nexport const instructionContextTypeName = 'sanity.assist.instruction.context' as const\nexport const fieldReferenceTypeName = 'sanity.assist.instruction.fieldRef' as const\n\n// user-facing type. Intentionally does not have sanity. prefix\nexport const contextDocumentTypeName = 'assist.instruction.context' as const\n\nexport const assistTasksStatusTypeName = 'sanity.assist.task.status' as const\nexport const instructionTaskTypeName = 'sanity.assist.instructionTask' as const\nexport const fieldPresenceTypeName = 'sanity.assist.instructionTask.presence' as const\n\nexport const assistSerializedTypeName = 'sanity.assist.serialized.type' as const\nexport const assistSerializedFieldTypeName = 'sanity.assist.serialized.field' as const\n\nexport const outputFieldTypeName = 'sanity.assist.output.field' as const\nexport const outputTypeTypeName = 'sanity.assist.output.type' as const\n\n//url params\nconst inspectParam = 'inspect' as const\nexport const fieldPathParam = 'pathKey' as const\nexport const instructionParam = 'instruction' as const\n\n// other constants\nexport const documentRootKey = '<document>'\n\nexport type SerializedSchemaMember = Omit<SerializedSchemaType, 'name' | '_type'> & {\n _type?: typeof assistSerializedFieldTypeName\n name?: string\n}\n\nexport interface SerializedSchemaType {\n _type?: typeof assistSerializedTypeName\n _id?: string\n type: string\n name: string\n title?: string\n fields?: SerializedSchemaMember[]\n of?: SerializedSchemaMember[]\n to?: SerializedSchemaMember[]\n annotations?: SerializedSchemaMember[]\n inlineOf?: SerializedSchemaMember[]\n values?: string[] | {value: string; title?: string}[]\n hidden?: boolean | 'function'\n readOnly?: boolean | 'function'\n options?: {\n /** equivalent to options.aiAssist.imageDescriptionField - not renamed in the api for backwards compatibility */\n imagePromptField?: string\n embeddingsIndex?: string\n }\n}\n\nexport interface AssistDocument extends SanityDocument {\n fields?: AssistField[]\n instructions?: StudioInstruction[]\n}\n\nexport interface PresetInstruction {\n _key: string\n prompt?: PromptTextBlock[]\n\n title?: string\n /**\n * String key from `@sanity/icons` IconMap\n */\n icon?: string\n\n /**\n * Type/field filter\n */\n output?: (OutputFieldItem | OutputTypeItem)[]\n}\n\nexport interface PresetField {\n path?: string\n instructions?: PresetInstruction[]\n}\n\nexport interface AssistPreset {\n fields?: PresetField[]\n}\n\nexport interface SanityAssistDocument {\n _id: string\n _type: typeof assistDocumentTypeName\n fields?: StudioAssistField[]\n}\n\nexport interface StudioAssistDocument extends SanityAssistDocument {\n // added after loading\n tasks?: InstructionTask[]\n}\n\nexport interface AssistField {\n _key: string\n _type: typeof assistFieldTypeName\n path?: string\n instructions?: StudioInstruction[]\n}\n\nexport interface StudioAssistField {\n _key: string\n path?: string\n instructions?: StudioInstruction[]\n\n // added\n tasks?: InstructionTask[]\n}\n\nexport interface FieldRef extends PortableTextMarkDefinition {\n _type: typeof fieldReferenceTypeName\n path?: string\n}\n\nexport interface ContextBlock {\n _type: typeof instructionContextTypeName\n reference?: {\n _type: 'reference'\n _ref?: string\n }\n}\n\nexport interface UserInputBlock {\n _type: typeof userInputTypeName\n _key: string\n message?: string\n description?: string\n}\n\nexport type InlinePromptBlock = PortableTextSpan | FieldRef | UserInputBlock | ContextBlock\nexport type PromptTextBlock = Omit<\n PortableTextBlock<never, InlinePromptBlock, 'normal', never>,\n '_type'\n> & {_type: 'block'}\n\nexport type PromptBlock = PromptTextBlock | FieldRef | ContextBlock | UserInputBlock\n\nexport interface AiPresence {\n _key: string\n _type: typeof fieldPresenceTypeName\n path?: string\n started?: string\n}\n\nexport type TaskEndedReason = 'success' | 'error' | 'aborted' | 'timeout'\n\nexport interface InstructionTask {\n _key: string\n _type: typeof instructionTaskTypeName\n instructionKey?: string\n title?: string\n path?: string\n started?: string\n updated?: string\n ended?: string\n message?: string\n reason?: TaskEndedReason\n presence?: AiPresence[]\n startedByUserId?: string\n\n //added by studio\n instruction?: StudioInstruction\n}\n\nexport interface StudioInstruction {\n _key: string\n _type: typeof instructionTypeName\n prompt?: PromptBlock[]\n\n icon?: string\n userId?: string\n title?: string\n placeholder?: string\n output?: (OutputFieldItem | OutputTypeItem)[]\n\n //added after query / synthetic fields\n tasks?: InstructionTask[]\n}\n\nexport interface AssistTasksStatus {\n _id: string\n _type: typeof assistTasksStatusTypeName\n tasks?: InstructionTask[]\n}\n\nexport interface AssistInspectorRouteParams {\n [inspectParam]?: string\n [fieldPathParam]?: string\n [instructionParam]?: string\n}\n\nexport interface OutputFieldItem {\n _type: typeof outputFieldTypeName\n _key: string\n //path relative to the field the instruction is for (same as _key)\n relativePath?: string\n}\n\nexport interface OutputTypeItem {\n _type: typeof outputTypeTypeName\n _key: string\n /* array item type name */\n type?: string\n //path relative to the array-field the instruction is for, can be empty string (the array itself, same as _key)\n relativePath?: string\n}\n","import {useMemo} from 'react'\nimport {type Path, pathToString} from 'sanity'\n\nimport {documentRootKey, type StudioInstruction} from '../types'\n\nexport function usePathKey(path: Path | string) {\n return useMemo(() => {\n return getPathKey(path)\n }, [path])\n}\n\nfunction getPathKey(path: Path | string) {\n if (path.length) {\n return Array.isArray(path) ? pathToString(path) : path\n }\n return documentRootKey\n}\n\nexport function getInstructionTitle(instruction?: StudioInstruction) {\n return instruction?.title ?? 'Untitled'\n}\n\nexport function isDefined<T>(t: T | undefined | null): t is T {\n return t !== undefined && t !== null\n}\n","import type {ArraySchemaType, ImageOptions, SchemaType} from 'sanity'\n\nexport function isPortableTextArray(type: ArraySchemaType) {\n return type.of.find((t) => isType(t, 'block'))\n}\n\n/**\n * Returns true if the `schemaType` or any of its parent types (`schemaType.type`)` has `name` equal\n * to `typeName`.\n *\n * Useful for checking if `schemaType` is a type alias of `ìmage`, `code` or similar.\n */\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isImage(schemaType: SchemaType) {\n return isType(schemaType, 'image')\n}\n\nexport function getDescriptionFieldOption(\n schemaType: SchemaType | undefined,\n): {path: string; updateOnImageChange: boolean} | undefined {\n if (!schemaType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const descriptionField = (schemaType.options as ImageOptions)?.aiAssist?.imageDescriptionField\n if (typeof descriptionField === 'string') {\n return {\n path: descriptionField,\n updateOnImageChange: true,\n }\n } else if (descriptionField) {\n return {\n path: descriptionField.path,\n updateOnImageChange: descriptionField.updateOnImageChange ?? true,\n }\n }\n return getDescriptionFieldOption(schemaType.type)\n}\n\nexport function getImageInstructionFieldOption(\n schemaType: SchemaType | undefined,\n): string | undefined {\n if (!schemaType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const imageInstructionField = (schemaType.options as ImageOptions)?.aiAssist\n ?.imageInstructionField\n if (imageInstructionField) {\n return imageInstructionField\n }\n return getImageInstructionFieldOption(schemaType.type)\n}\n","import type {ReferenceOptions, SchemaType} from 'sanity'\n\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {isType} from './typeUtils'\n\nexport function isSchemaAssistEnabled(type: SchemaType) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return !(type.options as AssistOptions | undefined)?.aiAssist?.exclude\n}\n\nexport function isAssistSupported(type: SchemaType) {\n if (!isSchemaAssistEnabled(type)) {\n return false\n }\n\n if (isDisabled(type)) {\n return false\n }\n\n if (type.jsonType === 'array') {\n const unsupportedArray = type.of.every((t) => isDisabled(t))\n return !unsupportedArray\n }\n\n if (type.jsonType === 'object') {\n const unsupportedObject = type.fields.every((field) => isDisabled(field.type))\n return (\n !unsupportedObject ||\n /* to allow attaching custom actions on fieldless images */\n isType(type, 'image')\n )\n }\n return true\n}\n\nfunction isDisabled(type: SchemaType) {\n return !isSchemaAssistEnabled(type) || isUnsupportedType(type)\n}\n\nfunction isUnsupportedType(type: SchemaType) {\n return (\n type.name === 'sanity.imageCrop' ||\n type.name === 'sanity.imageHotspot' ||\n isType(type, 'globalDocumentReference') ||\n (isType(type, 'reference') &&\n // oxlint-disable-next-line no-unsafe-type-assertion\n !(type?.options as ReferenceOptions)?.aiAssist?.embeddingsIndex) ||\n isType(type, 'crossDatasetReference') ||\n isType(type, 'file')\n )\n}\n","import {createContext, type PropsWithChildren, useMemo} from 'react'\nimport {type FieldMember, type ObjectInputProps, pathToString} from 'sanity'\n\nimport {isAssistSupported} from '../helpers/assistSupported'\n\nconst FirstAssistedPathContext = createContext<string | undefined>(undefined)\n\nexport interface FirstAssistedPathProviderProps {\n members: ObjectInputProps['members']\n}\n\nexport function FirstAssistedPathProvider(\n props: PropsWithChildren<FirstAssistedPathProviderProps>,\n) {\n const {members} = props\n\n const firstAssistedPath = useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])\n\n return (\n <FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>\n )\n}\n","import {minutesToMilliseconds} from 'date-fns/minutesToMilliseconds'\n\nexport const releaseAnnouncementUrl =\n 'https://www.sanity.io/blog/sanity-ai-assist-announcement?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const instructionGuideUrl =\n 'https://sanity.io/guides/getting-started-with-ai-assist-instructions?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const giveFeedbackUrl = 'https://forms.gle/Kwz7CThxGeA2GiEU8'\n\nexport const salesUrl =\n 'https://www.sanity.io/contact/sales?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const packageName = '@sanity/assist'\n\nexport const pluginTitle = 'Sanity AI Assist'\n\nexport const pluginTitleShort = 'AI Assist'\n\nexport const maxHistoryVisibilityMs = minutesToMilliseconds(30)\n","import {getDraftId, getPublishedId, getVersionFromId, getVersionId, isVersionId} from 'sanity'\n\nimport {assistDocumentIdPrefix, assistDocumentStatusIdPrefix} from '../types'\n\nconst illegalIdChars = /[^a-zA-Z0-9._-]/g\n\nexport function assistDocumentId(documentType: string) {\n return `${assistDocumentIdPrefix}${documentType}`.replace(illegalIdChars, '_')\n}\n\nexport function assistTasksStatusId(documentId: string) {\n if (isVersionId(documentId)) {\n // Creates an id: sanity.assist.status.<versionName>.<documentId>\n return `${assistDocumentStatusIdPrefix}${getVersionFromId(documentId)}.${getPublishedId(documentId)}`\n }\n\n // Creates an id: sanity.assist.status<documentId>\n return `${assistDocumentStatusIdPrefix}${getPublishedId(documentId)}`\n}\n\n/**\n * Document id Assist write endpoints must patch.\n *\n * `documentId` may carry any prefix; only its published id is used. The target\n * is picked in this order:\n *\n * 1. `options.releaseId` (the selected perspective) wins and yields that\n * release's version id, even if `documentId` is already a version id.\n * 2. Without a `releaseId`, a version id is kept as is.\n * 3. Live-edit types write published.\n * 4. Everything else writes `drafts.*`, even when Studio field-action props\n * still carry the published id (virtual draft after publish).\n */\nexport function getAssistWriteDocumentId(\n documentId: string,\n options: {liveEdit?: boolean; releaseId?: string} = {},\n): string {\n if (options.releaseId) {\n return getVersionId(documentId, options.releaseId)\n }\n if (isVersionId(documentId)) {\n return documentId\n }\n if (options.liveEdit) {\n return getPublishedId(documentId)\n }\n return getDraftId(documentId)\n}\n","import {useEditState} from 'sanity'\n\n// oxlint-disable-next-line no-unnecessary-type-parameters\nexport function useDocumentState<T>(id: string, docType: string): T | undefined {\n const state = useEditState(id, docType)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return (state.draft || state.published) as T | undefined\n}\n","import {useEffect, useMemo} from 'react'\nimport {type ObjectSchemaType, typed, useClient, useCurrentUser} from 'sanity'\n\nimport {maxHistoryVisibilityMs} from '../../constants'\nimport {assistDocumentId, assistTasksStatusId} from '../../helpers/ids'\nimport {\n assistDocumentTypeName,\n type AssistTasksStatus,\n assistTasksStatusTypeName,\n type InstructionTask,\n type StudioAssistDocument,\n type StudioAssistField,\n type StudioInstruction,\n} from '../../types'\nimport {useDocumentState} from './useDocumentState'\n\ninterface UseAssistDocumentProps {\n documentId: string\n schemaType: ObjectSchemaType\n initDoc?: boolean\n}\n\nexport function useStudioAssistDocument({\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps): StudioAssistDocument | undefined {\n const documentTypeName = schemaType.name\n const currentUser = useCurrentUser()\n\n const assistDocument = useDocumentState<StudioAssistDocument>(\n assistDocumentId(documentTypeName),\n assistDocumentTypeName,\n )\n const assistTasksStatus = useDocumentState<AssistTasksStatus>(\n assistTasksStatusId(documentId ?? ''),\n assistTasksStatusTypeName,\n )\n\n const client = useClient({apiVersion: '2023-01-01'})\n\n useEffect(() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }, [client, assistDocument, documentTypeName, initDoc])\n\n return useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n // oxlint-disable-next-line no-map-spread\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])\n}\n\nfunction asStudioInstruction(\n instruction: StudioInstruction,\n run: InstructionTask[],\n): StudioInstruction {\n return {\n ...instruction,\n tasks: run\n .filter((task) => task.instructionKey === instruction._key)\n .filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n ),\n }\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {addSeconds} from 'date-fns/addSeconds'\nimport {isAfter} from 'date-fns/isAfter'\nimport {useEffect, useRef} from 'react'\nimport {type ObjectSchemaType, useCurrentUser} from 'sanity'\n\nimport {getInstructionTitle} from '../../helpers/misc'\nimport type {InstructionTask} from '../../types'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nconst NO_TASKS: InstructionTask[] = []\n\nexport function useInstructionToaster(documentId: string, documentSchemaType: ObjectSchemaType) {\n const assistDocument = useStudioAssistDocument({documentId, schemaType: documentSchemaType})\n\n const assistDocLoaded = !!assistDocument\n const currentUser = useCurrentUser()\n const toast = useToast()\n const tasks = assistDocument?.tasks\n const previousTasks = useRef<InstructionTask[] | undefined | 'initial'>('initial')\n\n useEffect(() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }, [tasks, previousTasks, toast, currentUser, assistDocLoaded])\n}\n","import {useLayer} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport type {InputProps, ObjectInputProps, ObjectSchemaType} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {ConnectFromRegion} from '../_lib/connector'\nimport {assistFormId} from '../_lib/form/constants'\nimport {usePathKey} from '../helpers/misc'\nimport {isType} from '../helpers/typeUtils'\nimport {FirstAssistedPathProvider} from '../onboarding/FirstAssistedPathProvider'\nimport {assistDocumentTypeName} from '../types'\nimport {useInstructionToaster} from './hooks/useInstructionToaster'\n\nexport function AssistDocumentInputWrapper(props: InputProps) {\n if (!isType(props.schemaType, 'document') && props.id !== 'root' && props.id !== assistFormId) {\n return <AssistInput {...props} />\n }\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const documentId = (props.value as any)?._id as string | undefined\n if (!documentId) {\n return props.renderDefault(props)\n }\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n return <AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />\n}\n\nfunction AssistDocumentInput({documentId, ...props}: ObjectInputProps & {documentId: string}) {\n useInstructionToaster(documentId, props.schemaType)\n\n const schemaType = useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as ObjectSchemaType\n }, [props.schemaType])\n\n return (\n <FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>\n )\n}\n\nfunction AssistInput(props: InputProps) {\n const {zIndex} = useLayer()\n const {paneKey} = useDocumentPane()\n const pathKey = usePathKey(props.path)\n\n return (\n <ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>\n )\n}\n","import {createContext, useContext} from 'react'\nimport {type DocumentInspector, type ObjectSchemaType, PatchEvent} from 'sanity'\n\nimport type {FieldRef} from '../assistInspector/helpers'\nimport type {InstructionTask, StudioAssistDocument} from '../types'\n\nexport type AssistDocumentContextValue = (\n | {assistDocument: StudioAssistDocument; loading: false}\n | {assistDocument: undefined; loading: true}\n) & {\n documentIsNew: boolean\n /**\n * This is the _actual_ id of the current document (ie the document loaded in the pane); it contains draft. versions. prefix ect depending on context\n */\n assistableDocumentId: string\n /**\n * True when a real write target exists: a `drafts.*` snapshot, the selected\n * release version, or the published document for live-edit types.\n *\n * After publish, the drafts perspective can still display published values\n * (a virtual draft) while this is false because `editState.draft` is null.\n */\n documentIsAssistable: boolean\n /**\n * True while the document store still has an in-flight commit (for example\n * the mutation that materializes a draft from published values).\n */\n documentIsSyncing: boolean\n documentSchemaType: ObjectSchemaType\n openInspector: (inspectorName: string, paneParams?: Record<string, string>) => void\n closeInspector: (inspectorName?: string) => void\n inspector: DocumentInspector | null\n selectedPath?: string\n documentOnChange: (event: PatchEvent) => void\n\n /**\n * Synthetic task is used to display AI presence at the document level for the user who started the action.\n * These are not persisted, so other users will not see them.\n * It is mostly a helper to give _some_ visual feedback to the user while a custom action is running.\n * This also means that reloading the page will remove the icon.\n *\n * Agent Actions add their own \"real\" tasks, so if a custom action calls an Agent action, _those_ tasks\n * are visible across sessions.\n */\n syntheticTasks?: InstructionTask[]\n addSyntheticTask: (syntheticTask: InstructionTask) => void\n removeSyntheticTask: (syntheticTask: InstructionTask) => void\n\n fieldRefs: FieldRef[]\n fieldRefsByTypePath: Record<string, FieldRef | undefined>\n}\n\nexport const AssistDocumentContext = createContext<AssistDocumentContextValue | undefined>(\n undefined,\n)\n\nexport function useAssistDocumentContext(): AssistDocumentContextValue {\n const context = useContext(AssistDocumentContext)\n if (!context) {\n throw new Error('AssistDocumentContext value is missing')\n }\n return context\n}\n","import {createContext, useContext} from 'react'\n\nimport type {FieldRef} from '../assistInspector/helpers'\nimport type {AssistPluginConfig} from '../plugin'\nimport type {SerializedSchemaType} from '../types'\nimport type {InstructStatus} from '../useApiClient'\n\nexport interface AiAssistanceConfigContextValue {\n config: AssistPluginConfig\n status?: InstructStatus\n statusLoading: boolean\n initLoading: boolean\n init: () => void\n error?: Error\n serializedTypes: SerializedSchemaType[]\n getFieldRefs: (documentType: string) => FieldRef[]\n getFieldRefsByTypePath: (documentType: string) => Record<string, FieldRef | undefined>\n}\n\n// oxlint-disable-next-line no-unsafe-type-assertion\nexport const AiAssistanceConfigContext = createContext<AiAssistanceConfigContextValue>({} as any)\n\nexport function useAiAssistanceConfig() {\n const context = useContext(AiAssistanceConfigContext)\n if (!context) {\n throw new Error('Missing AiAssistanceConfigContext')\n }\n return context\n}\n\nexport function useSerializedTypes() {\n return useAiAssistanceConfig().serializedTypes\n}\n","// oxlint-disable no-accumulating-spread\nimport {BlockContentIcon} from '@sanity/icons/BlockContent'\nimport {BlockquoteIcon} from '@sanity/icons/Blockquote'\nimport {DocumentIcon} from '@sanity/icons/Document'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {LinkIcon} from '@sanity/icons/Link'\nimport {OlistIcon} from '@sanity/icons/Olist'\nimport {StringIcon} from '@sanity/icons/String'\nimport {extractWithPath} from '@sanity/mutator'\nimport {type ComponentType, useMemo} from 'react'\nimport {\n type ArraySchemaType,\n isKeySegment,\n isObjectSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n type SchemaType,\n stringToPath,\n} from 'sanity'\nimport {type PaneRouterContextValue, usePaneRouter} from 'sanity/structure'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {type AssistInspectorRouteParams, documentRootKey} from '../types'\n\nexport interface FieldRef {\n key: string\n path: Path\n title: string\n schemaType: SchemaType\n icon: ComponentType\n synthetic?: boolean\n}\n\n/**\n * Default for `assist.maxFieldSelectionDepth`: how many path segments deep fields are collected\n * for the field picker and the per-field assist actions.\n */\nexport const DEFAULT_MAX_FIELD_SELECTION_DEPTH = 6\n\nfunction getTypeIcon(schemaType: SchemaType): ComponentType {\n let t: SchemaType | undefined = schemaType\n\n while (t) {\n if (t.icon) return t.icon\n t = t.type\n }\n\n if (isType(schemaType, 'slug')) return LinkIcon\n if (isType(schemaType, 'image')) return ImageIcon\n if (schemaType.jsonType === 'array' && isPortableTextArray(schemaType)) return BlockContentIcon\n\n if (schemaType.jsonType === 'array') return OlistIcon\n if (schemaType.jsonType === 'object') return BlockquoteIcon\n if (schemaType.jsonType === 'string') return StringIcon\n\n return DocumentIcon\n}\n\nexport function asFieldRefsByTypePath(fieldRefs: FieldRef[]): Record<string, FieldRef | undefined> {\n const lookup: Record<string, FieldRef | undefined> = fieldRefs.reduce(\n (acc, ref) => ({...acc, [ref.key]: ref}),\n {},\n )\n return lookup\n}\n\nexport function getDocumentFieldRef(schemaType: ObjectSchemaType): FieldRef {\n return {\n key: documentRootKey,\n icon: schemaType.icon ?? DocumentIcon,\n title: `The entire document`,\n path: [],\n schemaType: schemaType,\n }\n}\n\n/**\n * Collects every field (and synthetic array item) in `schemaType` that AI Assist can attach\n * instructions to.\n *\n * @param maxDepth - max number of path segments a collected field can have; deeper fields are\n * skipped. Arrays contribute one segment for the item type (`array[_key=\"type\"]`).\n */\nexport function getFieldRefs(\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_FIELD_SELECTION_DEPTH,\n): FieldRef[] {\n return getObjectFieldRefs(schemaType, undefined, 0, maxDepth)\n}\n\nfunction getObjectFieldRefs(\n schemaType: ObjectSchemaType,\n parent: FieldRef | undefined,\n depth: number,\n maxDepth: number,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n return (\n schemaType.fields\n .filter((f) => !f.name.startsWith('_'))\n // oxlint-disable-next-line no-map-spread\n .flatMap((field) => {\n const path: Path = parent ? [...parent.path, field.name] : [field.name]\n const title = field.type.title ?? field.name\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: field.type,\n icon: getTypeIcon(field.type),\n }\n const fields =\n field.type.jsonType === 'object'\n ? getObjectFieldRefs(field.type, fieldRef, depth + 1, maxDepth)\n : []\n\n const syntheticFields =\n field.type.jsonType === 'array'\n ? getSyntheticFields(field.type, fieldRef, depth + 1, maxDepth)\n : []\n if (!isAssistSupported(field.type)) {\n return [...fields, ...syntheticFields]\n }\n return [fieldRef, ...fields, ...syntheticFields]\n })\n )\n}\n\nfunction getSyntheticFields(\n schemaType: ArraySchemaType,\n parent: FieldRef | undefined,\n depth: number,\n maxDepth: number,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n\n return (\n schemaType.of\n .filter((itemType) => !isType(itemType, 'block'))\n // oxlint-disable-next-line no-map-spread\n .flatMap((itemType) => {\n const segment = {_key: itemType.name}\n const title = itemType.title ?? itemType.name\n const path: Path = parent ? [...parent.path, segment] : [segment]\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: itemType,\n icon: getTypeIcon(itemType),\n synthetic: true,\n }\n const fields =\n itemType.jsonType === 'object'\n ? getObjectFieldRefs(itemType, fieldRef, depth + 1, maxDepth)\n : []\n\n if (!isAssistSupported(itemType)) {\n return fields\n }\n return [fieldRef, ...fields]\n })\n )\n}\n\nexport function getTypePath(doc: SanityDocumentLike, pathString: string) {\n if (!pathString) {\n return undefined\n }\n\n const path = stringToPath(pathString)\n const currentPath: Path = []\n let valid = true\n const syntheticPath = path.map((segment) => {\n currentPath.push(segment)\n\n if (isKeySegment(segment)) {\n const match = extractWithPath(pathToString(currentPath), doc)[0]\n const value = match?.value\n if (match && value && typeof value === 'object' && '_type' in value) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {_key: value._type as string}\n }\n valid = false\n }\n return segment\n })\n\n return valid ? patchableKey(pathToString(syntheticPath)) : undefined\n}\n\n/**\n * mutator crashes if path contains certain letters\n * @param pathKey\n */\nfunction patchableKey(pathKey: string) {\n return pathKey.replace(/[=]=/g, ':').replace(/[[\\]]/g, '|').replace(/\"/g, '')\n}\n\nexport function useTypePath(doc: SanityDocumentLike, pathString: string) {\n return useMemo(() => getTypePath(doc, pathString), [doc, pathString])\n}\n\nexport function useSelectedField(\n documentSchemaType?: SchemaType,\n path?: string,\n): FieldRef | undefined {\n const {getFieldRefs} = useAiAssistanceConfig()\n\n const selectableFields = useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : [],\n [documentSchemaType, getFieldRefs],\n )\n\n return useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])\n}\n\nexport function getFieldTitle(field?: FieldRef) {\n const schemaType = field?.schemaType\n return field?.title ?? schemaType?.title ?? schemaType?.name ?? 'Untitled'\n}\n\nexport type AiPaneRouter = Omit<PaneRouterContextValue, 'setParams' | 'params'> & {\n params: AssistInspectorRouteParams\n setParams: (p: Record<keyof AssistInspectorRouteParams, string | undefined>) => void\n}\n\nexport function useAiPaneRouter(): AiPaneRouter {\n const paneRouter = usePaneRouter()\n\n return useMemo(() => ({...paneRouter, params: paneRouter.params ?? {}}), [paneRouter])\n}\n","import type {SanityClient} from '@sanity/client'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useMemo, useState} from 'react'\nimport {type Path, pathToString, useClient, useCurrentUser} from 'sanity'\n\nimport {useAiAssistanceConfig, useSerializedTypes} from './assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from './helpers/conditionalMembers'\nimport type {FieldLanguageMap} from './translate/paths'\nimport {documentRootKey} from './types'\n\nexport interface UserTextInstance {\n blockKey: string\n userInput: string\n}\n\nexport interface RunInstructionRequest {\n documentId: string\n assistDocumentId: string\n path: string\n typePath?: string\n instructionKey: string\n userId?: string\n userTexts?: UserTextInstance[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nexport interface InstructStatus {\n enabled: boolean\n initialized: boolean\n validToken: boolean\n}\n\nexport interface TranslateRequest {\n documentId: string\n translatePath: Path\n languagePath?: string\n styleguide: () => Promise<string | undefined>\n fieldLanguageMap?: FieldLanguageMap[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nconst basePath = '/assist/tasks/instruction'\nexport const API_VERSION_WITH_EXTENDED_TYPES = '2025-04-01'\n\nexport function canUseAssist(status: InstructStatus | undefined) {\n return status?.enabled && status.initialized && status.validToken\n}\n\nexport function useApiClient(customApiClient?: (defaultClient: SanityClient) => SanityClient) {\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n return useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )\n}\n\nexport function useTranslate(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const translate = useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )\n}\n\nexport function useGenerateCaption(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const generateCaption = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )\n}\n\nexport function useGenerateImage(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const generateImage = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )\n}\n\nexport function useGetInstructStatus(apiClient: SanityClient) {\n const [loading, setLoading] = useState(true)\n\n const getInstructStatus = useCallback(async () => {\n setLoading(true)\n\n const projectId = apiClient.config().projectId\n // oxlint-disable-next-line react/todo\n try {\n const status = await apiClient.request<InstructStatus>({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/status?projectId=${projectId}`,\n })\n\n return status\n } finally {\n setLoading(false)\n }\n }, [setLoading, apiClient])\n\n return {\n loading,\n getInstructStatus,\n }\n}\n\nexport function useInitInstruct(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const initInstruct = useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])\n\n return {\n loading,\n initInstruct,\n }\n}\n\nexport function useRunInstructionApi(apiClient: SanityClient) {\n const toast = useToast()\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n\n const {\n config: {assist: assistConfig},\n } = useAiAssistanceConfig()\n\n const runInstruction = useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )\n\n return useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Button, Dialog, Flex, Stack, Text, TextArea} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {\n createContext,\n type Dispatch,\n type FormEvent,\n type PropsWithChildren,\n type SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {FormFieldHeaderText} from 'sanity'\n\nimport type {CustomInputResult, GetUserInput} from '../fieldActions/useUserInput'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {type UserInputBlock, userInputTypeName} from '../types'\nimport {useApiClient, useRunInstructionApi} from '../useApiClient'\nimport {useAiAssistanceConfig} from './AiAssistanceConfigContext'\nimport type {RunInstructionArgs} from './AssistLayout'\n\ntype BlockInputs = Record<string, string>\nconst NO_INPUT: BlockInputs = {}\n\nexport interface RunInstructionContextValue {\n runInstruction: (req: RunInstructionArgs) => void\n getUserInput: GetUserInput\n instructionLoading: boolean\n}\n\nconst RunInstructionContext = createContext<RunInstructionContextValue>({\n runInstruction: () => {},\n getUserInput: async () => undefined,\n instructionLoading: false,\n})\n\nexport function useRunInstruction() {\n return useContext(RunInstructionContext)\n}\n\nfunction isUserInputBlock(block: {_type: string}): block is UserInputBlock {\n return block._type === userInputTypeName\n}\n\nexport function RunInstructionProvider(props: PropsWithChildren<{}>) {\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {runInstruction: runInstructionRequest, loading} = useRunInstructionApi(apiClient)\n\n const id = useId()\n\n const [inputs, setInputs] = useState(NO_INPUT)\n const [runRequest, setRunRequest] = useState<\n | (RunInstructionArgs & {userInputBlocks: UserInputBlock[]})\n | {dialogTitle: string; userInputBlocks: UserInputBlock[]}\n | undefined\n >()\n\n const [resolveUserInput, setResolveUserInput] =\n useState<\n (\n value: CustomInputResult[] | PromiseLike<CustomInputResult[] | undefined> | undefined,\n ) => void\n >()\n\n const getUserInput: GetUserInput = useCallback(async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }, [])\n\n const runInstruction = useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )\n\n const close = useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }, [resolveUserInput])\n\n const runWithInput = useCallback(() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs, resolveUserInput])\n\n const open = !!runRequest\n\n const runDisabled = useMemo(\n () =>\n (runRequest?.userInputBlocks?.length ?? 0) >\n Object.entries(inputs).filter(([, value]) => !!value).length,\n [runRequest?.userInputBlocks, inputs],\n )\n\n const runButton = (\n <Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />\n )\n\n const contextValue: RunInstructionContextValue = useMemo(\n () => ({runInstruction, getUserInput, instructionLoading: loading}),\n [getUserInput, loading, runInstruction],\n )\n\n return (\n <RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>\n )\n}\n\nfunction UserInput(props: {\n block: UserInputBlock\n inputs: BlockInputs\n setInputs: Dispatch<SetStateAction<BlockInputs>>\n autoFocus?: boolean\n}) {\n const {block, autoFocus, setInputs, inputs} = props\n const key = block._key\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n const onChange = useCallback(\n // oxlint-disable-next-line no-deprecated\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )\n\n const value = useMemo(() => inputs[key], [inputs, key])\n\n useEffect(() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }, [autoFocus])\n\n return (\n <Stack padding={2} gap={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>\n )\n}\n","import {useCallback, useEffect, useEffectEvent, useRef} from 'react'\nimport {PatchEvent} from 'sanity'\n\nexport interface DraftDelayedTaskArgs<T> {\n documentOnChange: (event: PatchEvent) => void\n /**\n * True when a real write target exists: a `drafts.*` snapshot, the selected\n * release version, or the published document for live-edit types.\n */\n isDocAssistable: boolean\n /**\n * True while the document store has an in-flight commit. A queued task waits\n * for it so the assist backend never patches a document that only exists\n * optimistically in the Studio.\n */\n isSyncing?: boolean\n task: (args: T) => void\n}\n\ninterface DocumentSignals {\n isDocAssistable: boolean\n isSyncing: boolean\n}\n\ntype Phase = 'materializing' | 'awaiting-sync'\n\ninterface QueuedTask<T> {\n args: T\n phase: Phase\n attempts: number\n}\n\n/**\n * One attempt is the normal case. The second covers a draft that disappeared\n * (published, discarded, deleted remotely) while the task was queued.\n */\nconst MAX_MATERIALIZATION_ATTEMPTS = 2\n\n/**\n * Advances a queued task one step for the given document signals and returns\n * the queue afterwards. Under unchanged signals a second call is a no-op, so the\n * caller can invoke it on every signal change without bookkeeping.\n */\nfunction advance<T>(\n queued: QueuedTask<T> | null,\n {isDocAssistable, isSyncing}: DocumentSignals,\n {documentOnChange, task}: Pick<DraftDelayedTaskArgs<T>, 'documentOnChange' | 'task'>,\n): QueuedTask<T> | null {\n if (!queued) {\n return null\n }\n\n if (queued.phase === 'materializing') {\n // Studio started the create/patch commit; wait for it to finish\n return isSyncing ? {...queued, phase: 'awaiting-sync'} : queued\n }\n\n if (isSyncing) {\n return queued\n }\n\n if (isDocAssistable) {\n task(queued.args)\n return null\n }\n\n if (queued.attempts >= MAX_MATERIALIZATION_ATTEMPTS) {\n return null\n }\n try {\n documentOnChange(PatchEvent.from([]))\n } catch {\n // Studio throws for read-only documents. Drop the task instead of the tree.\n return null\n }\n return {...queued, phase: 'materializing', attempts: queued.attempts + 1}\n}\n\n/**\n * Runs `task` once the document has a real write target in the Content Lake.\n *\n * After publish the drafts perspective shows a virtual draft with no `drafts.*`\n * document behind it. When that happens the hook sends an empty form `onChange`:\n * Studio's `patch.execute` still runs `createIfNotExists` for the draft even with\n * no patches, and the resulting edit action creates it server side. The task then\n * waits until that commit has both started and finished, because the optimistic\n * `editState.draft` appears before the draft exists remotely.\n *\n * The queue is never rendered, so it lives in a ref. The effect below only\n * reacts to the two document signals; nothing it does can re-trigger it.\n */\nexport function useDraftDelayedTask<T>(args: DraftDelayedTaskArgs<T>) {\n const {documentOnChange, isDocAssistable, isSyncing = false, task} = args\n const queuedRef = useRef<QueuedTask<T> | null>(null)\n\n const advanceQueue = useEffectEvent((signals: DocumentSignals) => {\n queuedRef.current = advance(queuedRef.current, signals, {documentOnChange, task})\n })\n\n useEffect(() => {\n advanceQueue({isDocAssistable, isSyncing})\n }, [isDocAssistable, isSyncing])\n\n return useCallback(\n (taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n },\n [isDocAssistable, isSyncing, documentOnChange, task],\n )\n}\n","import type {ObjectSchemaType, SanityDocument} from 'sanity'\n\nimport {useRunInstruction} from '../assistLayout/RunInstructionProvider'\nimport {type DraftDelayedTaskArgs, useDraftDelayedTask} from './useDraftDelayedTask'\n\nexport function isDocAssistable(\n documentSchemaType: ObjectSchemaType,\n published?: SanityDocument | null,\n draft?: SanityDocument | null,\n) {\n return !!(documentSchemaType.liveEdit ? published : draft)\n}\n\nexport function useRequestRunInstruction(args: Omit<DraftDelayedTaskArgs<never>, 'task'>) {\n const {runInstruction, instructionLoading} = useRunInstruction()\n const requestRunInstruction = useDraftDelayedTask({\n ...args,\n task: runInstruction,\n })\n\n return {\n instructionLoading,\n requestRunInstruction,\n }\n}\n","import {useCallback, useEffect, useMemo, useState} from 'react'\nimport {\n getPublishedId,\n type ObjectSchemaType,\n usePerspective,\n useSchema,\n useSyncState,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {getAssistWriteDocumentId} from '../../helpers/ids'\nimport {fieldPathParam, type InstructionTask} from '../../types'\nimport type {AssistDocumentContextValue} from '../AssistDocumentContext'\nimport {isDocAssistable} from '../RequestRunInstructionProvider'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nexport function useAssistDocumentContextValue(documentId: string, documentType: string) {\n const schema = useSchema()\n\n const {getFieldRefs, getFieldRefsByTypePath} = useAiAssistanceConfig()\n const documentSchemaType = useMemo(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])\n\n const {fieldRefs, fieldRefsByTypePath} = useMemo(() => {\n return {\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }\n }, [getFieldRefs, getFieldRefsByTypePath, documentType])\n\n const {\n openInspector,\n closeInspector,\n inspector,\n onChange: documentOnChange,\n editState,\n } = useDocumentPane()\n const {selectedReleaseId} = usePerspective()\n const {draft, published, version} = editState || {}\n\n const assistableDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType.liveEdit,\n releaseId: selectedReleaseId,\n })\n\n const documentIsNew = selectedReleaseId ? !version?._id : !draft?._id && !published?._id\n const documentIsAssistable = selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)\n const {isSyncing: documentIsSyncing} = useSyncState(\n getPublishedId(documentId),\n documentType,\n selectedReleaseId,\n )\n\n const {params} = useAiPaneRouter()\n const selectedPath = params[fieldPathParam]\n\n const assistDocument = useStudioAssistDocument({\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n })\n const {syntheticTasks, addSyntheticTask, removeSyntheticTask} =\n useSyntheticTasks(assistableDocumentId)\n\n const value: AssistDocumentContextValue = useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n documentIsSyncing,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n ])\n\n return value\n}\n\nfunction useSyntheticTasks(assistableDocumentId: string) {\n const [syntheticTasks, setSyntheticTasks] = useState<InstructionTask[]>(() => [])\n const addSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }, [])\n const removeSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }, [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSyntheticTasks([])\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [assistableDocumentId])\n\n return {\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }\n}\n","import type {PropsWithChildren} from 'react'\n\nimport {AssistDocumentContext} from './AssistDocumentContext'\nimport {useAssistDocumentContextValue} from './hooks/useAssistDocumentContextValue'\n\nexport interface AIDocumentInputProps {\n documentId: string\n documentType: string\n}\n\nexport function AssistDocumentContextProvider(props: PropsWithChildren<AIDocumentInputProps>) {\n const {documentId, documentType} = props\n const value = useAssistDocumentContextValue(documentId, documentType)\n return (\n <AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>\n )\n}\n","import type {DocumentLayoutProps} from 'sanity'\n\nimport {AssistDocumentContextProvider} from './AssistDocumentContextProvider'\n\nexport function AssistDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n return (\n <AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>\n )\n}\n","import {type ReactElement, type ReactNode, type Ref} from 'react'\nimport {keyframes, styled} from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n transform: scale(0.75);\n }\n 40% {\n opacity: 0;\n transform: scale(0.75);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`\n\nconst FadeInDiv = styled.div`\n animation-name: ${fadeIn};\n animation-timing-function: ease-in-out;\n`\n\nexport function FadeInContent({\n children,\n durationMs = 250,\n ref,\n}: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n ref?: Ref<HTMLDivElement>\n}): ReactElement {\n return (\n <FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>\n )\n}\n","import {purple} from '@sanity/color'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Text} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useColorSchemeValue} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nconst Root = styled.span`\n display: block;\n width: 25px;\n height: 25px;\n position: relative;\n`\n\nconst dash = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(43deg);\n }\n`\n\nconst Outline = styled.svg`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n & > circle {\n stroke: var(--ai-avatar-stroke-color);\n stroke-width: 1.5px;\n stroke-linecap: round;\n transform-origin: center;\n animation: ${dash} 500ms ease-in-out infinite;\n transition: stroke-dasharray 200ms ease-in-out;\n\n stroke-dasharray: 2.34px 0;\n\n [data-state='active'] > & {\n stroke-dasharray: 2px 2.34px;\n }\n }\n`\n\nconst IconDisc = styled.span`\n background: var(--ai-avatar-disc-color);\n color: white;\n width: 21px;\n height: 21px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10.5px;\n position: absolute;\n top: 2px;\n left: 2px;\n`\n\nexport function AssistAvatar(props: {state?: 'present' | 'active'}) {\n const {state = 'present'} = props\n const scheme = useColorSchemeValue()\n\n const style = useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }, [scheme])\n\n return (\n <Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>\n )\n}\n","import {Card, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FormNodePresence} from 'sanity'\n\nimport {FadeInContent} from '../components/FadeInContent'\nimport {AssistAvatar} from './AssistAvatar'\n\nexport function AiFieldPresence(_props: {presence: FormNodePresence}) {\n return (\n <Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>\n )\n}\n","import {useMemo} from 'react'\nimport {type FormNodePresence, isKeySegment, type Path, stringToPath} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport type {AiPresence} from '../types'\n\nconst NO_PRESENCE: FormNodePresence[] = []\n\nexport function useAssistPresence(path: Path, showFocusWithin?: boolean): FormNodePresence[] {\n const context = useAssistDocumentContext()\n const assistDocument = context && 'assistDocument' in context ? context.assistDocument : undefined\n const tasks = assistDocument?.tasks\n\n return useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && statusSegment && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])\n}\n\nexport function aiPresence(presence: AiPresence, path: Path, _title?: string): FormNodePresence {\n return {\n user: {\n id: `sanity-assistant_${presence._key}`,\n displayName: pluginTitle,\n },\n path: path,\n sessionId: 'not-available',\n lastActiveAt: presence?.started ?? new Date().toISOString(),\n }\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport {type FieldProps, isArraySchemaType} from 'sanity'\n\nimport {assistFormId} from '../_lib/form/constants'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\nimport {contextDocumentTypeName} from '../types'\n\nexport function AssistFieldWrapper(props: FieldProps) {\n const {schemaType} = props\n\n const isSupported = useMemo(() => isAssistSupported(schemaType), [schemaType])\n\n if (\n !isSupported ||\n schemaType.name.startsWith('sanity.') ||\n schemaType.name === contextDocumentTypeName\n ) {\n return props.renderDefault(props)\n }\n if (\n !isType(props.schemaType, 'document') &&\n props.inputId !== 'root' &&\n props.inputId !== assistFormId\n ) {\n return <AssistField {...props}>{props.children}</AssistField>\n }\n\n return props.renderDefault(props)\n}\n\nfunction AssistField(props: FieldProps) {\n const isPortableText = useMemo(\n () => !!(isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)),\n [props.schemaType],\n )\n\n const presence = useAssistPresence(props.path, isPortableText)\n const singlePresence = presence[0]\n\n const actions = (\n <Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n </Flex>\n )\n\n return props.renderDefault({\n ...props,\n\n actions: props.actions,\n\n // Render presence in the internal slot (between presence and the field actions)\n // oxlint-disable-next-line no-deprecated -- the slot is deprecated for external use but exists specifically for this plugin\n __internal_slot: actions,\n })\n}\n","import {Box, Button, Card, ErrorBoundary, Flex, Stack, Text} from '@sanity/ui'\nimport {type ErrorInfo, type PropsWithChildren, useCallback, useMemo, useState} from 'react'\nimport {type InputProps, isArraySchemaType, PatchEvent, unset} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {isPortableTextArray} from '../helpers/typeUtils'\n\nconst WrapPreCard = styled(Card)`\n & pre {\n white-space: pre-wrap !important;\n }\n`\n\nexport function SafeValueInput(props: InputProps) {\n return (\n <ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>\n )\n}\n\nexport function ErrorWrapper(\n props: PropsWithChildren<{onChange: (patchEvent: PatchEvent) => void}>,\n) {\n const {onChange} = props\n const [error, setError] = useState<Error | undefined>()\n\n const catchError = useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])\n\n const unsetValue = useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])\n const dismiss = useCallback(() => setError(undefined), [])\n const catcher = <ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>\n\n return error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack gap={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )\n}\n\nfunction PteValueFixer(props: InputProps) {\n const isPortableText = useMemo(\n () => isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType),\n [props.schemaType],\n )\n const value = props.value\n // oxlint-disable-next-line no-unsafe-type-assertion\n if (isPortableText && value && !(value as any[]).length) {\n return props.renderDefault({...props, value: undefined})\n }\n\n return props.renderDefault(props)\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {type BlockProps, PatchEvent, useFormCallbacks} from 'sanity'\n\nimport {ErrorWrapper} from '../components/SafeValueInput'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistFormBlock(props: BlockProps) {\n const presence = useAssistPresence(props.path, true)\n const {onChange} = useFormCallbacks()\n const key = props.value._key\n const localOnChange = useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )\n const singlePresence = presence[0]\n return (\n <ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>\n )\n}\n","import {createContext} from 'react'\nimport type {BlockProps} from 'sanity'\n\n// workaround for preview value sometimes lagging behind\nexport const InlineBlockValueContext = createContext<unknown>(undefined)\n\nexport function AssistInlineFormBlock(props: BlockProps) {\n return (\n <InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>\n )\n}\n","import {Box, Flex} from '@sanity/ui'\nimport type {ItemProps} from 'sanity'\n\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistItem(props: ItemProps) {\n const {path} = props\n const presence = useAssistPresence(path, true)\n\n return (\n <Flex align=\"center\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>\n )\n}\n","import {Box, type BoxProps, Flex, focusFirstDescendant, Spinner, Text} from '@sanity/ui'\nimport type React from 'react'\nimport {type HTMLProps, useEffect, useEffectEvent, useMemo, useRef} from 'react'\nimport {tap} from 'rxjs/operators'\nimport {\n createPatchChannel,\n type DocumentMutationEvent,\n type DocumentRebaseEvent,\n FormBuilder,\n fromMutationPatches,\n type PatchMsg,\n useDocumentPresence,\n useDocumentStore,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {assistFormId} from './constants'\n\n// oxlint-disable-next-line no-deprecated\nconst preventDefault = (ev: React.FormEvent) => ev.preventDefault()\n\nexport function DocumentForm(\n props: Omit<BoxProps<'form'>, 'as'> & Omit<HTMLProps<HTMLFormElement>, 'as' | 'onSubmit' | 'ref'>,\n) {\n const {\n collapsedFieldSets,\n collapsedPaths,\n displayed: value,\n documentId,\n documentType,\n editState,\n formState,\n onBlur,\n onChange,\n onFocus,\n onPathOpen,\n onSetActiveFieldGroup,\n onSetCollapsedFieldSet,\n onSetCollapsedPath,\n ready,\n validation,\n } = useDocumentPane()\n\n const documentStore = useDocumentStore()\n const presence = useDocumentPresence(documentId)\n\n // The `patchChannel` is an INTERNAL publish/subscribe channel that we use to notify form-builder\n // nodes about both remote and local patches.\n // - Used by the Portable Text input to modify selections.\n // - Used by `withDocument` to reset value.\n const patchChannel = useMemo(() => createPatchChannel(), [])\n\n const isLocked = editState?.transactionSyncLock?.enabled\n\n useEffect(() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [documentId, documentStore, documentType, patchChannel])\n\n const hasRev = Boolean(value?._rev)\n const patchChannelPublish = useEffectEvent(() => {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n })\n useEffect(() => {\n if (hasRev) {\n // React to changes in hasRev only\n patchChannelPublish()\n }\n }, [hasRev])\n\n const formRef = useRef<null | HTMLFormElement>(null)\n\n useEffect(() => {\n focusFirstDescendant(formRef.current!)\n }, [])\n\n if (isLocked) {\n return (\n <Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>\n )\n }\n\n return (\n <Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>\n )\n}\n\nfunction prepareMutationEvent(event: DocumentMutationEvent): PatchMsg {\n const patches = event.mutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'mutation',\n snapshot: event.document,\n patches: fromMutationPatches(event.origin, patches),\n }\n}\n\nfunction prepareRebaseEvent(event: DocumentRebaseEvent): PatchMsg {\n const remotePatches = event.remoteMutations.map((mut) => mut.patch).filter(Boolean)\n const localPatches = event.localMutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'rebase',\n snapshot: event.document,\n patches: fromMutationPatches('remote', remotePatches).concat(\n fromMutationPatches('local', localPatches),\n ),\n }\n}\n","import {createContext} from 'react'\n\nexport interface AssistTypeContextValue {\n typePath?: string\n documentType?: string\n}\nexport const AssistTypeContext = createContext<AssistTypeContextValue>({})\n","// oxlint-disable no-accumulating-spread\nimport {\n type ArrayOfObjectsFormNode,\n type ArrayOfObjectsItemMember,\n type ArrayOfPrimitivesFormNode,\n type DocumentFormNode,\n type FieldsetState,\n isObjectSchemaType,\n type ObjectFormNode,\n type Path,\n pathToString,\n type SchemaType,\n} from 'sanity'\n\nconst DEFAULT_MAX_DEPTH = 8\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport interface ConditionalMemberState {\n path: string\n hidden: boolean\n readOnly: boolean\n}\n\ninterface ConditionalMemberInnerState extends ConditionalMemberState {\n conditional: boolean\n}\n\n/**\n * This is used to statically determine the state of the functions on the server-side.\n * Paths which has a schema with conditional config should be considered hidden: true and/or readOnly: true\n * Only conditional paths are included, as static props can be determined from schema.\n *\n * Returns paths that has conditional hidden or readOnly schema config (function) and that.\n * Form-state does not contain hidden members.\n *\n * Note:\n * * If a parent path is hidden, no child paths are included\n * * If a parent path is readOnly, no child paths are included\n * * If a path is hidden, it is not included; only conditionally visible paths will be returned, with hidden: false\n */\nexport function getConditionalMembers(\n docState: DocumentFormNode,\n maxDepth = DEFAULT_MAX_DEPTH,\n): ConditionalMemberState[] {\n const doc: ConditionalMemberInnerState = {\n path: '',\n hidden: false,\n readOnly: !!docState.readOnly,\n conditional: isConditional(docState.schemaType),\n }\n return (\n [doc, ...extractConditionalPaths(docState, Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))]\n .filter((v) => v.conditional)\n // oxlint-disable-next-line no-map-spread\n .map(({conditional: _conditional, ...state}) => ({...state}))\n )\n}\n\nfunction isConditional(schemaType: SchemaType) {\n return typeof schemaType.hidden === 'function' || typeof schemaType.readOnly === 'function'\n}\n\nfunction conditionalState(memberState: {\n path: Path\n schemaType: SchemaType\n readOnly?: boolean\n}): ConditionalMemberInnerState {\n return {\n path: pathToString(memberState.path),\n readOnly: !!memberState.readOnly, // Use actual form state readOnly value\n hidden: false, // If it's in form state members, it's not hidden\n conditional: isConditional(memberState.schemaType),\n }\n}\n\nfunction extractConditionalPaths(\n node: ObjectFormNode | FieldsetState,\n maxDepth: number,\n): ConditionalMemberInnerState[] {\n if (node.path.length >= maxDepth) {\n return []\n }\n\n return node.members.reduce<ConditionalMemberInnerState[]>((acc, member) => {\n if (member.kind === 'error') {\n return acc\n }\n if (member.kind === 'field') {\n const schemaType = member.field.schemaType\n if (schemaType.jsonType === 'object') {\n const innerFields = member.field.readOnly\n ? []\n : // oxlint-disable-next-line no-unsafe-type-assertion\n extractConditionalPaths(member.field as ObjectFormNode, maxDepth)\n return [...acc, conditionalState(member.field), ...innerFields]\n } else if (schemaType.jsonType === 'array') {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const array = member.field as ArrayOfObjectsFormNode | ArrayOfPrimitivesFormNode\n\n let arrayPaths: ConditionalMemberInnerState[] = []\n const isObjectsArray = array.members.some(\n (m) => m.kind === 'item' && isObjectSchemaType(m.item.schemaType),\n )\n if (!array.readOnly) {\n for (const arrayMember of array.members) {\n if (arrayMember.kind === 'error') {\n continue\n }\n\n const innerFields =\n isObjectsArray && !arrayMember.item.readOnly\n ? // oxlint-disable-next-line no-unsafe-type-assertion\n extractConditionalPaths((arrayMember as ArrayOfObjectsItemMember).item, maxDepth)\n : []\n\n arrayPaths = [...arrayPaths, conditionalState(arrayMember.item), ...innerFields]\n }\n }\n return [...acc, conditionalState(array), ...arrayPaths]\n }\n\n return [...acc, conditionalState(member.field)]\n } else if (member.kind === 'fieldSet') {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const conditionalFieldset = !!(node as ObjectFormNode).schemaType?.fieldsets?.some(\n (f) => !f.single && f.name === member.fieldSet.name && typeof f.hidden === 'function',\n )\n // oxlint-disable-next-line no-map-spread\n const innerFields = extractConditionalPaths(member.fieldSet, maxDepth).map((f) => ({\n ...f,\n // if fieldset is conditional, visible fields must also be considered conditional\n conditional: conditionalFieldset || f.conditional,\n }))\n return [...acc, ...innerFields]\n }\n\n return acc\n }, [])\n}\n","import {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Box, Button, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {releaseAnnouncementUrl} from '../constants'\n\nconst SparklesIllustration = styled(SparklesIcon)({\n 'fontSize': '3.125em',\n '& path': {\n strokeWidth: `0.6px !important`,\n },\n})\n\nexport function InspectorOnboarding(props: {onDismiss: () => void}) {\n const {onDismiss} = props\n return (\n <Box padding={4}>\n <Container width={0}>\n <Stack gap={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>\n )\n}\n","import {useCallback, useState} from 'react'\n\nexport const inspectorOnboardingKey = 'sanityStudio:assist:inspector:onboarding:dismissed'\n\nfunction isFeatureOnboardingDismissed(featureKey: string): boolean {\n if (typeof localStorage === 'undefined') {\n return false\n }\n\n const value = localStorage.getItem(featureKey)\n return value === 'true'\n}\n\nfunction dismissFeatureOnboarding(featureKey: string) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(featureKey, 'true')\n}\n\nexport function useOnboardingFeature(featureKey: string) {\n const [showOnboarding, setShowOnboarding] = useState(\n () => !isFeatureOnboardingDismissed(featureKey),\n )\n const dismissOnboarding = useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])\n\n return {showOnboarding, dismissOnboarding}\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Card, Flex, Text} from '@sanity/ui'\nimport {Autocomplete} from '@sanity/ui/autocomplete'\nimport {Breadcrumbs} from '@sanity/ui/breadcrumbs'\nimport {useCallback, useMemo} from 'react'\nimport type {ObjectSchemaType} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isType} from '../helpers/typeUtils'\nimport {type FieldRef, getDocumentFieldRef} from './helpers'\n\ninterface FieldSelectorProps {\n id: string\n schemaType: ObjectSchemaType\n fieldPath?: string\n onSelect: (path: string) => void\n includeDocument?: boolean\n filter?: (field: FieldRef) => boolean\n}\n\nexport function FieldAutocomplete(props: FieldSelectorProps) {\n const {id, schemaType, fieldPath, onSelect, includeDocument, filter} = props\n\n const {getFieldRefs} = useAiAssistanceConfig()\n\n const fieldRefs = useMemo(() => {\n const refs = getFieldRefs(schemaType.name)\n if (includeDocument) {\n return [getDocumentFieldRef(schemaType), ...refs]\n }\n return refs\n }, [schemaType, includeDocument, getFieldRefs])\n\n const currentField = useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )\n\n const autocompleteOptions = useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )\n\n const renderOption = useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>\n <field.icon />\n </Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])\n\n const renderValue = useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])\n\n const filterOption = useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])\n\n return (\n <Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />\n )\n}\n\nexport function FieldTitle(props: {field: FieldRef}) {\n const splitTitle = props.field.title.split('/')\n return (\n <Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>\n )\n}\n","import {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {useEffect, useReducer} from 'react'\n\nfunction useInterval(ms: number) {\n const [tick, update] = useReducer((n) => n + 1, 0)\n\n useEffect(() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }, [ms])\n return tick\n}\n\nexport function TimeAgo({date}: {date?: string}) {\n useInterval(1000)\n // oxlint-disable-next-line react/purity\n const timeSince = formatDistanceToNow(date ? new Date(date) : new Date())\n return <span title={timeSince}>{timeSince} ago</span>\n}\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {CloseCircleIcon} from '@sanity/icons/CloseCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {\n Box,\n Button,\n Card,\n Flex,\n Spinner,\n Stack,\n Text,\n useClickOutsideEvent,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport {type Ref, useCallback, useMemo, useState} from 'react'\nimport {StatusButton, type StatusButtonProps, typed, useClient} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nimport {TimeAgo} from '../components/TimeAgo'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport {assistTasksStatusId} from '../helpers/ids'\nimport {getInstructionTitle} from '../helpers/misc'\nimport type {AssistTasksStatus, InstructionTask, StudioInstruction, TaskEndedReason} from '../types'\n\nexport interface InstructionTaskHistoryButtonProps {\n documentId?: string\n tasks: InstructionTask[] | undefined\n instructions: StudioInstruction[] | undefined\n showTitles: boolean\n}\n\ninterface CancelableInstructionTask extends InstructionTask {\n cancel: () => void\n title?: string\n}\n\nconst rotate = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(360deg);\n }\n`\n\nconst SyncSpinningIcon = styled(SyncIcon)`\n animation: ${rotate} 1s linear infinite;\n`\n\nconst TASK_CONFIG = {\n aborted: {\n title: 'Canceled',\n icon: CloseCircleIcon,\n tone: 'transparent',\n },\n error: {\n title: 'Error',\n icon: ErrorOutlineIcon,\n tone: 'critical',\n },\n success: {\n title: 'Completed',\n icon: CheckmarkCircleIcon,\n tone: 'positive',\n },\n timeout: {\n title: 'Timeout',\n icon: ClockIcon,\n tone: 'caution',\n },\n} as const\n\nexport function InstructionTaskHistoryButton(props: InstructionTaskHistoryButtonProps) {\n const {tasks, instructions, documentId, showTitles} = props\n\n const client = useClient({apiVersion: '2023-01-01'})\n const cancelRun = useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )\n\n const titledTasks = useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n // oxlint-disable-next-line no-map-spread\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])\n\n // const id = useId()\n\n const isRunning = useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])\n const hasErrors = useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )\n\n const [open, setOpen] = useState(false)\n\n const toggleOpen = useCallback(() => setOpen((v) => !v), [])\n\n const [button, setButton] = useState<HTMLButtonElement | null>(null)\n const [popover, setPopover] = useState<HTMLDivElement | null>(null)\n\n const handleClickOutside = useCallback(() => {\n setOpen(false)\n }, [])\n\n useClickOutsideEvent(handleClickOutside, () => [button, popover])\n\n const handleEscape = useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])\n\n return (\n <Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nconst TASK_STATUS_BUTTON_TOOLTIP_PROPS: NonNullable<StatusButtonProps['tooltipProps']> = {\n placement: 'top',\n}\n\nfunction TaskStatusButton(props: {\n disabled: boolean\n hasErrors: boolean\n isRunning: boolean\n onClick: () => void\n selected: boolean\n ref?: Ref<HTMLButtonElement>\n}) {\n const {disabled, hasErrors, isRunning, onClick, selected, ref} = props\n\n return (\n <StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />\n )\n}\n\nfunction TaskList(props: {onEscape: () => void; tasks: CancelableInstructionTask[]}) {\n const {onEscape, tasks} = props\n\n const {isTopLayer} = useLayer()\n\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n return (\n <Stack padding={1} gap={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>\n )\n}\n\nfunction TaskItem(props: {task: CancelableInstructionTask}) {\n const {task} = props\n\n const taskType = task.reason && TASK_CONFIG[task.reason]\n const TaskIcon = taskType ? taskType.icon : null\n return (\n <Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {dequal as isEqual} from 'dequal/lite'\n\ntype PaneParams = Record<string, string | undefined>\n\nexport interface IsolatedPathParams {\n /** The `path` value to keep in the nested pane's local state. */\n nextLocalPath: string | undefined\n /**\n * Params to forward to the host pane router, or `null` when only `path`\n * changed — in which case the host router (and therefore the host document's\n * focus and selected field group) is left untouched.\n */\n forwardParams: PaneParams | null\n}\n\n/**\n * The AI Assist inspector renders a nested document form for the instruction\n * document, but it reuses the host document's pane router. Sanity's document\n * pane mirrors the router `path` param to programmatic focus, and focus drives\n * the selected field group. So when the nested form writes `path`, the host\n * document re-focuses and its field group selection resets (SAPP-3970).\n *\n * This keeps the nested form's `path` navigation local, while still forwarding\n * every other param (e.g. the selected `instruction`) to the host router and\n * preserving the host document's own `path`.\n */\nexport function isolatePathParams(\n nextParams: PaneParams,\n hostParams: PaneParams,\n): IsolatedPathParams {\n const {path: nextLocalPath, ...restNext} = nextParams\n const {path: hostPath, ...restHost} = hostParams\n\n if (isEqual(restNext, restHost)) {\n return {nextLocalPath, forwardParams: null}\n }\n\n return {nextLocalPath, forwardParams: {...restNext, path: hostPath}}\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {PlayIcon} from '@sanity/icons/Play'\nimport {RetryIcon} from '@sanity/icons/Retry'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {type PropsWithChildren, useCallback, useMemo, useRef, useState} from 'react'\nimport {\n type DocumentInspectorProps,\n PerspectiveProvider,\n PresenceOverlay,\n VirtualizerScrollInstanceProvider,\n} from 'sanity'\nimport {\n DocumentInspectorHeader,\n type DocumentPaneNode,\n DocumentPaneProvider,\n PaneRouterContext,\n type PaneRouterContextValue,\n useDocumentPane,\n usePaneRouter,\n} from 'sanity/structure'\nimport {styled} from 'styled-components'\n\nimport {DocumentForm} from '../_lib/form'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {AssistTypeContext} from '../assistDocument/components/AssistTypeContext'\nimport {useStudioAssistDocument} from '../assistDocument/hooks/useStudioAssistDocument'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {giveFeedbackUrl, pluginTitle, releaseAnnouncementUrl, salesUrl} from '../constants'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {assistDocumentId} from '../helpers/ids'\nimport {InspectorOnboarding} from '../onboarding/InspectorOnboarding'\nimport {inspectorOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {assistDocumentTypeName, fieldPathParam, instructionParam} from '../types'\nimport {FieldTitle} from './FieldAutocomplete'\nimport {\n type FieldRef,\n getFieldTitle,\n useAiPaneRouter,\n useSelectedField,\n useTypePath,\n} from './helpers'\nimport {InstructionTaskHistoryButton} from './InstructionTaskHistoryButton'\nimport {isolatePathParams} from './isolatePathParams'\n\nconst EMPTY_PANE_PARAMS: Record<string, string | undefined> = {}\n\nconst CardWithShadowBelow = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n border-bottom: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nconst CardWithShadowAbove = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n border-top: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nexport function AssistInspectorWrapper(props: DocumentInspectorProps) {\n const context = useAiAssistanceConfig()\n\n if (context.statusLoading) {\n return (\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack gap={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n const status = context.status\n\n if (!status?.enabled) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n if (!status?.initialized || !status.validToken) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>\n )\n }\n\n return <AssistInspector {...props} />\n}\n\nfunction AssistInspector(props: DocumentInspectorProps) {\n const {params} = useAiPaneRouter()\n\n const boundary = useRef<HTMLDivElement | null>(null)\n const pathKey = params?.[fieldPathParam]\n const instructionKey = params?.[instructionParam]\n const documentPane = useDocumentPane()\n const {\n documentId,\n documentType,\n value: docValue,\n schemaType,\n onChange: documentOnChange,\n formState,\n } = documentPane\n\n const {assistableDocumentId, documentIsAssistable, documentIsSyncing} = useAssistDocumentContext()\n\n const formStateRef = useRef(formState)\n // oxlint-disable-next-line react/refs\n formStateRef.current = formState\n\n const {instructionLoading, requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n })\n\n const typePath = useTypePath(docValue, pathKey ?? '')\n const selectedField = useSelectedField(schemaType, typePath)\n\n const aiDocId = assistDocumentId(documentType)\n\n const assistDocument = useStudioAssistDocument({documentId, schemaType, initDoc: true})\n const assistField = assistDocument?.fields?.find((f) => f.path === typePath)\n const instruction = assistField?.instructions?.find((i) => i._key === instructionKey)\n const tasks = useMemo(\n () =>\n assistDocument?.tasks?.filter((i) => !instructionKey || i.instructionKey === instructionKey),\n [assistDocument?.tasks, instructionKey],\n )\n const instructions = useMemo(\n () => assistDocument?.fields?.flatMap((f) => f.instructions ?? []),\n [assistDocument?.fields],\n )\n\n const promptValue = instruction?.prompt\n const isEmptyPrompt = useMemo(() => {\n if (!promptValue?.length) {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const firstBlock = promptValue[0] as any\n const children = firstBlock?.children\n\n return promptValue.length == 1 && children?.length === 1 && !children?.[0]?.text?.length\n }, [promptValue])\n\n const paneNode: DocumentPaneNode = useMemo(\n () => ({\n type: 'document',\n id: aiDocId,\n title: pluginTitle,\n options: {\n id: aiDocId,\n type: assistDocumentTypeName,\n },\n }),\n [aiDocId],\n )\n\n const runCurrentInstruction = useCallback(\n () =>\n instruction &&\n pathKey &&\n typePath &&\n requestRunInstruction({\n documentId: assistableDocumentId,\n path: pathKey,\n typePath,\n assistDocumentId: assistDocumentId(documentType),\n instruction,\n conditionalMembers: formStateRef.current ? getConditionalMembers(formStateRef.current) : [],\n }),\n [pathKey, instruction, typePath, documentType, assistableDocumentId, requestRunInstruction],\n )\n\n const Region = useCallback((_props: any) => {\n // disabled for now\n /* return (\n <ConnectToRegion\n {..._props}\n _key={`${paneKey}_${selectedField?.key || '_field'}`}\n style={{height: '100%', flex: 1, overflow: 'auto'}}\n />\n )*/\n return <div {..._props} style={{height: '100%', flex: 1, overflow: 'auto'}} />\n }, [])\n\n const assistTypeContext = useMemo(() => ({typePath, documentType}), [typePath, documentType])\n\n if (!documentId || !schemaType || schemaType.jsonType !== 'object') {\n return (\n <Card flex={1} padding={4}>\n <Text>Document not ready yet.</Text>\n </Card>\n )\n }\n\n return (\n <Flex\n ref={boundary}\n direction=\"column\"\n height=\"fill\"\n overflow=\"hidden\"\n sizing=\"border\"\n style={{lineHeight: 0}}\n >\n <AiInspectorHeader\n onClose={props.onClose}\n field={selectedField}\n fieldTitle={getFieldTitle(selectedField)}\n />\n\n <Card as={Region} flex={1} overflow=\"auto\">\n <Flex direction=\"column\" style={{minHeight: '100%'}}>\n <Box flex={1}>\n <PresenceOverlay>\n <Box padding={4}>\n {selectedField && (\n <AssistTypeContext.Provider value={assistTypeContext}>\n <VirtualizerScrollInstanceProvider\n // oxlint-disable-next-line react/refs\n scrollElement={boundary.current}\n containerElement={boundary}\n >\n <PerspectiveProvider selectedPerspectiveName={undefined}>\n <IsolatedPathPaneRouterProvider>\n <DocumentPaneProvider\n paneKey={documentPane.paneKey}\n index={documentPane.index}\n itemId=\"ai\"\n pane={paneNode}\n >\n <DocumentForm />\n </DocumentPaneProvider>\n </IsolatedPathPaneRouterProvider>\n </PerspectiveProvider>\n </VirtualizerScrollInstanceProvider>\n </AssistTypeContext.Provider>\n )}\n </Box>\n </PresenceOverlay>\n </Box>\n\n <Box flex=\"none\" padding={4}>\n <Text muted size={1}>\n How is Sanity AI Assist working for you?{' '}\n <a\n href={giveFeedbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{whiteSpace: 'nowrap'}}\n >\n Let us know <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n </Flex>\n </Card>\n <CardWithShadowAbove flex=\"none\" paddingX={4} paddingY={3} style={{justifySelf: 'flex-end'}}>\n <Flex gap={2} flex={1} justify=\"flex-end\">\n {schemaType?.name && pathKey && instructionKey && (\n <Stack flex={1}>\n <Button\n mode=\"ghost\"\n disabled={isEmptyPrompt || instructionLoading}\n fontSize={1}\n icon={instructionLoading ? <Spinner style={{marginTop: 3}} /> : PlayIcon}\n onClick={runCurrentInstruction}\n padding={3}\n text={'Run instruction'}\n />\n </Stack>\n )}\n\n <InstructionTaskHistoryButton\n documentId={assistableDocumentId}\n tasks={tasks}\n instructions={instructions}\n showTitles={!instructionKey}\n />\n </Flex>\n </CardWithShadowAbove>\n </Flex>\n )\n}\n\n/**\n * The instruction editor below renders a nested document form that reuses the\n * host document's pane router. Sanity's document pane mirrors the router `path`\n * param to programmatic focus, and focus drives the selected field group. So\n * without isolation, navigating the instruction form overwrites the host `path`\n * and resets the host document's field group selection (SAPP-3970).\n *\n * This provider keeps the nested form's `path` navigation in local state while\n * still forwarding every other param (e.g. the selected instruction) to the\n * host pane router.\n */\nfunction IsolatedPathPaneRouterProvider(props: PropsWithChildren) {\n const parentRouter = usePaneRouter()\n const parentParams = parentRouter.params ?? EMPTY_PANE_PARAMS\n const parentSetParams = parentRouter.setParams\n\n const [localPath, setLocalPath] = useState<string | undefined>(undefined)\n\n const setParams = useCallback<PaneRouterContextValue['setParams']>(\n (nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n },\n [parentParams, parentSetParams],\n )\n\n const value = useMemo<PaneRouterContextValue>(\n () => ({\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }),\n [parentRouter, parentParams, localPath, setParams],\n )\n\n return <PaneRouterContext.Provider value={value}>{props.children}</PaneRouterContext.Provider>\n}\n\nfunction AiInspectorHeader(props: {fieldTitle: string; field?: FieldRef; onClose: () => void}) {\n const {onClose, field, fieldTitle} = props\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(inspectorOnboardingKey)\n\n return (\n <CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>\n )\n}\n","export const aiInspectorId = 'ai-assistance'\n","import {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {type DocumentInspector, typed} from 'sanity'\n\nimport {pluginTitle} from '../constants'\nimport {type AssistInspectorRouteParams, fieldPathParam, instructionParam} from '../types'\nimport {AssistInspectorWrapper} from './AssistInspector'\nimport {aiInspectorId} from './constants'\n\nexport const assistInspector: DocumentInspector = {\n name: aiInspectorId,\n useMenuItem: () => ({\n icon: SparklesIcon,\n title: pluginTitle,\n hidden: true,\n showAsAction: false,\n }),\n component: AssistInspectorWrapper,\n onClose({params}) {\n return {\n params: typed<AssistInspectorRouteParams>({\n ...params,\n [fieldPathParam]: undefined,\n [instructionParam]: undefined,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as typeof params,\n }\n },\n}\n","import type {ConnectorOptions} from '../../_lib/connector'\n\nexport function arrowPath(options: ConnectorOptions, x: number, y: number, dir: 1 | -1): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n","import type {ConnectorLine, ConnectorOptions} from '../../_lib/connector'\n\nfunction moveTo(x: number, y: number) {\n return `M${x} ${y}`\n}\n\nfunction lineTo(x: number, y: number) {\n return `L${x} ${y}`\n}\n\nfunction join(strings: string[], delim = '') {\n return strings.join(delim)\n}\n\nfunction quadCurve(x1: number, y1: number, x: number, y: number) {\n return `Q${x1} ${y1} ${x} ${y}`\n}\n\nexport function drawConnectorPath(options: ConnectorOptions, line: ConnectorLine): string {\n const {cornerRadius} = options.path\n const {from, to} = line\n const {x: fromX, y: fromY} = from\n const {x: _toX, y: toY} = to\n\n const toX = _toX - 1\n\n // Calculate divider position\n const dividerX = to.bounds.x + options.divider.offsetX\n\n // Calculate connector FROM path X position\n const fromPathX = from.isAbove || from.isBelow ? fromX + options.arrow.marginX : fromX\n\n // Calculate maximum corner radius\n const r0 = Math.min(cornerRadius, Math.abs(fromPathX - dividerX) / 2)\n const r1 = Math.min(cornerRadius, Math.abs(fromY - toY) / 2)\n\n const cmds: string[] = []\n\n // FROM\n if (from.isAbove) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY - options.arrow.threshold + options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY - r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else if (from.isBelow) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY + options.arrow.threshold - options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY + r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else {\n cmds.push(moveTo(fromX, fromY))\n }\n\n // TO\n if (to.isAbove) {\n if (fromY < to.bounds.y) {\n cmds.push(\n lineTo(dividerX - r1, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n }\n } else if (to.isBelow) {\n if (fromY > to.bounds.y + to.bounds.h) {\n // curl around\n cmds.push(\n lineTo(dividerX - options.arrow.marginX - r1, fromY),\n quadCurve(\n dividerX - options.arrow.marginX,\n fromY,\n dividerX - options.arrow.marginX,\n fromY - r1,\n ),\n lineTo(dividerX - options.arrow.marginX, toY + r1),\n quadCurve(\n dividerX - options.arrow.marginX,\n toY,\n dividerX - options.arrow.marginX + r1,\n toY,\n ),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n }\n } else if (fromY < toY) {\n cmds.push(\n lineTo(dividerX - r0, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - Math.min(r0, r1), fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - Math.min(r0, r1)),\n lineTo(dividerX, toY + r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n }\n\n return join(cmds)\n}\n","// oxlint-disable no-deprecated\nimport {rgba, useTheme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {type ConnectorOptions, mapConnectorToLine, type Rect} from '../_lib/connector'\nimport {arrowPath} from './draw/arrowPath'\nimport {drawConnectorPath} from './draw/connectorPath'\n\nexport function ConnectorPath(props: {\n from: {bounds: Rect; element: Rect}\n to: {bounds: Rect; element: Rect}\n options: ConnectorOptions\n}) {\n const {from, options, to} = props\n const {strokeWidth} = options.path\n const theme = useTheme()\n\n const line = useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])\n\n return (\n <>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>\n )\n}\n","import {Fragment, useEffect, useState} from 'react'\n\nimport type {Connector, ConnectorOptions} from '../_lib/connector'\nimport {ConnectorPath} from './ConnectorPath'\n\nconst DEBUG = false\n\nconst options: ConnectorOptions = {\n arrow: {\n marginX: 10.5,\n marginY: 5,\n size: 4,\n threshold: 16.5,\n },\n divider: {\n offsetX: -10.5,\n },\n path: {\n cornerRadius: 3,\n marginY: 10.5,\n strokeWidth: 1,\n },\n}\n\nexport function AssistConnectorsOverlay(props: {connectors: Connector[]}) {\n const {connectors} = props\n // const zIndexes = connectors.map((connector) => {\n // const zIndex = connector.from.payload?.zIndex\n\n // if (typeof zIndex === 'number') {\n // return zIndex\n // }\n\n // return 1\n // })\n const [, setRedraw] = useState(false)\n useEffect(() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n // oxlint-disable-next-line react/set-state-in-effect\n setRedraw(true)\n }, [])\n\n // const zIndex = zIndexes.length ? Math.max(...zIndexes) : 1\n\n return (\n <>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>\n )\n}\n","import {packageName} from '../constants'\nimport type {TranslateStyleguide, TranslateStyleguideContext} from '../translate/types'\n\nexport function validateStyleguide(styleguide: string | undefined) {\n if (styleguide && styleguide.length > 2000) {\n throw new Error(\n `[${packageName}]: \\`translate.styleguide\\` value is too long. It must be 2000 characters or less, but was ${styleguide.length} characters`,\n )\n }\n return styleguide\n}\n\nexport function createStyleGuideResolver(\n styleguide: TranslateStyleguide | undefined,\n context: TranslateStyleguideContext,\n) {\n return async () => {\n if (typeof styleguide !== 'function') {\n return styleguide\n }\n const styleguideResult = await styleguide(context)\n return validateStyleguide(styleguideResult)\n }\n}\n","import get from 'lodash-es/get.js'\nimport type {SanityDocumentLike} from 'sanity'\n\nexport const getLanguageParams = (\n select: Record<string, string> | undefined,\n document: SanityDocumentLike | undefined,\n): Record<string, unknown> => {\n if (!select || !document) {\n return {}\n }\n\n const selection: Record<string, string> = select || {}\n const selectedValue: Record<string, unknown> = {}\n for (const [key, path] of Object.entries(selection)) {\n let value = get(document, path)\n if (Array.isArray(value)) {\n // If there are references in the array, ensure they have `_ref` set, otherwise they are considered empty and can safely be ignored\n value = value.filter((item) =>\n typeof item === 'object' ? item?._type !== 'reference' || '_ref' in item : true,\n )\n }\n selectedValue[key] = value\n }\n\n return selectedValue\n}\n","const toFieldLanguagesKeyPrefix = 'sanityStudio:assist:field-languages:from:'\n\nexport function getPreferredToFieldLanguages(fromLanguageId: string): string[] {\n if (typeof localStorage === 'undefined') {\n return []\n }\n\n const value = localStorage.getItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`)\n if (!value) return []\n try {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return JSON.parse(value) as string[]\n } catch {\n return []\n }\n}\n\nexport function setPreferredToFieldLanguages(fromLanguageId: string, languageIds: string[]) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`, JSON.stringify(languageIds))\n}\n","// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nconst getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).substring(1)\n }\n return table\n }\n})()\n\nexport function randomKey(length?: number) {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","// oxlint-disable no-accumulating-spread\nimport {extractWithPath} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n isKeySegment,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n isRecord,\n} from 'sanity'\n\nimport {randomKey} from '../_lib/randomKey'\nimport type {DocumentMember, TranslationOutput, TranslationOutputsFunction} from './types'\n\nexport interface FieldLanguageMap {\n inputLanguageId: string\n inputPath: Path\n outputs: TranslationOutput[]\n relativeLanguagePath?: Path\n}\n\nconst DEFAULT_MAX_DEPTH = 6\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport function getDocumentMembersFlat(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_DEPTH,\n) {\n if (!isDocumentSchemaType(schemaType)) {\n console.error(`Schema type is not a document`)\n return []\n }\n\n return extractPaths(doc, schemaType, [], Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))\n}\n\nfunction extractPaths(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n path: Path,\n maxDepth: number,\n): DocumentMember[] {\n if (path.length >= maxDepth) {\n return []\n }\n\n return schemaType.fields.reduce<DocumentMember[]>((acc, field) => {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const parentValue = path.length ? extractWithPath(pathToString(path), doc)[0]?.value : doc\n const value = isRecord(parentValue) ? parentValue[field.name] : undefined\n\n if (value === undefined || value === null) {\n return acc\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n parentValue,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath, maxDepth)\n\n return [...acc, thisFieldWithPath, ...innerFields]\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item) &&\n // no reason to drill into arrays if the item fields will be culled by maxDepth, ie we need 1 extra path headroom\n path.length + 1 < maxDepth\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n let arrayPaths: DocumentMember[] = []\n // oxlint-disable-next-line no-unsafe-type-assertion\n if ((arrayValue as any)?.length) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n for (const item of arrayValue as any[]) {\n const itemPath = [...fieldPath, {_key: item._key}]\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n console.warn(\n 'Array item is missing _type - using the first defined type in the array.of schema',\n {\n itemPath,\n item,\n itemSchema,\n },\n )\n }\n if (item._key && itemSchema) {\n const innerFields = extractPaths(\n doc,\n // oxlint-disable-next-line no-unsafe-type-assertion\n itemSchema as ObjectSchemaType,\n itemPath,\n maxDepth,\n )\n const arrayMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n parentValue: arrayValue,\n }\n arrayPaths = [...arrayPaths, arrayMember, ...innerFields]\n }\n }\n }\n\n return [...acc, thisFieldWithPath, ...arrayPaths]\n }\n\n return [...acc, thisFieldWithPath]\n }, [])\n}\n\ntype InternationalizedArrayItemValue = {\n language?: string // Available in >=v5\n _key?: string // In <v5 this represents the language identifier\n value?: unknown\n}\n\nconst isInternationalizedArrayItemValue = (\n value: unknown,\n): value is InternationalizedArrayItemValue =>\n typeof value === 'object' && value !== null && ('language' in value || '_key' in value)\n\nexport const defaultLanguageOutputs: TranslationOutputsFunction = function (\n member,\n enclosingType,\n translateFromLanguageId,\n translateToLanguageIds,\n) {\n if (\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray') &&\n isInternationalizedArrayItemValue(member.value)\n ) {\n const isV5InternationalizedArrayItem = member.value.language !== undefined\n\n if (isV5InternationalizedArrayItem) {\n const language = member.value.language\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => {\n const outputPathKey =\n (Array.isArray(member.parentValue)\n ? member.parentValue\n : ([] as InternationalizedArrayItemValue[])\n )\n // Uses parent value to verify if the item is already translated to the target language and reuse the key if it is\n .find((item) => item.language === translateToId)?._key || randomKey()\n\n return {\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: outputPathKey}],\n }\n })\n : undefined\n }\n\n const pathEnd = member.path.slice(-1)\n\n const language = pathEnd[0] && isKeySegment(pathEnd[0]) ? pathEnd[0]._key : null\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: translateToId}],\n }))\n : undefined\n }\n\n if (enclosingType.jsonType === 'object' && enclosingType.name.startsWith('locale')) {\n return translateFromLanguageId === member.name\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), translateToId],\n }))\n : undefined\n }\n\n return undefined\n}\n\nexport function getFieldLanguageMap(\n documentSchema: ObjectSchemaType,\n documentMembers: DocumentMember[],\n translateFromLanguageId: string,\n outputLanguageIds: string[],\n langFn: TranslationOutputsFunction,\n): FieldLanguageMap[] {\n const translationMaps: FieldLanguageMap[] = []\n for (const member of documentMembers) {\n const parentPath = member.path.slice(0, -1)\n const enclosingType =\n documentMembers.find((m) => pathToString(m.path) === pathToString(parentPath))?.schemaType ??\n documentSchema\n\n const isV5InternationalizedArrayItem =\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray') &&\n isInternationalizedArrayItemValue(member.value) &&\n member.value.language !== undefined\n\n const translations = langFn(\n member,\n enclosingType,\n translateFromLanguageId,\n outputLanguageIds,\n )?.filter((translation) => translation.id !== translateFromLanguageId)\n\n if (translations) {\n translationMaps.push({\n inputLanguageId: translateFromLanguageId,\n inputPath: member.path,\n outputs: translations,\n ...(isV5InternationalizedArrayItem ? {relativeLanguagePath: ['language']} : {}),\n })\n }\n }\n\n return translationMaps\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Box, Button, Checkbox, Dialog, Flex, Radio, Spinner, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n useClient,\n} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from '../helpers/conditionalMembers'\nimport {getAssistWriteDocumentId} from '../helpers/ids'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {getLanguageParams} from './getLanguageParams'\nimport {getPreferredToFieldLanguages, setPreferredToFieldLanguages} from './languageStore'\nimport {\n defaultLanguageOutputs,\n type FieldLanguageMap,\n getDocumentMembersFlat,\n getFieldLanguageMap,\n} from './paths'\nimport type {Language} from './types'\n\ninterface FieldTranslationParams {\n document: SanityDocumentLike\n documentSchema: ObjectSchemaType\n translatePath: Path\n conditionalMembers: ConditionalMemberState[]\n}\n\nexport interface FieldTranslationContextValue {\n openFieldTranslation: (args: FieldTranslationParams) => void\n translationLoading: boolean\n}\n\nconst FieldTranslationContext = createContext<FieldTranslationContextValue>({\n openFieldTranslation: () => {},\n translationLoading: false,\n})\n\nexport function useFieldTranslation() {\n return useContext(FieldTranslationContext)\n}\n\nfunction hasValuesToTranslate(\n fieldLanguageMaps: FieldLanguageMap[] | undefined,\n fromLanguage: Language | undefined,\n basePath: Path,\n) {\n return fieldLanguageMaps?.some(\n (map) =>\n map.inputLanguageId === fromLanguage?.id &&\n map.inputPath &&\n pathToString(map.inputPath).startsWith(pathToString(basePath)),\n )\n}\n\nexport function FieldTranslationProvider(props: PropsWithChildren<{}>) {\n const {config: assistConfig} = useAiAssistanceConfig()\n\n const apiClient = useApiClient(assistConfig.__customApiClient)\n const styleguide = assistConfig.translate?.styleguide\n const config = assistConfig.translate?.field\n const {translate: runTranslate} = useTranslate(apiClient)\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [fieldTranslationParams, setFieldTranslationParams] = useState<\n FieldTranslationParams | undefined\n >()\n const [languages, setLanguages] = useState<Language[] | undefined>()\n const [fromLanguage, setFromLanguage] = useState<Language | undefined>(undefined)\n const [toLanguages, setToLanguages] = useState<Language[] | undefined>(undefined)\n const [fieldLanguageMaps, setFieldLanguageMaps] = useState<FieldLanguageMap[] | undefined>()\n\n const close = useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])\n const languageClient = useClient({\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n })\n const documentId = fieldTranslationParams?.document?._id\n const id = useId()\n\n const selectFromLanguage = useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )\n\n const toggleToLanguage = useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )\n\n const openFieldTranslation = useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )\n\n const contextValue: FieldTranslationContextValue = useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])\n\n const runDisabled =\n !fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)\n\n const onRunTranslation = useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])\n\n const runButton = (\n <Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />\n )\n\n return (\n <FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>\n )\n}\n\nfunction ToLanguageCheckbox(props: {\n checkboxLanguage: Language\n fromLanguage: Language | undefined\n toLanguages: Language[] | undefined\n toggleToLanguage: (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => void\n languages: Language[]\n}) {\n const {checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages} = props\n const langId = checkboxLanguage.id\n const onChange = useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )\n return (\n <Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>\n )\n}\n\nfunction FromLanguageRadio(props: {\n radioLanguage: Language\n fromLanguage: Language | undefined\n selectFromLanguage: (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => void\n languages: Language[] | undefined\n fieldTranslationParams: FieldTranslationParams | undefined\n}) {\n const {languages, radioLanguage, selectFromLanguage, fromLanguage, fieldTranslationParams} = props\n const langId = radioLanguage.id\n\n const onChange = useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )\n return (\n <Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>\n )\n}\n","import {assistSerializedFieldTypeName, assistSerializedTypeName} from '../../types'\n\nexport const hiddenTypes = [\n 'any',\n 'array',\n 'block',\n 'boolean',\n 'crossDatasetReference',\n 'date',\n 'datetime',\n 'document',\n 'email',\n 'file',\n 'globalDocumentReference',\n 'image',\n 'number',\n 'object',\n 'reference',\n 'span',\n 'string',\n 'text',\n 'url',\n 'slug',\n 'geopoint',\n 'sanity.assetSourceData',\n 'sanity.imageAsset',\n 'sanity.fileAsset',\n 'sanity.imageCrop',\n 'sanity.imageHotspot',\n 'sanity.imageMetadata',\n 'sanity.imageDimensions',\n 'sanity.imagePalette',\n 'sanity.imagePaletteSwatch',\n\n assistSerializedTypeName,\n assistSerializedFieldTypeName,\n 'sanity-agent.job.document',\n]\n","import {\n type ArraySchemaType,\n type ImageOptions,\n isArraySchemaType,\n type ObjectSchemaType,\n type ReferenceOptions,\n type ReferenceSchemaType,\n type Schema,\n type SchemaType,\n typed,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../helpers/assistSupported'\nimport {isType} from '../../helpers/typeUtils'\nimport {\n assistSchemaIdPrefix,\n assistSerializedFieldTypeName,\n assistSerializedTypeName,\n type SerializedSchemaMember,\n type SerializedSchemaType,\n} from '../../types'\nimport {hiddenTypes} from './schemaUtils'\n\ninterface Options {\n leanFormat?: boolean\n}\n\n// oxlint-disable-next-line prefer-set-has\nconst inlineTypes = ['document', 'object', 'image', 'file']\n\nexport function serializeSchema(schema: Schema, options?: Options): SerializedSchemaType[] {\n const list = schema\n .getTypeNames()\n .filter((t) => !(hiddenTypes.includes(t) || t.startsWith('sanity.')))\n .map((t) => schema.get(t))\n .filter((t): t is SchemaType => !!t)\n // because a field can override exclude at the type level, we have to also serialize excluded types\n // so don't do this: .filter((t) => isAssistSupported(t))\n .map((t) => getSchemaStub(t, schema, options))\n .filter((t) => {\n if ('to' in t && t.to && !t.to.length) {\n return false\n }\n if ('of' in t && t.of && !t.of.length) {\n return false\n }\n if ('fields' in t && t.fields && !t.fields.length) {\n return false\n }\n return true\n })\n list.sort((a, b) => (a?.name ?? '').localeCompare(b?.name ?? ''))\n return list\n}\n\nfunction getSchemaStub(\n schemaType: SchemaType,\n schema: Schema,\n options?: Options,\n): SerializedSchemaType {\n if (!schemaType.type?.name) {\n console.error('Missing type name', schemaType.type)\n throw new Error('Type is missing name!')\n }\n const baseSchema: SerializedSchemaType = {\n // we dont need type or id when we send using POST, so leave these out to save bandwidth\n ...(options?.leanFormat\n ? {}\n : {_id: `${assistSchemaIdPrefix}${schemaType.name}`, _type: assistSerializedTypeName}),\n name: schemaType.name,\n title: schemaType.title,\n type: schemaType.type.name,\n ...getBaseFields(schema, schemaType, schemaType.type.name, options),\n }\n\n return removeUndef(baseSchema)\n}\n\nfunction getBaseFields(\n schema: Schema,\n type: SchemaType,\n typeName: string,\n options: Options | undefined,\n) {\n const schemaOptions: SerializedSchemaType['options'] = removeUndef({\n // oxlint-disable-next-line no-unsafe-type-assertion\n imagePromptField: (type.options as ImageOptions)?.aiAssist?.imageInstructionField,\n // oxlint-disable-next-line no-unsafe-type-assertion\n embeddingsIndex: (type.options as ReferenceOptions)?.aiAssist?.embeddingsIndex,\n })\n return removeUndef({\n options: Object.keys(schemaOptions).length ? schemaOptions : undefined,\n values: Array.isArray(type?.options?.list)\n ? type?.options?.list.map((v: string | {value: string; title: string}) =>\n typeof v === 'string' ? v : (v.value ?? v.title),\n )\n : undefined,\n of: 'of' in type && typeName === 'array' ? arrayOf(type, schema, options) : undefined,\n to: 'to' in type && typeName === 'reference' ? refToTypeNames(type) : undefined,\n fields:\n 'fields' in type && inlineTypes.includes(typeName)\n ? serializeFields(schema, type, options)\n : undefined,\n annotations:\n typeName === 'block' && 'fields' in type\n ? serializeAnnotations(type, schema, options)\n : undefined,\n inlineOf:\n typeName === 'block' && 'fields' in type\n ? serializeInlineOf(type, schema, options)\n : undefined,\n hidden:\n typeof type.hidden === 'function' ? ('function' as const) : type.hidden ? true : undefined,\n readOnly:\n typeof type.readOnly === 'function'\n ? ('function' as const)\n : type.readOnly\n ? true\n : undefined,\n })\n}\n\nfunction serializeFields(\n schema: Schema,\n schemaType: ObjectSchemaType,\n options: Options | undefined,\n) {\n const fields = schemaType.fieldsets\n ? schemaType.fieldsets.flatMap((fs) =>\n fs.single\n ? fs.field\n : fs.fields.map((f) => ({\n ...f,\n type: {\n ...f.type,\n // if fieldset is (conditionally) hidden, the field must be considered the same way\n // ie, if the field does not show up in conditionalMembers, it is hidden\n // regardless of weather or not it is the field function or the fieldset function that hides it\n hidden:\n typeof fs.hidden === 'function' ? fs.hidden : fs.hidden ? true : f.type.hidden,\n },\n })),\n )\n : schemaType.fields\n\n return fields\n .filter((f) => !['sanity.imageHotspot', 'sanity.imageCrop'].includes(f.type?.name ?? ''))\n .filter((f) => isAssistSupported(f.type))\n .map((field) => serializeMember(schema, field.type, field.name, options))\n}\n\nfunction serializeMember(\n schema: Schema,\n type: SchemaType,\n name: string,\n options: Options | undefined,\n): SerializedSchemaMember {\n const typeNameExists = !!schema.get(type?.name)\n const typeName = typeNameExists ? type.name : (type.type?.name ?? '')\n return removeUndef({\n ...(options?.leanFormat ? {} : {_type: assistSerializedFieldTypeName}),\n name: name,\n type: typeName,\n title: type.title,\n ...getBaseFields(schema, type, typeName, options),\n })\n}\n\nfunction serializeInlineOf(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const childrenField = blockSchemaType.fields.find((f) => f.name === 'children')\n const childrenType = childrenField?.type\n if (!childrenType || !isArraySchemaType(childrenType)) {\n return undefined\n }\n return arrayOf(\n {\n ...childrenType,\n of: childrenType.of.filter((t) => !isType(t, 'span')),\n },\n schema,\n options,\n )\n}\n\nfunction serializeAnnotations(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const markDefs = blockSchemaType.fields.find((f) => f.name === 'markDefs')\n const marksType = markDefs?.type\n if (!marksType || !isArraySchemaType(marksType)) {\n return undefined\n }\n return arrayOf(marksType, schema, options)\n}\n\nfunction arrayOf(\n arrayType: ArraySchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] {\n return arrayType.of\n .filter((type) => isAssistSupported(type))\n .map((t) => {\n return serializeMember(schema, t, t.name, options)\n })\n}\n\nfunction refToTypeNames(type: ReferenceSchemaType) {\n return type.to.map((t) => ({\n type: typed<string>(t.name),\n }))\n}\n\nfunction removeUndef<T extends Record<string, any>>(obj: T): T {\n Object.keys(obj).forEach((key) => (obj[key] === undefined ? delete obj[key] : {}))\n return obj\n}\n","import type {ObjectSchemaType} from 'sanity'\n\nimport {\n asFieldRefsByTypePath,\n type FieldRef,\n getFieldRefs as createFieldRefs,\n} from '../assistInspector/helpers'\n\n/**\n * @param maxFieldSelectionDepth - see `AssistConfig.maxFieldSelectionDepth`; uses the plugin\n * default when omitted\n */\nexport function createFieldRefCache(maxFieldSelectionDepth?: number) {\n const byType: Record<\n string,\n | {\n fieldRefs: FieldRef[]\n fieldRefsByTypePath: Record<string, FieldRef | undefined>\n }\n | undefined\n > = {}\n\n function getRefsForType(schemaType: ObjectSchemaType) {\n const documentType = schemaType.name\n const cached = byType[documentType]\n if (cached) return cached\n\n const fieldRefs = createFieldRefs(schemaType, maxFieldSelectionDepth)\n const fieldRefsByTypePath = asFieldRefsByTypePath(fieldRefs)\n const refs = {\n fieldRefs,\n fieldRefsByTypePath,\n }\n byType[documentType] = refs\n return refs\n }\n\n return getRefsForType\n}\n","import {type ReactNode, useCallback, useEffect, useMemo, useState} from 'react'\nimport {type ObjectSchemaType, type Schema, useSchema} from 'sanity'\n\nimport type {AssistPluginConfig} from '../plugin'\nimport {serializeSchema} from '../schemas/serialize/serializeSchema'\nimport {\n type InstructStatus,\n useApiClient,\n useGetInstructStatus,\n useInitInstruct,\n} from '../useApiClient'\nimport {\n AiAssistanceConfigContext,\n type AiAssistanceConfigContextValue,\n} from './AiAssistanceConfigContext'\nimport {createFieldRefCache} from './fieldRefCache'\n\nexport function AiAssistanceConfigProvider(props: {\n children?: ReactNode\n config: AssistPluginConfig\n}) {\n const [status, setStatus] = useState<InstructStatus | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const apiClient = useApiClient(props.config?.__customApiClient)\n const {getInstructStatus, loading: statusLoading} = useGetInstructStatus(apiClient)\n const {initInstruct, loading: initLoading} = useInitInstruct(apiClient)\n\n const schema = useSchema()\n const serializedTypes = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const {getFieldRefs, getFieldRefsByTypePath} = useFieldRefGetters(\n schema,\n props.config.assist?.maxFieldSelectionDepth,\n )\n\n useEffect(() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n })\n }, [getInstructStatus])\n\n const init = useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])\n\n const {config, children} = props\n const context = useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }\n }, [\n config,\n status,\n init,\n statusLoading,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n ])\n\n return (\n <AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>\n )\n}\n\nfunction useFieldRefGetters(schema: Schema, maxFieldSelectionDepth?: number) {\n return useMemo(() => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n\n function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }\n\n return {\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }\n }, [schema, maxFieldSelectionDepth])\n}\n","import {ThemeProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport type {LayoutProps} from 'sanity'\n\nimport {type Connector, ConnectorsProvider} from '../_lib/connector'\nimport {AssistConnectorsOverlay} from '../assistConnectors'\nimport type {AssistPluginConfig} from '../plugin'\nimport {FieldTranslationProvider} from '../translate/FieldTranslationProvider'\nimport type {StudioInstruction} from '../types'\nimport type {RunInstructionRequest} from '../useApiClient'\nimport {AiAssistanceConfigProvider} from './AiAssistanceConfigProvider'\nimport {RunInstructionProvider} from './RunInstructionProvider'\n\nexport interface AIStudioLayoutProps extends LayoutProps {\n config: AssistPluginConfig\n}\n\nexport type RunInstructionArgs = Omit<RunInstructionRequest, 'instructionKey' | 'userTexts'> & {\n instruction: StudioInstruction\n}\n\nexport function AssistLayout(props: AIStudioLayoutProps) {\n const [connectors, setConnectors] = useState<Connector[]>([])\n\n return (\n <AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>\n )\n}\n","import {createContext, useEffect, useMemo, useState} from 'react'\nimport {type InputProps, pathToString} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {getDescriptionFieldOption, getImageInstructionFieldOption} from '../helpers/typeUtils'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nexport interface ImageContextValue {\n imageDescriptionPath?: string\n imageInstructionPath?: string\n assetRef?: string\n}\n\nexport const ImageContext = createContext<ImageContextValue>({})\n\nexport function ImageContextProvider(props: InputProps) {\n const {schemaType, path, value, readOnly} = props\n // oxlint-disable-next-line no-unsafe-type-assertion\n const assetRef = (value as any)?.asset?._ref\n const [assetRefState, setAssetRefState] = useState<string | undefined>(assetRef)\n\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption} = useGenerateCaption(apiClient)\n const generateCaptionWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n })\n\n const router = usePaneRouter()\n const isShowingOlderRevision = !!router.params?.['rev']\n\n useEffect(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !documentIsSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n // oxlint-disable-next-line react/set-state-in-effect\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaptionWhenDraftReady({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }, [\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaptionWhenDraftReady,\n documentIsSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ])\n\n const context: ImageContextValue = useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])\n\n return <ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>\n}\n","import {icons, Icon, type IconSymbol} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {useCallback, useId, useMemo} from 'react'\nimport {set, type StringInputProps} from 'sanity'\n\nexport function IconInput(props: StringInputProps) {\n const {value, onChange} = props\n const id = useId()\n const items = useMemo(\n () =>\n Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />),\n [onChange],\n )\n\n const selectedSymbol = useMemo(() => getIcon(value), [value])\n\n return (\n <MenuButton\n button={\n <Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />\n )\n}\n\nfunction IconItem({\n iconKey: key,\n onChange,\n}: {\n iconKey: IconSymbol\n onChange: StringInputProps['onChange']\n}) {\n const onClick = useCallback(() => onChange(set(key)), [onChange, key])\n // `Icon` wraps the lazy-loaded icon in its own `Suspense` boundary. Rendering the raw\n // lazy component from `icons` would suspend the whole menu (there is no boundary between\n // it and the popover), which unmounts the menu and closes it before it can be seen.\n return <MenuItem icon={<Icon symbol={key} />} title={key} text={key} onClick={onClick} />\n}\n\nexport function getIcon(iconName?: string): IconSymbol {\n return iconName && isIconSymbol(iconName) ? iconName : 'sparkles'\n}\n\nfunction isIconSymbol(iconName: string): iconName is IconSymbol {\n return iconName in icons\n}\n","import {useMemo} from 'react'\nimport type {Path, SchemaType} from 'sanity'\n\nimport {isAssistSupported} from './assistSupported'\n\nexport function useAssistSupported(_path: Path, schemaType: SchemaType) {\n return useMemo(() => isAssistSupported(schemaType), [schemaType])\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n type ObjectSchemaType,\n useClient,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getAssistWriteDocumentId} from '../helpers/ids'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {useFieldTranslation} from './FieldTranslationProvider'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport type TranslateProps = DocumentFieldActionProps & {\n documentIsAssistable?: boolean\n documentIsSyncing?: boolean\n documentSchemaType?: ObjectSchemaType\n}\nexport const translateActions: DocumentFieldAction = {\n name: 'sanity-assist-translate',\n useAction(props: TranslateProps) {\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n const {\n schemaType: fieldSchemaType,\n path,\n documentId,\n documentSchemaType,\n documentIsAssistable,\n documentIsSyncing,\n } = props\n const isDocumentLevel = path.length === 0\n const readOnly = fieldSchemaType.readOnly === true\n\n const docTransTypes = config.translate?.document?.documentTypes\n // oxlint-disable-next-line no-unsafe-type-assertion\n const options = fieldSchemaType?.options as AssistOptions | undefined\n const addFieldAction = isDocumentLevel || options?.aiAssist?.translateAction\n\n const fieldTransEnabled =\n addFieldAction &&\n documentSchemaType &&\n config.translate?.field?.documentTypes?.includes(documentSchemaType.name)\n const documentTranslationEnabled =\n addFieldAction &&\n documentSchemaType &&\n ((!docTransTypes && isAssistSupported(fieldSchemaType)) ||\n docTransTypes?.includes(documentSchemaType.name))\n\n const isActive = !!(documentSchemaType && (documentTranslationEnabled || fieldTransEnabled))\n\n const {value: documentValue, onChange: documentOnChange, formState} = useDocumentPane()\n const docRef = useRef(documentValue)\n docRef.current = documentValue\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const translationApi = useTranslate(apiClient)\n const translate = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n task: translationApi.translate,\n })\n\n const styleguide = config.translate?.styleguide\n const languagePath = config.translate?.document?.languageField\n\n const translateDocumentAction = useMemo(() => {\n if (!isActive || !languagePath || !documentTranslationEnabled) {\n return undefined\n }\n const title = path.length ? `Translate` : `Translate document`\n return node({\n type: 'action',\n icon: translationApi.loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title,\n onAction: () => {\n if (translationApi.loading || !languagePath || !documentId) {\n return\n }\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType?.liveEdit,\n })\n translate({\n languagePath,\n translatePath: path,\n styleguide: createStyleGuideResolver(styleguide, {\n client,\n documentId: writeDocumentId,\n schemaType: documentSchemaType,\n }),\n documentId: writeDocumentId,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n renderAsButton: true,\n disabled: translationApi.loading || readOnly,\n })\n }, [\n isActive,\n languagePath,\n translate,\n styleguide,\n documentId,\n translationApi.loading,\n documentTranslationEnabled,\n path,\n readOnly,\n client,\n documentSchemaType,\n ])\n const fieldTranslate = useFieldTranslation()\n const openFieldTranslation = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n task: fieldTranslate.openFieldTranslation,\n })\n\n const maxDepth = config.translate?.field?.maxPathDepth\n const translateFieldsAction = useMemo(\n () =>\n isActive && fieldTransEnabled\n ? node({\n type: 'action',\n icon: fieldTranslate.translationLoading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title: `Translate fields...`,\n onAction: () => {\n if (fieldTranslate.translationLoading || !documentId) {\n return\n }\n if (formStateRef.current) {\n getConditionalMembers(formStateRef.current)\n }\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType?.liveEdit,\n })\n openFieldTranslation({\n document: {\n ...docRef.current,\n _id: writeDocumentId,\n },\n documentSchema: documentSchemaType,\n translatePath: path,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current, maxDepth)\n : [],\n })\n },\n renderAsButton: true,\n disabled: fieldTranslate.translationLoading || readOnly,\n })\n : undefined,\n [\n isActive,\n openFieldTranslation,\n documentSchemaType,\n documentId,\n fieldTranslate.translationLoading,\n fieldTransEnabled,\n path,\n readOnly,\n maxDepth,\n ],\n )\n\n return useMemo(() => {\n if (!isActive || !status?.initialized) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'group',\n icon: () => null,\n title: 'Translation',\n children: [translateDocumentAction, translateFieldsAction].filter(\n (c): c is DocumentFieldActionItem => !!c,\n ),\n expanded: true,\n })\n }, [isActive, translateDocumentAction, translateFieldsAction, status])\n },\n}\n","import type {AgentActionPath} from '@sanity/client'\nimport {type ToastParams, useToast} from '@sanity/ui/toast'\nimport {useMemo} from 'react'\nimport {\n type DocumentFieldActionDivider,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionNode,\n type ObjectSchemaType,\n type Path,\n type SanityDocumentLike,\n type SchemaType,\n useWorkspaceSchemaId,\n} from 'sanity'\n\nimport {randomKey} from '../_lib/randomKey'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isDefined} from '../helpers/misc'\nimport {\n documentRootKey,\n fieldPresenceTypeName,\n type InstructionTask,\n instructionTaskTypeName,\n} from '../types'\n\nexport interface AgentActionConditionalPath {\n path: AgentActionPath\n readOnly: boolean\n hidden: boolean\n}\n\nexport interface AssistFieldActionProps {\n /**\n * `actionType` will be `document` for action invoked from the top right document action menu, and\n * `field` when invoked from a field action menu.\n */\n actionType: 'document' | 'field'\n /**\n * This is the id of the current document pane; it contains `drafts.`or `versions. prefix` ect depending on context.\n * Use this for `documentId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n * ```\n */\n documentIdForAction: string\n\n /**\n * Schema type of the current document.\n * @see documentIdForAction\n */\n documentSchemaType: ObjectSchemaType\n\n /**\n * Returns the current document value.\n *\n * Prefer passing this function to your hooks instead of passing the document value directly to avoid unnecessary re-renders.\n * @see documentIdForAction\n */\n getDocumentValue: () => SanityDocumentLike\n\n /**\n * Returns the current readOnly and hidden state of all conditional members in the current document form.\n *\n * Intended to be passed to agent actions `conditionalPaths.paths`.\n */\n getConditionalPaths: () => AgentActionConditionalPath[]\n\n /**\n * `schemaId` for the current workspace.\n *\n * Note: the workspace schema has to be deployed using `sanity schema deploy` or `sanity deploy`.\n *\n * Use this for `schemaId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n *\n * ```\n */\n schemaId: string\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`)\n *\n * It can be used with agent actions using `target.path`, to scope the action to a specific field.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * target: {\n * path: props.path\n * },\n * })\n * ```\n */\n path: AgentActionPath\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`).\n *\n * Typically useful to dynamically return different actions based on the schema type of the field.\n *\n * ```ts\n * if(isObjectSchemaType(schemaType)) {\n * return [\n * defineAssistFieldAction({\n * title: 'Fill the object fields',\n * icon: RobotIcon,\n * onAction: () => {\n * //...\n * }\n * })\n * ]\n * }\n * return useMemo(() => {\n *\n *\n * }, [])\n *\n * ```\n */\n schemaType: SchemaType\n\n /**\n * Schema type of the parent field or array item holding this field.\n *\n * This can be undefined if the action was unable to resolve the parent type is excluded from AI Assist.\n *\n * @see schemaType\n * @see documentSchemaType\n */\n parentSchemaType?: SchemaType\n}\n\nexport type AssistFieldActionNode =\n | AssistFieldActionItem\n | AssistFieldActionGroup\n | DocumentFieldActionDivider\n\nexport type AssistFieldActionItem = Omit<\n DocumentFieldActionItem,\n 'renderAsButton' | 'selected' | 'onAction'\n> & {\n onAction: () => void | Promise<void>\n}\n\nexport type AssistFieldActionGroup = Omit<\n DocumentFieldActionGroup,\n 'renderAsButton' | 'expanded' | 'children'\n> & {\n /**\n * `children` can include undefined entries in the action array. These will be filtered out.\n * If the group has no defined children, the group will also be filtered out.\n */\n children: (AssistFieldActionNode | undefined)[]\n}\n\ntype PushToast = (params: ToastParams) => string\n\nexport function defineAssistFieldAction(\n action: Omit<AssistFieldActionItem, 'type'>,\n): AssistFieldActionItem {\n return {\n ...action,\n type: 'action',\n }\n}\n\nexport function defineFieldActionDivider(): DocumentFieldActionDivider {\n return {\n type: 'divider',\n }\n}\n\nexport function defineAssistFieldActionGroup(\n group: Omit<AssistFieldActionGroup, 'type'>,\n): AssistFieldActionGroup {\n return {\n ...group,\n type: 'group',\n }\n}\n\nexport function useCustomFieldActions(\n props: Omit<AssistFieldActionProps, 'schemaId' | 'path'> & {path: Path},\n) {\n const {\n config: {fieldActions},\n } = useAiAssistanceConfig()\n const {addSyntheticTask, removeSyntheticTask} = useAssistDocumentContext()\n\n const schemaId = useWorkspaceSchemaId()\n const {push: pushToast} = useToast()\n // oxlint-disable-next-line react/hooks\n const configActions = fieldActions?.useFieldActions?.({\n ...props,\n schemaId,\n // oxlint-disable-next-line no-unsafe-type-assertion\n path: props.path as AgentActionPath,\n })\n\n return useMemo(() => {\n const title = fieldActions?.title\n const customActions = configActions\n ?.filter(isDefined)\n .map((node) => {\n return createSafeNode({\n node,\n pushToast,\n addSyntheticTask,\n removeSyntheticTask,\n })\n })\n .filter(isDefined)\n const onlyGroups =\n customActions?.length && customActions?.every((node) => node.type === 'group')\n const groups = customActions?.length\n ? onlyGroups\n ? customActions\n : [\n {\n type: 'group',\n title: title || 'Custom actions',\n children: customActions,\n expanded: true,\n } satisfies DocumentFieldActionGroup,\n ]\n : []\n return groups ?? []\n }, [addSyntheticTask, configActions, fieldActions, pushToast, removeSyntheticTask])\n}\n\nfunction createSafeNode(args: {\n node: AssistFieldActionNode\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}): DocumentFieldActionNode | undefined {\n const {node} = args\n switch (node.type) {\n case 'action':\n return createSafeAction({...args, action: node})\n case 'group':\n const children = node.children\n ?.filter(isDefined)\n .map((child) => createSafeNode({...args, node: child}))\n .filter(isDefined)\n if (!children?.length) {\n return undefined\n }\n return {\n ...node,\n renderAsButton: false,\n expanded: true,\n children,\n }\n case 'divider':\n default:\n return node\n }\n}\n\nfunction createSafeAction(args: {\n action: AssistFieldActionItem\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}) {\n const {action, pushToast, addSyntheticTask, removeSyntheticTask} = args\n return {\n ...action,\n onAction: () => {\n async function runAction() {\n const task: InstructionTask = {\n _type: instructionTaskTypeName,\n _key: randomKey(12),\n started: new Date().toISOString(),\n presence: [\n {\n _type: fieldPresenceTypeName,\n _key: randomKey(12),\n path: documentRootKey,\n started: new Date().toISOString(),\n },\n ],\n }\n try {\n addSyntheticTask(task)\n const actionResult = action.onAction?.()\n if (actionResult instanceof Promise) {\n await actionResult\n }\n } catch (err: any) {\n console.error('Failed to execute action', action, err)\n pushToast({\n title: 'Failed to execute action',\n description: err?.message,\n status: 'error',\n })\n } finally {\n removeSyntheticTask(task)\n }\n }\n void runAction()\n },\n renderAsButton: false,\n selected: false,\n }\n}\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {fieldPathParam, instructionParam} from '../types'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateCaptionsActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-captions',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n const {openInspector} = useDocumentPane()\n\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption, loading} = useGenerateCaption(apiClient)\n const imageContext = useContext(ImageContext)\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const generateCaptionWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n })\n\n const isActive = !!imageContext && pathKey === imageContext?.imageDescriptionPath\n\n return useMemo(() => {\n if (!isActive || !imageContext) {\n // works but not supported by types\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image description',\n onAction: () => {\n if (loading) {\n return\n }\n if (!canUseAssist(status)) {\n openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: undefined as any,\n })\n return\n }\n generateCaptionWhenDraftReady({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n hidden: !imageContext.assetRef,\n })\n }, [\n isActive,\n imageContext,\n generateCaptionWhenDraftReady,\n pathKey,\n assistableDocumentId,\n loading,\n status,\n openInspector,\n ])\n },\n}\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {useApiClient, useGenerateImage} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateImagActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-image',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateImage, loading} = useGenerateImage(apiClient)\n\n const imageContext = useContext(ImageContext)\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const generateImageWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateImage,\n })\n\n const isActive = !!imageContext && pathKey === imageContext?.imageInstructionPath\n\n return useMemo(() => {\n if (!isActive) {\n // works but not supported by types\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image from prompt',\n onAction: () => {\n if (loading) {\n return\n }\n generateImageWhenDraftReady({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n })\n }, [isActive, generateImageWhenDraftReady, pathKey, assistableDocumentId, loading])\n },\n}\n","import {LockIcon} from '@sanity/icons/Lock'\nimport {Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\n\nexport function PrivateIcon() {\n return (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n )\n}\n","import type {AgentActionPath} from '@sanity/client'\nimport {Icon} from '@sanity/icons'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n pathToString,\n stringToPath,\n typed,\n useCurrentUser,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {getIcon} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {getTypePath, useSelectedField, useTypePath} from '../assistInspector/helpers'\nimport {pluginTitleShort} from '../constants'\nimport {isSchemaAssistEnabled} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getInstructionTitle, usePathKey} from '../helpers/misc'\nimport {useAssistSupported} from '../helpers/useAssistSupported'\nimport {translateActions, type TranslateProps} from '../translate/translateActions'\nimport {documentRootKey, fieldPathParam, instructionParam, type StudioInstruction} from '../types'\nimport {type AgentActionConditionalPath, useCustomFieldActions} from './customFieldActions'\nimport {generateCaptionsActions} from './generateCaptionActions'\nimport {generateImagActions} from './generateImageActions'\nimport {PrivateIcon} from './PrivateIcon'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const assistFieldActions: DocumentFieldAction = {\n name: 'sanity-assist-actions',\n useAction(props) {\n const {schemaType} = props\n\n const {\n assistDocument,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n documentSchemaType,\n selectedPath,\n assistableDocumentId,\n fieldRefsByTypePath,\n } = useAssistDocumentContext()\n\n const {value: docValue, formState} = useDocumentPane()\n const docValueRef = useRef(docValue)\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const currentUser = useCurrentUser()\n const isHidden = !assistDocument\n const pathKey = usePathKey(props.path)\n const typePath = useTypePath(docValue, pathKey)\n const assistDocumentId = assistDocument?._id\n\n const {requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n })\n\n const isSelectable = !!useSelectedField(documentSchemaType, typePath)\n const assistSupported =\n useAssistSupported(props.path, schemaType) &&\n isSelectable &&\n isSchemaAssistEnabled(documentSchemaType) &&\n schemaType.readOnly !== true\n\n const fieldAssist = useMemo(\n () =>\n (assistDocument?.fields ?? []).find(\n (f) => f.path === typePath || (pathKey === documentRootKey && f.path === pathKey),\n ),\n [assistDocument?.fields, pathKey, typePath],\n )\n\n const fieldAssistKey = fieldAssist?._key\n const isInspectorOpen = inspector?.name === aiInspectorId\n const isPathSelected = pathKey === selectedPath\n const isSelected = isInspectorOpen && isPathSelected\n\n const imageCaptionAction = generateCaptionsActions.useAction(props)\n const imageGenAction = generateImagActions.useAction(props)\n const translateAction = translateActions.useAction(\n typed<TranslateProps>({\n ...props,\n documentId: assistableDocumentId,\n documentIsAssistable,\n documentIsSyncing,\n documentSchemaType,\n }),\n )\n const manageInstructions = useCallback(\n () =>\n isSelected\n ? closeInspector(aiInspectorId)\n : openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: undefined as any,\n }),\n [openInspector, closeInspector, isSelected, pathKey],\n )\n\n const onInstructionAction = useCallback(\n (instruction: StudioInstruction) => {\n if (!pathKey || !fieldAssistKey || !assistDocumentId || !assistableDocumentId) {\n return\n }\n requestRunInstruction({\n documentId: assistableDocumentId,\n assistDocumentId,\n path: pathKey,\n typePath,\n instruction,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n [\n requestRunInstruction,\n assistableDocumentId,\n pathKey,\n typePath,\n assistDocumentId,\n fieldAssistKey,\n ],\n )\n\n const privateInstructions = useMemo(\n () =>\n fieldAssist?.instructions?.filter((i) => i.userId && i.userId === currentUser?.id) || [],\n [fieldAssist?.instructions, currentUser],\n )\n\n const sharedInstructions = useMemo(\n () => fieldAssist?.instructions?.filter((i) => !i.userId) || [],\n [fieldAssist?.instructions],\n )\n\n const instructions = useMemo(\n () => [...privateInstructions, ...sharedInstructions],\n [privateInstructions, sharedInstructions],\n )\n\n const runInstructionsGroup = useMemo(() => {\n return instructions?.length || imageCaptionAction || translateAction || imageGenAction\n ? node({\n type: 'group',\n icon: () => null,\n title: 'Run instructions',\n children: [\n ...(instructions?.map((instruction) =>\n instructionItem({\n instruction,\n isPrivate: Boolean(instruction.userId && instruction.userId === currentUser?.id),\n onInstructionAction,\n hidden: isHidden,\n // oxlint-disable-next-line no-unnecessary-type-conversion\n documentIsNew: !!documentIsNew,\n assistSupported,\n }),\n ) || []),\n imageCaptionAction,\n imageGenAction,\n ].filter((a): a is DocumentFieldActionItem => !!a),\n expanded: true,\n })\n : undefined\n }, [\n instructions,\n currentUser?.id,\n onInstructionAction,\n isHidden,\n documentIsNew,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n ])\n\n const getDocumentValue = useCallback(() => {\n return docValueRef.current\n }, [])\n\n const getConditionalPaths: () => AgentActionConditionalPath[] = useCallback(() => {\n // oxlint-disable-next-line no-map-spread\n return (formStateRef.current ? getConditionalMembers(formStateRef.current) : []).flatMap(\n (cm) => {\n const path = stringToPath(cm.path)\n if (path.some((s) => typeof s === 'number')) {\n //agent actions does not support indexed paths\n return []\n }\n return {\n ...cm,\n // oxlint-disable-next-line no-unsafe-type-assertion\n path: path as AgentActionPath,\n }\n },\n )\n }, [])\n\n const parentSchemaType = useMemo(() => {\n if (!props.path.length) {\n return undefined\n } else if (props.path.length === 1) {\n return documentSchemaType\n }\n const parentPath = props.path.slice(0, -1)\n const typePath = getTypePath(docValueRef.current, pathToString(parentPath))\n return typePath ? fieldRefsByTypePath[typePath]?.schemaType : undefined\n }, [fieldRefsByTypePath, props.path, documentSchemaType])\n\n const customActions = useCustomFieldActions({\n actionType: props.path.length ? 'field' : 'document',\n documentIdForAction: assistableDocumentId,\n schemaType,\n documentSchemaType,\n path: props.path,\n getDocumentValue,\n getConditionalPaths,\n parentSchemaType,\n })\n\n const manageInstructionsItem = useMemo(\n () =>\n node({\n type: 'action',\n icon: ControlsIcon,\n title: 'Manage instructions',\n onAction: manageInstructions,\n selected: isSelected,\n }),\n [manageInstructions, isSelected],\n )\n\n const group = useMemo(\n () =>\n node({\n type: 'group',\n icon: SparklesIcon,\n title: pluginTitleShort,\n children: [\n runInstructionsGroup,\n translateAction,\n ...customActions,\n assistSupported && manageInstructionsItem,\n ]\n .filter((c): c is DocumentFieldActionItem | DocumentFieldActionGroup => !!c)\n .filter((c) => (c.type === 'group' ? c.children.length : true)),\n expanded: false,\n renderAsButton: true,\n hidden: !assistSupported && !imageCaptionAction && !translateAction && !imageGenAction,\n }),\n [\n //documentIsNew,\n runInstructionsGroup,\n manageInstructionsItem,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n customActions,\n ],\n )\n\n const emptyAction = useMemo(\n () =>\n node({\n type: 'action',\n hidden: !assistSupported,\n icon: SparklesIcon,\n onAction: manageInstructions,\n renderAsButton: true,\n title: pluginTitleShort,\n selected: isSelected,\n }),\n [assistSupported, manageInstructions, isSelected],\n )\n\n // If there are no instructions, we don't want to render the group\n if (\n !instructions?.length &&\n !imageCaptionAction &&\n !translateAction &&\n !imageGenAction &&\n !customActions.length\n ) {\n return emptyAction\n }\n\n return group\n },\n}\n\nfunction instructionItem(props: {\n instruction: StudioInstruction\n isPrivate: boolean\n onInstructionAction: (ins: StudioInstruction) => void\n assistSupported: boolean\n documentIsNew: boolean\n hidden: boolean\n}) {\n const {hidden, isPrivate, onInstructionAction, assistSupported, instruction} = props\n // @TODO investigate in studio core why we can't accept JSX.Element and only accept ComponentType\n function IconLeft() {\n return <Icon symbol={getIcon(instruction.icon)} />\n }\n return node({\n type: 'action',\n icon: IconLeft,\n iconRight: isPrivate ? PrivateIcon : undefined,\n title: getInstructionTitle(instruction),\n onAction: () => onInstructionAction(instruction),\n disabled: !assistSupported,\n hidden,\n })\n}\n","import {Card, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {documentRootKey, fieldPresenceTypeName} from '../types'\nimport {AiFieldPresence} from './AiFieldPresence'\nimport {aiPresence} from './useAssistPresence'\n\nexport function createAssistDocumentPresence(documentId: string | undefined) {\n return function AssistDocumentPresenceWrapper() {\n return documentId ? <AssistDocumentPresence /> : null\n }\n}\n\nfunction AssistDocumentPresence() {\n const {assistDocument, syntheticTasks} = useAssistDocumentContext()\n const anyPresence = useMemo(() => {\n const anyPresence = [...(assistDocument?.tasks ?? []), ...(syntheticTasks ?? [])]\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n // oxlint-disable-next-line react/purity\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n // oxlint-disable-next-line react/purity\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks, syntheticTasks])\n\n return (\n <Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons/ArrowLeft'\nimport {Button} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {aiInspectorId} from '../../../assistInspector/constants'\nimport {instructionParam} from '../../../types'\n\nexport function BackToInstructionListLink() {\n const {openInspector} = useDocumentPane()\n\n const goBack = useCallback(\n // oxlint-disable-next-line no-unsafe-type-assertion\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )\n\n return (\n <div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n gap={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>\n )\n}\n","import {createContext} from 'react'\nimport type {ObjectSchemaType, SchemaType} from 'sanity'\n\nexport interface SelectedFieldContextValue {\n documentSchema?: ObjectSchemaType\n fieldSchema?: SchemaType\n}\n\nexport const SelectedFieldContext = createContext<SelectedFieldContextValue | undefined>(undefined)\nexport const SelectedFieldContextProvider = SelectedFieldContext.Provider\n","import {Card, Stack, Text} from '@sanity/ui'\nimport {useContext, useEffect, useMemo, useRef} from 'react'\nimport {\n type FieldError,\n FormCallbacksProvider,\n type FormCallbacksValue,\n FormInput,\n insert,\n type KeyedSegment,\n MemberFieldError,\n type ObjectInputProps,\n type ObjectSchemaType,\n PatchEvent,\n type Path,\n type SchemaType,\n set,\n setIfMissing,\n stringToPath,\n typed,\n useFormCallbacks,\n useSchema,\n} from 'sanity'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {\n type AssistDocument,\n type AssistField,\n assistFieldTypeName,\n type AssistInspectorRouteParams,\n documentRootKey,\n fieldPathParam,\n instructionParam,\n type StudioInstruction,\n} from '../../types'\nimport {AssistTypeContext} from './AssistTypeContext'\nimport {BackToInstructionListLink} from './instruction/BackToInstructionsLink'\nimport {SelectedFieldContextProvider, type SelectedFieldContextValue} from './SelectedFieldContext'\n\nconst EMPTY_FIELDS: AssistField[] = []\n\nexport function AssistDocumentForm(props: ObjectInputProps) {\n if (props.readOnly) {\n return (\n <Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>\n )\n }\n return <AssistDocumentFormEditable {...props} />\n}\nfunction AssistDocumentFormEditable(props: ObjectInputProps) {\n const {onChange} = props\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = props.value as AssistDocument | undefined\n const id = value?._id\n const fields = value?.fields\n\n const {params, setParams} = useAiPaneRouter()\n const pathKey = params[fieldPathParam]\n const {typePath, documentType: targetDocumentType} = useContext(AssistTypeContext)\n const instruction = params[instructionParam]\n\n const activeKey = useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])\n\n const activePath: Path | undefined = useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])\n\n const schema = useSchema()\n const documentSchema: ObjectSchemaType | undefined = useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])\n\n const fieldSchema = useSelectedSchema(pathKey, documentSchema)\n\n const context: SelectedFieldContextValue = useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )\n\n const title = value?.['title']\n\n useEffect(() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }, [title, documentSchema, onChange, id])\n\n const {onPathOpen, ...formCallbacks} = useFormCallbacks()\n\n const newCallbacks: FormCallbacksValue = useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )\n\n // When showing the instruction list (no specific instruction selected),\n // tell the form to focus on the field path to close any open modals\n useEffect(() => {\n if (activePath && !instruction) {\n onPathOpen(activePath)\n }\n }, [activePath, instruction, onPathOpen])\n\n const fieldError = useMemo(() => {\n const fieldError = props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )\n if (fieldError) {\n return <MemberFieldError member={fieldError} />\n }\n return undefined\n }, [props.members])\n\n return (\n <SelectedFieldContextProvider value={context}>\n <Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>\n )\n}\n\nfunction useSelectedSchema(\n fieldPath: string | undefined,\n documentSchema: ObjectSchemaType | undefined,\n): SchemaType | undefined {\n return useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])\n}\n\nfunction FieldsInitializer({\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}) {\n const {\n config: {__presets: presets},\n } = useAiAssistanceConfig()\n\n const existingField = fields?.find((f) => f._key === pathKey)\n const documentPresets = !!documentSchema?.name && presets?.[documentSchema?.name]\n\n const missingPresetInstructions = useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])\n\n // need this to not fire onChange twice in React strict mode\n const initialized = useRef(false)\n useEffect(() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map((preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [activePath, onChange, pathKey, existingField, missingPresetInstructions])\n\n return null\n}\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {useContext} from 'react'\nimport type {PreviewProps} from 'sanity'\n\nimport {InlineBlockValueContext} from '../../assistFormComponents/AssistInlineFormBlock'\nimport {useSelectedField} from '../../assistInspector/helpers'\nimport {SelectedFieldContext} from './SelectedFieldContext'\n\nexport function FieldRefPreview(props: PreviewProps & {path?: string}) {\n const {actions} = props\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n // oxlint-disable-next-line no-unsafe-type-assertion\n const path = (useContext(InlineBlockValueContext) as {path?: string})?.path ?? props.path\n const selectedField = useSelectedField(documentSchema, path)\n return (\n <Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {/* oxlint-disable-next-line no-unsafe-type-assertion */}\n {actions as any}\n </Flex>\n )\n}\n","import type {FieldProps} from 'sanity'\n\nexport function HiddenFieldTitle(props: FieldProps) {\n return props.renderDefault({...props, title: '', level: props.level - 2, changed: false})\n}\n","import {Card, Flex, Switch, Text} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {set, type StringInputProps, unset, useCurrentUser} from 'sanity'\n\nexport function InstructionVisibility(props: StringInputProps) {\n const {value, onChange} = props\n\n const user = useCurrentUser()\n\n const handleChange = useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])\n\n const id = useId()\n\n return (\n <Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useId, useRef} from 'react'\nimport {set, type StringInputProps} from 'sanity'\n\nimport {FieldAutocomplete} from '../../../assistInspector/FieldAutocomplete'\nimport type {FieldRef} from '../../../assistInspector/helpers'\nimport {AssistTypeContext} from '../AssistTypeContext'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function FieldRefPathInput(props: StringInputProps) {\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const {typePath} = useContext(AssistTypeContext)\n const ref = useRef<HTMLDivElement>(null)\n const id = useId()\n const {onChange} = props\n\n useEffect(() => {\n ref.current?.querySelector('input')?.focus()\n }, [])\n\n const onSelect = useCallback((path: string) => onChange(set(path)), [onChange])\n\n const filter = useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )\n if (!documentSchema) {\n return props.renderDefault(props)\n }\n\n return (\n <Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>\n )\n}\n","import type {FieldError, FieldMember, FieldSetMember, ObjectMember} from 'sanity'\n\nexport function findFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | FieldError | undefined {\n return members.find(\n (m): m is FieldMember | FieldError =>\n (m.kind === 'field' && m.name === fieldName) ||\n (m.kind === 'error' && m.fieldName === fieldName),\n )\n}\n\nexport function findFieldsetMember(\n members: ObjectMember[],\n fieldsetName: string,\n): FieldSetMember | undefined {\n return members.find(\n (m): m is FieldSetMember => m.kind === 'fieldSet' && m.fieldSet.name === fieldsetName,\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useId, useMemo} from 'react'\nimport {type FieldError, type FieldMember, ObjectInputMember, type ObjectInputProps} from 'sanity'\n\nimport {findFieldMember, findFieldsetMember} from '../helpers'\n\nexport function InstructionInput(props: ObjectInputProps) {\n return (\n <Stack gap={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>\n )\n}\n\nfunction ObjectMember({fieldName, ...props}: ObjectInputProps & {fieldName: string}) {\n const member = findFieldMember(props.members, fieldName)\n return member ? <ObjectInputMember {...props} member={member} /> : null\n}\n\nconst NONE: (FieldMember | FieldError)[] = []\n\nfunction NameField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const titleId = useId()\n\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const iconMember = findFieldMember(members, 'icon')\n const titleMember = findFieldMember(members, 'title')\n\n const titlePlaceholder = 'Untitled'\n const moddedTitleMember = useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])\n\n return (\n <Stack gap={5}>\n <Stack gap={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>\n )\n}\n\nfunction ShareField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const visibilityMember = findFieldMember(members, 'userId')\n\n return <>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>\n}\n","import {useCallback, useContext, useState} from 'react'\nimport {\n type ArrayFieldProps,\n type ArraySchemaType,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n type ObjectSchemaType,\n} from 'sanity'\n\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputField(props: ArrayFieldProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (\n !fieldSchema ||\n !(isObjectSchemaType(fieldSchema) || isArrayOfObjectsSchemaType(fieldSchema))\n ) {\n return null\n }\n\n return (\n <EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>\n )\n}\n\nfunction EnabledOutputField({\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}) {\n const [open, setOpen] = useState(!!props.value?.length)\n const onExpand = useCallback(() => setOpen(true), [])\n const onCollapse = useCallback(() => setOpen(false), [])\n\n return props.renderDefault({\n ...props,\n collapsible: true,\n onExpand,\n onCollapse,\n collapsed: !open,\n level: 1,\n title: isObjectSchemaType(fieldSchema) ? 'Allowed fields' : 'Allowed types',\n })\n}\n","import {Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useMemo} from 'react'\nimport {\n type ArrayOfObjectsInputProps,\n type ArraySchemaType,\n type FormPatch,\n insert,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n type ObjectSchemaType,\n PatchEvent,\n setIfMissing,\n typed,\n unset,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../../helpers/assistSupported'\nimport {isType} from '../../../helpers/typeUtils'\nimport {type OutputFieldItem, outputFieldTypeName, type OutputTypeItem} from '../../../types'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputInput(props: ArrayOfObjectsInputProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (!fieldSchema) {\n return null\n }\n\n if (isObjectSchemaType(fieldSchema)) {\n return <ObjectOutputInput {...props} fieldSchema={fieldSchema} />\n }\n\n if (isArrayOfObjectsSchemaType(fieldSchema)) {\n return <ArrayOutputInput {...props} fieldSchema={fieldSchema} />\n }\n return null\n}\n\nfunction useEmptySelectAllValue(\n value: (OutputTypeItem | OutputFieldItem)[],\n allowedValues: {name: string}[],\n onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void,\n) {\n useEffect(() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }, [allowedValues, value, onChange])\n}\n\nfunction ObjectOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}) {\n const {value, onChange} = props\n\n const fields = useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n useEmptySelectAllValue(value as OutputTypeItem[], fields, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )\n\n return (\n <Stack gap={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction ArrayOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}) {\n const {value, onChange} = props\n\n const ofItems = useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n useEmptySelectAllValue(value as OutputTypeItem[], ofItems, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )\n return (\n <Stack gap={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction Selectable({\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}) {\n const checked = !arrayValue?.length || !!arrayValue?.find((v) => v._key === value)\n const handleChange = useCallback(() => onChange(checked, value), [onChange, checked, value])\n\n return (\n <Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>\n )\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {Box, Stack, Text} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {type ArrayOfObjectsInputProps, set, typed} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {randomKey} from '../../../_lib/randomKey'\nimport {instructionGuideUrl} from '../../../constants'\nimport type {PromptBlock, PromptTextBlock} from '../../../types'\n\nconst PteMods = styled(Box)`\n & [data-testid='pt-editor__toolbar-card'] > div > div:last-child {\n display: none;\n }\n & [data-testid='pt-editor'] {\n min-height: 300px;\n }\n & [data-testid='pt-editor'] .pt-inline-object * {\n max-width: 400px;\n }\n`\n\nexport function PromptInput(props: ArrayOfObjectsInputProps) {\n // quickfixes the model (converts blocks to inline blocks for alpha customers)\n // backend supports both types, but this prevents \"missing block\" schema errors\n useOnlyInlineBlocks(props)\n return (\n <PteMods>\n <Stack gap={3}>\n <Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n\n {props.renderDefault(props)}\n </Stack>\n </PteMods>\n )\n}\n\nfunction useOnlyInlineBlocks(props: ArrayOfObjectsInputProps) {\n const {value, onChange} = props\n const didRunRef = useRef(false)\n\n useEffect(() => {\n // Legacy alpha documents only need this conversion once on first load.\n if (didRunRef.current) {\n return\n }\n didRunRef.current = true\n\n let needsFix = false\n // oxlint-disable-next-line no-unsafe-type-assertion\n const val = ((value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block],\n })\n })\n\n if (needsFix) {\n onChange(set(val))\n }\n }, [onChange, value])\n}\n","import type {ArrayFieldProps} from 'sanity'\n\nexport function InstructionsArrayField(props: ArrayFieldProps) {\n return props.renderDefault({\n ...props,\n title: ' ',\n })\n}\n","import {useMemo} from 'react'\nimport {type ArrayOfObjectsInputProps, useCurrentUser} from 'sanity'\n\nimport type {StudioInstruction} from '../../types'\n\nexport function InstructionsArrayInput(props: ArrayOfObjectsInputProps) {\n const user = useCurrentUser()\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const originalValue = props.value as StudioInstruction[] | undefined\n const originalMembers = props.members\n const value = useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )\n const members = useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )\n return props.renderDefault({...props, value, members})\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nexport function HideReferenceChangedBannerInput(props: ObjectInputProps) {\n const ref = useRef<HTMLDivElement>(null)\n\n // hides \"reference was changed\" banner (it is incorrectly flashing because the pane handler does not support the way wie use the assist pane)\n useEffect(() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }, [ref])\n\n return <Box ref={ref}>{props.renderDefault(props)}</Box>\n}\n","import {DocumentTextIcon} from '@sanity/icons/DocumentText'\nimport {TokenIcon} from '@sanity/icons/Token'\nimport {defineArrayMember, defineField, defineType} from 'sanity'\n\nimport {HideReferenceChangedBannerInput} from '../components/HideReferenceChangedBannerInput'\nimport {contextDocumentTypeName} from '../types'\n\nexport const contextDocumentSchema = defineType({\n type: 'document',\n name: contextDocumentTypeName,\n title: 'AI context',\n liveEdit: true,\n icon: TokenIcon,\n components: {\n input: HideReferenceChangedBannerInput,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n name: 'context',\n type: 'array',\n title: 'Context',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n }),\n ],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n context: 'context',\n },\n prepare({title, context}) {\n const text = context\n ?.flatMap((block: any) => block?.children)\n .flatMap((child: any) => child?.text?.split(' '))\n .filter(Boolean)\n const words = text?.length ?? 0\n return {\n title,\n subtitle: `Words: ${words}`,\n media: DocumentTextIcon,\n }\n },\n },\n})\n","import {Icon, type IconSymbol} from '@sanity/icons'\nimport {CodeIcon} from '@sanity/icons/Code'\nimport {ComposeIcon} from '@sanity/icons/Compose'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {isValidElement} from 'react'\nimport {defineArrayMember, defineField, defineType, type ObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentForm} from '../assistDocument/components/AssistDocumentForm'\nimport {FieldRefPreview} from '../assistDocument/components/FieldRefPreview'\nimport {HiddenFieldTitle} from '../assistDocument/components/generic/HiddenFieldTitle'\nimport {IconInput} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {InstructionVisibility} from '../assistDocument/components/instruction/appearance/InstructionVisibility'\nimport {FieldRefPathInput} from '../assistDocument/components/instruction/FieldRefInput'\nimport {InstructionInput} from '../assistDocument/components/instruction/InstructionInput'\nimport {InstructionOutputField} from '../assistDocument/components/instruction/InstructionOutputField'\nimport {InstructionOutputInput} from '../assistDocument/components/instruction/InstructionOutputInput'\nimport {PromptInput} from '../assistDocument/components/instruction/PromptInput'\nimport {InstructionsArrayField} from '../assistDocument/components/InstructionsArrayField'\nimport {InstructionsArrayInput} from '../assistDocument/components/InstructionsArrayInput'\nimport {createFieldRefCache} from '../assistLayout/fieldRefCache'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {\n assistDocumentIdPrefix,\n assistDocumentTypeName,\n assistFieldTypeName,\n assistTasksStatusTypeName,\n fieldReferenceTypeName,\n instructionContextTypeName,\n instructionTaskTypeName,\n instructionTypeName,\n outputFieldTypeName,\n outputTypeTypeName,\n promptTypeName,\n userInputTypeName,\n} from '../types'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\n/**\n * The validation rule resolves the selected path against the same field-ref tree the field picker\n * offers, so it has to be built with the same `assist.maxFieldSelectionDepth`.\n */\nexport function createFieldReferenceType(maxFieldSelectionDepth?: number) {\n return defineType({\n type: 'object',\n name: fieldReferenceTypeName,\n title: 'Field',\n icon: ThListIcon,\n\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Field',\n components: {\n input: FieldRefPathInput,\n },\n validation: (rule) => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n return rule.custom((value, context) => {\n if (!value) {\n return 'Please select a field'\n }\n try {\n const docId = context.document?._id\n if (!docId) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id.`\n }\n if (!docId.startsWith(assistDocumentIdPrefix)) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id: ${docId}`\n }\n const targetDocType = docId.slice(assistDocumentIdPrefix.length)\n const schema = context.schema.get(targetDocType)\n if (!schema) {\n return `Field reference cannot be used outside document inspector context. Could not resolve schema: ${targetDocType}`\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const {fieldRefs} = getForSchemaType(schema as ObjectSchemaType)\n const fieldRef = fieldRefs.find((r) => r.key === value)\n if (!fieldRef) {\n return `Field with path \"${value}\" does not exist in the schema.`\n }\n return true\n } catch (e) {\n console.error('Failed to resolve field reference', e)\n return 'Invalid field reference.'\n }\n })\n },\n }),\n ],\n preview: {\n select: {\n path: 'path',\n },\n prepare({path}) {\n return {\n title: path,\n path,\n icon: CodeIcon,\n }\n },\n },\n components: {\n preview: FieldRefPreview,\n },\n options: {\n modal: {\n type: 'popover',\n },\n },\n })\n}\n\nexport const userInput = defineType({\n type: 'object',\n name: userInputTypeName,\n title: 'User input',\n icon: ComposeIcon,\n fields: [\n defineField({\n type: 'string',\n name: 'message',\n title: 'User input title',\n placeholder: 'Provide instruction text',\n description: 'The header above the user input text field',\n validation: (rule) => rule.required(),\n }),\n defineField({\n type: 'text',\n rows: 3,\n name: 'description',\n title: 'User input description',\n description: 'The description above the user input text field',\n }),\n ],\n preview: {\n select: {\n title: 'message',\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 1,\n },\n },\n})\n\nexport const promptContext = defineType({\n type: 'object',\n name: instructionContextTypeName,\n title: contextDocumentSchema.title,\n icon: contextDocumentSchema.icon,\n fields: [\n defineField({\n type: 'reference',\n name: 'reference',\n to: [{type: contextDocumentSchema.name}],\n title: 'Context',\n description: 'The referenced context will be inserted into the instruction',\n validation: (rule) => rule.required(),\n components: {\n input: function Fix(props) {\n return <Box style={{maxWidth: 300}}>{props.renderDefault(props)}</Box>\n },\n },\n }),\n ],\n preview: {\n select: {\n ref: 'reference._id',\n title: 'reference.title',\n context: 'reference.context',\n },\n prepare(select) {\n return select.ref\n ? (contextDocumentSchema?.preview?.prepare?.(select) ?? select)\n : {title: 'No reference selected', media: contextDocumentSchema.icon}\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 'auto',\n },\n },\n})\n\nexport const prompt = defineType({\n type: 'array',\n name: promptTypeName,\n title: 'Prompt',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n of: [\n defineArrayMember({\n type: fieldReferenceTypeName,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),\n ],\n }),\n /* defineArrayMember({\n type: fieldReferenceTypeName,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),*/\n ],\n})\n\nexport const outputFieldType = defineType({\n type: 'object',\n name: outputFieldTypeName,\n title: 'Output field',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n ],\n})\n\nexport const outputTypeType = defineType({\n type: 'object',\n name: outputTypeTypeName,\n title: 'Output type',\n fields: [\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n ],\n})\n\nexport const instruction = defineType({\n type: 'object',\n name: instructionTypeName,\n title: 'Instruction',\n fieldsets: [\n {name: 'appearance', title: 'Appearance', options: {collapsible: true, collapsed: true}},\n ],\n preview: {\n select: {\n icon: 'icon',\n title: 'title',\n userId: 'userId',\n },\n prepare: ({icon, title, userId}) => {\n return {\n title,\n // oxlint-disable-next-line no-unsafe-type-assertion\n icon: icon ? <Icon symbol={icon as IconSymbol} /> : SparklesIcon,\n userId,\n }\n },\n },\n components: {\n input: InstructionInput,\n preview: (props: any) => {\n // `icon` from `prepare` is either a rendered element (<Icon symbol={...} />) or a\n // component (the SparklesIcon fallback), so it cannot be rendered as <IconValue /> directly\n const IconValue = props.icon\n const icon = isValidElement(IconValue) ? IconValue : IconValue ? <IconValue /> : null\n return (\n <Flex gap={3} align=\"center\" padding={2}>\n {icon ? (\n <Box flex=\"none\">\n <Text size={1}>{icon}</Text>\n </Box>\n ) : null}\n\n <Stack flex={1} gap={2}>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {getInstructionTitle(props)}\n </Text>\n </Stack>\n\n {props.userId && (\n <Text size={1}>\n <Tooltip\n content={<Text size={1}>Only visible to you</Text>}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n </Text>\n )}\n </Flex>\n )\n },\n },\n fields: [\n defineField({\n type: prompt.name,\n name: 'prompt',\n title: 'Instruction',\n components: {\n input: PromptInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'icon',\n title: 'Icon',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: IconInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n },\n }),\n defineField({\n type: 'string',\n name: 'userId',\n title: 'Visibility',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: InstructionVisibility,\n },\n initialValue: (_params, context) => context.currentUser?.id ?? '',\n readOnly: (context) =>\n Boolean(\n context.parent?.createdById && context.parent?.createdById !== context.currentUser?.id,\n ),\n }),\n defineField({\n type: 'string',\n name: 'createdById',\n title: 'Created by',\n hidden: true,\n fieldset: 'appearance',\n initialValue: (_params, context) => {\n return context.currentUser?.id ?? ''\n },\n }),\n defineField({\n type: 'array',\n name: 'output',\n title: 'Output filter',\n components: {\n input: InstructionOutputInput,\n field: InstructionOutputField,\n },\n of: [\n defineArrayMember({type: outputFieldType.name}),\n defineArrayMember({type: outputTypeType.name}),\n ],\n }),\n ],\n})\n\nexport const fieldInstructions = defineType({\n type: 'object',\n name: assistFieldTypeName,\n title: 'Field prompt',\n /* components: {\n input: FieldPromptInput,\n },*/\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n readOnly: true,\n hidden: true,\n }),\n defineField({\n type: 'array',\n name: 'instructions',\n title: 'Instructions',\n of: [{type: instruction.name}],\n components: {\n field: InstructionsArrayField,\n input: InstructionsArrayInput,\n },\n }),\n ],\n preview: {\n select: {\n title: 'path',\n },\n },\n})\n\nexport const assistDocumentSchema = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({liveEdit: true} as any),\n name: assistDocumentTypeName,\n title: 'AI Document',\n\n components: {\n input: AssistDocumentForm,\n field: (props: any) => {\n return props.renderDefault({...props, title: ''})\n },\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n type: 'array',\n name: 'fields',\n title: 'Fields',\n of: [{type: fieldInstructions.name}],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n },\n },\n})\n\nexport const instructionTask = defineType({\n type: 'object',\n name: instructionTaskTypeName,\n title: 'Instruction task',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n defineField({\n type: 'string',\n name: 'instructionKey',\n title: 'Instruction key',\n }),\n defineField({\n type: 'datetime',\n name: 'started',\n title: 'Started',\n }),\n defineField({\n type: 'datetime',\n name: 'updated',\n title: 'Updated',\n }),\n defineField({\n type: 'string',\n name: 'info',\n title: 'Info',\n }),\n ],\n})\n\nexport const documentInstructionStatus = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({liveEdit: true} as any),\n name: assistTasksStatusTypeName,\n title: 'Document instruction status',\n fields: [\n defineField({\n type: 'array',\n name: 'tasks',\n title: 'Tasks',\n of: [{type: instructionTask.name}],\n }),\n ],\n})\n","import type {ArrayOfType, FieldProps, SchemaTypeDefinition} from 'sanity'\n\nimport {\n assistDocumentSchema,\n createFieldReferenceType,\n documentInstructionStatus,\n fieldInstructions,\n instruction,\n instructionTask,\n outputFieldType,\n outputTypeType,\n prompt,\n promptContext,\n userInput,\n} from './assistDocumentSchema'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nfunction excludeComments<T extends SchemaTypeDefinition | ArrayOfType>(type: T): T {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const existingRender = (type as any)?.components?.field\n return {\n ...type,\n ...('components' in type\n ? {\n components: {\n ...type.components,\n field: (props: FieldProps) => {\n const newProps = {...props, __internal_comments: undefined}\n if (typeof existingRender === 'function') {\n return existingRender(newProps)\n }\n return props.renderDefault(newProps)\n },\n },\n }\n : {}),\n ...('fields' in type\n ? {\n // recursively disable comments in fields\n fields: type.fields?.map((field) => excludeComments(field)),\n }\n : {}),\n ...('of' in type\n ? {\n // recursively disable comments in array items\n of: type.of?.map((arrayItemType) => excludeComments(arrayItemType)),\n }\n : {}),\n }\n}\n\n/**\n * @param maxFieldSelectionDepth - see `AssistConfig.maxFieldSelectionDepth`; the field reference\n * type validates picked paths against the field-ref tree, which must be built with the same depth\n */\nexport function createSchemaTypes(maxFieldSelectionDepth?: number) {\n const instructionForm = [\n fieldInstructions,\n instruction,\n createFieldReferenceType(maxFieldSelectionDepth),\n prompt,\n userInput,\n promptContext,\n ].map(excludeComments)\n\n return [\n ...instructionForm,\n outputFieldType,\n outputTypeType,\n assistDocumentSchema,\n documentInstructionStatus,\n instructionTask,\n contextDocumentSchema,\n ]\n}\n","import type {SanityClient} from '@sanity/client'\nimport {definePlugin, isObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentInputWrapper} from './assistDocument/AssistDocumentInput'\nimport {AssistDocumentLayout} from './assistDocument/AssistDocumentLayout'\nimport {AssistFieldWrapper} from './assistFormComponents/AssistField'\nimport {AssistFormBlock} from './assistFormComponents/AssistFormBlock'\nimport {AssistInlineFormBlock} from './assistFormComponents/AssistInlineFormBlock'\nimport {AssistItem} from './assistFormComponents/AssistItem'\nimport {assistInspector} from './assistInspector'\nimport {AssistLayout} from './assistLayout/AssistLayout'\nimport type {AssistConfig} from './assistTypes'\nimport {ImageContextProvider} from './components/ImageContext'\nimport {SafeValueInput} from './components/SafeValueInput'\nimport {packageName} from './constants'\nimport {assistFieldActions} from './fieldActions/assistFieldActions'\nimport type {AssistFieldActionNode, AssistFieldActionProps} from './fieldActions/customFieldActions'\nimport {isSchemaAssistEnabled} from './helpers/assistSupported'\nimport {validateStyleguide} from './helpers/styleguide'\nimport {isImage} from './helpers/typeUtils'\nimport {createAssistDocumentPresence} from './presence/AssistDocumentPresence'\nimport {createSchemaTypes} from './schemas'\nimport type {TranslationConfig} from './translate/types'\nimport {assistDocumentTypeName, type AssistPreset} from './types'\n\nexport interface AssistPluginConfig {\n translate?: TranslationConfig\n\n /**\n * Config that affects all instructions\n */\n assist?: AssistConfig\n\n fieldActions?: {\n title?: string\n /**\n * The returned array can include `undefined` entries in the action array. These will be filtered out.\n */\n useFieldActions?: (props: AssistFieldActionProps) => (AssistFieldActionNode | undefined)[]\n }\n\n /**\n * @internal\n */\n __customApiClient?: (defaultClient: SanityClient) => SanityClient\n\n /**\n * @internal\n */\n __presets?: Record<string, AssistPreset>\n}\n\nexport const assist = definePlugin<AssistPluginConfig | void>((config) => {\n const configWithDefaults = config ?? {}\n const styleguide = configWithDefaults.translate?.styleguide || ''\n const maxPathDepth = configWithDefaults.assist?.maxPathDepth\n const maxFieldSelectionDepth = configWithDefaults.assist?.maxFieldSelectionDepth\n const temperature = configWithDefaults.assist?.temperature\n\n if (typeof styleguide === 'string') {\n validateStyleguide(styleguide)\n }\n\n if (maxPathDepth !== undefined && (maxPathDepth < 1 || maxPathDepth > 12)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [1,12] inclusive, but was ${maxPathDepth}`,\n )\n }\n\n if (\n maxFieldSelectionDepth !== undefined &&\n (!Number.isInteger(maxFieldSelectionDepth) ||\n maxFieldSelectionDepth < 1 ||\n maxFieldSelectionDepth > 12)\n ) {\n throw new Error(\n `[${packageName}]: \\`assist.maxFieldSelectionDepth\\` must be an integer in the range [1,12] inclusive, but was ${maxFieldSelectionDepth}`,\n )\n }\n\n if (temperature !== undefined && (temperature < 0 || temperature > 1)) {\n throw new Error(\n `[${packageName}]: \\`assist.temperature\\` must be in the range [0,1] inclusive, but was ${temperature}`,\n )\n }\n\n return {\n name: packageName,\n // the addition of global references broke auto updating studios\n // new versions of studio know to look for this prop on assist plugin, and filter + console.warn if it is missing\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({handlesGDR: true} as any),\n schema: {\n types: createSchemaTypes(maxFieldSelectionDepth),\n },\n i18n: {\n bundles: [{}],\n },\n\n document: {\n inspectors: (prev, context) => {\n const documentType = context.documentType\n const docSchema = context.schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistInspector]\n }\n return prev\n },\n unstable_fieldActions: (prev, {documentType, schema}) => {\n if (documentType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistFieldActions]\n }\n return prev\n },\n unstable_languageFilter: (prev, {documentId, schema, schemaType}) => {\n if (schemaType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(schemaType)\n if (docSchema && isObjectSchemaType(docSchema) && isSchemaAssistEnabled(docSchema)) {\n return [...prev, createAssistDocumentPresence(documentId)]\n }\n return prev\n },\n components: {\n unstable_layout: AssistDocumentLayout,\n },\n },\n\n studio: {\n components: {\n layout: function Layout(props) {\n return <AssistLayout {...props} config={configWithDefaults} />\n },\n },\n },\n\n form: {\n components: {\n input: AssistDocumentInputWrapper,\n field: AssistFieldWrapper,\n item: AssistItem,\n block: AssistFormBlock,\n inlineBlock: AssistInlineFormBlock,\n },\n },\n\n plugins: [\n definePlugin({\n name: `${packageName}/safe-value-input`,\n form: {components: {input: SafeValueInput}},\n })(),\n\n definePlugin({\n name: `${packageName}/generate-caption`,\n form: {\n components: {\n input: (props) => {\n const {schemaType} = props\n\n if (isImage(schemaType)) {\n return <ImageContextProvider {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n })(),\n ],\n }\n})\n","import type {SanityClient} from '@sanity/client'\nimport {defer, delay, merge, Observable, of, partition, switchMap, throwError} from 'rxjs'\nimport {exhaustMapToWithTrailing} from 'rxjs-exhaustmap-with-trailing'\nimport {filter, mergeMap, share, take} from 'rxjs/operators'\nimport type {MutationEvent, ReconnectEvent, WelcomeEvent} from 'sanity'\n\n/** @internal */\nexport type ListenQueryParams = Record<string, string | number | boolean | string[]>\n\n/** @beta */\nexport interface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n throttleTime?: number\n transitions?: ('update' | 'appear' | 'disappear')[]\n}\n\nconst fetch = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.observable.fetch(query, params, {\n tag: options.tag,\n filterResponse: true,\n }),\n )\n\nconst listen = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(\n () =>\n // getVersionedClient(options.apiVersion)\n client.listen(query, params, {\n events: ['welcome', 'mutation', 'reconnect'],\n includeResult: false,\n visibility: 'query',\n tag: options.tag,\n }),\n // oxlint-disable-next-line no-unsafe-type-assertion\n ) as Observable<ReconnectEvent | WelcomeEvent | MutationEvent>\n\nfunction isWelcomeEvent(\n event: MutationEvent | ReconnectEvent | WelcomeEvent,\n): event is WelcomeEvent {\n return event.type === 'welcome'\n}\n\n/** @internal */\nexport const listenQuery = (\n client: SanityClient,\n query: string | {fetch: string; listen: string},\n params: ListenQueryParams = {},\n options: ListenQueryOptions = {},\n) => {\n const fetchQuery = typeof query === 'string' ? query : query.fetch\n const listenerQuery = typeof query === 'string' ? query : query.listen\n\n const fetchOnce$ = fetch(client, fetchQuery, params, options)\n\n const events$ = listen(client, listenerQuery, params, options).pipe(\n mergeMap((ev, i) => {\n const isFirst = i === 0\n if (isFirst && !isWelcomeEvent(ev)) {\n // if the first event is not welcome, it is most likely a reconnect and\n // if it's not a reconnect something is very wrong\n // oxlint-disable-next-line no-deprecated\n return throwError(\n new Error(\n ev.type === 'reconnect'\n ? 'Could not establish EventSource connection'\n : `Received unexpected type of first event \"${ev.type}\"`,\n ),\n )\n }\n return of(ev)\n }),\n share(),\n )\n\n const [welcome$, mutationAndReconnect$] = partition(events$, isWelcomeEvent)\n const isRelevantEvent = (event: MutationEvent | ReconnectEvent | WelcomeEvent): boolean => {\n if (!options.transitions || event.type !== 'mutation') {\n return true\n }\n\n return options.transitions.includes(event.transition)\n }\n\n return merge(\n welcome$.pipe(take(1)),\n mutationAndReconnect$.pipe(\n filter(isRelevantEvent),\n switchMap((event) => merge(of(event), of(event).pipe(delay(options.throttleTime || 1000)))),\n ),\n ).pipe(exhaustMapToWithTrailing(fetchOnce$))\n}\n","import {dequal as isEqual} from 'dequal/lite'\nimport {useEffect, useRef, useState} from 'react'\nimport {of} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, useClient} from 'sanity'\n\nimport {listenQuery} from './fixedListenQuery'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ntype ReturnShape<T> = {\n loading: boolean\n error: boolean\n data: T | null\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS: ListenQueryOptions = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery<T>(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS,\n): ReturnShape<T> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState<T | null>(null)\n const subscription = useRef<null | Observable>(null)\n\n const client = useClient({apiVersion: `v2022-05-09`})\n\n useEffect(() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(true)\n setLoading(false)\n setData(null)\n\n return of(null)\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options, client])\n\n return {loading, error, data}\n}\n","import {SyncIcon} from '@sanity/icons/Sync'\nimport {Box, Button, Card, Flex, Label, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {useClient, useSchema} from 'sanity'\n\nimport {useListeningQuery} from '../../_lib/useListeningQuery'\nimport {assistSerializedTypeName, type SerializedSchemaType} from '../../types'\nimport {serializeSchema} from './serializeSchema'\n\nconst NO_DATA: SerializedSchemaType[] = []\n\nconst defaultTitle = 'Sync schema'\n\nexport function SchemaTypeTool() {\n const schema = useSchema()\n const client = useClient({apiVersion: '2023-01-01'})\n const [saving, setSaving] = useState(false)\n const [syncTitle, setSyncTitle] = useState(defaultTitle)\n\n const {data} = useListeningQuery<SerializedSchemaType[]>('*[_type==$type] | order(_type)', {\n type: assistSerializedTypeName,\n })\n\n const types = useMemo(() => {\n return serializeSchema(schema)\n }, [schema])\n\n const storeTypes = useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])\n\n return (\n <Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack gap={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>\n )\n}\n\nfunction SchemaEntry({schemaStub}: {schemaStub: SerializedSchemaType}) {\n const out = useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])\n return <pre>{out}</pre>\n}\n","import {useRunInstruction} from '../assistLayout/RunInstructionProvider'\n\nexport type GetUserInput = (args: {\n /**\n * Dialog title\n */\n title: string\n /**\n * One titled input per array item\n */\n inputs: CustomInput[]\n}) => Promise<CustomInputResult[] | undefined>\n\n/**\n *\n */\nexport interface CustomInput {\n /**\n * Id for the input\n */\n id: string\n /**\n * Title of the input field\n */\n title: string\n /**\n * Additional info that will be displayed over the input\n */\n description?: string\n}\n\nexport type CustomInputResult = {\n /**\n * Identifies which custom input the `result`belongs to\n */\n input: CustomInput\n\n /**\n * The text provided by the user in the input\n */\n result: string\n}\n\n/**\n * `useUserInput` returns a function that can be used to await user input.\n *\n * Useful for custom `fieldActions` to get user input for populating Agent Action requests,.\n *\n * ```ts\n * fieldActions: {\n * useFieldActions: (props) => {\n * const {\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * } = props\n * const client = useClient({apiVersion: 'vX'})\n * const getUserInput = useUserInput()\n * return useMemo(() => {\n * return [\n * defineAssistFieldAction({\n * title: 'Log user input',\n * icon: UserIcon,\n * onAction: async () => {\n * const input = await getUserInput({\n * title: 'Topic',\n * inputs: [{id: 'about', title: 'What should the article be about?'}],\n * })\n * if (!input) return // user canceled input\n * await client.agent.action.generate({\n * schemaId,\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: documentIdForAction,\n * _type: documentSchemaType.name,\n * initialValues: getDocumentValue(),\n * },\n * instruction: `\n * Create a document about the following topic:\n * $about\n * ---\n * `,\n * instructionParams: {about: input[0].result},\n * conditionalPaths: {paths: getConditionalPaths()},\n * })\n * },\n * }),\n * ]\n * }, [\n * client,\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * getUserInput,\n * ])\n * },\n * }\n * ```\n */\nexport function useUserInput(): GetUserInput {\n const {getUserInput} = useRunInstruction()\n return getUserInput\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,kBAAkB,IAA0B;CAC1D,IAAM,WAAW,iBAAiB,EAAE,CAAC,CAAC;CAEtC,OAAO,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,QAAQ;AAC/F;ACCA,SAAgB,iBAAiB;gBACzB,MAAM,OAAuB,IAAI,GAEjC,CAAC,oBAAoB,yBAAyB,SAAsB,IAAI,GACxE,CAAC,qBAAqB,0BAA0B,SAAsB,IAAI,GACvBA;;EAAC,GAAG;EAAG,GAAG;CAAC;CAApE,IAAM,CAAC,cAAc,mBAAmB,SAAiBA,EAAY,GACxBA;;EAAC,GAAG;EAAG,GAAG;CAAC;CAAxD,IAAM,CAAC,QAAQ,aAAa,SAAiBA,EAAY,GAEnD,mBAAmB,OAAO,CAAC,GAC3B,mBAAmB,OAAO,CAAC,GAE3B,oBAAoB,OAAO,CAAC,GAC5B,oBAAoB,OAAO,CAAC,GAExBC,IAiGPC;CAjGH,oDAAU,WAAM;EACd,IAAM,KAAK,IAAI;EAEf,IAAI,CAAC,IAAI;EAET,IAAM,gBAA+B,CAAC,GAClC,SAAS,GAAG;EAEhB,OAAO,UAAU,WAAW,SAAS,OAQnC,AANE,kBAAkB,MAAM,KAGxB,cAAc,KAAK,MAAM,GAG3B,SAAS,OAAO;EAGlB,IAAS,eAAT,SAAS,eAAe;GAGtB,IAAM,aAFe,cAAc,EAEhB,EAAc,sBAAsB,KAAK;IAC1D,GAAG;IACH,GAAG;IACH,OAAO,OAAO;IACd,QAAQ,OAAO;GACjB,GAEM,UAAU,GAAI,sBAAsB;GAS1C,AAPA,sBAAsB;IACpB,GAAG,WAAW,IAAI,iBAAiB;IACnC,GAAG,WAAW,IAAI,iBAAiB;IACnC,GAAG,WAAW;IACd,GAAG,WAAW;GAChB,CAAC,GAED,uBAAuB;IACrB,GAAG,QAAQ,IAAI,kBAAkB;IACjC,GAAG,QAAQ,IAAI,kBAAkB;IACjC,GAAG,QAAQ;IACX,GAAG,QAAQ;GACb,CAAC;EACH,GAES,eAAT,SAAS,eAAe;GACtB,IAAI,UAAU,OAAO,SACjB,UAAU,OAAO;GAErB,KAAK,IAAMC,kBAAgB,eAEzB,AADA,WAAWA,eAAa,YACxB,WAAWA,eAAa;GAG1B,IAAMA,iBAAe,cAAc;GAcnC,AAZA,iBAAiB,UAAU,WAAWA,gBAAc,cAAc,OAAO,UAEzE,iBAAiB,UAAU,WAAWA,gBAAc,aAAa,OAAO,UAExE,gBAAgB;IACd,GAAG,iBAAiB;IACpB,GAAG,iBAAiB;GACtB,CAAC,GAED,kBAAkB,UAAU,SAC5B,kBAAkB,UAAU,SAE5B,UAAU;IAAC,GAAG;IAAS,GAAG;GAAO,CAAC;EACpC;EAEA,OAAO,iBAAiB,UAAU,cAAc,EAAC,SAAS,GAAI,CAAC;EAE/D,IAAM,KAAK,IAAI,eAAe,YAAY;EAE1C,GAAG,QAAQ,EAAE;EAEb,KAAK,IAAMA,kBAAgB,eAEzB,AADA,eAAa,iBAAiB,UAAU,cAAc,EAAC,SAAS,GAAI,CAAC,GACrE,GAAG,QAAQA,cAAY;EAKzB,OAFA,aAAa,SAEA;GACX,GAAG,UAAU,EAAE;GAEf,KAAK,IAAMA,kBAAgB,eAEzB,AADA,GAAG,UAAUA,cAAY,GACzB,eAAa,oBAAoB,UAAU,YAAY;GAKzD,AAFA,GAAG,WAAW,GAEd,OAAO,oBAAoB,UAAU,YAAY;EACnD;CACF,GAAG,KAAA,CAAC,mDAjGJ,UAAUF,IAiGPC,EAAE;CAIDE,IAAAA;CAC4BC,AAAAA,EAAAA,OAAAA,gBAAAA,EAAAA,OAD5B,sBAAsB,KAAA,sBAAA;EACpB,GAAG,mBAAmB,IAAI,aAAa;EACvC,GAAG,mBAAmB,IAAI,aAAa;EACvC,GAAG,mBAAmB;EACtB,GAAG,mBAAmB;CACxB,GAJ4BA,EAAAA,KAAAA,cAD5B,EAAA,KAAA;CAFJ,IAAM,SAAsBC,IAaxBC;CAC6BC,AAAAA,EAAAA,OAAAA,uBAAAA,EAAAA,OAAAA,UAD7B,KAAA,uBAAuB;EACrB,GAAG,oBAAoB,IAAI,OAAO;EAClC,GAAG,oBAAoB,IAAI,OAAO;EAClC,GAAG,oBAAoB;EACvB,GAAG,oBAAoB;CACzB,GALA,EAAA,KAAA,qBAC6BA,EAAAA,KAAAA;CAHjC,IAAM,UAAuBC,IAWtBC;CAAP,OAAQ,EAAA,QAAA,UAAA,EAAA,QAAQ,WAAT,KAAA;EAAC;EAAQ;EAAS;CAAG,GAApB,EAAA,MAAA,QAAQ,EAAA,MAAA,mCAATA;AACT;ACxIA,SAAgB,gBACd,OAGA;gBACO,UAAU,eAAkB;CAAa,AAAA,EAAA,OAAA,qEAA1C,CAAC,UAAU,eAAe,GAAA,aAAgB;CAEhD,IAAM,EAAC,QAAQ,SAAS,QAAO,eAAe,GAEpCE,IAEPC;CAFH,AACkB,EAAA,OAAA,UAAA,EAAA,OAAU,WAAA,EAAA,OAA1B,iBADQ,WAAM;EACd,gBAAgB,UAAU,UAAU;GAAC;GAAQ;EAAO,IAAI,IAAI;CAC9D,GAAG,KAAA;EAAC;EAAQ;EAAS;CAAa,GADhB,EAAA,KAAA,QAAU,EAAA,KAAA,SAA1B,EAAA,KAAA,+DADF,UAAUD,IAEPC,EAAgC;CAGjCC,IAAAA;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,QADsB,OAAA,EAAA,QAAhB,aAAT,KAAA,oBAAC,OAAD;EAAK,GAAI;EAAgB;EACtB;CACE,CAAA,GADF,EAAA,KAAA,UADsB,EAAA,MAAA,KAAhB,EAAA,MAAA,qCAATA;AAIJ;ACnBA,MAAa,yBAAyB,cAAsC,IAAI;ACChF,SAAgB,qBAAsC;CACpD,IAAM,QAAQ,WAAW,sBAAsB;CAE/C,IAAI,CAAC,OACH,MAAU,MAAM,kCAAkC;CAGpD,OAAO;AACT;ACPA,SAAgB,kBACd,OACA;gBACO,UAAgB,KAAgB,WAAX;CAAwB,AAAA,EAAA,OAAA,0EAA9C,CAAC,UAAU,MAAM,KAAK,QAAQ,GAAA,aAAgB;CACpD,IAAM,QAAQ,mBAAmB,GAC3B,CAAC,OAAO,YAAY,SAAsC,IAAI,GAE1DE;CAA2B,AAAA,EAAA,OAAA,OAAA,EAAA,OAAfC,MAAAA,QAAAA,EAAAA,OAAqB,UAAjC,WAAM,MAAM,KAAK,UAAU,KAAK,EAAC,OAAM,CAAC,GAAb,EAAA,KAAA,KAAfA,EAAAA,KAAAA,MAAAA,MAAqB,EAAA,KAAA;CAAUC,IAAAA;CAArD,AAAsD,EAAA,OAAA,OAAA,EAAA,QAAK,SAAA,EAAA,QAAO,UAAb,KAAA;EAAC;EAAK;EAAO;CAAM,GAAlB,EAAA,KAAA,KAAK,EAAA,MAAA,OAAO,EAAA,MAAA,kCAAlE,UAAUF,IAA2CE,EAAoB;CAE/DC,IAAAA;CACmB,AAAA,EAAA,QAAA,OAAA,EAAA,QAAvB,SAAA,EAAA,QAAaF,MAAAA,QADT,WAAM;EACd,AAAI,SAAO,MAAM,KAAK,KAAK,KAAK,KAAK;CACvC,GAD6B,EAAA,MAAA,KAAvB,EAAA,MAAA,OAAaA,EAAAA,MAAAA,MAAAA;CAChBG,IAAAA;CAFH,AAEI,EAAA,QAAA,OAAA,EAAA,QAAK,SAAA,EAAA,QAAO,SAAb,KAAA;EAAC;EAAK;EAAO;CAAK,GAAjB,EAAA,MAAA,KAAK,EAAA,MAAA,OAAO,EAAA,MAAA,iCAFhB,UAAUD,IAEPC,EAAmB;CAGpBC,IAAAA;CADF,OAEK,EAAA,QAAA,YAAA,EAAA,QADkB,aAArB,KAAA,oBAAC,iBAAD;EAAiB,GAAI;EAAW,eAAe;EAC5C;CACc,CAAA,GADd,EAAA,MAAA,UADkB,EAAA,MAAA,qCAArBA;AAIJ;ACNA,SAAgB,wBAAyC;CACvD,IAAM,aAAuB,CAAC,GACxB,YAAsB,CAAC,GAEvB,WAAW;EACf,sBAAM,IAAI,IAAyC;EACnD,oBAAI,IAAI,IAAyC;CACnD,GAEM,WAAW;EACf,sBAAM,IAAI,IAAiD;EAC3D,oBAAI,IAAI,IAAiD;CAC3D,GAEM,YAAmD,CAAC;CAE1D,SAAS,kBAAkB;EACzB,IAAM,aAA0B,CAAC;EAEjC,KAAK,IAAM,OAAO,YAAY;GAC5B,IAAM,UAAU,SAAS,GAAG,IAAI,GAAG,GAC7B,YAAY,SAAS,KAAK,IAAI,GAAG,GAEjC,YAAY,SAAS,KAAK,IAAI,GAAG,GACjC,cAAc,SAAS,KAAK,IAAI,GAAG;GAEzC,AAAI,WAAW,aACb,WAAW,KAAK;IACd;IACA,MAAM;KAAC,GAAG;KAAW,SAAS;IAAW;IACzC,IAAI;KAAC,GAAG;KAAS,SAAS;IAAS;GACrC,CAAC;EAEL;EAEA,KAAK,IAAM,YAAY,WACrB,SAAS,UAAU;CAEvB;CAEA,OAAO;EACL,IAAI;GACF,UAAU,KAAK,SAAS;IAMtB,OALA,SAAS,GAAG,IAAI,KAAK,IAAI,GACzB,SAAS,GAAG,IAAI,KAAK,OAAO,GAE5B,WAAW,KAAK,GAAG,SAEN;KAEX,AADA,SAAS,GAAG,OAAO,GAAG,GACtB,SAAS,GAAG,OAAO,GAAG;KAEtB,IAAM,MAAM,WAAW,QAAQ,GAAG;KAIlC,AAFI,MAAM,MAAI,WAAW,OAAO,KAAK,CAAC,GAEtC,gBAAgB;IAClB;GACF;GACA,KAAK,KAAK,OAAO;IAGf,AAFA,SAAS,GAAG,IAAI,KAAK,KAAK,GAEtB,UAAU,SAAS,GAAG,KAAG,gBAAgB;GAC/C;EACF;EAEA,YAAY,EACV,UAAU,UAAU;GAGlB,OAFA,UAAU,KAAK,QAAQ,SAEV;IACX,IAAM,MAAM,UAAU,QAAQ,QAAQ;IAEtC,AAAI,MAAM,MAAI,UAAU,OAAO,KAAK,CAAC;GACvC;EACF,EACF;EAEA,MAAM;GACJ,UAAU,KAAK,SAAS;IAMtB,OALA,SAAS,KAAK,IAAI,KAAK,IAAI,GAC3B,SAAS,KAAK,IAAI,KAAK,OAAO,GAE9B,UAAU,KAAK,GAAG,SAEL;KAEX,AADA,SAAS,KAAK,OAAO,GAAG,GACxB,SAAS,KAAK,OAAO,GAAG;KAExB,IAAM,MAAM,UAAU,QAAQ,GAAG;KAIjC,AAFI,MAAM,MAAI,UAAU,OAAO,KAAK,CAAC,GAErC,gBAAgB;IAClB;GACF;GACA,KAAK,KAAK,OAAO;IAGf,AAFA,SAAS,KAAK,IAAI,KAAK,KAAK,GAExB,WAAW,SAAS,GAAG,KAAG,gBAAgB;GAChD;EACF;CACF;AACF;ACnHA,SAAgB,mBAAmB,OAGhC;eACK,EAAC,UAAU,uBAAsB,OACME;qDAAsB,KAAA,sBAAA;CAAnE,IAAM,QAAyBC,IAG7BC,IACAC;CAFF,AACQ,EAAA,OAAA,+CAAN,WAAM,sBAAsB,MAAM,WAAW,UAAU,kBAAkB,GACzE,KAAA,CAAC,oBAAoB,KAAK,GADpB,EAAA,KAAA,2CADR,UACED,IACAC,EACF;CAEOC,IAAAA;CAAP,OAAuD,EAAA,OAAA,wBAAhD,KAAA,oBAACC,uBAAAA,UAAD;EAAiC,OAAO;EAAQ;CAA0C,CAAA,GAA1C,EAAA,KAAA,sBAAhDD;AACT;ACXA,SAAS,sBACP,SACA,MACA,QACoB;CACpB,IAAM,UAAU,KAAK,IAAI,KAAK,IAAI,GAC5B,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,QAAQ,MAAM,SACrD,UAAU,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,MAAM;CAE7D,OAAO;EACL;EACA,GAAG,KAAK;EACR,GAAG;EACH;EACA,QAAQ,KAAK,IAAI,QAAQ,KAAK;EAC9B,MAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK;EACrC;EACA;EACA,aAAa,WAAW;CAC1B;AACF;AAEA,SAAgB,mBACd,SACA,WACe;CACf,IAAM,aAAmB;EACvB,GAAG,UAAU,KAAK,OAAO,IAAI,QAAQ,MAAM;EAE3C,GAAG,UAAU,KAAK,OAAO;EAEzB,GAAG,UAAU,KAAK,OAAO;EACzB,GAAG,UAAU,KAAK,OAAO,IAAI,QAAQ,MAAM,YAAY;CACzD,GAEM,OAAO,sBAAsB,SAAS,UAAU,KAAK,SAAS,UAAU;CAC9E,KAAK,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ;CAE3D,IAAM,aAAa,WAAW,IAAI,WAAW,GAEvC,WAAiB;EACrB,GAAG,UAAU,GAAG,OAAO,IAAI,QAAQ,MAAM;EAEzC,GAAG,UAAU,GAAG,OAAO;EAEvB,GAAG,UAAU,GAAG,OAAO;EACvB,GAAG,UAAU,GAAG,OAAO,IAAI,QAAQ,MAAM,YAAY;CACvD,GAEM,WAAW,SAAS,IAAI,SAAS,GAEjC,KAAK,sBAAsB,SAAS,UAAU,GAAG,SAAS,QAAQ,GAElE,YAAY,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM;CAoBjD,OAjBA,KAAK,IAAI,KAAK,IAAI,WAAW,KAAK,IAAI,GAClC,KAAK,IAAI,SAAS,IACpB,KAAK,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,IAC9B,KAAK,IAAI,aAClB,KAAK,IAAI,KAAK,IAAI,UAAU,KAAK,MAAM,IAEzC,GAAG,IAAI,KAAK,IAAI,WAAW,GAAG,IAAI,GAC9B,GAAG,IAAI,WAAW,IACpB,GAAG,IAAI,KAAK,IAAI,WAAW,GAAG,GAAG,IAAI,IAC5B,GAAG,IAAI,eAChB,GAAG,IAAI,KAAK,IAAI,YAAY,GAAG,MAAM,IAIvC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,UAAU,GAC5D,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,QAAQ,GAE7C;EAAC;EAAM;CAAE;AAClB;AClFA,MCSa,+BAA+B,yBAI/B,yBAAyB,wCACzB,sBAAsB,kCAItB,oBAAoB,uCAEpB,yBAAyB,sCAGzB,0BAA0B,8BAE1B,4BAA4B,6BAC5B,0BAA0B,iCAC1B,wBAAwB,0CAExB,2BAA2B,iCAC3B,gCAAgC,kCAOhC,iBAAiB,WACjB,mBAAmB,eAGnB,kBAAkB;ACpC/B,SAAgB,WAAW,MAAqB;eAErCG;CADT,OACoB,EAAA,OAAA,oBAAX,KAAA,WAAW,IAAI,GAAJ,EAAA,KAAA,kBADbC;AAGT;AAEA,SAAS,WAAW,MAAqB;CAIvC,OAHI,KAAK,SACA,MAAM,QAAQ,IAAI,IAAI,aAAa,IAAI,IAAI,OAE7C;AACT;AAEA,SAAgB,oBAAoB,aAAiC;CACnE,OAAO,aAAa,SAAS;AAC/B;AAEA,SAAgB,UAAa,GAAiC;CAC5D,OAAO,KAAyB;AAClC;ACtBA,SAAgB,oBAAoB,MAAuB;CACzD,OAAO,KAAK,GAAG,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/C;;;;;;;AAQA,SAAgB,OAAO,YAAwB,UAA2B;CAOxE,OANI,WAAW,SAAS,WACf,KAEJ,WAAW,OAGT,OAAO,WAAW,MAAM,QAAQ,IAF9B;AAGX;AAEA,SAAgB,QAAQ,YAAwB;CAC9C,OAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAgB,0BACd,YAC0D;CAC1D,IAAI,CAAC,YACH;CAGF,IAAM,mBAAoB,WAAW,SAA0B,UAAU;CAYzE,OAXI,OAAO,oBAAqB,WACvB;EACL,MAAM;EACN,qBAAqB;CACvB,IACS,mBACF;EACL,MAAM,iBAAiB;EACvB,qBAAqB,iBAAiB,uBAAuB;CAC/D,IAEK,0BAA0B,WAAW,IAAI;AAClD;AAEA,SAAgB,+BACd,YACoB;CAUpB,OATK,aAI0B,WAAW,SAA0B,UAChE,yBAIG,+BAA+B,WAAW,IAAI,IARnD;AASJ;ACxDA,SAAgB,sBAAsB,MAAkB;CAEtD,OAAO,CAAE,KAAK,SAAuC,UAAU;AACjE;AAEA,SAAgB,kBAAkB,MAAkB;CAsBlD,OArBI,CAAC,sBAAsB,IAAI,KAI3B,WAAW,IAAI,IACV,KAGL,KAAK,aAAa,UAEb,CADkB,KAAK,GAAG,OAAO,MAAM,WAAW,CAAC,CAClD,IAGN,KAAK,aAAa,YAGlB,CAFwB,KAAK,OAAO,OAAO,UAAU,WAAW,MAAM,IAAI,CAEzE,KAED,OAAO,MAAM,OAAO;AAI1B;AAEA,SAAS,WAAW,MAAkB;CACpC,OAAO,CAAC,sBAAsB,IAAI,KAAK,kBAAkB,IAAI;AAC/D;AAEA,SAAS,kBAAkB,MAAkB;CAC3C,OACE,KAAK,SAAS,sBACd,KAAK,SAAS,yBACd,OAAO,MAAM,yBAAyB,KACrC,OAAO,MAAM,WAAW,KAEvB,EAAE,MAAM,QAAA,EAA8B,UAAU,mBAClD,OAAO,MAAM,uBAAuB,KACpC,OAAO,MAAM,MAAM;AAEvB;AC7CA,MAAM,2BAA2B,cAAkC,KAAA,CAAS;AAM5E,SAAgB,0BACd,OACA;eACM,EAAC,YAAW,OAOTE;CAJe,IAAA,EAAA,OAAA,SAAA;EAAtB,IAAM,gBAAgB,QAAQ,KAC5BC,QAEF;EACO,KAAA,eAAe,MAAM,OAAO,aAAa,eAAe,MAAM,IAAI,IAAI,KAAA,GAJvD,EAAA,KAAA;;CADxB,IAAM,oBAAoBC,IASxBC;CADF,OAC4C,EAAA,OAAA,qBAAA,EAAA,OACjCC,MAAAA,YADT,KAAA,oBAACC,yBAAAA,UAAD;EAAmC,OAAO;EACvC,UAAA,MAAM;CAC0B,CAAA,GAFO,EAAA,KAAA,mBACjCD,EAAAA,KAAAA,MAAAA,kCADTD;AAIJ;AAXM,SAAAI,SAAC,QAAA;CACC,OAAA,OAAO,SAAS,WAAW,kBAAkB,OAAO,MAAM,UAAU;;ACjB5E,MAAa,yBACX,0JAUW,cAAc,kBAEd,cAAc,oBAEd,mBAAmB,aAEnB,yBAAyB,sBAAsB,EAAE,GCfxD,iBAAiB;AAEvB,SAAgB,iBAAiB,cAAsB;CACrD,OAAO,4BAA4B,eAAe,QAAQ,gBAAgB,GAAG;AAC/E;AAEA,SAAgB,oBAAoB,YAAoB;CAOtD,OANI,YAAY,UAAU,IAEjB,GAAG,+BAA+B,iBAAiB,UAAU,EAAE,GAAG,eAAe,UAAU,MAI7F,GAAG,+BAA+B,eAAe,UAAU;AACpE;;;;;;;;;;;;;;AAeA,SAAgB,yBACd,YACA,UAAoD,CAAC,GAC7C;CAUR,OATI,QAAQ,YACH,aAAa,YAAY,QAAQ,SAAS,IAE/C,YAAY,UAAU,IACjB,aAEL,QAAQ,WACH,eAAe,UAAU,IAE3B,WAAW,UAAU;AAC9B;AC5CA,SAAgB,iBAAoB,IAAY,SAAgC;CAC9E,IAAM,QAAQ,aAAa,IAAI,OAAO;CAEtC,OAAQ,MAAM,SAAS,MAAM;AAC/B;ACeA,SAAgB,wBAAA,IAI6C;gBAJrB,EACtC,YACA,YACA,YAHsCC,IAKhC,mBAAmB,WAAW,MAC9B,cAAc,eAAe,GAGjCC;CAAiB,AAAA,EAAA,OAAA,gCAAjB,KAAA,iBAAiB,gBAAgB,GAAhB,EAAA,KAAA;CADnB,IAAM,iBAAiB,iBACrBA,IACA,sBACF,GAEsB,KAAA,cAAc,IAAlCC;CAAoBC,AAAAA,EAAAA,OAAAA,kBAApB,KAAA,oBAAoBA,EAAgB,GAAhBA,EAAAA,KAAAA;CADtB,IAAM,oBAAoB,iBACxBD,IACA,yBACF,GAEyBE;qDAAC,KAAA,EAAA,YAAY,aAAY;CAAlD,IAAM,SAAS,UAAUA,EAA0B,GAEzCC,IAWPC;CAXH,AACO,EAAA,OAAA,kBAAA,EAAA,OACH,UAAA,EAAA,OAE0B,oBAAA,EAAA,OAHL,WADf,WAAM;EACd,AAAI,CAAC,kBAAkB,WACrB,OACG,kBAAkB;GACjB,KAAK,iBAAiB,gBAAgB;GACtC,OAAO;EACT,CAAC,CAAC,CACD,MAAMC,QAEN;CAEP,GAAG,KAAA;EAAC;EAAQ;EAAgB;EAAkB;CAAO,GAV9C,EAAA,KAAA,gBACH,EAAA,KAAA,QAE0B,EAAA,KAAA,kBAHL,EAAA,KAAA,2DADzB,UAAUF,IAWPC,EAAmD;CAE/CE,IAAAA;;EACL,IAAI,CAAC,gBAAgB;GACnB,KAAO,KAAA;GAAP,MAAA;EACF;EAYOC,IAAAA;EATSC,IAAAA,EAAAA,QAAAA,kBAAAA,EAAAA,QAFiBC,mBAAAA,SAAAA,EAAAA,QAO4BC,aAAAA,IAAAA;GAP7D,IAAM,QAAQ,mBAAmB,SAAS,CAAC,GAE3BC;GAAgBC,AAAAA,EAAAA,QAAAA,gBAAAA,uBAAhB,KAAA,gBAAgB,UAAU,CAAC,GAAXA,EAAAA,MAAAA,gBAAAA;GAAhC,IAAM,SAAUD,GAA8B,KAAK,iBAC1C;IACL,GAAG;IACH,OAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,YAAY,IAAI;IAC5D,cAAc,YAAY,cACtB,QAAQ,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,aAAa,EAAE,CAAC,CACzD,KAAK,gBAAgB,oBAAoB,aAAa,KAAK,CAAC;GACjE,EACD;GACM,KAAA,MAA4B;IACjC,GAAG;IAEH,OAAO,OAAO,KAAK,WAAS;KAC1B,IAAME,gBAAc,OACjB,MAAM,MAAM,EAAE,SAASC,OAAK,IAAI,CAAC,EAChC,cAAc,MAAM,MAAM,EAAE,SAASA,OAAK,cAAc;KAC5D,OAAO;MACL,GAAGA;MACH,aAAA;KACF;IACF,CAAC;IACO;GACV,CAAC,GAtBeN,EAAAA,MAAAA,gBAFiBC,EAAAA,MAAAA,mBAAAA,OAO4BC,EAAAA,MAAAA,aAAAA;;EAI7D,KAAOH;;CAfT,OAAOD;AA8BT;AApCe,SAAAU,WAAM,CAEb;AAoCR,SAAS,oBACP,aACA,KACmB;CACnB,OAAO;EACL,GAAG;EACH,OAAO,IACJ,QAAQ,SAAS,KAAK,mBAAmB,YAAY,IAAI,CAAC,CAC1D,QACE,SACC,KAAK,4BACL,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,QAAQ,IAAI,sBAC9D;CACJ;AACF;AC1FA,MAAM,WAA8B,CAAC;AAErC,SAAgB,sBAAsB,YAAoB,oBAAsC;gBAC/CC;CAAC,AAAA,EAAA,OAAA,cAAA,EAAA,OAAwB,sBAAzB,KAAA;EAAC;EAAY,YAAY;CAAkB,GAA1C,EAAA,KAAA,YAAwB,EAAA,KAAA;CAAxE,IAAM,iBAAiB,wBAAwBA,EAA4C,GAErF,kBAAkB,CAAC,CAAC,gBACpB,cAAc,eAAe,GAC7B,QAAQ,SAAS,GACjB,QAAQ,gBAAgB,OACxB,gBAAgB,OAAkD,SAAS,GAEvEC;CACH,AAAA,EAAA,OAAA,mBAAA,EAAA,OASwDC,aAAAA,MAAAA,EAAAA,OADxCC,SAAAA,EAAAA,OAYf,SArBE,WAAM;EACd,IAAK,iBAIL;OAAI,cAAc,YAAY,WAAW;IACvC,IAAM,gBAAgB,OAAO,aAC1B,cAAc,WAAW,SAAA,CAAU,IAAIC,QAAwB,CAClE;IAUA,CATmB,OACf,QAAQ,SAAS,KAAK,oBAAoB,aAAa,EAAE,CAAC,CAC3D,QAAQ,WAAS;KAChB,IAAM,WAAW,cAAcC,OAAK;KACpC,OAAQ,CAAC,YAAYA,OAAK,SAAW,CAAC,UAAU,SAASA,OAAK;IAChE,CAAC,CAAC,CAED,OAAOC,QAAiF,EAAA,EAE/E,SAAS,WAAS;KAC5B,IAAM,QAAQD,OAAK,SAAS,oBAAoBA,OAAK,WAAW;KAChE,AAAIA,OAAK,WAAW,UAClB,MAAM,KAAK;MACT,OAAO,WAAW;MAClB,QAAQ;MACR,aAAa,uBAAuBA,OAAK,WAAW;MACpD,UAAU;MACV,UAAU;KACZ,CAAC,IACQA,OAAK,WAAW,YACzB,MAAM,KAAK;MACT,OAAO,YAAY;MACnB,QAAQ;MACR,aAAa;MACb,UAAU;KACZ,CAAC,IACQA,OAAK,WAAW,YACzB,MAAM,KAAK;MACT,OAAO,YAAY;MACnB,QAAQ;MACR,aAAa;MACb,UAAU;KACZ,CAAC,IACQA,OAAK,WAAW,aACzB,MAAM,KAAK;MACT,OAAO,aAAa;MACpB,QAAQ;MACR,aAAa;MACb,UAAU;KACZ,CAAC;IAEL,CAAC;GACH;GACA,cAAc,UAAU;EADxB;CAEF,GApDO,EAAA,KAAA,iBASwDH,EAAAA,KAAAA,aAAAA,IADxCC,EAAAA,KAAAA,OAYf,EAAA,KAAA;CAgCLI,IAAAA;CArDH,AAqD8C,EAAA,OAAA,mBAAA,EAAA,OAAb,eAAA,EAAA,QAA7B,SAAA,EAAA,QAAsB,SAAvB,KAAA;EAAC;EAAO;EAAe;EAAO;EAAa;CAAe,GAAf,EAAA,KAAA,iBAAb,EAAA,KAAA,aAA7B,EAAA,MAAA,OAAsB,EAAA,MAAA,iCArD1B,UAAUN,IAqDPM,EAA2D;AAChE;AAtCgB,SAAAG,SAAC,QAAA;CAASL,OAAAA,OAAK,SAAS,QAAQ,WAAW,IAAI,KAAKA,OAAK,KAAK,GAAG,EAAE,mBAAG,IAAI,KAAK,CAAC;;AAThD,SAAAI,SAAC,KAAA;CAAQ,OAAA,CAAC,IAAI,MAAM,GAAG;;ACfvE,SAAgB,2BAA2B,OAAmB;;CAC5D,IAAI,CAAC,OAAO,MAAM,YAAY,UAAU,KAAK,MAAM,OAAO,UAAU,MAAM,OAAA,UAAqB;EACtFE,IAAAA;EAAP,OAAwB,EAAA,OAAA,qBAAjB,KAAA,oBAAC,aAAD,EAAa,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAjBA;CACT;CAGA,IAAM,aAAc,MAAM,OAAe;CACzC,IAAI,CAAC,YAAY;EACRC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAGiC,IAAA,KAAA,OAA1BE;CAAP,OAAyE,EAAA,OAAA,cAAA,EAAA,OAAxCC,MAA1B,KAAA,oBAAC,qBAAD;EAAqB,GAAKA;EAAwC;CAAa,CAAA,GAAb,EAAA,KAAA,YAAxCA,EAAAA,KAAAA,4BAA1BD;AACT;AAEA,SAAS,oBAAA,IAAqF;gBAAhE,YAAe;CAC3C,AAD2BE,EAAAA,OAAAA,0CAAC,CAAA,YAAY,GAAA,SAAbA,iDAC3B,sBAAsB,YAAY,MAAM,UAAU;CAE/BC,IAAAA;;EACjB,IAAI,MAAM,WAAW,SAAA,wCAAiC;GACpD,KAAO,MAAM;GAAb,MAAA;EACF;EAGQC,IAAAA;EACgBC,AAAAA,EAAAA,OAAAA,MAAX,WAAW,oBADhB,KAAA;GACJ,GAAG,MAAM,WAAW;GAEpB,MAAM;EACR,GAHsBA,EAAAA,KAAAA,MAAX,WAAW;EAHjBC,IAAAA;EAAP,AACWC,EAAAA,OAAAA,MAAAA,cAAAA,EAAAA,OACHH,MAFD,KAAA;GACL,GAAG,MAAM;GACT,MAAMA;EAMR,GAPWG,EAAAA,KAAAA,MAAAA,YACHH,EAAAA,KAAAA,4BAFR,KAAOE;;CAJT,IAAM,aAAaH,IAgBmB,KAAA,MAAM,SACvCK;CAAwB,AAAA,EAAA,OAAA,SAAA,EAAA,OAAO,cAA/B,KAAA,MAAM,cAAc;EAAC,GAAG;EAAO;CAAU,CAAC,GAAlB,EAAA,KAAA,OAAO,EAAA,KAAA;CADlCC,IAAAA;CADF,OAC4CC,EAAAA,QAAAA,MAAAA,WAAAA,EAAAA,QACvCF,MADH,KAAA,oBAAC,2BAAD;EAA2B,SAASG;EACjCH,UAAAA;CACwB,CAAA,GAFeE,EAAAA,MAAAA,MAAAA,SACvCF,EAAAA,MAAAA,8BADHC;AAIJ;AAEA,SAAS,YAAY,OAAmB;eAChC,EAAC,WAAU,SAAS,GACpB,EAAC,YAAW,gBAAgB,GAIP,KAAA,GAAG,QAAQ,GAHtB,WAAW,MAAM,IAGQ,KAAkCG;qDAAC,KAAA,EAAA,UAAU,EAAC;CAClFd,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADHc,IAAAA;CADF,OAC2BC,EAAAA,OAAAA,MAAAA,EAAAA,OACtBhB,MAAAA,EAAAA,OADuD,UAA1D,KAAA,oBAAC,mBAAD;EAAmB,MAAMgB;EAAiC;EAAQ,OAAOF;EACtEd,UAAAA;CACgB,CAAA,GAFMgB,EAAAA,KAAAA,IACtBhB,EAAAA,KAAAA,IADuD,EAAA,KAAA,gCAA1De;AAIJ;ACXA,MAAa,wBAAwB,cACnC,KAAA,CACF;AAEA,SAAgB,2BAAuD;CACrE,IAAM,UAAU,WAAW,qBAAqB;CAChD,IAAI,CAAC,SACH,MAAU,MAAM,wCAAwC;CAE1D,OAAO;AACT;AC1CA,MAAa,4BAA4B,cAA8C,CAAC,CAAQ;AAEhG,SAAgB,wBAAwB;CACtC,IAAM,UAAU,WAAW,yBAAyB;CACpD,IAAI,CAAC,SACH,MAAU,MAAM,mCAAmC;CAErD,OAAO;AACT;AAEA,SAAgB,qBAAqB;CACnC,OAAO,sBAAsB,CAAC,CAAC;AACjC;ACWA,SAAS,YAAY,YAAuC;CAC1D,IAAI,IAA4B;CAEhC,OAAO,IAAG;EACR,IAAI,EAAE,MAAM,OAAO,EAAE;EACrB,IAAI,EAAE;CACR;CAUA,OARI,OAAO,YAAY,MAAM,IAAU,WACnC,OAAO,YAAY,OAAO,IAAU,YACpC,WAAW,aAAa,WAAW,oBAAoB,UAAU,IAAU,mBAE3E,WAAW,aAAa,UAAgB,YACxC,WAAW,aAAa,WAAiB,iBACzC,WAAW,aAAa,WAAiB,aAEtC;AACT;AAEA,SAAgB,sBAAsB,WAA6D;CAKjG,OAJqD,UAAU,QAC5D,KAAK,SAAS;EAAC,GAAG;GAAM,IAAI,MAAM;CAAG,IACtC,CAAC,CAEI;AACT;AAEA,SAAgB,oBAAoB,YAAwC;CAC1E,OAAO;EACL,KAAK;EACL,MAAM,WAAW,QAAQ;EACzB,OAAO;EACP,MAAM,CAAC;EACK;CACd;AACF;;;;;;;;AASA,SAAgB,aACd,YACA,WAAA,GACY;CACZ,OAAO,mBAAmB,YAAY,KAAA,GAAW,GAAG,QAAQ;AAC9D;AAEA,SAAS,mBACP,YACA,QACA,OACA,UACY;CAIZ,OAHI,SAAS,WACJ,CAAC,IAGR,WAAW,OACR,QAAQ,MAAM,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC,CAEtC,SAAS,UAAU;EAClB,IAAM,OAAa,SAAS,CAAC,GAAG,OAAO,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,GAChE,QAAQ,MAAM,KAAK,SAAS,MAAM,MAClC,WAAqB;GACzB,KAAK,aAAa,aAAa,IAAI,CAAC;GACpC;GACA,OAAO,SAAS,CAAC,OAAO,OAAO,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI;GACpD,YAAY,MAAM;GAClB,MAAM,YAAY,MAAM,IAAI;EAC9B,GACM,SACJ,MAAM,KAAK,aAAa,WACpB,mBAAmB,MAAM,MAAM,UAAU,QAAQ,GAAG,QAAQ,IAC5D,CAAC,GAED,kBACJ,MAAM,KAAK,aAAa,UACpB,mBAAmB,MAAM,MAAM,UAAU,QAAQ,GAAG,QAAQ,IAC5D,CAAC;EAIP,OAHK,kBAAkB,MAAM,IAAI,IAG1B;GAAC;GAAU,GAAG;GAAQ,GAAG;EAAe,IAFtC,CAAC,GAAG,QAAQ,GAAG,eAAe;CAGzC,CAAC;AAEP;AAEA,SAAS,mBACP,YACA,QACA,OACA,UACY;CAKZ,OAJI,SAAS,WACJ,CAAC,IAIR,WAAW,GACR,QAAQ,aAAa,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,CAEhD,SAAS,aAAa;EACrB,IAAM,UAAU,EAAC,MAAM,SAAS,KAAI,GAC9B,QAAQ,SAAS,SAAS,SAAS,MACnC,OAAa,SAAS,CAAC,GAAG,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO,GAC1D,WAAqB;GACzB,KAAK,aAAa,aAAa,IAAI,CAAC;GACpC;GACA,OAAO,SAAS,CAAC,OAAO,OAAO,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI;GACpD,YAAY;GACZ,MAAM,YAAY,QAAQ;GAC1B,WAAW;EACb,GACM,SACJ,SAAS,aAAa,WAClB,mBAAmB,UAAU,UAAU,QAAQ,GAAG,QAAQ,IAC1D,CAAC;EAKP,OAHK,kBAAkB,QAAQ,IAGxB,CAAC,UAAU,GAAG,MAAM,IAFlB;CAGX,CAAC;AAEP;AAEA,SAAgB,YAAY,KAAyB,YAAoB;CACvE,IAAI,CAAC,YACH;CAGF,IAAM,OAAO,aAAa,UAAU,GAC9B,cAAoB,CAAC,GACvB,QAAQ,IACN,gBAAgB,KAAK,KAAK,YAAY;EAG1C,IAFA,YAAY,KAAK,OAAO,GAEpB,aAAa,OAAO,GAAG;GACzB,IAAM,QAAQ,gBAAgB,aAAa,WAAW,GAAG,GAAG,CAAC,CAAC,IACxD,QAAQ,OAAO;GACrB,IAAI,SAAS,SAAS,OAAO,SAAU,YAAY,WAAW,OAE5D,OAAO,EAAC,MAAM,MAAM,MAAe;GAErC,QAAQ;EACV;EACA,OAAO;CACT,CAAC;CAED,OAAO,QAAQ,aAAa,aAAa,aAAa,CAAC,IAAI,KAAA;AAC7D;;;;;AAMA,SAAS,aAAa,SAAiB;CACrC,OAAO,QAAQ,QAAQ,SAAS,GAAG,CAAC,CAAC,QAAQ,UAAU,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE;AAC9E;AAEA,SAAgB,YAAY,KAAyB,YAAoB;eAClDG;CAArB,OAAiC,EAAA,OAAA,OAAA,EAAA,OAAK,cAAjB,KAAA,YAAY,KAAK,UAAU,GAAf,EAAA,KAAA,KAAK,EAAA,KAAA,oCAA/BC;AACT;AAEA,SAAgB,iBACd,oBACA,MACsB;eAChB,EAAC,iBAAgB,sBAAsB,GAIzCC;CACiD,AAAA,EAAA,OAAA,sBAAA,EAAA,OAAA,gBADjD,KAAA,sBAAsB,mBAAmB,kBAAkB,IACvD,CAAC,oBAAoB,kBAAkB,GAAG,GAAG,aAAa,mBAAmB,IAAI,CAAC,IAClF,CAAC,GAFL,EAAA,KAAA,oBACiD,EAAA,KAAA;CAHrD,IAAM,mBAAmBC,IAShBC;CADT,OACgBC,EAAAA,OAAAA,QAAAA,EAAAA,OAAAA,oBAAP,KAAA,OAAO,kBAAkB,MAAM,MAAM,EAAE,QAAQ,IAAI,IAAI,KAAA,GAAvD,EAAA,KAAA,MAAOA,EAAAA,KAAAA,0CADTC;AAGT;AAEA,SAAgB,cAAc,OAAkB;CAC9C,IAAM,aAAa,OAAO;CAC1B,OAAO,OAAO,SAAS,YAAY,SAAS,YAAY,QAAQ;AAClE;AAOA,SAAgB,kBAAgC;eACxC,aAAa,cAAc,GAEaC;CAAWC,AAAAA,EAAAA,OAAAA,WAAAA,sBAAX,KAAA,WAAW,UAAU,CAAC,GAAXA,EAAAA,KAAAA,WAAAA;CAAnCC,IAAAA;CAAtB,OAA0B,EAAA,OAAA,cAAA,EAAA,OAAoBF,MAAxB,KAAA;EAAC,GAAG;EAAY,QAAQA;CAAuB,GAA3C,EAAA,KAAA,YAAoBA,EAAAA,KAAAA,4BAAvCG;AACT;AC3MA,MAAM,WAAW,6BACJ,kCAAkC;AAE/C,SAAgB,aAAa,QAAoC;CAC/D,OAAO,QAAQ,WAAW,OAAO,eAAe,OAAO;AACzD;AAEA,SAAgB,aAAa,iBAAiE;eACnEE;qDAAC,KAAA,EAAA,YAAY,gCAA+B;CAArE,IAAM,SAAS,UAAUA,EAA6C,GAE7DC;CADT,OAC2C,EAAA,OAAA,UAAA,EAAA,OAAlC,mBAAkB,KAAA,kBAAA,gBAAgB,MAAM,IAAI,QAAV,EAAA,KAAA,QAAlC,EAAA,KAAA,yCADFC;AAIT;AAEA,SAAgB,aAAa,WAAyB;eAC9C,CAAC,SAAS,cAAc,SAAS,EAAK,GACtC,OAAO,eAAe,GACtB,QAAQ,mBAAmB,GAC3B,QAAQ,SAAS,GAGrBC;CAasC,AAAA,EAAA,OAAA,aAAA,EAAA,OAmBhC,SAAA,EAAA,OAdE,SAAA,EAAA,OAOcC,MAAAA,MAzBtB,MAAA,OAOwB;EAPvB,IAAA,EACC,YACA,cACA,YACA,eACA,kBACA,uBANDC;EA8BC,OAtBA,WAAW,EAAI,GAsBR,eApBQ,MAAM;GACnB,OAAO,UAAU,QAAQ;IACvB,QAAQ;IACR,KAAK,2BAA2B,UAAU,OAAO,CAAC,CAAC,QAAQ,aACzD,UAAU,OAAO,CAAC,CAAC;IAErB,MAAM;KACJ;KACA;KACA;KACA,gBAAgB,MAAM,WAAW;KACjC;KACA;KACA,eACE,cAAc,WAAW,IAAI,kBAAkB,aAAa,aAAa;KAC3E,QAAQ,MAAM;IAChB;GACF,CAAC;EACH,EAEW,CAAC,CACT,OAAO,MAAM;GAOZ,MANA,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,EAAE;GACjB,CAAC,GACD,WAAW,EAAK,GACV;EACR,CAAC,CAAC,CACD,cAAc;GAGb,iBAAiB;IACf,WAAW,EAAK;GAClB,GAAG,GAAI;EACT,CAAC;CACL,GAlCsC,EAAA,KAAA,WAmBhC,EAAA,KAAA,OAdE,EAAA,KAAA,OAOcD,EAAAA,KAAAA,MAAAA;CA1BxB,IAAM,YAAYE,IAqDTC;CADT,OAGI,EAAA,OAAA,WAAA,EAAA,OADA,aADK,KAAA;EACL;EACA;CACF,GADE,EAAA,KAAA,SADA,EAAA,KAAA,mCAFGC;AAOT;AAEA,SAAgB,mBAAmB,WAAyB;eACpD,CAAC,SAAS,cAAc,SAAS,EAAK,GACtC,OAAO,eAAe,GACtB,QAAQ,mBAAmB,GAC3B,QAAQ,SAAS,GAGrBC;CAM6C,AAAA,EAAA,OAAA,aAAA,EAAA,OAWvC,SAAA,EAAA,OALE,SAAA,EAAA,OACcL,MAAAA,MAbtB,MAAA,OAA4D;EAA3D,IAAA,EAAC,MAAM,eAAPM;EAGC,OAFA,WAAW,EAAI,GAER,UACJ,QAAQ;GACP,QAAQ;GACR,KAAK,kCAAkC,UAAU,OAAO,CAAC,CAAC,QAAQ,aAChE,UAAU,OAAO,CAAC,CAAC;GAErB,MAAM;IACJ;IACA;IACA;IACA,QAAQ,MAAM;GAChB;EACF,CAAC,CAAC,CACD,OAAO,MAAM;GAOZ,MANA,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,EAAE;GACjB,CAAC,GACD,WAAW,EAAK,GACV;EACR,CAAC,CAAC,CACD,cAAc;GAGb,iBAAiB;IACf,WAAW,EAAK;GAClB,GAAG,GAAI;EACT,CAAC;CACL,GA1B6C,EAAA,KAAA,WAWvC,EAAA,KAAA,OALE,EAAA,KAAA,OACcN,EAAAA,KAAAA,MAAAA;CAdxB,IAAM,kBAAkBO,IAsCfC;CADT,OAEI,EAAA,OAAA,mBAAA,EAAA,OACA,WAFK,KAAA;EACL;EACA;CACF,GAFE,EAAA,KAAA,iBACA,EAAA,KAAA,iCAHGC;AAOT;AAEA,SAAgB,iBAAiB,WAAyB;eAClD,CAAC,SAAS,cAAc,SAAS,EAAK,GACtC,OAAO,eAAe,GACtB,QAAQ,mBAAmB,GAC3B,QAAQ,SAAS,GAGrBC;CAM2C,AAAA,EAAA,OAAA,aAAA,EAAA,OAWrC,SAAA,EAAA,OALE,SAAA,EAAA,OACcV,MAAAA,MAbtB,MAAA,OAA4D;EAA3D,IAAA,EAAC,MAAM,eAAPM;EAGC,OAFA,WAAW,EAAI,GAER,UACJ,QAAQ;GACP,QAAQ;GACR,KAAK,gCAAgC,UAAU,OAAO,CAAC,CAAC,QAAQ,aAC9D,UAAU,OAAO,CAAC,CAAC;GAErB,MAAM;IACJ;IACA;IACA;IACA,QAAQ,MAAM;GAChB;EACF,CAAC,CAAC,CACD,OAAO,MAAM;GAOZ,MANA,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,EAAE;GACjB,CAAC,GACD,WAAW,EAAK,GACV;EACR,CAAC,CAAC,CACD,cAAc;GAGb,iBAAiB;IACf,WAAW,EAAK;GAClB,GAAG,GAAI;EACT,CAAC;CACL,GA1B2C,EAAA,KAAA,WAWrC,EAAA,KAAA,OALE,EAAA,KAAA,OACcN,EAAAA,KAAAA,MAAAA;CAdxB,IAAM,gBAAgBW,IAsCbC;CADT,OAEI,EAAA,OAAA,iBAAA,EAAA,OACA,WAFK,KAAA;EACL;EACA;CACF,GAFE,EAAA,KAAA,eACA,EAAA,KAAA,iCAHGC;AAOT;AAEA,SAAgB,qBAAqB,WAAyB;CAC5D,IAAM,CAAC,SAAS,cAAc,SAAS,EAAI;CAmB3C,OAAO;EACL;EACA,mBAnBwB,YAAY,YAAY;GAChD,WAAW,EAAI;GAEf,IAAM,YAAY,UAAU,OAAO,CAAC,CAAC;GAErC,IAAI;IAMF,OAAO,MALc,UAAU,QAAwB;KACrD,QAAQ;KACR,KAAK,GAAG,SAAS,GAAG,UAAU,OAAO,CAAC,CAAC,QAAQ,oBAAoB;IACrE,CAAC;GAGH,UAAU;IACR,WAAW,EAAK;GAClB;EACF,GAAG,CAAC,YAAY,SAAS,CAIvB;CACF;AACF;AAEA,SAAgB,gBAAgB,WAAyB;eACjD,CAAC,SAAS,cAAc,SAAS,EAAK,GACXC;CAKP,AAAA,EAAA,OAAA,yBALO,YAC/B,WAAW,EAAI,GACR,UACJ,QAAQ;EACP,QAAQ;EACR,KAAK,GAAG,SAAS,GAAG,UAAU,OAAO,CAAC,CAAC,QAAQ,kBAC7C,UAAU,OAAO,CAAC,CAAC;CAEvB,CAAC,CAAC,CACD,cAAc;EACb,WAAW,EAAK;CAClB,CAAC,IANqB,EAAA,KAAA;CAL1B,IAAM,eAAeC,IAcdC;CAAP,OAEE,EAAA,OAAA,gBAAA,EAAA,OADA,WADK,KAAA;EACL;EACA;CACF,GADE,EAAA,KAAA,cADA,EAAA,KAAA,iCADKA;AAIT;AAEA,SAAgB,qBAAqB,WAAyB;eACtD,QAAQ,SAAS,GACjB,CAAC,SAAS,cAAc,SAAS,EAAK,GACtC,OAAO,eAAe,GACtB,QAAQ,mBAAmB,GAE3B,EACJ,QAAQC,OACN,sBAAsB,GADhB,EAAC,QAAQ,iBAATA,IAIRC;CAmB0B,AAAA,EAAA,OAAA,aAAA,EAAA,OANtBC,gBAAAA,EAAAA,OAXA,SAAA,EAAA,OAsBI,SAAA,EAAA,OAvBD,QADP,MAAC,YAAmC;EAClC,IAAI,CAAC,MAAM;GACT,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;GACT,CAAC;GACD;EACF;EACA,WAAW,EAAI;EAEf,IAAM,EAAC,UAAU,WAAU,KAAK,eAAe,CAAC,CAAC,gBAAgB,GAC3D,wBAAwB;GAAC;GAAU;EAAM,GACzC,iBACJ,cAAc,iBAAiB;GAAC;GAAM,iBAAiB;EAAqB,CAAC,KAC7E;EAEF,OAAO,UACJ,QAAQ;GACP,QAAQ;GACR,KAAK,GAAG,SAAS,GAAG,UAAU,OAAO,CAAC,CAAC,QAAQ,aAC7C,UAAU,OAAO,CAAC,CAAC;GAErB,MAAM;IACJ,GAAG;IACH;IACA,QAAQ,MAAM;IACd;IACA,cAAc,cAAc;GAC9B;EACF,CAAC,CAAC,CACD,OAAO,MAAM;GAMZ,MALA,MAAM,KAAK;IACT,QAAQ;IACR,OAAO;IACP,aAAa,EAAE;GACjB,CAAC,GACK;EACR,CAAC,CAAC,CACD,cAAc;GACb,WAAW,EAAK;EAClB,CAAC;CACL,GAtB0B,EAAA,KAAA,WANtBA,EAAAA,KAAAA,cAXA,EAAA,KAAA,OAsBI,EAAA,KAAA,OAvBD,EAAA,KAAA;CAFT,IAAM,iBAAiBC,IA+CdC;CADT,OAGI,EAAA,OAAA,WAAA,EAAA,OADA,kBADK,KAAA;EACL;EACA;CACF,GADE,EAAA,KAAA,SADA,EAAA,KAAA,wCAFGC;AAOT;ACvTA,MAAM,WAAwB,CAAC,GAQzB,wBAAwB,cAA0C;CACtE,sBAAsB,CAAC;CACvB,cAAc,YAAY,KAAA;CAC1B,oBAAoB;AACtB,CAAC;AAED,SAAgB,oBAAoB;CAClC,OAAO,WAAW,qBAAqB;AACzC;AAEA,SAAS,iBAAiB,OAAiD;CACzE,OAAO,MAAM,UAAU;AACzB;AAEA,SAAgB,uBAAuB,OAA8B;gBAC7D,EAAC,WAAU,sBAAsB,GAEjC,EAAC,gBAAgB,uBAAuB,YAAW,qBADvC,aAAa,QAAQ,iBACuC,CAAS,GAEjF,KAAK,MAAM,GAEX,CAAC,QAAQ,aAAa,SAAS,QAAQ,GACvC,CAAC,YAAY,iBAAiB,SAIlC,GAEI,CAAC,kBAAkB,uBACvB,SAIE,GAE2CE;qDAA2B,KAAA,OAAA,OAAA;EAApB,IAAA,EAAC,OAAO,QAAA,aAARC,IAC9C,kBAAoCC,SAAO,IAAIC,QAKnD;EAEF,IAAK,gBAAgB,QAIrB,OADA,cAAc;GAAC,aAAa;GAAO;EAAe,CAAC,GAC5C,IAAI,SAA0C,YAAY;GAC/D,0BAA0B,OAAO;EACnC,CAAC;CACH;CAfA,IAAM,eAA6BC,IAkBjCC;CACM,AAAA,EAAA,OAAA,WAAA,EAAA,OAYG,yBAbT,MAAC,QAA4B;EAC3B,IAAI,SACF;EAEF,IAAM,EAAC,aAAa,GAAG,YAAW,KAC5B,iBAAiB,YAAY,MAC7BC,oBAAkB,aAAa,QACjC,QAAQC,QAEV,CAAC,CACA,OAAO,gBAAgB;EAE1B,IAAI,CAACD,mBAAiB,QAAQ;GACvB,sBAAsB;IACzB,GAAG;IACH;IACA,WAAW,KAAA;GACb,CAAC;GACD;EACF;EAEA,cAAc;GACZ,GAAG;GACH,iBAAA;EACF,CAAC;CACH,GAxBM,EAAA,KAAA,SAYG,EAAA,KAAA;CAdX,IAAM,iBAAiBE,IA8BGC;CAGpB,AAAA,EAAA,OAAA,gCAHoB,WAAM;EAM9B,AALA,cAAc,KAAA,CAAS,GACvB,UAAU,QAAQ,GACd,oBACF,iBAAiB,KAAA,CAAS,GAE5B,oBAAoB,KAAA,CAAS;CAC/B,GAJM,EAAA,KAAA;CAHN,IAAM,QAAQC,IASmBC;CA4B/B,AAAA,EAAA,OAAA,SAAA,EAAA,OArBgC,UAAA,EAAA,OAiB5B,oBAAA,EAAA,OApBK,yBAAA,EAAA,QAHL,cAD2B,WAAM;EACrC,IAAI,YAAY;GACd,IAAI,iBAAiB,YAAY;IAC/B,IAAM,EAAC,aAAA,eAAa,iBAAiB,GAAG,GAAGC,cAAW;IACjD,sBAAsB;KACzB,GAAGA;KACH,gBAAgBC,cAAY;KAC5B,WAAW,OAAO,QAAQ,MAAM,CAAC,CAAC,IAAIC,QAGpC;IACJ,CAAC;GACH,OAAO;IACL,IAAM,aAAa,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK,SAAO,QAAM;KACzD,IAAM,iBAAiB,WAAW,gBAAgBC;KAClD,OAAO;MACL,OAAO;OACL,IAAI,eAAe;OACnB,OAAO,eAAe,WAAW;OACjC,aAAa,eAAe;MAC9B;MACA,QAAQC;KACV;IACF,CAAC;IAED,AADA,mBAAmB,UAAU,GAC7B,oBAAoB,KAAA,CAAS;GAC/B;EACF;EACA,MAAM;CACR,GADE,EAAA,KAAA,OArBgC,EAAA,KAAA,QAiB5B,EAAA,KAAA,kBApBK,EAAA,KAAA,uBAHL,EAAA,MAAA;CADN,IAAM,eAAeC,IA+Bf,OAAO,CAAC,CAAC;CAMZ,YAAY;CADXC,IAAAA;CAAe,AAAA,EAAA,QAAA,uBAAf,KAAA,OAAO,QAAQ,MAAM,CAAC,CAAC,OAAOC,QAAsB,GAArC,EAAA,MAAA;CAHnB,IAAM,eAED,YAAY,iBAAiB,UAAU,KACxCD,GAAsD,QAU/CE;sDAAC,KAAA,EAAA,OAAO,OAAM;CALvBC,IAAAA;CAMY,AAAA,EAAA,QAAA,eAAA,EAAA,QAJD,gBAFX,KAAA,oBAAC,QAAD;EACE,MAAK;EACL,SAAS;EACT,MAAK;EACL,MAAM;EACN,OAAOD;EACP,UAAU;CACX,CAAA,GADW,EAAA,MAAA,aAJD,EAAA,MAAA;CAHb,IAAM,YACJC,IAWOC;CAAmD,AAAA,EAAA,QAAA,WAAA,EAAA,QAAlD,kBAAD,KAAA;EAAC;EAAgB;EAAc,oBAAoB;CAAO,GAAP,EAAA,MAAA,SAAlD,EAAA,MAAA;CADV,IAAM,eAA2CC,IAO5CC;CAIY,AAAA,EAAA,QAAA,SAAA,EAAA,QAFL,MAAA,EAAA,QAkCU,UAAA,EAAA,QApCjB,QAAA,EAAA,QAsB2B,aAAA,EAAA,QATnB,eAAA,EAAA,QANc,cAPtB,KAAA,OACC,oBAAC,QAAD;EACM;EACE;EACN,SAAS;EACT,OAAO;EACP,QACE,iBAAiB,aACb,WAAW,cACX,oBAAoB,YAAY,WAAW;EAEjD,QACE,oBAAC,MAAD;GAAM,SAAQ;GAAgB,SAAS;GAAG,MAAM;GAC7C,UAAA,cACC,oBAAC,SAAD;IACE,SACE,oBAAC,MAAD;KAAM,SAAS;KACb,UAAA,oBAAC,MAAD,EAAA,UAAM,2DAA8D,CAAA;IAChE,CAAA;IAER,WAAU;IAEV,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAI,UAAA;IAAgB,CAAA;GACzB,CAAA,IAET;EAEE,CAAA;EAGR,UAAA,oBAAC,OAAD;GAAO,SAAS;GAAG,KAAK;GACrB,UAAA,YAAY,iBAAiB,KAAK,SAAO,QACxC,oBAAC,WAAD;IAEE,OAAOC;IACP,WAAWV,QAAM;IACT;IACG;GACZ,GALMU,QAAM,IAKZ,CACF;EACI,CAAA;CACD,CAAA,IACN,MAtCS,EAAA,MAAA,OAFL,EAAA,MAAA,IAkCU,EAAA,MAAA,QApCjB,EAAA,MAAA,MAsB2B,EAAA,MAAA,WATnB,EAAA,MAAA,aANc,EAAA,MAAA;CARzBC,IAAAA;CADF,OACyC,EAAA,QAAA,gBAAA,EAAA,QA4C9BC,MAAAA,YAAAA,EAAAA,QA3CNH,MADH,KAAA,qBAACI,sBAAAA,UAAD;EAAgC,OAAO;EAAvC,UAAA,CACGJ,IA2CA,MAAM,QACuB;KA7CO,EAAA,MAAA,cA4C9BG,EAAAA,MAAAA,MAAAA,UA3CNH,EAAAA,MAAAA,8BADHE;AA+CJ;AApEoC,SAAAoB,SAAA,IAAC;CAAGjB,IAAAA,GAAAA,WAAHC;CAAc,OAAA,CAAC,CAACD;AAAR;AA7BG,SAAAgB,SAAA,IAAC;CAAC,IAAA,CAAA,KAAK,SAANd;CAAkB,OAAA;EACvD,UAAU;EACV,WAAW;CACb;AAHkD;AAtC1C,SAAAa,SAAC,OAAA;CACT,OAAA,MAAM,UAAU,UAAU,MAAM,SAAS,OAAO,gBAAgB,IAAI,CAAC,KAAK;;AAzB3B,SAAAD,SAAC,OAAO,GAAA;CAAO,OAAA;EAClE,OAAO;EACP,MAAM,MAAM,MAAM,GAAG;EACrB,SAAS,MAAM;EACf,aAAa,MAAM;CACrB;;AA4JJ,SAAS,UAAU,OAKhB;gBACK,EAAC,OAAO,WAAW,WAAW,WAAU,OACxC,MAAM,MAAM,MACZ,cAAc,OAA4B,IAAI,GAIlDX;CAGK,AAAA,EAAA,OAAA,OAAA,EAAA,OAFH,aADF,MAAC,MAAsC;EACrC,WAAW,aAAa;GACtB,GAAG;IACF,OAAO,EAAE,iBAAiB,EAAE,OAAA,CAAQ;EACvC,EAAE;CACJ,GAFK,EAAA,KAAA,KAFH,EAAA,KAAA;CAHJ,IAAM,WAAWC,IAWX,QAAsB,OAAO,MAEzBC,IAKPC;CALH,AACO,EAAA,OAAA,sCADG,WAAM;EACd,AAAK,aAGL,iBAAiB,YAAY,SAAS,MAAM,GAAG,CAAC;CAClD,GAAG,KAAA,CAAC,SAAS,GAJN,EAAA,KAAA,kCADP,UAAUD,IAKPC,EAAW;CAKD,IAAA,KAAA,OAAO,WAAW,wBAD3BC;CAEqBC,AAAAA,EAAAA,OAAAA,MAAAA,eAAAA,EAAAA,OADZC,MADT,KAAA,oBAAC,qBAAD;EACE,OAAOA;EACP,aAAa,MAAM;CACpB,CAAA,GADoBD,EAAAA,KAAAA,MAAAA,aADZC,EAAAA,KAAAA;CAQAC,IAAAA;qDAAC,KAAA,EAAA,QAAQ,WAAU;CAL5BC,IAAAA;CAIY,AAAA,EAAA,QAAA,YAAA,EAAA,QADH,SAHT,KAAA,oBAAC,UAAD;EACE,KAAK;EACL,MAAM;EACC;EACG;EACV,OAAOD;CACR,CAAA,GAFW,EAAA,MAAA,UADH,EAAA,MAAA;CARXE,IAAAA;CADF,OAEIL,EAAAA,QAAAA,MAAAA,EAAAA,QAIAI,MALF,KAAA,qBAAC,OAAD;EAAO,SAAS;EAAG,KAAK;EAAxB,UAAA,CACEJ,IAIAI,EAOK;KAXLJ,EAAAA,MAAAA,IAIAI,EAAAA,MAAAA,8BALFC;AAcJ;;;;;;AC1OA,SAAS,QACP,QACA,EAAC,iBAAiB,aAClB,EAAC,kBAAkB,QACG;CACtB,IAAI,CAAC,QACH,OAAO;CAGT,IAAI,OAAO,UAAU,iBAEnB,OAAO,YAAY;EAAC,GAAG;EAAQ,OAAO;CAAe,IAAI;CAG3D,IAAI,WACF,OAAO;CAGT,IAAI,iBAEF,OADA,KAAK,OAAO,IAAI,GACT;CAGT,IAAI,OAAO,YAAY,GACrB,OAAO;CAET,IAAI;EACF,iBAAiB,WAAW,KAAK,CAAC,CAAC,CAAC;CACtC,QAAQ;EAEN,OAAO;CACT;CACA,OAAO;EAAC,GAAG;EAAQ,OAAO;EAAiB,UAAU,OAAO,WAAW;CAAC;AAC1E;;;;;;;;;;;;;;AAeA,SAAgB,oBAAuB,MAA+B;gBAC9D,EAAC,kBAAkB,iBAAiB,WAAA,IAAmB,SAAQ,MAA3B,YAAA,OAAA,KAAA,KAAAM,IACpC,YAAY,OAA6B,IAAI,GAEfC;CACuB,AAAA,EAAA,OAAA,oBAAA,EAAA,OAAkB,QADzC,MAAC,YAA6B;EAChE,UAAU,UAAU,QAAQ,UAAU,SAAS,SAAS;GAAC;GAAkB;EAAI,CAAC;CAClF,GAD2D,EAAA,KAAA,kBAAkB,EAAA,KAAA;CAD7E,IAAM,eAAe,eAAeA,EAEnC,GAESC;CACR,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAc,mBAAA,EAAA,OAAiB,aADvB,WAAM;EACd,aAAa;GAAC;GAAiB;EAAS,CAAC;CAC3C,GADE,EAAA,KAAA,cAAc,EAAA,KAAA,iBAAiB,EAAA,KAAA;CAC9BC,IAAAA;CAFH,AAEI,EAAA,OAAA,mBAAA,EAAA,OAAiB,aAAlB,KAAA,CAAC,iBAAiB,SAAS,GAA1B,EAAA,KAAA,iBAAiB,EAAA,KAAA,mCAFrB,UAAUD,IAEPC,EAA4B;CAG7BC,IAAAA;CADF,OASO,EAAA,QAAA,oBAAA,EAAA,QAPC,mBAAA,EAAA,QAAoB,aAAA,EAAA,QACtB,QAFJ,MAAC,aAAgB;EACf,IAAI,mBAAmB,CAAC,WAAW;GACjC,KAAK,QAAQ;GACb;EACF;EACA,UAAU,UAAU,QAClB;GAAC,MAAM;GAAU,OAAO;GAAiB,UAAU;EAAC,GACpD;GAAC;GAAiB;EAAS,GAC3B;GAAC;GAAkB;EAAI,CACzB;CACF,GAFK,EAAA,MAAA,kBAPC,EAAA,MAAA,iBAAoB,EAAA,MAAA,WACtB,EAAA,MAAA,gCAHCC;AAcT;AChHA,SAAgB,gBACd,oBACA,WACA,OACA;CACA,OAAO,CAAC,EAAE,mBAAmB,WAAW,YAAY;AACtD;AAEA,SAAgB,yBAAyB,MAAiD;eAClF,EAAC,gBAAgB,uBAAsB,kBAAkB,GACbE;CAC7C,AAAA,EAAA,OAAA,QAAA,EAAA,OACG,kBAF0C,KAAA;EAChD,GAAG;EACH,MAAM;CACR,GAFK,EAAA,KAAA,MACG,EAAA,KAAA;CAFR,IAAM,wBAAwB,oBAAoBA,EAGjD,GAEMC;CAAP,OACE,EAAA,OAAA,sBAAA,EAAA,OACA,yBAFK,KAAA;EACL;EACA;CACF,GAFE,EAAA,KAAA,oBACA,EAAA,KAAA,+CAFKA;AAIT;ACNA,SAAgB,8BAA8B,YAAoB,cAAsB;gBAChF,SAAS,UAAU,GAEnB,EAAC,cAAc,2BAA0B,sBAAsB,GAC1CE,IAENC;CAAW,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAX,UAAO,KAAA,OAAA,IAAI,YAAY,GAAZ,EAAA,KAAA,cAAX,EAAA,KAAA;CAAnB,IAAM,aAAaA;CACnB,IAAI,CAAC,YACH,MAAU,MAAM,gBAAgB,aAAa,YAAY;CAE3D,KAAO;CANT,IAAM,qBAAqBD,IAWZE;CAAa,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAb,gBAAa,KAAA,aAAA,YAAY,GAAZ,EAAA,KAAA,cAAb,EAAA,KAAA;CACUC,IAAAA;CAAuB,AAAA,EAAA,OAAA,gBAAA,EAAA,OAAvB,0BAAuB,KAAA,uBAAA,YAAY,GAAZ,EAAA,KAAA,cAAvB,EAAA,KAAA;CAFhBC,IAAAA;CACMF,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,QACUC,MAFhB,KAAA;EACL,WAAWD;EACX,qBAAqBC;CACvB,GAFaD,EAAAA,KAAAA,IACUC,EAAAA,MAAAA;CAHzB,IAAM,EAAC,WAAW,wBAAuBE,IAOnC,EACJ,eACA,gBACA,WACA,UAAU,kBACV,cACE,gBAAgB,GACd,EAAC,sBAAqB,eAAe,GACPC;qCAAa,KAAA,aAAA,CAAC,GAAd,EAAA,MAAA;CAApC,IAAM,EAAC,OAAO,WAAW,YAAWA,IAEPC;CAAyB,AAAA,EAAA,QAAA,cAAA,EAAA,QACvBC,mBAAAA,YAAAA,EAAAA,QAClB,qBAFgB,KAAA,yBAAyB,YAAY;EAChE,UAAU,mBAAmB;EAC7B,WAAW;CACb,CAAC,GAHqD,EAAA,MAAA,YACvBA,EAAAA,MAAAA,mBAAAA,UAClB,EAAA,MAAA;CAFb,IAAM,uBAAuBD,IAKvB,gBAAgB,oBAAoB,CAAC,SAAS,MAAM,CAAC,OAAO,OAAO,CAAC,WAAW,KACxDE;CAET,AAAA,EAAA,QAAA,sBAAA,EAAA,QAA+B,SAAA,EAAA,QAAX,aAAA,EAAA,QAFX,qBAAA,EAAA,QACvB,WADuB,KAAA,oBACzB,CAAC,CAAC,UACF,gBAAgB,oBAAoB,WAAW,KAAK,GAApC,EAAA,MAAA,oBAA+B,EAAA,MAAA,OAAX,EAAA,MAAA,WAFX,EAAA,MAAA,mBACvB,EAAA,MAAA;CADN,IAAM,uBAAuBA,IAI3BC;CAAe,AAAA,EAAA,QAAA,2BAAf,KAAA,eAAe,UAAU,GAAV,EAAA,MAAA;CADjB,IAAM,EAAC,WAAW,sBAAqB,aACrCA,IACA,cACA,iBACF,GAEM,EAAC,WAAU,gBAAgB,GAC3B,eAAe,OAAO,iBAEmBC;CACjC,AAAA,EAAA,QAAA,wBAAA,EAAA,QACA,sBAFiC,KAAA;EAC7C,YAAY;EACZ,YAAY;CACd,GAFc,EAAA,MAAA,sBACA,EAAA,MAAA;CAFd,IAAM,iBAAiB,wBAAwBA,EAG9C,GACK,EAAC,gBAAgB,kBAAkB,wBACvC,kBAAkB,oBAAoB,GAEEC;;EAC3BC,IAAAA;EAYX,AAAA,EAAA,QAAA,oBAAA,EAAA,QAXA,wBAAA,EAAA,QAMA,kBAAA,EAAA,QAHA,wBAAA,EAAA,QADA,iBAAA,EAAA,QAEA,qBAAA,EAAA,QAIA,oBAAA,EAAA,QAPA,sBAAA,EAAA,QAYA,aAAA,EAAA,QACA,uBAAA,EAAA,QAPA,aAAA,EAAA,QAFA,iBAAA,EAAA,QAOA,uBAAA,EAAA,QAHA,gBAAA,EAAA,QACA,kBAXW,MAAA;GACX;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GAJE,EAAA,MAAA,kBAXA,EAAA,MAAA,sBAMA,EAAA,MAAA,gBAHA,EAAA,MAAA,sBADA,EAAA,MAAA,eAEA,EAAA,MAAA,mBAIA,EAAA,MAAA,kBAPA,EAAA,MAAA,oBAYA,EAAA,MAAA,WACA,EAAA,MAAA,qBAPA,EAAA,MAAA,WAFA,EAAA,MAAA,eAOA,EAAA,MAAA,qBAHA,EAAA,MAAA,cACA,EAAA,MAAA;EAXF,IAAM,OAAOA;EAiBb,IAAI,CAAC,gBAAgB;GACZC,IAAAA;GAAP,AAAW,EAAA,QAAA,sBAAJ,MAAA;IAAC,GAAG;IAAM,SAAS;IAAM,gBAAgB,KAAA;GAAS,GAA9C,EAAA,MAAA,oBAAX,MAAOA;GAAP,MAAA;EACF;EACOC,IAAAA;EAAP,AAGkB,EAAA,QAAA,kBAAA,EAAA,QAFb,QADE,MAAA;GACL,GAAG;GACH,SAAS;GACO;EAClB,GADkB,EAAA,MAAA,gBAFb,EAAA,MAAA,kCADL,MAAOA;;CAwBT,OAAOY;AACT;AAEA,SAAS,kBAAkB,sBAA8B;eACjD,CAAC,gBAAgB,qBAAqB,SAA4BX,QAAQ,GAC3CC;qDAAC,MAAA,SAA0B;EAC9D,mBAAmB,YAAY,CAAC,GAAG,SAAS,IAAI,CAAC;CACnD;CAFA,IAAM,mBAAmBC,IAGeC;qDAAC,MAAA,WAA0B;EACjE,mBAAmB,cAAYC,UAAQ,QAAQ,MAAMC,OAAK,SAAS,EAAE,IAAI,CAAC;CAC5E;CAFA,IAAM,sBAAsBC,IAIlBC;qDAAM,WAAA;EAEd,kBAAkB,CAAC,CAAC;CAEtB;CAAGC,IAAAA;CAJH,AAII,EAAA,OAAA,oCAAD,KAAA,CAAC,oBAAoB,GAApB,EAAA,KAAA,kCAJJ,UAAUD,IAIPC,EAAsB;CAElBC,IAAAA;CAAP,OACE,EAAA,OAAA,8BADK,KAAA;EACL;EACA;EACA;CACF,GAHE,EAAA,KAAA,4BADKA;AAKT;AAnB0E,SAAAG,WAAA;CAAM,OAAA,CAAC;;AChHjF,SAAgB,8BAA8B,OAAgD;eACtF,EAAC,YAAY,iBAAgB,OAC7B,QAAQ,8BAA8B,YAAY,YAAY,GAElEC;CADF,OACuDC,EAAAA,OAAAA,MAAAA,YAAAA,EAAAA,OAAd,SAAvC,KAAA,oBAACC,sBAAAA,UAAD;EAAuC;EAAQ,UAAA,MAAM;CAAyC,CAAA,GAAzCD,EAAAA,KAAAA,MAAAA,UAAd,EAAA,KAAA,+BAAvCD;AAEJ;ACZA,SAAgB,qBAAqB,OAA4B;eACzD,EAAC,YAAY,iBAAgB,OAG9BI;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CADHC,IAAAA;CADF,OACyE,EAAA,OAAA,cAAA,EAAA,OAA1B,gBAAA,EAAA,OAC1CF,MADH,KAAA,oBAAC,+BAAD;EAA6C;EAA0B;EACpEA,UAAAA;CAC4B,CAAA,GAFwC,EAAA,KAAA,YAA1B,EAAA,KAAA,cAC1CA,EAAAA,KAAAA,4BADHE;AAIJ;ACRA,MAAM,SAAS,SAAS,gHAelB,YAAY,OAAO,IAAA,WAAA;;;AAAG,CAAA,CAAA,kBACR,OAAO;AAI3B,SAAgB,cAAA,IASC;eATa,EAC5B,UACA,YAAA,IACA,QAH4BE,IAWsB,KAAA,GATlD,OAAA,KAAA,IAAa,MAAbC,GASgE,KAAlCC;CAAoBC,AAAAA,EAAAA,OAAAA,kBAApB,KAAA,EAAC,mBAAmBA,GAAiB,GAAjBA,EAAAA,KAAAA;CAAhDC,IAAAA;CADF,OAEK,EAAA,OAAA,YAAA,EAAA,OADa,OAAA,EAAA,OAAYF,MAA5B,KAAA,oBAAC,WAAD;EAAgB;EAAK,OAAOA;EACzB;CACQ,CAAA,GADR,EAAA,KAAA,UADa,EAAA,KAAA,KAAYA,EAAAA,KAAAA,4BAA5BE;AAIJ;AC/BA,MAAM,OAAO,OAAO,KAAA,WAAA;;;AAAI,CAAA,CAAA,2DAOlB,OAAO,SAAS,0DAShB,UAAU,OAAO,IAAA,WAAA;;;AAAG,CAAA,CAAA,0KAWT,KAAK,+JAWhB,WAAW,OAAO,KAAA,WAAA;;;AAAI,CAAA,CAAA;AAc5B,SAAgB,aAAa,OAAuC;eAC5D,EAAC,OAAA,OAAqB,OAArB,QAAA,OAAA,KAAA,IAAQ,YAARE,IACD,SAAS,oBAAoB,GAErBC;;EACZ,IAAI,WAAW,QAAQ;GACdC,IAAAA;GAAP;IACG,4BAA6B,OAAO,IAAI,CAAC;IACzC,0BAA2B,OAAO,IAAI,CAAC;GAE1C,2BAJA,KAAOA;GAAP,MAAA;EAKF;EAEOC,IAAAA;EAAP;GACG,4BAA6B,OAAO,IAAI,CAAC;GACzC,0BAA2B,OAAO,IAAI,CAAC;EAE1C,2BAJA,KAAOA;;CATT,IAAM,QAAQF,IAkBVG;qDAAC,KAAA,oBAAA,SAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;EAEN,UAAA,oBAAC,UAAD;GAAQ,IAAG;GAAO,IAAG;GAAO,GAAE;EAAS,CAAA;CAChC,CAAA;CAEyBC,IAAAA;qDAAC,KAAA,EAAA,OAAO,UAAS;CADnDC,IAAAA;qDAAC,KAAA,oBAAA,UAAD,EAAA,UACE,oBAAC,MAAD;EAAM,IAAG;EAAO,MAAM;EAAG,OAAOD;EAC9B,UAAA,oBAAC,cAAD,EAAc,OAAO,EAAC,OAAO,UAAS,EAAI,CAAA;CACtC,CAAA,EACE,CAAA;CAdZE,IAAAA;CADF,OACoB,EAAA,OAAA,SAAA,EAAA,OAAc,SAAhC,KAAA,qBAAC,MAAD;EAAM,cAAY;EAAc;EAAhC,UAAA,CACEH,IASAE,EAKI;KAfY,EAAA,KAAA,OAAc,EAAA,KAAA,+BAAhCC;AAiBJ;AC1FA,SAAgB,gBAAgB,QAAsC;eAErDE;;EAAC,UAAU;EAAY,YAAY;CAAa;CAIvDC,IAAAA;qDAAC,KAAA,oBAAA,MAAD;EAAM,SAAS;EAAG,QAAA;EAChB,UAAA,oBAAC,MAAD;GAAM,OAAM;GACV,UAAA,oBAAC,MAAD;IAAM,MAAM;IAAG,UAAA;GAA4B,CAAA;EACvC,CAAA;CACF,CAAA;CARZC,IAAAA;CADF,2DACG,KAAA,oBAAA,MAAD;EAAM,OAAOF;EAAmD,iBAAiB;EAC/E,UAAA,oBAAC,SAAD;GACE,WAAU;GACV,SACEC;GAOF,UAAA,oBAAC,eAAD;IAAe,YAAY;IACzB,UAAA,oBAAC,cAAD,EAAc,OAAM,SAAU,CAAA;GACjB,CAAA;EACR,CAAA;CACL,CAAA,2BAfNC;AAiBJ;ACnBA,MAAM,cAAkC,CAAC;AAEzC,SAAgB,kBAAkB,MAAY,iBAA+C;eACrF,UAAU,yBAAyB,GAEnC,SADiB,WAAW,oBAAoB,UAAU,QAAQ,iBAAiB,KAAA,EAAA,EAC3D,OAEvBE;CAWsBC,IAAAA,EAAAA,OAAAA,QAAAA,EAAAA,OAKlB,mBAAA,EAAA,OAfcC,OAAAA;;GAAvB,IAAM,iBAAiB,OACnB,OAAOC,QAAqB,CAAC,EAC7B,QAAQC,QAA6B,CAAC,EACtC,OACAC,QAIF,CAAC,CACA,QAAQ,aAAa;IACpB,IAAI,CAAC,SAAS,QAAQ,CAAC,KAAK,QAC1B,OAAO;IAET,IAAM,aAAa,aAAa,SAAS,IAAI;IAM7C,OAJI,CAAC,mBAAmB,WAAW,WAAW,KAAK,SAC1C,KAGF,KAAK,OAAO,aAAa,MAAM;KACpC,IAAM,gBAAgB,WAAW;KAOjC,OANI,OAAO,eAAgB,WAClB,gBAAgB,gBAErB,aAAa,WAAW,KAAK,iBAAiB,aAAa,aAAa,IACnE,YAAY,SAAS,cAAc,OAErC;IACT,CAAC;GACH,CAAC;GACH,IAAI,CAAC,gBAAgB,QAAQ;IAC3B,KAAO;IAAP,MAAA;GACF;GAE0BC,IAAAA;GAA1B,AAAyD,EAAA,OAAA,oBAA/B,MAAC,WAAW,WAAW,QAAQ,IAAI,GAAJ,EAAA,KAAA,kBAAzD,KAAO,eAAe,IAAIA,EAAoC;;EAxBnCL,EAAAA,KAAAA,MAKlB,EAAA,KAAA,iBAfcC,EAAAA,KAAAA;;CADzB,OAAOF;AAqCT;AAhCQ,SAAAW,SAAC,GAAA;CACC,OAAA,EAAE,4BAEF,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,IAAI;;AALjD,SAAAD,SAAC,QAAA;CAASH,OAAAA,OAAK,YAAY,CAAC;;AAD7B,SAAAE,SAAC,MAAA;CAAS,OAAA,CAAC,KAAK;;AAqC/B,SAAgB,WAAW,UAAsB,MAAY,QAAmC;CAC9F,OAAO;EACL,MAAM;GACJ,IAAI,oBAAoB,SAAS;GACjC,aAAa;EACf;EACM;EACN,WAAW;EACX,cAAc,UAAU,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;CAC5D;AACF;ACpDA,SAAgB,mBAAmB,OAAmB;eAC9C,EAAC,eAAc;CAIrB,IACE,CAHgC,kBAAkB,UAGjD,KACD,WAAW,KAAK,WAAW,SAAS,KACpC,WAAW,SAAA,8BACX;EACOG,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CACA,IACE,CAAC,OAAO,MAAM,YAAY,UAAU,KACpC,MAAM,YAAY,UAClB,MAAM,YAAA,UACN;EACOE,IAAAA;EAAP,OAAwB,EAAA,OAAA,qBAAjB,KAAA,oBAAC,aAAD;GAAa,GAAI;GAAQ,UAAA,MAAM;EAAsB,CAAA,GAApC,EAAA,KAAA,mBAAjBA;CACT;CAEOF,IAAAA;CAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;AACT;AAEA,SAAS,YAAY,OAAmB;eAE3BG;CAAwBC,AAAAA,EAAAA,OAAAA,MAAAA,0BAAxB,KAAA,kBAAkB,MAAM,UAAU,KAAK,oBAAoB,MAAM,UAAU,GAAnDA,EAAAA,KAAAA,MAAAA;CADnC,IAAM,iBAAiB,CACd,CAAED,IAKL,iBADW,kBAAkB,MAAM,MAAM,cACxB,CAAA,CAAS,IAI3BE;wCACC,KAAA,kBAAA,oBAAC,KAAD,EAAA,UACE,oBAAC,iBAAD,EAAiB,UAAU,eAAiB,CAAA,EACzC,CAAA,GAHN,EAAA,KAAA;CADHC,IAAAA;CACGD,AAAAA,EAAAA,OAAAA,kBADH,KAAA,oBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAAS,SAAQ;EAClCA,UAAAA;CAKG,CAAA,GALHA,EAAAA,KAAAA;CAFL,IAAM,UACJC,IASKC;CAAP,OAOmB,EAAA,OAAA,WAAA,EAAA,OANd,SADE,KAAA,MAAM,cAAc;EACzB,GAAG;EAEH,SAAS,MAAM;EAIf,iBAAiB;CACnB,CAAC,GADkB,EAAA,KAAA,SANd,EAAA,KAAA,+BADEA;AAST;ACvDA,MAAM,cAAc,OAAO,IAAI,CAAC,CAAA,WAAA;;;;AAMhC,SAAgB,eAAe,OAAmB;eAG5CE;CAAmB,AAAA,EAAA,OAAA,qBAAnB,KAAA,oBAAC,eAAD,EAAe,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA;CADrBC,IAAAA;CADF,OACgCC,EAAAA,OAAAA,MAAAA,YAAAA,EAAAA,OAC5BF,MADF,KAAA,oBAAC,cAAD;EAAc,UAAU,MAAM;EAC5BA,UAAAA;CACY,CAAA,GAFgBE,EAAAA,KAAAA,MAAAA,UAC5BF,EAAAA,KAAAA,4BADFC;AAIJ;AAEA,SAAgB,aACd,OACA;gBACM,EAAC,aAAY,OACb,CAAC,OAAO,YAAY,SAA4B,GAEvBE;qDAAC,MAAA,WAA4C;EAC1E,SAAS,OAAO,KAAK;CACvB;CAFA,IAAM,aAAaC,IAIYC;CAC7B,AAAA,EAAA,OAAA,wBAD6B,WAAM;EAEnC,AADA,SAAS,WAAW,KAAK,MAAM,CAAC,CAAC,GACjC,SAAS,KAAA,CAAS;CACpB,GAFE,EAAA,KAAA;CADF,IAAM,aAAaC,IAISC;qDAAM,WAAA,SAAS,KAAA,CAAS;CAApD,IAAM,UAAUC,IACAC;CAA2CC,AAAAA,EAAAA,OAAAA,MAAAA,wBAA3C,KAAA,oBAAC,eAAD;EAAe,SAAS;EAAa,UAAA,MAAM;CAAwB,CAAA,GAAxBA,EAAAA,KAAAA,MAAAA;CAA3D,IAAM,UAAUD,IAETE;CAAP,OAQS,EAAA,OAAA,WAAA,EAAA,OARF,SAAA,EAAA,OAeqC,cAfrC,KAAA,QACL,oBAAC,MAAD;EAAM,QAAA;EAAO,MAAK;EAAW,SAAS;EAAG,iBAAiB;EACxD,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA;IACE,oBAAC,MAAD;KAAM,OAAA;KAAM,QAAO;KACjB,UAAA;IACI,CAAA;IAEN,oBAAC,aAAD;KAAa,MAAM;KAAG,SAAS;KAAG,MAAK;KAAW,QAAA;KAC/C,UAAA;IACU,CAAA;IAEb,qBAAC,MAAD;KAAM,MAAM;KAAG,KAAK;KAApB,UAAA,CACE,oBAAC,KAAD;MAAK,MAAM;MACT,UAAA,oBAAC,QAAD;OAAQ,MAAK;OAAU,SAAS;OAAS,MAAK;MAAW,CAAA;KACtD,CAAA,GACL,oBAAC,QAAD;MAAQ,MAAK;MAAc,SAAS;MAAY,MAAK;KAAY,CAAA,CAC7D;;GACD;;CACH,CAAA,IAEN,SAZO,EAAA,KAAA,SARF,EAAA,KAAA,OAeqC,EAAA,KAAA,oCAfrCA;AAsBT;AAEA,SAAS,cAAc,OAAmB;eAClC,iBACE,kBAAkB,MAAM,UAAU,KAAK,oBAAoB,MAAM,UAAU,GAG7E,QAAQ,MAAM;CAEpB,IAAI,kBAAkB,SAAS,CAAE,MAAgB,QAAQ;EAChDC,IAAAA;EAAP,OAA+B,EAAA,OAAA,qBAAxB,KAAA,MAAM,cAAc;GAAC,GAAG;GAAO,OAAO,KAAA;EAAS,CAAC,GAAxB,EAAA,KAAA,mBAAxBA;CACT;CAEOC,IAAAA;CAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;AACT;AClEA,SAAgB,gBAAgB,OAAmB;gBAC3C,WAAW,kBAAkB,MAAM,MAAM,EAAI,GAC7C,EAAC,aAAY,iBAAiB,GAC9B,MAAM,MAAM,MAAM,MAEtBG;CACO,AAAA,EAAA,OAAA,OAAA,EAAA,OAGL,YAJF,MAAC,eAA2B;EAC1B,AAAK,OAGL,SAAS,WAAW,KAAK,UAAU,CAAC,CAAC,UAAU,EAAC,MAAM,IAAG,CAAC,CAAC;CAC7D,GAJO,EAAA,KAAA,KAGL,EAAA,KAAA;CALJ,IAAM,gBAAgBC,IAShB,iBAAiB,SAAS,IAIXC;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CAAfC,IAAAA;CAAeF,AAAAA,EAAAA,OAAAA,kBAAf,KAAA,oBAAC,KAAD;EAAK,MAAM;EAAIA,UAAAA;CAAgC,CAAA,GAAhCA,EAAAA,KAAAA;CACdG,IAAAA;wCAAkB,KAAA,kBAAA,oBAAC,iBAAD,EAAiB,UAAU,eAAiB,CAAA,GAA9D,EAAA,KAAA;CAFHC,IAAAA;CACEF,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,QACCC,MAFH,KAAA,qBAAC,MAAD;EAAM,OAAM;EAAS,SAAQ;EAA7B,UAAA,CACED,IACCC,EACG;KAFJD,EAAAA,KAAAA,IACCC,EAAAA,MAAAA;CAHLE,IAAAA;CADF,OAC0B,EAAA,QAAA,iBAAA,EAAA,QACtBD,MADF,KAAA,oBAAC,cAAD;EAAc,UAAU;EACtBA,UAAAA;CAIY,CAAA,GALU,EAAA,MAAA,eACtBA,EAAAA,MAAAA,8BADFC;AAOJ;AC1BA,MAAa,0BAA0B,cAAuB,KAAA,CAAS;AAEvE,SAAgB,sBAAsB,OAAmB;eAEZ,KAAA,MAAM,OAC1CE;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CAAHC,IAAAA;CAAGF,AAAAA,EAAAA,OAAAA,kBAAH,KAAA,oBAAAQ,UAAA,EAAA,UAAGR,GAA6B,CAAA,GAA7BA,EAAAA,KAAAA;CADLG,IAAAA;CADF,OACiDC,EAAAA,OAAAA,MAAAA,SAAAA,EAAAA,OAC7CF,MADF,KAAA,oBAACG,wBAAAA,UAAD;EAAkC,OAAOC;EACvCJ,UAAAA;CACgC,CAAA,GAFaE,EAAAA,KAAAA,MAAAA,OAC7CF,EAAAA,KAAAA,4BADFC;AAIJ;ACNA,SAAgB,WAAW,OAAkB;gBACrC,EAAC,SAAQ,OACT,WAAW,kBAAkB,MAAM,EAAI,GAGfM;qDAAC,KAAA,EAAA,UAAU,WAAU;CAChCC,IAAAA;CAAwB,AAAA,EAAA,OAAA,qBAAxB,KAAA,MAAM,cAAc,EAAC,GAAG,MAAK,CAAC,GAAN,EAAA,KAAA;CAAvCC,IAAAA;CAAeD,AAAAA,EAAAA,OAAAA,kBAAf,KAAA,oBAAC,KAAD;EAAK,MAAM;EAAIA,UAAAA;CAAqC,CAAA,GAArCA,EAAAA,KAAAA;CACdE,IAAAA;kCAAS,KAAA,SAAA,IAAIC,QAIb,GAJA,EAAA,KAAA;CAFHC,IAAAA;CADF,OAEIH,EAAAA,OAAAA,MAAAA,EAAAA,OACCC,MAFH,KAAA,qBAAC,MAAD;EAAM,OAAM;EAAS,OAAOH;EAA5B,UAAA,CACEE,IACCC,EAKG;KANJD,EAAAA,KAAAA,IACCC,EAAAA,KAAAA,4BAFHE;AASJ;AAPoB,SAAAE,SAAC,KAAA;CACb,OAAA,oBAAC,KAAD;EAAuB,OAAO;GAAC,UAAU;GAAY,OAAO;EAAE;EAC5D,UAAA,oBAAC,iBAAD,EAAiB,UAAU,IAAM,CAAA;CAC9B,GAFK,IAAI,KAAK,EAEd;;ACGb,MAAM,kBAAkB,OAAwB,GAAG,eAAe;AAElE,SAAgB,aACd,OACA;gBACM,EACJ,oBACA,gBACA,WAAW,OACX,YACA,cACA,WACA,WACA,QACA,UACA,SACA,YACA,uBACA,wBACA,oBACA,OACA,eACE,gBAAgB,GAEd,gBAAgB,iBAAiB,GACjC,WAAW,oBAAoB,UAAU,GAMZC;qDAAmB,KAAA,mBAAA;CAAtD,IAAM,eAAeC,IAEf,WAAW,WAAW,qBAAqB,SAEvCC;CAEU,AAAA,EAAA,OAAA,cAAA,EAAA,OADQC,cAAAA,QAAAA,EAAAA,OACI,gBAFtB,WAAM;EACd,IAAM,MAAM,cAAc,KACvB,eAAe,YAAY,YAAY,CAAC,CACxC,KACC,KAAK,UAAU;GAKb,AAJI,MAAM,SAAS,cACjB,aAAa,QAAQ,qBAAqB,KAAK,CAAC,GAG9C,MAAM,SAAS,YACjB,aAAa,QAAQ,mBAAmB,KAAK,CAAC;EAElD,CAAC,CACH,CAAC,CACA,UAAU;EAEb,aAAa;GACX,IAAI,YAAY;EAClB;CACF,GAjBoB,EAAA,KAAA,YADQA,EAAAA,KAAAA,cAAAA,MACI,EAAA,KAAA;CAiB7BC,IAAAA;CAnBH,AAmBI,EAAA,OAAA,cAAA,EAAA,OAAY,iBAAA,EAAA,OAAe,gBAA5B,KAAA;EAAC;EAAY;EAAe;EAAc;CAAY,GAArD,EAAA,KAAA,YAAY,EAAA,KAAA,eAAe,EAAA,KAAA,sCAnB/B,UAAUF,IAmBPE,EAAuD;CAE1D,IAAM,SAAS,EAAQ,OAAO,MACaC;CAQ7B,AAAA,EAAA,OAAA,sBAR6B,WAAM;EAK/C,aAAa,QAAQ;GACnB,MAAM;GACN,SAAS,CAAC;GACV,UAAU;EACZ,CAAC;CACH,GAFc,EAAA,KAAA;CARd,IAAM,sBAAsB,eAAeA,EAU1C,GACSC;CACJ,AAAA,EAAA,QAAA,UAAA,EAAA,QAEF,uBAHM,WAAM;EACd,AAAI,UAEF,oBAAoB;CAExB,GAJM,EAAA,MAAA,QAEF,EAAA,MAAA;CAEDC,IAAAA;CALH,AAKI,EAAA,QAAA,uBAAD,KAAA,CAAC,MAAM,GAAN,EAAA,MAAA,qBALJ,UAAUD,IAKPC,EAAQ;CAEX,IAAM,UAAU,OAA+B,IAAI,GAEzCC,IAEPC;CAEH,yDAJU,WAAM;EACd,qBAAqB,QAAQ,OAAQ;CACvC,GAAG,KAAA,CAAC,uDAFJ,UAAUD,IAEPC,EAAE,GAED,UAAU;EAGRC,IAAAA;uDAAC,KAAA,oBAAA,MAAD;GACE,OAAM;GACN,WAAU;GACV,QAAO;GACP,SAAQ;GACR,SAAS;GACT,QAAO;GAEP,UAAA,oBAAC,MAAD;IAAM,MAAM;IACV,UAAA;GAEI,CAAA;EACF,CAAA;EAbRC,IAAAA;EADF,OACqB,EAAA,QAAA,sBAAnB,KAAA,oBAAC,KAAD;GAAK,IAAG;GAAO,GAAI;GAAO,KAAK;GAC7BD,UAAAA;EAaG,CAAA,GAdc,EAAA,MAAA,oBAAnBC;CAgBJ;CAIKC,IAAAA;CAeyB,AAAA,EAAA,QAAA,sBAAA,EAAA,QACJ,kBAAA,EAAA,QAfpB,aAAA,EAAA,QAwBgB,UAAA,EAAA,QAFF,YAAA,EAAA,QAGG,WAAA,EAAA,QACD,cAAA,EAAA,QAHQ,yBAAA,EAAA,QAII,0BAAA,EAAA,QACJ,sBAAA,EAAA,QACV,YAAA,EAAA,QA9Bf,SAAA,EAAA,QAiCiB,cAjCjB,KAAA,QACC,cAAc,OACZ,oBAAC,MAAD;EACE,OAAM;EACN,WAAU;EACV,QAAO;EACP,SAAQ;EACR,SAAS;EACT,QAAO;EAEP,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,UAAA;EAAyB,CAAA;CACpC,CAAA,IAEN,oBAAC,aAAD;EACE,yBAAyB;EACL;EACJ;EAChB,WAAW,UAAU;EACrB,SAAS,UAAU;EACnB,SAAS,UAAU;EACnB,QAAQ,UAAU;EAClB,IAAI;EACJ,SAAS,UAAU;EACT;EACV,oBAAoB;EACpB,YAAY;EACZ,aAAa;EACD;EACZ,wBAAwB;EACxB,oBAAoB;EACV;EACV,UAAU,UAAU;EACpB,YAAY,UAAU;EACV;EAEZ,OAAO,UAAU;EACjB,oBAAoB;CACrB,CAAA,IAGH,qBAAC,MAAD;EACE,OAAM;EACN,WAAU;EACV,QAAO;EACP,SAAQ;EACR,SAAS;EACT,QAAO;EANT,UAAA,CAQE,oBAAC,SAAD,EAAS,OAAA,GAAO,CAAA,GAEhB,oBAAC,KAAD;GAAK,WAAW;GACd,UAAA,oBAAC,MAAD;IAAM,OAAM;IAAS,OAAA;IAAM,MAAM;IAC/B,UAAA;GACI,CAAA;EACH,CAAA,CACD;KAxCkB,EAAA,MAAA,oBACJ,EAAA,MAAA,gBAfpB,EAAA,MAAA,WAwBgB,EAAA,MAAA,QAFF,EAAA,MAAA,UAGG,EAAA,MAAA,SACD,EAAA,MAAA,YAHQ,EAAA,MAAA,uBAII,EAAA,MAAA,wBACJ,EAAA,MAAA,oBACV,EAAA,MAAA,UA9Bf,EAAA,MAAA,OAiCiB,EAAA,MAAA;CAlCpBC,IAAAA;CADF,OACqB,EAAA,QAAA,SAAA,EAAA,QAChBD,MADH,KAAA,oBAAC,KAAD;EAAK,IAAG;EAAO,GAAI;EAAO,UAAU;EAAgB,KAAK;EACtDA,UAAAA;CAyDE,CAAA,GA1Dc,EAAA,MAAA,OAChBA,EAAAA,MAAAA,8BADHC;AA4DJ;AAEA,SAAS,qBAAqB,OAAwC;CACpE,IAAM,UAAU,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,OAAO,OAAO;CAEtE,OAAO;EACL,MAAM;EACN,UAAU,MAAM;EAChB,SAAS,oBAAoB,MAAM,QAAQ,OAAO;CACpD;AACF;AAEA,SAAS,mBAAmB,OAAsC;CAChE,IAAM,gBAAgB,MAAM,gBAAgB,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,OAAO,OAAO,GAC5E,eAAe,MAAM,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,OAAO,OAAO;CAEhF,OAAO;EACL,MAAM;EACN,UAAU,MAAM;EAChB,SAAS,oBAAoB,UAAU,aAAa,CAAC,CAAC,OACpD,oBAAoB,SAAS,YAAY,CAC3C;CACF;AACF;ACtMA,MAAa,oBAAoB,cAAsC,CAAC,CAAC;;;;;;;;;;;;;;ACkCzE,SAAgB,sBACd,UACA,WAAWE,GACe;CAO1B,OACE,CAAC;EAND,MAAM;EACN,QAAQ;EACR,UAAU,CAAC,CAAC,SAAS;EACrB,aAAa,cAAc,SAAS,UAAU;CAG7C,GAAK,GAAG,wBAAwB,UAAU,KAAK,IAAI,UAAUC,EAAkB,CAAC,CAAC,CAAC,CAChF,QAAQ,MAAM,EAAE,WAAW,CAAC,CAE5B,KAAK,EAAC,aAAa,cAAc,GAAG,aAAY,EAAC,GAAG,MAAK,EAAE;AAElE;AAEA,SAAS,cAAc,YAAwB;CAC7C,OAAO,OAAO,WAAW,UAAW,cAAc,OAAO,WAAW,YAAa;AACnF;AAEA,SAAS,iBAAiB,aAIM;CAC9B,OAAO;EACL,MAAM,aAAa,YAAY,IAAI;EACnC,UAAU,CAAC,CAAC,YAAY;EACxB,QAAQ;EACR,aAAa,cAAc,YAAY,UAAU;CACnD;AACF;AAEA,SAAS,wBACP,MACA,UAC+B;CAK/B,OAJI,KAAK,KAAK,UAAU,WACf,CAAC,IAGH,KAAK,QAAQ,QAAuC,KAAK,WAAW;EACzE,IAAI,OAAO,SAAS,SAClB,OAAO;EAET,IAAI,OAAO,SAAS,SAAS;GAC3B,IAAM,aAAa,OAAO,MAAM;GAChC,IAAI,WAAW,aAAa,UAAU;IACpC,IAAM,cAAc,OAAO,MAAM,WAC7B,CAAC,IAED,wBAAwB,OAAO,OAAyB,QAAQ;IACpE,OAAO;KAAC,GAAG;KAAK,iBAAiB,OAAO,KAAK;KAAG,GAAG;IAAW;GAChE;GAAO,IAAI,WAAW,aAAa,SAAS;IAE1C,IAAM,QAAQ,OAAO,OAEjB,aAA4C,CAAC,GAC3C,iBAAiB,MAAM,QAAQ,MAClC,MAAM,EAAE,SAAS,UAAU,mBAAmB,EAAE,KAAK,UAAU,CAClE;IACA,IAAI,CAAC,MAAM,UACT,KAAK,IAAM,eAAe,MAAM,SAAS;KACvC,IAAI,YAAY,SAAS,SACvB;KAGF,IAAM,cACJ,kBAAkB,CAAC,YAAY,KAAK,WAEhC,wBAAyB,YAAyC,MAAM,QAAQ,IAChF,CAAC;KAEP,aAAa;MAAC,GAAG;MAAY,iBAAiB,YAAY,IAAI;MAAG,GAAG;KAAW;IACjF;IAEF,OAAO;KAAC,GAAG;KAAK,iBAAiB,KAAK;KAAG,GAAG;IAAU;GACxD;GAEA,OAAO,CAAC,GAAG,KAAK,iBAAiB,OAAO,KAAK,CAAC;EAChD;EAAO,IAAI,OAAO,SAAS,YAAY;GAErC,IAAM,sBAAsB,CAAC,CAAE,KAAwB,YAAY,WAAW,MAC3E,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,EAAE,UAAW,UAC7E,GAEM,cAAc,wBAAwB,OAAO,UAAU,QAAQ,CAAC,CAAC,KAAK,OAAO;IACjF,GAAG;IAEH,aAAa,uBAAuB,EAAE;GACxC,EAAE;GACF,OAAO,CAAC,GAAG,KAAK,GAAG,WAAW;EAChC;EAEA,OAAO;CACT,GAAG,CAAC,CAAC;AACP;ACpIA,MAAM,uBAAuB,uBAAO,YAAY,CAAC,CAAA,WAAA;;;AAAC,CAAA,CAAA,CAAA;CAChDijB,UAAY;CACZ,UAAU,EACR,aAAa,mBACf;AACF,CAAC;AAED,SAAgB,oBAAoB,OAAgC;eAC5D,EAAC,cAAa,OAKZhjB,IAGAC;qDAHA,KAAA,oBAAC,OAAD;EAAK,OAAO,EAAC,WAAW,SAAQ;EAC9B,UAAA,oBAAC,sBAAD,CAAuB,CAAA;CACpB,CAAA,GACL,KAAA,oBAAC,MAAD;EAAM,OAAM;EAAS,MAAM;EACzB,UAAA;CAEI,CAAA;CATZC,IAAAA;CADF,OAoBqB,EAAA,OAAA,yBAnBnB,KAAA,oBAAC,KAAD;EAAK,SAAS;EACZ,UAAA,oBAAC,WAAD;GAAW,OAAO;GAChB,UAAA,qBAAC,OAAD;IAAO,KAAK;IAAZ,UAAA;KACEF;KAGAC;KAKA,qBAAC,MAAD;MAAM,OAAM;MAAS,KAAK;MAAG,SAAQ;MAArC,UAAA,CACE,oBAAC,QAAD;OACE,IAAG;OACH,MAAM;OACN,KAAI;OACJ,QAAO;OACP,UAAU;OACV,MAAK;OACL,SAAS;OACT,SAAS;OACT,MAAK;OACL,MAAK;MACN,CAAA,GACD,oBAAC,QAAD;OAAQ,UAAU;OAAG,MAAK;OAAQ,SAAS;OAAW,SAAS;OAAG,MAAK;MAAW,CAAA,CAC9E;;IACD;;EACE,CAAA;CACR,CAAA,GATc,EAAA,KAAA,uBAnBnBC;AA8BJ;AC1CA,SAAS,6BAA6B,YAA6B;CAMjE,OALI,OAAO,eAAiB,MACnB,KAGK,aAAa,QAAQ,UAC5B,MAAU;AACnB;AAEA,SAAS,yBAAyB,YAAoB;CACpD,AAAI,OAAO,eAAiB,OAI5B,aAAa,QAAQ,YAAY,MAAM;AACzC;AAEA,SAAgB,qBAAqB,YAAoB;eAErDE;CAAoC,AAAA,EAAA,OAAA,0BAApC,WAAM,CAAC,6BAA6B,UAAU,GAAV,EAAA,KAAA;CADtC,IAAM,CAAC,gBAAgB,qBAAqB,SAC1CA,EACF,GACsCC;CAEX,AAAA,EAAA,OAAA,0BAFW,WAAM;EAE1C,AADA,kBAAkB,EAAK,GACvB,yBAAyB,UAAU;CACrC,GAD2B,EAAA,KAAA;CAF3B,IAAM,oBAAoBC,IAKnBC;CAAP,OAAwB,EAAA,OAAA,qBAAA,EAAA,OAAhB,kBAAD,KAAA;EAAC;EAAgB;CAAiB,GAAjB,EAAA,KAAA,mBAAhB,EAAA,KAAA,wCAADA;AACT;ACXA,SAAgB,kBAAkB,OAA2B;gBACrD,EAAC,IAAI,YAAY,WAAW,UAAU,iBAAiB,WAAU,OAEjE,EAAC,iBAAgB,sBAAsB,GAE3BE;CACH,IAAA,EAAA,OAAA,gBAAA,EAAA,OACT,mBAAA,EAAA,OADsBC,YAAAA;;GAA1B,IAAM,OAAO,aAAa,WAAW,IAAI;GACzC,IAAI,iBAAiB;IACXC,IAAAA;IAAR,AAA4B,EAAA,OAAA,0BAApB,KAAA,oBAAoB,UAAU,GAAV,EAAA,KAAA,wBAA5B,KAAO,CAACA,IAAiC,GAAG,IAAI;IAAhD,MAAA;GACF;GACA,KAAO;;EAJM,EAAA,KAAA,cACT,EAAA,KAAA,iBADsBD,EAAAA,KAAAA;;CAD5B,IAAM,YAAYD,IASVG;CAAgC,IAAA,EAAA,OAAA,aAAA,EAAA,OAAhC,WAAA;EAAeC,IAAAA;EAAiB,EAAA,OAAA,0BAAjB,MAAC,MAAM,EAAE,QAAQ,0CAAhC,KAAA,UAAU,KAAKA,EAA0B,GAAT,EAAA,KAAA,WAAhC,EAAA,KAAA;;CADR,IAAM,eAAeC,IAOjBC;CACsB,IAAA,EAAA,QAAA,aAAA,EAAA,QAAA,QAAA;EAAZC,IAAAA;EAAY,EAAA,QAAA,uBAAZ,MAAC,UAAW,WAAS,OAAO,KAAK,GAArB,EAAA,MAAA,qBADtB,KAAA,UACG,OAAOA,EAA0C,CAAC,CAClD,OAAOC,OAAyC,CAAC,CACjD,IAAIC,QAAsC,GAH7C,EAAA,MAAA,WACsB,EAAA,MAAA;;CAH1B,IAAM,sBAAsBC,IAStB,eAAeC,UAoCf,cAAcC,UAId,eAAeC,UAWX,KAAA,eAAe,aAAa,OAAO,YASlC,KAAA,cAAc,KAXvBC;CADF,OAOa,EAAA,QAAA,uBAAA,EAAA,QADL,MAAA,EAAA,QAFM,YAAA,EAAA,QADJC,MAAAA,EAAAA,QASCC,MAXT,KAAA,oBAAC,cAAD;EACE,UAAU;EACV,MAAMD;EACN,UAAU;EACV,YAAA;EACI;EACJ,SAAS;EACT,aAAY;EACZ,QAAQ;EACM;EACD;EACb,OAAOC;EACO;CACf,CAAA,GAPU,EAAA,MAAA,qBADL,EAAA,MAAA,IAFM,EAAA,MAAA,UADJD,EAAAA,MAAAA,IASCC,EAAAA,MAAAA,8BAXTF;AAeJ;AAxBmC,SAAA0B,SAAC,OAAe,UAA6C;CAC5F,IAAM,SAAS,MAAM,YAAY;CACjC,OACEvB,UAAQ,OAAO,YAAY,CAAC,CAAC,SAAS,MAAM,KAC5CA,UAAQ,OAAO,OAAO,YAAY,CAAC,CAAC,SAAS,MAAM;AAEvD;AAVgC,SAAAsB,SAAC,SAAe,UAA8C;CAC5F,OAAOtB,UAAQ,MAAM,SAASC;AAChC;AAtCiC,SAAAoB,SAAC,QAA6C;CAC7E,IAAM,EAAC,OAAO,OAAA,YAAS;CAsBvB,OApBK,QAUD,OAAOnB,QAAM,YAAY,UAAU,IAEnC,oBAAC,MAAD;EAAM,IAAG;EAAS,SAAS;EAAG,QAAQ;EACpC,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GACpB,UAAA;EACI,CAAA;CACF,CAAA,IAKR,oBAAC,MAAD;EAAM,IAAG;EAAS,SAAS;EAAG,QAAQ;EACpC,UAAA,qBAAC,MAAD;GAAM,KAAK;GAAX,UAAA,CACE,oBAAC,MAAD;IAAM,MAAM;IACV,UAAA,oBAACC,QAAAA,MAAD,CAAa,CAAA;GACT,CAAA,GAEN,oBAAC,YAAD,EAAY,OAAOD,QAAQ,CAAA,CACvB;;CACF,CAAA,IA3BJ,oBAAC,MAAD;EAAM,IAAG;EAAS,SAAS;EAAG,QAAQ;EACpC,UAAA,oBAAC,MAAD;GAAM,QAAA;GAAO,MAAM;GAChB,UAAA,OAAO;EACJ,CAAA;CACF,CAAA;AAyBZ;AAtCW,SAAAkB,SAAC,SAAA;CAAW,OAAA;EAAC,OAAOlB,QAAM;EAAK,OAAA;CAAK;;AADjC,SAAAiB,QAAC,KAAA;CAAM,OAAA,CAAC,OAAOf,IAAE,YAAY,WAAW;;AAuExD,SAAgB,WAAW,OAA0B;gBAI9CC,IADFC,IAFG,YAIOC,IAOLC,IAMGC,IAEJC,IAjBKC;CAFmBC,AAAAA,EAAAA,OAAAA,MAAN,MAAM,4GAA/B,aAAmB,MAAM,MAAM,MAAM,MAAM,GAAG,GAE3C,KAAA,KAAS,KAAA,QACP,KAAA,iEACQ,KAAA;EACL,SAAS;EACT,UAAU;EACV,YAAY;EACZ,WAAW;CACb,gFAEE,KAAA,oBAAC,KAAD;EAAK,WAAW;EACd,UAAA,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GAChB,UAAA;EACI,CAAA;CACH,CAAA,6BAEF,KAAA,GAEJ,KAAA,WAAW,MAAM,GAAG,WAAW,SAAS,CAAC,CAAC,CAAC,IAAIC,QAO/C,GA1BwBD,EAAAA,KAAAA,MAAN,MAAM;CA6BpB,IAAA,KAAA,WAAW,WAAW,SAAS,IAFpCE;CAEKC,AAAAA,EAAAA,QAAAA,mBAFL,KAAA,oBAAC,KAAD;EAAK,WAAW;EACd,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GACnBA,UAAAA;EACG,CAAA;CACH,CAAA,GAFAA,EAAAA,MAAAA;CA1BPC,IAAAA;CAACX,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QACQE,MAAAA,EAAAA,QAOLC,MAAAA,EAAAA,QAMGC,MAAAA,EAAAA,QAEJC,MAAAA,EAAAA,QAQDI,MAxBF,KAAA,qBAACT,IAAD;EACE,OAAOE;EAMP,WACEC;EAMF,KAAKC;EAdP,UAAA,CAgBGC,IAQDI,EAKW;KA7BZT,EAAAA,MAAAA,IACQE,EAAAA,MAAAA,IAOLC,EAAAA,MAAAA,IAMGC,EAAAA,MAAAA,IAEJC,EAAAA,MAAAA,IAQDI,EAAAA,MAAAA;CAzBJG,IAAAA;CADF,OACGX,EAAAA,QAAAA,MAAAA,EAAAA,QAASK,MAAAA,EAAAA,QACRK,MADF,KAAA,oBAACV,IAAD;EAAK,MAAKK;EACRK,UAAAA;CA8BG,CAAA,GA/BJV,EAAAA,MAAAA,IAASK,EAAAA,MAAAA,IACRK,EAAAA,MAAAA,8BADFC;AAiCJ;AAhBwD,SAAAO,SAAC,IAAI,GAAA;CAEnD,OAAA,oBAAC,KAAD;EAAa,WAAW;EACtB,UAAA,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GACf,UAAA,GAAG,KAAK;EACL,CAAA;CACH,GAJK,CAIL;;ACxIf,SAAS,YAAY,IAAY;eACzB,CAAC,MAAM,UAAU,WAAWC,SAAc,CAAC,GAEvCC,IAGPC;CACH,OAHgC,EAAA,OAAA,+BADtB,WAAM;EACd,IAAM,IAAI,YAAY,QAAQ,EAAE;EAChC,aAAa,cAAc,CAAC;CAC9B,GAAG,KAAA,CAAC,EAAE,GAF0B,EAAA,KAAA,2BADhC,UAAUD,IAGPC,EAAI,GACA;AACT;AAPoC,SAAAK,QAAC,GAAA;CAAM,OAAA,IAAI;;AAS/C,SAAgB,QAAA,IAAiC;eAAzB,EAAC,SAADJ;CACtB,YAAY,GAAI;CAEEC,IAAAA;CAAoB,AAAA,EAAA,OAAA,oBAApB,KAAA,oBAAoB,OAAO,IAAI,KAAK,IAAI,oBAAI,IAAI,KAAK,CAAC,GAAlC,EAAA,KAAA;CAAtC,IAAM,YAAYA,IACXC;CAAP,OAAoB,EAAA,OAAA,yBAAb,KAAA,qBAAC,QAAD;EAAM,OAAO;EAAb,UAAA,CAAyB,WAAU,MAAU;KAAhC,EAAA,KAAA,uBAAbA;AACT;ACsBA,MAAM,SAAS,SAAS,2DASlB,mBAAmB,OAAO,QAAQ,CAAC,CAAA,WAAA;;;AAC1B,CAAA,CAAA,aAAA,OAAO,uBAGhB,cAAc;CAClB,SAAS;EACP,OAAO;EACP,MAAM;EACN,MAAM;CACR;CACA,OAAO;EACL,OAAO;EACP,MAAM;EACN,MAAM;CACR;CACA,SAAS;EACP,OAAO;EACP,MAAM;EACN,MAAM;CACR;CACA,SAAS;EACP,OAAO;EACP,MAAM;EACN,MAAM;CACR;AACF;AAEA,SAAgB,6BAA6B,OAA0C;gBAC/E,EAAC,OAAO,cAAc,YAAY,eAAc,OAE7BG;qDAAC,KAAA,EAAA,YAAY,aAAY;CAAlD,IAAM,SAAS,UAAUA,EAA0B,GAEjDC;CAME,AAAA,EAAA,OAAA,UAAA,EAAA,OALK,cADP,MAAC,YAAoB;EACnB,IAAI,CAAC,YACH;EAEF,IAAM,cAAc,oBAAoB,UAAU,GAC5C,WAAW,GAAG,MAA+B,OAAO,EAAE,UAAU,QAAQ;EAC9E,OACG,MAAM,WAAW,CAAC,CAClB,IAAI;IACF,GAAG,SAAS,GAAG,MAA6B,OAAO,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;IAChF,GAAG,SAAS,GAAG,MAA6B,QAAQ,MACnD,MAAuB,SAAS;EACpC,CAAC,CAAC,CACD,OAAO,CAAC,CACR,MAAM,QAAQ,KAAK;CACxB,GATE,EAAA,KAAA,QALK,EAAA,KAAA;CAFT,IAAM,YAAYC,IAqBV;CAcgB,AAAA,EAAA,OAAA,aAAA,EAAA,OAJIC,gBAAAA,EAAAA,OAGX,cAAA,EAAA,OAZbC,SADF,IACE,OACI,OACAC,OAIF,CAAC,CAEA,KAAK,WAAoC;EACxC,IAAM,cAAc,cAAc,MAAM,MAAM,EAAE,SAASC,OAAK,cAAc;EAC5E,OAAO;GACL,GAAGA;GACH,OAAO,aAAcA,OAAK,SAAS,oBAAoB,WAAW,IAAK,KAAA;GACvE,cAAc,UAAUA,OAAK,IAAI;EACnC;CACF,CAAC,KAAK,CAAC,GACX,EAAE,KAAKC,QAAmF,GAHpE,EAAA,KAAA,WAJIJ,EAAAA,KAAAA,cAGX,EAAA,KAAA,YAZbC,EAAAA,KAAAA;CAFJ,IAAM,cAAcI,GAwBYC;sCAAY,KAAA,YAAA,KAAKC,QAAe,GAAhC,EAAA,KAAA;CAAhC,IAAM,YAAYC,IAEVC;uCAAY,KAAA,YAAA,KAAKC,QAAqD,GAAtE,EAAA,MAAA;CADR,IAAM,YAAYC,IAKZ,CAAC,MAAM,WAAW,SAAS,EAAK,GAEPC;sDAAM,WAAA,QAAQC,QAAS;CAAtD,IAAM,aAAaC,IAEb,CAAC,QAAQ,aAAa,SAAmC,IAAI,GAC7D,CAAC,SAAS,cAAc,SAAgC,IAAI,GAE3BC;sDAAM,WAAA;EAC3C,QAAQ,EAAK;CACf;CAFA,IAAM,qBAAqBC,IAIcC;CAAzC,AAAgD,EAAA,QAAA,UAAA,EAAA,QAAQ,WAAf,WAAM,CAAC,QAAQ,OAAO,GAAf,EAAA,MAAA,QAAQ,EAAA,MAAA,mCAAxD,qBAAqB,oBAAoBA,EAAuB;CAE/BC,IAAAA;CAE/BC,AAAAA,EAAAA,QAAAA,uBAF+B,WAAM;EAErC,AADA,QAAQ,EAAK,GACb,QAAQ,MAAM;CAChB,GADEA,EAAAA,MAAAA;CAFF,IAAM,eAAeC,IAQRC;CAAoB,AAAA,EAAA,QAAA,gBAAA,EAAA,QAAqB,eAAzC,KAAA,oBAAC,UAAD;EAAU,UAAU;EAAc,OAAO;CAAc,CAAA,GAAnC,EAAA,MAAA,cAAqB,EAAA,MAAA;CAC5C,IAAA,KAAA,QAAQ,CAAC,CAAC,aAAa,QAOjB,MAAA,CAAC,aAAa,QAD1BC;CAEa,AAAA,EAAA,QAAA,aAAA,EAAA,QACA,aAAA,EAAA,QAGD,QAAA,EAAA,QALAC,OADZ,MAAA,oBAAC,kBAAD;EACE,UAAUA;EACC;EACA;EACX,SAAS;EACT,KAAK;EACL,UAAU;CACX,CAAA,GALY,EAAA,MAAA,WACA,EAAA,MAAA,WAGD,EAAA,MAAA,MALAA,EAAAA,MAAAA;CAVdC,IAAAA;CADF,OAUIF,EAAAA,QAAAA,OAAAA,EAAAA,QAPSD,MAAAA,EAAAA,QACHI,MAHR,MAAA,oBAAC,SAAD;EACE,eAAA;EACA,SAASJ;EACT,MAAMI;EACN,WAAU;EACV,QAAA;EACA,KAAK;EACL,OAAO;EAEPH,UAAAA;CAQO,CAAA,GARPA,EAAAA,MAAAA,KAPSD,EAAAA,MAAAA,IACHI,EAAAA,MAAAA,gCAHRD;AAmBJ;AApC+C,SAAAoC,SAAC,GAAA;CAAM,OAAA,CAAC;;AAN5B,SAAAD,SAAC,KAAA;CAAMjC,OAAAA,IAAE,WAAW,WAAWA,IAAE,WAAW;;AAFpB,SAAAgC,SAAC,GAAA;CAAM,OAAA,CAAC,EAAE;;AANlD,SAAAD,SAAC,GAAG,GAAA;CAAM,OAAA,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ;;AAdnF,SAAAD,QAAC,MAAA;CACC,OAAA,KAAK,4BAEL,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,QAAQ,IAAI;;AA+DtE,MAAM,mCAAmF,EACvF,WAAW,MACb;AAEA,SAAS,iBAAiB,OAOvB;eACK,EAAC,UAAU,WAAW,WAAW,SAAS,UAAU,QAAO,OAMvD,KAAA,YAAY,mBAAmB,YAAY,mBAAmB,qBAG9D,KAAA,YAAY,aAAa,KAAA,GANjC7B;CADF,OAQc,EAAA,OAAA,YAAA,EAAA,OAFD,WAAA,EAAA,OAGJ,OAAA,EAAA,OACK,YAAA,EAAA,OANJC,MAAAA,EAAAA,OAGAC,MANR,KAAA,oBAAC,cAAD;EACE,OAAO,GAAG,YAAY;EACtB,cAAY,GAAG,YAAY;EAC3B,MAAMD;EACN,MAAK;EACI;EACT,MAAMC;EACI;EACL;EACK;EACV,cAAc;CACf,CAAA,GAJW,EAAA,KAAA,UAFD,EAAA,KAAA,SAGJ,EAAA,KAAA,KACK,EAAA,KAAA,UANJD,EAAAA,KAAAA,IAGAC,EAAAA,KAAAA,4BANRF;AAaJ;AAEA,SAAS,SAAS,OAAmE;eAC7E,EAAC,UAAU,UAAS,OAEpB,EAAC,eAAc,SAAS,GAI1BG;CAFJ,AAGU,EAAA,OAAA,cAAA,EAAA,OACF,YAFJ,MAAC,UAAU;EACT,AAAI,cAAc,MAAM,QAAQ,YAC9B,SAAS;CAEb,GAHM,EAAA,KAAA,YACF,EAAA,KAAA,kCAJR,iBACEC,EAQF;CAIKC,IAAAA;+BAAM,KAAA,MAAA,IAAIC,MAEV,GAFA,EAAA,KAAA;CADHC,IAAAA;CADF,OAEKF,EAAAA,OAAAA,kBADH,KAAA,oBAAC,OAAD;EAAO,SAAS;EAAG,KAAK;EACrBA,UAAAA;CAGI,CAAA,GAHJA,EAAAA,KAAAA,gBADHE;AAMJ;AALiB,SAAA,OAAC,MAAA;CACV,OAAA,oBAAC,UAAD,EAAgC,KAAO,GAAxB,KAAK,IAAmB;;AAM/C,SAAS,SAAS,OAA0C;gBACpD,EAAC,SAAQ,OAET,WAAW,KAAK,UAAU,YAAY,KAAK,SAC3C,WAAW,WAAW,SAAS,OAAO,MAEnB,KAAA,YAAY,UAAU,MAKlCC;kCAAY,KAAA,YAAA,oBAAC,UAAD,CAAW,CAAA,GAAvB,EAAA,KAAA;CACAC,IAAAA;CAAMC,AAAAA,EAAAA,OAAAA,KAAAA,sBAAN,KAAA,CAAC,KAAK,UAAU,oBAAC,SAAD,CAAU,CAAA,GAApBA,EAAAA,KAAAA,KAAAA;CAHXC,IAAAA;CAEKH,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OACAC,MAHL,KAAA,oBAAC,KAAD;EAAK,MAAK;EACR,UAAA,qBAAC,MAAD;GAAM,MAAM;GAAZ,UAAA,CACGD,IACAC,EACG;;CACH,CAAA,GAHAD,EAAAA,KAAAA,IACAC,EAAAA,KAAAA;CAKA,IAAA,KAAA,WAAW,SAAS,QAAQ,WAC5BG;CAAKC,AAAAA,EAAAA,OAAAA,KAAAA,qBAAL,KAAA,KAAK,SAAS,qBAAAqB,UAAA,EAAA,UAAA,CAAE,MAAG,KAAK,KAAQ,EAAA,CAAA,GAA3BrB,EAAAA,KAAAA,KAAAA;CAFRC,IAAAA;CACGC,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,QACAH,MAFH,KAAA,qBAAC,MAAD;EAAM,MAAM;EAAG,QAAO;EAAtB,UAAA,CACGG,IACAH,EACG;KAFHG,EAAAA,KAAAA,IACAH,EAAAA,MAAAA;CAEFI,IAAAA;CAAKC,AAAAA,EAAAA,QAAAA,KAAAA,wBAAL,KAAA,KAAK,UAAU,oBAAC,MAAD;EAAM,MAAM;EAAI,UAAA,KAAK;CAAc,CAAA,IAAI,MAAjDA,EAAAA,MAAAA,KAAAA;CAEW,IAAA,KAAA,KAAK,SAAS,KAAK,SADpCC;CACiBC,AAAAA,EAAAA,QAAAA,mBADjB,KAAA,oBAAC,MAAD;EAAM,OAAA;EAAM,MAAM;EAChB,UAAA,oBAAC,SAAD,EAAS,MAAMA,GAA6B,CAAA;CACxC,CAAA,GADWA,EAAAA,MAAAA;CAPnBC,IAAAA;CACEN,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAICE,MAAAA,EAAAA,QACDE,MANF,MAAA,qBAAC,OAAD;EAAO,MAAM;EAAG,KAAK;EAArB,UAAA;GACEJ;GAICE;GACDE;EAGK;KARLJ,EAAAA,MAAAA,IAICE,EAAAA,MAAAA,IACDE,EAAAA,MAAAA;CAbJG,IAAAA;CAOED,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QANAT,MADF,MAAA,qBAAC,MAAD;EAAM,OAAM;EAAa,MAAM;EAAG,KAAK;EAAG,SAAS;EAAnD,UAAA,CACEA,IAMAS,GAUI;KAVJA,EAAAA,MAAAA,KANAT,EAAAA,MAAAA;CAkBDW,IAAAA;CAEmDC,AAAAA,EAAAA,QAAAA,KAAAA,UAAAA,EAAAA,QAF7CC,KAAAA,SAAN,MAAA,CAAC,KAAK,SACL,oBAAC,KAAD;EAAK,MAAK;EAAO,SAAS;EACxB,UAAA,oBAAC,QAAD;GAAQ,UAAU;GAAG,MAAK;GAAQ,SAAS,KAAK;GAAQ,MAAK;EAAU,CAAA;CACpE,CAAA,GAD6CD,EAAAA,MAAAA,KAAAA,QAF7CC,EAAAA,MAAAA,KAAAA;CApBTC,IAAAA;CACEJ,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAmBCC,OApBH,MAAA,qBAAC,MAAD;EAAM,OAAM;EAAS,KAAK;EAA1B,UAAA,CACED,KAmBCC,GAKG;KAxBJD,EAAAA,MAAAA,KAmBCC,EAAAA,MAAAA;CArBLI,IAAAA;CADF,OACyBC,EAAAA,QAAAA,MAAAA,EAAAA,QACrBF,OADF,MAAA,oBAAC,MAAD;EAAM,QAAQ;EAAG,MAAME;EACrBF,UAAAA;CA0BI,CAAA,GA3BiBE,EAAAA,MAAAA,IACrBF,EAAAA,MAAAA,iCADFC;AA6BJ;;;;;;;;;;;;AC1OA,SAAgB,kBACd,YACA,YACoB;CACpB,IAAM,EAAC,MAAM,eAAe,GAAG,aAAY,YACrC,EAAC,MAAM,UAAU,GAAG,aAAY;CAMtC,OAJIS,OAAQ,UAAU,QAAQ,IACrB;EAAC;EAAe,eAAe;CAAI,IAGrC;EAAC;EAAe,eAAe;GAAC,GAAG;GAAU,MAAM;EAAQ;CAAC;AACrE;ACQA,MAAM,oBAAwD,CAAC,GAEzD,sBAAsB,OAAO,IAAI,CAAC,CAAA,WAAA;;;gLAgBlC,sBAAsB,OAAO,IAAI,CAAC,CAAA,WAAA;;;;AAgBxC,SAAgB,uBAAuB,OAA+B;gBAC9D,UAAU,sBAAsB;CAEtC,IAAI,QAAQ,eAAe;EAEvBC,IAAAA;EADF,2DACG,KAAA,oBAAA,MAAD;GAAM,OAAM;GAAS,QAAO;GAAO,SAAQ;GAAS,SAAS;GAAG,QAAO;GACrE,UAAA,qBAAC,OAAD;IAAO,KAAK;IAAG,OAAO,EAAC,WAAW,SAAQ;IAA1C,UAAA,CACE,oBAAC,SAAD,EAAS,OAAA,GAAO,CAAA,GAChB,qBAAC,MAAD;KAAM,OAAA;KAAM,MAAM;KAAlB,UAAA;MACE;MAAS;MAAY;KACjB;IACD,CAAA,CAAA;;EACH,CAAA,2BAPNA;CASJ;CAEA,IAAM,SAAS,QAAQ;CAEvB,IAAI,CAAC,QAAQ,SAAS;EAGhBC,IAAAA;EAEiBC,AAAAA,EAAAA,OAAAA,MAAAA,uBAFjB,KAAA,oBAAC,yBAAD;GACE,kBAAiB;GACjB,SAAS,MAAM;GACf,OAAO;EACR,CAAA,GAFgBA,EAAAA,KAAAA,MAAAA;EAKfC,IAAAA;sDAAC,KAAA,qBAAA,MAAD;GAAM,IAAG;GAAI,MAAM;GAAG,QAAO;GAA7B,UAAA,CACG,aAAY,mBACT;;EAIJC,IAAAA;sDAAC,KAAA,oBAAA,KAAD;GAAG,MAAM;GAAU,QAAO;GAAS,KAAI;GACrC,UAAA;EACC,CAAA;EATPC,IAAAA;sDAAC,KAAA,qBAAA,OAAD;GAAO,MAAM;GAAG,UAAS;GAAO,SAAS;GAAG,KAAK;GAAjD,UAAA,CACEF,IAIA,qBAAC,MAAD;IAAM,IAAG;IAAI,OAAA;IAAM,MAAM;IAAzB,UAAA;KACE;KAAqD;KACrDC;KAEK;KACL;KAAqB;KAAY;KAAE;KACnC,oBAAC,KAAD;MAAG,MAAM;MAAwB,QAAO;MAAS,KAAI;MACnD,UAAA;KACC,CAAA;IACC;GACD,CAAA,CAAA;;EAtBTE,IAAAA;EADF,OAEIL,EAAAA,OAAAA,kBADF,KAAA,qBAAC,MAAD;GAAM,WAAU;GAAS,QAAO;GAAhC,UAAA,CACEA,IAMAI,EAgBI;MAtBJJ,EAAAA,KAAAA,gBADFK;CAyBJ;CAEA,IAAI,CAAC,QAAQ,eAAe,CAAC,OAAO,YAAY;EAG1CL,IAAAA;EAEiBC,AAAAA,EAAAA,OAAAA,MAAAA,uBAFjB,KAAA,oBAAC,yBAAD;GACE,kBAAiB;GACjB,SAAS,MAAM;GACf,OAAO;EACR,CAAA,GAFgBA,EAAAA,KAAAA,MAAAA;EAKdK,IAAAA;EAAQC,AAAAA,EAAAA,QAAAA,QAAAA,sBAAR,KAAA,QAAQ,QACP,qBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GAAtB,UAAA,CACE,oBAAiB,WACb;EACJ,CAAA,IAAA,MAJKA,EAAAA,MAAAA,QAAAA;EAMRC,IAAAA;EAASD,AAAAA,EAAAA,QAAAA,QAAAA,SAAAA,EAAAA,QAAkBE,QAAAA,eAA3B,KAAA,CAAC,QAAQ,SAAS,CAAC,QAAQ,cAC1B,qBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GAAtB,UAAA,CACG,aAAY,iBACT;EACJ,CAAA,IAAA,MAJMF,EAAAA,MAAAA,QAAAA,OAAkBE,EAAAA,MAAAA,QAAAA;EAM3BC,IAAAA;EAASH,AAAAA,EAAAA,QAAAA,QAAAA,SAAAA,EAAAA,QAASI,UAAlB,KAAA,CAAC,QAAQ,SAAS,QAAQ,eAAe,CAAC,OAAO,aAChD,qBAAA2B,UAAA,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GACpB,UAAA;EACI,CAAA,GACN,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GAChB,UAAA;EACI,CAAA,CACN,EAAA,CAAA,IACA,MATM/B,EAAAA,MAAAA,QAAAA,OAASI,EAAAA,MAAAA;EAWlBC,IAAAA;EAAQL,AAAAA,EAAAA,QAAAA,QAAAA,sBAAR,KAAA,QAAQ,SACP,oBAAC,MAAD;GAAM,OAAA;GAAM,MAAM;GAChB,UAAA;EACI,CAAA,GAHCA,EAAAA,MAAAA,QAAAA;EAMRM,IAAAA;EAASN,AAAAA,EAAAA,QAAAA,QAAAA,SAAAA,EAAAA,QAAkBE,QAAAA,eAA3B,KAAA,CAAC,QAAQ,SAAS,CAAC,QAAQ,eAC1B,qBAAC,MAAD;GAAM,MAAM;GAAG,OAAA;GAAf,UAAA;IACE;;IAA2B;GACvB;MAHEF,EAAAA,MAAAA,QAAAA,OAAkBE,EAAAA,MAAAA,QAAAA;EASxBK,IAAAA;EAIYP,AAAAA,EAAAA,QAAAA,QAAAA,SAAAA,EAAAA,QAJJQ,QAAAA,eAAR,KAAA,QAAQ,cACN,oBAAC,KAAD;GAAK,WAAW;GACd,UAAA,oBAAC,SAAD,CAAU,CAAA;EACP,CAAA,IACH,QAAQ,QACV,YACE,KAAA,GAFQR,EAAAA,MAAAA,QAAAA,OAJJQ,EAAAA,MAAAA,QAAAA;EASR,IAAA,KAAA,QAAQ,QACJ,UACA,QAAQ,eAAe,CAAC,OAAO,aAC7B,WAAW,gBACX,UAAU,YAAY,OAhBhCC;EAmBmBC,AAAAA,EAAAA,QAAAA,QAAAA,QAAAA,EAAAA,QACCF,QAAAA,eAAAA,EAAAA,QAjBhBD,MAAAA,EAAAA,QASAI,MAZJ,KAAA,oBAAC,QAAD;GACE,UAAU;GACV,MACEJ;GAQF,MACEI;GAMF,MAAK;GACL,SAAS,QAAQ;GACjB,UAAU,QAAQ;EACnB,CAAA,GAFkBD,EAAAA,MAAAA,QAAAA,MACCF,EAAAA,MAAAA,QAAAA,aAjBhBD,EAAAA,MAAAA,IASAI,EAAAA,MAAAA;EAhDNC,IAAAA;EACGb,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAMAE,MAAAA,EAAAA,QAMAE,MAAAA,EAAAA,QAWAE,MAAAA,EAAAA,QAMAC,MAAAA,EAAAA,QAMDG,MApCF,KAAA,qBAAC,OAAD;GAAO,SAAS;GAAG,KAAK;GAAxB,UAAA;IACGV;IAMAE;IAMAE;IAWAE;IAMAC;IAMDG;GAsBK;MAzDJV,EAAAA,MAAAA,IAMAE,EAAAA,MAAAA,IAMAE,EAAAA,MAAAA,IAWAE,EAAAA,MAAAA,IAMAC,EAAAA,MAAAA,IAMDG,EAAAA,MAAAA;EA3CJI,IAAAA;EADF,OAEIpB,EAAAA,QAAAA,MAAAA,EAAAA,QAMAmB,MAPF,MAAA,qBAAC,MAAD;GAAM,WAAU;GAAS,QAAO;GAAhC,UAAA,CACEnB,IAMAmB,EA2DI;MAjEJnB,EAAAA,MAAAA,IAMAmB,EAAAA,MAAAA,gCAPFC;CAoEJ;CAEOC,IAAAA;CAAP,OAA4B,EAAA,QAAA,sBAArB,KAAA,oBAAC,iBAAD,EAAiB,GAAI,MAAQ,CAAA,GAAR,EAAA,MAAA,oBAArBA;AACT;AAEA,SAAS,gBAAgB,OAA+B;CACtD,IAAM,EAAC,WAAU,gBAAgB,GAE3B,WAAW,OAA8B,IAAI,GAC7C,UAAU,SAAS,iBACnB,iBAAiB,SAAS,mBAC1B,eAAe,gBAAgB,GAC/B,EACJ,YACA,cACA,OAAO,UACP,YACA,UAAU,kBACV,cACE,cAEE,EAAC,sBAAsB,sBAAsB,sBAAqB,yBAAyB,GAE3F,eAAe,OAAO,SAAS;CAErC,aAAa,UAAU;CAEvB,IAAM,EAAC,oBAAoB,0BAAyB,yBAAyB;EAC3E;EACA,iBAAiB;EACjB,WAAW;CACb,CAAC,GAEK,WAAW,YAAY,UAAU,WAAW,EAAE,GAC9C,gBAAgB,iBAAiB,YAAY,QAAQ,GAErD,UAAU,iBAAiB,YAAY,GAEvC,iBAAiB,wBAAwB;EAAC;EAAY;EAAY,SAAS;CAAI,CAAC,GAEhF,eADc,gBAAgB,QAAQ,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAA,EAC1C,cAAc,MAAM,MAAM,EAAE,SAAS,cAAc,GAC9E,QAAQ,cAEV,gBAAgB,OAAO,QAAQ,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,cAAc,GAC7F,CAAC,gBAAgB,OAAO,cAAc,CACxC,GACM,eAAe,cACb,gBAAgB,QAAQ,SAAS,MAAM,EAAE,gBAAgB,CAAC,CAAC,GACjE,CAAC,gBAAgB,MAAM,CACzB,GAEM,cAAc,aAAa,QAC3B,gBAAgB,cAAc;EAClC,IAAI,CAAC,aAAa,QAChB,OAAO;EAIT,IAAM,WADa,YAAY,EACd,EAAY;EAE7B,OAAO,YAAY,UAAU,KAAK,UAAU,WAAW,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM;CACpF,GAAG,CAAC,WAAW,CAAC,GAEV,WAA6B,eAC1B;EACL,MAAM;EACN,IAAI;EACJ,OAAO;EACP,SAAS;GACP,IAAI;GACJ,MAAM;EACR;CACF,IACA,CAAC,OAAO,CACV,GAEM,wBAAwB,kBAE1B,eACA,WACA,YACA,sBAAsB;EACpB,YAAY;EACZ,MAAM;EACN;EACA,kBAAkB,iBAAiB,YAAY;EAC/C;EACA,oBAAoB,aAAa,UAAU,sBAAsB,aAAa,OAAO,IAAI,CAAC;CAC5F,CAAC,GACH;EAAC;EAAS;EAAa;EAAU;EAAc;EAAsB;CAAqB,CAC5F,GAEM,SAAS,aAAa,WASnB,oBAAC,OAAD;EAAK,GAAI;EAAQ,OAAO;GAAC,QAAQ;GAAQ,MAAM;GAAG,UAAU;EAAM;CAAI,CAAA,GAC5E,CAAC,CAAC,GAEC,oBAAoB,eAAe;EAAC;EAAU;CAAY,IAAI,CAAC,UAAU,YAAY,CAAC;CAU5F,OARI,CAAC,cAAc,CAAC,cAAc,WAAW,aAAa,WAEtD,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAS;EACtB,UAAA,oBAAC,MAAD,EAAA,UAAM,0BAA6B,CAAA;CAC/B,CAAA,IAKR,qBAAC,MAAD;EACE,KAAK;EACL,WAAU;EACV,QAAO;EACP,UAAS;EACT,QAAO;EACP,OAAO,EAAC,YAAY,EAAC;EANvB,UAAA;GAQE,oBAAC,mBAAD;IACE,SAAS,MAAM;IACf,OAAO;IACP,YAAY,cAAc,aAAa;GACxC,CAAA;GAED,oBAAC,MAAD;IAAM,IAAI;IAAQ,MAAM;IAAG,UAAS;IAClC,UAAA,qBAAC,MAAD;KAAM,WAAU;KAAS,OAAO,EAAC,WAAW,OAAM;KAAlD,UAAA,CACE,oBAAC,KAAD;MAAK,MAAM;MACT,UAAA,oBAAC,iBAAD,EAAA,UACE,oBAAC,KAAD;OAAK,SAAS;OACX,UAAA,iBACC,oBAAC,kBAAkB,UAAnB;QAA4B,OAAO;QACjC,UAAA,oBAAC,mCAAD;SAEE,eAAe,SAAS;SACxB,kBAAkB;SAElB,UAAA,oBAAC,qBAAD;UAAqB,yBAAyB,KAAA;UAC5C,UAAA,oBAAC,gCAAD,EAAA,UACE,oBAAC,sBAAD;WACE,SAAS,aAAa;WACtB,OAAO,aAAa;WACpB,QAAO;WACP,MAAM;WAEN,UAAA,oBAAC,cAAD,CAAe,CAAA;UACK,CAAA,EACQ,CAAA;SACb,CAAA;QACY,CAAA;OACT,CAAA;MAE3B,CAAA,EACU,CAAA;KACd,CAAA,GAEL,oBAAC,KAAD;MAAK,MAAK;MAAO,SAAS;MACxB,UAAA,qBAAC,MAAD;OAAM,OAAA;OAAM,MAAM;OAAlB,UAAA;QAAqB;QACsB;QACzC,qBAAC,KAAD;SACE,MAAM;SACN,QAAO;SACP,KAAI;SACJ,OAAO,EAAC,YAAY,SAAQ;SAJ9B,UAAA,CAKC,gBACa,oBAAC,gBAAD,CAAiB,CAAA,CAC5B;;OACC;;KACH,CAAA,CACD;;GACF,CAAA;GACN,oBAAC,qBAAD;IAAqB,MAAK;IAAO,UAAU;IAAG,UAAU;IAAG,OAAO,EAAC,aAAa,WAAU;IACxF,UAAA,qBAAC,MAAD;KAAM,KAAK;KAAG,MAAM;KAAG,SAAQ;KAA/B,UAAA,CACG,YAAY,QAAQ,WAAW,kBAC9B,oBAAC,OAAD;MAAO,MAAM;MACX,UAAA,oBAAC,QAAD;OACE,MAAK;OACL,UAAU,iBAAiB;OAC3B,UAAU;OACV,MAAM,qBAAqB,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,EAAC,EAAI,CAAA,IAAI;OAChE,SAAS;OACT,SAAS;OACT,MAAM;MACP,CAAA;KACI,CAAA,GAGT,oBAAC,8BAAD;MACE,YAAY;MACL;MACO;MACd,YAAY,CAAC;KACd,CAAA,CACG;;GACa,CAAA;EACjB;;AAEV;;;;;;;;;;;;AAaA,SAAS,+BAA+B,OAA0B;gBAC1D,eAAe,cAAc,GAC7B,eAAe,aAAa,UAAU,mBACtC,kBAAkB,aAAa,WAE/B,CAAC,WAAW,gBAAgB,SAA6B,KAAA,CAAS,GAGtEC;CACuE,AAAA,EAAA,OAAA,gBAAA,EAAA,OAGnE,mBAJJ,MAAC,YAAY,iBAAiB;EAC5B,IAAM,EAAC,eAAe,kBAAiB,kBAAkB,YAAY,YAAY;EAEjF,AADA,aAAa,aAAa,GACtB,iBACF,gBAAgB,eAAe,YAAY;CAE/C,GALuE,EAAA,KAAA,cAGnE,EAAA,KAAA;CALN,IAAM,YAAYC,IAcNC;CAAwB,AAAA,EAAA,OAAA,aAAA,EAAA,OAApB,gBAAJ,KAAA;EAAC,GAAG;EAAc,MAAM;CAAS,GAAT,EAAA,KAAA,WAApB,EAAA,KAAA;CAFPC,IAAAA;CACF,AAAA,EAAA,OAAA,gBAAA,EAAA,OAEH,aAAA,EAAA,OADQD,MAFH,KAAA;EACL,GAAG;EACH,QAAQA;EACR;CACF,GAHK,EAAA,KAAA,cAEH,EAAA,KAAA,WADQA,EAAAA,KAAAA;CAHZ,IAAM,QAAQE,IASPC;CAAP,OAAwDC,EAAAA,QAAAA,MAAAA,YAAAA,EAAAA,QAAd,SAAnC,KAAA,oBAACC,kBAAAA,UAAD;EAAmC;EAAQ,UAAA,MAAM;CAAqC,CAAA,GAArCD,EAAAA,MAAAA,MAAAA,UAAd,EAAA,MAAA,iCAAnCD;AACT;AAEA,SAAS,kBAAkB,OAAoE;gBACvF,EAAC,SAAS,OAAO,eAAc,OAC/B,EAAC,gBAAgB,sBAAqB,qBAAqB,oDAAsB,GAM/BG;qDAAC,KAAA,EAAA,WAAW,OAAM;CAChEC,IAAAA;qDAAC,KAAA,oBAAA,KAAD;EAAK,WAAW;EACd,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,QAAO;GACpB,UAAA;EACI,CAAA;CACH,CAAA;CANTC,IAAAA;CAQO,AAAA,EAAA,OAAA,SAAA,EAAA,OAII,cAZX,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAS;EAAG,KAAK;EAAG,OAAM;EACvC,UAAA,qBAAC,MAAD;GAAM,KAAK;GAAG,OAAM;GAAS,MAAK;GAAO,OAAOF;GAAhD,UAAA,CACEC,IAKA,oBAAC,MAAD;IAAM,QAAQ;IAAG,QAAA;IAAO,SAAS;IAAG,WAAW;IAC5C,UAAA,QACC,oBAAC,YAAD,EAAmB,MAAQ,CAAA,IAE3B,oBAAC,MAAD;KAAM,MAAM;KAAG,QAAO;KACnB,UAAA;IACG,CAAA;GAEJ,CAAA,CACF;;CACF,CAAA,GATC,EAAA,KAAA,OAII,EAAA,KAAA;CAMXE,IAAAA;CAC8D,AAAA,EAAA,OAAA,uBAD9D,KAAA,oBAAC,KAAD;EAAK,MAAK;EACR,UAAA,oBAAC,QAAD;GAAQ,UAAU;GAAG,MAAM;GAAW,MAAK;GAAQ,SAAS;EAAU,CAAA;CACnE,CAAA,GADyD,EAAA,KAAA;CApBhEC,IAAAA;CACEF,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OAkBAC,MAnBF,KAAA,qBAAC,MAAD;EAAM,MAAM;EAAG,OAAM;EAArB,UAAA,CACED,IAkBAC,EAGI;KArBJD,EAAAA,KAAAA,IAkBAC,EAAAA,KAAAA;CAKDE,IAAAA;CAAkD,AAAA,EAAA,QAAA,qBAAA,EAAA,QAAlD,kBAAkB,KAAA,kBAAA,oBAAC,qBAAD,EAAqB,WAAW,kBAAoB,CAAA,GAApB,EAAA,MAAA,mBAAlD,EAAA,MAAA;CAzBHC,IAAAA;CADF,OAEIF,EAAAA,QAAAA,MAAAA,EAAAA,QAwBCC,MAzBH,KAAA,qBAAC,qBAAD;EAAqB,MAAK;EAAO,SAAS;EAA1C,UAAA,CACED,IAwBCC,EACkB;KAzBnBD,EAAAA,MAAAA,IAwBCC,EAAAA,MAAAA,8BAzBHC;AA4BJ;AC1dA,MAAa,gBAAgB,iBCQhB,kBAAqC;CAChD,MAAM;CACN,oBAAoB;EAClB,MAAM;EACN,OAAO;EACP,QAAQ;EACR,cAAc;CAChB;CACA,WAAW;CACX,QAAQ,EAAC,UAAS;EAChB,OAAO,EACL,QAAQ,MAAkC;GACxC,GAAG;IACF,iBAAiB,KAAA;IACjB,mBAAmB,KAAA;EAEtB,CAAC,EACH;CACF;AACF;ACzBA,SAAgB,UAAU,SAA2B,GAAW,GAAW,KAAqB;CAC9F,OAAO;EACL,KAAK,IAAI,QAAQ,MAAM,KAAK,GAAG,IAAI,QAAQ,MAAM,OAAO,IAAI;EAC5D,KAAK,EAAE,GAAG;EACV,KAAK,IAAI,QAAQ,MAAM,KAAK,GAAG,IAAI,QAAQ,MAAM,OAAO;CAC1D,CAAC,CAAC,KAAK,EAAE;AACX;ACNA,SAAS,OAAO,GAAW,GAAW;CACpC,OAAO,IAAI,EAAE,GAAG;AAClB;AAEA,SAAS,OAAO,GAAW,GAAW;CACpC,OAAO,IAAI,EAAE,GAAG;AAClB;AAEA,SAAS,KAAK,SAAmB,QAAQ,IAAI;CAC3C,OAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,SAAS,UAAU,IAAY,IAAY,GAAW,GAAW;CAC/D,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG;AAC9B;AAEA,SAAgB,kBAAkB,SAA2B,MAA6B;CACxF,IAAM,EAAC,iBAAgB,QAAQ,MACzB,EAAC,MAAM,OAAM,MACb,EAAC,GAAG,OAAO,GAAG,UAAS,MACvB,EAAC,GAAG,MAAM,GAAG,QAAO,IAEpB,MAAM,OAAO,GAGb,WAAW,GAAG,OAAO,IAAI,QAAQ,QAAQ,SAGzC,YAAY,KAAK,WAAW,KAAK,UAAU,QAAQ,QAAQ,MAAM,UAAU,OAG3E,KAAK,KAAK,IAAI,cAAc,KAAK,IAAI,YAAY,QAAQ,IAAI,CAAC,GAC9D,KAAK,KAAK,IAAI,cAAc,KAAK,IAAI,QAAQ,GAAG,IAAI,CAAC,GAErD,OAAiB,CAAC;CA2FxB,OAxFI,KAAK,UACP,KAAK,KACH,OACE,QAAQ,QAAQ,MAAM,SACtB,QAAQ,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAClD,GACA,OAAO,QAAQ,QAAQ,MAAM,SAAS,QAAQ,EAAE,GAChD,UAAU,QAAQ,QAAQ,MAAM,SAAS,OAAO,QAAQ,QAAQ,MAAM,UAAU,IAAI,KAAK,CAC3F,IACS,KAAK,UACd,KAAK,KACH,OACE,QAAQ,QAAQ,MAAM,SACtB,QAAQ,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAClD,GACA,OAAO,QAAQ,QAAQ,MAAM,SAAS,QAAQ,EAAE,GAChD,UAAU,QAAQ,QAAQ,MAAM,SAAS,OAAO,QAAQ,QAAQ,MAAM,UAAU,IAAI,KAAK,CAC3F,IAEA,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC,GAI5B,GAAG,UACD,QAAQ,GAAG,OAAO,IACpB,KAAK,KACH,OAAO,WAAW,IAAI,KAAK,GAC3B,UAAU,UAAU,OAAO,UAAU,QAAQ,EAAE,GAC/C,OAAO,UAAU,MAAM,EAAE,GACzB,UAAU,UAAU,KAAK,WAAW,IAAI,GAAG,GAC3C,OAAO,WAAW,cAAc,GAAG,GACnC,UAAU,UAAU,KAAK,UAAU,MAAM,YAAY,GACrD,OAAO,UAAU,MAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAAO,CACxE,IAEA,KAAK,KACH,OAAO,WAAW,cAAc,KAAK,GACrC,UAAU,UAAU,OAAO,UAAU,QAAQ,YAAY,GACzD,OAAO,UAAU,MAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAAO,CACxE,IAEO,GAAG,UACR,QAAQ,GAAG,OAAO,IAAI,GAAG,OAAO,IAElC,KAAK,KACH,OAAO,WAAW,QAAQ,MAAM,UAAU,IAAI,KAAK,GACnD,UACE,WAAW,QAAQ,MAAM,SACzB,OACA,WAAW,QAAQ,MAAM,SACzB,QAAQ,EACV,GACA,OAAO,WAAW,QAAQ,MAAM,SAAS,MAAM,EAAE,GACjD,UACE,WAAW,QAAQ,MAAM,SACzB,KACA,WAAW,QAAQ,MAAM,UAAU,IACnC,GACF,GACA,OAAO,WAAW,cAAc,GAAG,GACnC,UAAU,UAAU,KAAK,UAAU,MAAM,YAAY,GACrD,OAAO,UAAU,MAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAAO,CACxE,IAEA,KAAK,KACH,OAAO,WAAW,cAAc,KAAK,GACrC,UAAU,UAAU,OAAO,UAAU,QAAQ,YAAY,GACzD,OAAO,UAAU,MAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM,OAAO,CACxE,IAEO,QAAQ,MACjB,KAAK,KACH,OAAO,WAAW,IAAI,KAAK,GAC3B,UAAU,UAAU,OAAO,UAAU,QAAQ,EAAE,GAC/C,OAAO,UAAU,MAAM,EAAE,GACzB,UAAU,UAAU,KAAK,WAAW,IAAI,GAAG,GAC3C,OAAO,KAAK,GAAG,CACjB,IAEA,KAAK,KACH,OAAO,WAAW,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK,GACzC,UAAU,UAAU,OAAO,UAAU,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC,GAC7D,OAAO,UAAU,MAAM,EAAE,GACzB,UAAU,UAAU,KAAK,WAAW,IAAI,GAAG,GAC3C,OAAO,KAAK,GAAG,CACjB,GAGK,KAAK,IAAI;AAClB;ACxHA,SAAgB,cAAc,OAI3B;gBACK,EAAC,MAAM,SAAS,OAAM,OACtB,EAAC,gBAAe,QAAQ,MACxB,QAAQ,SAAS,GAEIG;CAA6B,AAAA,EAAA,OAAA,QAAA,EAAA,OAAV,WAAA,EAAA,OAAgB,MAAnC,KAAA,mBAAmB,SAAS;EAAC;EAAM;CAAE,CAAC,GAAT,EAAA,KAAA,MAAV,EAAA,KAAA,SAAgB,EAAA,KAAA;CAA9D,IAAM,OAAOC,IAKJC;CAA2B,AAAA,EAAA,OAAA,QAAA,EAAA,OAAT,WAAlB,KAAA,kBAAkB,SAAS,IAAI,GAAJ,EAAA,KAAA,MAAT,EAAA,KAAA;CAER,IAAA,KAAA,cAAc,GAH7BC;CACKD,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OAEUE,MAAAA,EAAAA,OADmBC,MAAlB,OAAO,MAAM,KAAK,MAFlC,KAAA,oBAAC,QAAD;EACE,GAAGH;EACH,QAAQ,MAAM,OAAO,MAAM,KAAK;EAChC,aAAaE;CACd,CAAA,GAHIF,EAAAA,KAAAA,IAEUE,EAAAA,KAAAA,IADmBC,EAAAA,KAAAA,MAAlB,OAAO,MAAM,KAAK;CAK7BH,IAAAA;CAA2B,AAAA,EAAA,QAAA,QAAA,EAAA,QAAT,WAAlB,KAAA,kBAAkB,SAAS,IAAI,GAAJ,EAAA,MAAA,MAAT,EAAA,MAAA;CACbI,IAAAA;CAA6BC,AAAAA,EAAAA,QAAAA,MAAlB,OAAO,MAAM,KAAK,uBAA7B,KAAA,KAAK,MAAM,OAAO,MAAM,KAAK,QAAQ,EAAG,GAAXA,EAAAA,MAAAA,MAAlB,OAAO,MAAM,KAAK;CAFvCC,IAAAA;CAGe,AAAA,EAAA,QAAA,eAAA,EAAA,QAFVN,MAAAA,EAAAA,QACKI,MAFV,KAAA,oBAAC,QAAD;EACE,GAAGJ;EACH,QAAQI;EACK;CACd,CAAA,GADc,EAAA,MAAA,aAFVJ,EAAAA,MAAAA,IACKI,EAAAA,MAAAA;CAITG,IAAAA;CAKeC,AAAAA,EAAAA,QAAAA,KALV,KAKU,UAAA,EAAA,QALLC,KAAL,KAAK,WAAA,EAAA,QAIKC,KAJV,KAIU,KAAA,EAAA,QAAIC,WAAAA,EAAAA,QAKH,eAAA,EAAA,QADmBN,MAAlB,OAAO,MAAM,KAAK,UARnC,KAAA,KAAK,KAAK,WACT,oBAAC,QAAD;EACE,GAAG,UACD,SACA,KAAK,KAAK,IAAI,QAAQ,MAAM,SAC5B,KAAK,KAAK,OAAO,IAAI,QAAQ,MAAM,YAAY,QAAQ,MAAM,SAC7D,EACF;EACA,QAAQ,MAAM,OAAO,MAAM,KAAK;EACnB;CACd,CAAA,GALaG,EAAAA,MAAAA,KALV,KAKU,QALLC,EAAAA,MAAAA,KAAL,KAAK,SAIKC,EAAAA,MAAAA,KAJV,KAIU,GAAIC,EAAAA,MAAAA,SAKH,EAAA,MAAA,aADmBN,EAAAA,MAAAA,MAAlB,OAAO,MAAM,KAAK;CAKnCO,IAAAA;CAKeJ,AAAAA,EAAAA,QAAAA,KALV,KAKU,UAAA,EAAA,QALLK,KAAL,KAAK,WAAA,EAAA,QAIKH,KAJV,KAIU,KAAA,EAAA,QAAIC,WAAAA,EAAAA,QAQH,eAAA,EAAA,QADmBN,MAAlB,OAAO,MAAM,KAAK,UAXnC,KAAA,KAAK,KAAK,WACT,oBAAC,QAAD;EACE,GAAG,UACD,SACA,KAAK,KAAK,IAAI,QAAQ,MAAM,SAC5B,KAAK,KAAK,OAAO,IACf,KAAK,KAAK,OAAO,IACjB,QAAQ,MAAM,YACd,QAAQ,MAAM,SAChB,CACF;EACA,QAAQ,MAAM,OAAO,MAAM,KAAK;EACnB;CACd,CAAA,GARaG,EAAAA,MAAAA,KALV,KAKU,QALLK,EAAAA,MAAAA,KAAL,KAAK,SAIKH,EAAAA,MAAAA,KAJV,KAIU,GAAIC,EAAAA,MAAAA,SAQH,EAAA,MAAA,aADmBN,EAAAA,MAAAA,MAAlB,OAAO,MAAM,KAAK;CArCtCS,IAAAA;CADF,OAEIb,EAAAA,QAAAA,MAAAA,EAAAA,QAMAK,MAAAA,EAAAA,QAMCC,MAAAA,EAAAA,QAaAK,MA1BH,KAAA,qBAAAI,UAAA,EAAA,UAAA;EACEf;EAMAK;EAMCC;EAaAK;CAeD,EAAA,CAAA,GAxCAX,EAAAA,MAAAA,IAMAK,EAAAA,MAAAA,IAMCC,EAAAA,MAAAA,IAaAK,EAAAA,MAAAA,8BA1BHE;AA2CJ;AC1DA,MAEM,UAA4B;CAChC,OAAO;EACL,SAAS;EACT,SAAS;EACT,MAAM;EACN,WAAW;CACb;CACA,SAAS,EACP,SAAS,MACX;CACA,MAAM;EACJ,cAAc;EACd,SAAS;EACT,aAAa;CACf;AACF;AAEA,SAAgB,wBAAwB,OAAkC;gBAClE,EAAC,eAAc,OAUf,GAAG,aAAa,SAAS,EAAK,GAC1BG,IAKPC;CALH,oDAAU,WAAM;EAId,UAAU,EAAI;CAChB,GAAG,KAAA,CAAC,mDALJ,UAAUD,IAKPC,EAAE;CAUQC,IAAAA;;EACL,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,eAAe;EACf,QAAQ;CAEV;CAECC,IAAAA;oCAAW,KAAA,WAAA,IAAIC,OAOf,GAPA,EAAA,KAAA;CAfHC,IAAAA;CAeGF,AAAAA,EAAAA,OAAAA,kBAfH,KAAA,oBAAC,OAAD;EACE,MAAK;EACL,OAAO,OAAO;EACd,QAAQ,OAAO;EACf,OAAOD;EAWNC,UAAAA;CAQE,CAAA,GARFA,EAAAA,KAAAA;CASFG,IAAAA;CACC,AAAA,EAAA,OAAA,0BADD,KAAA,IACC,EAAA,KAAA;CA1BJE,IAAAA;CADF,OAEIH,EAAAA,OAAAA,MAAAA,EAAAA,QAwBCC,MAzBH,KAAA,qBAAAM,UAAA,EAAA,UAAA,CACEP,IAwBCC,EA4DD,EAAA,CAAA,GApFAD,EAAAA,KAAAA,IAwBCC,EAAAA,MAAAA,8BAzBHE;AAuFJ;AAvEwB,SAAAG,QAAC,WAAA;CACf,OAAA,oBAAC,eAAD;EACE,MAAM,UAAU;EAEP;EACT,IAAI,UAAU;CACf,GAHM,UAAU,GAGhB;;ACjEX,SAAgB,mBAAmB,YAAgC;CACjE,IAAI,cAAc,WAAW,SAAS,KACpC,MAAU,MACR,IAAI,YAAY,6FAA6F,WAAW,OAAO,YACjI;CAEF,OAAO;AACT;AAEA,SAAgB,yBACd,YACA,SACA;CACA,OAAO,YACD,OAAO,cAAe,aAInB,mBAAmB,MADK,WAAW,OAAO,CACP,IAHjC;AAKb;ACpBA,MAAa,qBACX,QACA,aAC4B;CAC5B,IAAI,CAAC,UAAU,CAAC,UACd,OAAO,CAAC;CAGV,IAAM,YAAoC,UAAU,CAAC,GAC/C,gBAAyC,CAAC;CAChD,KAAK,IAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,SAAS,GAAG;EACnD,IAAI,QAAQ,IAAI,UAAU,IAAI;EAO9B,AANI,MAAM,QAAQ,KAAK,MAErB,QAAQ,MAAM,QAAQ,SACpB,OAAO,QAAS,YAAW,MAAM,UAAU,eAAe,UAAU,IACtE,IAEF,cAAc,OAAO;CACvB;CAEA,OAAO;AACT,GCzBM,4BAA4B;AAElC,SAAgB,6BAA6B,gBAAkC;CAC7E,IAAI,OAAO,eAAiB,KAC1B,OAAO,CAAC;CAGV,IAAM,QAAQ,aAAa,QAAQ,GAAG,4BAA4B,gBAAgB;CAClF,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI;EAEF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,6BAA6B,gBAAwB,aAAuB;CAC1F,AAAI,OAAO,eAAiB,OAI5B,aAAa,QAAQ,GAAG,4BAA4B,kBAAkB,KAAK,UAAU,WAAW,CAAC;AACnG;ACtBA,SAAS,UAAU,SAAS,IAAI;CAC9B,IAAM,QAAQ,IAAI,WAAW,MAAM;CAEnC,OADA,OAAO,gBAAgB,KAAK,GACrB;AACT;AAEA,MAAM,yBAAyB;CAC7B,IAAI;CACJ,aAAa;EACX,IAAI,OACF,OAAO;EAET,QAAQ,CAAC;EACT,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,GACzB,MAAM,MAAM,IAAI,IAAA,CAAO,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC;EAEjD,OAAO;CACT;AACF,EAAA,CAAG;AAEH,SAAgB,UAAU,QAAiB;CACzC,IAAM,QAAQ,gBAAgB;CAC9B,OAAO,UAAU,MAAM,CAAC,CACrB,QAAQ,KAAK,MAAM,MAAM,MAAM,IAAI,EAAE,CAAC,CACtC,MAAM,GAAG,MAAM;AACpB;ACDA,SAAgB,uBACd,KACA,YACA,WAAW,GACX;CAMA,OALK,qBAAqB,UAAU,IAK7B,aAAa,KAAK,YAAY,CAAC,GAAG,KAAK,IAAI,UAAU,EAAkB,CAAC,KAJ7E,QAAQ,MAAM,+BAA+B,GACtC,CAAC;AAIZ;AAEA,SAAS,aACP,KACA,YACA,MACA,UACkB;CAKlB,OAJI,KAAK,UAAU,WACV,CAAC,IAGH,WAAW,OAAO,QAA0B,KAAK,UAAU;EAChE,IAAM,YAAY,CAAC,GAAG,MAAM,MAAM,IAAI,GAChC,cAAc,MAAM,MACpB,cAAc,KAAK,SAAS,gBAAgB,aAAa,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,KACjF,QAAQ,SAAS,WAAW,IAAI,YAAY,MAAM,QAAQ,KAAA;EAEhE,IAAI,SAAiC,MACnC,OAAO;EAGT,IAAM,oBAAoC;GACxC,MAAM;GACN,MAAM,MAAM;GACZ,YAAY;GACZ;GACA;EACF;EAEA,IAAI,YAAY,aAAa,UAAU;GACrC,IAAM,cAAc,aAAa,KAAK,aAAa,WAAW,QAAQ;GAEtE,OAAO;IAAC,GAAG;IAAK;IAAmB,GAAG;GAAW;EACnD;EAAO,IACL,YAAY,aAAa,WACzB,YAAY,GAAG,UACf,YAAY,GAAG,MAAM,SAAS,YAAY,IAAI,KAE9C,KAAK,SAAS,IAAI,UAClB;GACA,IAAM,EAAC,OAAO,eAAc,gBAAgB,aAAa,SAAS,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAE7E,aAA+B,CAAC;GAEpC,IAAK,YAAoB,QAEvB,KAAK,IAAM,QAAQ,YAAqB;IACtC,IAAM,WAAW,CAAC,GAAG,WAAW,EAAC,MAAM,KAAK,KAAI,CAAC,GAC7C,aAAa,YAAY,GAAG,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK;IAYjE,IAXK,KAAK,UACR,aAAa,YAAY,GAAG,IAC5B,QAAQ,KACN,qFACA;KACE;KACA;KACA;IACF,CACF,IAEE,KAAK,QAAQ,YAAY;KAC3B,IAAM,cAAc,aAClB,KAEA,YACA,UACA,QACF,GACM,cAAc;MAClB,MAAM;MACN,MAAM,KAAK;MACX,YAAY;MACZ,OAAO;MACP,aAAa;KACf;KACA,aAAa;MAAC,GAAG;MAAY;MAAa,GAAG;KAAW;IAC1D;GACF;GAGF,OAAO;IAAC,GAAG;IAAK;IAAmB,GAAG;GAAU;EAClD;EAEA,OAAO,CAAC,GAAG,KAAK,iBAAiB;CACnC,GAAG,CAAC,CAAC;AACP;AAQA,MAAM,qCACJ,UAEA,OAAO,SAAU,cAAY,UAAmB,cAAc,SAAS,UAAU,QAEtE,yBAAqD,SAChE,QACA,eACA,yBACA,wBACA;CACA,IACE,OAAO,WAAW,aAAa,YAC/B,OAAO,WAAW,KAAK,WAAW,wBAAwB,KAC1D,kCAAkC,OAAO,KAAK,GAC9C;EAGA,IAFuC,OAAO,MAAM,aAAa,KAAA,GAI/D,OADiB,OAAO,MAAM,aACV,0BAChB,uBAAuB,KAAK,kBAAkB;GAC5C,IAAM,iBACH,MAAM,QAAQ,OAAO,WAAW,IAC7B,OAAO,cACN,CAAC,EAAA,CAGH,MAAM,SAAS,KAAK,aAAa,aAAa,CAAC,EAAE,QAAQ,UAAU;GAExE,OAAO;IACL,IAAI;IACJ,YAAY,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG,EAAC,MAAM,cAAa,CAAC;GACjE;EACF,CAAC,IACD,KAAA;EAGN,IAAM,UAAU,OAAO,KAAK,MAAM,EAAE;EAGpC,QADiB,QAAQ,MAAM,aAAa,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC,OAAO,UACxD,0BAChB,uBAAuB,KAAK,mBAAmB;GAC7C,IAAI;GACJ,YAAY,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG,EAAC,MAAM,cAAa,CAAC;EACjE,EAAE,IACF,KAAA;CACN;CAEA,IAAI,cAAc,aAAa,YAAY,cAAc,KAAK,WAAW,QAAQ,GAC/E,OAAO,4BAA4B,OAAO,OACtC,uBAAuB,KAAK,mBAAmB;EAC7C,IAAI;EACJ,YAAY,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG,aAAa;CACzD,EAAE,IACF,KAAA;AAIR;AAEA,SAAgB,oBACd,gBACA,iBACA,yBACA,mBACA,QACoB;CACpB,IAAM,kBAAsC,CAAC;CAC7C,KAAK,IAAM,UAAU,iBAAiB;EACpC,IAAM,aAAa,OAAO,KAAK,MAAM,GAAG,EAAE,GACpC,gBACJ,gBAAgB,MAAM,MAAM,aAAa,EAAE,IAAI,MAAM,aAAa,UAAU,CAAC,CAAC,EAAE,cAChF,gBAEI,iCACJ,OAAO,WAAW,aAAa,YAC/B,OAAO,WAAW,KAAK,WAAW,wBAAwB,KAC1D,kCAAkC,OAAO,KAAK,KAC9C,OAAO,MAAM,aAAa,KAAA,GAEtB,eAAe,OACnB,QACA,eACA,yBACA,iBACF,CAAC,EAAE,QAAQ,gBAAgB,YAAY,OAAO,uBAAuB;EAErE,AAAI,gBACF,gBAAgB,KAAK;GACnB,iBAAiB;GACjB,WAAW,OAAO;GAClB,SAAS;GACT,GAAI,iCAAiC,EAAC,sBAAsB,CAAC,UAAU,EAAC,IAAI,CAAC;EAC/E,CAAC;CAEL;CAEA,OAAO;AACT;ACtLA,MAAM,0BAA0B,cAA4C;CAC1E,4BAA4B,CAAC;CAC7B,oBAAoB;AACtB,CAAC;AAED,SAAgB,sBAAsB;CACpC,OAAO,WAAW,uBAAuB;AAC3C;AAEA,SAAS,qBACP,mBACA,cACA,UACA;CACA,OAAO,mBAAmB,MACvB,QACC,IAAI,oBAAoB,cAAc,MACtC,IAAI,aACJ,aAAa,IAAI,SAAS,CAAC,CAAC,WAAW,aAAa,QAAQ,CAAC,CACjE;AACF;AAEA,SAAgB,yBAAyB,OAA8B;gBAC/D,EAAC,QAAQ,iBAAgB,sBAAsB,GAE/C,YAAY,aAAa,aAAa,iBAAiB,GACvD,aAAa,aAAa,WAAW,YACrC,SAAS,aAAa,WAAW,OACjC,EAAC,WAAW,iBAAgB,aAAa,SAAS,GAElD,CAAC,YAAY,iBAAiB,SAAS,EAAK,GAE5C,CAAC,wBAAwB,6BAA6B,SAE1D,GACI,CAAC,WAAW,gBAAgB,SAAiC,GAC7D,CAAC,cAAc,mBAAmB,SAA+B,KAAA,CAAS,GAC1E,CAAC,aAAa,kBAAkB,SAAiC,KAAA,CAAS,GAC1E,CAAC,mBAAmB,wBAAwB,SAAyC,GAEjEE;qDAAM,WAAA;EAG9B,AAFA,cAAc,EAAK,GACnB,aAAa,KAAA,CAAS,GACtB,0BAA0B,KAAA,CAAS;CACrC;CAJA,IAAM,QAAQC,IAMA,KAAA,QAAQ,cAAA,cADWC;CACnBC,AAAAA,EAAAA,OAAAA,kBADmB,KAAA,EAC/B,YAAYA,GACd,GADcA,EAAAA,KAAAA;CADd,IAAM,iBAAiB,UAAUD,EAEhC,GACK,aAAa,wBAAwB,UAAU,KAC/C,KAAK,MAAM,GAGfE;CAqB8EC,AAAAA,EAAAA,OAAAA,QAAAA,gBAAAA,EAAAA,OAOhEC,QAAAA,sBA5Bd,MACE,MACA,aACA,WACG;EACH,IAAM,EAAC,UAAU,mBAAkB,UAAU,CAAC;EAE9C,IADA,gBAAgB,IAAI,GAChB,CAAC,YAAY,CAAC,kBAAkB,CAAC,UAAU,CAACC,aAAW;GACzD,qBAAqB,KAAA,CAAS;GAC9B;EACF;EAEA,IAAM,YAAY,6BAA6B,KAAK,EAAE,GAChD,iBAAiBA,YAAU,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,GAC1D,sBAAsB,eAAe,QACxC,QAAM,CAAC,UAAU,UAAU,UAAU,SAASC,IAAE,EAAE,CACrD;EAEA,eAAe,mBAAmB;EAClC,IAAM,SAAS,MAAM,IACf,WAAW,gBAAgB,IAAIC,OAAW,KAAK,CAAC,GAChD,aAAa,uBAAuB,UAAU,gBAAgB,QAAQ,YAAY;EACxF,IAAI,UAAU,UAAU,QAAQ;GAC9B,IAAM,WAAW,oBACf,gBACA,YACA,QACA,SAAS,QAAQ,SAAS,WAAW,IAAI,GACzC,QAAQ,sBAAsB,sBAChC;GACA,qBAAqB,QAAQ;EAC/B,OACE,qBAAqB,KAAA,CAAS;CAElC,GAb8EJ,EAAAA,KAAAA,QAAAA,cAOhEC,EAAAA,KAAAA,QAAAA;CA7BhB,IAAM,qBAAqBI,IAwCzBC;CAKqB,AAAA,EAAA,OAAA,4BALrB,MACE,aACA,eACA,gBACG;EACH,IAAI,CAACJ,eAAa,CAAC,cACjB;EAEF,IAAM,cAAc,CAAC,CAACK,eAAa,MAAM,QAAMJ,IAAE,OAAO,YAAY,EAAE,GAChE,aAAaD,YAAU,QAC1B,YACC,CAAC,CAACK,eAAa,MACZ,iBAAiB,YAAY,OAAO,aAAa,MAAM,aAAa,OAAO,QAAQ,EACtF,KACC,YAAY,OAAO,QAAQ,MAAM,CAAC,WACvC;EAEA,AADA,eAAe,UAAU,GACzB,6BACE,aAAa,IACb,WAAW,IAAIH,QAAW,CAC5B;CACF,GAhBqB,EAAA,KAAA;CANvB,IAAM,mBAAmBI,IA2BvBC;CAE2CC,AAAAA,EAAAA,OAAAA,UAAAA,EAAAA,OAEnB,kBAAA,EAAA,QAMpB,sBAVJ,KAAA,OAAO,aAAmC;EACxC,cAAc,EAAI;EAClB,IAAM,iBAAiB,kBAAkB,QAAQ,sBAAsBC,SAAO,QAAQ,GAChFT,cAAoC,OAAO,OAAO,QAAQ,aAAc,aAC1E,QAAQ,UAAU,gBAAgB,cAAc,IAChD,QAAQ,QAAQ,QAAQ,SAAS;EAErC,AADA,aAAaA,WAAS,GACtB,0BAA0BS,QAAM;EAChC,IAAMC,iBAAeV,cAAY;EACjC,AAAIU,iBACF,mBAAmBA,gBAAcV,aAAWS,QAAM,IAElD,QAAQ,MAAM,uDAAuD,cAAc;CAEvF,GAZ2CD,EAAAA,KAAAA,QAEnB,EAAA,KAAA,gBAMpB,EAAA,MAAA;CAXN,IAAM,uBAAuBG,IAoBpBC;CACL,AAAA,EAAA,QAAA,qCADK,KAAA;EACL;EACA,oBAAoB;CACtB,GAFE,EAAA,MAAA;CAFJ,IAAM,eAA6CC,IAQjDC;CAGC,AAAA,EAAA,QAAA,cAAA,EAAA,QADAC,qBAAAA,EAAAA,QAEsDC,0BAAAA,EAAAA,QAJtD,gBAAA,EAAA,QACaC,aAAAA,UADd,KAAA,CAAC,gBACD,CAAC,aAAa,UACd,CAAC,mBAAmB,UACpB,CAAC,cACD,CAAC,qBAAqB,mBAAmB,cAAc,uBAAuB,aAAa,GAD1F,EAAA,MAAA,YADAF,EAAAA,MAAAA,mBAEsDC,EAAAA,MAAAA,wBAJtD,EAAA,MAAA,cACaC,EAAAA,MAAAA,aAAAA;CAFhB,IAAM,cACJH,IAMmCI;CAgCnC,AA9ByB,EAAA,QAAA,cAAA,EAAA,QAArB,qBAAA,EAAA,QAiB4CC,wBAAAA,sBAAAA,EAAAA,QAfVC,wBAAAA,kBAAAA,EAAAA,QAHQC,wBAAAA,iBAAAA,EAAAA,QAShC,kBAAA,EAAA,QAJP,gBAAA,EAAA,QAGkC,cAAA,EAAA,QAQIC,eAjBV,WAAM;EACzC,IAAM,gBAAgB,wBAAwB;EAC9C,IAAI,qBAAqB,cAAc,eAAe;GACpD,IAAM,kBAAkB,yBAAyB,YAAY,EAC3D,UAAU,wBAAwB,gBAAgB,SACpD,CAAC;GACI,aAAa;IAChB,YAAY;IACZ;IACA,YAAY,yBAAyB,YAAY;KAC/C,QAAQ;KACR,YAAY;KACZ,YAAY,wBAAwB;KACpC;IACF,CAAC;IACD,kBAAkB,kBAAkB,KAAK,SAAS;KAChD,GAAG;KACH,SAAS,IAAI,QAAQ,QAAQ,QAAQ,CAAC,CAAC,aAAa,MAAM,QAAMrB,IAAE,OAAO,IAAI,EAAE,CAAC;IAClF,EAAE;IACF,oBAAoB,wBAAwB;GAC9C,CAAC;EACH;EACA,MAAM;CACR,GArB2B,EAAA,MAAA,YAArB,EAAA,MAAA,mBAiB4CkB,EAAAA,MAAAA,wBAAAA,oBAfVC,EAAAA,MAAAA,wBAAAA,gBAHQC,EAAAA,MAAAA,wBAAAA,eAShC,EAAA,MAAA,gBAJP,EAAA,MAAA,cAGkC,EAAA,MAAA,YAQIC,EAAAA,MAAAA,uCAa7C,wBAAwB,eACxB,wBAAwB,oBACxB,wBAAwB;CAhC1B,IAAM,mBAAmBC,IAyCdC;sDAAC,KAAA,EAAA,OAAO,OAAM;CAJvBC,IAAAA;CAMW,AAAA,EAAA,QAAA,oBAAA,EAAA,QADC,eALZ,MAAA,oBAAC,QAAD;EACE,MAAM;EACN,MAAK;EACL,MAAM;EACN,OAAOD;EACP,UAAU;EACV,SAAS;CACV,CAAA,GADU,EAAA,MAAA,kBADC,EAAA,MAAA;CANd,IAAM,YACJC,KAYGC;CAwCe,AAAA,EAAA,QAAA,cAAA,EAAA,QAAA,0BAAA,EAAA,QAHA,gBAAA,EAAA,QAnCR,MAAA,EAAA,QAwBH,aAAA,EAAA,QARuB,aAAA,EAAA,QATnB,eAAA,EAAA,QA6BO,sBAAA,EAAA,QAemC,eAAA,EAAA,QAAa,oBArD/D,MAAA,aACC,oBAAC,QAAD;EACM;EACJ,OAAO;EACP,MAAM;EACN,SAAS;EACT,QAAO;EACP,QACE,oBAAC,MAAD;GAAM,SAAQ;GAAgB,SAAS;GAAG,MAAM;GAC7C,UAAA,cACC,oBAAC,SAAD;IACE,SACE,oBAAC,MAAD;KAAM,SAAS;KACb,UAAA,oBAAC,MAAD,EAAA,UAAM,+DAAkE,CAAA;IACpE,CAAA;IAER,WAAU;IAEV,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAI,UAAA;IAAgB,CAAA;GACzB,CAAA,IAET;EAEE,CAAA;EAGP,UAAA,YACC,qBAAC,MAAD;GAAM,SAAS;GAAG,KAAK;GAAG,OAAM;GAAa,SAAQ;GAArD,UAAA,CACE,qBAAC,OAAD;IAAO,KAAK;IAAZ,UAAA,CACE,oBAAC,KAAD;KAAK,cAAc;KACjB,UAAA,oBAAC,MAAD;MAAM,QAAO;MAAW,UAAA;KAAU,CAAA;IAC/B,CAAA,GACJ,WAAW,KAAK,kBACf,oBAAC,mBAAD;KAGI;KACA;KACA;KACA;KACA;IAEH,GARM,cAAc,EAQpB,CACF,CACI;GAEP,CAAA,GAAA,qBAAC,OAAD;IAAO,KAAK;IAAZ,UAAA,CACE,oBAAC,KAAD;KAAK,cAAc;KACjB,UAAA,oBAAC,MAAD;MAAM,QAAO;MAAW,UAAA;KAAQ,CAAA;IAC7B,CAAA,GACJ,UAAU,KAAK,qBACd,oBAAC,oBAAD;KAEO;KAAkB;KAAc;KAAa;KAAkB;IACrE,GAFM,iBAAiB,EAEvB,CACF,CACI;GACH,CAAA,CAAA;EAEN,CAAA,IAAA,qBAAC,MAAD;GAAM,SAAS;GAAG,KAAK;GAAG,OAAM;GAAa,SAAQ;GAArD,UAAA,CACE,oBAAC,KAAD,EAAA,UACE,oBAAC,SAAD,CAAU,CAAA,EACP,CAAA,GACL,oBAAC,MAAD,EAAA,UAAM,uBAA0B,CAAA,CAC5B;;CAEF,CAAA,IACN,MAnEH,EAAA,MAAA,YAwCe,EAAA,MAAA,wBAHA,EAAA,MAAA,cAnCR,EAAA,MAAA,IAwBH,EAAA,MAAA,WARuB,EAAA,MAAA,WATnB,EAAA,MAAA,aA6BO,EAAA,MAAA,oBAemC,EAAA,MAAA,aAAa,EAAA,MAAA;CAtDlEC,IAAAA;CADF,OAC2C,EAAA,QAAA,gBAAA,EAAA,QAqEhCC,MAAAA,YAAAA,EAAAA,QApENF,OADH,MAAA,qBAACG,wBAAAA,UAAD;EAAkC,OAAO;EAAzC,UAAA,CACGH,KAoEA,MAAM,QACyB;KAtEO,EAAA,MAAA,cAqEhCE,EAAAA,MAAAA,MAAAA,UApENF,EAAAA,MAAAA,iCADHC;AAwEJ;AA/JuB,SAAAqB,SAAC,KAAA;CAAM/C,OAAAA,IAAE;;AAtCW,SAAA8C,QAAC,KAAA;CAAM9C,OAAAA,IAAE;;AAuMpD,SAAS,mBAAmB,OAUzB;gBACK,EAAC,kBAAkB,cAAc,aAAa,kBAAkB,cAAa,OAC7E,SAAS,iBAAiB,IAE9B6B;CAAuB,AAAA,EAAA,OAAA,oBAAA,EAAA,OAA+B,aAAA,EAAA,OAAb,eAAA,EAAA,OAAnC,oBAAN,WAAM,iBAAiB,kBAAkB,aAAa,SAAS,GAAxC,EAAA,KAAA,kBAA+B,EAAA,KAAA,WAAb,EAAA,KAAA,aAAnC,EAAA,KAAA;CADR,IAAM,WAAWC,IAUNC;CAAyBC,AAAAA,EAAAA,OAAAA,cAAAA,MAAAA,EAAAA,OAAzB,UAAW,KAAA,WAAA,cAAc,KAAK,EAAC,SAAS,GAAG,IAAI,KAAA,GAAtBA,EAAAA,KAAAA,cAAAA,IAAzB,EAAA,KAAA;CAKIC,IAAAA;CAAyBD,AAAAA,EAAAA,OAAAA,cAAAA,MAAAA,EAAAA,OAAzB,UAAA,EAAA,QAAiCX,eAAjC,KAAA,WAAW,cAAc,MAAM,CAAC,CAAC,aAAa,MAAM,OAAO,GAAG,OAAO,MAAM,GAAlDW,EAAAA,KAAAA,cAAAA,IAAzB,EAAA,KAAA,QAAiCX,EAAAA,MAAAA;CAEhC,IAAA,KAAA,WAAW,cAAc,IALrCa;CAES,AAAA,EAAA,QAAA,UAAA,EAAA,QAEG,YAAA,EAAA,QADDD,MAAAA,EAAAA,QAECE,MALZ,KAAA,oBAAC,UAAD;EACE,MAAK;EACL,OAAO;EACP,SAASF;EACC;EACV,UAAUE;CACX,CAAA,GAJQ,EAAA,MAAA,QAEG,EAAA,MAAA,UADDF,EAAAA,MAAAA,IAECE,EAAAA,MAAAA;CAEC,IAAA,KAAA,WAAW,cAAc,IAAK,KAAA,iBAAiB,SAAS,QAArEC;CAAaD,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAA8BE,MAA3C,KAAA,oBAAC,MAAD;EAAM,OAAOF;EAA8BE,UAAAA;CAAuC,CAAA,GAArEF,EAAAA,MAAAA,IAA8BE,EAAAA,MAAAA;CAd7CC,IAAAA;CADF,OAES,EAAA,QAAA,UAAA,EAAA,QAIEP,MAAAA,EAAAA,QAEPG,MAAAA,EAAAA,QAOAE,MAdF,KAAA,qBAAC,MAAD;EAEE,KAAK;EACL,OAAM;EACN,IAAI;EACJ,OAAOL;EALT,UAAA,CAOEG,IAOAE,EACI;CAdC,GAAA,MAcD,GAdC,EAAA,MAAA,QAIEL,EAAAA,MAAAA,IAEPG,EAAAA,MAAAA,IAOAE,EAAAA,MAAAA,8BAdFE;AAiBJ;AAEA,SAAS,kBAAkB,OAUxB;gBACK,EAAC,WAAW,eAAe,oBAAoB,cAAc,2BAA0B,OACvF,SAAS,cAAc,IAG3BC;CAAmD,AAAA,EAAA,OAAA,0BAAA,EAAA,OAAX,aAAA,EAAA,OAAf,iBAAA,EAAA,OAAnB,sBAAN,WAAM,mBAAmB,eAAe,WAAW,sBAAsB,GAAtB,EAAA,KAAA,wBAAX,EAAA,KAAA,WAAf,EAAA,KAAA,eAAnB,EAAA,KAAA;CADR,IAAM,WAAWC,IASF,KAAA,WAAW,cAAc,IAHpCC;CAES,AAAA,EAAA,OAAA,UAAA,EAAA,OAEG,YAAA,EAAA,OADDN,MAHX,KAAA,oBAAC,OAAD;EACE,MAAK;EACL,OAAO;EACP,SAASA;EACC;CACX,CAAA,GAHQ,EAAA,KAAA,QAEG,EAAA,KAAA,UADDA,EAAAA,KAAAA;CAGJ,IAAA,KAAA,cAAc,SAAS,cAAc,IAA5CO;CAAOC,AAAAA,EAAAA,OAAAA,mBAAP,KAAA,oBAAC,MAAD,EAAA,UAAOA,GAA8C,CAAA,GAA9CA,EAAAA,KAAAA;CAPTC,IAAAA;CADF,OACa,EAAA,QAAA,UAAA,EAAA,QACTH,MAAAA,EAAAA,QAMAC,MAPF,KAAA,qBAAC,MAAD;EAAmB,KAAK;EAAG,OAAM;EAAS,IAAI;EAA9C,UAAA,CACED,IAMAC,EACI;CARK,GAAA,MAQL,GARK,EAAA,MAAA,QACTD,EAAAA,MAAAA,IAMAC,EAAAA,MAAAA,8BAPFE;AAUJ;AC9XA,MAAa,cAAc;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;AACF,GCTM,cAAc;CAAC;CAAY;CAAU;CAAS;AAAM;AAE1D,SAAgB,gBAAgB,QAAgB,SAA2C;CACzF,IAAM,OAAO,OACV,aAAa,CAAC,CACd,QAAQ,MAAM,EAAE,YAAY,SAAS,CAAC,KAAK,EAAE,WAAW,SAAS,EAAE,CAAC,CACpE,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC,CACzB,QAAQ,MAAuB,CAAC,CAAC,CAAC,CAAC,CAGnC,KAAK,MAAM,cAAc,GAAG,QAAQ,OAAO,CAAC,CAAC,CAC7C,QAAQ,MAOP,EANI,QAAQ,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,UAG3B,QAAQ,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,UAG3B,YAAY,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,OAI5C;CAEH,OADA,KAAK,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAA,CAAI,cAAc,GAAG,QAAQ,EAAE,CAAC,GACzD;AACT;AAEA,SAAS,cACP,YACA,QACA,SACsB;CACtB,IAAI,CAAC,WAAW,MAAM,MAEpB,MADA,QAAQ,MAAM,qBAAqB,WAAW,IAAI,GACxC,MAAM,uBAAuB;CAazC,OAAO,YAAY;EATjB,GAAI,SAAS,aACT,CAAC,IACD;GAAC,KAAK,wBAA0B,WAAW;GAAQ,OAAO;EAAwB;EACtF,MAAM,WAAW;EACjB,OAAO,WAAW;EAClB,MAAM,WAAW,KAAK;EACtB,GAAG,cAAc,QAAQ,YAAY,WAAW,KAAK,MAAM,OAAO;CAGjD,CAAU;AAC/B;AAEA,SAAS,cACP,QACA,MACA,UACA,SACA;CACA,IAAM,gBAAiD,YAAY;EAEjE,kBAAmB,KAAK,SAA0B,UAAU;EAE5D,iBAAkB,KAAK,SAA8B,UAAU;CACjE,CAAC;CACD,OAAO,YAAY;EACjB,SAAS,OAAO,KAAK,aAAa,CAAC,CAAC,SAAS,gBAAgB,KAAA;EAC7D,QAAQ,MAAM,QAAQ,MAAM,SAAS,IAAI,IACrC,MAAM,SAAS,KAAK,KAAK,MACvB,OAAO,KAAM,WAAW,IAAK,EAAE,SAAS,EAAE,KAC5C,IACA,KAAA;EACJ,IAAI,QAAQ,QAAQ,aAAa,UAAU,QAAQ,MAAM,QAAQ,OAAO,IAAI,KAAA;EAC5E,IAAI,QAAQ,QAAQ,aAAa,cAAc,eAAe,IAAI,IAAI,KAAA;EACtE,QACE,YAAY,QAAQ,YAAY,SAAS,QAAQ,IAC7C,gBAAgB,QAAQ,MAAM,OAAO,IACrC,KAAA;EACN,aACE,aAAa,WAAW,YAAY,OAChC,qBAAqB,MAAM,QAAQ,OAAO,IAC1C,KAAA;EACN,UACE,aAAa,WAAW,YAAY,OAChC,kBAAkB,MAAM,QAAQ,OAAO,IACvC,KAAA;EACN,QACE,OAAO,KAAK,UAAW,aAAc,aAAuB,KAAK,SAAS,KAAO,KAAA;EACnF,UACE,OAAO,KAAK,YAAa,aACpB,aACD,KAAK,WACH,KACA,KAAA;CACV,CAAC;AACH;AAEA,SAAS,gBACP,QACA,YACA,SACA;CAmBA,QAlBe,WAAW,YACtB,WAAW,UAAU,SAAS,OAC5B,GAAG,SACC,GAAG,QACH,GAAG,OAAO,KAAK,OAAO;EACpB,GAAG;EACH,MAAM;GACJ,GAAG,EAAE;GAIL,QACE,OAAO,GAAG,UAAW,aAAa,GAAG,SAAS,GAAG,SAAS,KAAO,EAAE,KAAK;EAC5E;CACF,EAAE,CACR,IACA,WAAW,OAAA,CAGZ,QAAQ,MAAM,CAAC,CAAC,uBAAuB,kBAAkB,CAAC,CAAC,SAAS,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC,CACxF,QAAQ,MAAM,kBAAkB,EAAE,IAAI,CAAC,CAAC,CACxC,KAAK,UAAU,gBAAgB,QAAQ,MAAM,MAAM,MAAM,MAAM,OAAO,CAAC;AAC5E;AAEA,SAAS,gBACP,QACA,MACA,MACA,SACwB;CAExB,IAAM,WADmB,OAAO,IAAI,MAAM,IAAI,IACZ,KAAK,OAAQ,KAAK,MAAM,QAAQ;CAClE,OAAO,YAAY;EACjB,GAAI,SAAS,aAAa,CAAC,IAAI,EAAC,OAAO,8BAA6B;EAC9D;EACN,MAAM;EACN,OAAO,KAAK;EACZ,GAAG,cAAc,QAAQ,MAAM,UAAU,OAAO;CAClD,CAAC;AACH;AAEA,SAAS,kBACP,iBACA,QACA,SACsC;CAEtC,IAAM,eADgB,gBAAgB,OAAO,MAAM,MAAM,EAAE,SAAS,UAC/C,CAAA,EAAe;CACpC,IAAK,gBAAiB,kBAAkB,YAAY,GAGpD,OAAO,QACL;EACE,GAAG;EACH,IAAI,aAAa,GAAG,QAAQ,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;CACtD,GACA,QACA,OACF;AACF;AAEA,SAAS,qBACP,iBACA,QACA,SACsC;CAEtC,IAAM,YADW,gBAAgB,OAAO,MAAM,MAAM,EAAE,SAAS,UAC7C,CAAA,EAAU;CAC5B,IAAK,aAAc,kBAAkB,SAAS,GAG9C,OAAO,QAAQ,WAAW,QAAQ,OAAO;AAC3C;AAEA,SAAS,QACP,WACA,QACA,SAC0B;CAC1B,OAAO,UAAU,GACd,QAAQ,SAAS,kBAAkB,IAAI,CAAC,CAAC,CACzC,KAAK,MACG,gBAAgB,QAAQ,GAAG,EAAE,MAAM,OAAO,CAClD;AACL;AAEA,SAAS,eAAe,MAA2B;CACjD,OAAO,KAAK,GAAG,KAAK,OAAO,EACzB,MAAM,MAAc,EAAE,IAAI,EAC5B,EAAE;AACJ;AAEA,SAAS,YAA2C,KAAW;CAE7D,OADA,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,QAAS,IAAI,SAAS,KAAA,IAAY,OAAO,IAAI,OAAO,CAAC,CAAE,GAC1E;AACT;;;;;AClNA,SAAgB,oBAAoB,wBAAiC;CACnE,IAAM,SAOF,CAAC;CAEL,SAAS,eAAe,YAA8B;EACpD,IAAM,eAAe,WAAW,MAC1B,SAAS,OAAO;EACtB,IAAI,QAAQ,OAAO;EAEnB,IAAM,YAAYI,aAAgB,YAAY,sBAAsB,GAE9D,OAAO;GACX;GACA,qBAH0B,sBAAsB,SAGhD;EACF;EAEA,OADA,OAAO,gBAAgB,MAChB;CACT;CAEA,OAAO;AACT;ACrBA,SAAgB,2BAA2B,OAGxC;gBACK,CAAC,QAAQ,aAAa,SAAqC,GAC3D,CAAC,OAAO,YAAY,SAA4B,GAEhD,YAAY,aAAa,MAAM,QAAQ,iBAAiB,GACxD,EAAC,mBAAmB,SAAS,kBAAiB,qBAAqB,SAAS,GAC5E,EAAC,cAAc,SAAS,gBAAe,gBAAgB,SAAS,GAEhE,SAAS,UAAU,GACaC;CAAgB,AAAA,EAAA,OAAA,sBAAhB,KAAA,gBAAgB,QAAQ,EAAC,YAAY,GAAI,CAAC,GAA1B,EAAA,KAAA;CAAtD,IAAM,kBAAkBC,IAClB,EAAC,cAAc,2BAA0B,mBAC7C,QACA,MAAM,OAAO,QAAQ,sBACvB,GAEUC,IAQPC;CARH,AACE,EAAA,OAAA,8CADQ,WAAM;EACd,kBAAkB,CAAC,CAChB,MAAM,MAAM,UAAU,CAAC,CAAC,CAAC,CACzB,OAAO,MAAM;GAGZ,AAFA,QAAQ,MAAM,CAAC,GAEf,SAAS,CAAU;EACrB,CAAC;CACL,GAAG,KAAA,CAAC,iBAAiB,GAPnB,EAAA,KAAA,0CADF,UAAUD,IAQPC,EAAmB;CAEGC,IAAAA;CAIA,AAAA,EAAA,OAAA,qBAAA,EAAA,OADf,gBAHe,KAAA,YAAY;EACnC,SAAS,KAAA,CAAS;EAClB,IAAI;GACF,MAAM,aAAa;GACnB,IAAMC,WAAS,MAAM,kBAAkB;GACvC,UAAUA,QAAM;EAClB,SAASC,IAAG;GAAH,IAAA,MAAA;GAGP,AAFA,QAAQ,MAAM,gCAAgCA,GAAC,GAE/C,SAASA,GAAU;EACrB;CACF,GAPyB,EAAA,KAAA,mBADf,EAAA,KAAA;CAHV,IAAM,OAAOC,IAaP,EAAC,QAAQ,aAAY,OAElBC;CACL,AAAA,EAAA,OAAA,UAAA,EAAA,OAKA,SAAA,EAAA,QAEA,gBAAA,EAAA,QACA,0BAAA,EAAA,QALA,QAAA,EAAA,QACA,eAAA,EAAA,QAEA,mBAAA,EAAA,QALA,UAAA,EAAA,QACA,iBAHK,KAAA;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GATE,EAAA,KAAA,QAKA,EAAA,KAAA,OAEA,EAAA,MAAA,cACA,EAAA,MAAA,wBALA,EAAA,MAAA,MACA,EAAA,MAAA,aAEA,EAAA,MAAA,iBALA,EAAA,MAAA,QACA,EAAA,MAAA;CAJJ,IAAM,UAAUC,IAyBdC;CADF,OAEK,EAAA,QAAA,YAAA,EAAA,QADwC,WAA3C,KAAA,oBAACC,0BAAAA,UAAD;EAAoC,OAAO;EACxC;CACiC,CAAA,GADjC,EAAA,MAAA,UADwC,EAAA,MAAA,mCAA3CD;AAIJ;AAEA,SAAS,mBAAmB,QAAgB,wBAAiC;eAEhDE;CAAoB,AAAA,EAAA,OAAA,sCAApB,KAAA,oBAAoB,sBAAsB,GAAtB,EAAA,KAAA;CAA7C,IAAM,mBAAmBA,IAEzBC;CAMS,AAAA,EAAA,OAAA,oBAAA,EAAA,OAJY,UAFrB,KAAA,SAAS,eAAe,cAAsB;EAE5C,IAAM,aAAa,OAAO,IAAI,YAAY;EAC1C,IAAI,CAAC,YACH,MAAU,MAAM,gBAAgB,aAAa,YAAY;EAE3D,OAAO,iBAAiB,UAAU;CACpC,GADS,EAAA,KAAA,kBAJY,EAAA,KAAA;CAFrB,IAAS,iBAATA,IASOC;CAZT,OAa4C,EAAA,OAAA,8BADnC,KAAA;EACL,eAAe,mBAAyB,eAAeC,cAAY,CAAC,CAAC;EACrE,yBAAyB,mBACvB,eAAeA,cAAY,CAAC,CAAC;CACjC,GAH0C,EAAA,KAAA,4BAbrCC;AAkBT;ACxFA,SAAgB,aAAa,OAA4B;gBACGE;qDAAC,KAAA,CAAA;CAA3D,IAAM,CAAC,YAAY,iBAAiB,SAAsBA,EAAE,GAGtB,KAAA,MAAM,QAIjCC;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CACDC,IAAAA;CACuC,AAAA,EAAA,OAAA,0BADvC,KAAA,oBAAC,eAAD;EAAe,MAAK;EAClB,UAAA,oBAAC,yBAAD,EAAqC,WAAa,CAAA;CACrC,CAAA,GADwB,EAAA,KAAA;CAL7CC,IAAAA;CAGOH,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OACDE,MAJN,KAAA,oBAAC,wBAAD,EAAA,UACE,oBAAC,0BAAD,EAAA,UACE,qBAAC,oBAAD;EAAoB,oBAAoB;EAAxC,UAAA,CACGF,IACDE,EAGkB;CACI,CAAA,EAAA,CAAA,EACJ,CAAA,GANjBF,EAAAA,KAAAA,IACDE,EAAAA,KAAAA;CALRE,IAAAA;CADF,OAC4CC,EAAAA,OAAAA,MAAAA,UAAAA,EAAAA,OACxCF,MADF,KAAA,oBAAC,4BAAD;EAA4B,QAAQG;EAClCH,UAAAA;CAU0B,CAAA,GAXcE,EAAAA,KAAAA,MAAAA,QACxCF,EAAAA,KAAAA,8BADFC;AAaJ;ACtBA,MAAa,eAAe,cAAiC,CAAC,CAAC;AAE/D,SAAgB,qBAAqB,OAAmB;gBAChD,EAAC,YAAY,MAAM,OAAO,aAAY,OAEtC,WAAY,OAAe,OAAO,MAClC,CAAC,eAAe,oBAAoB,SAA6B,QAAQ,GAEzE,EAAC,sBAAsB,kBAAkB,sBAAsB,sBACnE,yBAAyB,GACrB,EAAC,QAAQ,WAAU,sBAAsB,GAEzC,EAAC,oBAAmB,mBADR,aAAa,QAAQ,iBACM,CAAS,GACII;CAEvC,AAAA,EAAA,OAAA,wBAAA,EAAA,OACN,qBAAA,EAAA,OAFX,oBAAA,EAAA,OAGM,mBAJkD,KAAA;EACxD;EACA,iBAAiB;EACjB,WAAW;EACX,MAAM;CACR,GAHmB,EAAA,KAAA,sBACN,EAAA,KAAA,mBAFX,EAAA,KAAA,kBAGM,EAAA,KAAA;CAJR,IAAM,gCAAgC,oBAAoBA,EAKzD,GAGK,yBAAyB,CAAC,CADjB,cACkB,CAAA,CAAO,QAASwR,KAEvCvR,IAoBPC;CApBH,AAGI,EAAA,OAAA,YAAA,EAAA,OAGa,iBAAA,EAAA,OAFb,wBAAA,EAAA,OAGC,qBAAA,EAAA,OAOC,iCAAA,EAAA,QAND,0BAAA,EAAA,QAO0B,QAAA,EAAA,QAN1B,YAAA,EAAA,QARgD,cAAA,EAAA,QAYhC,UAbX,WAAM;EACd,IAAM,mBAAmB,0BAA0B,UAAU;EAC7D,AACE,YACA,wBACA,kBAAkB,uBAClB,aAAa,iBACb,CAAC,qBACD,CAAC,0BACD,CAAC,aAGD,iBAAiB,QAAQ,GACrB,aAAa,MAAM,KACrB,8BAA8B;GAC5B,MAAM,aAAa,CAAC,GAAG,MAAM,iBAAiB,IAAI,CAAC;GACnD,YAAY;EACd,CAAC;CAGP,GAAG,KAAA;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GA5BI,EAAA,KAAA,UAGa,EAAA,KAAA,eAFb,EAAA,KAAA,sBAGC,EAAA,KAAA,mBAOC,EAAA,KAAA,+BAND,EAAA,MAAA,wBAO0B,EAAA,MAAA,MAN1B,EAAA,MAAA,UARgD,EAAA,MAAA,YAYhC,EAAA,MAAA,4DAbrB,UAAUD,IAoBPC,EAWF;CAMyBC,IAAAA,IAGAC;CAFD,IAAA,EAAA,QAAA,QAAA,EAAA,QAJ4B,YAAA;EAAnD,IAAMC,qBAAmB,0BAA0B,UAAU,GACvD,wBAAwB,+BAA+B,UAAU;EAE/C,KAAA,oBAAkB,OACpC,aAAa,CAAC,GAAG,MAAMA,mBAAiB,IAAI,CAAC,IAC7C,KAAA,GACkB,KAAA,wBAClB,aAAa,CAAC,GAAG,MAAM,qBAAqB,CAAC,IAC7C,KAAA,GAJiB,EAAA,MAAA,MAJ4B,EAAA,MAAA;;CAE5CC,IAAAA;CAOL,AAAA,EAAA,QAAA,YAAA,EAAA,QANsBH,MAAAA,EAAAA,QAGAC,MAJjB,KAAA;EACL,sBAAsBD;EAGtB,sBAAsBC;EAGtB;CACF,GADE,EAAA,MAAA,UANsBD,EAAAA,MAAAA,IAGAC,EAAAA,MAAAA;CAP1B,IAAM,UAA6BG,IAcYC;iCAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,MAAAA;CAAxCC,IAAAA;CAAP,OAAqC,EAAA,QAAA,WAAA,EAAA,QAAUF,MAAxC,KAAA,oBAACG,aAAAA,UAAD;EAAuB,OAAO;EAAUH,UAAAA;CAAkD,CAAA,GAA5D,EAAA,MAAA,SAAUA,EAAAA,MAAAA,8BAAxCE;AACT;ACjFA,SAAgB,UAAU,OAAyB;gBAC3C,EAAC,OAAO,aAAY,OACpB,KAAK,MAAM,GAGbG;qDAAO,KAAA,OAAA,KAAK,KAAK,CAAC,CACf,OAAO,YAAY;CADtBC,IAAAA;CAE4D,AAAA,EAAA,OAAA,wBAF5D,KAAA,GAEG,KAAK,QAAQ,oBAAC,UAAD;EAAoB,SAAS;EAAe;CAAW,GAAxC,GAAwC,CAAC,GAAZ,EAAA,KAAA;CAJhE,IAAM,QAAQC,IAQuBC;CAAQ,AAAA,EAAA,OAAA,qBAAR,KAAA,QAAQ,KAAK,GAAL,EAAA,KAAA;CAA7C,IAAM,iBAAiBC,IAKjBC;CACsB,AAAA,EAAA,OAAA,8BADtB,KAAA,oBAAC,QAAD;EACE,MAAM,oBAAC,MAAD,EAAM,QAAQ,eAAiB,CAAA;EACrC,OAAM;EACN,SAAS;EACT,MAAK;EACL,QAAQ;CACT,CAAA,GALqB,EAAA,KAAA;CAQLC,IAAAA;qDAAC,KAAA,EAAA,WAAW,IAAG;CAA5BC,IAAAA;CAAgC,AAAA,EAAA,OAAA,qBAAhC,KAAA,oBAAC,MAAD;EAAM,OAAOD;EAAmB,UAAA;CAAY,CAAA,GAAZ,EAAA,KAAA;CAC7BE,IAAAA;sDAAC,KAAA,EAAA,QAAQ,GAAI;CAZxBC,IAAAA;CADF,OAWQ,EAAA,QAAA,MAAA,EAAA,QARFJ,MAAAA,EAAAA,QASIE,MAXR,KAAA,oBAAC,YAAD;EACE,QACEF;EAQE;EACJ,MAAME;EACN,SAASC;CACV,CAAA,GAHK,EAAA,MAAA,IARFH,EAAAA,MAAAA,IASIE,EAAAA,MAAAA,8BAXRE;AAeJ;AAEA,SAAS,SAAA,IAMN;eANe,EAChB,SAAS,KACT,aAFgBC,IAOYC;CAAmB,AAAA,EAAA,OAAA,OAAA,EAAA,OAAb,YAAN,WAAM,SAAS,IAAI,GAAG,CAAC,GAAJ,EAAA,KAAA,KAAb,EAAA,KAAA;CAAlC,IAAM,UAAUC,IAIOC;CAAc,AAAA,EAAA,OAAA,mBAAd,KAAA,oBAAC,MAAD,EAAM,QAAQ,IAAM,CAAA,GAAN,EAAA,KAAA;CAA9BC,IAAAA;CAAP,OAAqD,EAAA,OAAA,OAAA,EAAA,OAAyB,WAAA,EAAA,OAAvDD,MAAhB,KAAA,oBAAC,UAAD;EAAU,MAAMA;EAAuB,OAAO;EAAK,MAAM;EAAc;CAAU,CAAA,GAAnC,EAAA,KAAA,KAAyB,EAAA,KAAA,SAAvDA,EAAAA,KAAAA,4BAAhBC;AACT;AAEA,SAAgB,QAAQ,UAA+B;CACrD,OAAO,YAAY,aAAa,QAAQ,IAAI,WAAW;AACzD;AAEA,SAAS,aAAa,UAA0C;CAC9D,OAAO,YAAY;AACrB;ACpDA,SAAgB,mBAAmB,OAAa,YAAwB;eACjDE;CAArB,OAAuC,EAAA,OAAA,0BAAlB,KAAA,kBAAkB,UAAU,GAAV,EAAA,KAAA,wBAAhCC;AACT;ACgBA,SAASE,OAAK,MAA0D;CACtE,OAAO;AACT;AAOA,MAAa,mBAAwC;CACnD,MAAM;CACN,UAAU,OAAuB;EAC/B,IAAM,EAAC,QAAQ,WAAU,sBAAsB,GACzC,YAAY,aAAa,QAAQ,iBAAiB,GAClD,SAAS,UAAU,EAAC,YAAY,gCAA+B,CAAC,GAChE,EACJ,YAAY,iBACZ,MACA,YACA,oBACA,sBACA,sBACE,OACE,kBAAkB,KAAK,WAAW,GAClC,WAAW,gBAAgB,aAAa,IAExC,gBAAgB,OAAO,WAAW,UAAU,eAE5C,UAAU,iBAAiB,SAC3B,iBAAiB,mBAAmB,SAAS,UAAU,iBAEvD,oBACJ,kBACA,sBACA,OAAO,WAAW,OAAO,eAAe,SAAS,mBAAmB,IAAI,GACpE,6BACJ,kBACA,uBACE,CAAC,iBAAiB,kBAAkB,eAAe,KACnD,eAAe,SAAS,mBAAmB,IAAI,IAE7C,WAAW,CAAC,EAAE,uBAAuB,8BAA8B,qBAEnE,EAAC,OAAO,eAAe,UAAU,kBAAkB,cAAa,gBAAgB,GAChF,SAAS,OAAO,aAAa;EACnC,OAAO,UAAU;EACjB,IAAM,eAAe,OAAO,SAAS;EACrC,aAAa,UAAU;EAEvB,IAAM,iBAAiB,aAAa,SAAS,GACvC,YAAY,oBAAoB;GACpC;GACA,iBAAiB,wBAAwB;GACzC,WAAW;GACX,MAAM,eAAe;EACvB,CAAC,GAEK,aAAa,OAAO,WAAW,YAC/B,eAAe,OAAO,WAAW,UAAU,eAE3C,0BAA0B,cAAc;GAC5C,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,4BACjC;GAEF,IAAM,QAAQ,KAAK,SAAS,cAAc;GAC1C,OAAOA,OAAK;IACV,MAAM;IACN,MAAM,eAAe,gBAEf,oBAAC,KAAD;KAAK,OAAO,EAAC,QAAQ,GAAE;KACrB,UAAA,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,kBAAiB,EAAI,CAAA;IAC9C,CAAA,IAEP;IACJ;IACA,gBAAgB;KACd,IAAI,eAAe,WAAW,CAAC,gBAAgB,CAAC,YAC9C;KAEF,IAAM,kBAAkB,yBAAyB,YAAY,EAC3D,UAAU,oBAAoB,SAChC,CAAC;KACD,UAAU;MACR;MACA,eAAe;MACf,YAAY,yBAAyB,YAAY;OAC/C;OACA,YAAY;OACZ,YAAY;MACd,CAAC;MACD,YAAY;MACZ,oBAAoB,aAAa,UAC7B,sBAAsB,aAAa,OAAO,IAC1C,CAAC;KACP,CAAC;IACH;IACA,gBAAgB;IAChB,UAAU,eAAe,WAAW;GACtC,CAAC;EACH,GAAG;GACD;GACA;GACA;GACA;GACA;GACA,eAAe;GACf;GACA;GACA;GACA;GACA;EACF,CAAC,GACK,iBAAiB,oBAAoB,GACrC,uBAAuB,oBAAoB;GAC/C;GACA,iBAAiB,wBAAwB;GACzC,WAAW;GACX,MAAM,eAAe;EACvB,CAAC,GAEK,WAAW,OAAO,WAAW,OAAO,cACpC,wBAAwB,cAE1B,YAAY,oBACRA,OAAK;GACH,MAAM;GACN,MAAM,eAAe,2BAEf,oBAAC,KAAD;IAAK,OAAO,EAAC,QAAQ,GAAE;IACrB,UAAA,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,kBAAiB,EAAI,CAAA;GAC9C,CAAA,IAEP;GACJ,OAAO;GACP,gBAAgB;IACd,IAAI,eAAe,sBAAsB,CAAC,YACxC;IAEF,AAAI,aAAa,WACf,sBAAsB,aAAa,OAAO;IAE5C,IAAM,kBAAkB,yBAAyB,YAAY,EAC3D,UAAU,oBAAoB,SAChC,CAAC;IACD,qBAAqB;KACnB,UAAU;MACR,GAAG,OAAO;MACV,KAAK;KACP;KACA,gBAAgB;KAChB,eAAe;KACf,oBAAoB,aAAa,UAC7B,sBAAsB,aAAa,SAAS,QAAQ,IACpD,CAAC;IACP,CAAC;GACH;GACA,gBAAgB;GAChB,UAAU,eAAe,sBAAsB;EACjD,CAAC,IACD,KAAA,GACN;GACE;GACA;GACA;GACA;GACA,eAAe;GACf;GACA;GACA;GACA;EACF,CACF;EAEA,OAAO,cAAc;GACnB,IAAK,YAAa,QAAQ,aAI1B,OAAOA,OAAK;IACV,MAAM;IACN,YAAY;IACZ,OAAO;IACP,UAAU,CAAC,yBAAyB,qBAAqB,CAAC,CAAC,QACxD,MAAoC,CAAC,CAAC,CACzC;IACA,UAAU;GACZ,CAAC;EACH,GAAG;GAAC;GAAU;GAAyB;GAAuB;EAAM,CAAC;CACvE;AACF;AC3BA,SAAgB,wBACd,QACuB;CACvB,OAAO;EACL,GAAG;EACH,MAAM;CACR;AACF;AAEA,SAAgB,2BAAuD;CACrE,OAAO,EACL,MAAM,UACR;AACF;AAEA,SAAgB,6BACd,OACwB;CACxB,OAAO;EACL,GAAG;EACH,MAAM;CACR;AACF;AAEA,SAAgB,sBACd,OACA;CACA,IAAM,EACJ,QAAQ,EAAC,mBACP,sBAAsB,GACpB,EAAC,kBAAkB,wBAAuB,yBAAyB,GAEnE,WAAW,qBAAqB,GAChC,EAAC,MAAM,cAAa,SAAS,GAE7B,gBAAgB,cAAc,kBAAkB;EACpD,GAAG;EACH;EAEA,MAAM,MAAM;CACd,CAAC;CAED,OAAO,cAAc;EACnB,IAAM,QAAQ,cAAc,OACtB,gBAAgB,eAClB,OAAO,SAAS,CAAC,CAClB,KAAK,SACG,eAAe;GACpB;GACA;GACA;GACA;EACF,CAAC,CACF,CAAC,CACD,OAAO,SAAS,GACb,aACJ,eAAe,UAAU,eAAe,OAAO,SAAS,KAAK,SAAS,OAAO;EAa/E,QAZe,eAAe,SAC1B,aACE,gBACA,CACE;GACE,MAAM;GACN,OAAO,SAAS;GAChB,UAAU;GACV,UAAU;EACZ,CACF,IACF,CAAC,MACY,CAAC;CACpB,GAAG;EAAC;EAAkB;EAAe;EAAc;EAAW;CAAmB,CAAC;AACpF;AAEA,SAAS,eAAe,MAKgB;CACtC,IAAM,EAAC,SAAQ;CACf,QAAQ,KAAK,MAAb;EACE,KAAK,UACH,OAAO,iBAAiB;GAAC,GAAG;GAAM,QAAQ;EAAI,CAAC;EACjD,KAAK;GACH,IAAM,WAAW,KAAK,UAClB,OAAO,SAAS,CAAC,CAClB,KAAK,UAAU,eAAe;IAAC,GAAG;IAAM,MAAM;GAAK,CAAC,CAAC,CAAC,CACtD,OAAO,SAAS;GAInB,OAHK,UAAU,SAGR;IACL,GAAG;IACH,gBAAgB;IAChB,UAAU;IACV;GACF,IAPE;EASJ,SACE,OAAO;CACX;AACF;AAEA,SAAS,iBAAiB,MAKvB;CACD,IAAM,EAAC,QAAQ,WAAW,kBAAkB,wBAAuB;CACnE,OAAO;EACL,GAAG;EACH,gBAAgB;GACd,eAAe,YAAY;IACzB,IAAM,OAAwB;KAC5B,OAAO;KACP,MAAM,UAAU,EAAE;KAClB,0BAAS,IAAI,KAAK,EAAA,CAAE,YAAY;KAChC,UAAU,CACR;MACE,OAAO;MACP,MAAM,UAAU,EAAE;MAClB,MAAM;MACN,0BAAS,IAAI,KAAK,EAAA,CAAE,YAAY;KAClC,CACF;IACF;IACA,IAAI;KACF,iBAAiB,IAAI;KACrB,IAAM,eAAe,OAAO,WAAW;KACvC,AAAI,wBAAwB,WAC1B,MAAM;IAEV,SAAS,KAAU;KAEjB,AADA,QAAQ,MAAM,4BAA4B,QAAQ,GAAG,GACrD,UAAU;MACR,OAAO;MACP,aAAa,KAAK;MAClB,QAAQ;KACV,CAAC;IACH,UAAU;KACR,oBAAoB,IAAI;IAC1B;GACF;GACA,UAAe;EACjB;EACA,gBAAgB;EAChB,UAAU;CACZ;AACF;AC/TA,SAASC,OAAK,MAA0D;CACtE,OAAO;AACT;AAEA,MAAa,0BAA+C;CAC1D,MAAM;CACN,UAAU,OAAO;EACf,IAAM,UAAU,WAAW,MAAM,IAAI,GAC/B,EAAC,kBAAiB,gBAAgB,GAElC,EAAC,QAAQ,WAAU,sBAAsB,GAEzC,EAAC,iBAAiB,YAAW,mBADjB,aAAa,QAAQ,iBACe,CAAS,GACzD,eAAe,WAAW,YAAY,GACtC,EAAC,sBAAsB,kBAAkB,sBAAsB,sBACnE,yBAAyB,GACrB,gCAAgC,oBAAoB;GACxD;GACA,iBAAiB;GACjB,WAAW;GACX,MAAM;EACR,CAAC,GAEK,WAAW,CAAC,CAAC,gBAAgB,YAAY,cAAc;EAE7D,OAAO,cAAc;GACnB,IAAK,YAAa,cAKlB,OAAOA,OAAK;IACV,MAAM;IACN,MAAM,gBAEA,oBAAC,KAAD;KAAK,OAAO,EAAC,QAAQ,GAAE;KACrB,UAAA,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,kBAAiB,EAAI,CAAA;IAC9C,CAAA,IAEP;IACJ,OAAO;IACP,gBAAgB;KACd,IAAI,UAGJ;UAAI,CAAC,aAAa,MAAM,GAAG;OACzB,cAAc,eAAe;SAC1B,iBAAiB;SAEjB,mBAAmB,KAAA;OACtB,CAAC;OACD;MACF;MACA,8BAA8B;OAAC,MAAM;OAAS,YAAY;MAAoB,CAAC;KAD/E;IAEF;IACA,gBAAgB;IAChB,UAAU;IACV,QAAQ,CAAC,aAAa;GACxB,CAAC;EACH,GAAG;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;CACH;AACF;ACzEA,SAASC,OAAK,MAA0D;CACtE,OAAO;AACT;AAEA,MAAa,sBAA2C;CACtD,MAAM;CACN,UAAU,OAAO;EACf,IAAM,UAAU,WAAW,MAAM,IAAI,GAE/B,EAAC,WAAU,sBAAsB,GAEjC,EAAC,eAAe,YAAW,iBADf,aAAa,QAAQ,iBACW,CAAS,GAErD,eAAe,WAAW,YAAY,GACtC,EAAC,sBAAsB,kBAAkB,sBAAsB,sBACnE,yBAAyB,GACrB,8BAA8B,oBAAoB;GACtD;GACA,iBAAiB;GACjB,WAAW;GACX,MAAM;EACR,CAAC,GAEK,WAAW,CAAC,CAAC,gBAAgB,YAAY,cAAc;EAE7D,OAAO,cAAc;GACnB,IAAK,UAKL,OAAOA,OAAK;IACV,MAAM;IACN,MAAM,gBAEA,oBAAC,KAAD;KAAK,OAAO,EAAC,QAAQ,GAAE;KACrB,UAAA,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,kBAAiB,EAAI,CAAA;IAC9C,CAAA,IAEP;IACJ,OAAO;IACP,gBAAgB;KACd,AAAI,WAGJ,4BAA4B;MAAC,MAAM;MAAS,YAAY;KAAoB,CAAC;IAC/E;IACA,gBAAgB;IAChB,UAAU;GACZ,CAAC;EACH,GAAG;GAAC;GAAU;GAA6B;GAAS;GAAsB;EAAO,CAAC;CACpF;AACF;AC5DA,SAAgB,cAAc;eAItBC,IAIkBC;qDAJlB,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,OAAO,EAAC,YAAY,SAAQ;EACzC,UAAA;CACI,CAAA,GAEY,KAAA,CAAC,QAAQ;CAN/BC,IAAAA;CADF,2DACG,KAAA,oBAAA,SAAD;EACE,SACEF;EAIF,oBAAoBC;EACpB,SAAS;EACT,WAAU;EACV,QAAA;EAEA,UAAA,oBAAC,UAAD,CAAW,CAAA;CACJ,CAAA,2BAZTC;AAcJ;ACaA,SAAS,KAAK,MAA0D;CACtE,OAAO;AACT;AAEA,MAAa,qBAA0C;CACrD,MAAM;CACN,UAAU,OAAO;EACf,IAAM,EAAC,eAAc,OAEf,EACJ,gBACA,eACA,sBACA,mBACA,eACA,gBACA,WACA,kBACA,oBACA,cACA,sBACA,wBACE,yBAAyB,GAEvB,EAAC,OAAO,UAAU,cAAa,gBAAgB,GAC/C,cAAc,OAAO,QAAQ,GAC7B,eAAe,OAAO,SAAS;EACrC,aAAa,UAAU;EAEvB,IAAM,cAAc,eAAe,GAC7B,WAAW,CAAC,gBACZ,UAAU,WAAW,MAAM,IAAI,GAC/B,WAAW,YAAY,UAAU,OAAO,GACxC,mBAAmB,gBAAgB,KAEnC,EAAC,0BAAyB,yBAAyB;GACvD;GACA,iBAAiB,wBAAwB;GACzC,WAAW;EACb,CAAC,GAEK,eAAe,CAAC,CAAC,iBAAiB,oBAAoB,QAAQ,GAC9D,kBACJ,mBAAmB,MAAM,MAAM,UAAU,KACzC,gBACA,sBAAsB,kBAAkB,KACxC,WAAW,aAAa,IAEpB,cAAc,eAEf,gBAAgB,UAAU,CAAC,EAAA,CAAG,MAC5B,MAAM,EAAE,SAAS,YAAa,YAAA,gBAA+B,EAAE,SAAS,OAC3E,GACF;GAAC,gBAAgB;GAAQ;GAAS;EAAQ,CAC5C,GAEM,iBAAiB,aAAa,MAG9B,aAFkB,WAAW,SAAA,mBACZ,YAAY,cAG7B,qBAAqB,wBAAwB,UAAU,KAAK,GAC5D,iBAAiB,oBAAoB,UAAU,KAAK,GACpD,kBAAkB,iBAAiB,UACvC,MAAsB;GACpB,GAAG;GACH,YAAY;GACZ;GACA;GACA;EACF,CAAC,CACH,GACM,qBAAqB,kBAEvB,aACI,eAAe,aAAa,IAC5B,cAAc,eAAe;IAC1B,iBAAiB;IAEjB,mBAAmB,KAAA;EACtB,CAAC,GACP;GAAC;GAAe;GAAgB;GAAY;EAAO,CACrD,GAEM,sBAAsB,aACzB,gBAAmC;GAClC,AAAK,WAAY,kBAAmB,oBAAqB,wBAGzD,sBAAsB;IACpB,YAAY;IACZ;IACA,MAAM;IACN;IACA;IACA,oBAAoB,aAAa,UAC7B,sBAAsB,aAAa,OAAO,IAC1C,CAAC;GACP,CAAC;EACH,GACA;GACE;GACA;GACA;GACA;GACA;GACA;EACF,CACF,GAEM,sBAAsB,cAExB,aAAa,cAAc,QAAQ,MAAM,EAAE,UAAU,EAAE,WAAW,aAAa,EAAE,KAAK,CAAC,GACzF,CAAC,aAAa,cAAc,WAAW,CACzC,GAEM,qBAAqB,cACnB,aAAa,cAAc,QAAQ,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,GAC9D,CAAC,aAAa,YAAY,CAC5B,GAEM,eAAe,cACb,CAAC,GAAG,qBAAqB,GAAG,kBAAkB,GACpD,CAAC,qBAAqB,kBAAkB,CAC1C,GAEM,uBAAuB,cACpB,cAAc,UAAU,sBAAsB,mBAAmB,iBACpE,KAAK;GACH,MAAM;GACN,YAAY;GACZ,OAAO;GACP,UAAU;IACR,GAAI,cAAc,KAAK,gBACrB,gBAAgB;KACd;KACA,WAAW,GAAQ,YAAY,UAAU,YAAY,WAAW,aAAa;KAC7E;KACA,QAAQ;KAER,eAAe,CAAC,CAAC;KACjB;IACF,CAAC,CACH,KAAK,CAAC;IACN;IACA;GACF,CAAC,CAAC,QAAQ,MAAoC,CAAC,CAAC,CAAC;GACjD,UAAU;EACZ,CAAC,IACD,KAAA,GACH;GACD;GACA,aAAa;GACb;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,GAEK,mBAAmB,kBAChB,YAAY,SAClB,CAAC,CAAC,GAEC,sBAA0D,mBAEtD,aAAa,UAAU,sBAAsB,aAAa,OAAO,IAAI,CAAC,EAAA,CAAG,SAC9E,OAAO;GACN,IAAM,OAAO,aAAa,GAAG,IAAI;GAKjC,OAJI,KAAK,MAAM,MAAM,OAAO,KAAM,QAAQ,IAEjC,CAAC,IAEH;IACL,GAAG;IAEG;GACR;EACF,CACF,GACC,CAAC,CAAC,GAEC,mBAAmB,cAAc;GACrC,IAAI,CAAC,MAAM,KAAK,QACd;GACK,IAAI,MAAM,KAAK,WAAW,GAC/B,OAAO;GAET,IAAM,aAAa,MAAM,KAAK,MAAM,GAAG,EAAE,GACnC,WAAW,YAAY,YAAY,SAAS,aAAa,UAAU,CAAC;GAC1E,OAAO,WAAW,oBAAoB,SAAS,EAAE,aAAa,KAAA;EAChE,GAAG;GAAC;GAAqB,MAAM;GAAM;EAAkB,CAAC,GAElD,gBAAgB,sBAAsB;GAC1C,YAAY,MAAM,KAAK,SAAS,UAAU;GAC1C,qBAAqB;GACrB;GACA;GACA,MAAM,MAAM;GACZ;GACA;GACA;EACF,CAAC,GAEK,yBAAyB,cAE3B,KAAK;GACH,MAAM;GACN,MAAM;GACN,OAAO;GACP,UAAU;GACV,UAAU;EACZ,CAAC,GACH,CAAC,oBAAoB,UAAU,CACjC,GAEM,QAAQ,cAEV,KAAK;GACH,MAAM;GACN,MAAM;GACN,OAAO;GACP,UAAU;IACR;IACA;IACA,GAAG;IACH,mBAAmB;GACrB,CAAC,CACE,QAAQ,MAA+D,CAAC,CAAC,CAAC,CAAC,CAC3E,QAAQ,MAAO,EAAE,SAAS,WAAU,EAAE,SAAS,MAAc;GAChE,UAAU;GACV,gBAAgB;GAChB,QAAQ,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,mBAAmB,CAAC;EAC1E,CAAC,GACH;GAEE;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CACF,GAEM,cAAc,cAEhB,KAAK;GACH,MAAM;GACN,QAAQ,CAAC;GACT,MAAM;GACN,UAAU;GACV,gBAAgB;GAChB,OAAO;GACP,UAAU;EACZ,CAAC,GACH;GAAC;GAAiB;GAAoB;EAAU,CAClD;EAaA,OATE,CAAC,cAAc,UACf,CAAC,sBACD,CAAC,mBACD,CAAC,kBACD,CAAC,cAAc,SAER,cAGF;CACT;AACF;AAEA,SAAS,gBAAgB,OAOtB;CACD,IAAM,EAAC,QAAQ,WAAW,qBAAqB,iBAAiB,gBAAe;CAE/E,SAAS,WAAW;gBACXE;EAAP,2DAAQ,KAAA,oBAAA,MAAD,EAAM,QAAQ,QAAQ,YAAY,IAAI,EAAI,CAAA,2BAA1CA;CACT;CACA,OAAO,KAAK;EACV,MAAM;EACN,MAAM;EACN,WAAW,YAAY,cAAc,KAAA;EACrC,OAAO,oBAAoB,WAAW;EACtC,gBAAgB,oBAAoB,WAAW;EAC/C,UAAU,CAAC;EACX;CACF,CAAC;AACH;ACpUA,SAAgB,6BAA6B,YAAgC;CAC3E,OAAO,SAAS,gCAAgC;EAC9C,OAAO,aAAa,oBAAC,wBAAD,CAAyB,CAAA,IAAI;CACnD;AACF;AAEA,SAAS,yBAAyB;eAC1B,EAAC,gBAAgB,mBAAkB,yBAAyB;CAyB9D,gBAAgB;CAxBAE,IAAAA;CACuBC,IAAAA,EAAAA,OAAAA,gBAAAA,SAAAA,EAAAA,OAAkB,gBAAA;;GAA3D,IAAM,cAAc,CAAC,GAAI,gBAAgB,SAAS,CAAC,GAAI,GAAI,kBAAkB,CAAC,CAAE,CAAC,CAC7E,OAAOC,OAAkC,CAAC,EAC1C,QAAQC,QAA2B,CAAC,CAErC,KAAKC,QAAgF;GACxF,IAAI,aAAa;IACf,KAAO,WAAW,aAAa,CAAC,CAAC;IAAjC,MAAA;GACF;GAKOC,IAAAA;GAJwBJ,IAAAA,EAAAA,OAAAA,gBAAAA,OAAAA;IAA/B,IAAM,SAAS,gBAAgB,OAC3B,OAAOC,QAAkC,CAAC,EAE1C,KAAKE,MAAgF;IAClF,KAAA,SACH,WACE;KACE,SAAS,OAAO;KAChB,MAAM;KACN,MAAM,OAAO;KACb,OAAO;IACT,GACA,CAAC,CACH,IACA,KAAA,GAd2BH,EAAAA,KAAAA,gBAAAA;;GAI/B,KAAOI;;EAZkCJ,EAAAA,KAAAA,gBAAAA,OAAkB,EAAA,KAAA;;CAD7D,IAAMK,gBAAcN,IA8BXO;uCAAe,KAAA,iBAAA,oBAAC,iBAAD,EAAiB,UAAUD,cAAc,CAAA,GAAxDA,EAAAA,KAAAA;CAHPE,IAAAA;CADF,OAISD,EAAAA,OAAAA,kBAHP,KAAA,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAQ;EACrB,UAAA,oBAAC,MAAD;GAAM,KAAK;GAAG,OAAO;GAClBA,UAAAA;EACG,CAAA;CACF,CAAA,EACF,CAAA,GAHCA,EAAAA,KAAAA,gBAHPC;AAQJ;AAvBa,SAAA,OAAC,KAAA;CAAMC,OAAAA,IAAE,4BAAW,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAKA,IAAE,OAAO,CAAC,CAAC,QAAQ,IAAI;;AAFzE,SAAAM,SAAC,OAAA;CAAQ,OAAA,CAACL,MAAI,SAAS,CAACA,MAAI;;AAL/B,SAAAI,SAAC,GAAA;CAAM,OAAA,EAAE,4BAAW,IAAI,KAAK,EAAA,CAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,IAAI;;AAFvE,SAAAD,SAAC,OAAA;CAAQH,OAAAA,MAAI,YAAY,CAAC;;AAD3B,SAAAE,QAAC,KAAA;CAAQ,OAAA,CAAC,IAAI,SAAS,CAAC,IAAI;;ACV3C,SAAgB,4BAA4B;eACpC,EAAC,kBAAiB,gBAAgB,GAItCI;CAAM,AAAA,EAAA,OAAA,6BAAN,WAAM,cAAc,eAAe,GAAE,mBAAmB,KAAA,EAAgB,CAAC,GAAnE,EAAA,KAAA;CAFR,IAAM,SAASC,IAObC;CADF,OASe,EAAA,OAAA,sBARb,KAAA,oBAAC,OAAD,EAAA,UACE,oBAAC,QAAD;EACE,IAAG;EACH,UAAU;EACV,MAAM;EACN,MAAK;EACL,SAAS;EACT,KAAK;EACL,SAAS;EACT,MAAK;EACL,WAAU;CACX,CAAA,EACE,CAAA,GAJQ,EAAA,KAAA,oBARbA;AAcJ;ACxBA,MAAa,uBAAuB,cAAqD,KAAA,CAAS,GACrF,+BAA+B,qBAAqB,UC8B3D,eAA8B,CAAC;AAErC,SAAgB,mBAAmB,OAAyB;;CAC1D,IAAI,MAAM,UAAU;EAEhBE,IAAAA;EADF,2DACG,KAAA,oBAAA,MAAD;GAAM,QAAA;GAAO,MAAK;GAAU,SAAS;GACnC,UAAA,oBAAC,MAAD;IAAM,MAAM;IAAG,UAAA;GAAqE,CAAA;EAChF,CAAA,2BAFNA;CAIJ;CACOC,IAAAA;CAAP,OAAuC,EAAA,OAAA,qBAAhC,KAAA,oBAAC,4BAAD,EAA4B,GAAI,MAAQ,CAAA,GAAR,EAAA,KAAA,mBAAhCA;AACT;AACA,SAAS,2BAA2B,OAAyB;gBACrD,EAAC,aAAY,OAEb,QAAQ,MAAM,OACd,KAAK,OAAO,KACZ,SAAS,OAAO,QAEhB,EAAC,QAAQ,cAAa,gBAAgB,GACtC,UAAU,OAAO,iBACjB,EAAC,UAAU,cAAc,uBAAsB,WAAW,iBAAiB,GAC3E,cAAc,OAAO,mBAETC;;EAChB,IAAI,CAAC,UAAU;GACb,KAAO,KAAA;GAAP,MAAA;EACF;EACOC,IAAAA;EAAP,AAAQ,EAAA,OAAA,UAAA,EAAA,OAA+C,YAAhD,MAAC,UAAU,aAAA,CAAc,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,EAAE,MAA1D,EAAA,KAAA,QAA+C,EAAA,KAAA,kCAAvD,KAAOA;;CAJT,IAAM,YAAYD,IAOmBE;;EACnC,IAAI,CAAC,WAAW;GACd,KAAO,KAAA;GAAP,MAAA;EACF;EACaC,IAAAA;EAAkB,AAAA,EAAA,OAAA,yBAAlB,KAAA,CAAC,UAAU,EAAC,MAAM,UAAS,CAAC,GAAV,EAAA,KAAA;EAA/B,IAAM,OAAOA,IACNC;EAAP,AAAyB,EAAA,OAAA,QAAA,EAAA,OAAlB,eAAc,KAAA,cAAA;GAAC,GAAG;GAAM;GAAgB,EAAC,MAAM,YAAW;EAAC,IAAI,MAA7C,EAAA,KAAA,MAAlB,EAAA,KAAA,qCAAP,KAAOA;;CALT,IAAM,aAA+BF,IAQ/B,SAAS,UAAU,GAC4BG;;EACnD,IAAI,CAAC,oBAAoB;GACvB,KAAO,KAAA;GAAP,MAAA;EACF;EAEOC,IAAAA;EAAP,AAAkB,EAAA,OAAA,UAAA,EAAA,OAAA,sBAAX,KAAA,OAAO,IAAI,kBAAkB,GAA7B,EAAA,KAAA,QAAW,EAAA,KAAA,8CAAlB,KAAOA;;CALT,IAAM,iBAA+CD,IAapC,KALG,kBAAkB,SAAS,cAK9B,KAAe,gBAFvBE;CACL,AAAA,EAAA,QAAA,kBAAA,EAAA,QACaC,MAFR,KAAA;EACL;EACA,aAAaA;CACf,GAFE,EAAA,MAAA,gBACaA,EAAAA,MAAAA;CAHjB,IAAM,UAAqCC,IAQrC,QAAQ,OAAQiN,OAEZhN,IAIPC;CAJH,AACgB,EAAA,QAAA,kBAAA,EAAA,QAAmBC,MAAAA,EAAAA,QAC/B,YAAA,EAAA,QADG,SADG,WAAM;EACd,AAAI,CAAC,SAAS,kBAAkB,CAAC,IAAI,WAAW,SAAS,KACvD,SAAS,IAAI,eAAe,SAAS,eAAe,MAAM,CAAC,OAAO,CAAC,CAAC;CAExE,GAAG,KAAA;EAAC;EAAO;EAAgB;EAAU;CAAE,GAHvB,EAAA,MAAA,gBAAmBA,EAAAA,MAAAA,IAC/B,EAAA,MAAA,UADG,EAAA,MAAA,2DADP,UAAUF,IAIPC,EAAqC;CAED,IAAA,KAAA,iBAAiB,GAAlC,eAAf;CAAgCE,AAAAA,EAAAA,QAAAA,oDAAjC,CAAC,YAAY,GAAA,iBAAoBA;CAKvBC,IAAAA;CACL,AAAA,EAAA,QAAA,eAAA,EAAA,QAUc,cAAA,EAAA,QAPV,UAAA,EAAA,QAFP,aAFQ,MAAC,SAAS;EACpB,AAAI,CAAC,eAAe,KAAK,WAAW,KAAK,KAAK,OAAO,iBACnD,UACE,MAAkC;GAChC,GAAG;IAEF,mBAAoB,KAAK,EAAE,EAAmB;EAEjD,CAAC,CACH,IAEA,iBAAiB,WAAW,IAAI,GAAG,CAAC;CAExC,GAZO,EAAA,MAAA,aAUc,EAAA,MAAA,YAPV,EAAA,MAAA,QAFP,EAAA,MAAA;CAJCC,IAAAA;CACF,AAAA,EAAA,QAAA,iBAAA,EAAA,QACSD,MAFP,KAAA;EACL,GAAG;EACH,YAAYA;CAcd,GAfK,EAAA,MAAA,eACSA,EAAAA,MAAAA;CAHhB,IAAM,eAAmCE,IAuB/BC,KAIPC;CAJH,AACM,EAAA,QAAA,cAAA,EAAA,QAAe,eAAA,EAAA,QACjB,cAFM,YAAM;EACd,AAAI,cAAc,CAAC,eACjB,WAAW,UAAU;CAEzB,GAAG,MAAA;EAAC;EAAY;EAAa;CAAU,GAHjC,EAAA,MAAA,YAAe,EAAA,MAAA,aACjB,EAAA,MAAA,oEAFJ,UAAUD,KAIPC,GAAqC;CAErBC,IAAAA;;EACEC,IAAAA;EAAMC,AAAAA,EAAAA,QAAAA,MAAAA,yBAAN,MAAA,MAAM,QAAQ,KAC/BC,OACF,GAFyBD,EAAAA,MAAAA,MAAAA;EAAzB,IAAM,aAAaD;EAGnB,IAAI,YAAY;GACPG,IAAAA;GAAP,AAAiC,EAAA,QAAA,4BAA1B,MAAA,oBAAC,kBAAD,EAAkB,QAAQ,WAAa,CAAA,GAAb,EAAA,MAAA,0BAAjC,MAAOA;GAAP,MAAA;EACF;EACA,MAAO,KAAA;;CAPT,IAAMC,eAAaL,KAabM;CAGc,AAAA,EAAA,QAAA,cAAA,EAAA,QAEI,kBAAA,EAAA,QADR,UAAA,EAAA,QAEE,YAAA,EAAA,QALL,YADP,MAAA,oBAAC,mBAAD;EAEE,SAAS;EACG;EACJ;EACQ;EACN;CACX,GANM,QAMN,GAJa,EAAA,MAAA,YAEI,EAAA,MAAA,gBADR,EAAA,MAAA,QAEE,EAAA,MAAA,UALL,EAAA,MAAA;CAONC,IAAAA;wCAAe,MAAA,eAAA,oBAAC,2BAAD,CAA4B,CAAA,GAA3C,EAAA,MAAA;CAEAC,IAAAA;CAAeH,AAAAA,EAAAA,QAAAA,cAAAA,EAAAA,QAAAA,gBAAAA,EAAAA,QACa,gBAAA,EAAA,QAER,SAHpB,MAAA,cAAc,CAACA,gBACd,oBAAC,uBAAD;EAAuB,GAAI;EACzB,UAAA,oBAAC,OAAD;GAAK,OAAO,EAAC,YAAY,SAAQ;GAC/B,UAAA,oBAAC,WAAD;IAAW,GAAI;IAAO,cAAc;GAAa,CAAA;EAC9C,CAAA;CACgB,CAAA,GALxB,EAAA,MAAA,YAAeA,EAAAA,MAAAA,cACa,EAAA,MAAA,cAER,EAAA,MAAA;CAOpBI,IAAAA;CAAC,AAAA,EAAA,QAAA,cAAA,EAAA,QAAcC,SAAf,MAAA,CAAC,cAAc,MAAM,cAAc,KAAK,GAAvC,EAAA,MAAA,YAAcA,EAAAA,MAAAA;CArBlBC,IAAAA;CAmBGN,AAAAA,EAAAA,QAAAA,gBAAAA,EAAAA,QAlBDC,OAAAA,EAAAA,QAQCC,OAAAA,EAAAA,QAEAC,OAAAA,EAAAA,QAUAC,OArBH,MAAA,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA;GACEH;GAQCC;GAEAC;GAQAH;GAEAI;EACI;KAHJJ,EAAAA,MAAAA,cAlBDC,EAAAA,MAAAA,KAQCC,EAAAA,MAAAA,KAEAC,EAAAA,MAAAA,KAUAC,EAAAA,MAAAA;CAtBLG,IAAAA;CADF,OACuC,EAAA,QAAA,WAAA,EAAA,QACnCD,OADF,MAAA,oBAAC,8BAAD;EAA8B,OAAO;EACnCA,UAAAA;CAuB4B,CAAA,GAxBO,EAAA,MAAA,SACnCA,EAAAA,MAAAA,iCADFC;AA0BJ;AAnCM,SAAAkB,QAAC,GAAA;CAAuB,OAAA,EAAE,SAAS,WAAW,EAAE,cAAc;;AAqCpE,SAAS,kBACP,WACA,gBACwB;eACjBjB;CAKI,IAAA,EAAA,OAAA,kBAAA,EAAA,OAJJ,WAAA;;GAAL,IAAI,CAAC,WAAW;IACd,KAAO,KAAA;IAAP,MAAA;GACF;GACA,IAAI,cAAA,cAA+B;IACjC,KAAO;IAAP,MAAA;GACF;GAEaC,IAAAA;GAAa,AAAA,EAAA,OAAA,yBAAb,KAAA,aAAa,SAAS,GAAT,EAAA,KAAA;GAA1B,IAAM,OAAOA,IACT,gBAA8C;GAClD,KAAA,IAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,IAAM,UAAU,KAAK,IACf,QAAQ,eAAe,OAAO,MAAM,MAAM,EAAE,SAAS,OAAO;IAClE,IAAI,CAAC,OAAO;KACV,KAAO,KAAA;KAAP,MAAA;IACF;IACA,IAAI,MAAM,KAAK,SAAS,GAAG;KACzB,KAAO,MAAM;KAAb,MAAA;IACF;IACA,IAAI,MAAM,KAAK,aAAa,UAAU;KACpC,KAAO,KAAA;KAAP,MAAA;IACF;IACA,gBAAgB,MAAM;GACxB;GACA,KAAO;;EAnBE,EAAA,KAAA,gBAJJ,EAAA,KAAA;;CADP,OAAOD;AA0BT;AAEA,SAAS,kBAAA,IAYN;gBAZwB,EACzB,SACA,YACA,QACA,gBACA,aALyBE,IAanB,EACJ,QAAQC,OACN,sBAAsB,GADhB,EAAC,WAAW,YAAZA,IAGYC;CAA+B,AAAA,EAAA,OAAA,UAAA,EAAA,OAAA,WAA/B,KAAA,QAAQ,MAAM,MAAM,EAAE,SAAS,OAAO,GAAtCC,EAAAA,KAAAA,QAA+B,EAAA,KAAA;CAArD,IAAM,gBAAgBD,IAChB,kBAAkB,CAAC,CAAC,gBAAgB,QAAQ,UAAU,gBAAgB,OAE1CE;;EAChC,IAAI,CAAC,mBAAmB,CAAC,SAAS;GAChC,KAAO,KAAA;GAAP,MAAA;EACF;EACA,IAAM,uBAAuB,eAAe,cAErCC;EAAP,AADoCC,EAAAA,OAAAA,gBAAAA,UAAAA,EAAAA,OAE1BC,wBAAAA,EAAAA,OAFyD,WAC5D,MADa,gBAAgB,QAAQ,MAAM,QAAMC,IAAE,SAAS,OAAO,EAAA,EACtD,cAAc,QAC/B,MAAM,CAAC,sBAAsB,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,CAC/D,GAHoCF,EAAAA,KAAAA,gBAAAA,QAE1BC,EAAAA,KAAAA,sBAFyD,EAAA,KAAA,iCACnE,KAAOF;;CANT,IAAM,4BAA4BD,IAY5B,cAAc,OAAO,EAAK,GACtBK;CAIJ,AAAA,EAAA,OAAA,iBAAA,EAAA,OAAkBC,6BAAAA,EAAAA,OAuCtB,YAAA,EAAA,QA1C4B,WADpB,WAAM;EAId,IAHI,YAAY,WAAW,CAAC,WAGxB,iBAAiB,CAAC,2BAA2B,QAC/C;EAGF,IAAI,QAAQ,WAAW,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;EAoC1D,AAnCK,kBACH,QAAQ,MAAM,OACZ,OACE,CACE,MAAmB;GACjB,MAAM;GACN,OAAO;GACP,MAAM;GACN,cAAc,CAAC;EACjB,CAAC,CACH,GACA,SACA,CAAC,UAAU,EAAE,CACf,CACF,IAGG,eAAe,cAAc,WAChC,QAAQ,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG;GAAC;GAAU,EAAC,MAAM,QAAO;GAAG;EAAc,CAAC,CAAC,CAAC,IAGlF,2BAA2B,WAC7B,QAAQ,MAAM,OACZ,OACE,0BAA0B,IAAIC,QAI5B,GACF,SACA;GAAC;GAAU,EAAC,MAAM,QAAO;GAAG;GAAgB;EAAE,CAChD,CACF,IAEF,SAAS,KAAK,GACd,YAAY,UAAU;CAExB,GA1CM,EAAA,KAAA,eAAkBD,EAAAA,KAAAA,2BAuCtB,EAAA,KAAA,UA1C4B,EAAA,MAAA;CA6C3BE,IAAAA;CAEH,OAFI,EAAA,QAAA,cAAA,EAAA,QAA+B,iBAAA,EAAA,QAAe,6BAAA,EAAA,QAAlC,YAAA,EAAA,QAAU,WAAvB,KAAA;EAAC;EAAY;EAAU;EAAS;EAAe;CAAyB,GAAvE,EAAA,MAAA,YAA+B,EAAA,MAAA,eAAe,EAAA,MAAA,2BAAlC,EAAA,MAAA,UAAU,EAAA,MAAA,mCA9C1B,UAAUH,IA8CPG,EAAyE,GAErE;AACT;AAhBwC,SAAAI,SAAC,QAAA;CAA+B,OAAA;EAC5D,GAAG;EACH,OAAO;EACP,QAAQ,OAAO,QAAQ,IAAIH,QAA6B;CAC1D;;AAD6B,SAAAI,SAAC,GAAA;CAAO,OAAA;EAAC,UAAU,CAAC;EAAG,GAAG;CAAC;;AC5QlE,SAAgB,gBAAgB,OAAuC;eAC/D,EAAC,YAAW,OACZ,iBAAiB,WAAW,oBAAoB,CAAC,EAAE,gBAGnD,gBAAgB,iBAAiB,gBADzB,WAAW,uBAAuB,CAAC,EAAsB,QAAQ,MAAM,IAC1B,GAErBC;qDAAC,KAAA,EAAA,OAAO,OAAM;CAIzC,IAAA,KAAA,eAAe,SAAS,gBAH/BC;CAGOC,AAAAA,EAAAA,OAAAA,kBAHP,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,KAAK;EAAG,OAAM;EAAS,UAAU;EAAG,UAAU;EAC3D,UAAA,oBAAC,KAAD,EAAA,UACE,oBAAC,MAAD;GAAM,MAAM;GAAG,cAAa;GACzBA,UAAAA;EACG,CAAA,EACH,CAAA;CACD,CAAA,GAHCA,EAAAA,KAAAA;CAKN,IAAA,KAAA,SATHC;CADF,OAEIF,EAAAA,OAAAA,MAAAA,EAAAA,OAQCG,MATH,KAAA,qBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAAS,OAAOJ;EAApC,UAAA,CACEC,IAQCG,EACG;KATJH,EAAAA,KAAAA,IAQCG,EAAAA,KAAAA,4BATHD;AAYJ;ACzBA,SAAgB,iBAAiB,OAAmB;CAClD,OAAO,MAAM,cAAc;EAAC,GAAG;EAAO,OAAO;EAAI,OAAO,MAAM,QAAQ;EAAG,SAAS;CAAK,CAAC;AAC1F;ACAA,SAAgB,sBAAsB,OAAyB;gBACvD,EAAC,OAAO,aAAY,OAEpB,OAAO,eAAe,GAEKG;CAE/B,AAAA,EAAA,OAAA,YAAA,EAAA,OADqCC,MAAAA,MAAAA,EAAAA,OAApB,SADc,WAAM;EACrC,IAAM,WAAW,QAAQ,KAAM,MAAM,MAAM;EAC3C,SAAS,WAAW,IAAI,QAAQ,IAAI,MAAM,CAAC;CAC7C,GADE,EAAA,KAAA,UADqCA,EAAAA,KAAAA,MAAAA,IAApB,EAAA,KAAA;CADnB,IAAM,eAAeC,IAKf,KAAK,MAAM,GAKCC;qDAAC,KAAA,EAAA,QAAQ,SAAQ;CAIlB,IAAA,KAAA,GAAG,CAAC,SACF,KAAA,CAAC,OALdC;CAMc,AAAA,EAAA,OAAA,gBAAA,EAAA,OAHN,MAAA,EAAA,OADMC,MAAAA,gBAAAA,EAAAA,OAEHC,MAAAA,EAAAA,OACEC,MALb,KAAA,oBAAC,OAAD;EAAK,OAAOJ;EACV,UAAA,oBAAC,QAAD;GACE,GAAI,MAAM;GACN;GACJ,OAAOG;GACP,SAASC;GACT,UAAU;GACV,UAAU,MAAM,aAAa;EAC9B,CAAA;CACE,CAAA,GAHS,EAAA,KAAA,cAHN,EAAA,KAAA,IADMF,EAAAA,KAAAA,MAAAA,cAEHC,EAAAA,KAAAA,IACEC,EAAAA,KAAAA;CAMbC,IAAAA;CACkB,AAAA,EAAA,QAAA,mBADlB,KAAA,oBAAC,MAAD;EAAM,OAAA;EAAM,MAAM;EAAG,QAAO;EAC1B,UAAA,oBAAC,SAAD;GAAO,SAAS;GAAI,UAAA;EAAyC,CAAA;CACzD,CAAA,GADY,EAAA,MAAA;CAdtBC,IAAAA;CADF,OAGML,EAAAA,QAAAA,MAAAA,EAAAA,QAWAI,MAbJ,KAAA,oBAAC,MAAD,EAAA,UACE,qBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAApB,UAAA,CACEJ,IAWAI,EAGI;CACF,CAAA,EAAA,CAAA,GAfFJ,EAAAA,MAAAA,IAWAI,EAAAA,MAAAA,8BAbJC;AAmBJ;AC3BA,SAAgB,kBAAkB,OAAyB;gBACnD,iBAAiB,WAAW,oBAAoB,CAAC,EAAE,gBACnD,EAAC,aAAY,WAAW,iBAAiB,GACzC,MAAM,OAAuB,IAAI,GACjC,KAAK,MAAM,GACX,EAAC,aAAY,OAETE,IAEPC;CAFH,oDAAU,WAAM;EACd,IAAI,SAAS,cAAc,OAAO,CAAC,EAAE,MAAM;CAC7C,GAAG,KAAA,CAAC,mDAFJ,UAAUD,IAEPC,EAAE;CAEwBC,IAAAA;CAAkB,AAAA,EAAA,OAAA,wBAAlB,MAAC,SAAiB,SAAS,IAAI,IAAI,CAAC,GAAlB,EAAA,KAAA;CAA/C,IAAM,WAAWC,IAGfC;CACmC,AAAA,EAAA,OAAA,wBADnC,MAAC,UAAoB;EACnB,IAAI,CAAC,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,UAC/B,OAAO;EAET,IAAI,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,SAAS,GAAG,GACnD,OAAO;EAGT,IAAM,gBAAgB,MAAM,IAAI,MAAM,GAAG,GACnC,qBAAqB,cAAc,cAAcC,OAAsB,GACvE,gBAAgB,cAAc,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,KAAK,GAAG;EAC7E,OAAO,SAAS,WAAW,aAAa;CAC1C,GAXmC,EAAA,KAAA;CAFrC,IAAM,SAASC;CAgBf,IAAI,CAAC,gBAAgB;EACZC,IAAAA;EAAP,qCAAa,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA,mBAAAD;CACT;CAGuBE,IAAAA;qDAAC,KAAA,EAAA,UAAU,IAAG;CAAnCC,IAAAA;CADF,OAIkB,EAAA,OAAA,kBAAA,EAAA,QAGJ,UAAA,EAAA,QAJJ,MAAA,EAAA,QAEM,YAAA,EAAA,QACOC,MAAAA,SALrB,KAAA,oBAAC,KAAD;EAAK,MAAM;EAAG,OAAOF;EAAsB;EACzC,UAAA,oBAAC,mBAAD;GACM;GACJ,YAAY;GACF;GACV,WAAW,MAAM;GACT;EACT,CAAA;CACE,CAAA,GALW,EAAA,KAAA,gBAGJ,EAAA,MAAA,QAJJ,EAAA,MAAA,IAEM,EAAA,MAAA,UACOE,EAAAA,MAAAA,MAAAA,iCALrBD;AAUJ;AArB6D,SAAAG,QAAC,GAAA;CAAM,OAAA,EAAE,SAAS,GAAG;;AC9BlF,SAAgB,gBACd,SACA,WACsC;CACtC,OAAO,QAAQ,MACZ,MACE,EAAE,SAAS,WAAW,EAAE,SAAS,aACjC,EAAE,SAAS,WAAW,EAAE,cAAc,SAC3C;AACF;AAEA,SAAgB,mBACd,SACA,cAC4B;CAC5B,OAAO,QAAQ,MACZ,MAA2B,EAAE,SAAS,cAAc,EAAE,SAAS,SAAS,YAC3E;AACF;ACdA,SAAgB,iBAAiB,OAAyB;eAE1CC;;EAAC;EAAG;EAAG;EAAG;CAAC;CAAvBC,IAAAA;CADF,OAEmB,EAAA,OAAA,qBADjB,KAAA,qBAAC,OAAD;EAAO,KAAKD;EAAZ,UAAA;GACE,oBAAC,WAAD,EAAW,GAAI,MAAQ,CAAA;GACvB,oBAAC,YAAD,EAAY,GAAI,MAAQ,CAAA;GACxB,oBAAC,cAAD;IAAc,WAAW;IAAU,GAAI;GAAQ,CAAA;GAC/C,oBAAC,cAAD;IAAc,WAAW;IAAU,GAAI;GAAQ,CAAA;EAC1C;KAJU,EAAA,KAAA,mBADjBC;AAOJ;AAEA,SAAS,aAAA,IAA4E;eAA9D,WAAc;CAAfC,AAAAA,EAAAA,OAAAA,yCAAC,CAAA,WAAW,GAAA,SAAZA;CACLC,IAAAA;CAA+B,AAAA,EAAA,OAAA,aAAA,EAAA,OAATC,MAAAA,WAAtB,KAAA,gBAAgB,MAAM,SAAS,SAAS,GAAT,EAAA,KAAA,WAATA,EAAAA,KAAAA,MAAAA;CAArC,IAAM,SAASD,IACRE;CAAP,OAAuC,EAAA,OAAA,UAAA,EAAA,OAAA,SAAhC,KAAA,SAAS,oBAAC,mBAAD;EAAmB,GAAI;EAAe;CAAS,CAAA,IAAI,MAA5D,EAAA,KAAA,QAAgC,EAAA,KAAA,+BAAhCA;AACT;AAEA,MAAM,OAAqC,CAAC;AAE5C,SAAS,UAAU,OAAyB;gBACpC,iBAAiB,mBAAmB,MAAM,SAAS,YAAY,GAC/D,UAAU,MAAM,GAEhB,UAAU,gBAAgB,SAAS,WAAW,MAC9C,aAAa,gBAAgB,SAAS,MAAM,GAC5C,cAAc,gBAAgB,SAAS,OAAO,GAG1BC;;EACxB,IAAI,CAAC,aAAa;GAChB,KAAO,KAAA;GAAP,MAAA;EACF;EACA,IAAI,YAAY,SAAS,SAAS;GAChC,KAAO;GAAP,MAAA;EACF;EAIO,IAAA,KAAA,aAAa,OAEX,KAAA,aAAa,MAAM,YADZC;EACPC,AAAAA,EAAAA,OAAAA,kBADO,KAAA;GACV,GAAGA;GACH,aAAa;EACf,GAFKA,EAAAA,KAAAA;EAHAC,IAAAA;EACFC,AAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OACSH,MAFP,KAAA;GACL,GAAGG;GACH,YAAYH;EAId,GALKG,EAAAA,KAAAA,IACSH,EAAAA,KAAAA;EAJTI,IAAAA;EAAP,AAESF,EAAAA,OAAAA,MAAAA,EAAAA,OADJ,eADE,KAAA;GACL,GAAG;GACH,OAAOA;EAOT,GAPSA,EAAAA,KAAAA,IADJ,EAAA,KAAA,qCADL,KAAOE;;CAPT,IAAM,oBAAoBL,IAsBpBM;CACuD,AAAA,EAAA,OAAA,uBADvD,KAAA,oBAAC,MAAD;EAAM,KAAK;EACT,UAAA,oBAAC,MAAD;GAAM,IAAG;GAAQ,QAAO;GAAW,MAAM;GAAG,SAAS;GACnD,UAAA;EACI,CAAA;CACF,CAAA,GAHiD,EAAA,KAAA;CAKvDC,IAAAA;sDAAC,KAAA,oBAAA,MAAD;EAAM,OAAA;EAAM,MAAM;EAChB,UAAA;CACI,CAAA;CAGHC,IAAAA;CAE0B,AAAA,EAAA,QAAA,cAAA,EAAA,QAAA,SAF1B,KAAA,cACC,oBAAC,KAAD;EAAK,MAAK;EACR,UAAA,oBAAC,mBAAD;GAAmB,GAAI;GAAO,QAAQ;EAAa,CAAA;CAChD,CAAA,GAHN,EAAA,MAAA,YAE0B,EAAA,MAAA;CAG1BC,IAAAA;CAE0B,AAAA,EAAA,QAAA,qBAAA,EAAA,QAAA,SAF1B,KAAA,qBACC,oBAAC,KAAD;EAAK,MAAM;EAAG,OAAO,EAAC,YAAY,GAAE;EAClC,UAAA,oBAAC,mBAAD;GAAmB,GAAI;GAAO,QAAQ;EAAoB,CAAA;CACvD,CAAA,GAHN,EAAA,MAAA,mBAE0B,EAAA,MAAA;CAR7BC,IAAAA;CACGF,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAKAC,MANH,KAAA,qBAAC,MAAD;EAAM,OAAM;EAAZ,UAAA,CACGD,IAKAC,EAKG;KAVHD,EAAAA,MAAAA,IAKAC,EAAAA,MAAAA;CAlBPE,IAAAA;CADF,OAGML,EAAAA,QAAAA,MAAAA,EAAAA,QAUAI,MAZJ,KAAA,oBAAC,OAAD;EAAO,KAAK;EACV,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA;IACEJ;IAMAC;IAIAG;GAYK;;CACF,CAAA,GAvBHJ,EAAAA,MAAAA,IAUAI,EAAAA,MAAAA,8BAZJC;AA2BJ;AAEA,SAAS,WAAW,OAAyB;eAGlBC;CAFuBd,AAAAA,EAAAA,OAAAA,MAAAA,uBAEvB,KAAA,gBAFF,mBAAmB,MAAM,SAAS,YACzC,CAAA,EAAgB,SAAS,WAAW,MACF,QAAQ,GAFVA,EAAAA,KAAAA,MAAAA;CAEhD,IAAM,mBAAmBc,IAEfC;CAA2C,AAAA,EAAA,OAAA,SAAA,EAAA,OAA3C,oBAAoB,KAAA,oBAAA,oBAAC,mBAAD;EAAmB,GAAI;EAAO,QAAQ;CAAmB,CAAA,GAAlC,EAAA,KAAA,OAA3C,EAAA,KAAA;CAAHC,IAAAA;CAAP,OAAUD,EAAAA,OAAAA,kBAAH,KAAA,oBAAAG,UAAA,EAAA,UAAGH,GAAiF,CAAA,GAAjFA,EAAAA,KAAAA,gBAAHC;AACT;AC7EA,SAAgB,uBAAuB,OAAwB;eACvD,EAAC,gBAAe,WAAW,oBAAoB,KAAK,CAAC;CAE3D,IACE,CAAC,eACD,EAAE,mBAAmB,WAAW,KAAK,2BAA2B,WAAW,IAE3E,OAAO;CAIPG,IAAAA;CADF,OAC8C,EAAA,OAAA,eAAA,EAAA,OAApB,SAAxB,KAAA,oBAAC,oBAAD;EAAoB,GAAI;EAAoB;EACzC,UAAA,MAAM;CACW,CAAA,GAFwB,EAAA,KAAA,aAApB,EAAA,KAAA,+BAAxBA;AAIJ;AAEA,SAAS,mBAAA,IAGiF;eAH9D,EAC1B,aACA,GAAG,UAFuBC,IAIpB,CAAC,MAAM,WAAW,SAAS,CAAC,CAAC,MAAM,OAAO,MAAM,GACzBC;qDAAM,WAAA,QAAQ,EAAI;CAA/C,IAAM,WAAWC,IACcC;qDAAM,WAAA,QAAQ,EAAK;CAAlD,IAAM,aAAaC;CAEnB,OAAO,MAAM,cAAc;EACzB,GAAG;EACH,aAAa;EACb;EACA;EACA,WAAW,CAAC;EACZ,OAAO;EACP,OAAO,mBAAmB,WAAW,IAAI,mBAAmB;CAC9D,CAAC;AACH;ACxBA,SAAgB,uBAAuB,OAAiC;eAChE,EAAC,gBAAe,WAAW,oBAAoB,KAAK,CAAC;CAE3D,IAAI,CAAC,aACH,OAAO;CAGT,IAAI,mBAAmB,WAAW,GAAG;EAC5BE,IAAAA;EAAP,OAAkD,EAAA,OAAA,eAAA,EAAA,OAApB,SAAvB,KAAA,oBAAC,mBAAD;GAAmB,GAAI;GAAoB;EAAc,CAAA,GAAd,EAAA,KAAA,aAApB,EAAA,KAAA,+BAAvBA;CACT;CAEA,IAAI,2BAA2B,WAAW,GAAG;EACpCC,IAAAA;EAAP,OAAiD,EAAA,OAAA,eAAA,EAAA,OAApB,SAAtB,KAAA,oBAAC,kBAAD;GAAkB,GAAI;GAAoB;EAAc,CAAA,GAAd,EAAA,KAAA,aAApB,EAAA,KAAA,+BAAtBA;CACT;CACA,OAAO;AACT;AAEA,SAAS,uBACP,OACA,eACA,UACA;eACUC,IAcPC;CAdH,AAEI,EAAA,OAAA,iBAAA,EAAA,OAUA,YAAA,EAAA,OAXkBC,SADZ,WAAM;EACd,IAAM,cAAc,OAAO,QAAQ,MACjC,cAAc,MACX,MAAM,EAAE,UAAU,EAAE,UAAA,+BAAgC,EAAE,eAAe,EAAE,KAC1E,CACF,GACM,cAAc,OAAO,UAAU,GAC/B,cAAc,aAAa,UAAU;EAC3C,CAAK,CAAC,eAAe,eAAgB,eAAe,cAAc,WAIhE,SAAS,WAAW,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAEvC,GAAG,KAAA;EAAC;EAAe;EAAO;CAAQ,GAZ9B,EAAA,KAAA,eAUA,EAAA,KAAA,UAXkBA,EAAAA,KAAAA,uDADtB,UAAUF,IAcPC,EAAgC;AACrC;AAEA,SAAS,kBAAA,IAGsD;gBAF7D,aACG;CAFsBE,AAAAA,EAAAA,OAAAA,2CACzB,CAAA,aACA,GAAA,SAFyBA;CAIzB,IAAM,EAAC,OAAO,aAAY,OAGlBC;CAAYC,AAAAA,EAAAA,OAAAA,YAAAA,sBAAZ,KAAA,YAAY,OAAO,OAAOC,OAAwC,GAAtDD,EAAAA,KAAAA,YAAAA;CADpB,IAAM,SAASE;CAMf,uBAAuB,OAA2B,QAAQ,QAAQ;CAGhEC,IAAAA;CAMoB,AAAA,EAAA,OAAA,UAAA,EAAA,OAHd,YAAA,EAAA,OADSC,OAAAA,UAFf,MAAC,SAAkB,kBAA0B;EAC3C,IAAI,SAAS;GACX,IAAI,OAAO,QACT,SAAS,WAAW,KAAK,MAAM,CAAC,EAAC,MAAM,cAAa,CAAC,CAAC,CAAC,CAAC;QACnD;IAEL,IAAM,QAAQ,OACX,QAAQ,MAAM,EAAE,SAAS,aAAa,CAAC,CACvC,IAAIC,QAML;IACF,SAAS,WAAW,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GAC5E;EACF,OAAO;GACL,IAAM,aAA8B;IAClC,MAAM;IACN,OAAO;IACP,cAAc;GAChB;GACA,SAAS,WAAW,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACnF;CACF,GAnBoB,EAAA,KAAA,QAHd,EAAA,KAAA,UADSD,EAAAA,KAAAA,OAAAA;CAHjB,IAAM,iBAAiBE,IAgClBC;CAOiB,IAAA,EAAA,OAAA,UAAA,EAAA,QAAA,kBAAA,EAAA,QADE,OAAA;EANRC,IAAAA;EAOM,EAAA,QAAA,kBAAA,EAAA,QADE,SANR,MAAC,YAET,oBAAC,MAAD;GAAuB,OAAM;GAAS,KAAK;GACzC,UAAA,oBAAC,YAAD;IACE,OAAOC,QAAM;IACb,OAAOA,QAAM,KAAK,SAASA,QAAM;IACjC,YAAY;IACZ,UAAU;GACX,CAAA;EACG,GAPKA,QAAM,IAOX,GAFQ,EAAA,MAAA,gBADE,EAAA,MAAA,iCANnB,KAAA,OAAO,IAAID,EAWX,GAXA,EAAA,KAAA,QAOiB,EAAA,MAAA,gBADE,EAAA,MAAA;;CAPtBE,IAAAA;CADF,OAEKH,EAAAA,QAAAA,mBADH,KAAA,oBAAC,OAAD;EAAO,KAAK;EACTA,UAAAA;CAYI,CAAA,GAZJA,EAAAA,MAAAA,iBADHG;AAeJ;AArCiB,SAAAyB,SAAC,SAAA;CACJ,OAAA,MAAuB;EACrB,MAAM1B,QAAM;EACZ,OAAO;EACP,cAAcA,QAAM;CACtB,CAAC;;AArBqB,SAAAyB,QAAC,OAAA;CAAU,OAAA,kBAAkB,MAAM,IAAI;;AAuD3E,SAAS,iBAAA,IAGqD;gBAF5D,aACG;CAFqBvB,AAAAA,EAAAA,OAAAA,2CACxB,CAAA,aACA,GAAA,SAFwBA;CAIxB,IAAM,EAAC,OAAO,aAAY,OAGlBC;CAAYC,AAAAA,EAAAA,OAAAA,YAAAA,kBAAZ,KAAA,YAAY,GAAG,OAAOC,MAAyC,GAAnDD,EAAAA,KAAAA,YAAAA;CADpB,IAAM,UAAUE;CAMhB,uBAAuB,OAA2B,SAAS,QAAQ;CAGjEC,IAAAA;CAMoB,AAAA,EAAA,OAAA,WAAA,EAAA,OAHd,YAAA,EAAA,OADSZ,OAAAA,UAFf,MAAC,SAAkB,kBAA0B;EAC3C,IAAI,SAAS;GACX,IAAI,OAAO,QACT,SAAS,WAAW,KAAK,MAAM,CAAC,EAAC,MAAM,cAAa,CAAC,CAAC,CAAC,CAAC;QACnD;IAEL,IAAM,QAAQ,QACX,QAAQ,MAAM,EAAE,SAAS,aAAa,CAAC,CACvC,IAAIa,MAML;IACF,SAAS,WAAW,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;GAC5E;EACF,OAAO;GACL,IAAM,aAA6B;IACjC,MAAM;IACN,OAAO;IACP,MAAM;GACR;GACA,SAAS,WAAW,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACnF;CACF,GAnBoB,EAAA,KAAA,SAHd,EAAA,KAAA,UADSb,EAAAA,KAAAA,OAAAA;CAHjB,IAAM,iBAAiBc,IA+BlBC;CAOiB,IAAA,EAAA,OAAA,WAAA,EAAA,QAAA,kBAAA,EAAA,QADE,OAAA;EANPC,IAAAA;EAOK,EAAA,QAAA,kBAAA,EAAA,QADE,SANP,MAAC,eAEV,oBAAC,MAAD,EAAA,UACE,oBAAC,YAAD;GACE,OAAOC,WAAS;GAChB,OAAO,OAAOA,YAAU,OAAO,IAAI,SAAUA,WAAS,SAASA,WAAS;GACxE,YAAY;GACZ,UAAU;EACX,CAAA,EACG,GAPKA,WAAS,IAOd,GAFQ,EAAA,MAAA,gBADE,EAAA,MAAA,iCANnB,KAAA,QAAQ,IAAID,EAWZ,GAXA,EAAA,KAAA,SAOiB,EAAA,MAAA,gBADE,EAAA,MAAA;;CAPtBE,IAAAA;CADF,OAEKH,EAAAA,QAAAA,mBADH,KAAA,oBAAC,OAAD;EAAO,KAAK;EACTA,UAAAA;CAYI,CAAA,GAZJA,EAAAA,MAAAA,iBADHG;AAeJ;AApCiB,SAAA,OAAC,OAAA;CACJ,OAAA,MAAsB;EACpB,MAAM,MAAM;EACZ,OAAO;EACP,MAAM,MAAM;CACd,CAAC;;AArBiB,SAAA,OAAC,UAAA;CAAa,OAAA,kBAAkB,QAAQ;;AAsDxE,SAAS,WAAA,IAUN;gBAViB,EAClB,OACA,YACA,OACA,aAJkBC,IAWFC;CAACC,AAAAA,EAAAA,OAAAA,cAAAA,EAAAA,OAA2D,SAA5D,KAAA,CAAC,YAAY,UAAU,CAAC,CAAC,YAAY,MAAM,MAAM,EAAE,SAAS,KAAK,GAAhEA,EAAAA,KAAAA,YAA2D,EAAA,KAAA;CAA5E,IAAM,UAAUD,IACiBE;CAAe,AAAA,EAAA,OAAA,WAAA,EAAA,OAAT,YAAA,EAAA,OAAkB,SAAxB,WAAM,SAAS,SAAS,KAAK,GAAd,EAAA,KAAA,SAAT,EAAA,KAAA,UAAkB,EAAA,KAAA;CAAzD,IAAM,eAAeC,IAIjBC;CAAmB,AAAA,EAAA,OAAA,WAAA,EAAA,OAAmB,gBAAtC,KAAA,oBAAC,UAAD;EAAmB;EAAS,UAAU;CAAe,CAAA,GAAlC,EAAA,KAAA,SAAmB,EAAA,KAAA;CAEvBC,IAAAA;sDAAC,KAAA,EAAA,QAAQ,UAAS;CAA/BC,IAAAA;CACG,AAAA,EAAA,QAAA,sBADH,KAAA,oBAAC,MAAD;EAAM,OAAOD;EAAqB,MAAM;EACrC,UAAA;CACG,CAAA,GADH,EAAA,MAAA;CAFLE,IAAAA;CAA6B,AAAA,EAAA,QAAA,gBAAA,EAAA,QAC3BD,MADF,KAAA,oBAAC,MAAD;EAAM,WAAW;EAAG,SAAS;EAC3BA,UAAAA;CAGI,CAAA,GAJuB,EAAA,MAAA,cAC3BA,EAAAA,MAAAA;CAHJE,IAAAA;CADF,OAEIJ,EAAAA,QAAAA,MAAAA,EAAAA,QACAG,MAFF,KAAA,qBAAC,MAAD;EAAM,KAAK;EAAG,OAAM;EAApB,UAAA,CACEH,IACAG,EAKI;KANJH,EAAAA,MAAAA,IACAG,EAAAA,MAAAA,8BAFFC;AASJ;ACrMA,MAAM,UAAU,OAAO,GAAG,CAAC,CAAA,WAAA;;;;AAY3B,SAAgB,YAAY,OAAiC;;CAG3D,oBAAoB,KAAK;CAInBI,IAAAA;qDAAC,KAAA,oBAAA,KAAD;EAAK,eAAe;EAClB,UAAA,qBAAC,MAAD;GAAM,MAAM;GAAG,OAAA;GAAf,UAAA;IACE;IAAW;IACX,qBAAC,KAAD;KAAG,MAAM;KAAqB,QAAO;KAAS,KAAI;KAAlD,UAAA,CACE,0BAAsB,oBAAC,gBAAD,CAAiB,CAAA,CACtC;;GACC;;CACH,CAAA;CAEJC,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CAXLC,IAAAA;CADF,OAYOF,EAAAA,OAAAA,kBAXL,KAAA,oBAAC,SAAD,EAAA,UACE,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA,CACED,IASCC,EACI;CACA,CAAA,EAAA,CAAA,GAFJA,EAAAA,KAAAA,gBAXLE;AAeJ;AAEA,SAAS,oBAAoB,OAAiC;eACtD,EAAC,OAAO,aAAY,OACpB,YAAY,OAAO,EAAK,GAEpBC,IA4BPC;CA5BH,AA0BI,EAAA,OAAA,YAAA,EAAA,OAjBY,SATN,WAAM;EAEd,IAAI,UAAU,SACZ;EAEF,UAAU,UAAU;EAEpB,IAAI,WAAW,IAET,OAAQ,SAA2B,CAAC,EAAA,CAAG,KAAK,UAC5C,MAAM,UAAU,UACX,SAGT,WAAW,IACJ,MAAuB;GAC5B,MAAM,UAAU,EAAE;GAClB,OAAO;GACP,OAAO;GACP,UAAU,CAAC;GACX,OAAO;GACP,UAAU,CAAC,KAAK;EAClB,CAAC,EACF;EAED,AAAI,YACF,SAAS,IAAI,GAAG,CAAC;CAErB,GAAG,KAAA,CAAC,UAAU,KAAK,GAFf,EAAA,KAAA,UAjBY,EAAA,KAAA,uDAThB,UAAUD,IA4BPC,EAAiB;AACtB;AC3EA,SAAgB,uBAAuB,OAAwB;CAC7D,OAAO,MAAM,cAAc;EACzB,GAAG;EACH,OAAO;CACT,CAAC;AACH;ACFA,SAAgB,uBAAuB,OAAiC;gBAChE,OAAO,eAAe,GAGtB,gBAAgB,MAAM,OACtB,kBAAkB,MAAM,SAErBE;uCAAiB,KAAA,iBAAA,CAAC,GAAlB,EAAA,KAAA;CAADC,IAAAA;CAACD,IAAAA,EAAAA,OAAAA,MAAAA,EAAAA,OAAmEE,MAAAA,IAAAA;EAAvCC,IAAAA;EAAuCD,EAAAA,OAAAA,MAAAA,kBAAvC,MAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,MAAM,iCAApE,KAACF,GAAqB,OAAOG,EAAyC,GAArEH,EAAAA,KAAAA,IAAmEE,EAAAA,KAAAA,MAAAA;;CAD5E,IAAM,QAAQE,IAMTC;yCAAmB,KAAA,mBAAA,CAAC,GAApB,EAAA,KAAA;CAADC,IAAAA;CAACD,IAAAA,EAAAA,OAAAA,MAAAA,EAAAA,QAMgDH,MAAAA,IAAAA;EANlBK,IAAAA;EAMkBL,EAAAA,QAAAA,MAAAA,mBANlB,MAAC,QAAM;GACpC,IAAIM,IAAE,SAAS,SACb,OAAO;GAGT,IAAMC,UAAQD,KAAG,MAAM;GACvB,OAAO,CAACC,QAAM,UAAUA,QAAM,WAAW,MAAM;EACjD,GADiDP,EAAAA,MAAAA,MAAAA,iBANjD,KAACG,GAAuB,OAAOE,EAO9B,GAPAF,EAAAA,KAAAA,IAMgDH,EAAAA,MAAAA,MAAAA;;CARrD,IAAM,UAAUQ,IAYTC;CAAP,OAA6C,EAAA,QAAA,WAAA,EAAA,QAAd,SAAA,EAAA,QAAO,SAA/B,KAAA,MAAM,cAAc;EAAC,GAAG;EAAO;EAAO;CAAO,CAAC,GAAR,EAAA,MAAA,SAAd,EAAA,MAAA,OAAO,EAAA,MAAA,iCAA/BA;AACT;ACxBA,SAAgB,gCAAgC,OAAyB;eACjE,MAAM,OAAuB,IAAI,GAG7BE,IAaPC;CAbH,oDAAU,WAAM;EACd,IAAM,SAAS,IAAI,SAAS,QAAQ,gCAA8B;EAClE,IAAI,CAAC,QACH;EAEF,IAAM,QAAQ,SAAS,cAAc,OAAO,GACtC,WAAW,MAAM,KAAK,OAAO,IAAI,QAAQ,KAAK,GAAG;EAMvD,AALA,OAAO,KAAK,UAEZ,MAAM,YAAY;SACb,SAAS;OAEd,OAAO,QAAQ,KAAK;CACtB,GAAG,KAAA,CAAC,GAAG,mDAbP,UAAUD,IAaPC,EAAK;CAEeC,IAAAA;+BAAM,KAAA,MAAA,cAAc,KAAK,GAAzBC,EAAAA,KAAAA;CAAhBC,IAAAA;CAAP,OAAuBF,EAAAA,OAAAA,kBAAhB,KAAA,oBAAC,KAAD;EAAU;EAAMA,UAAAA;CAAgC,CAAA,GAAhCA,EAAAA,KAAAA,gBAAhBE;AACT;ACjBA,MAAa,wBAAwB,WAAW;CAC9C,MAAM;CACN,MAAM;CACN,OAAO;CACP,UAAU;CACV,MAAM;CACN,YAAY,EACV,OAAO,gCACT;CACA,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;CACT,CAAC,GACD,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,IAAI,CACF,kBAAkB;GAChB,MAAM;GACN,QAAQ,CAAC;IAAC,OAAO;IAAU,OAAO;GAAQ,CAAC;GAC3C,OAAO,CAAC;GACR,OAAO;IACL,YAAY,CAAC;IACb,aAAa,CAAC;GAChB;EACF,CAAC,CACH;CACF,CAAC,CACH;CACA,SAAS;EACP,QAAQ;GACN,OAAO;GACP,SAAS;EACX;EACA,QAAQ,EAAC,OAAO,WAAU;GAMxB,OAAO;IACL;IACA,UAAU,UAPC,SACT,SAAS,UAAe,OAAO,QAAQ,CAAC,CACzC,SAAS,UAAe,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,CAChD,OAAO,OAAO,CAAA,EACG,UAAU;IAI5B,OAAO;GACT;EACF;CACF;AACF,CAAC;;;;;ACZD,SAAgB,yBAAyB,wBAAiC;CACxE,OAAO,WAAW;EAChB,MAAM;EACN,MAAM;EACN,OAAO;EACP,MAAM;EAEN,QAAQ,CACN,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,YAAY,EACV,OAAO,kBACT;GACA,aAAa,SAAS;IACpB,IAAM,mBAAmB,oBAAoB,sBAAsB;IACnE,OAAO,KAAK,QAAQ,OAAO,YAAY;KACrC,IAAI,CAAC,OACH,OAAO;KAET,IAAI;MACF,IAAM,QAAQ,QAAQ,UAAU;MAChC,IAAI,CAAC,OACH,OAAO;MAET,IAAI,CAAC,MAAM,WAAA,2BAAiC,GAC1C,OAAO,qGAAqG;MAE9G,IAAM,gBAAgB,MAAM,MAAM,EAA6B,GACzD,SAAS,QAAQ,OAAO,IAAI,aAAa;MAC/C,IAAI,CAAC,QACH,OAAO,gGAAgG;MAGzG,IAAM,EAAC,cAAa,iBAAiB,MAA0B;MAK/D,OAJiB,UAAU,MAAM,MAAM,EAAE,QAAQ,KAC5C,IAGE,KAFE,oBAAoB,MAAM;KAGrC,SAAS,GAAG;MAEV,OADA,QAAQ,MAAM,qCAAqC,CAAC,GAC7C;KACT;IACF,CAAC;GACH;EACF,CAAC,CACH;EACA,SAAS;GACP,QAAQ,EACN,MAAM,OACR;GACA,QAAQ,EAAC,QAAO;IACd,OAAO;KACL,OAAO;KACP;KACA,MAAM;IACR;GACF;EACF;EACA,YAAY,EACV,SAAS,gBACX;EACA,SAAS,EACP,OAAO,EACL,MAAM,UACR,EACF;CACF,CAAC;AACH;AAEA,MAAa,YAAY,WAAW;CAClC,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,aAAa;EACb,aAAa;EACb,aAAa,SAAS,KAAK,SAAS;CACtC,CAAC,GACD,YAAY;EACV,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO;EACP,aAAa;CACf,CAAC,CACH;CACA,SAAS,EACP,QAAQ,EACN,OAAO,UACT,EACF;CACA,SAAS,EACP,OAAO;EACL,MAAM;EACN,OAAO;CACT,EACF;AACF,CAAC,GAEY,gBAAgB,WAAW;CACtC,MAAM;CACN,MAAM;CACN,OAAO,sBAAsB;CAC7B,MAAM,sBAAsB;CAC5B,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,IAAI,CAAC,EAAC,MAAM,sBAAsB,KAAI,CAAC;EACvC,OAAO;EACP,aAAa;EACb,aAAa,SAAS,KAAK,SAAS;EACpC,YAAY,EACV,OAAO,SAAS,IAAI,OAAO;GACzB,OAAO,oBAAC,KAAD;IAAK,OAAO,EAAC,UAAU,IAAG;IAAI,UAAA,MAAM,cAAc,KAAK;GAAO,CAAA;EACvE,EACF;CACF,CAAC,CACH;CACA,SAAS;EACP,QAAQ;GACN,KAAK;GACL,OAAO;GACP,SAAS;EACX;EACA,QAAQ,QAAQ;GACd,OAAO,OAAO,MACT,uBAAuB,SAAS,UAAU,MAAM,KAAK,SACtD;IAAC,OAAO;IAAyB,OAAO,sBAAsB;GAAI;EACxE;CACF;CACA,SAAS,EACP,OAAO;EACL,MAAM;EACN,OAAO;CACT,EACF;AACF,CAAC,GAEY,SAAS,WAAW;CAC/B,MAAM;CACN,MAAM;CACN,OAAO;CACP,IAAI,CACF,kBAAkB;EAChB,MAAM;EACN,QAAQ,CAAC;GAAC,OAAO;GAAU,OAAO;EAAQ,CAAC;EAC3C,OAAO,CAAC;EACR,OAAO;GACL,YAAY,CAAC;GACb,aAAa,CAAC;EAChB;EACA,IAAI;GACF,kBAAkB,EAChB,MAAM,uBACR,CAAC;GACD,kBAAkB,EAChB,MAAM,cAAc,KACtB,CAAC;GACD,kBAAkB,EAChB,MAAM,UAAU,KAClB,CAAC;EACH;CACF,CAAC,CAUH;AACF,CAAC,GAEY,kBAAkB,WAAW;CACxC,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;CACT,CAAC,CACH;AACF,CAAC,GAEY,iBAAiB,WAAW;CACvC,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;CACT,CAAC,CACH;AACF,CAAC,GAEY,cAAc,WAAW;CACpC,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW,CACT;EAAC,MAAM;EAAc,OAAO;EAAc,SAAS;GAAC,aAAa;GAAM,WAAW;EAAI;CAAC,CACzF;CACA,SAAS;EACP,QAAQ;GACN,MAAM;GACN,OAAO;GACP,QAAQ;EACV;EACA,UAAU,EAAC,MAAM,OAAO,cACf;GACL;GAEA,MAAM,OAAO,oBAAC,MAAD,EAAM,QAAQ,KAAqB,CAAA,IAAI;GACpD;EACF;CAEJ;CACA,YAAY;EACV,OAAO;EACP,UAAU,UAAe;GAGvB,IAAM,YAAY,MAAM,MAClB,OAAO,eAAe,SAAS,IAAI,YAAY,YAAY,oBAAC,WAAD,CAAY,CAAA,IAAI;GACjF,OACE,qBAAC,MAAD;IAAM,KAAK;IAAG,OAAM;IAAS,SAAS;IAAtC,UAAA;KACG,OACC,oBAAC,KAAD;MAAK,MAAK;MACR,UAAA,oBAAC,MAAD;OAAM,MAAM;OAAI,UAAA;MAAW,CAAA;KACxB,CAAA,IACH;KAEJ,oBAAC,OAAD;MAAO,MAAM;MAAG,KAAK;MACnB,UAAA,oBAAC,MAAD;OAAM,MAAM;OAAG,cAAa;OAAW,QAAO;OAC3C,UAAA,oBAAoB,KAAK;MACtB,CAAA;KACD,CAAA;KAEN,MAAM,UACL,oBAAC,MAAD;MAAM,MAAM;MACV,UAAA,oBAAC,SAAD;OACE,SAAS,oBAAC,MAAD;QAAM,MAAM;QAAG,UAAA;OAAyB,CAAA;OACjD,SAAS;OACT,WAAU;OACV,QAAA;OAEA,UAAA,oBAAC,UAAD,CAAW,CAAA;MACJ,CAAA;KACL,CAAA;IAEJ;;EAEV;CACF;CACA,QAAQ;EACN,YAAY;GACV,MAAM,OAAO;GACb,MAAM;GACN,OAAO;GACP,YAAY,EACV,OAAO,YACT;EACF,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,UAAU;GACV,YAAY;IACV,OAAO;IACP,OAAO;GACT;EACF,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,UAAU;GACV,YAAY,EACV,OAAO,iBACT;EACF,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,UAAU;GACV,YAAY;IACV,OAAO;IACP,OAAO;GACT;GACA,eAAe,SAAS,YAAY,QAAQ,aAAa,MAAM;GAC/D,WAAW,YACT,GACE,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,gBAAgB,QAAQ,aAAa;EAE1F,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,QAAQ;GACR,UAAU;GACV,eAAe,SAAS,YACf,QAAQ,aAAa,MAAM;EAEtC,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;GACP,YAAY;IACV,OAAO;IACP,OAAO;GACT;GACA,IAAI,CACF,kBAAkB,EAAC,MAAM,gBAAgB,KAAI,CAAC,GAC9C,kBAAkB,EAAC,MAAM,eAAe,KAAI,CAAC,CAC/C;EACF,CAAC;CACH;AACF,CAAC,GAEY,oBAAoB,WAAW;CAC1C,MAAM;CACN,MAAM;CACN,OAAO;CAIP,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,UAAU;EACV,QAAQ;CACV,CAAC,GACD,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,IAAI,CAAC,EAAC,MAAM,YAAY,KAAI,CAAC;EAC7B,YAAY;GACV,OAAO;GACP,OAAO;EACT;CACF,CAAC,CACH;CACA,SAAS,EACP,QAAQ,EACN,OAAO,OACT,EACF;AACF,CAAC,GAEY,uBAAuB,WAAW;CAE7C,MAAM;CAGD,UAAU;CACf,MAAM;CACN,OAAO;CAEP,YAAY;EACV,OAAO;EACP,QAAQ,UACC,MAAM,cAAc;GAAC,GAAG;GAAO,OAAO;EAAE,CAAC;CAEpD;CACA,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;CACT,CAAC,GACD,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,IAAI,CAAC,EAAC,MAAM,kBAAkB,KAAI,CAAC;CACrC,CAAC,CACH;CACA,SAAS,EACP,QAAQ,EACN,OAAO,QACT,EACF;AACF,CAAC,GAEY,kBAAkB,WAAW;CACxC,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;EACN,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;EACT,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;EACT,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;EACT,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;EACT,CAAC;EACD,YAAY;GACV,MAAM;GACN,MAAM;GACN,OAAO;EACT,CAAC;CACH;AACF,CAAC,GAEY,4BAA4B,WAAW;CAElD,MAAM;CAGD,UAAU;CACf,MAAM;CACN,OAAO;CACP,QAAQ,CACN,YAAY;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,IAAI,CAAC,EAAC,MAAM,gBAAgB,KAAI,CAAC;CACnC,CAAC,CACH;AACF,CAAC;ACneD,SAAS,gBAA8D,MAAY;CAEjF,IAAM,iBAAkB,MAAc,YAAY;CAClD,OAAO;EACL,GAAG;EACH,GAAI,gBAAgB,OAChB,EACE,YAAY;GACV,GAAG,KAAK;GACR,QAAQ,UAAsB;IAC5B,IAAM,WAAW;KAAC,GAAG;KAAO,qBAAqB,KAAA;IAAS;IAI1D,OAHI,OAAO,kBAAmB,aACrB,eAAe,QAAQ,IAEzB,MAAM,cAAc,QAAQ;GACrC;EACF,EACF,IACA,CAAC;EACL,GAAI,YAAY,OACZ,EAEE,QAAQ,KAAK,QAAQ,KAAK,UAAU,gBAAgB,KAAK,CAAC,EAC5D,IACA,CAAC;EACL,GAAI,QAAQ,OACR,EAEE,IAAI,KAAK,IAAI,KAAK,kBAAkB,gBAAgB,aAAa,CAAC,EACpE,IACA,CAAC;CACP;AACF;;;;;AAMA,SAAgB,kBAAkB,wBAAiC;CAUjE,OAAO;EACL,GAVsB;GACtB;GACA;GACA,yBAAyB,sBAAsB;GAC/C;GACA;GACA;EACF,CAAC,CAAC,IAAI,eAGD;EACH;EACA;EACA;EACA;EACA;EACA;CACF;AACF;ACtBA,MAAa,SAAS,cAAyC,WAAW;CACxE,IAAM,qBAAqB,UAAU,CAAC,GAChC,aAAa,mBAAmB,WAAW,cAAc,IACzD,eAAe,mBAAmB,QAAQ,cAC1C,yBAAyB,mBAAmB,QAAQ,wBACpD,cAAc,mBAAmB,QAAQ;CAM/C,IAJI,OAAO,cAAe,YACxB,mBAAmB,UAAU,GAG3B,iBAAiB,KAAA,MAAc,eAAe,KAAK,eAAe,KACpE,MAAU,MACR,IAAI,YAAY,+EAA+E,cACjG;CAGF,IACE,2BAA2B,KAAA,MAC1B,CAAC,OAAO,UAAU,sBAAsB,KACvC,yBAAyB,KACzB,yBAAyB,KAE3B,MAAU,MACR,IAAI,YAAY,iGAAiG,wBACnH;CAGF,IAAI,gBAAgB,KAAA,MAAc,cAAc,KAAK,cAAc,IACjE,MAAU,MACR,IAAI,YAAY,0EAA0E,aAC5F;CAGF,OAAO;EACL,MAAM;EAID,YAAY;EACjB,QAAQ,EACN,OAAO,kBAAkB,sBAAsB,EACjD;EACA,MAAM,EACJ,SAAS,CAAC,CAAC,CAAC,EACd;EAEA,UAAU;GACR,aAAa,MAAM,YAAY;IAC7B,IAAM,eAAe,QAAQ,cACvB,YAAY,QAAQ,OAAO,IAAI,YAAY;IAIjD,OAHI,aAAa,sBAAsB,SAAS,IACvC,CAAC,GAAG,MAAM,eAAe,IAE3B;GACT;GACA,wBAAwB,MAAM,EAAC,cAAc,aAAY;IACvD,IAAI,iBAAA,wCACF,OAAO,CAAC;IAEV,IAAM,YAAY,OAAO,IAAI,YAAY;IAIzC,OAHI,aAAa,sBAAsB,SAAS,IACvC,CAAC,GAAG,MAAM,kBAAkB,IAE9B;GACT;GACA,0BAA0B,MAAM,EAAC,YAAY,QAAQ,iBAAgB;IACnE,IAAI,eAAA,wCACF,OAAO,CAAC;IAEV,IAAM,YAAY,OAAO,IAAI,UAAU;IAIvC,OAHI,aAAa,mBAAmB,SAAS,KAAK,sBAAsB,SAAS,IACxE,CAAC,GAAG,MAAM,6BAA6B,UAAU,CAAC,IAEpD;GACT;GACA,YAAY,EACV,iBAAiB,qBACnB;EACF;EAEA,QAAQ,EACN,YAAY,EACV,QAAQ,SAAS,OAAO,OAAO;GAC7B,OAAO,oBAAC,cAAD;IAAc,GAAI;IAAO,QAAQ;GAAqB,CAAA;EAC/D,EACF,EACF;EAEA,MAAM,EACJ,YAAY;GACV,OAAO;GACP,OAAO;GACP,MAAM;GACN,OAAO;GACP,aAAa;EACf,EACF;EAEA,SAAS,CACP,aAAa;GACX,MAAM,GAAG,YAAY;GACrB,MAAM,EAAC,YAAY,EAAC,OAAO,eAAc,EAAC;EAC5C,CAAC,CAAC,CAAC,GAEH,aAAa;GACX,MAAM,GAAG,YAAY;GACrB,MAAM,EACJ,YAAY,EACV,QAAQ,UAAU;IAChB,IAAM,EAAC,eAAc;IAKrB,OAHI,QAAQ,UAAU,IACb,oBAAC,sBAAD,EAAsB,GAAI,MAAQ,CAAA,IAEpC,MAAM,cAAc,KAAK;GAClC,EACF,EACF;EACF,CAAC,CAAC,CAAC,CACL;CACF;AACF,CAAC,GC7JK,SACJ,QACA,OACA,QACA,YAEA,YAEE,OAAO,WAAW,MAAM,OAAO,QAAQ;CACrC,KAAK,QAAQ;CACb,gBAAgB;AAClB,CAAC,CACH,GAEI,UACJ,QACA,OACA,QACA,YAEA,YAGI,OAAO,OAAO,OAAO,QAAQ;CAC3B,QAAQ;EAAC;EAAW;EAAY;CAAW;CAC3C,eAAe;CACf,YAAY;CACZ,KAAK,QAAQ;AACf,CAAC,CAEL;AAEF,SAAS,eACP,OACuB;CACvB,OAAO,MAAM,SAAS;AACxB;;AAGA,MAAa,eACX,QACA,OACA,SAA4B,CAAC,GAC7B,UAA8B,CAAC,MAC5B;CACH,IAAM,aAAa,OAAO,SAAU,WAAW,QAAQ,MAAM,OACvD,gBAAgB,OAAO,SAAU,WAAW,QAAQ,MAAM,QAE1D,aAAa,MAAM,QAAQ,YAAY,QAAQ,OAAO,GAEtD,UAAU,OAAO,QAAQ,eAAe,QAAQ,OAAO,CAAC,CAAC,KAC7D,UAAU,IAAI,MACI,MAAM,KACP,CAAC,eAAe,EAAE,IAIxB,WACL,gBAAI,MACF,GAAG,SAAS,cACR,+CACA,4CAA4C,GAAG,KAAK,EAC1D,CACF,IAEK,GAAG,EAAE,CACb,GACD,MAAM,CACR,GAEM,CAAC,UAAU,yBAAyB,UAAU,SAAS,cAAc,GACrE,mBAAmB,UACnB,CAAC,QAAQ,eAAe,MAAM,SAAS,cAIpC,QAAQ,YAAY,SAAS,MAAM,UAAU;CAGtD,OAAO,MACL,SAAS,KAAK,KAAK,CAAC,CAAC,GACrB,sBAAsB,KACpB,OAAO,eAAe,GACtB,WAAW,UAAU,MAAM,GAAG,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,QAAQ,gBAAgB,GAAI,CAAC,CAAC,CAAC,CAC5F,CACF,CAAC,CAAC,KAAK,yBAAyB,UAAU,CAAC;AAC7C,GCnFM,iBAAiB,CAAC,GAClB,kBAAsC,EAAC,YAAY,cAAa;AAEtE,SAAgB,kBACd,OAAA,IAAA,IAGgB;gBAFhB,SAAA,OAAA,KAAA,IAAiB,iBAAjBE,IACA,UAAA,OAAA,KAAA,IAA8B,kBAA9BC,IAEM,CAAC,SAAS,cAAc,SAAS,EAAI,GACrC,CAAC,OAAO,YAAY,SAAS,EAAK,GAClC,CAAC,MAAM,WAAW,SAAmB,IAAI,GACzC,eAAe,OAA0B,IAAI,GAE1BC;qDAAC,KAAA,EAAA,YAAY,cAAa;CAAnD,IAAM,SAAS,UAAUA,EAA2B,GAE1CC,IAwBPC;CAxBH,AAEuC,EAAA,OAAA,UAAA,EAAA,OAAuB,WAAA,EAAA,OAAR,UAAA,EAAA,OADhD,SADI,YACJ,UACF,aAAa,UAAU,YAAY,QAAQ,OAAO,QAAQ,OAAO,CAAC,CAC/D,KACC,qBAAqBG,MAAO,GAC5B,YAAY,SACV,QAAQ,MAAM,GAAG,GACjB,SAAS,EAAI,GACb,WAAW,EAAK,GAChB,QAAQ,IAAI,GAEL,GAAG,IAAI,EACf,CACH,CAAC,CACA,WAAW,cAAc;EAGxB,AAFA,SAAS,YAAaA,OAAQ,SAAS,SAAS,IAAI,UAAU,SAAU,GACxE,WAAW,EAAK,GAChB,SAAS,EAAK;CAChB,CAAC,UAII,aAAa,UAAU,aAAa,QAAQ,YAAY,IAAI,KAAA,IAEpE,KAAA;EAAC;EAAO;EAAQ;EAAS;CAAM,GAtBK,EAAA,KAAA,QAAuB,EAAA,KAAA,SAAR,EAAA,KAAA,QADhD,EAAA,KAAA,uDADN,UAAUJ,IAwBPC,EAAgC;CAE5BC,IAAAA;CAAP,OAAwB,EAAA,OAAA,QAAA,EAAA,OAAP,SAAA,EAAA,OAAT,WAAD,KAAA;EAAC;EAAS;EAAO;CAAI,GAAJ,EAAA,KAAA,MAAP,EAAA,KAAA,OAAT,EAAA,KAAA,mCAADA;AACT;ACrDA,MAAM,UAAkC,CAAC,GAEnC,eAAe;AAErB,SAAgB,iBAAiB;gBACzB,SAAS,UAAU,GACAG;qDAAC,KAAA,EAAA,YAAY,aAAY;CAAlD,IAAM,SAAS,UAAUA,EAA0B,GAC7C,CAAC,QAAQ,aAAa,SAAS,EAAK,GACpC,CAAC,WAAW,gBAAgB,SAAS,YAAY,GAEoCC;qDACzF,KAAA,EAAA,MAAM,yBACR;CAFA,IAAM,EAAC,SAAQ,kBAA0C,kCAAkCA,EAE1F,GAGQC;CAAgB,AAAA,EAAA,OAAA,sBAAhB,KAAA,gBAAgB,MAAM,GAAN,EAAA,KAAA;CADzB,IAAM,QAAQC,IAIiBC;CAKP,AAAA,EAAA,OAAA,UAAA,EAAA,OADMC,SAJC,WAAM;EACnC,UAAU,EAAI;EACd,IAAI,UAAU;EA0Bd,QANA,eAnBe,QAAQ;GACrB,aAAa,aAAa,MAAM,QAAQ;GACxC,IAAM,cAAc,OAAO,YAAY;GACvC,KAAA,IAAS,IAAI,GAAG,IAAI,MAAM,UACnB,SAD2B,KAAK;IAIrC,IAAM,OAAO,MAAM;IAGnB,AADA,MAAM,YAAY,gBAAgB,IAA6B,GAC3D,IAAI,KAAK,IAAI,MAAO,MAEtB,MAAM,YAAY,OAAO,GACzB,YAAY,MAAM,GAClB,aAAa,WAAW,EAAE,GAAG,MAAM,QAAQ;GAE/C;GACA,MAAM,YAAY,OAAO;EAC3B,EAAA,CACM,CAAC,CACJ,MAAM,QAAQ,KAAK,CAAC,CACpB,cAAc;GAEb,AADA,UAAU,EAAK,GACf,aAAa,YAAY;EAC3B,CAAC,SACU;GAGX,AAFA,UAAU,IACV,UAAU,EAAK,GACf,aAAa,YAAY;EAC3B;CACF,GA5BwB,EAAA,KAAA,QADMA,EAAAA,KAAAA;CAJ9B,IAAM,aAAaC,IAoCwBC;qDAAC,KAAA,EAAA,QAAQ,qBAAoB;CAIxDC,IAAAA;gCAAS,KAAA,SAAA,oBAAC,SAAD,EAAS,OAAO,EAAC,WAAW,EAAC,EAAI,CAAA,IAAI,UAA9C,EAAA,KAAA;CAFVC,IAAAA;CAIc,AAAA,EAAA,QAAA,UAAA,EAAA,QACD,cAAA,EAAA,QAFH,aAAA,EAAA,QADAD,MAFV,KAAA,oBAAC,KAAD,EAAA,UACE,oBAAC,QAAD;EACE,MAAMA;EACN,MAAM;EACN,UAAU;EACV,SAAS;CACV,CAAA,EACE,CAAA,GAHS,EAAA,MAAA,QACD,EAAA,MAAA,YAFH,EAAA,MAAA,WADAA,EAAAA,MAAAA;CAQNE,IAAAA;sDAAC,KAAA,oBAAA,OAAD,EAAA,UAAO,gBAAoB,CAAA;CAExBC,IAAAA;iCAAM,KAAA,MAAA,IAAIC,KAIV,GAJA,EAAA,MAAA;CAHLC,IAAAA;CAGKF,AAAAA,EAAAA,QAAAA,mBAHL,KAAA,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA,CACED,IACA,oBAAC,MAAD,EAAA,UACGC,GAKC,CAAA,CACC;KANFA,EAAAA,MAAAA;CASHG,IAAAA;sDAAC,MAAA,oBAAA,OAAD,EAAA,UAAO,gBAAoB,CAAA;CAEvB,IAAA,MAAA,QAAQ,SAATC;CAACC,AAAAA,EAAAA,QAAAA,qBAAD,MAACA,IAAiB,IAAIJ,MAItB,GAJCI,EAAAA,MAAAA;CAHNC,IAAAA;CAGKF,AAAAA,EAAAA,QAAAA,qBAHL,MAAA,qBAAC,OAAD;EAAO,KAAK;EAAZ,UAAA,CACED,KACA,oBAAC,MAAD,EAAA,UACGC,IAKC,CAAA,CACC;KANFA,EAAAA,MAAAA;CAfPG,IAAAA;CAYED,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAXAJ,MADF,MAAA,qBAAC,MAAD;EAAM,KAAK;EAAX,UAAA,CACEA,IAWAI,GAUI;KAVJA,EAAAA,MAAAA,KAXAJ,EAAAA,MAAAA;CAXNM,IAAAA;CADF,OAWMD,EAAAA,QAAAA,OAAAA,EAAAA,QARAT,MAFJ,MAAA,oBAAC,MAAD;EAAM,SAAS;EAAG,UAAS;EAAO,OAAOF;EACvC,UAAA,qBAAC,OAAD;GAAO,KAAK;GAAZ,UAAA,CACEE,IAQAS,GAuBK;;CACH,CAAA,GAxBFA,EAAAA,MAAAA,KARAT,EAAAA,MAAAA,gCAFJU;AAoCJ;AAXqC,SAAA,OAAC,QAAA;CACtB,OAAA,oBAAC,MAAD,EAAA,UACE,oBAAC,aAAD,EAAa,YAAYC,OAAO,CAAA,EAC9B,GAFKA,OAAK,IAEV;;AAdK,SAAA,MAAC,QAAA;CACV,OAAA,oBAAC,MAAD,EAAA,UACE,oBAAC,aAAD,EAAa,YAAYA,OAAO,CAAA,EAC9B,GAFKA,OAAK,IAEV;;AAqBpB,SAAS,YAAA,IAA8D;eAAlD,EAAC,eAADC,IACOC;CAAe,AAAA,EAAA,OAAA,0BAAf,KAAA,KAAK,UAAU,YAAY,MAAM,CAAC,GAAnB,EAAA,KAAA;CAAzC,IAAM,MAAMC,IACLC;CAAP,OAAa,EAAA,OAAA,mBAAN,KAAA,oBAAC,OAAD,EAAA,UAAM,IAAS,CAAA,GAAT,EAAA,KAAA,iBAANA;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA,SAAgB,eAA6B;CAC3C,IAAM,EAAC,iBAAgB,kBAAkB;CACzC,OAAO;AACT"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{x: 0, y: 0}","() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }","[]","scrollParent","relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n }","boundsScroll.x","useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )","relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n }","scroll.x","useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )","{bounds, element, ref}","_c","() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }","[bounds, element, onRectsChange]","<div {...restProps} ref={ref}>\n {children}\n </div>","_c","() => store.from.subscribe(key, {zIndex})","from","[key, store, zIndex]","() => {\n if (rects) store.from.next(key, rects)\n }","[key, rects, store]","<ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>","_c","createConnectorsStore()","useMemo(() => createConnectorsStore(), [])","() => onConnectorsChange && store.connectors.subscribe(onConnectorsChange)","[onConnectorsChange, store]","<ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>","ConnectorsStoreContext.Provider","_c","getPathKey(path)","useMemo(() => {\n return getPathKey(path)\n }, [path])","_c","firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined","(member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType)","useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])","<FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>","children","FirstAssistedPathContext.Provider","_c","_temp","{\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps","assistDocumentId(documentTypeName)","assistTasksStatusId(documentId ?? '')","documentId ?? ''","{apiVersion: '2023-01-01'}","() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }","[client, assistDocument, documentTypeName, initDoc]","() => {\n // best effort\n }","useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n // oxlint-disable-next-line no-map-spread\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])","typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })","assistDocument?.fields","tasks","id","assistDocument?.fields ?? []","fields","instruction","task","_c","_temp","{documentId, schemaType: documentSchemaType}","() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }","id","tasks\n ?.filter","(run) => [run._key, run]","task","(task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date())","[tasks, previousTasks, toast, currentUser, assistDocLoaded]","_c","_temp","_temp2","<AssistInput {...props} />","props.renderDefault(props)","props.renderDefault","<AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />","props as ObjectInputProps","{documentId, ...props}: ObjectInputProps & {documentId: string}","useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as ObjectSchemaType\n }, [props.schemaType])","{\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n }","type","{\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","schemaType","props.renderDefault({...props, schemaType})","<FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>","members","props.members","{minWidth: 0}","<ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>","`${paneKey}_${pathKey}`","_c","getTypePath(doc, pathString)","useMemo(() => getTypePath(doc, pathString), [doc, pathString])","documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : []","useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : [],\n [documentSchemaType, getFieldRefs],\n )","path ? selectableFields?.find((f) => f.key === path) : undefined","selectableFields?.find","useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])","paneRouter.params ?? {}","params","{...paneRouter, params: paneRouter.params ?? {}}","useMemo(() => ({...paneRouter, params: paneRouter.params ?? {}}), [paneRouter])","_c","{apiVersion: API_VERSION_WITH_EXTENDED_TYPES}","customApiClient ? customApiClient(client) : client","useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )","({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","id","{\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest","useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n translate,\n loading,\n }","useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )","({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","{path, documentId}: {path: string; documentId: string}","useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n generateCaption,\n loading,\n }","useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )","({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n }","useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )","{\n generateImage,\n loading,\n }","useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )","() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }","useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])","{\n loading,\n initInstruct,\n }","{assist: assistConfig}","(request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n }","assistConfig?.localeSettings","useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )","{\n runInstruction,\n loading,\n }","useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )","_c","async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }","{title, inputs}","inputs","(input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n })","useCallback(async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }, [])","(req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n }","userInputBlocks","(block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block]","useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )","() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }","useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }, [resolveUserInput])","() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }","request","instruction","([key, value]) => ({\n blockKey: key,\n userInput: value,\n })","i","input","useCallback(() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs, resolveUserInput])","Object.entries(inputs).filter(([, value]) => !!value)","([, value]) => !!value","{width: '100%'}","<Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />","{runInstruction, getUserInput, instructionLoading: loading}","useMemo(\n () => ({runInstruction, getUserInput, instructionLoading: loading}),\n [getUserInput, loading, runInstruction],\n )","open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null","block","<RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>","children","RunInstructionContext.Provider","value","[, value]","[key, value]","(e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n }","useCallback(\n // oxlint-disable-next-line no-deprecated\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )","() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }","[autoFocus]","<FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />","description","block?.message ?? 'Provide more context'","{resize: 'vertical'}","<TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />","<Stack padding={2} gap={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>","_c","_temp","_temp2","_temp3","_temp4","isSyncing = false","(signals: DocumentSignals) => {\n queuedRef.current = advance(queuedRef.current, signals, {documentOnChange, task})\n }","() => {\n advanceQueue({isDocAssistable, isSyncing})\n }","[isDocAssistable, isSyncing]","(taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n }","useCallback(\n (taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n },\n [isDocAssistable, isSyncing, documentOnChange, task],\n )","_c","{\n ...args,\n task: runInstruction,\n }","{\n instructionLoading,\n requestRunInstruction,\n }","_c","useMemo(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])","schema.get(documentType)","getFieldRefs(documentType)","getFieldRefsByTypePath(documentType)","{\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }","useMemo(() => {\n return {\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }\n }, [getFieldRefs, getFieldRefsByTypePath, documentType])","editState || {}","getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType.liveEdit,\n releaseId: selectedReleaseId,\n })","liveEdit","selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)","getPublishedId(documentId)","{\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n }","useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n documentIsSyncing,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n ])","{\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }","{...base, loading: true, assistDocument: undefined}","{\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }","() => []","(task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }","useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }, [])","(task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }","current","task","useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }, [])","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSyntheticTasks([])\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","[assistableDocumentId]","{\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }","_c","value","_temp","<AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>","children","AssistDocumentContext.Provider","_c","props.renderDefault(props)","props.renderDefault","<AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>","_c","{\n children,\n durationMs = 250,\n ref,\n}: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n ref?: Ref<HTMLDivElement>\n}","durationMs = 250","{animationDuration: `${durationMs}ms`}","`${durationMs}ms`","<FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>","_c","state = 'present'","useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }, [scheme])","{\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","{\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }","<Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>","{color: 'inherit'}","<IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>","<Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>","_c","{position: 'relative', background: 'transparent'}","<Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>","<Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>","_c","useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && statusSegment && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])","path.length","tasks\n ?.filter","(task) => !task.ended","(task) => task.presence ?? []","(p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs","(status) => aiPresence(status, path)","task","_c","_temp","_temp2","_temp3","props.renderDefault(props)","props.renderDefault","<AssistField {...props}>{props.children}</AssistField>","isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)","schemaType","singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )","<Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n </Flex>","props.renderDefault({\n ...props,\n\n actions: props.actions,\n\n // Render presence in the internal slot (between presence and the field actions)\n // oxlint-disable-next-line no-deprecated -- the slot is deprecated for external use but exists specifically for this plugin\n __internal_slot: actions,\n })","_c","<PteValueFixer {...props} />","<ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>","onChange","(params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }","useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])","() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }","useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])","() => setError(undefined)","useCallback(() => setError(undefined), [])","<ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>","children","error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack gap={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )","props.renderDefault({...props, value: undefined})","props.renderDefault(props)","props.renderDefault","_c","(patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n }","useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )","props.renderDefault(props)","props.renderDefault","<Box flex={1}>{props.renderDefault(props)}</Box>","singlePresence && <AiFieldPresence presence={singlePresence} />","<Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>","<ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>","_c","props.renderDefault(props)","props.renderDefault","<>{props.renderDefault(props)}</>","<InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>","value","InlineBlockValueContext.Provider","props.value","_c","_Fragment","{position: 'relative'}","props.renderDefault({...props})","<Box flex={1}>{props.renderDefault({...props})}</Box>","presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))","(pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n )","<Flex align=\"center\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>","_c","_temp","createPatchChannel()","useMemo(() => createPatchChannel(), [])","() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }","pair","[documentId, documentStore, documentType, patchChannel]","() => {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n }","() => {\n if (hasRev) {\n // React to changes in hasRev only\n patchChannelPublish()\n }\n }","[hasRev]","() => {\n focusFirstDescendant(formRef.current!)\n }","[]","<Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>","<Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>","ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )","<Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>","_c","DEFAULT_MAX_DEPTH","ABSOLUTE_MAX_DEPTH","<div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>","<Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>","<Box padding={4}>\n <Container width={0}>\n <Stack gap={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>","_c","() => !isFeatureOnboardingDismissed(featureKey)","() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }","useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])","{showOnboarding, dismissOnboarding}","_c","useMemo(() => {\n const refs = getFieldRefs(schemaType.name)\n if (includeDocument) {\n return [getDocumentFieldRef(schemaType), ...refs]\n }\n return refs\n }, [schemaType, includeDocument, getFieldRefs])","schemaType.name","getDocumentFieldRef(schemaType)","fieldRefs.find((f) => f.key === fieldPath)","(f) => f.key === fieldPath","useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )","fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field}))","(field) => (filter ? filter(field) : true)","(f) => !isType(f.schemaType, 'reference')","(field) => ({value: field.key, field})","useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )","useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>\n <field.icon />\n </Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])","useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])","useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])","<Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />","currentField ? currentField.icon : SearchIcon","currentField?.key","option","value","field","field.icon","f","Breadcrumbs","Box","{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }","<Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>","1","splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))","\"none\"","title","(pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n )","<Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>","splitTitle[splitTitle.length - 1]","<Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>","<Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>","_c","_temp","_temp2","_temp3","_temp4","_temp5","_temp6","(n) => n + 1","() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }","[ms]","{date}: {date?: string}","formatDistanceToNow(date ? new Date(date) : new Date())","<span title={timeSince}>{timeSince} ago</span>","_c","_temp","{apiVersion: '2023-01-01'}","(taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n }","useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )","instructions?.find","tasks\n ?.filter","(task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs","task","(a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime()","useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n // oxlint-disable-next-line no-map-spread\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])","titledTasks.some((r) => !r.ended)","(r) => !r.ended","useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])","titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout')","(r) => r.reason === 'error' || r.reason === 'timeout'","useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )","() => setOpen((v) => !v)","(v) => !v","useCallback(() => setOpen((v) => !v), [])","() => {\n setOpen(false)\n }","useCallback(() => {\n setOpen(false)\n }, [])","() => [button, popover]","() => {\n setOpen(false)\n button?.focus()\n }","button?.focus","useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])","<TaskList onEscape={handleEscape} tasks={titledTasks} />","<TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />","!titledTasks?.length","<Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>","open && !!titledTasks?.length","r","<StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />","isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon","hasErrors ? 'critical' : undefined","(event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n }","useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n )","tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))","(task) => (\n <TaskItem key={task._key} task={task} />\n )","<Stack padding={1} gap={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>","TaskIcon && <TaskIcon />","!task.reason && <Spinner />","reason","<Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>","task.title && <>: {task.title}</>","title","<Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>","taskType ? taskType.title : 'Running'","task.message ? <Text size={1}>{task.message}</Text> : null","message","<Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>","task.ended ?? task.started","<Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>","<Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>","!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )","cancel","ended","<Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>","<Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>","taskType && taskType?.tone","_c","_temp","_temp2","_temp3","_temp4","_temp5","_Fragment","isEqual","<Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack gap={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>","<DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />","onClose","<Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>","<a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>","<Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>","<Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>\n </Flex>","context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null","error","!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null","initialized","!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null","status?.initialized","context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )","!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )","context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined","initLoading","<Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />","init","context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`","<Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>","<Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>","<AssistInspector {...props} />","(nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n }","useCallback<PaneRouterContextValue['setParams']>(\n (nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n },\n [parentParams, parentSetParams],\n )","{...parentParams, path: localPath}","{\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }","useMemo<PaneRouterContextValue>(\n () => ({\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }),\n [parentRouter, parentParams, localPath, setParams],\n )","<PaneRouterContext.Provider value={value}>{props.children}</PaneRouterContext.Provider>","children","PaneRouterContext.Provider","{marginTop: '-4px'}","<Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>","<Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>","<Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>","<Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>","showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />","<CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>","_c","_Fragment","mapConnectorToLine(options, {from, to})","useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])","drawConnectorPath(options, line)","<path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />","strokeWidth + 4","bg","rgba(theme.sanity.color.base.border, 0.5)","border","<path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />","line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )","bounds","isAbove","x","options.arrow.marginX","line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )","isBelow","<>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>","_c","_Fragment","() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n // oxlint-disable-next-line react/set-state-in-effect\n setRedraw(true)\n }","[]","{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }","connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))","(connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n )","<svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>","DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })","({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n }","<>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>","{key, from, to}","_c","_temp","_Fragment","() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }","useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])","{\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n }","config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES","(\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n }","maxPathDepth","translationOutputs","languages","l","(l) => l.id","useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )","(\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n }","toLanguages","useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )","async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n }","config?.selectLanguageParams","params","fromLanguage","useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )","{\n openFieldTranslation,\n translationLoading: false,\n }","useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])","!fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)","fieldLanguageMaps?.length","fieldTranslationParams.translatePath","length","() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }","conditionalMembers","documentSchema","translatePath","toLanguages?.find","useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])","{width: '100%'}","<Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />","dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null","<FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>","children","FieldTranslationContext.Provider","() => toggleToLanguage(checkboxLanguage, toLanguages, languages)","useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )","langId === fromLanguage?.id ? {opacity: 0.5} : undefined","id","langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)","<Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />","langId === fromLanguage?.id","<Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>","checkboxLanguage.title ?? langId","<Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>","() => selectFromLanguage(radioLanguage, languages, fieldTranslationParams)","useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )","<Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />","<Text>{radioLanguage.title ?? radioLanguage.id}</Text>","radioLanguage.title ?? radioLanguage.id","<Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>","_c","_temp","_temp2","createFieldRefs","serializeSchema(schema, {leanFormat: true})","useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])","() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n })\n }","[getInstructStatus]","async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }","status","e","useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])","{\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }","useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }\n }, [\n config,\n status,\n init,\n statusLoading,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n ])","<AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>","AiAssistanceConfigContext.Provider","createFieldRefCache(maxFieldSelectionDepth)","function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }","{\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }","documentType","useMemo(() => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n\n function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }\n\n return {\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }\n }, [schema, maxFieldSelectionDepth])","_c","[]","props.renderDefault(props)","props.renderDefault","<ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>","<RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>","<AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>","config","props.config","_c","{\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n }","() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !documentIsSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n // oxlint-disable-next-line react/set-state-in-effect\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaptionWhenDraftReady({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }","[\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaptionWhenDraftReady,\n documentIsSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ]","descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined","imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined","descriptionField","{\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }","useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])","props.renderDefault(props)","props.renderDefault","<ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>","ImageContext.Provider","_c","Object.keys(icons)\n .filter(isIconSymbol)","Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />)","useMemo(\n () =>\n Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />),\n [onChange],\n )","getIcon(value)","useMemo(() => getIcon(value), [value])","<Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />","{maxHeight: 300}","<Menu style={{maxHeight: 300}}>{items}</Menu>","{portal: true}","<MenuButton\n button={\n <Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />","{\n iconKey: key,\n onChange,\n}: {\n iconKey: IconSymbol\n onChange: StringInputProps['onChange']\n}","() => onChange(set(key))","useCallback(() => onChange(set(key)), [onChange, key])","<Icon symbol={key} />","<MenuItem icon={<Icon symbol={key} />} title={key} text={key} onClick={onClick} />","_c","isAssistSupported(schemaType)","useMemo(() => isAssistSupported(schemaType), [schemaType])","_c","node","node","node","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>","['bottom']","<Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>","_c","<Icon symbol={getIcon(instruction.icon)} />","_c","useMemo(() => {\n const anyPresence = [...(assistDocument?.tasks ?? []), ...(syntheticTasks ?? [])]\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n // oxlint-disable-next-line react/purity\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n // oxlint-disable-next-line react/purity\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks, syntheticTasks])","tasks","(run) => !run.ended && !run.reason","(run) => run.presence ?? []","(f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000","anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined","anyPresence","anyPresence && <AiFieldPresence presence={anyPresence} />","<Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>","f","run","_c","_temp","_temp2","_temp3","_temp4","() => openInspector(aiInspectorId, {[instructionParam]: undefined as any})","useCallback(\n // oxlint-disable-next-line no-unsafe-type-assertion\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )","<div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n gap={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>","_c","<Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>","<AssistDocumentFormEditable {...props} />","useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])","(fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key","useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])","['fields', {_key: activeKey}]","instruction ? [...base, 'instructions', {_key: instruction}] : base","useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])","schema.get(targetDocumentType)","{\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }","fieldSchema ?? documentSchema","useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )","() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }","[title, documentSchema, onChange, id]","id?.startsWith","useFormCallbacks()","(path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n }","{\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }","useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )","() => {\n if (activePath && !instruction) {\n onPathOpen(activePath)\n }\n }","[activePath, instruction, onPathOpen]","useMemo(() => {\n const fieldError = props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )\n if (fieldError) {\n return <MemberFieldError member={fieldError} />\n }\n return undefined\n }, [props.members])","props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )","members","(m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields'","<MemberFieldError member={fieldError} />","fieldError","<FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />","instruction && <BackToInstructionListLink />","activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )","!activePath && props.renderDefault(props)","props.renderDefault","<Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>","<SelectedFieldContextProvider value={context}>\n <Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>","useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])","stringToPath(fieldPath)","{\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}","{__presets: presets}","fields?.find((f) => f._key === pathKey)","fields?.find","useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])","presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )","fields","existingInstructions?.some","f","() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map((preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }","missingPresetInstructions?.length","(preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })","[activePath, onChange, pathKey, existingField, missingPresetInstructions]","(p) => ({markDefs: [], ...p})","_c","_temp","_temp3","_temp2","{width: '100%'}","<Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>","selectedField?.title ?? 'Select field'","<Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {/* oxlint-disable-next-line no-unsafe-type-assertion */}\n {actions as any}\n </Flex>","actions as any","_c","() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }","id","useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])","{margin: '-3px 0'}","<div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>","elementProps","`${!value}`","!value","<Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>","<Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>","_c","() => {\n ref.current?.querySelector('input')?.focus()\n }","[]","(path: string) => onChange(set(path))","useCallback((path: string) => onChange(set(path)), [onChange])","(field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n }","(s) => s.includes('|')","useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )","props.renderDefault(props)","props.renderDefault","{minWidth: 300}","<Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>","value","_c","_temp","[4, 4, 4, 5]","<Stack gap={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>","{fieldName, ...props}: ObjectInputProps & {fieldName: string}","findFieldMember(props.members, fieldName)","members","member ? <ObjectInputMember {...props} member={member} /> : null","useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])","{\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n }","titleMember?.field.schemaType","{\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n }","titleMember?.field","{\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }","<Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>","<Text muted size={1}>\n How this instruction appears in menus\n </Text>","iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )","moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )","<Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>","<Stack gap={5}>\n <Stack gap={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>","findFieldMember(members, 'userId')","visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />","<>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>","_c","_Fragment","<EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>","{\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}","() => setOpen(true)","useCallback(() => setOpen(true), [])","() => setOpen(false)","useCallback(() => setOpen(false), [])","_c","<ObjectOutputInput {...props} fieldSchema={fieldSchema} />","<ArrayOutputInput {...props} fieldSchema={fieldSchema} />","() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }","[allowedValues, value, onChange]","value?.filter","{\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}","fieldSchema.fields.filter((field) => isAssistSupported(field.type))","fields","(field) => isAssistSupported(field.type)","useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )","(checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n }","length","(field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n })","useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )","fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })","(field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n }","field","<Stack gap={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>","{\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}","fieldSchema.of.filter((itemType) => isAssistSupported(itemType))","of","(itemType) => isAssistSupported(itemType)","useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )","(checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n }","(field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n })","useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )","ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })","(itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n }","itemType","<Stack gap={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>","{\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}","!arrayValue?.length || !!arrayValue?.find((v) => v._key === value)","arrayValue?.length","() => onChange(checked, value)","useCallback(() => onChange(checked, value), [onChange, checked, value])","<Checkbox checked={checked} onChange={handleChange} />","{cursor: 'default'}","<Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>","<Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>","<Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>","_c","_temp","_temp2","<Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>","props.renderDefault(props)","props.renderDefault","<PteMods>\n <Stack gap={3}>\n <Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n\n {props.renderDefault(props)}\n </Stack>\n </PteMods>","() => {\n // Legacy alpha documents only need this conversion once on first load.\n if (didRunRef.current) {\n return\n }\n didRunRef.current = true\n\n let needsFix = false\n // oxlint-disable-next-line no-unsafe-type-assertion\n const val = ((value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block],\n })\n })\n\n if (needsFix) {\n onChange(set(val))\n }\n }","[onChange, value]","_c","originalValue ?? []","(originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id)","id","(v) => !v.userId || v.userId === user?.id","useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )","originalMembers ?? []","(originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n })","(v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }","v","value","useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )","props.renderDefault({...props, value, members})","_c","() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }","[ref]","props.renderDefault(props)","props.renderDefault","<Box ref={ref}>{props.renderDefault(props)}</Box>","_c","params: Params = DEFAULT_PARAMS","options: ListenQueryOptions = DEFAULT_OPTIONS","{apiVersion: `v2022-05-09`}","() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(true)\n setLoading(false)\n setData(null)\n\n return of(null)\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }","[query, params, options, client]","{loading, error, data}","_c","isEqual","{apiVersion: '2023-01-01'}","{\n type: assistSerializedTypeName,\n }","serializeSchema(schema)","useMemo(() => {\n return serializeSchema(schema)\n }, [schema])","() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }","types.length","useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])","{height: 'calc(100vh - 81px)'}","saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon","<Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>","<Label>Studio schema</Label>","types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))","(type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n )","<Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>","<Label>Stored schema</Label>","(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))","data ?? NO_DATA","<Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>","<Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>","<Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack gap={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>","type","{schemaStub}: {schemaStub: SerializedSchemaType}","JSON.stringify(schemaStub, null, 2)","useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])","<pre>{out}</pre>","_c","\"fontSize\"","\"rev\"","\"title\""],"sources":["../src/_lib/connector/helpers.ts","../src/_lib/connector/useRegionRects.ts","../src/_lib/connector/ConnectorRegion.tsx","../src/_lib/connector/ConnectorsStoreContext.ts","../src/_lib/connector/useConnectorsStore.ts","../src/_lib/connector/ConnectFromRegion.tsx","../src/_lib/connector/ConnectorsStore.ts","../src/_lib/connector/ConnectorsProvider.tsx","../src/_lib/connector/mapConnectorToLine.ts","../src/_lib/form/constants.ts","../src/types.ts","../src/helpers/misc.ts","../src/helpers/typeUtils.ts","../src/helpers/assistSupported.ts","../src/onboarding/FirstAssistedPathProvider.tsx","../src/constants.ts","../src/helpers/ids.ts","../src/assistDocument/hooks/useDocumentState.ts","../src/assistDocument/hooks/useStudioAssistDocument.ts","../src/assistDocument/hooks/useInstructionToaster.tsx","../src/assistDocument/AssistDocumentInput.tsx","../src/assistDocument/AssistDocumentContext.tsx","../src/assistLayout/AiAssistanceConfigContext.tsx","../src/assistInspector/helpers.ts","../src/useApiClient.ts","../src/assistLayout/RunInstructionProvider.tsx","../src/assistDocument/useDraftDelayedTask.ts","../src/assistDocument/RequestRunInstructionProvider.tsx","../src/assistDocument/hooks/useAssistDocumentContextValue.tsx","../src/assistDocument/AssistDocumentContextProvider.tsx","../src/assistDocument/AssistDocumentLayout.tsx","../src/components/FadeInContent.tsx","../src/presence/AssistAvatar.tsx","../src/presence/AiFieldPresence.tsx","../src/presence/useAssistPresence.ts","../src/assistFormComponents/AssistField.tsx","../src/components/SafeValueInput.tsx","../src/assistFormComponents/AssistFormBlock.tsx","../src/assistFormComponents/AssistInlineFormBlock.tsx","../src/assistFormComponents/AssistItem.tsx","../src/_lib/form/DocumentForm.tsx","../src/assistDocument/components/AssistTypeContext.tsx","../src/helpers/conditionalMembers.ts","../src/onboarding/InspectorOnboarding.tsx","../src/onboarding/onboardingStore.ts","../src/assistInspector/FieldAutocomplete.tsx","../src/components/TimeAgo.tsx","../src/assistInspector/InstructionTaskHistoryButton.tsx","../src/assistInspector/isolatePathParams.ts","../src/assistInspector/AssistInspector.tsx","../src/assistInspector/constants.ts","../src/assistInspector/index.ts","../src/assistConnectors/draw/arrowPath.ts","../src/assistConnectors/draw/connectorPath.ts","../src/assistConnectors/ConnectorPath.tsx","../src/assistConnectors/AssistConnectorsOverlay.tsx","../src/helpers/styleguide.ts","../src/translate/getLanguageParams.ts","../src/translate/languageStore.ts","../src/_lib/randomKey.ts","../src/translate/paths.ts","../src/translate/FieldTranslationProvider.tsx","../src/schemas/serialize/schemaUtils.ts","../src/schemas/serialize/serializeSchema.ts","../src/assistLayout/fieldRefCache.tsx","../src/assistLayout/AiAssistanceConfigProvider.tsx","../src/assistLayout/AssistLayout.tsx","../src/components/ImageContext.tsx","../src/assistDocument/components/instruction/appearance/IconInput.tsx","../src/helpers/useAssistSupported.ts","../src/translate/translateActions.tsx","../src/fieldActions/customFieldActions.tsx","../src/fieldActions/generateCaptionActions.tsx","../src/fieldActions/generateImageActions.tsx","../src/fieldActions/PrivateIcon.tsx","../src/fieldActions/assistFieldActions.tsx","../src/presence/AssistDocumentPresence.tsx","../src/assistDocument/components/instruction/BackToInstructionsLink.tsx","../src/assistDocument/components/SelectedFieldContext.tsx","../src/assistDocument/components/AssistDocumentForm.tsx","../src/assistDocument/components/FieldRefPreview.tsx","../src/assistDocument/components/generic/HiddenFieldTitle.tsx","../src/assistDocument/components/instruction/appearance/InstructionVisibility.tsx","../src/assistDocument/components/instruction/FieldRefInput.tsx","../src/assistDocument/components/helpers.ts","../src/assistDocument/components/instruction/InstructionInput.tsx","../src/assistDocument/components/instruction/InstructionOutputField.tsx","../src/assistDocument/components/instruction/InstructionOutputInput.tsx","../src/assistDocument/components/instruction/PromptInput.tsx","../src/assistDocument/components/InstructionsArrayField.tsx","../src/assistDocument/components/InstructionsArrayInput.tsx","../src/components/HideReferenceChangedBannerInput.tsx","../src/schemas/contextDocumentSchema.tsx","../src/schemas/assistDocumentSchema.tsx","../src/schemas/index.ts","../src/plugin.tsx","../src/_lib/fixedListenQuery.ts","../src/_lib/useListeningQuery.ts","../src/schemas/serialize/SchemTypeTool.tsx","../src/fieldActions/useUserInput.ts"],"sourcesContent":["export function hasOverflowScroll(el: HTMLElement): boolean {\n const overflow = getComputedStyle(el).overflow\n\n return overflow.includes('auto') || overflow.includes('hidden') || overflow.includes('scroll')\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\n\nimport {hasOverflowScroll} from './helpers'\nimport type {Rect, Scroll} from './types'\n\nexport function useRegionRects() {\n const ref = useRef<HTMLDivElement>(null)\n\n const [relativeBoundsRect, setRelativeBoundsRect] = useState<Rect | null>(null)\n const [relativeElementRect, setRelativeElementRect] = useState<Rect | null>(null)\n const [boundsScroll, setBoundsScroll] = useState<Scroll>({x: 0, y: 0})\n const [scroll, setScroll] = useState<Scroll>({x: 0, y: 0})\n\n const boundsScrollXRef = useRef(0)\n const boundsScrollYRef = useRef(0)\n\n const elementScrollXRef = useRef(0)\n const elementScrollYRef = useRef(0)\n\n useEffect(() => {\n const el = ref.current\n\n if (!el) return undefined\n\n const scrollParents: HTMLElement[] = []\n let parent = el.parentElement\n\n while (parent && parent !== document.body) {\n if (\n hasOverflowScroll(parent)\n // || parent.scrollHeight > parent.clientHeight\n ) {\n scrollParents.push(parent)\n }\n\n parent = parent.parentElement\n }\n\n function handleResize() {\n const scrollParent = scrollParents[0]\n\n const boundsRect = scrollParent?.getBoundingClientRect() || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n\n const domRect = el!.getBoundingClientRect()\n\n setRelativeBoundsRect({\n x: boundsRect.x + boundsScrollXRef.current,\n y: boundsRect.y + boundsScrollYRef.current,\n w: boundsRect.width,\n h: boundsRect.height,\n })\n\n setRelativeElementRect({\n x: domRect.x + elementScrollXRef.current,\n y: domRect.y + elementScrollYRef.current,\n w: domRect.width,\n h: domRect.height,\n })\n }\n\n function handleScroll() {\n let scrollX = window.scrollX\n let scrollY = window.scrollY\n\n for (const scrollParent of scrollParents) {\n scrollX += scrollParent.scrollLeft\n scrollY += scrollParent.scrollTop\n }\n\n const scrollParent = scrollParents[0]\n\n boundsScrollXRef.current = scrollX - (scrollParent?.scrollLeft || window.scrollX)\n\n boundsScrollYRef.current = scrollY - (scrollParent?.scrollTop || window.scrollY)\n\n setBoundsScroll({\n x: boundsScrollXRef.current,\n y: boundsScrollYRef.current,\n })\n\n elementScrollXRef.current = scrollX\n elementScrollYRef.current = scrollY\n\n setScroll({x: scrollX, y: scrollY})\n }\n\n window.addEventListener('scroll', handleScroll, {passive: true})\n\n const ro = new ResizeObserver(handleResize)\n\n ro.observe(el)\n\n for (const scrollParent of scrollParents) {\n scrollParent.addEventListener('scroll', handleScroll, {passive: true})\n ro.observe(scrollParent)\n }\n\n handleScroll()\n\n return () => {\n ro.unobserve(el)\n\n for (const scrollParent of scrollParents) {\n ro.unobserve(scrollParent)\n scrollParent.removeEventListener('scroll', handleScroll)\n }\n\n ro.disconnect()\n\n window.removeEventListener('scroll', handleScroll)\n }\n }, [])\n\n const bounds: Rect | null = useMemo(\n () =>\n relativeBoundsRect && {\n x: relativeBoundsRect.x - boundsScroll.x,\n y: relativeBoundsRect.y - boundsScroll.y,\n w: relativeBoundsRect.w,\n h: relativeBoundsRect.h,\n },\n [relativeBoundsRect, boundsScroll],\n )\n\n const element: Rect | null = useMemo(\n () =>\n relativeElementRect && {\n x: relativeElementRect.x - scroll.x,\n y: relativeElementRect.y - scroll.y,\n w: relativeElementRect.w,\n h: relativeElementRect.h,\n },\n [relativeElementRect, scroll],\n )\n\n return {bounds, element, ref}\n}\n","import {type HTMLProps, useEffect} from 'react'\n\nimport type {ConnectorRegionRects} from './types'\nimport {useRegionRects} from './useRegionRects'\n\nexport function ConnectorRegion(\n props: {\n onRectsChange?: (rects: ConnectorRegionRects | null) => void\n } & HTMLProps<HTMLDivElement>,\n) {\n const {children, onRectsChange, ...restProps} = props\n\n const {bounds, element, ref} = useRegionRects()\n\n useEffect(() => {\n onRectsChange?.(bounds && element ? {bounds, element} : null)\n }, [bounds, element, onRectsChange])\n\n return (\n <div {...restProps} ref={ref}>\n {children}\n </div>\n )\n}\n","import {createContext} from 'react'\n\nimport type {ConnectorsStore} from './ConnectorsStore'\n\nexport const ConnectorsStoreContext = createContext<ConnectorsStore | null>(null)\n","import {useContext} from 'react'\n\nimport type {ConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\n\nexport function useConnectorsStore(): ConnectorsStore {\n const store = useContext(ConnectorsStoreContext)\n\n if (!store) {\n throw new Error('Missing connectors store context')\n }\n\n return store\n}\n","import {type HTMLProps, useEffect, useState} from 'react'\n\nimport {ConnectorRegion} from './ConnectorRegion'\nimport type {ConnectorRegionRects} from './types'\nimport {useConnectorsStore} from './useConnectorsStore'\n\nexport function ConnectFromRegion(\n props: {_key: string; zIndex: number} & HTMLProps<HTMLDivElement>,\n) {\n const {children, _key: key, zIndex, ...restProps} = props\n const store = useConnectorsStore()\n const [rects, setRects] = useState<ConnectorRegionRects | null>(null)\n\n useEffect(() => store.from.subscribe(key, {zIndex}), [key, store, zIndex])\n\n useEffect(() => {\n if (rects) store.from.next(key, rects)\n }, [key, rects, store])\n\n return (\n <ConnectorRegion {...restProps} onRectsChange={setRects}>\n {children}\n </ConnectorRegion>\n )\n}\n","import type {Connector, ConnectorRegionRects} from './types'\n\nexport interface ConnectorsStore {\n connectors: {\n subscribe: (observer: (connectors: Connector[]) => void) => () => void\n }\n\n from: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n\n to: {\n subscribe: (key: string, payload?: Record<string, unknown>) => () => void\n next: (key: string, rects: ConnectorRegionRects) => void\n }\n}\n\nexport function createConnectorsStore(): ConnectorsStore {\n const configKeys: string[] = []\n const fieldKeys: string[] = []\n\n const channels = {\n from: new Map<string, ConnectorRegionRects | null>(),\n to: new Map<string, ConnectorRegionRects | null>(),\n }\n\n const payloads = {\n from: new Map<string, Record<string, unknown> | undefined>(),\n to: new Map<string, Record<string, unknown> | undefined>(),\n }\n\n const observers: ((connectors: Connector[]) => void)[] = []\n\n function notifyObservers() {\n const connectors: Connector[] = []\n\n for (const key of configKeys) {\n const toRects = channels.to.get(key)\n const toPayload = payloads.from.get(key)\n\n const fromRects = channels.from.get(key)\n const fromPayload = payloads.from.get(key)\n\n if (toRects && fromRects) {\n connectors.push({\n key,\n from: {...fromRects, payload: fromPayload},\n to: {...toRects, payload: toPayload},\n })\n }\n }\n\n for (const observer of observers) {\n observer(connectors)\n }\n }\n\n return {\n to: {\n subscribe(key, payload) {\n channels.to.set(key, null)\n payloads.to.set(key, payload)\n\n configKeys.push(key)\n\n return () => {\n channels.to.delete(key)\n payloads.to.delete(key)\n\n const idx = configKeys.indexOf(key)\n\n if (idx > -1) configKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.to.set(key, rects)\n\n if (fieldKeys.includes(key)) notifyObservers()\n },\n },\n\n connectors: {\n subscribe(observer) {\n observers.push(observer)\n\n return () => {\n const idx = observers.indexOf(observer)\n\n if (idx > -1) observers.splice(idx, 1)\n }\n },\n },\n\n from: {\n subscribe(key, payload) {\n channels.from.set(key, null)\n payloads.from.set(key, payload)\n\n fieldKeys.push(key)\n\n return () => {\n channels.from.delete(key)\n payloads.from.delete(key)\n\n const idx = fieldKeys.indexOf(key)\n\n if (idx > -1) fieldKeys.splice(idx, 1)\n\n notifyObservers()\n }\n },\n next(key, rects) {\n channels.from.set(key, rects)\n\n if (configKeys.includes(key)) notifyObservers()\n },\n },\n }\n}\n","import {type ReactNode, useEffect, useMemo} from 'react'\n\nimport {type ConnectorsStore, createConnectorsStore} from './ConnectorsStore'\nimport {ConnectorsStoreContext} from './ConnectorsStoreContext'\nimport type {Connector} from './types'\n\nexport function ConnectorsProvider(props: {\n children?: ReactNode\n onConnectorsChange?: (connectors: Connector[]) => void\n}) {\n const {children, onConnectorsChange} = props\n const store: ConnectorsStore = useMemo(() => createConnectorsStore(), [])\n\n useEffect(\n () => onConnectorsChange && store.connectors.subscribe(onConnectorsChange),\n [onConnectorsChange, store],\n )\n\n return <ConnectorsStoreContext.Provider value={store}>{children}</ConnectorsStoreContext.Provider>\n}\n","import type {\n ConnectorLine,\n ConnectorLinePoint,\n ConnectorOptions,\n ConnectorRegionRects,\n Rect,\n} from './types'\n\nfunction getConnectorLinePoint(\n options: ConnectorOptions,\n rect: Rect,\n bounds: Rect,\n): ConnectorLinePoint {\n const centerY = rect.y + rect.h / 2\n const isAbove = rect.y + rect.h < bounds.y + options.arrow.marginY\n const isBelow = rect.y > bounds.y + bounds.h - options.arrow.marginY\n\n return {\n bounds,\n x: rect.x,\n y: centerY,\n centerY,\n startY: rect.y + options.path.marginY,\n endY: rect.y + rect.h - options.path.marginY,\n isAbove,\n isBelow,\n outOfBounds: isAbove || isBelow,\n }\n}\n\nexport function mapConnectorToLine(\n options: ConnectorOptions,\n connector: {from: ConnectorRegionRects; to: ConnectorRegionRects},\n): ConnectorLine {\n const fromBounds: Rect = {\n y: connector.from.bounds.y + options.arrow.threshold,\n // bottom: connector.from.bounds.y + connector.from.bounds.h - options.arrow.threshold,\n x: connector.from.bounds.x,\n // right: connector.from.bounds.x + connector.from.bounds.w,\n w: connector.from.bounds.w,\n h: connector.from.bounds.h - options.arrow.threshold * 2,\n }\n\n const from = getConnectorLinePoint(options, connector.from.element, fromBounds)\n from.x = connector.from.element.x + connector.from.element.w // + 1\n\n const fromBottom = fromBounds.y + fromBounds.h\n\n const toBounds: Rect = {\n y: connector.to.bounds.y + options.arrow.threshold,\n // bottom: connector.to.bounds.y + connector.to.bounds.h - options.arrow.threshold,\n x: connector.to.bounds.x,\n // right: connector.to.bounds.x + connector.to.bounds.w,\n w: connector.to.bounds.w,\n h: connector.to.bounds.h - options.arrow.threshold * 2,\n }\n\n const toBottom = toBounds.y + toBounds.h\n\n const to = getConnectorLinePoint(options, connector.to.element, toBounds)\n\n const maxStartY = Math.max(to.startY, from.startY)\n\n // Align from <-> to vertically\n from.y = Math.min(maxStartY, from.endY)\n if (from.y < toBounds.y) {\n from.y = Math.min(toBounds.y, from.endY)\n } else if (from.y > toBottom) {\n from.y = Math.max(toBottom, from.startY)\n }\n to.y = Math.min(maxStartY, to.endY)\n if (to.y < fromBounds.y) {\n to.y = Math.min(fromBounds.y, to.endY)\n } else if (to.y > fromBottom) {\n to.y = Math.max(fromBottom, to.startY)\n }\n\n // Keep within bounds\n from.y = Math.min(Math.max(from.y, fromBounds.y), fromBottom)\n to.y = Math.min(Math.max(to.y, toBounds.y), toBottom)\n\n return {from, to}\n}\n","export const assistFormId = 'assist'\n","import type {\n PortableTextBlock,\n PortableTextMarkDefinition,\n PortableTextSpan,\n} from '@portabletext/types'\nimport type {SanityDocument} from 'sanity'\n\n//id prefixes\nexport const assistDocumentIdPrefix = 'sanity.assist.schemaType.'\nexport const assistDocumentStatusIdPrefix = 'sanity.assist.status.'\nexport const assistSchemaIdPrefix = 'sanity.assist.schema.'\n\n// type names\nexport const assistDocumentTypeName = 'sanity.assist.schemaType.annotations' as const\nexport const assistFieldTypeName = 'sanity.assist.schemaType.field' as const\nexport const instructionTypeName = 'sanity.assist.instruction' as const\nexport const promptTypeName = 'sanity.assist.instruction.prompt' as const\n\nexport const userInputTypeName = 'sanity.assist.instruction.userInput' as const\nexport const instructionContextTypeName = 'sanity.assist.instruction.context' as const\nexport const fieldReferenceTypeName = 'sanity.assist.instruction.fieldRef' as const\n\n// user-facing type. Intentionally does not have sanity. prefix\nexport const contextDocumentTypeName = 'assist.instruction.context' as const\n\nexport const assistTasksStatusTypeName = 'sanity.assist.task.status' as const\nexport const instructionTaskTypeName = 'sanity.assist.instructionTask' as const\nexport const fieldPresenceTypeName = 'sanity.assist.instructionTask.presence' as const\n\nexport const assistSerializedTypeName = 'sanity.assist.serialized.type' as const\nexport const assistSerializedFieldTypeName = 'sanity.assist.serialized.field' as const\n\nexport const outputFieldTypeName = 'sanity.assist.output.field' as const\nexport const outputTypeTypeName = 'sanity.assist.output.type' as const\n\n//url params\nconst inspectParam = 'inspect' as const\nexport const fieldPathParam = 'pathKey' as const\nexport const instructionParam = 'instruction' as const\n\n// other constants\nexport const documentRootKey = '<document>'\n\nexport type SerializedSchemaMember = Omit<SerializedSchemaType, 'name' | '_type'> & {\n _type?: typeof assistSerializedFieldTypeName\n name?: string\n}\n\nexport interface SerializedSchemaType {\n _type?: typeof assistSerializedTypeName\n _id?: string\n type: string\n name: string\n title?: string\n fields?: SerializedSchemaMember[]\n of?: SerializedSchemaMember[]\n to?: SerializedSchemaMember[]\n annotations?: SerializedSchemaMember[]\n inlineOf?: SerializedSchemaMember[]\n values?: string[] | {value: string; title?: string}[]\n hidden?: boolean | 'function'\n readOnly?: boolean | 'function'\n options?: {\n /** equivalent to options.aiAssist.imageDescriptionField - not renamed in the api for backwards compatibility */\n imagePromptField?: string\n embeddingsIndex?: string\n }\n}\n\nexport interface AssistDocument extends SanityDocument {\n fields?: AssistField[]\n instructions?: StudioInstruction[]\n}\n\nexport interface PresetInstruction {\n _key: string\n prompt?: PromptTextBlock[]\n\n title?: string\n /**\n * String key from `@sanity/icons` IconMap\n */\n icon?: string\n\n /**\n * Type/field filter\n */\n output?: (OutputFieldItem | OutputTypeItem)[]\n}\n\nexport interface PresetField {\n path?: string\n instructions?: PresetInstruction[]\n}\n\nexport interface AssistPreset {\n fields?: PresetField[]\n}\n\nexport interface SanityAssistDocument {\n _id: string\n _type: typeof assistDocumentTypeName\n fields?: StudioAssistField[]\n}\n\nexport interface StudioAssistDocument extends SanityAssistDocument {\n // added after loading\n tasks?: InstructionTask[]\n}\n\nexport interface AssistField {\n _key: string\n _type: typeof assistFieldTypeName\n path?: string\n instructions?: StudioInstruction[]\n}\n\nexport interface StudioAssistField {\n _key: string\n path?: string\n instructions?: StudioInstruction[]\n\n // added\n tasks?: InstructionTask[]\n}\n\nexport interface FieldRef extends PortableTextMarkDefinition {\n _type: typeof fieldReferenceTypeName\n path?: string\n}\n\nexport interface ContextBlock {\n _type: typeof instructionContextTypeName\n reference?: {\n _type: 'reference'\n _ref?: string\n }\n}\n\nexport interface UserInputBlock {\n _type: typeof userInputTypeName\n _key: string\n message?: string\n description?: string\n}\n\nexport type InlinePromptBlock = PortableTextSpan | FieldRef | UserInputBlock | ContextBlock\nexport type PromptTextBlock = Omit<\n PortableTextBlock<never, InlinePromptBlock, 'normal', never>,\n '_type'\n> & {_type: 'block'}\n\nexport type PromptBlock = PromptTextBlock | FieldRef | ContextBlock | UserInputBlock\n\nexport interface AiPresence {\n _key: string\n _type: typeof fieldPresenceTypeName\n path?: string\n started?: string\n}\n\nexport type TaskEndedReason = 'success' | 'error' | 'aborted' | 'timeout'\n\nexport interface InstructionTask {\n _key: string\n _type: typeof instructionTaskTypeName\n instructionKey?: string\n title?: string\n path?: string\n started?: string\n updated?: string\n ended?: string\n message?: string\n reason?: TaskEndedReason\n presence?: AiPresence[]\n startedByUserId?: string\n\n //added by studio\n instruction?: StudioInstruction\n}\n\nexport interface StudioInstruction {\n _key: string\n _type: typeof instructionTypeName\n prompt?: PromptBlock[]\n\n icon?: string\n userId?: string\n title?: string\n placeholder?: string\n output?: (OutputFieldItem | OutputTypeItem)[]\n\n //added after query / synthetic fields\n tasks?: InstructionTask[]\n}\n\nexport interface AssistTasksStatus {\n _id: string\n _type: typeof assistTasksStatusTypeName\n tasks?: InstructionTask[]\n}\n\nexport interface AssistInspectorRouteParams {\n [inspectParam]?: string\n [fieldPathParam]?: string\n [instructionParam]?: string\n}\n\nexport interface OutputFieldItem {\n _type: typeof outputFieldTypeName\n _key: string\n //path relative to the field the instruction is for (same as _key)\n relativePath?: string\n}\n\nexport interface OutputTypeItem {\n _type: typeof outputTypeTypeName\n _key: string\n /* array item type name */\n type?: string\n //path relative to the array-field the instruction is for, can be empty string (the array itself, same as _key)\n relativePath?: string\n}\n","import {useMemo} from 'react'\nimport {type Path, pathToString} from 'sanity'\n\nimport {documentRootKey, type StudioInstruction} from '../types'\n\nexport function usePathKey(path: Path | string) {\n return useMemo(() => {\n return getPathKey(path)\n }, [path])\n}\n\nfunction getPathKey(path: Path | string) {\n if (path.length) {\n return Array.isArray(path) ? pathToString(path) : path\n }\n return documentRootKey\n}\n\nexport function getInstructionTitle(instruction?: StudioInstruction) {\n return instruction?.title ?? 'Untitled'\n}\n\nexport function isDefined<T>(t: T | undefined | null): t is T {\n return t !== undefined && t !== null\n}\n","import type {ArraySchemaType, ImageOptions, SchemaType} from 'sanity'\n\nexport function isPortableTextArray(type: ArraySchemaType) {\n return type.of.find((t) => isType(t, 'block'))\n}\n\n/**\n * Returns true if the `schemaType` or any of its parent types (`schemaType.type`)` has `name` equal\n * to `typeName`.\n *\n * Useful for checking if `schemaType` is a type alias of `ìmage`, `code` or similar.\n */\nexport function isType(schemaType: SchemaType, typeName: string): boolean {\n if (schemaType.name === typeName) {\n return true\n }\n if (!schemaType.type) {\n return false\n }\n return isType(schemaType.type, typeName)\n}\n\nexport function isImage(schemaType: SchemaType) {\n return isType(schemaType, 'image')\n}\n\nexport function getDescriptionFieldOption(\n schemaType: SchemaType | undefined,\n): {path: string; updateOnImageChange: boolean} | undefined {\n if (!schemaType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const descriptionField = (schemaType.options as ImageOptions)?.aiAssist?.imageDescriptionField\n if (typeof descriptionField === 'string') {\n return {\n path: descriptionField,\n updateOnImageChange: true,\n }\n } else if (descriptionField) {\n return {\n path: descriptionField.path,\n updateOnImageChange: descriptionField.updateOnImageChange ?? true,\n }\n }\n return getDescriptionFieldOption(schemaType.type)\n}\n\nexport function getImageInstructionFieldOption(\n schemaType: SchemaType | undefined,\n): string | undefined {\n if (!schemaType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const imageInstructionField = (schemaType.options as ImageOptions)?.aiAssist\n ?.imageInstructionField\n if (imageInstructionField) {\n return imageInstructionField\n }\n return getImageInstructionFieldOption(schemaType.type)\n}\n","import type {ReferenceOptions, SchemaType} from 'sanity'\n\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {isType} from './typeUtils'\n\nexport function isSchemaAssistEnabled(type: SchemaType) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return !(type.options as AssistOptions | undefined)?.aiAssist?.exclude\n}\n\nexport function isAssistSupported(type: SchemaType) {\n if (!isSchemaAssistEnabled(type)) {\n return false\n }\n\n if (isDisabled(type)) {\n return false\n }\n\n if (type.jsonType === 'array') {\n const unsupportedArray = type.of.every((t) => isDisabled(t))\n return !unsupportedArray\n }\n\n if (type.jsonType === 'object') {\n const unsupportedObject = type.fields.every((field) => isDisabled(field.type))\n return (\n !unsupportedObject ||\n /* to allow attaching custom actions on fieldless images */\n isType(type, 'image')\n )\n }\n return true\n}\n\nfunction isDisabled(type: SchemaType) {\n return !isSchemaAssistEnabled(type) || isUnsupportedType(type)\n}\n\nfunction isUnsupportedType(type: SchemaType) {\n return (\n type.name === 'sanity.imageCrop' ||\n type.name === 'sanity.imageHotspot' ||\n isType(type, 'globalDocumentReference') ||\n (isType(type, 'reference') &&\n // oxlint-disable-next-line no-unsafe-type-assertion\n !(type?.options as ReferenceOptions)?.aiAssist?.embeddingsIndex) ||\n isType(type, 'crossDatasetReference') ||\n isType(type, 'file')\n )\n}\n","import {createContext, type PropsWithChildren, useMemo} from 'react'\nimport {type FieldMember, type ObjectInputProps, pathToString} from 'sanity'\n\nimport {isAssistSupported} from '../helpers/assistSupported'\n\nconst FirstAssistedPathContext = createContext<string | undefined>(undefined)\n\nexport interface FirstAssistedPathProviderProps {\n members: ObjectInputProps['members']\n}\n\nexport function FirstAssistedPathProvider(\n props: PropsWithChildren<FirstAssistedPathProviderProps>,\n) {\n const {members} = props\n\n const firstAssistedPath = useMemo(() => {\n const firstAssisted = members.find(\n (member): member is FieldMember =>\n member.kind === 'field' && isAssistSupported(member.field.schemaType),\n )\n return firstAssisted?.field.path ? pathToString(firstAssisted?.field.path) : undefined\n }, [members])\n\n return (\n <FirstAssistedPathContext.Provider value={firstAssistedPath}>\n {props.children}\n </FirstAssistedPathContext.Provider>\n )\n}\n","import {minutesToMilliseconds} from 'date-fns/minutesToMilliseconds'\n\nexport const releaseAnnouncementUrl =\n 'https://www.sanity.io/blog/sanity-ai-assist-announcement?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const instructionGuideUrl =\n 'https://sanity.io/guides/getting-started-with-ai-assist-instructions?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const giveFeedbackUrl = 'https://forms.gle/Kwz7CThxGeA2GiEU8'\n\nexport const salesUrl =\n 'https://www.sanity.io/contact/sales?utm_source=sanity-assist-plugin&utm_medium=organic_social&utm_campaign=ai-assist&utm_content='\n\nexport const packageName = '@sanity/assist'\n\nexport const pluginTitle = 'Sanity AI Assist'\n\nexport const pluginTitleShort = 'AI Assist'\n\nexport const maxHistoryVisibilityMs = minutesToMilliseconds(30)\n","import {getDraftId, getPublishedId, getVersionFromId, getVersionId, isVersionId} from 'sanity'\n\nimport {assistDocumentIdPrefix, assistDocumentStatusIdPrefix} from '../types'\n\nconst illegalIdChars = /[^a-zA-Z0-9._-]/g\n\nexport function assistDocumentId(documentType: string) {\n return `${assistDocumentIdPrefix}${documentType}`.replace(illegalIdChars, '_')\n}\n\nexport function assistTasksStatusId(documentId: string) {\n if (isVersionId(documentId)) {\n // Creates an id: sanity.assist.status.<versionName>.<documentId>\n return `${assistDocumentStatusIdPrefix}${getVersionFromId(documentId)}.${getPublishedId(documentId)}`\n }\n\n // Creates an id: sanity.assist.status<documentId>\n return `${assistDocumentStatusIdPrefix}${getPublishedId(documentId)}`\n}\n\n/**\n * Document id Assist write endpoints must patch.\n *\n * `documentId` may carry any prefix; only its published id is used. The target\n * is picked in this order:\n *\n * 1. `options.releaseId` (the selected perspective) wins and yields that\n * release's version id, even if `documentId` is already a version id.\n * 2. Without a `releaseId`, a version id is kept as is.\n * 3. Live-edit types write published.\n * 4. Everything else writes `drafts.*`, even when Studio field-action props\n * still carry the published id (virtual draft after publish).\n */\nexport function getAssistWriteDocumentId(\n documentId: string,\n options: {liveEdit?: boolean; releaseId?: string} = {},\n): string {\n if (options.releaseId) {\n return getVersionId(documentId, options.releaseId)\n }\n if (isVersionId(documentId)) {\n return documentId\n }\n if (options.liveEdit) {\n return getPublishedId(documentId)\n }\n return getDraftId(documentId)\n}\n","import {useEditState} from 'sanity'\n\n// oxlint-disable-next-line no-unnecessary-type-parameters\nexport function useDocumentState<T>(id: string, docType: string): T | undefined {\n const state = useEditState(id, docType)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return (state.draft || state.published) as T | undefined\n}\n","import {useEffect, useMemo} from 'react'\nimport {type ObjectSchemaType, typed, useClient, useCurrentUser} from 'sanity'\n\nimport {maxHistoryVisibilityMs} from '../../constants'\nimport {assistDocumentId, assistTasksStatusId} from '../../helpers/ids'\nimport {\n assistDocumentTypeName,\n type AssistTasksStatus,\n assistTasksStatusTypeName,\n type InstructionTask,\n type StudioAssistDocument,\n type StudioAssistField,\n type StudioInstruction,\n} from '../../types'\nimport {useDocumentState} from './useDocumentState'\n\ninterface UseAssistDocumentProps {\n documentId: string\n schemaType: ObjectSchemaType\n initDoc?: boolean\n}\n\nexport function useStudioAssistDocument({\n documentId,\n schemaType,\n initDoc,\n}: UseAssistDocumentProps): StudioAssistDocument | undefined {\n const documentTypeName = schemaType.name\n const currentUser = useCurrentUser()\n\n const assistDocument = useDocumentState<StudioAssistDocument>(\n assistDocumentId(documentTypeName),\n assistDocumentTypeName,\n )\n const assistTasksStatus = useDocumentState<AssistTasksStatus>(\n assistTasksStatusId(documentId ?? ''),\n assistTasksStatusTypeName,\n )\n\n const client = useClient({apiVersion: '2023-01-01'})\n\n useEffect(() => {\n if (!assistDocument && initDoc) {\n client\n .createIfNotExists({\n _id: assistDocumentId(documentTypeName),\n _type: assistDocumentTypeName,\n })\n .catch(() => {\n // best effort\n })\n }\n }, [client, assistDocument, documentTypeName, initDoc])\n\n return useMemo(() => {\n if (!assistDocument) {\n return undefined\n }\n const tasks = assistTasksStatus?.tasks ?? []\n // oxlint-disable-next-line no-map-spread\n const fields = (assistDocument?.fields ?? []).map((assistField): StudioAssistField => {\n return {\n ...assistField,\n tasks: tasks.filter((task) => task.path === assistField.path),\n instructions: assistField.instructions\n ?.filter((p) => !p.userId || p.userId === currentUser?.id)\n .map((instruction) => asStudioInstruction(instruction, tasks)),\n }\n })\n return typed<StudioAssistDocument>({\n ...assistDocument,\n // oxlint-disable-next-line no-map-spread\n tasks: tasks?.map((task) => {\n const instruction = fields\n .find((f) => f.path === task.path)\n ?.instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n instruction,\n }\n }),\n fields: fields,\n })\n }, [assistDocument, assistTasksStatus, currentUser])\n}\n\nfunction asStudioInstruction(\n instruction: StudioInstruction,\n run: InstructionTask[],\n): StudioInstruction {\n return {\n ...instruction,\n tasks: run\n .filter((task) => task.instructionKey === instruction._key)\n .filter(\n (task) =>\n task.started &&\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n ),\n }\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {addSeconds} from 'date-fns/addSeconds'\nimport {isAfter} from 'date-fns/isAfter'\nimport {useEffect, useRef} from 'react'\nimport {type ObjectSchemaType, useCurrentUser} from 'sanity'\n\nimport {getInstructionTitle} from '../../helpers/misc'\nimport type {InstructionTask} from '../../types'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nconst NO_TASKS: InstructionTask[] = []\n\nexport function useInstructionToaster(documentId: string, documentSchemaType: ObjectSchemaType) {\n const assistDocument = useStudioAssistDocument({documentId, schemaType: documentSchemaType})\n\n const assistDocLoaded = !!assistDocument\n const currentUser = useCurrentUser()\n const toast = useToast()\n const tasks = assistDocument?.tasks\n const previousTasks = useRef<InstructionTask[] | undefined | 'initial'>('initial')\n\n useEffect(() => {\n if (!assistDocLoaded) {\n return\n }\n\n if (previousTasks.current !== 'initial') {\n const prevTaskByKey = Object.fromEntries(\n (previousTasks.current ?? NO_TASKS).map((run) => [run._key, run]),\n )\n const endedTasks = tasks\n ?.filter((task) => task.startedByUserId === currentUser?.id)\n .filter((task) => {\n const prevTask = prevTaskByKey[task._key]\n return (!prevTask && task.ended) || (!prevTask?.ended && task.ended)\n })\n // filter out old stuff\n .filter((task) => task.ended && isAfter(addSeconds(new Date(task.ended), 30), new Date()))\n\n endedTasks?.forEach((task) => {\n const title = task.title ?? getInstructionTitle(task.instruction)\n if (task.reason === 'error') {\n toast.push({\n title: `Failed: ${title}`,\n status: 'error',\n description: `Instruction failed. ${task.message ?? ''}`,\n closable: true,\n duration: 10000,\n })\n } else if (task.reason === 'timeout') {\n toast.push({\n title: `Timeout: ${title}`,\n status: 'error',\n description: `Instruction timed out.`,\n closable: true,\n })\n } else if (task.reason === 'success') {\n toast.push({\n title: `Success: ${title}`,\n status: 'success',\n description: `Instruction completed.`,\n closable: true,\n })\n } else if (task.reason === 'aborted') {\n toast.push({\n title: `Canceled: ${title}`,\n status: 'warning',\n description: `Instruction canceled.`,\n closable: true,\n })\n }\n })\n }\n previousTasks.current = tasks\n }, [tasks, previousTasks, toast, currentUser, assistDocLoaded])\n}\n","import {useLayer} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport type {InputProps, ObjectInputProps, ObjectSchemaType} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {ConnectFromRegion} from '../_lib/connector'\nimport {assistFormId} from '../_lib/form/constants'\nimport {usePathKey} from '../helpers/misc'\nimport {isType} from '../helpers/typeUtils'\nimport {FirstAssistedPathProvider} from '../onboarding/FirstAssistedPathProvider'\nimport {assistDocumentTypeName} from '../types'\nimport {useInstructionToaster} from './hooks/useInstructionToaster'\n\nexport function AssistDocumentInputWrapper(props: InputProps) {\n if (!isType(props.schemaType, 'document') && props.id !== 'root' && props.id !== assistFormId) {\n return <AssistInput {...props} />\n }\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const documentId = (props.value as any)?._id as string | undefined\n if (!documentId) {\n return props.renderDefault(props)\n }\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n return <AssistDocumentInput {...(props as ObjectInputProps)} documentId={documentId} />\n}\n\nfunction AssistDocumentInput({documentId, ...props}: ObjectInputProps & {documentId: string}) {\n useInstructionToaster(documentId, props.schemaType)\n\n const schemaType = useMemo(() => {\n if (props.schemaType.name !== assistDocumentTypeName) {\n return props.schemaType\n }\n return {\n ...props.schemaType,\n type: {\n ...props.schemaType.type,\n // compatibility with i18nArrays plugin that requires this to be document\n name: 'document',\n },\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as ObjectSchemaType\n }, [props.schemaType])\n\n return (\n <FirstAssistedPathProvider members={props.members}>\n {props.renderDefault({...props, schemaType})}\n </FirstAssistedPathProvider>\n )\n}\n\nfunction AssistInput(props: InputProps) {\n const {zIndex} = useLayer()\n const {paneKey} = useDocumentPane()\n const pathKey = usePathKey(props.path)\n\n return (\n <ConnectFromRegion _key={`${paneKey}_${pathKey}`} zIndex={zIndex} style={{minWidth: 0}}>\n {props.renderDefault(props)}\n </ConnectFromRegion>\n )\n}\n","import {createContext, useContext} from 'react'\nimport {type DocumentInspector, type ObjectSchemaType, PatchEvent} from 'sanity'\n\nimport type {FieldRef} from '../assistInspector/helpers'\nimport type {InstructionTask, StudioAssistDocument} from '../types'\n\nexport type AssistDocumentContextValue = (\n | {assistDocument: StudioAssistDocument; loading: false}\n | {assistDocument: undefined; loading: true}\n) & {\n documentIsNew: boolean\n /**\n * This is the _actual_ id of the current document (ie the document loaded in the pane); it contains draft. versions. prefix ect depending on context\n */\n assistableDocumentId: string\n /**\n * True when a real write target exists: a `drafts.*` snapshot, the selected\n * release version, or the published document for live-edit types.\n *\n * After publish, the drafts perspective can still display published values\n * (a virtual draft) while this is false because `editState.draft` is null.\n */\n documentIsAssistable: boolean\n /**\n * True while the document store still has an in-flight commit (for example\n * the mutation that materializes a draft from published values).\n */\n documentIsSyncing: boolean\n documentSchemaType: ObjectSchemaType\n openInspector: (inspectorName: string, paneParams?: Record<string, string>) => void\n closeInspector: (inspectorName?: string) => void\n inspector: DocumentInspector | null\n selectedPath?: string\n documentOnChange: (event: PatchEvent) => void\n\n /**\n * Synthetic task is used to display AI presence at the document level for the user who started the action.\n * These are not persisted, so other users will not see them.\n * It is mostly a helper to give _some_ visual feedback to the user while a custom action is running.\n * This also means that reloading the page will remove the icon.\n *\n * Agent Actions add their own \"real\" tasks, so if a custom action calls an Agent action, _those_ tasks\n * are visible across sessions.\n */\n syntheticTasks?: InstructionTask[]\n addSyntheticTask: (syntheticTask: InstructionTask) => void\n removeSyntheticTask: (syntheticTask: InstructionTask) => void\n\n fieldRefs: FieldRef[]\n fieldRefsByTypePath: Record<string, FieldRef | undefined>\n}\n\nexport const AssistDocumentContext = createContext<AssistDocumentContextValue | undefined>(\n undefined,\n)\n\nexport function useAssistDocumentContext(): AssistDocumentContextValue {\n const context = useContext(AssistDocumentContext)\n if (!context) {\n throw new Error('AssistDocumentContext value is missing')\n }\n return context\n}\n","import {createContext, useContext} from 'react'\n\nimport type {FieldRef} from '../assistInspector/helpers'\nimport type {AssistPluginConfig} from '../plugin'\nimport type {SerializedSchemaType} from '../types'\nimport type {InstructStatus} from '../useApiClient'\n\nexport interface AiAssistanceConfigContextValue {\n config: AssistPluginConfig\n status?: InstructStatus\n statusLoading: boolean\n initLoading: boolean\n init: () => void\n error?: Error\n serializedTypes: SerializedSchemaType[]\n getFieldRefs: (documentType: string) => FieldRef[]\n getFieldRefsByTypePath: (documentType: string) => Record<string, FieldRef | undefined>\n}\n\n// oxlint-disable-next-line no-unsafe-type-assertion\nexport const AiAssistanceConfigContext = createContext<AiAssistanceConfigContextValue>({} as any)\n\nexport function useAiAssistanceConfig() {\n const context = useContext(AiAssistanceConfigContext)\n if (!context) {\n throw new Error('Missing AiAssistanceConfigContext')\n }\n return context\n}\n\nexport function useSerializedTypes() {\n return useAiAssistanceConfig().serializedTypes\n}\n","// oxlint-disable no-accumulating-spread\nimport {BlockContentIcon} from '@sanity/icons/BlockContent'\nimport {BlockquoteIcon} from '@sanity/icons/Blockquote'\nimport {DocumentIcon} from '@sanity/icons/Document'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {LinkIcon} from '@sanity/icons/Link'\nimport {OlistIcon} from '@sanity/icons/Olist'\nimport {StringIcon} from '@sanity/icons/String'\nimport {extractWithPath} from '@sanity/mutator'\nimport {type ComponentType, useMemo} from 'react'\nimport {\n type ArraySchemaType,\n isKeySegment,\n isObjectSchemaType,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n type SchemaType,\n stringToPath,\n} from 'sanity'\nimport {type PaneRouterContextValue, usePaneRouter} from 'sanity/structure'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {type AssistInspectorRouteParams, documentRootKey} from '../types'\n\nexport interface FieldRef {\n key: string\n path: Path\n title: string\n schemaType: SchemaType\n icon: ComponentType\n synthetic?: boolean\n}\n\n/**\n * Default for `assist.maxFieldSelectionDepth`: how many path segments deep fields are collected\n * for the field picker and the per-field assist actions.\n */\nexport const DEFAULT_MAX_FIELD_SELECTION_DEPTH = 6\n\nfunction getTypeIcon(schemaType: SchemaType): ComponentType {\n let t: SchemaType | undefined = schemaType\n\n while (t) {\n if (t.icon) return t.icon\n t = t.type\n }\n\n if (isType(schemaType, 'slug')) return LinkIcon\n if (isType(schemaType, 'image')) return ImageIcon\n if (schemaType.jsonType === 'array' && isPortableTextArray(schemaType)) return BlockContentIcon\n\n if (schemaType.jsonType === 'array') return OlistIcon\n if (schemaType.jsonType === 'object') return BlockquoteIcon\n if (schemaType.jsonType === 'string') return StringIcon\n\n return DocumentIcon\n}\n\nexport function asFieldRefsByTypePath(fieldRefs: FieldRef[]): Record<string, FieldRef | undefined> {\n const lookup: Record<string, FieldRef | undefined> = fieldRefs.reduce(\n (acc, ref) => ({...acc, [ref.key]: ref}),\n {},\n )\n return lookup\n}\n\nexport function getDocumentFieldRef(schemaType: ObjectSchemaType): FieldRef {\n return {\n key: documentRootKey,\n icon: schemaType.icon ?? DocumentIcon,\n title: `The entire document`,\n path: [],\n schemaType: schemaType,\n }\n}\n\n/**\n * Collects every field (and synthetic array item) in `schemaType` that AI Assist can attach\n * instructions to.\n *\n * @param maxDepth - max number of path segments a collected field can have; deeper fields are\n * skipped. Arrays contribute one segment for the item type (`array[_key=\"type\"]`).\n */\nexport function getFieldRefs(\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_FIELD_SELECTION_DEPTH,\n): FieldRef[] {\n return getObjectFieldRefs(schemaType, undefined, 0, maxDepth)\n}\n\nfunction getObjectFieldRefs(\n schemaType: ObjectSchemaType,\n parent: FieldRef | undefined,\n depth: number,\n maxDepth: number,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n return (\n schemaType.fields\n .filter((f) => !f.name.startsWith('_'))\n // oxlint-disable-next-line no-map-spread\n .flatMap((field) => {\n const path: Path = parent ? [...parent.path, field.name] : [field.name]\n const title = field.type.title ?? field.name\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: field.type,\n icon: getTypeIcon(field.type),\n }\n const fields =\n field.type.jsonType === 'object'\n ? getObjectFieldRefs(field.type, fieldRef, depth + 1, maxDepth)\n : []\n\n const syntheticFields =\n field.type.jsonType === 'array'\n ? getSyntheticFields(field.type, fieldRef, depth + 1, maxDepth)\n : []\n if (!isAssistSupported(field.type)) {\n return [...fields, ...syntheticFields]\n }\n return [fieldRef, ...fields, ...syntheticFields]\n })\n )\n}\n\nfunction getSyntheticFields(\n schemaType: ArraySchemaType,\n parent: FieldRef | undefined,\n depth: number,\n maxDepth: number,\n): FieldRef[] {\n if (depth >= maxDepth) {\n return []\n }\n\n return (\n schemaType.of\n .filter((itemType) => !isType(itemType, 'block'))\n // oxlint-disable-next-line no-map-spread\n .flatMap((itemType) => {\n const segment = {_key: itemType.name}\n const title = itemType.title ?? itemType.name\n const path: Path = parent ? [...parent.path, segment] : [segment]\n const fieldRef: FieldRef = {\n key: patchableKey(pathToString(path)),\n path,\n title: parent ? [parent.title, title].join(' / ') : title,\n schemaType: itemType,\n icon: getTypeIcon(itemType),\n synthetic: true,\n }\n const fields =\n itemType.jsonType === 'object'\n ? getObjectFieldRefs(itemType, fieldRef, depth + 1, maxDepth)\n : []\n\n if (!isAssistSupported(itemType)) {\n return fields\n }\n return [fieldRef, ...fields]\n })\n )\n}\n\nexport function getTypePath(doc: SanityDocumentLike, pathString: string) {\n if (!pathString) {\n return undefined\n }\n\n const path = stringToPath(pathString)\n const currentPath: Path = []\n let valid = true\n const syntheticPath = path.map((segment) => {\n currentPath.push(segment)\n\n if (isKeySegment(segment)) {\n const match = extractWithPath(pathToString(currentPath), doc)[0]\n const value = match?.value\n if (match && value && typeof value === 'object' && '_type' in value) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {_key: value._type as string}\n }\n valid = false\n }\n return segment\n })\n\n return valid ? patchableKey(pathToString(syntheticPath)) : undefined\n}\n\n/**\n * mutator crashes if path contains certain letters\n * @param pathKey\n */\nfunction patchableKey(pathKey: string) {\n return pathKey.replace(/[=]=/g, ':').replace(/[[\\]]/g, '|').replace(/\"/g, '')\n}\n\nexport function useTypePath(doc: SanityDocumentLike, pathString: string) {\n return useMemo(() => getTypePath(doc, pathString), [doc, pathString])\n}\n\nexport function useSelectedField(\n documentSchemaType?: SchemaType,\n path?: string,\n): FieldRef | undefined {\n const {getFieldRefs} = useAiAssistanceConfig()\n\n const selectableFields = useMemo(\n () =>\n documentSchemaType && isObjectSchemaType(documentSchemaType)\n ? [getDocumentFieldRef(documentSchemaType), ...getFieldRefs(documentSchemaType.name)]\n : [],\n [documentSchemaType, getFieldRefs],\n )\n\n return useMemo(() => {\n return path ? selectableFields?.find((f) => f.key === path) : undefined\n }, [selectableFields, path])\n}\n\nexport function getFieldTitle(field?: FieldRef) {\n const schemaType = field?.schemaType\n return field?.title ?? schemaType?.title ?? schemaType?.name ?? 'Untitled'\n}\n\nexport type AiPaneRouter = Omit<PaneRouterContextValue, 'setParams' | 'params'> & {\n params: AssistInspectorRouteParams\n setParams: (p: Record<keyof AssistInspectorRouteParams, string | undefined>) => void\n}\n\nexport function useAiPaneRouter(): AiPaneRouter {\n const paneRouter = usePaneRouter()\n\n return useMemo(() => ({...paneRouter, params: paneRouter.params ?? {}}), [paneRouter])\n}\n","import type {SanityClient} from '@sanity/client'\nimport {useToast} from '@sanity/ui/toast'\nimport {useCallback, useMemo, useState} from 'react'\nimport {type Path, pathToString, useClient, useCurrentUser} from 'sanity'\n\nimport {useAiAssistanceConfig, useSerializedTypes} from './assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from './helpers/conditionalMembers'\nimport type {FieldLanguageMap} from './translate/paths'\nimport {documentRootKey} from './types'\n\nexport interface UserTextInstance {\n blockKey: string\n userInput: string\n}\n\nexport interface RunInstructionRequest {\n documentId: string\n assistDocumentId: string\n path: string\n typePath?: string\n instructionKey: string\n userId?: string\n userTexts?: UserTextInstance[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nexport interface InstructStatus {\n enabled: boolean\n initialized: boolean\n validToken: boolean\n}\n\nexport interface TranslateRequest {\n documentId: string\n translatePath: Path\n languagePath?: string\n styleguide: () => Promise<string | undefined>\n fieldLanguageMap?: FieldLanguageMap[]\n conditionalMembers?: ConditionalMemberState[]\n}\n\nconst basePath = '/assist/tasks/instruction'\nexport const API_VERSION_WITH_EXTENDED_TYPES = '2025-04-01'\n\nexport function canUseAssist(status: InstructStatus | undefined) {\n return status?.enabled && status.initialized && status.validToken\n}\n\nexport function useApiClient(customApiClient?: (defaultClient: SanityClient) => SanityClient) {\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n return useMemo(\n () => (customApiClient ? customApiClient(client) : client),\n [client, customApiClient],\n )\n}\n\nexport function useTranslate(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const translate = useCallback(\n ({\n documentId,\n languagePath,\n styleguide,\n translatePath,\n fieldLanguageMap,\n conditionalMembers,\n }: TranslateRequest) => {\n setLoading(true)\n\n async function run() {\n return apiClient.request({\n method: 'POST',\n url: `/assist/tasks/translate/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n documentId,\n types,\n languagePath,\n userStyleguide: await styleguide(),\n fieldLanguageMap,\n conditionalMembers,\n translatePath:\n translatePath.length === 0 ? documentRootKey : pathToString(translatePath),\n userId: user?.id,\n },\n })\n }\n\n return run()\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Translate failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n translate,\n loading,\n }),\n [translate, loading],\n )\n}\n\nexport function useGenerateCaption(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const generateCaption = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-caption/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image description failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateCaption,\n loading,\n }),\n [generateCaption, loading],\n )\n}\n\nexport function useGenerateImage(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n const toast = useToast()\n\n const generateImage = useCallback(\n ({path, documentId}: {path: string; documentId: string}) => {\n setLoading(true)\n\n return apiClient\n .request({\n method: 'POST',\n url: `/assist/tasks/generate-image/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n path,\n documentId,\n types,\n userId: user?.id,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Generate image from prompt failed',\n description: e.message,\n })\n setLoading(false)\n throw e\n })\n .finally(() => {\n // adding some artificial delay here\n // server responds with 201 then proceeds; we dont need to allow spamming the button\n setTimeout(() => {\n setLoading(false)\n }, 2000)\n })\n },\n [setLoading, apiClient, toast, user, types],\n )\n\n return useMemo(\n () => ({\n generateImage,\n loading,\n }),\n [generateImage, loading],\n )\n}\n\nexport function useGetInstructStatus(apiClient: SanityClient) {\n const [loading, setLoading] = useState(true)\n\n const getInstructStatus = useCallback(async () => {\n setLoading(true)\n\n const projectId = apiClient.config().projectId\n // oxlint-disable-next-line react/todo\n try {\n const status = await apiClient.request<InstructStatus>({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/status?projectId=${projectId}`,\n })\n\n return status\n } finally {\n setLoading(false)\n }\n }, [setLoading, apiClient])\n\n return {\n loading,\n getInstructStatus,\n }\n}\n\nexport function useInitInstruct(apiClient: SanityClient) {\n const [loading, setLoading] = useState(false)\n const initInstruct = useCallback(() => {\n setLoading(true)\n return apiClient\n .request({\n method: 'GET',\n url: `${basePath}/${apiClient.config().dataset}/init?projectId=${\n apiClient.config().projectId\n }`,\n })\n .finally(() => {\n setLoading(false)\n })\n }, [setLoading, apiClient])\n\n return {\n loading,\n initInstruct,\n }\n}\n\nexport function useRunInstructionApi(apiClient: SanityClient) {\n const toast = useToast()\n const [loading, setLoading] = useState(false)\n const user = useCurrentUser()\n const types = useSerializedTypes()\n\n const {\n config: {assist: assistConfig},\n } = useAiAssistanceConfig()\n\n const runInstruction = useCallback(\n (request: RunInstructionRequest) => {\n if (!user) {\n toast.push({\n status: 'error',\n title: 'Unable to get user for instruction.',\n })\n return undefined\n }\n setLoading(true)\n\n const {timeZone, locale} = Intl.DateTimeFormat().resolvedOptions()\n const defaultLocaleSettings = {timeZone, locale}\n const localeSettings =\n assistConfig?.localeSettings?.({user, defaultSettings: defaultLocaleSettings}) ??\n defaultLocaleSettings\n\n return apiClient\n .request({\n method: 'POST',\n url: `${basePath}/${apiClient.config().dataset}?projectId=${\n apiClient.config().projectId\n }`,\n body: {\n ...request,\n types,\n userId: user?.id,\n localeSettings,\n maxPathDepth: assistConfig?.maxPathDepth,\n },\n })\n .catch((e) => {\n toast.push({\n status: 'error',\n title: 'Instruction failed',\n description: e.message,\n })\n throw e\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [apiClient, types, user, toast, assistConfig],\n )\n\n return useMemo(\n () => ({\n runInstruction,\n loading,\n }),\n [runInstruction, loading],\n )\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Button, Dialog, Flex, Stack, Text, TextArea} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {\n createContext,\n type Dispatch,\n type FormEvent,\n type PropsWithChildren,\n type SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {FormFieldHeaderText} from 'sanity'\n\nimport type {CustomInputResult, GetUserInput} from '../fieldActions/useUserInput'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {type UserInputBlock, userInputTypeName} from '../types'\nimport {useApiClient, useRunInstructionApi} from '../useApiClient'\nimport {useAiAssistanceConfig} from './AiAssistanceConfigContext'\nimport type {RunInstructionArgs} from './AssistLayout'\n\ntype BlockInputs = Record<string, string>\nconst NO_INPUT: BlockInputs = {}\n\nexport interface RunInstructionContextValue {\n runInstruction: (req: RunInstructionArgs) => void\n getUserInput: GetUserInput\n instructionLoading: boolean\n}\n\nconst RunInstructionContext = createContext<RunInstructionContextValue>({\n runInstruction: () => {},\n getUserInput: async () => undefined,\n instructionLoading: false,\n})\n\nexport function useRunInstruction() {\n return useContext(RunInstructionContext)\n}\n\nfunction isUserInputBlock(block: {_type: string}): block is UserInputBlock {\n return block._type === userInputTypeName\n}\n\nexport function RunInstructionProvider(props: PropsWithChildren<{}>) {\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {runInstruction: runInstructionRequest, loading} = useRunInstructionApi(apiClient)\n\n const id = useId()\n\n const [inputs, setInputs] = useState(NO_INPUT)\n const [runRequest, setRunRequest] = useState<\n | (RunInstructionArgs & {userInputBlocks: UserInputBlock[]})\n | {dialogTitle: string; userInputBlocks: UserInputBlock[]}\n | undefined\n >()\n\n const [resolveUserInput, setResolveUserInput] =\n useState<\n (\n value: CustomInputResult[] | PromiseLike<CustomInputResult[] | undefined> | undefined,\n ) => void\n >()\n\n const getUserInput: GetUserInput = useCallback(async ({title, inputs}) => {\n const userInputBlocks: UserInputBlock[] = inputs.map((input, i) => ({\n _type: userInputTypeName,\n _key: input.id ?? `${i}`,\n message: input.title,\n description: input.description,\n }))\n\n if (!userInputBlocks.length) {\n return undefined\n }\n setRunRequest({dialogTitle: title, userInputBlocks})\n return new Promise<CustomInputResult[] | undefined>((resolve) => {\n setResolveUserInput(() => resolve)\n })\n }, [])\n\n const runInstruction = useCallback(\n (req: RunInstructionArgs) => {\n if (loading) {\n return\n }\n const {instruction, ...request} = req\n const instructionKey = instruction._key\n const userInputBlocks = instruction?.prompt\n ?.flatMap((block) =>\n block._type === 'block' ? block.children.filter(isUserInputBlock) : [block],\n )\n .filter(isUserInputBlock)\n\n if (!userInputBlocks?.length) {\n void runInstructionRequest({\n ...request,\n instructionKey,\n userTexts: undefined,\n })\n return\n }\n\n setRunRequest({\n ...req,\n userInputBlocks,\n })\n },\n [runInstructionRequest, loading],\n )\n\n const close = useCallback(() => {\n setRunRequest(undefined)\n setInputs(NO_INPUT)\n if (resolveUserInput) {\n resolveUserInput(undefined)\n }\n setResolveUserInput(undefined)\n }, [resolveUserInput])\n\n const runWithInput = useCallback(() => {\n if (runRequest) {\n if ('instruction' in runRequest) {\n const {instruction, userInputBlocks: _, ...request} = runRequest\n void runInstructionRequest({\n ...request,\n instructionKey: instruction._key,\n userTexts: Object.entries(inputs).map(([key, value]) => ({\n blockKey: key,\n userInput: value,\n })),\n })\n } else {\n const userInputs = Object.values(inputs).map((input, i) => {\n const userInputBlock = runRequest.userInputBlocks[i]!\n return {\n input: {\n id: userInputBlock._key,\n title: userInputBlock.message ?? '',\n description: userInputBlock.description,\n },\n result: input,\n }\n })\n resolveUserInput?.(userInputs)\n setResolveUserInput(undefined)\n }\n }\n close()\n }, [close, runInstructionRequest, runRequest, inputs, resolveUserInput])\n\n const open = !!runRequest\n\n const runDisabled = useMemo(\n () =>\n (runRequest?.userInputBlocks?.length ?? 0) >\n Object.entries(inputs).filter(([, value]) => !!value).length,\n [runRequest?.userInputBlocks, inputs],\n )\n\n const runButton = (\n <Button\n text=\"Run instruction\"\n onClick={runWithInput}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n />\n )\n\n const contextValue: RunInstructionContextValue = useMemo(\n () => ({runInstruction, getUserInput, instructionLoading: loading}),\n [getUserInput, loading, runInstruction],\n )\n\n return (\n <RunInstructionContext.Provider value={contextValue}>\n {open ? (\n <Dialog\n id={id}\n open={open}\n onClose={close}\n width={1}\n header={\n 'dialogTitle' in runRequest\n ? runRequest.dialogTitle\n : getInstructionTitle(runRequest?.instruction)\n }\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>Unable to run instruction. All fields must have a value.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n <Stack padding={4} gap={2}>\n {runRequest?.userInputBlocks?.map((block, i) => (\n <UserInput\n key={block._key}\n block={block}\n autoFocus={i === 0}\n inputs={inputs}\n setInputs={setInputs}\n />\n ))}\n </Stack>\n </Dialog>\n ) : null}\n {props.children}\n </RunInstructionContext.Provider>\n )\n}\n\nfunction UserInput(props: {\n block: UserInputBlock\n inputs: BlockInputs\n setInputs: Dispatch<SetStateAction<BlockInputs>>\n autoFocus?: boolean\n}) {\n const {block, autoFocus, setInputs, inputs} = props\n const key = block._key\n const textAreaRef = useRef<HTMLTextAreaElement>(null)\n\n const onChange = useCallback(\n // oxlint-disable-next-line no-deprecated\n (e: FormEvent<HTMLTextAreaElement>) => {\n setInputs((current) => ({\n ...current,\n [key]: (e.currentTarget ?? e.target).value,\n }))\n },\n [key, setInputs],\n )\n\n const value = useMemo(() => inputs[key], [inputs, key])\n\n useEffect(() => {\n if (!autoFocus) {\n return\n }\n setTimeout(() => textAreaRef.current?.focus(), 0)\n }, [autoFocus])\n\n return (\n <Stack padding={2} gap={3}>\n <FormFieldHeaderText\n title={block?.message ?? 'Provide more context'}\n description={block.description}\n />\n <TextArea\n ref={textAreaRef}\n rows={4}\n value={value}\n onChange={onChange}\n style={{resize: 'vertical'}}\n />\n </Stack>\n )\n}\n","import {useCallback, useEffect, useEffectEvent, useRef} from 'react'\nimport {PatchEvent} from 'sanity'\n\nexport interface DraftDelayedTaskArgs<T> {\n documentOnChange: (event: PatchEvent) => void\n /**\n * True when a real write target exists: a `drafts.*` snapshot, the selected\n * release version, or the published document for live-edit types.\n */\n isDocAssistable: boolean\n /**\n * True while the document store has an in-flight commit. A queued task waits\n * for it so the assist backend never patches a document that only exists\n * optimistically in the Studio.\n */\n isSyncing?: boolean\n task: (args: T) => void\n}\n\ninterface DocumentSignals {\n isDocAssistable: boolean\n isSyncing: boolean\n}\n\ntype Phase = 'materializing' | 'awaiting-sync'\n\ninterface QueuedTask<T> {\n args: T\n phase: Phase\n attempts: number\n}\n\n/**\n * One attempt is the normal case. The second covers a draft that disappeared\n * (published, discarded, deleted remotely) while the task was queued.\n */\nconst MAX_MATERIALIZATION_ATTEMPTS = 2\n\n/**\n * Advances a queued task one step for the given document signals and returns\n * the queue afterwards. Under unchanged signals a second call is a no-op, so the\n * caller can invoke it on every signal change without bookkeeping.\n */\nfunction advance<T>(\n queued: QueuedTask<T> | null,\n {isDocAssistable, isSyncing}: DocumentSignals,\n {documentOnChange, task}: Pick<DraftDelayedTaskArgs<T>, 'documentOnChange' | 'task'>,\n): QueuedTask<T> | null {\n if (!queued) {\n return null\n }\n\n if (queued.phase === 'materializing') {\n // Studio started the create/patch commit; wait for it to finish\n return isSyncing ? {...queued, phase: 'awaiting-sync'} : queued\n }\n\n if (isSyncing) {\n return queued\n }\n\n if (isDocAssistable) {\n task(queued.args)\n return null\n }\n\n if (queued.attempts >= MAX_MATERIALIZATION_ATTEMPTS) {\n return null\n }\n try {\n documentOnChange(PatchEvent.from([]))\n } catch {\n // Studio throws for read-only documents. Drop the task instead of the tree.\n return null\n }\n return {...queued, phase: 'materializing', attempts: queued.attempts + 1}\n}\n\n/**\n * Runs `task` once the document has a real write target in the Content Lake.\n *\n * After publish the drafts perspective shows a virtual draft with no `drafts.*`\n * document behind it. When that happens the hook sends an empty form `onChange`:\n * Studio's `patch.execute` still runs `createIfNotExists` for the draft even with\n * no patches, and the resulting edit action creates it server side. The task then\n * waits until that commit has both started and finished, because the optimistic\n * `editState.draft` appears before the draft exists remotely.\n *\n * The queue is never rendered, so it lives in a ref. The effect below only\n * reacts to the two document signals; nothing it does can re-trigger it.\n */\nexport function useDraftDelayedTask<T>(args: DraftDelayedTaskArgs<T>) {\n const {documentOnChange, isDocAssistable, isSyncing = false, task} = args\n const queuedRef = useRef<QueuedTask<T> | null>(null)\n\n const advanceQueue = useEffectEvent((signals: DocumentSignals) => {\n queuedRef.current = advance(queuedRef.current, signals, {documentOnChange, task})\n })\n\n useEffect(() => {\n advanceQueue({isDocAssistable, isSyncing})\n }, [isDocAssistable, isSyncing])\n\n return useCallback(\n (taskArgs: T) => {\n if (isDocAssistable && !isSyncing) {\n task(taskArgs)\n return\n }\n queuedRef.current = advance(\n {args: taskArgs, phase: 'awaiting-sync', attempts: 0},\n {isDocAssistable, isSyncing},\n {documentOnChange, task},\n )\n },\n [isDocAssistable, isSyncing, documentOnChange, task],\n )\n}\n","import type {ObjectSchemaType, SanityDocument} from 'sanity'\n\nimport {useRunInstruction} from '../assistLayout/RunInstructionProvider'\nimport {type DraftDelayedTaskArgs, useDraftDelayedTask} from './useDraftDelayedTask'\n\nexport function isDocAssistable(\n documentSchemaType: ObjectSchemaType,\n published?: SanityDocument | null,\n draft?: SanityDocument | null,\n) {\n return !!(documentSchemaType.liveEdit ? published : draft)\n}\n\nexport function useRequestRunInstruction(args: Omit<DraftDelayedTaskArgs<never>, 'task'>) {\n const {runInstruction, instructionLoading} = useRunInstruction()\n const requestRunInstruction = useDraftDelayedTask({\n ...args,\n task: runInstruction,\n })\n\n return {\n instructionLoading,\n requestRunInstruction,\n }\n}\n","import {useCallback, useEffect, useMemo, useState} from 'react'\nimport {\n getPublishedId,\n type ObjectSchemaType,\n usePerspective,\n useSchema,\n useSyncState,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {getAssistWriteDocumentId} from '../../helpers/ids'\nimport {fieldPathParam, type InstructionTask} from '../../types'\nimport type {AssistDocumentContextValue} from '../AssistDocumentContext'\nimport {isDocAssistable} from '../RequestRunInstructionProvider'\nimport {useStudioAssistDocument} from './useStudioAssistDocument'\n\nexport function useAssistDocumentContextValue(documentId: string, documentType: string) {\n const schema = useSchema()\n\n const {getFieldRefs, getFieldRefsByTypePath} = useAiAssistanceConfig()\n const documentSchemaType = useMemo(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return schemaType\n }, [documentType, schema])\n\n const {fieldRefs, fieldRefsByTypePath} = useMemo(() => {\n return {\n fieldRefs: getFieldRefs(documentType),\n fieldRefsByTypePath: getFieldRefsByTypePath(documentType),\n }\n }, [getFieldRefs, getFieldRefsByTypePath, documentType])\n\n const {\n openInspector,\n closeInspector,\n inspector,\n onChange: documentOnChange,\n editState,\n } = useDocumentPane()\n const {selectedReleaseId} = usePerspective()\n const {draft, published, version} = editState || {}\n\n const assistableDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType.liveEdit,\n releaseId: selectedReleaseId,\n })\n\n const documentIsNew = selectedReleaseId ? !version?._id : !draft?._id && !published?._id\n const documentIsAssistable = selectedReleaseId\n ? !!version\n : isDocAssistable(documentSchemaType, published, draft)\n const {isSyncing: documentIsSyncing} = useSyncState(\n getPublishedId(documentId),\n documentType,\n selectedReleaseId,\n )\n\n const {params} = useAiPaneRouter()\n const selectedPath = params[fieldPathParam]\n\n const assistDocument = useStudioAssistDocument({\n documentId: assistableDocumentId,\n schemaType: documentSchemaType,\n })\n const {syntheticTasks, addSyntheticTask, removeSyntheticTask} =\n useSyntheticTasks(assistableDocumentId)\n\n const value: AssistDocumentContextValue = useMemo(() => {\n const base = {\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n }\n if (!assistDocument) {\n return {...base, loading: true, assistDocument: undefined}\n }\n return {\n ...base,\n loading: false,\n assistDocument: assistDocument,\n }\n }, [\n assistDocument,\n documentIsAssistable,\n documentIsSyncing,\n assistableDocumentId,\n documentSchemaType,\n documentIsNew,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n selectedPath,\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n fieldRefs,\n fieldRefsByTypePath,\n ])\n\n return value\n}\n\nfunction useSyntheticTasks(assistableDocumentId: string) {\n const [syntheticTasks, setSyntheticTasks] = useState<InstructionTask[]>(() => [])\n const addSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => [...current, task])\n }, [])\n const removeSyntheticTask = useCallback((task: InstructionTask) => {\n setSyntheticTasks((current) => current.filter((t) => task._key !== t._key))\n }, [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSyntheticTasks([])\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [assistableDocumentId])\n\n return {\n syntheticTasks,\n addSyntheticTask,\n removeSyntheticTask,\n }\n}\n","import type {PropsWithChildren} from 'react'\n\nimport {AssistDocumentContext} from './AssistDocumentContext'\nimport {useAssistDocumentContextValue} from './hooks/useAssistDocumentContextValue'\n\nexport interface AIDocumentInputProps {\n documentId: string\n documentType: string\n}\n\nexport function AssistDocumentContextProvider(props: PropsWithChildren<AIDocumentInputProps>) {\n const {documentId, documentType} = props\n const value = useAssistDocumentContextValue(documentId, documentType)\n return (\n <AssistDocumentContext.Provider value={value}>{props.children}</AssistDocumentContext.Provider>\n )\n}\n","import type {DocumentLayoutProps} from 'sanity'\n\nimport {AssistDocumentContextProvider} from './AssistDocumentContextProvider'\n\nexport function AssistDocumentLayout(props: DocumentLayoutProps) {\n const {documentId, documentType} = props\n return (\n <AssistDocumentContextProvider documentType={documentType} documentId={documentId}>\n {props.renderDefault(props)}\n </AssistDocumentContextProvider>\n )\n}\n","import {type ReactElement, type ReactNode, type Ref} from 'react'\nimport {keyframes, styled} from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n transform: scale(0.75);\n }\n 40% {\n opacity: 0;\n transform: scale(0.75);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`\n\nconst FadeInDiv = styled.div`\n animation-name: ${fadeIn};\n animation-timing-function: ease-in-out;\n`\n\nexport function FadeInContent({\n children,\n durationMs = 250,\n ref,\n}: {\n children?: ReactNode\n ms?: number\n durationMs?: number\n ref?: Ref<HTMLDivElement>\n}): ReactElement {\n return (\n <FadeInDiv ref={ref} style={{animationDuration: `${durationMs}ms`}}>\n {children}\n </FadeInDiv>\n )\n}\n","import {purple} from '@sanity/color'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Text} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useColorSchemeValue} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nconst Root = styled.span`\n display: block;\n width: 25px;\n height: 25px;\n position: relative;\n`\n\nconst dash = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(43deg);\n }\n`\n\nconst Outline = styled.svg`\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n\n & > circle {\n stroke: var(--ai-avatar-stroke-color);\n stroke-width: 1.5px;\n stroke-linecap: round;\n transform-origin: center;\n animation: ${dash} 500ms ease-in-out infinite;\n transition: stroke-dasharray 200ms ease-in-out;\n\n stroke-dasharray: 2.34px 0;\n\n [data-state='active'] > & {\n stroke-dasharray: 2px 2.34px;\n }\n }\n`\n\nconst IconDisc = styled.span`\n background: var(--ai-avatar-disc-color);\n color: white;\n width: 21px;\n height: 21px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10.5px;\n position: absolute;\n top: 2px;\n left: 2px;\n`\n\nexport function AssistAvatar(props: {state?: 'present' | 'active'}) {\n const {state = 'present'} = props\n const scheme = useColorSchemeValue()\n\n const style = useMemo(() => {\n if (scheme === 'dark') {\n return {\n [`--ai-avatar-stroke-color`]: purple[400].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }\n\n return {\n [`--ai-avatar-stroke-color`]: purple[500].hex,\n [`--ai-avatar-disc-color`]: purple[600].hex,\n // oxlint-disable-next-line no-unsafe-type-assertion\n } as CSSProperties\n }, [scheme])\n\n return (\n <Root data-state={state} style={style}>\n <Outline\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12.5\" cy=\"12.5\" r=\"11.75\" />\n </Outline>\n <IconDisc>\n <Text as=\"span\" size={0} style={{color: 'inherit'}}>\n <SparklesIcon style={{color: 'inherit'}} />\n </Text>\n </IconDisc>\n </Root>\n )\n}\n","import {Card, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport type {FormNodePresence} from 'sanity'\n\nimport {FadeInContent} from '../components/FadeInContent'\nimport {AssistAvatar} from './AssistAvatar'\n\nexport function AiFieldPresence(_props: {presence: FormNodePresence}) {\n return (\n <Card style={{position: 'relative', background: 'transparent'}} contentEditable={false}>\n <Tooltip\n placement=\"left\"\n content={\n <Card padding={3} border>\n <Flex align=\"center\">\n <Text size={1}>Running instruction...</Text>\n </Flex>\n </Card>\n }\n >\n <FadeInContent durationMs={300}>\n <AssistAvatar state=\"active\" />\n </FadeInContent>\n </Tooltip>\n </Card>\n )\n}\n","import {useMemo} from 'react'\nimport {type FormNodePresence, isKeySegment, type Path, stringToPath} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport type {AiPresence} from '../types'\n\nconst NO_PRESENCE: FormNodePresence[] = []\n\nexport function useAssistPresence(path: Path, showFocusWithin?: boolean): FormNodePresence[] {\n const context = useAssistDocumentContext()\n const assistDocument = context && 'assistDocument' in context ? context.assistDocument : undefined\n const tasks = assistDocument?.tasks\n\n return useMemo(() => {\n const activePresence = tasks\n ?.filter((task) => !task.ended)\n ?.flatMap((task) => task.presence ?? [])\n ?.filter(\n (p) =>\n p.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(p.started).getTime() < maxHistoryVisibilityMs,\n )\n .filter((presence) => {\n if (!presence.path || !path.length) {\n return false\n }\n const statusPath = stringToPath(presence.path)\n\n if (!showFocusWithin && statusPath.length !== path.length) {\n return false\n }\n\n return path.every((pathSegment, i) => {\n const statusSegment = statusPath[i]\n if (typeof pathSegment === 'string') {\n return pathSegment === statusSegment\n }\n if (isKeySegment(pathSegment) && statusSegment && isKeySegment(statusSegment)) {\n return pathSegment._key === statusSegment._key\n }\n return false\n })\n })\n if (!activePresence?.length) {\n return NO_PRESENCE\n }\n\n return activePresence.map((status) => aiPresence(status, path))\n }, [showFocusWithin, tasks, path])\n}\n\nexport function aiPresence(presence: AiPresence, path: Path, _title?: string): FormNodePresence {\n return {\n user: {\n id: `sanity-assistant_${presence._key}`,\n displayName: pluginTitle,\n },\n path: path,\n sessionId: 'not-available',\n lastActiveAt: presence?.started ?? new Date().toISOString(),\n }\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport {type FieldProps, isArraySchemaType} from 'sanity'\n\nimport {assistFormId} from '../_lib/form/constants'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {isPortableTextArray, isType} from '../helpers/typeUtils'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\nimport {contextDocumentTypeName} from '../types'\n\nexport function AssistFieldWrapper(props: FieldProps) {\n const {schemaType} = props\n\n const isSupported = useMemo(() => isAssistSupported(schemaType), [schemaType])\n\n if (\n !isSupported ||\n schemaType.name.startsWith('sanity.') ||\n schemaType.name === contextDocumentTypeName\n ) {\n return props.renderDefault(props)\n }\n if (\n !isType(props.schemaType, 'document') &&\n props.inputId !== 'root' &&\n props.inputId !== assistFormId\n ) {\n return <AssistField {...props}>{props.children}</AssistField>\n }\n\n return props.renderDefault(props)\n}\n\nfunction AssistField(props: FieldProps) {\n const isPortableText = useMemo(\n () => !!(isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType)),\n [props.schemaType],\n )\n\n const presence = useAssistPresence(props.path, isPortableText)\n const singlePresence = presence[0]\n\n const actions = (\n <Flex gap={2} align=\"center\" justify=\"space-between\">\n {singlePresence && (\n <Box>\n <AiFieldPresence presence={singlePresence} />\n </Box>\n )}\n </Flex>\n )\n\n return props.renderDefault({\n ...props,\n\n actions: props.actions,\n\n // Render presence in the internal slot (between presence and the field actions)\n // oxlint-disable-next-line no-deprecated -- the slot is deprecated for external use but exists specifically for this plugin\n __internal_slot: actions,\n })\n}\n","import {Box, Button, Card, ErrorBoundary, Flex, Stack, Text} from '@sanity/ui'\nimport {type ErrorInfo, type PropsWithChildren, useCallback, useMemo, useState} from 'react'\nimport {type InputProps, isArraySchemaType, PatchEvent, unset} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {isPortableTextArray} from '../helpers/typeUtils'\n\nconst WrapPreCard = styled(Card)`\n & pre {\n white-space: pre-wrap !important;\n }\n`\n\nexport function SafeValueInput(props: InputProps) {\n return (\n <ErrorWrapper onChange={props.onChange}>\n <PteValueFixer {...props} />\n </ErrorWrapper>\n )\n}\n\nexport function ErrorWrapper(\n props: PropsWithChildren<{onChange: (patchEvent: PatchEvent) => void}>,\n) {\n const {onChange} = props\n const [error, setError] = useState<Error | undefined>()\n\n const catchError = useCallback((params: {error: Error; info: ErrorInfo}) => {\n setError(params.error)\n }, [])\n\n const unsetValue = useCallback(() => {\n onChange(PatchEvent.from(unset()))\n setError(undefined)\n }, [onChange])\n const dismiss = useCallback(() => setError(undefined), [])\n const catcher = <ErrorBoundary onCatch={catchError}>{props.children}</ErrorBoundary>\n\n return error ? (\n <Card border tone=\"critical\" padding={2} contentEditable={false}>\n <Stack gap={3}>\n <Text muted weight=\"semibold\">\n An error occurred.\n </Text>\n\n <WrapPreCard flex={1} padding={2} tone=\"critical\" border>\n {catcher}\n </WrapPreCard>\n\n <Flex flex={1} gap={3}>\n <Box flex={1}>\n <Button text=\"Dismiss\" onClick={dismiss} tone=\"primary\" />\n </Box>\n <Button text=\"Unset value\" onClick={unsetValue} tone=\"critical\" />\n </Flex>\n </Stack>\n </Card>\n ) : (\n catcher\n )\n}\n\nfunction PteValueFixer(props: InputProps) {\n const isPortableText = useMemo(\n () => isArraySchemaType(props.schemaType) && isPortableTextArray(props.schemaType),\n [props.schemaType],\n )\n const value = props.value\n // oxlint-disable-next-line no-unsafe-type-assertion\n if (isPortableText && value && !(value as any[]).length) {\n return props.renderDefault({...props, value: undefined})\n }\n\n return props.renderDefault(props)\n}\n","import {Box, Flex} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {type BlockProps, PatchEvent, useFormCallbacks} from 'sanity'\n\nimport {ErrorWrapper} from '../components/SafeValueInput'\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistFormBlock(props: BlockProps) {\n const presence = useAssistPresence(props.path, true)\n const {onChange} = useFormCallbacks()\n const key = props.value._key\n const localOnChange = useCallback(\n (patchEvent: PatchEvent) => {\n if (!key) {\n return\n }\n onChange(PatchEvent.from(patchEvent).prefixAll({_key: key}))\n },\n [onChange, key],\n )\n const singlePresence = presence[0]\n return (\n <ErrorWrapper onChange={localOnChange}>\n <Flex align=\"center\" justify=\"space-between\">\n <Box flex={1}>{props.renderDefault(props)}</Box>\n {singlePresence && <AiFieldPresence presence={singlePresence} />}\n </Flex>\n </ErrorWrapper>\n )\n}\n","import {createContext} from 'react'\nimport type {BlockProps} from 'sanity'\n\n// workaround for preview value sometimes lagging behind\nexport const InlineBlockValueContext = createContext<unknown>(undefined)\n\nexport function AssistInlineFormBlock(props: BlockProps) {\n return (\n <InlineBlockValueContext.Provider value={props.value}>\n <>{props.renderDefault(props)}</>\n </InlineBlockValueContext.Provider>\n )\n}\n","import {Box, Flex} from '@sanity/ui'\nimport type {ItemProps} from 'sanity'\n\nimport {AiFieldPresence} from '../presence/AiFieldPresence'\nimport {useAssistPresence} from '../presence/useAssistPresence'\n\nexport function AssistItem(props: ItemProps) {\n const {path} = props\n const presence = useAssistPresence(path, true)\n\n return (\n <Flex align=\"center\" style={{position: 'relative'}}>\n <Box flex={1}>{props.renderDefault({...props})}</Box>\n {presence.map((pre) => (\n <Box key={pre.user.id} style={{position: 'absolute', right: 35}}>\n <AiFieldPresence presence={pre} />\n </Box>\n ))}\n </Flex>\n )\n}\n","import {Box, type BoxProps, Flex, focusFirstDescendant, Spinner, Text} from '@sanity/ui'\nimport type React from 'react'\nimport {type HTMLProps, useEffect, useEffectEvent, useMemo, useRef} from 'react'\nimport {tap} from 'rxjs/operators'\nimport {\n createPatchChannel,\n type DocumentMutationEvent,\n type DocumentRebaseEvent,\n FormBuilder,\n fromMutationPatches,\n type PatchMsg,\n useDocumentPresence,\n useDocumentStore,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {assistFormId} from './constants'\n\n// oxlint-disable-next-line no-deprecated\nconst preventDefault = (ev: React.FormEvent) => ev.preventDefault()\n\nexport function DocumentForm(\n props: Omit<BoxProps<'form'>, 'as'> & Omit<HTMLProps<HTMLFormElement>, 'as' | 'onSubmit' | 'ref'>,\n) {\n const {\n collapsedFieldSets,\n collapsedPaths,\n displayed: value,\n documentId,\n documentType,\n editState,\n formState,\n onBlur,\n onChange,\n onFocus,\n onPathOpen,\n onSetActiveFieldGroup,\n onSetCollapsedFieldSet,\n onSetCollapsedPath,\n ready,\n validation,\n } = useDocumentPane()\n\n const documentStore = useDocumentStore()\n const presence = useDocumentPresence(documentId)\n\n // The `patchChannel` is an INTERNAL publish/subscribe channel that we use to notify form-builder\n // nodes about both remote and local patches.\n // - Used by the Portable Text input to modify selections.\n // - Used by `withDocument` to reset value.\n const patchChannel = useMemo(() => createPatchChannel(), [])\n\n const isLocked = editState?.transactionSyncLock?.enabled\n\n useEffect(() => {\n const sub = documentStore.pair\n .documentEvents(documentId, documentType)\n .pipe(\n tap((event) => {\n if (event.type === 'mutation') {\n patchChannel.publish(prepareMutationEvent(event))\n }\n\n if (event.type === 'rebase') {\n patchChannel.publish(prepareRebaseEvent(event))\n }\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [documentId, documentStore, documentType, patchChannel])\n\n const hasRev = Boolean(value?._rev)\n const patchChannelPublish = useEffectEvent(() => {\n // this is a workaround for an issue that caused the document pushed to withDocument to get\n // stuck at the first initial value.\n // This effect is triggered only when the document goes from not having a revision, to getting one\n // so it will kick in as soon as the document is received from the backend\n patchChannel.publish({\n type: 'mutation',\n patches: [],\n snapshot: value,\n })\n })\n useEffect(() => {\n if (hasRev) {\n // React to changes in hasRev only\n patchChannelPublish()\n }\n }, [hasRev])\n\n const formRef = useRef<null | HTMLFormElement>(null)\n\n useEffect(() => {\n focusFirstDescendant(formRef.current!)\n }, [])\n\n if (isLocked) {\n return (\n <Box as=\"form\" {...props} ref={formRef}>\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>\n Please hold tight while the document is synced. This usually happens right after the\n document has been published, and it shouldn’t take more than a few seconds\n </Text>\n </Flex>\n </Box>\n )\n }\n\n return (\n <Box as=\"form\" {...props} onSubmit={preventDefault} ref={formRef}>\n {ready ? (\n formState === null ? (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Text size={1}>This form is hidden</Text>\n </Flex>\n ) : (\n <FormBuilder\n __internal_patchChannel={patchChannel}\n collapsedFieldSets={collapsedFieldSets}\n collapsedPaths={collapsedPaths}\n focusPath={formState.focusPath}\n changed={formState.changed}\n focused={formState.focused}\n groups={formState.groups}\n id={assistFormId}\n members={formState.members}\n onChange={onChange}\n onFieldGroupSelect={onSetActiveFieldGroup}\n onPathBlur={onBlur}\n onPathFocus={onFocus}\n onPathOpen={onPathOpen}\n onSetFieldSetCollapsed={onSetCollapsedFieldSet}\n onSetPathCollapsed={onSetCollapsedPath}\n presence={presence}\n readOnly={formState.readOnly}\n schemaType={formState.schemaType}\n validation={validation}\n // oxlint-disable-next-line no-unsafe-type-assertion\n value={formState.value as any}\n hasUpstreamVersion={false}\n />\n )\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n height=\"fill\"\n justify=\"center\"\n padding={3}\n sizing=\"border\"\n >\n <Spinner muted />\n\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading document\n </Text>\n </Box>\n </Flex>\n )}\n </Box>\n )\n}\n\nfunction prepareMutationEvent(event: DocumentMutationEvent): PatchMsg {\n const patches = event.mutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'mutation',\n snapshot: event.document,\n patches: fromMutationPatches(event.origin, patches),\n }\n}\n\nfunction prepareRebaseEvent(event: DocumentRebaseEvent): PatchMsg {\n const remotePatches = event.remoteMutations.map((mut) => mut.patch).filter(Boolean)\n const localPatches = event.localMutations.map((mut) => mut.patch).filter(Boolean)\n\n return {\n type: 'rebase',\n snapshot: event.document,\n patches: fromMutationPatches('remote', remotePatches).concat(\n fromMutationPatches('local', localPatches),\n ),\n }\n}\n","import {createContext} from 'react'\n\nexport interface AssistTypeContextValue {\n typePath?: string\n documentType?: string\n}\nexport const AssistTypeContext = createContext<AssistTypeContextValue>({})\n","// oxlint-disable no-accumulating-spread\nimport {\n type ArrayOfObjectsFormNode,\n type ArrayOfObjectsItemMember,\n type ArrayOfPrimitivesFormNode,\n type DocumentFormNode,\n type FieldsetState,\n isObjectSchemaType,\n type ObjectFormNode,\n type Path,\n pathToString,\n type SchemaType,\n} from 'sanity'\n\nconst DEFAULT_MAX_DEPTH = 8\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport interface ConditionalMemberState {\n path: string\n hidden: boolean\n readOnly: boolean\n}\n\ninterface ConditionalMemberInnerState extends ConditionalMemberState {\n conditional: boolean\n}\n\n/**\n * This is used to statically determine the state of the functions on the server-side.\n * Paths which has a schema with conditional config should be considered hidden: true and/or readOnly: true\n * Only conditional paths are included, as static props can be determined from schema.\n *\n * Returns paths that has conditional hidden or readOnly schema config (function) and that.\n * Form-state does not contain hidden members.\n *\n * Note:\n * * If a parent path is hidden, no child paths are included\n * * If a parent path is readOnly, no child paths are included\n * * If a path is hidden, it is not included; only conditionally visible paths will be returned, with hidden: false\n */\nexport function getConditionalMembers(\n docState: DocumentFormNode,\n maxDepth = DEFAULT_MAX_DEPTH,\n): ConditionalMemberState[] {\n const doc: ConditionalMemberInnerState = {\n path: '',\n hidden: false,\n readOnly: !!docState.readOnly,\n conditional: isConditional(docState.schemaType),\n }\n return (\n [doc, ...extractConditionalPaths(docState, Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))]\n .filter((v) => v.conditional)\n // oxlint-disable-next-line no-map-spread\n .map(({conditional: _conditional, ...state}) => ({...state}))\n )\n}\n\nfunction isConditional(schemaType: SchemaType) {\n return typeof schemaType.hidden === 'function' || typeof schemaType.readOnly === 'function'\n}\n\nfunction conditionalState(memberState: {\n path: Path\n schemaType: SchemaType\n readOnly?: boolean\n}): ConditionalMemberInnerState {\n return {\n path: pathToString(memberState.path),\n readOnly: !!memberState.readOnly, // Use actual form state readOnly value\n hidden: false, // If it's in form state members, it's not hidden\n conditional: isConditional(memberState.schemaType),\n }\n}\n\nfunction extractConditionalPaths(\n node: ObjectFormNode | FieldsetState,\n maxDepth: number,\n): ConditionalMemberInnerState[] {\n if (node.path.length >= maxDepth) {\n return []\n }\n\n return node.members.reduce<ConditionalMemberInnerState[]>((acc, member) => {\n if (member.kind === 'error') {\n return acc\n }\n if (member.kind === 'field') {\n const schemaType = member.field.schemaType\n if (schemaType.jsonType === 'object') {\n const innerFields = member.field.readOnly\n ? []\n : // oxlint-disable-next-line no-unsafe-type-assertion\n extractConditionalPaths(member.field as ObjectFormNode, maxDepth)\n return [...acc, conditionalState(member.field), ...innerFields]\n } else if (schemaType.jsonType === 'array') {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const array = member.field as ArrayOfObjectsFormNode | ArrayOfPrimitivesFormNode\n\n let arrayPaths: ConditionalMemberInnerState[] = []\n const isObjectsArray = array.members.some(\n (m) => m.kind === 'item' && isObjectSchemaType(m.item.schemaType),\n )\n if (!array.readOnly) {\n for (const arrayMember of array.members) {\n if (arrayMember.kind === 'error') {\n continue\n }\n\n const innerFields =\n isObjectsArray && !arrayMember.item.readOnly\n ? // oxlint-disable-next-line no-unsafe-type-assertion\n extractConditionalPaths((arrayMember as ArrayOfObjectsItemMember).item, maxDepth)\n : []\n\n arrayPaths = [...arrayPaths, conditionalState(arrayMember.item), ...innerFields]\n }\n }\n return [...acc, conditionalState(array), ...arrayPaths]\n }\n\n return [...acc, conditionalState(member.field)]\n } else if (member.kind === 'fieldSet') {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const conditionalFieldset = !!(node as ObjectFormNode).schemaType?.fieldsets?.some(\n (f) => !f.single && f.name === member.fieldSet.name && typeof f.hidden === 'function',\n )\n // oxlint-disable-next-line no-map-spread\n const innerFields = extractConditionalPaths(member.fieldSet, maxDepth).map((f) => ({\n ...f,\n // if fieldset is conditional, visible fields must also be considered conditional\n conditional: conditionalFieldset || f.conditional,\n }))\n return [...acc, ...innerFields]\n }\n\n return acc\n }, [])\n}\n","import {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {Box, Button, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {releaseAnnouncementUrl} from '../constants'\n\nconst SparklesIllustration = styled(SparklesIcon)({\n 'fontSize': '3.125em',\n '& path': {\n strokeWidth: `0.6px !important`,\n },\n})\n\nexport function InspectorOnboarding(props: {onDismiss: () => void}) {\n const {onDismiss} = props\n return (\n <Box padding={4}>\n <Container width={0}>\n <Stack gap={4}>\n <div style={{textAlign: 'center'}}>\n <SparklesIllustration />\n </div>\n <Text align=\"center\" size={1}>\n Create reusable AI instructions that can be applied across all documents of a certain\n type.\n </Text>\n\n <Flex align=\"center\" gap={2} justify=\"center\">\n <Button\n as=\"a\"\n href={releaseAnnouncementUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n fontSize={1}\n mode=\"default\"\n onClick={onDismiss}\n padding={2}\n text=\"Learn more\"\n tone=\"primary\"\n />\n <Button fontSize={1} mode=\"bleed\" onClick={onDismiss} padding={2} text=\"Dismiss\" />\n </Flex>\n </Stack>\n </Container>\n </Box>\n )\n}\n","import {useCallback, useState} from 'react'\n\nexport const inspectorOnboardingKey = 'sanityStudio:assist:inspector:onboarding:dismissed'\n\nfunction isFeatureOnboardingDismissed(featureKey: string): boolean {\n if (typeof localStorage === 'undefined') {\n return false\n }\n\n const value = localStorage.getItem(featureKey)\n return value === 'true'\n}\n\nfunction dismissFeatureOnboarding(featureKey: string) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(featureKey, 'true')\n}\n\nexport function useOnboardingFeature(featureKey: string) {\n const [showOnboarding, setShowOnboarding] = useState(\n () => !isFeatureOnboardingDismissed(featureKey),\n )\n const dismissOnboarding = useCallback(() => {\n setShowOnboarding(false)\n dismissFeatureOnboarding(featureKey)\n }, [setShowOnboarding, featureKey])\n\n return {showOnboarding, dismissOnboarding}\n}\n","import {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Card, Flex, Text} from '@sanity/ui'\nimport {Autocomplete} from '@sanity/ui/autocomplete'\nimport {Breadcrumbs} from '@sanity/ui/breadcrumbs'\nimport {useCallback, useMemo} from 'react'\nimport type {ObjectSchemaType} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isType} from '../helpers/typeUtils'\nimport {type FieldRef, getDocumentFieldRef} from './helpers'\n\ninterface FieldSelectorProps {\n id: string\n schemaType: ObjectSchemaType\n fieldPath?: string\n onSelect: (path: string) => void\n includeDocument?: boolean\n filter?: (field: FieldRef) => boolean\n}\n\nexport function FieldAutocomplete(props: FieldSelectorProps) {\n const {id, schemaType, fieldPath, onSelect, includeDocument, filter} = props\n\n const {getFieldRefs} = useAiAssistanceConfig()\n\n const fieldRefs = useMemo(() => {\n const refs = getFieldRefs(schemaType.name)\n if (includeDocument) {\n return [getDocumentFieldRef(schemaType), ...refs]\n }\n return refs\n }, [schemaType, includeDocument, getFieldRefs])\n\n const currentField = useMemo(\n () => fieldRefs.find((f) => f.key === fieldPath),\n [fieldPath, fieldRefs],\n )\n\n const autocompleteOptions = useMemo(\n () =>\n fieldRefs\n .filter((field) => (filter ? filter(field) : true))\n .filter((f) => !isType(f.schemaType, 'reference'))\n .map((field) => ({value: field.key, field})),\n [fieldRefs, filter],\n )\n\n const renderOption = useCallback((option: {value: string; field: FieldRef}) => {\n const {value, field} = option\n\n if (!value) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text accent size={1}>\n {option.value}\n </Text>\n </Card>\n )\n }\n\n if (isType(field.schemaType, 'document')) {\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Text size={1} weight=\"semibold\">\n The entire document\n </Text>\n </Card>\n )\n }\n\n return (\n <Card as=\"button\" padding={3} radius={1}>\n <Flex gap={3}>\n <Text size={1}>\n <field.icon />\n </Text>\n\n <FieldTitle field={field} />\n </Flex>\n </Card>\n )\n }, [])\n\n const renderValue = useCallback((value: string, option?: {value: string; field: FieldRef}) => {\n return option?.field.title ?? value\n }, [])\n\n const filterOption = useCallback((query: string, option: {value: string; field: FieldRef}) => {\n const lQuery = query.toLowerCase()\n return (\n option?.value?.toLowerCase().includes(lQuery) ||\n option?.field?.title?.toLowerCase().includes(lQuery)\n )\n }, [])\n\n return (\n <Autocomplete\n fontSize={1}\n icon={currentField ? currentField.icon : SearchIcon}\n onChange={onSelect}\n openButton\n id={id}\n options={autocompleteOptions}\n placeholder=\"Search for a field\"\n radius={2}\n renderOption={renderOption}\n renderValue={renderValue}\n value={currentField?.key}\n filterOption={filterOption}\n />\n )\n}\n\nexport function FieldTitle(props: {field: FieldRef}) {\n const splitTitle = props.field.title.split('/')\n return (\n <Box flex=\"none\">\n <Breadcrumbs\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n marginTop: '-4px',\n }}\n separator={\n <Box marginTop={1}>\n <Text muted size={1}>\n /\n </Text>\n </Box>\n }\n gap={1}\n >\n {splitTitle.slice(0, splitTitle.length - 1).map((pt, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Box key={i} marginTop={1}>\n <Text muted size={1}>\n {pt.trim()}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text size={1} weight=\"medium\">\n {splitTitle[splitTitle.length - 1]}\n </Text>\n </Box>\n </Breadcrumbs>\n </Box>\n )\n}\n","import {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {useEffect, useReducer} from 'react'\n\nfunction useInterval(ms: number) {\n const [tick, update] = useReducer((n) => n + 1, 0)\n\n useEffect(() => {\n const i = setInterval(update, ms)\n return () => clearInterval(i)\n }, [ms])\n return tick\n}\n\nexport function TimeAgo({date}: {date?: string}) {\n useInterval(1000)\n // oxlint-disable-next-line react/purity\n const timeSince = formatDistanceToNow(date ? new Date(date) : new Date())\n return <span title={timeSince}>{timeSince} ago</span>\n}\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {ClockIcon} from '@sanity/icons/Clock'\nimport {CloseCircleIcon} from '@sanity/icons/CloseCircle'\nimport {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {SyncIcon} from '@sanity/icons/Sync'\nimport {\n Box,\n Button,\n Card,\n Flex,\n Spinner,\n Stack,\n Text,\n useClickOutsideEvent,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport {type Ref, useCallback, useMemo, useState} from 'react'\nimport {StatusButton, type StatusButtonProps, typed, useClient} from 'sanity'\nimport {keyframes, styled} from 'styled-components'\n\nimport {TimeAgo} from '../components/TimeAgo'\nimport {maxHistoryVisibilityMs, pluginTitle} from '../constants'\nimport {assistTasksStatusId} from '../helpers/ids'\nimport {getInstructionTitle} from '../helpers/misc'\nimport type {AssistTasksStatus, InstructionTask, StudioInstruction, TaskEndedReason} from '../types'\n\nexport interface InstructionTaskHistoryButtonProps {\n documentId?: string\n tasks: InstructionTask[] | undefined\n instructions: StudioInstruction[] | undefined\n showTitles: boolean\n}\n\ninterface CancelableInstructionTask extends InstructionTask {\n cancel: () => void\n title?: string\n}\n\nconst rotate = keyframes`\n 0% {\n transform: rotate(0);\n }\n 100% {\n transform: rotate(360deg);\n }\n`\n\nconst SyncSpinningIcon = styled(SyncIcon)`\n animation: ${rotate} 1s linear infinite;\n`\n\nconst TASK_CONFIG = {\n aborted: {\n title: 'Canceled',\n icon: CloseCircleIcon,\n tone: 'transparent',\n },\n error: {\n title: 'Error',\n icon: ErrorOutlineIcon,\n tone: 'critical',\n },\n success: {\n title: 'Completed',\n icon: CheckmarkCircleIcon,\n tone: 'positive',\n },\n timeout: {\n title: 'Timeout',\n icon: ClockIcon,\n tone: 'caution',\n },\n} as const\n\nexport function InstructionTaskHistoryButton(props: InstructionTaskHistoryButtonProps) {\n const {tasks, instructions, documentId, showTitles} = props\n\n const client = useClient({apiVersion: '2023-01-01'})\n const cancelRun = useCallback(\n (taskKey: string) => {\n if (!documentId) {\n return\n }\n const statusDocId = assistTasksStatusId(documentId)\n const basePath = `${typed<keyof AssistTasksStatus>('tasks')}[_key==\"${taskKey}\"]`\n client\n .patch(statusDocId)\n .set({\n [`${basePath}.${typed<keyof InstructionTask>('ended')}`]: new Date().toISOString(),\n [`${basePath}.${typed<keyof InstructionTask>('reason')}`]:\n typed<TaskEndedReason>('aborted'),\n })\n .commit()\n .catch(console.error)\n },\n [client, documentId],\n )\n\n const titledTasks = useMemo(() => {\n const t =\n tasks\n ?.filter(\n (task) =>\n task.started &&\n // oxlint-disable-next-line react/purity\n new Date().getTime() - new Date(task.started).getTime() < maxHistoryVisibilityMs,\n )\n // oxlint-disable-next-line no-map-spread\n .map((task): CancelableInstructionTask => {\n const instruction = instructions?.find((i) => i._key === task.instructionKey)\n return {\n ...task,\n title: showTitles ? (task.title ?? getInstructionTitle(instruction)) : undefined,\n cancel: () => cancelRun(task._key),\n }\n }) ?? []\n t.sort((a, b) => new Date(b.started ?? '').getTime() - new Date(a.started ?? '').getTime())\n return t\n }, [tasks, instructions, cancelRun, showTitles])\n\n // const id = useId()\n\n const isRunning = useMemo(() => titledTasks.some((r) => !r.ended), [titledTasks])\n const hasErrors = useMemo(\n () => titledTasks.some((r) => r.reason === 'error' || r.reason === 'timeout'),\n [titledTasks],\n )\n\n const [open, setOpen] = useState(false)\n\n const toggleOpen = useCallback(() => setOpen((v) => !v), [])\n\n const [button, setButton] = useState<HTMLButtonElement | null>(null)\n const [popover, setPopover] = useState<HTMLDivElement | null>(null)\n\n const handleClickOutside = useCallback(() => {\n setOpen(false)\n }, [])\n\n useClickOutsideEvent(handleClickOutside, () => [button, popover])\n\n const handleEscape = useCallback(() => {\n setOpen(false)\n button?.focus()\n }, [button])\n\n return (\n <Popover\n constrainSize\n content={<TaskList onEscape={handleEscape} tasks={titledTasks} />}\n open={open && !!titledTasks?.length}\n placement=\"top\"\n portal\n ref={setPopover}\n width={0}\n >\n <TaskStatusButton\n disabled={!titledTasks?.length}\n hasErrors={hasErrors}\n isRunning={isRunning}\n onClick={toggleOpen}\n ref={setButton}\n selected={open}\n />\n </Popover>\n )\n}\n\nconst TASK_STATUS_BUTTON_TOOLTIP_PROPS: NonNullable<StatusButtonProps['tooltipProps']> = {\n placement: 'top',\n}\n\nfunction TaskStatusButton(props: {\n disabled: boolean\n hasErrors: boolean\n isRunning: boolean\n onClick: () => void\n selected: boolean\n ref?: Ref<HTMLButtonElement>\n}) {\n const {disabled, hasErrors, isRunning, onClick, selected, ref} = props\n\n return (\n <StatusButton\n label={`${pluginTitle} status`}\n aria-label={`${pluginTitle} status`}\n icon={isRunning ? SyncSpinningIcon : hasErrors ? ErrorOutlineIcon : CheckmarkCircleIcon}\n mode=\"bleed\"\n onClick={onClick}\n tone={hasErrors ? 'critical' : undefined}\n disabled={disabled}\n ref={ref}\n selected={selected}\n tooltipProps={TASK_STATUS_BUTTON_TOOLTIP_PROPS}\n />\n )\n}\n\nfunction TaskList(props: {onEscape: () => void; tasks: CancelableInstructionTask[]}) {\n const {onEscape, tasks} = props\n\n const {isTopLayer} = useLayer()\n\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (isTopLayer && event.key === 'Escape') {\n onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n return (\n <Stack padding={1} gap={1}>\n {tasks.map((task) => (\n <TaskItem key={task._key} task={task} />\n ))}\n </Stack>\n )\n}\n\nfunction TaskItem(props: {task: CancelableInstructionTask}) {\n const {task} = props\n\n const taskType = task.reason && TASK_CONFIG[task.reason]\n const TaskIcon = taskType ? taskType.icon : null\n return (\n <Card radius={2} tone={taskType && taskType?.tone}>\n <Flex align=\"center\" gap={1}>\n <Flex align=\"flex-start\" flex={1} gap={3} padding={3}>\n <Box flex=\"none\">\n <Text size={1}>\n {TaskIcon && <TaskIcon />}\n {!task.reason && <Spinner />}\n </Text>\n </Box>\n <Stack flex={1} gap={2}>\n <Text size={1} weight=\"medium\">\n {taskType ? taskType.title : 'Running'}\n {task.title && <>: {task.title}</>}\n </Text>\n {task.message ? <Text size={1}>{task.message}</Text> : null}\n <Text muted size={1}>\n <TimeAgo date={task.ended ?? task.started} />\n </Text>\n </Stack>\n </Flex>\n\n {!task.ended && (\n <Box flex=\"none\" padding={1}>\n <Button fontSize={1} mode=\"bleed\" onClick={task.cancel} text=\"Cancel\" />\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {dequal as isEqual} from 'dequal/lite'\n\ntype PaneParams = Record<string, string | undefined>\n\nexport interface IsolatedPathParams {\n /** The `path` value to keep in the nested pane's local state. */\n nextLocalPath: string | undefined\n /**\n * Params to forward to the host pane router, or `null` when only `path`\n * changed — in which case the host router (and therefore the host document's\n * focus and selected field group) is left untouched.\n */\n forwardParams: PaneParams | null\n}\n\n/**\n * The AI Assist inspector renders a nested document form for the instruction\n * document, but it reuses the host document's pane router. Sanity's document\n * pane mirrors the router `path` param to programmatic focus, and focus drives\n * the selected field group. So when the nested form writes `path`, the host\n * document re-focuses and its field group selection resets (SAPP-3970).\n *\n * This keeps the nested form's `path` navigation local, while still forwarding\n * every other param (e.g. the selected `instruction`) to the host router and\n * preserving the host document's own `path`.\n */\nexport function isolatePathParams(\n nextParams: PaneParams,\n hostParams: PaneParams,\n): IsolatedPathParams {\n const {path: nextLocalPath, ...restNext} = nextParams\n const {path: hostPath, ...restHost} = hostParams\n\n if (isEqual(restNext, restHost)) {\n return {nextLocalPath, forwardParams: null}\n }\n\n return {nextLocalPath, forwardParams: {...restNext, path: hostPath}}\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {PlayIcon} from '@sanity/icons/Play'\nimport {RetryIcon} from '@sanity/icons/Retry'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {type PropsWithChildren, useCallback, useMemo, useRef, useState} from 'react'\nimport {\n type DocumentInspectorProps,\n PerspectiveProvider,\n PresenceOverlay,\n VirtualizerScrollInstanceProvider,\n} from 'sanity'\nimport {\n DocumentInspectorHeader,\n type DocumentPaneNode,\n DocumentPaneProvider,\n PaneRouterContext,\n type PaneRouterContextValue,\n useDocumentPane,\n usePaneRouter,\n} from 'sanity/structure'\nimport {styled} from 'styled-components'\n\nimport {DocumentForm} from '../_lib/form'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {AssistTypeContext} from '../assistDocument/components/AssistTypeContext'\nimport {useStudioAssistDocument} from '../assistDocument/hooks/useStudioAssistDocument'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {giveFeedbackUrl, pluginTitle, releaseAnnouncementUrl, salesUrl} from '../constants'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {assistDocumentId} from '../helpers/ids'\nimport {InspectorOnboarding} from '../onboarding/InspectorOnboarding'\nimport {inspectorOnboardingKey, useOnboardingFeature} from '../onboarding/onboardingStore'\nimport {assistDocumentTypeName, fieldPathParam, instructionParam} from '../types'\nimport {FieldTitle} from './FieldAutocomplete'\nimport {\n type FieldRef,\n getFieldTitle,\n useAiPaneRouter,\n useSelectedField,\n useTypePath,\n} from './helpers'\nimport {InstructionTaskHistoryButton} from './InstructionTaskHistoryButton'\nimport {isolatePathParams} from './isolatePathParams'\n\nconst EMPTY_PANE_PARAMS: Record<string, string | undefined> = {}\n\nconst CardWithShadowBelow = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n border-bottom: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nconst CardWithShadowAbove = styled(Card)`\n position: relative;\n\n &:after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n border-top: 1px solid var(--card-border-color);\n opacity: 0.5;\n z-index: 100;\n }\n`\n\nexport function AssistInspectorWrapper(props: DocumentInspectorProps) {\n const context = useAiAssistanceConfig()\n\n if (context.statusLoading) {\n return (\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Stack gap={3} style={{textAlign: 'center'}}>\n <Spinner muted />\n <Text muted size={1}>\n Loading {pluginTitle}...\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n const status = context.status\n\n if (!status?.enabled) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack flex={1} overflow=\"auto\" padding={4} gap={3}>\n <Text as=\"p\" size={1} weight=\"semibold\">\n {pluginTitle} is not available\n </Text>\n\n <Text as=\"p\" muted size={1}>\n Please get in touch with a Sanity account manager or{' '}\n <a href={salesUrl} target=\"_blank\" rel=\"noreferrer\">\n contact our sales team\n </a>{' '}\n to get started with {pluginTitle}.{' '}\n <a href={releaseAnnouncementUrl} target=\"_blank\" rel=\"noreferrer\">\n Learn more →\n </a>\n </Text>\n </Stack>\n </Flex>\n )\n }\n\n if (!status?.initialized || !status.validToken) {\n return (\n <Flex direction=\"column\" height=\"fill\">\n <DocumentInspectorHeader\n closeButtonLabel=\"Close\"\n onClose={props.onClose}\n title={pluginTitle}\n />\n\n <Stack padding={4} gap={3}>\n {context.error ? (\n <Text size={1} weight=\"semibold\">\n Failed to start {pluginTitle}\n </Text>\n ) : null}\n\n {!context.error && !status?.initialized ? (\n <Text size={1} weight=\"semibold\">\n {pluginTitle} is not enabled\n </Text>\n ) : null}\n\n {!context.error && status?.initialized && !status.validToken ? (\n <>\n <Text size={1} weight=\"semibold\">\n Invalid token\n </Text>\n <Text muted size={1}>\n The token used by the AI Assistant is not valid and has to be regenerated.\n </Text>\n </>\n ) : null}\n\n {context.error && (\n <Text muted size={1}>\n Something went wrong. See console for details.\n </Text>\n )}\n\n {!context.error && !status?.initialized && (\n <Text size={1} muted>\n Please enable {pluginTitle}.\n </Text>\n )}\n\n <Button\n fontSize={1}\n icon={\n context.initLoading ? (\n <Box marginTop={1}>\n <Spinner />\n </Box>\n ) : context.error ? (\n RetryIcon\n ) : undefined\n }\n text={\n context.error\n ? 'Retry'\n : status?.initialized && !status.validToken\n ? `Restore ${pluginTitle}`\n : `Enable ${pluginTitle} now`\n }\n tone=\"primary\"\n onClick={context.init}\n disabled={context.initLoading}\n />\n </Stack>\n </Flex>\n )\n }\n\n return <AssistInspector {...props} />\n}\n\nfunction AssistInspector(props: DocumentInspectorProps) {\n const {params} = useAiPaneRouter()\n\n const boundary = useRef<HTMLDivElement | null>(null)\n const pathKey = params?.[fieldPathParam]\n const instructionKey = params?.[instructionParam]\n const documentPane = useDocumentPane()\n const {\n documentId,\n documentType,\n value: docValue,\n schemaType,\n onChange: documentOnChange,\n formState,\n } = documentPane\n\n const {assistableDocumentId, documentIsAssistable, documentIsSyncing} = useAssistDocumentContext()\n\n const formStateRef = useRef(formState)\n // oxlint-disable-next-line react/refs\n formStateRef.current = formState\n\n const {instructionLoading, requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n })\n\n const typePath = useTypePath(docValue, pathKey ?? '')\n const selectedField = useSelectedField(schemaType, typePath)\n\n const aiDocId = assistDocumentId(documentType)\n\n const assistDocument = useStudioAssistDocument({documentId, schemaType, initDoc: true})\n const assistField = assistDocument?.fields?.find((f) => f.path === typePath)\n const instruction = assistField?.instructions?.find((i) => i._key === instructionKey)\n const tasks = useMemo(\n () =>\n assistDocument?.tasks?.filter((i) => !instructionKey || i.instructionKey === instructionKey),\n [assistDocument?.tasks, instructionKey],\n )\n const instructions = useMemo(\n () => assistDocument?.fields?.flatMap((f) => f.instructions ?? []),\n [assistDocument?.fields],\n )\n\n const promptValue = instruction?.prompt\n const isEmptyPrompt = useMemo(() => {\n if (!promptValue?.length) {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const firstBlock = promptValue[0] as any\n const children = firstBlock?.children\n\n return promptValue.length == 1 && children?.length === 1 && !children?.[0]?.text?.length\n }, [promptValue])\n\n const paneNode: DocumentPaneNode = useMemo(\n () => ({\n type: 'document',\n id: aiDocId,\n title: pluginTitle,\n options: {\n id: aiDocId,\n type: assistDocumentTypeName,\n },\n }),\n [aiDocId],\n )\n\n const runCurrentInstruction = useCallback(\n () =>\n instruction &&\n pathKey &&\n typePath &&\n requestRunInstruction({\n documentId: assistableDocumentId,\n path: pathKey,\n typePath,\n assistDocumentId: assistDocumentId(documentType),\n instruction,\n conditionalMembers: formStateRef.current ? getConditionalMembers(formStateRef.current) : [],\n }),\n [pathKey, instruction, typePath, documentType, assistableDocumentId, requestRunInstruction],\n )\n\n const Region = useCallback((_props: any) => {\n // disabled for now\n /* return (\n <ConnectToRegion\n {..._props}\n _key={`${paneKey}_${selectedField?.key || '_field'}`}\n style={{height: '100%', flex: 1, overflow: 'auto'}}\n />\n )*/\n return <div {..._props} style={{height: '100%', flex: 1, overflow: 'auto'}} />\n }, [])\n\n const assistTypeContext = useMemo(() => ({typePath, documentType}), [typePath, documentType])\n\n if (!documentId || !schemaType || schemaType.jsonType !== 'object') {\n return (\n <Card flex={1} padding={4}>\n <Text>Document not ready yet.</Text>\n </Card>\n )\n }\n\n return (\n <Flex\n ref={boundary}\n direction=\"column\"\n height=\"fill\"\n overflow=\"hidden\"\n sizing=\"border\"\n style={{lineHeight: 0}}\n >\n <AiInspectorHeader\n onClose={props.onClose}\n field={selectedField}\n fieldTitle={getFieldTitle(selectedField)}\n />\n\n <Card as={Region} flex={1} overflow=\"auto\">\n <Flex direction=\"column\" style={{minHeight: '100%'}}>\n <Box flex={1}>\n <PresenceOverlay>\n <Box padding={4}>\n {selectedField && (\n <AssistTypeContext.Provider value={assistTypeContext}>\n <VirtualizerScrollInstanceProvider\n // oxlint-disable-next-line react/refs\n scrollElement={boundary.current}\n containerElement={boundary}\n >\n <PerspectiveProvider selectedPerspectiveName={undefined}>\n <IsolatedPathPaneRouterProvider>\n <DocumentPaneProvider\n paneKey={documentPane.paneKey}\n index={documentPane.index}\n itemId=\"ai\"\n pane={paneNode}\n >\n <DocumentForm />\n </DocumentPaneProvider>\n </IsolatedPathPaneRouterProvider>\n </PerspectiveProvider>\n </VirtualizerScrollInstanceProvider>\n </AssistTypeContext.Provider>\n )}\n </Box>\n </PresenceOverlay>\n </Box>\n\n <Box flex=\"none\" padding={4}>\n <Text muted size={1}>\n How is Sanity AI Assist working for you?{' '}\n <a\n href={giveFeedbackUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{whiteSpace: 'nowrap'}}\n >\n Let us know <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n </Flex>\n </Card>\n <CardWithShadowAbove flex=\"none\" paddingX={4} paddingY={3} style={{justifySelf: 'flex-end'}}>\n <Flex gap={2} flex={1} justify=\"flex-end\">\n {schemaType?.name && pathKey && instructionKey && (\n <Stack flex={1}>\n <Button\n mode=\"ghost\"\n disabled={isEmptyPrompt || instructionLoading}\n fontSize={1}\n icon={instructionLoading ? <Spinner style={{marginTop: 3}} /> : PlayIcon}\n onClick={runCurrentInstruction}\n padding={3}\n text={'Run instruction'}\n />\n </Stack>\n )}\n\n <InstructionTaskHistoryButton\n documentId={assistableDocumentId}\n tasks={tasks}\n instructions={instructions}\n showTitles={!instructionKey}\n />\n </Flex>\n </CardWithShadowAbove>\n </Flex>\n )\n}\n\n/**\n * The instruction editor below renders a nested document form that reuses the\n * host document's pane router. Sanity's document pane mirrors the router `path`\n * param to programmatic focus, and focus drives the selected field group. So\n * without isolation, navigating the instruction form overwrites the host `path`\n * and resets the host document's field group selection (SAPP-3970).\n *\n * This provider keeps the nested form's `path` navigation in local state while\n * still forwarding every other param (e.g. the selected instruction) to the\n * host pane router.\n */\nfunction IsolatedPathPaneRouterProvider(props: PropsWithChildren) {\n const parentRouter = usePaneRouter()\n const parentParams = parentRouter.params ?? EMPTY_PANE_PARAMS\n const parentSetParams = parentRouter.setParams\n\n const [localPath, setLocalPath] = useState<string | undefined>(undefined)\n\n const setParams = useCallback<PaneRouterContextValue['setParams']>(\n (nextParams, stickyParams) => {\n const {nextLocalPath, forwardParams} = isolatePathParams(nextParams, parentParams)\n setLocalPath(nextLocalPath)\n if (forwardParams) {\n parentSetParams(forwardParams, stickyParams)\n }\n },\n [parentParams, parentSetParams],\n )\n\n const value = useMemo<PaneRouterContextValue>(\n () => ({\n ...parentRouter,\n params: {...parentParams, path: localPath},\n setParams,\n }),\n [parentRouter, parentParams, localPath, setParams],\n )\n\n return <PaneRouterContext.Provider value={value}>{props.children}</PaneRouterContext.Provider>\n}\n\nfunction AiInspectorHeader(props: {fieldTitle: string; field?: FieldRef; onClose: () => void}) {\n const {onClose, field, fieldTitle} = props\n const {showOnboarding, dismissOnboarding} = useOnboardingFeature(inspectorOnboardingKey)\n\n return (\n <CardWithShadowBelow flex=\"none\" padding={2}>\n <Flex flex={1} align=\"center\">\n <Flex flex={1} padding={3} gap={2} align=\"center\">\n <Flex gap={1} align=\"center\" wrap=\"wrap\" style={{marginTop: '-4px'}}>\n <Box marginTop={1}>\n <Text size={1} weight=\"semibold\">\n AI instructions for\n </Text>\n </Box>\n <Card radius={2} border padding={1} marginTop={1}>\n {field ? (\n <FieldTitle field={field} />\n ) : (\n <Text size={1} weight=\"semibold\">\n {fieldTitle}\n </Text>\n )}\n </Card>\n </Flex>\n </Flex>\n <Box flex=\"none\">\n <Button fontSize={1} icon={CloseIcon} mode=\"bleed\" onClick={onClose} />\n </Box>\n </Flex>\n\n {showOnboarding && <InspectorOnboarding onDismiss={dismissOnboarding} />}\n </CardWithShadowBelow>\n )\n}\n","export const aiInspectorId = 'ai-assistance'\n","import {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {type DocumentInspector, typed} from 'sanity'\n\nimport {pluginTitle} from '../constants'\nimport {type AssistInspectorRouteParams, fieldPathParam, instructionParam} from '../types'\nimport {AssistInspectorWrapper} from './AssistInspector'\nimport {aiInspectorId} from './constants'\n\nexport const assistInspector: DocumentInspector = {\n name: aiInspectorId,\n useMenuItem: () => ({\n icon: SparklesIcon,\n title: pluginTitle,\n hidden: true,\n showAsAction: false,\n }),\n component: AssistInspectorWrapper,\n onClose({params}) {\n return {\n params: typed<AssistInspectorRouteParams>({\n ...params,\n [fieldPathParam]: undefined,\n [instructionParam]: undefined,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as typeof params,\n }\n },\n}\n","import type {ConnectorOptions} from '../../_lib/connector'\n\nexport function arrowPath(options: ConnectorOptions, x: number, y: number, dir: 1 | -1): string {\n return [\n `M ${x - options.arrow.size} ${y - options.arrow.size * dir} `,\n `L ${x} ${y}`,\n `L ${x + options.arrow.size} ${y - options.arrow.size * dir}`,\n ].join('')\n}\n","import type {ConnectorLine, ConnectorOptions} from '../../_lib/connector'\n\nfunction moveTo(x: number, y: number) {\n return `M${x} ${y}`\n}\n\nfunction lineTo(x: number, y: number) {\n return `L${x} ${y}`\n}\n\nfunction join(strings: string[], delim = '') {\n return strings.join(delim)\n}\n\nfunction quadCurve(x1: number, y1: number, x: number, y: number) {\n return `Q${x1} ${y1} ${x} ${y}`\n}\n\nexport function drawConnectorPath(options: ConnectorOptions, line: ConnectorLine): string {\n const {cornerRadius} = options.path\n const {from, to} = line\n const {x: fromX, y: fromY} = from\n const {x: _toX, y: toY} = to\n\n const toX = _toX - 1\n\n // Calculate divider position\n const dividerX = to.bounds.x + options.divider.offsetX\n\n // Calculate connector FROM path X position\n const fromPathX = from.isAbove || from.isBelow ? fromX + options.arrow.marginX : fromX\n\n // Calculate maximum corner radius\n const r0 = Math.min(cornerRadius, Math.abs(fromPathX - dividerX) / 2)\n const r1 = Math.min(cornerRadius, Math.abs(fromY - toY) / 2)\n\n const cmds: string[] = []\n\n // FROM\n if (from.isAbove) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY - options.arrow.threshold + options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY - r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else if (from.isBelow) {\n cmds.push(\n moveTo(\n fromX + options.arrow.marginX,\n fromY + options.arrow.threshold - options.arrow.marginY,\n ),\n lineTo(fromX + options.arrow.marginX, fromY + r0),\n quadCurve(fromX + options.arrow.marginX, fromY, fromX + options.arrow.marginX + r0, fromY),\n )\n } else {\n cmds.push(moveTo(fromX, fromY))\n }\n\n // TO\n if (to.isAbove) {\n if (fromY < to.bounds.y) {\n cmds.push(\n lineTo(dividerX - r1, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - cornerRadius),\n lineTo(dividerX, toY - options.arrow.threshold + options.arrow.marginY),\n )\n }\n } else if (to.isBelow) {\n if (fromY > to.bounds.y + to.bounds.h) {\n // curl around\n cmds.push(\n lineTo(dividerX - options.arrow.marginX - r1, fromY),\n quadCurve(\n dividerX - options.arrow.marginX,\n fromY,\n dividerX - options.arrow.marginX,\n fromY - r1,\n ),\n lineTo(dividerX - options.arrow.marginX, toY + r1),\n quadCurve(\n dividerX - options.arrow.marginX,\n toY,\n dividerX - options.arrow.marginX + r1,\n toY,\n ),\n lineTo(dividerX - cornerRadius, toY),\n quadCurve(dividerX, toY, dividerX, toY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - cornerRadius, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + cornerRadius),\n lineTo(dividerX, toY + options.arrow.threshold - options.arrow.marginY),\n )\n }\n } else if (fromY < toY) {\n cmds.push(\n lineTo(dividerX - r0, fromY),\n quadCurve(dividerX, fromY, dividerX, fromY + r1),\n lineTo(dividerX, toY - r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n } else {\n cmds.push(\n lineTo(dividerX - Math.min(r0, r1), fromY),\n quadCurve(dividerX, fromY, dividerX, fromY - Math.min(r0, r1)),\n lineTo(dividerX, toY + r1),\n quadCurve(dividerX, toY, dividerX + r1, toY),\n lineTo(toX, toY),\n )\n }\n\n return join(cmds)\n}\n","// oxlint-disable no-deprecated\nimport {rgba, useTheme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {type ConnectorOptions, mapConnectorToLine, type Rect} from '../_lib/connector'\nimport {arrowPath} from './draw/arrowPath'\nimport {drawConnectorPath} from './draw/connectorPath'\n\nexport function ConnectorPath(props: {\n from: {bounds: Rect; element: Rect}\n to: {bounds: Rect; element: Rect}\n options: ConnectorOptions\n}) {\n const {from, options, to} = props\n const {strokeWidth} = options.path\n const theme = useTheme()\n\n const line = useMemo(() => mapConnectorToLine(options, {from, to}), [from, options, to])\n\n return (\n <>\n <path\n d={drawConnectorPath(options, line)}\n stroke={theme.sanity.color.base.bg}\n strokeWidth={strokeWidth + 4}\n />\n\n <path\n d={drawConnectorPath(options, line)}\n stroke={rgba(theme.sanity.color.base.border, 0.5)}\n strokeWidth={strokeWidth}\n />\n\n {line.from.isAbove && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y - options.arrow.threshold + options.arrow.marginY,\n -1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n\n {line.from.isBelow && (\n <path\n d={arrowPath(\n options,\n line.from.x + options.arrow.marginX,\n line.from.bounds.y +\n line.from.bounds.h +\n options.arrow.threshold -\n options.arrow.marginY,\n 1,\n )}\n stroke={theme.sanity.color.base.border}\n strokeWidth={strokeWidth}\n />\n )}\n </>\n )\n}\n","import {Fragment, useEffect, useState} from 'react'\n\nimport type {Connector, ConnectorOptions} from '../_lib/connector'\nimport {ConnectorPath} from './ConnectorPath'\n\nconst DEBUG = false\n\nconst options: ConnectorOptions = {\n arrow: {\n marginX: 10.5,\n marginY: 5,\n size: 4,\n threshold: 16.5,\n },\n divider: {\n offsetX: -10.5,\n },\n path: {\n cornerRadius: 3,\n marginY: 10.5,\n strokeWidth: 1,\n },\n}\n\nexport function AssistConnectorsOverlay(props: {connectors: Connector[]}) {\n const {connectors} = props\n // const zIndexes = connectors.map((connector) => {\n // const zIndex = connector.from.payload?.zIndex\n\n // if (typeof zIndex === 'number') {\n // return zIndex\n // }\n\n // return 1\n // })\n const [, setRedraw] = useState(false)\n useEffect(() => {\n // hacky workaround to force redraw for connectors on initial render\n // this seem to improve initial measurements of elements\n // oxlint-disable-next-line react/set-state-in-effect\n setRedraw(true)\n }, [])\n\n // const zIndex = zIndexes.length ? Math.max(...zIndexes) : 1\n\n return (\n <>\n <svg\n fill=\"none\"\n width={window.innerWidth}\n height={window.innerHeight}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 150,\n // zIndex,\n }}\n >\n {connectors.map((connector) => (\n <ConnectorPath\n from={connector.from}\n key={connector.key}\n options={options}\n to={connector.to}\n />\n ))}\n </svg>\n {DEBUG &&\n connectors.map(({key, from, to}) => {\n return (\n <Fragment key={key}>\n <div\n style={{\n position: 'fixed',\n top: from.bounds.y,\n left: from.bounds.x,\n width: from.bounds.w,\n height: from.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted red',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: from.element.y - from.bounds.y,\n left: from.element.x - from.bounds.x,\n width: from.element.w,\n height: from.element.h,\n border: '1px solid red',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div\n style={{\n position: 'fixed',\n top: to.bounds.y,\n left: to.bounds.x,\n width: to.bounds.w,\n height: to.bounds.h,\n pointerEvents: 'none',\n overflow: 'hidden',\n outline: '1px dotted teal',\n outlineOffset: -1,\n zIndex: 10000000 - 1,\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: to.element.y - to.bounds.y,\n left: to.element.x - to.bounds.x,\n width: to.element.w,\n height: to.element.h,\n border: '1px solid teal',\n boxSizing: 'border-box',\n }}\n />\n </div>\n </Fragment>\n )\n })}\n </>\n )\n}\n","import {packageName} from '../constants'\nimport type {TranslateStyleguide, TranslateStyleguideContext} from '../translate/types'\n\nexport function validateStyleguide(styleguide: string | undefined) {\n if (styleguide && styleguide.length > 2000) {\n throw new Error(\n `[${packageName}]: \\`translate.styleguide\\` value is too long. It must be 2000 characters or less, but was ${styleguide.length} characters`,\n )\n }\n return styleguide\n}\n\nexport function createStyleGuideResolver(\n styleguide: TranslateStyleguide | undefined,\n context: TranslateStyleguideContext,\n) {\n return async () => {\n if (typeof styleguide !== 'function') {\n return styleguide\n }\n const styleguideResult = await styleguide(context)\n return validateStyleguide(styleguideResult)\n }\n}\n","import get from 'lodash-es/get.js'\nimport type {SanityDocumentLike} from 'sanity'\n\nexport const getLanguageParams = (\n select: Record<string, string> | undefined,\n document: SanityDocumentLike | undefined,\n): Record<string, unknown> => {\n if (!select || !document) {\n return {}\n }\n\n const selection: Record<string, string> = select || {}\n const selectedValue: Record<string, unknown> = {}\n for (const [key, path] of Object.entries(selection)) {\n let value = get(document, path)\n if (Array.isArray(value)) {\n // If there are references in the array, ensure they have `_ref` set, otherwise they are considered empty and can safely be ignored\n value = value.filter((item) =>\n typeof item === 'object' ? item?._type !== 'reference' || '_ref' in item : true,\n )\n }\n selectedValue[key] = value\n }\n\n return selectedValue\n}\n","const toFieldLanguagesKeyPrefix = 'sanityStudio:assist:field-languages:from:'\n\nexport function getPreferredToFieldLanguages(fromLanguageId: string): string[] {\n if (typeof localStorage === 'undefined') {\n return []\n }\n\n const value = localStorage.getItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`)\n if (!value) return []\n try {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return JSON.parse(value) as string[]\n } catch {\n return []\n }\n}\n\nexport function setPreferredToFieldLanguages(fromLanguageId: string, languageIds: string[]) {\n if (typeof localStorage === 'undefined') {\n return\n }\n\n localStorage.setItem(`${toFieldLanguagesKeyPrefix}${fromLanguageId}`, JSON.stringify(languageIds))\n}\n","// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nconst getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).substring(1)\n }\n return table\n }\n})()\n\nexport function randomKey(length?: number) {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","// oxlint-disable no-accumulating-spread\nimport {extractWithPath} from '@sanity/mutator'\nimport {\n isDocumentSchemaType,\n isKeySegment,\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n isRecord,\n} from 'sanity'\n\nimport {randomKey} from '../_lib/randomKey'\nimport type {DocumentMember, TranslationOutput, TranslationOutputsFunction} from './types'\n\nexport interface FieldLanguageMap {\n inputLanguageId: string\n inputPath: Path\n outputs: TranslationOutput[]\n relativeLanguagePath?: Path\n}\n\nconst DEFAULT_MAX_DEPTH = 6\nconst ABSOLUTE_MAX_DEPTH = 50\n\nexport function getDocumentMembersFlat(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n maxDepth = DEFAULT_MAX_DEPTH,\n) {\n if (!isDocumentSchemaType(schemaType)) {\n console.error(`Schema type is not a document`)\n return []\n }\n\n return extractPaths(doc, schemaType, [], Math.min(maxDepth, ABSOLUTE_MAX_DEPTH))\n}\n\nfunction extractPaths(\n doc: SanityDocumentLike,\n schemaType: ObjectSchemaType,\n path: Path,\n maxDepth: number,\n): DocumentMember[] {\n if (path.length >= maxDepth) {\n return []\n }\n\n return schemaType.fields.reduce<DocumentMember[]>((acc, field) => {\n const fieldPath = [...path, field.name]\n const fieldSchema = field.type\n const parentValue = path.length ? extractWithPath(pathToString(path), doc)[0]?.value : doc\n const value = isRecord(parentValue) ? parentValue[field.name] : undefined\n\n if (value === undefined || value === null) {\n return acc\n }\n\n const thisFieldWithPath: DocumentMember = {\n path: fieldPath,\n name: field.name,\n schemaType: fieldSchema,\n value,\n parentValue,\n }\n\n if (fieldSchema.jsonType === 'object') {\n const innerFields = extractPaths(doc, fieldSchema, fieldPath, maxDepth)\n\n return [...acc, thisFieldWithPath, ...innerFields]\n } else if (\n fieldSchema.jsonType === 'array' &&\n fieldSchema.of.length &&\n fieldSchema.of.some((item) => 'fields' in item) &&\n // no reason to drill into arrays if the item fields will be culled by maxDepth, ie we need 1 extra path headroom\n path.length + 1 < maxDepth\n ) {\n const {value: arrayValue} = extractWithPath(pathToString(fieldPath), doc)[0] ?? {}\n\n let arrayPaths: DocumentMember[] = []\n // oxlint-disable-next-line no-unsafe-type-assertion\n if ((arrayValue as any)?.length) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n for (const item of arrayValue as any[]) {\n const itemPath = [...fieldPath, {_key: item._key}]\n let itemSchema = fieldSchema.of.find((t) => t.name === item._type)\n if (!item._type) {\n itemSchema = fieldSchema.of[0]\n console.warn(\n 'Array item is missing _type - using the first defined type in the array.of schema',\n {\n itemPath,\n item,\n itemSchema,\n },\n )\n }\n if (item._key && itemSchema) {\n const innerFields = extractPaths(\n doc,\n // oxlint-disable-next-line no-unsafe-type-assertion\n itemSchema as ObjectSchemaType,\n itemPath,\n maxDepth,\n )\n const arrayMember = {\n path: itemPath,\n name: item._key,\n schemaType: itemSchema,\n value: item,\n parentValue: arrayValue,\n }\n arrayPaths = [...arrayPaths, arrayMember, ...innerFields]\n }\n }\n }\n\n return [...acc, thisFieldWithPath, ...arrayPaths]\n }\n\n return [...acc, thisFieldWithPath]\n }, [])\n}\n\ntype InternationalizedArrayItemValue = {\n language?: string // Available in >=v5\n _key?: string // In <v5 this represents the language identifier\n value?: unknown\n}\n\nconst isInternationalizedArrayItemValue = (\n value: unknown,\n): value is InternationalizedArrayItemValue =>\n typeof value === 'object' && value !== null && ('language' in value || '_key' in value)\n\nexport const defaultLanguageOutputs: TranslationOutputsFunction = function (\n member,\n enclosingType,\n translateFromLanguageId,\n translateToLanguageIds,\n) {\n if (\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray') &&\n isInternationalizedArrayItemValue(member.value)\n ) {\n const isV5InternationalizedArrayItem = member.value.language !== undefined\n\n if (isV5InternationalizedArrayItem) {\n const language = member.value.language\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => {\n const outputPathKey =\n (Array.isArray(member.parentValue)\n ? member.parentValue\n : ([] as InternationalizedArrayItemValue[])\n )\n // Uses parent value to verify if the item is already translated to the target language and reuse the key if it is\n .find((item) => item.language === translateToId)?._key || randomKey()\n\n return {\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: outputPathKey}],\n }\n })\n : undefined\n }\n\n const pathEnd = member.path.slice(-1)\n\n const language = pathEnd[0] && isKeySegment(pathEnd[0]) ? pathEnd[0]._key : null\n return language === translateFromLanguageId\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), {_key: translateToId}],\n }))\n : undefined\n }\n\n if (enclosingType.jsonType === 'object' && enclosingType.name.startsWith('locale')) {\n return translateFromLanguageId === member.name\n ? translateToLanguageIds.map((translateToId) => ({\n id: translateToId,\n outputPath: [...member.path.slice(0, -1), translateToId],\n }))\n : undefined\n }\n\n return undefined\n}\n\nexport function getFieldLanguageMap(\n documentSchema: ObjectSchemaType,\n documentMembers: DocumentMember[],\n translateFromLanguageId: string,\n outputLanguageIds: string[],\n langFn: TranslationOutputsFunction,\n): FieldLanguageMap[] {\n const translationMaps: FieldLanguageMap[] = []\n for (const member of documentMembers) {\n const parentPath = member.path.slice(0, -1)\n const enclosingType =\n documentMembers.find((m) => pathToString(m.path) === pathToString(parentPath))?.schemaType ??\n documentSchema\n\n const isV5InternationalizedArrayItem =\n member.schemaType.jsonType === 'object' &&\n member.schemaType.name.startsWith('internationalizedArray') &&\n isInternationalizedArrayItemValue(member.value) &&\n member.value.language !== undefined\n\n const translations = langFn(\n member,\n enclosingType,\n translateFromLanguageId,\n outputLanguageIds,\n )?.filter((translation) => translation.id !== translateFromLanguageId)\n\n if (translations) {\n translationMaps.push({\n inputLanguageId: translateFromLanguageId,\n inputPath: member.path,\n outputs: translations,\n ...(isV5InternationalizedArrayItem ? {relativeLanguagePath: ['language']} : {}),\n })\n }\n }\n\n return translationMaps\n}\n","import {PlayIcon} from '@sanity/icons/Play'\nimport {Box, Button, Checkbox, Dialog, Flex, Radio, Spinner, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useId,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ObjectSchemaType,\n type Path,\n pathToString,\n type SanityDocumentLike,\n useClient,\n} from 'sanity'\n\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport type {ConditionalMemberState} from '../helpers/conditionalMembers'\nimport {getAssistWriteDocumentId} from '../helpers/ids'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {getLanguageParams} from './getLanguageParams'\nimport {getPreferredToFieldLanguages, setPreferredToFieldLanguages} from './languageStore'\nimport {\n defaultLanguageOutputs,\n type FieldLanguageMap,\n getDocumentMembersFlat,\n getFieldLanguageMap,\n} from './paths'\nimport type {Language} from './types'\n\ninterface FieldTranslationParams {\n document: SanityDocumentLike\n documentSchema: ObjectSchemaType\n translatePath: Path\n conditionalMembers: ConditionalMemberState[]\n}\n\nexport interface FieldTranslationContextValue {\n openFieldTranslation: (args: FieldTranslationParams) => void\n translationLoading: boolean\n}\n\nconst FieldTranslationContext = createContext<FieldTranslationContextValue>({\n openFieldTranslation: () => {},\n translationLoading: false,\n})\n\nexport function useFieldTranslation() {\n return useContext(FieldTranslationContext)\n}\n\nfunction hasValuesToTranslate(\n fieldLanguageMaps: FieldLanguageMap[] | undefined,\n fromLanguage: Language | undefined,\n basePath: Path,\n) {\n return fieldLanguageMaps?.some(\n (map) =>\n map.inputLanguageId === fromLanguage?.id &&\n map.inputPath &&\n pathToString(map.inputPath).startsWith(pathToString(basePath)),\n )\n}\n\nexport function FieldTranslationProvider(props: PropsWithChildren<{}>) {\n const {config: assistConfig} = useAiAssistanceConfig()\n\n const apiClient = useApiClient(assistConfig.__customApiClient)\n const styleguide = assistConfig.translate?.styleguide\n const config = assistConfig.translate?.field\n const {translate: runTranslate} = useTranslate(apiClient)\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [fieldTranslationParams, setFieldTranslationParams] = useState<\n FieldTranslationParams | undefined\n >()\n const [languages, setLanguages] = useState<Language[] | undefined>()\n const [fromLanguage, setFromLanguage] = useState<Language | undefined>(undefined)\n const [toLanguages, setToLanguages] = useState<Language[] | undefined>(undefined)\n const [fieldLanguageMaps, setFieldLanguageMaps] = useState<FieldLanguageMap[] | undefined>()\n\n const close = useCallback(() => {\n setDialogOpen(false)\n setLanguages(undefined)\n setFieldTranslationParams(undefined)\n }, [])\n const languageClient = useClient({\n apiVersion: config?.apiVersion ?? API_VERSION_WITH_EXTENDED_TYPES,\n })\n const documentId = fieldTranslationParams?.document?._id\n const id = useId()\n\n const selectFromLanguage = useCallback(\n (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => {\n const {document, documentSchema} = params ?? {}\n setFromLanguage(from)\n if (!document || !documentSchema || !params || !languages) {\n setFieldLanguageMaps(undefined)\n return\n }\n\n const preferred = getPreferredToFieldLanguages(from.id)\n const allToLanguages = languages.filter((l) => l.id !== from?.id)\n const filteredToLanguages = allToLanguages.filter(\n (l) => !preferred.length || preferred.includes(l.id),\n )\n\n setToLanguages(filteredToLanguages)\n const fromId = from?.id\n const allToIds = allToLanguages?.map((l) => l.id) ?? []\n const docMembers = getDocumentMembersFlat(document, documentSchema, config?.maxPathDepth)\n if (fromId && allToIds?.length) {\n const transMap = getFieldLanguageMap(\n documentSchema,\n docMembers,\n fromId,\n allToIds.filter((toId) => fromId !== toId),\n config?.translationOutputs ?? defaultLanguageOutputs,\n )\n setFieldLanguageMaps(transMap)\n } else {\n setFieldLanguageMaps(undefined)\n }\n },\n [config],\n )\n\n const toggleToLanguage = useCallback(\n (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => {\n if (!languages || !fromLanguage) {\n return\n }\n const wasSelected = !!toLanguages?.find((l) => l.id === toggledLang.id)\n const newToLangs = languages.filter(\n (anyLang) =>\n !!toLanguages?.find(\n (selectedLang) => toggledLang.id !== selectedLang.id && selectedLang.id === anyLang.id,\n ) ||\n (toggledLang.id === anyLang.id && !wasSelected),\n )\n setToLanguages(newToLangs)\n setPreferredToFieldLanguages(\n fromLanguage.id,\n newToLangs.map((l) => l.id),\n )\n },\n [fromLanguage],\n )\n\n const openFieldTranslation = useCallback(\n async (params: FieldTranslationParams) => {\n setDialogOpen(true)\n const languageParams = getLanguageParams(config?.selectLanguageParams, params.document)\n const languages: Language[] | undefined = await (typeof config?.languages === 'function'\n ? config?.languages(languageClient, languageParams)\n : Promise.resolve(config?.languages))\n setLanguages(languages)\n setFieldTranslationParams(params)\n const fromLanguage = languages?.[0]\n if (fromLanguage) {\n selectFromLanguage(fromLanguage, languages, params)\n } else {\n console.error('No languages available for selected language params', languageParams)\n }\n },\n [selectFromLanguage, config, languageClient],\n )\n\n const contextValue: FieldTranslationContextValue = useMemo(() => {\n return {\n openFieldTranslation,\n translationLoading: false,\n }\n }, [openFieldTranslation])\n\n const runDisabled =\n !fromLanguage ||\n !toLanguages?.length ||\n !fieldLanguageMaps?.length ||\n !documentId ||\n !hasValuesToTranslate(fieldLanguageMaps, fromLanguage, fieldTranslationParams.translatePath)\n\n const onRunTranslation = useCallback(() => {\n const translatePath = fieldTranslationParams?.translatePath\n if (fieldLanguageMaps && documentId && translatePath) {\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: fieldTranslationParams?.documentSchema?.liveEdit,\n })\n void runTranslate({\n documentId: writeDocumentId,\n translatePath,\n styleguide: createStyleGuideResolver(styleguide, {\n client: languageClient,\n documentId: writeDocumentId,\n schemaType: fieldTranslationParams?.documentSchema,\n translatePath,\n }),\n fieldLanguageMap: fieldLanguageMaps.map((map) => ({\n ...map,\n outputs: map.outputs.filter((out) => !!toLanguages?.find((l) => l.id === out.id)),\n })),\n conditionalMembers: fieldTranslationParams?.conditionalMembers,\n })\n }\n close()\n }, [\n fieldLanguageMaps,\n documentId,\n runTranslate,\n styleguide,\n close,\n toLanguages,\n fieldTranslationParams?.translatePath,\n fieldTranslationParams?.conditionalMembers,\n fieldTranslationParams?.documentSchema,\n languageClient,\n ])\n\n const runButton = (\n <Button\n text={`Translate`}\n tone=\"primary\"\n icon={PlayIcon}\n style={{width: '100%'}}\n disabled={runDisabled}\n onClick={onRunTranslation}\n />\n )\n\n return (\n <FieldTranslationContext.Provider value={contextValue}>\n {dialogOpen ? (\n <Dialog\n id={id}\n width={1}\n open={dialogOpen}\n onClose={close}\n header=\"Translate fields\"\n footer={\n <Flex justify=\"space-between\" padding={2} flex={1}>\n {runDisabled ? (\n <Tooltip\n content={\n <Flex padding={2}>\n <Text>There is nothing to translate in the selected from-language.</Text>\n </Flex>\n }\n placement=\"top\"\n >\n <Flex flex={1}>{runButton}</Flex>\n </Tooltip>\n ) : (\n runButton\n )}\n </Flex>\n }\n >\n {languages ? (\n <Flex padding={4} gap={5} align=\"flex-start\" justify=\"center\">\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">From</Text>\n </Box>\n {languages?.map((radioLanguage) => (\n <FromLanguageRadio\n key={radioLanguage.id}\n {...{\n radioLanguage,\n fromLanguage,\n selectFromLanguage,\n languages,\n fieldTranslationParams,\n }}\n />\n ))}\n </Stack>\n\n <Stack gap={2}>\n <Box marginBottom={2}>\n <Text weight=\"semibold\">To</Text>\n </Box>\n {languages.map((checkboxLanguage) => (\n <ToLanguageCheckbox\n key={checkboxLanguage.id}\n {...{checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages}}\n />\n ))}\n </Stack>\n </Flex>\n ) : (\n <Flex padding={4} gap={2} align=\"flex-start\" justify=\"center\">\n <Box>\n <Spinner />\n </Box>\n <Text>Loading languages...</Text>\n </Flex>\n )}\n </Dialog>\n ) : null}\n {props.children}\n </FieldTranslationContext.Provider>\n )\n}\n\nfunction ToLanguageCheckbox(props: {\n checkboxLanguage: Language\n fromLanguage: Language | undefined\n toLanguages: Language[] | undefined\n toggleToLanguage: (\n toggledLang: Language,\n toLanguages: Language[] | undefined,\n languages: Language[] | undefined,\n ) => void\n languages: Language[]\n}) {\n const {checkboxLanguage, fromLanguage, toLanguages, toggleToLanguage, languages} = props\n const langId = checkboxLanguage.id\n const onChange = useCallback(\n () => toggleToLanguage(checkboxLanguage, toLanguages, languages),\n [toggleToLanguage, checkboxLanguage, toLanguages, languages],\n )\n return (\n <Flex\n key={langId}\n gap={3}\n align=\"center\"\n as={'label'}\n style={langId === fromLanguage?.id ? {opacity: 0.5} : undefined}\n >\n <Checkbox\n name=\"toLang\"\n value={langId}\n checked={langId !== fromLanguage?.id && !!toLanguages?.find((tl) => tl.id === langId)}\n onChange={onChange}\n disabled={langId === fromLanguage?.id}\n />\n <Text muted={langId === fromLanguage?.id}>{checkboxLanguage.title ?? langId}</Text>\n </Flex>\n )\n}\n\nfunction FromLanguageRadio(props: {\n radioLanguage: Language\n fromLanguage: Language | undefined\n selectFromLanguage: (\n from: Language,\n languages: Language[] | undefined,\n params: FieldTranslationParams | undefined,\n ) => void\n languages: Language[] | undefined\n fieldTranslationParams: FieldTranslationParams | undefined\n}) {\n const {languages, radioLanguage, selectFromLanguage, fromLanguage, fieldTranslationParams} = props\n const langId = radioLanguage.id\n\n const onChange = useCallback(\n () => selectFromLanguage(radioLanguage, languages, fieldTranslationParams),\n [selectFromLanguage, radioLanguage, languages, fieldTranslationParams],\n )\n return (\n <Flex key={langId} gap={3} align=\"center\" as={'label'}>\n <Radio\n name=\"fromLang\"\n value={langId}\n checked={langId === fromLanguage?.id}\n onChange={onChange}\n />\n <Text>{radioLanguage.title ?? radioLanguage.id}</Text>\n </Flex>\n )\n}\n","import {assistSerializedFieldTypeName, assistSerializedTypeName} from '../../types'\n\nexport const hiddenTypes = [\n 'any',\n 'array',\n 'block',\n 'boolean',\n 'crossDatasetReference',\n 'date',\n 'datetime',\n 'document',\n 'email',\n 'file',\n 'globalDocumentReference',\n 'image',\n 'number',\n 'object',\n 'reference',\n 'span',\n 'string',\n 'text',\n 'url',\n 'slug',\n 'geopoint',\n 'sanity.assetSourceData',\n 'sanity.imageAsset',\n 'sanity.fileAsset',\n 'sanity.imageCrop',\n 'sanity.imageHotspot',\n 'sanity.imageMetadata',\n 'sanity.imageDimensions',\n 'sanity.imagePalette',\n 'sanity.imagePaletteSwatch',\n\n assistSerializedTypeName,\n assistSerializedFieldTypeName,\n 'sanity-agent.job.document',\n]\n","import {\n type ArraySchemaType,\n type ImageOptions,\n isArraySchemaType,\n type ObjectSchemaType,\n type ReferenceOptions,\n type ReferenceSchemaType,\n type Schema,\n type SchemaType,\n typed,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../helpers/assistSupported'\nimport {isType} from '../../helpers/typeUtils'\nimport {\n assistSchemaIdPrefix,\n assistSerializedFieldTypeName,\n assistSerializedTypeName,\n type SerializedSchemaMember,\n type SerializedSchemaType,\n} from '../../types'\nimport {hiddenTypes} from './schemaUtils'\n\ninterface Options {\n leanFormat?: boolean\n}\n\n// oxlint-disable-next-line prefer-set-has\nconst inlineTypes = ['document', 'object', 'image', 'file']\n\nexport function serializeSchema(schema: Schema, options?: Options): SerializedSchemaType[] {\n const list = schema\n .getTypeNames()\n .filter((t) => !(hiddenTypes.includes(t) || t.startsWith('sanity.')))\n .map((t) => schema.get(t))\n .filter((t): t is SchemaType => !!t)\n // because a field can override exclude at the type level, we have to also serialize excluded types\n // so don't do this: .filter((t) => isAssistSupported(t))\n .map((t) => getSchemaStub(t, schema, options))\n .filter((t) => {\n if ('to' in t && t.to && !t.to.length) {\n return false\n }\n if ('of' in t && t.of && !t.of.length) {\n return false\n }\n if ('fields' in t && t.fields && !t.fields.length) {\n return false\n }\n return true\n })\n list.sort((a, b) => (a?.name ?? '').localeCompare(b?.name ?? ''))\n return list\n}\n\nfunction getSchemaStub(\n schemaType: SchemaType,\n schema: Schema,\n options?: Options,\n): SerializedSchemaType {\n if (!schemaType.type?.name) {\n console.error('Missing type name', schemaType.type)\n throw new Error('Type is missing name!')\n }\n const baseSchema: SerializedSchemaType = {\n // we dont need type or id when we send using POST, so leave these out to save bandwidth\n ...(options?.leanFormat\n ? {}\n : {_id: `${assistSchemaIdPrefix}${schemaType.name}`, _type: assistSerializedTypeName}),\n name: schemaType.name,\n title: schemaType.title,\n type: schemaType.type.name,\n ...getBaseFields(schema, schemaType, schemaType.type.name, options),\n }\n\n return removeUndef(baseSchema)\n}\n\nfunction getBaseFields(\n schema: Schema,\n type: SchemaType,\n typeName: string,\n options: Options | undefined,\n) {\n const schemaOptions: SerializedSchemaType['options'] = removeUndef({\n // oxlint-disable-next-line no-unsafe-type-assertion\n imagePromptField: (type.options as ImageOptions)?.aiAssist?.imageInstructionField,\n // oxlint-disable-next-line no-unsafe-type-assertion\n embeddingsIndex: (type.options as ReferenceOptions)?.aiAssist?.embeddingsIndex,\n })\n return removeUndef({\n options: Object.keys(schemaOptions).length ? schemaOptions : undefined,\n values: Array.isArray(type?.options?.list)\n ? type?.options?.list.map((v: string | {value: string; title: string}) =>\n typeof v === 'string' ? v : (v.value ?? v.title),\n )\n : undefined,\n of: 'of' in type && typeName === 'array' ? arrayOf(type, schema, options) : undefined,\n to: 'to' in type && typeName === 'reference' ? refToTypeNames(type) : undefined,\n fields:\n 'fields' in type && inlineTypes.includes(typeName)\n ? serializeFields(schema, type, options)\n : undefined,\n annotations:\n typeName === 'block' && 'fields' in type\n ? serializeAnnotations(type, schema, options)\n : undefined,\n inlineOf:\n typeName === 'block' && 'fields' in type\n ? serializeInlineOf(type, schema, options)\n : undefined,\n hidden:\n typeof type.hidden === 'function' ? ('function' as const) : type.hidden ? true : undefined,\n readOnly:\n typeof type.readOnly === 'function'\n ? ('function' as const)\n : type.readOnly\n ? true\n : undefined,\n })\n}\n\nfunction serializeFields(\n schema: Schema,\n schemaType: ObjectSchemaType,\n options: Options | undefined,\n) {\n const fields = schemaType.fieldsets\n ? schemaType.fieldsets.flatMap((fs) =>\n fs.single\n ? fs.field\n : fs.fields.map((f) => ({\n ...f,\n type: {\n ...f.type,\n // if fieldset is (conditionally) hidden, the field must be considered the same way\n // ie, if the field does not show up in conditionalMembers, it is hidden\n // regardless of weather or not it is the field function or the fieldset function that hides it\n hidden:\n typeof fs.hidden === 'function' ? fs.hidden : fs.hidden ? true : f.type.hidden,\n },\n })),\n )\n : schemaType.fields\n\n return fields\n .filter((f) => !['sanity.imageHotspot', 'sanity.imageCrop'].includes(f.type?.name ?? ''))\n .filter((f) => isAssistSupported(f.type))\n .map((field) => serializeMember(schema, field.type, field.name, options))\n}\n\nfunction serializeMember(\n schema: Schema,\n type: SchemaType,\n name: string,\n options: Options | undefined,\n): SerializedSchemaMember {\n const typeNameExists = !!schema.get(type?.name)\n const typeName = typeNameExists ? type.name : (type.type?.name ?? '')\n return removeUndef({\n ...(options?.leanFormat ? {} : {_type: assistSerializedFieldTypeName}),\n name: name,\n type: typeName,\n title: type.title,\n ...getBaseFields(schema, type, typeName, options),\n })\n}\n\nfunction serializeInlineOf(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const childrenField = blockSchemaType.fields.find((f) => f.name === 'children')\n const childrenType = childrenField?.type\n if (!childrenType || !isArraySchemaType(childrenType)) {\n return undefined\n }\n return arrayOf(\n {\n ...childrenType,\n of: childrenType.of.filter((t) => !isType(t, 'span')),\n },\n schema,\n options,\n )\n}\n\nfunction serializeAnnotations(\n blockSchemaType: ObjectSchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] | undefined {\n const markDefs = blockSchemaType.fields.find((f) => f.name === 'markDefs')\n const marksType = markDefs?.type\n if (!marksType || !isArraySchemaType(marksType)) {\n return undefined\n }\n return arrayOf(marksType, schema, options)\n}\n\nfunction arrayOf(\n arrayType: ArraySchemaType,\n schema: Schema,\n options: Options | undefined,\n): SerializedSchemaMember[] {\n return arrayType.of\n .filter((type) => isAssistSupported(type))\n .map((t) => {\n return serializeMember(schema, t, t.name, options)\n })\n}\n\nfunction refToTypeNames(type: ReferenceSchemaType) {\n return type.to.map((t) => ({\n type: typed<string>(t.name),\n }))\n}\n\nfunction removeUndef<T extends Record<string, any>>(obj: T): T {\n Object.keys(obj).forEach((key) => (obj[key] === undefined ? delete obj[key] : {}))\n return obj\n}\n","import type {ObjectSchemaType} from 'sanity'\n\nimport {\n asFieldRefsByTypePath,\n type FieldRef,\n getFieldRefs as createFieldRefs,\n} from '../assistInspector/helpers'\n\n/**\n * @param maxFieldSelectionDepth - see `AssistConfig.maxFieldSelectionDepth`; uses the plugin\n * default when omitted\n */\nexport function createFieldRefCache(maxFieldSelectionDepth?: number) {\n const byType: Record<\n string,\n | {\n fieldRefs: FieldRef[]\n fieldRefsByTypePath: Record<string, FieldRef | undefined>\n }\n | undefined\n > = {}\n\n function getRefsForType(schemaType: ObjectSchemaType) {\n const documentType = schemaType.name\n const cached = byType[documentType]\n if (cached) return cached\n\n const fieldRefs = createFieldRefs(schemaType, maxFieldSelectionDepth)\n const fieldRefsByTypePath = asFieldRefsByTypePath(fieldRefs)\n const refs = {\n fieldRefs,\n fieldRefsByTypePath,\n }\n byType[documentType] = refs\n return refs\n }\n\n return getRefsForType\n}\n","import {type ReactNode, useCallback, useEffect, useMemo, useState} from 'react'\nimport {type ObjectSchemaType, type Schema, useSchema} from 'sanity'\n\nimport type {AssistPluginConfig} from '../plugin'\nimport {serializeSchema} from '../schemas/serialize/serializeSchema'\nimport {\n type InstructStatus,\n useApiClient,\n useGetInstructStatus,\n useInitInstruct,\n} from '../useApiClient'\nimport {\n AiAssistanceConfigContext,\n type AiAssistanceConfigContextValue,\n} from './AiAssistanceConfigContext'\nimport {createFieldRefCache} from './fieldRefCache'\n\nexport function AiAssistanceConfigProvider(props: {\n children?: ReactNode\n config: AssistPluginConfig\n}) {\n const [status, setStatus] = useState<InstructStatus | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const apiClient = useApiClient(props.config?.__customApiClient)\n const {getInstructStatus, loading: statusLoading} = useGetInstructStatus(apiClient)\n const {initInstruct, loading: initLoading} = useInitInstruct(apiClient)\n\n const schema = useSchema()\n const serializedTypes = useMemo(() => serializeSchema(schema, {leanFormat: true}), [schema])\n const {getFieldRefs, getFieldRefsByTypePath} = useFieldRefGetters(\n schema,\n props.config.assist?.maxFieldSelectionDepth,\n )\n\n useEffect(() => {\n getInstructStatus()\n .then((s) => setStatus(s))\n .catch((e) => {\n console.error(e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n })\n }, [getInstructStatus])\n\n const init = useCallback(async () => {\n setError(undefined)\n try {\n await initInstruct()\n const status = await getInstructStatus()\n setStatus(status)\n } catch (e) {\n console.error('Failed to init ai assistance', e)\n // oxlint-disable-next-line no-unsafe-type-assertion\n setError(e as Error)\n }\n }, [initInstruct, getInstructStatus, setStatus])\n\n const {config, children} = props\n const context = useMemo<AiAssistanceConfigContextValue>(() => {\n return {\n config,\n status,\n statusLoading,\n init,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n }\n }, [\n config,\n status,\n init,\n statusLoading,\n initLoading,\n error,\n serializedTypes,\n getFieldRefs,\n getFieldRefsByTypePath,\n ])\n\n return (\n <AiAssistanceConfigContext.Provider value={context}>\n {children}\n </AiAssistanceConfigContext.Provider>\n )\n}\n\nfunction useFieldRefGetters(schema: Schema, maxFieldSelectionDepth?: number) {\n return useMemo(() => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n\n function getRefsForType(documentType: string) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n if (!schemaType) {\n throw new Error(`Schema type \"${documentType}\" not found`)\n }\n return getForSchemaType(schemaType)\n }\n\n return {\n getFieldRefs: (documentType: string) => getRefsForType(documentType).fieldRefs,\n getFieldRefsByTypePath: (documentType: string) =>\n getRefsForType(documentType).fieldRefsByTypePath,\n }\n }, [schema, maxFieldSelectionDepth])\n}\n","import {ThemeProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport type {LayoutProps} from 'sanity'\n\nimport {type Connector, ConnectorsProvider} from '../_lib/connector'\nimport {AssistConnectorsOverlay} from '../assistConnectors'\nimport type {AssistPluginConfig} from '../plugin'\nimport {FieldTranslationProvider} from '../translate/FieldTranslationProvider'\nimport type {StudioInstruction} from '../types'\nimport type {RunInstructionRequest} from '../useApiClient'\nimport {AiAssistanceConfigProvider} from './AiAssistanceConfigProvider'\nimport {RunInstructionProvider} from './RunInstructionProvider'\n\nexport interface AIStudioLayoutProps extends LayoutProps {\n config: AssistPluginConfig\n}\n\nexport type RunInstructionArgs = Omit<RunInstructionRequest, 'instructionKey' | 'userTexts'> & {\n instruction: StudioInstruction\n}\n\nexport function AssistLayout(props: AIStudioLayoutProps) {\n const [connectors, setConnectors] = useState<Connector[]>([])\n\n return (\n <AiAssistanceConfigProvider config={props.config}>\n <RunInstructionProvider>\n <FieldTranslationProvider>\n <ConnectorsProvider onConnectorsChange={setConnectors}>\n {props.renderDefault(props)}\n <ThemeProvider tone=\"default\">\n <AssistConnectorsOverlay connectors={connectors} />\n </ThemeProvider>\n </ConnectorsProvider>\n </FieldTranslationProvider>\n </RunInstructionProvider>\n </AiAssistanceConfigProvider>\n )\n}\n","import {createContext, useEffect, useMemo, useState} from 'react'\nimport {type InputProps, pathToString} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {getDescriptionFieldOption, getImageInstructionFieldOption} from '../helpers/typeUtils'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nexport interface ImageContextValue {\n imageDescriptionPath?: string\n imageInstructionPath?: string\n assetRef?: string\n}\n\nexport const ImageContext = createContext<ImageContextValue>({})\n\nexport function ImageContextProvider(props: InputProps) {\n const {schemaType, path, value, readOnly} = props\n // oxlint-disable-next-line no-unsafe-type-assertion\n const assetRef = (value as any)?.asset?._ref\n const [assetRefState, setAssetRefState] = useState<string | undefined>(assetRef)\n\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption} = useGenerateCaption(apiClient)\n const generateCaptionWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n })\n\n const router = usePaneRouter()\n const isShowingOlderRevision = !!router.params?.['rev']\n\n useEffect(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n if (\n assetRef &&\n assistableDocumentId &&\n descriptionField?.updateOnImageChange &&\n assetRef !== assetRefState &&\n !documentIsSyncing &&\n !isShowingOlderRevision &&\n !readOnly\n ) {\n // oxlint-disable-next-line react/set-state-in-effect\n setAssetRefState(assetRef)\n if (canUseAssist(status)) {\n generateCaptionWhenDraftReady({\n path: pathToString([...path, descriptionField.path]),\n documentId: assistableDocumentId,\n })\n }\n }\n }, [\n schemaType,\n path,\n assetRef,\n assetRefState,\n assistableDocumentId,\n generateCaptionWhenDraftReady,\n documentIsSyncing,\n status,\n readOnly,\n isShowingOlderRevision,\n ])\n\n const context: ImageContextValue = useMemo(() => {\n const descriptionField = getDescriptionFieldOption(schemaType)\n const imageInstructionField = getImageInstructionFieldOption(schemaType)\n return {\n imageDescriptionPath: descriptionField?.path\n ? pathToString([...path, descriptionField.path])\n : undefined,\n imageInstructionPath: imageInstructionField\n ? pathToString([...path, imageInstructionField])\n : undefined,\n assetRef,\n }\n }, [schemaType, path, assetRef])\n\n return <ImageContext.Provider value={context}>{props.renderDefault(props)}</ImageContext.Provider>\n}\n","import {icons, Icon, type IconSymbol} from '@sanity/icons'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {useCallback, useId, useMemo} from 'react'\nimport {set, type StringInputProps} from 'sanity'\n\nexport function IconInput(props: StringInputProps) {\n const {value, onChange} = props\n const id = useId()\n const items = useMemo(\n () =>\n Object.keys(icons)\n .filter(isIconSymbol)\n .map((key) => <IconItem key={key} iconKey={key} onChange={onChange} />),\n [onChange],\n )\n\n const selectedSymbol = useMemo(() => getIcon(value), [value])\n\n return (\n <MenuButton\n button={\n <Button\n icon={<Icon symbol={selectedSymbol} />}\n title=\"Select icon\"\n padding={3}\n mode=\"ghost\"\n radius={1}\n />\n }\n id={id}\n menu={<Menu style={{maxHeight: 300}}>{items}</Menu>}\n popover={{portal: true}}\n />\n )\n}\n\nfunction IconItem({\n iconKey: key,\n onChange,\n}: {\n iconKey: IconSymbol\n onChange: StringInputProps['onChange']\n}) {\n const onClick = useCallback(() => onChange(set(key)), [onChange, key])\n // `Icon` wraps the lazy-loaded icon in its own `Suspense` boundary. Rendering the raw\n // lazy component from `icons` would suspend the whole menu (there is no boundary between\n // it and the popover), which unmounts the menu and closes it before it can be seen.\n return <MenuItem icon={<Icon symbol={key} />} title={key} text={key} onClick={onClick} />\n}\n\nexport function getIcon(iconName?: string): IconSymbol {\n return iconName && isIconSymbol(iconName) ? iconName : 'sparkles'\n}\n\nfunction isIconSymbol(iconName: string): iconName is IconSymbol {\n return iconName in icons\n}\n","import {useMemo} from 'react'\nimport type {Path, SchemaType} from 'sanity'\n\nimport {isAssistSupported} from './assistSupported'\n\nexport function useAssistSupported(_path: Path, schemaType: SchemaType) {\n return useMemo(() => isAssistSupported(schemaType), [schemaType])\n}\n","import {TranslateIcon} from '@sanity/icons/Translate'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n type ObjectSchemaType,\n useClient,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isAssistSupported} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getAssistWriteDocumentId} from '../helpers/ids'\nimport {createStyleGuideResolver} from '../helpers/styleguide'\nimport type {AssistOptions} from '../schemas/typeDefExtensions'\nimport {API_VERSION_WITH_EXTENDED_TYPES, useApiClient, useTranslate} from '../useApiClient'\nimport {useFieldTranslation} from './FieldTranslationProvider'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport type TranslateProps = DocumentFieldActionProps & {\n documentIsAssistable?: boolean\n documentIsSyncing?: boolean\n documentSchemaType?: ObjectSchemaType\n}\nexport const translateActions: DocumentFieldAction = {\n name: 'sanity-assist-translate',\n useAction(props: TranslateProps) {\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const client = useClient({apiVersion: API_VERSION_WITH_EXTENDED_TYPES})\n const {\n schemaType: fieldSchemaType,\n path,\n documentId,\n documentSchemaType,\n documentIsAssistable,\n documentIsSyncing,\n } = props\n const isDocumentLevel = path.length === 0\n const readOnly = fieldSchemaType.readOnly === true\n\n const docTransTypes = config.translate?.document?.documentTypes\n // oxlint-disable-next-line no-unsafe-type-assertion\n const options = fieldSchemaType?.options as AssistOptions | undefined\n const addFieldAction = isDocumentLevel || options?.aiAssist?.translateAction\n\n const fieldTransEnabled =\n addFieldAction &&\n documentSchemaType &&\n config.translate?.field?.documentTypes?.includes(documentSchemaType.name)\n const documentTranslationEnabled =\n addFieldAction &&\n documentSchemaType &&\n ((!docTransTypes && isAssistSupported(fieldSchemaType)) ||\n docTransTypes?.includes(documentSchemaType.name))\n\n const isActive = !!(documentSchemaType && (documentTranslationEnabled || fieldTransEnabled))\n\n const {value: documentValue, onChange: documentOnChange, formState} = useDocumentPane()\n const docRef = useRef(documentValue)\n docRef.current = documentValue\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const translationApi = useTranslate(apiClient)\n const translate = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n task: translationApi.translate,\n })\n\n const styleguide = config.translate?.styleguide\n const languagePath = config.translate?.document?.languageField\n\n const translateDocumentAction = useMemo(() => {\n if (!isActive || !languagePath || !documentTranslationEnabled) {\n return undefined\n }\n const title = path.length ? `Translate` : `Translate document`\n return node({\n type: 'action',\n icon: translationApi.loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title,\n onAction: () => {\n if (translationApi.loading || !languagePath || !documentId) {\n return\n }\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType?.liveEdit,\n })\n translate({\n languagePath,\n translatePath: path,\n styleguide: createStyleGuideResolver(styleguide, {\n client,\n documentId: writeDocumentId,\n schemaType: documentSchemaType,\n }),\n documentId: writeDocumentId,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n renderAsButton: true,\n disabled: translationApi.loading || readOnly,\n })\n }, [\n isActive,\n languagePath,\n translate,\n styleguide,\n documentId,\n translationApi.loading,\n documentTranslationEnabled,\n path,\n readOnly,\n client,\n documentSchemaType,\n ])\n const fieldTranslate = useFieldTranslation()\n const openFieldTranslation = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n task: fieldTranslate.openFieldTranslation,\n })\n\n const maxDepth = config.translate?.field?.maxPathDepth\n const translateFieldsAction = useMemo(\n () =>\n isActive && fieldTransEnabled\n ? node({\n type: 'action',\n icon: fieldTranslate.translationLoading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : TranslateIcon,\n title: `Translate fields...`,\n onAction: () => {\n if (fieldTranslate.translationLoading || !documentId) {\n return\n }\n if (formStateRef.current) {\n getConditionalMembers(formStateRef.current)\n }\n const writeDocumentId = getAssistWriteDocumentId(documentId, {\n liveEdit: documentSchemaType?.liveEdit,\n })\n openFieldTranslation({\n document: {\n ...docRef.current,\n _id: writeDocumentId,\n },\n documentSchema: documentSchemaType,\n translatePath: path,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current, maxDepth)\n : [],\n })\n },\n renderAsButton: true,\n disabled: fieldTranslate.translationLoading || readOnly,\n })\n : undefined,\n [\n isActive,\n openFieldTranslation,\n documentSchemaType,\n documentId,\n fieldTranslate.translationLoading,\n fieldTransEnabled,\n path,\n readOnly,\n maxDepth,\n ],\n )\n\n return useMemo(() => {\n if (!isActive || !status?.initialized) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'group',\n icon: () => null,\n title: 'Translation',\n children: [translateDocumentAction, translateFieldsAction].filter(\n (c): c is DocumentFieldActionItem => !!c,\n ),\n expanded: true,\n })\n }, [isActive, translateDocumentAction, translateFieldsAction, status])\n },\n}\n","import type {AgentActionPath} from '@sanity/client'\nimport {type ToastParams, useToast} from '@sanity/ui/toast'\nimport {useMemo} from 'react'\nimport {\n type DocumentFieldActionDivider,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionNode,\n type ObjectSchemaType,\n type Path,\n type SanityDocumentLike,\n type SchemaType,\n useWorkspaceSchemaId,\n} from 'sanity'\n\nimport {randomKey} from '../_lib/randomKey'\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {isDefined} from '../helpers/misc'\nimport {\n documentRootKey,\n fieldPresenceTypeName,\n type InstructionTask,\n instructionTaskTypeName,\n} from '../types'\n\nexport interface AgentActionConditionalPath {\n path: AgentActionPath\n readOnly: boolean\n hidden: boolean\n}\n\nexport interface AssistFieldActionProps {\n /**\n * `actionType` will be `document` for action invoked from the top right document action menu, and\n * `field` when invoked from a field action menu.\n */\n actionType: 'document' | 'field'\n /**\n * This is the id of the current document pane; it contains `drafts.`or `versions. prefix` ect depending on context.\n * Use this for `documentId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n * ```\n */\n documentIdForAction: string\n\n /**\n * Schema type of the current document.\n * @see documentIdForAction\n */\n documentSchemaType: ObjectSchemaType\n\n /**\n * Returns the current document value.\n *\n * Prefer passing this function to your hooks instead of passing the document value directly to avoid unnecessary re-renders.\n * @see documentIdForAction\n */\n getDocumentValue: () => SanityDocumentLike\n\n /**\n * Returns the current readOnly and hidden state of all conditional members in the current document form.\n *\n * Intended to be passed to agent actions `conditionalPaths.paths`.\n */\n getConditionalPaths: () => AgentActionConditionalPath[]\n\n /**\n * `schemaId` for the current workspace.\n *\n * Note: the workspace schema has to be deployed using `sanity schema deploy` or `sanity deploy`.\n *\n * Use this for `schemaId` when calling any `client.agent.action`.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * //...\n * })\n *\n * ```\n */\n schemaId: string\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`)\n *\n * It can be used with agent actions using `target.path`, to scope the action to a specific field.\n *\n * It is generally recommended to call actions from the studio like this:\n * ```ts\n * await client.agent.action.generate({\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: props.documentIdForAction,\n * _type: props.documentSchemaType.name,\n * initialValues: props.getDocumentValue()\n * },\n * target: {\n * path: props.path\n * },\n * })\n * ```\n */\n path: AgentActionPath\n\n /**\n * This is the schema type of the field the actions will be attached to (ie, schemaType for `path`).\n *\n * Typically useful to dynamically return different actions based on the schema type of the field.\n *\n * ```ts\n * if(isObjectSchemaType(schemaType)) {\n * return [\n * defineAssistFieldAction({\n * title: 'Fill the object fields',\n * icon: RobotIcon,\n * onAction: () => {\n * //...\n * }\n * })\n * ]\n * }\n * return useMemo(() => {\n *\n *\n * }, [])\n *\n * ```\n */\n schemaType: SchemaType\n\n /**\n * Schema type of the parent field or array item holding this field.\n *\n * This can be undefined if the action was unable to resolve the parent type is excluded from AI Assist.\n *\n * @see schemaType\n * @see documentSchemaType\n */\n parentSchemaType?: SchemaType\n}\n\nexport type AssistFieldActionNode =\n | AssistFieldActionItem\n | AssistFieldActionGroup\n | DocumentFieldActionDivider\n\nexport type AssistFieldActionItem = Omit<\n DocumentFieldActionItem,\n 'renderAsButton' | 'selected' | 'onAction'\n> & {\n onAction: () => void | Promise<void>\n}\n\nexport type AssistFieldActionGroup = Omit<\n DocumentFieldActionGroup,\n 'renderAsButton' | 'expanded' | 'children'\n> & {\n /**\n * `children` can include undefined entries in the action array. These will be filtered out.\n * If the group has no defined children, the group will also be filtered out.\n */\n children: (AssistFieldActionNode | undefined)[]\n}\n\ntype PushToast = (params: ToastParams) => string\n\nexport function defineAssistFieldAction(\n action: Omit<AssistFieldActionItem, 'type'>,\n): AssistFieldActionItem {\n return {\n ...action,\n type: 'action',\n }\n}\n\nexport function defineFieldActionDivider(): DocumentFieldActionDivider {\n return {\n type: 'divider',\n }\n}\n\nexport function defineAssistFieldActionGroup(\n group: Omit<AssistFieldActionGroup, 'type'>,\n): AssistFieldActionGroup {\n return {\n ...group,\n type: 'group',\n }\n}\n\nexport function useCustomFieldActions(\n props: Omit<AssistFieldActionProps, 'schemaId' | 'path'> & {path: Path},\n) {\n const {\n config: {fieldActions},\n } = useAiAssistanceConfig()\n const {addSyntheticTask, removeSyntheticTask} = useAssistDocumentContext()\n\n const schemaId = useWorkspaceSchemaId()\n const {push: pushToast} = useToast()\n // oxlint-disable-next-line react/hooks\n const configActions = fieldActions?.useFieldActions?.({\n ...props,\n schemaId,\n // oxlint-disable-next-line no-unsafe-type-assertion\n path: props.path as AgentActionPath,\n })\n\n return useMemo(() => {\n const title = fieldActions?.title\n const customActions = configActions\n ?.filter(isDefined)\n .map((node) => {\n return createSafeNode({\n node,\n pushToast,\n addSyntheticTask,\n removeSyntheticTask,\n })\n })\n .filter(isDefined)\n const onlyGroups =\n customActions?.length && customActions?.every((node) => node.type === 'group')\n const groups = customActions?.length\n ? onlyGroups\n ? customActions\n : [\n {\n type: 'group',\n title: title || 'Custom actions',\n children: customActions,\n expanded: true,\n } satisfies DocumentFieldActionGroup,\n ]\n : []\n return groups ?? []\n }, [addSyntheticTask, configActions, fieldActions, pushToast, removeSyntheticTask])\n}\n\nfunction createSafeNode(args: {\n node: AssistFieldActionNode\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}): DocumentFieldActionNode | undefined {\n const {node} = args\n switch (node.type) {\n case 'action':\n return createSafeAction({...args, action: node})\n case 'group':\n const children = node.children\n ?.filter(isDefined)\n .map((child) => createSafeNode({...args, node: child}))\n .filter(isDefined)\n if (!children?.length) {\n return undefined\n }\n return {\n ...node,\n renderAsButton: false,\n expanded: true,\n children,\n }\n case 'divider':\n default:\n return node\n }\n}\n\nfunction createSafeAction(args: {\n action: AssistFieldActionItem\n pushToast: PushToast\n addSyntheticTask: (task: InstructionTask) => void\n removeSyntheticTask: (task: InstructionTask) => void\n}) {\n const {action, pushToast, addSyntheticTask, removeSyntheticTask} = args\n return {\n ...action,\n onAction: () => {\n async function runAction() {\n const task: InstructionTask = {\n _type: instructionTaskTypeName,\n _key: randomKey(12),\n started: new Date().toISOString(),\n presence: [\n {\n _type: fieldPresenceTypeName,\n _key: randomKey(12),\n path: documentRootKey,\n started: new Date().toISOString(),\n },\n ],\n }\n try {\n addSyntheticTask(task)\n const actionResult = action.onAction?.()\n if (actionResult instanceof Promise) {\n await actionResult\n }\n } catch (err: any) {\n console.error('Failed to execute action', action, err)\n pushToast({\n title: 'Failed to execute action',\n description: err?.message,\n status: 'error',\n })\n } finally {\n removeSyntheticTask(task)\n }\n }\n void runAction()\n },\n renderAsButton: false,\n selected: false,\n }\n}\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {fieldPathParam, instructionParam} from '../types'\nimport {canUseAssist, useApiClient, useGenerateCaption} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateCaptionsActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-captions',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n const {openInspector} = useDocumentPane()\n\n const {config, status} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateCaption, loading} = useGenerateCaption(apiClient)\n const imageContext = useContext(ImageContext)\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const generateCaptionWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateCaption,\n })\n\n const isActive = !!imageContext && pathKey === imageContext?.imageDescriptionPath\n\n return useMemo(() => {\n if (!isActive || !imageContext) {\n // works but not supported by types\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image description',\n onAction: () => {\n if (loading) {\n return\n }\n if (!canUseAssist(status)) {\n openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: undefined as any,\n })\n return\n }\n generateCaptionWhenDraftReady({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n hidden: !imageContext.assetRef,\n })\n }, [\n isActive,\n imageContext,\n generateCaptionWhenDraftReady,\n pathKey,\n assistableDocumentId,\n loading,\n status,\n openInspector,\n ])\n },\n}\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Box, Spinner} from '@sanity/ui'\nimport {useContext, useMemo} from 'react'\nimport type {DocumentFieldAction, DocumentFieldActionGroup, DocumentFieldActionItem} from 'sanity'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {useDraftDelayedTask} from '../assistDocument/useDraftDelayedTask'\nimport {useAiAssistanceConfig} from '../assistLayout/AiAssistanceConfigContext'\nimport {ImageContext} from '../components/ImageContext'\nimport {usePathKey} from '../helpers/misc'\nimport {useApiClient, useGenerateImage} from '../useApiClient'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const generateImagActions: DocumentFieldAction = {\n name: 'sanity-assist-generate-image',\n useAction(props) {\n const pathKey = usePathKey(props.path)\n\n const {config} = useAiAssistanceConfig()\n const apiClient = useApiClient(config?.__customApiClient)\n const {generateImage, loading} = useGenerateImage(apiClient)\n\n const imageContext = useContext(ImageContext)\n const {assistableDocumentId, documentOnChange, documentIsAssistable, documentIsSyncing} =\n useAssistDocumentContext()\n const generateImageWhenDraftReady = useDraftDelayedTask({\n documentOnChange,\n isDocAssistable: documentIsAssistable,\n isSyncing: documentIsSyncing,\n task: generateImage,\n })\n\n const isActive = !!imageContext && pathKey === imageContext?.imageInstructionPath\n\n return useMemo(() => {\n if (!isActive) {\n // works but not supported by types\n // oxlint-disable-next-line no-unsafe-type-assertion\n return undefined as unknown as DocumentFieldActionItem\n }\n return node({\n type: 'action',\n icon: loading\n ? () => (\n <Box style={{height: 17}}>\n <Spinner style={{transform: 'translateY(6px)'}} />\n </Box>\n )\n : ImageIcon,\n title: 'Generate image from prompt',\n onAction: () => {\n if (loading) {\n return\n }\n generateImageWhenDraftReady({path: pathKey, documentId: assistableDocumentId})\n },\n renderAsButton: true,\n disabled: loading,\n })\n }, [isActive, generateImageWhenDraftReady, pathKey, assistableDocumentId, loading])\n },\n}\n","import {LockIcon} from '@sanity/icons/Lock'\nimport {Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\n\nexport function PrivateIcon() {\n return (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Only visible to you\n </Text>\n }\n fallbackPlacements={['bottom']}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n )\n}\n","import type {AgentActionPath} from '@sanity/client'\nimport {Icon} from '@sanity/icons'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {useCallback, useMemo, useRef} from 'react'\nimport {\n type DocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n pathToString,\n stringToPath,\n typed,\n useCurrentUser,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {getIcon} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {useRequestRunInstruction} from '../assistDocument/RequestRunInstructionProvider'\nimport {aiInspectorId} from '../assistInspector/constants'\nimport {getTypePath, useSelectedField, useTypePath} from '../assistInspector/helpers'\nimport {pluginTitleShort} from '../constants'\nimport {isSchemaAssistEnabled} from '../helpers/assistSupported'\nimport {getConditionalMembers} from '../helpers/conditionalMembers'\nimport {getInstructionTitle, usePathKey} from '../helpers/misc'\nimport {useAssistSupported} from '../helpers/useAssistSupported'\nimport {translateActions, type TranslateProps} from '../translate/translateActions'\nimport {documentRootKey, fieldPathParam, instructionParam, type StudioInstruction} from '../types'\nimport {type AgentActionConditionalPath, useCustomFieldActions} from './customFieldActions'\nimport {generateCaptionsActions} from './generateCaptionActions'\nimport {generateImagActions} from './generateImageActions'\nimport {PrivateIcon} from './PrivateIcon'\n\nfunction node(node: DocumentFieldActionItem | DocumentFieldActionGroup) {\n return node\n}\n\nexport const assistFieldActions: DocumentFieldAction = {\n name: 'sanity-assist-actions',\n useAction(props) {\n const {schemaType} = props\n\n const {\n assistDocument,\n documentIsNew,\n documentIsAssistable,\n documentIsSyncing,\n openInspector,\n closeInspector,\n inspector,\n documentOnChange,\n documentSchemaType,\n selectedPath,\n assistableDocumentId,\n fieldRefsByTypePath,\n } = useAssistDocumentContext()\n\n const {value: docValue, formState} = useDocumentPane()\n const docValueRef = useRef(docValue)\n const formStateRef = useRef(formState)\n formStateRef.current = formState\n\n const currentUser = useCurrentUser()\n const isHidden = !assistDocument\n const pathKey = usePathKey(props.path)\n const typePath = useTypePath(docValue, pathKey)\n const assistDocumentId = assistDocument?._id\n\n const {requestRunInstruction} = useRequestRunInstruction({\n documentOnChange,\n isDocAssistable: documentIsAssistable ?? false,\n isSyncing: documentIsSyncing,\n })\n\n const isSelectable = !!useSelectedField(documentSchemaType, typePath)\n const assistSupported =\n useAssistSupported(props.path, schemaType) &&\n isSelectable &&\n isSchemaAssistEnabled(documentSchemaType) &&\n schemaType.readOnly !== true\n\n const fieldAssist = useMemo(\n () =>\n (assistDocument?.fields ?? []).find(\n (f) => f.path === typePath || (pathKey === documentRootKey && f.path === pathKey),\n ),\n [assistDocument?.fields, pathKey, typePath],\n )\n\n const fieldAssistKey = fieldAssist?._key\n const isInspectorOpen = inspector?.name === aiInspectorId\n const isPathSelected = pathKey === selectedPath\n const isSelected = isInspectorOpen && isPathSelected\n\n const imageCaptionAction = generateCaptionsActions.useAction(props)\n const imageGenAction = generateImagActions.useAction(props)\n const translateAction = translateActions.useAction(\n typed<TranslateProps>({\n ...props,\n documentId: assistableDocumentId,\n documentIsAssistable,\n documentIsSyncing,\n documentSchemaType,\n }),\n )\n const manageInstructions = useCallback(\n () =>\n isSelected\n ? closeInspector(aiInspectorId)\n : openInspector(aiInspectorId, {\n [fieldPathParam]: pathKey,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: undefined as any,\n }),\n [openInspector, closeInspector, isSelected, pathKey],\n )\n\n const onInstructionAction = useCallback(\n (instruction: StudioInstruction) => {\n if (!pathKey || !fieldAssistKey || !assistDocumentId || !assistableDocumentId) {\n return\n }\n requestRunInstruction({\n documentId: assistableDocumentId,\n assistDocumentId,\n path: pathKey,\n typePath,\n instruction,\n conditionalMembers: formStateRef.current\n ? getConditionalMembers(formStateRef.current)\n : [],\n })\n },\n [\n requestRunInstruction,\n assistableDocumentId,\n pathKey,\n typePath,\n assistDocumentId,\n fieldAssistKey,\n ],\n )\n\n const privateInstructions = useMemo(\n () =>\n fieldAssist?.instructions?.filter((i) => i.userId && i.userId === currentUser?.id) || [],\n [fieldAssist?.instructions, currentUser],\n )\n\n const sharedInstructions = useMemo(\n () => fieldAssist?.instructions?.filter((i) => !i.userId) || [],\n [fieldAssist?.instructions],\n )\n\n const instructions = useMemo(\n () => [...privateInstructions, ...sharedInstructions],\n [privateInstructions, sharedInstructions],\n )\n\n const runInstructionsGroup = useMemo(() => {\n return instructions?.length || imageCaptionAction || translateAction || imageGenAction\n ? node({\n type: 'group',\n icon: () => null,\n title: 'Run instructions',\n children: [\n ...(instructions?.map((instruction) =>\n instructionItem({\n instruction,\n isPrivate: Boolean(instruction.userId && instruction.userId === currentUser?.id),\n onInstructionAction,\n hidden: isHidden,\n // oxlint-disable-next-line no-unnecessary-type-conversion\n documentIsNew: !!documentIsNew,\n assistSupported,\n }),\n ) || []),\n imageCaptionAction,\n imageGenAction,\n ].filter((a): a is DocumentFieldActionItem => !!a),\n expanded: true,\n })\n : undefined\n }, [\n instructions,\n currentUser?.id,\n onInstructionAction,\n isHidden,\n documentIsNew,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n ])\n\n const getDocumentValue = useCallback(() => {\n return docValueRef.current\n }, [])\n\n const getConditionalPaths: () => AgentActionConditionalPath[] = useCallback(() => {\n // oxlint-disable-next-line no-map-spread\n return (formStateRef.current ? getConditionalMembers(formStateRef.current) : []).flatMap(\n (cm) => {\n const path = stringToPath(cm.path)\n if (path.some((s) => typeof s === 'number')) {\n //agent actions does not support indexed paths\n return []\n }\n return {\n ...cm,\n // oxlint-disable-next-line no-unsafe-type-assertion\n path: path as AgentActionPath,\n }\n },\n )\n }, [])\n\n const parentSchemaType = useMemo(() => {\n if (!props.path.length) {\n return undefined\n } else if (props.path.length === 1) {\n return documentSchemaType\n }\n const parentPath = props.path.slice(0, -1)\n const typePath = getTypePath(docValueRef.current, pathToString(parentPath))\n return typePath ? fieldRefsByTypePath[typePath]?.schemaType : undefined\n }, [fieldRefsByTypePath, props.path, documentSchemaType])\n\n const customActions = useCustomFieldActions({\n actionType: props.path.length ? 'field' : 'document',\n documentIdForAction: assistableDocumentId,\n schemaType,\n documentSchemaType,\n path: props.path,\n getDocumentValue,\n getConditionalPaths,\n parentSchemaType,\n })\n\n const manageInstructionsItem = useMemo(\n () =>\n node({\n type: 'action',\n icon: ControlsIcon,\n title: 'Manage instructions',\n onAction: manageInstructions,\n selected: isSelected,\n }),\n [manageInstructions, isSelected],\n )\n\n const group = useMemo(\n () =>\n node({\n type: 'group',\n icon: SparklesIcon,\n title: pluginTitleShort,\n children: [\n runInstructionsGroup,\n translateAction,\n ...customActions,\n assistSupported && manageInstructionsItem,\n ]\n .filter((c): c is DocumentFieldActionItem | DocumentFieldActionGroup => !!c)\n .filter((c) => (c.type === 'group' ? c.children.length : true)),\n expanded: false,\n renderAsButton: true,\n hidden: !assistSupported && !imageCaptionAction && !translateAction && !imageGenAction,\n }),\n [\n //documentIsNew,\n runInstructionsGroup,\n manageInstructionsItem,\n assistSupported,\n imageCaptionAction,\n translateAction,\n imageGenAction,\n customActions,\n ],\n )\n\n const emptyAction = useMemo(\n () =>\n node({\n type: 'action',\n hidden: !assistSupported,\n icon: SparklesIcon,\n onAction: manageInstructions,\n renderAsButton: true,\n title: pluginTitleShort,\n selected: isSelected,\n }),\n [assistSupported, manageInstructions, isSelected],\n )\n\n // If there are no instructions, we don't want to render the group\n if (\n !instructions?.length &&\n !imageCaptionAction &&\n !translateAction &&\n !imageGenAction &&\n !customActions.length\n ) {\n return emptyAction\n }\n\n return group\n },\n}\n\nfunction instructionItem(props: {\n instruction: StudioInstruction\n isPrivate: boolean\n onInstructionAction: (ins: StudioInstruction) => void\n assistSupported: boolean\n documentIsNew: boolean\n hidden: boolean\n}) {\n const {hidden, isPrivate, onInstructionAction, assistSupported, instruction} = props\n // @TODO investigate in studio core why we can't accept JSX.Element and only accept ComponentType\n function IconLeft() {\n return <Icon symbol={getIcon(instruction.icon)} />\n }\n return node({\n type: 'action',\n icon: IconLeft,\n iconRight: isPrivate ? PrivateIcon : undefined,\n title: getInstructionTitle(instruction),\n onAction: () => onInstructionAction(instruction),\n disabled: !assistSupported,\n hidden,\n })\n}\n","import {Card, Flex} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nimport {useAssistDocumentContext} from '../assistDocument/AssistDocumentContext'\nimport {documentRootKey, fieldPresenceTypeName} from '../types'\nimport {AiFieldPresence} from './AiFieldPresence'\nimport {aiPresence} from './useAssistPresence'\n\nexport function createAssistDocumentPresence(documentId: string | undefined) {\n return function AssistDocumentPresenceWrapper() {\n return documentId ? <AssistDocumentPresence /> : null\n }\n}\n\nfunction AssistDocumentPresence() {\n const {assistDocument, syntheticTasks} = useAssistDocumentContext()\n const anyPresence = useMemo(() => {\n const anyPresence = [...(assistDocument?.tasks ?? []), ...(syntheticTasks ?? [])]\n ?.filter((run) => !run.ended && !run.reason)\n ?.flatMap((run) => run.presence ?? [])\n // oxlint-disable-next-line react/purity\n .find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n if (anyPresence) {\n return aiPresence(anyPresence, [])\n }\n const anyRun = assistDocument?.tasks\n ?.filter((run) => !run.ended && !run.reason)\n // oxlint-disable-next-line react/purity\n ?.find((f) => f.started && new Date().getTime() - new Date(f.started).getTime() < 30000)\n return anyRun\n ? aiPresence(\n {\n started: anyRun.started,\n path: documentRootKey,\n _key: anyRun._key,\n _type: fieldPresenceTypeName,\n },\n [],\n )\n : undefined\n }, [assistDocument?.tasks, syntheticTasks])\n\n return (\n <Card>\n <Flex flex={1} justify=\"flex-end\">\n <Flex gap={2} align={'center'}>\n {anyPresence && <AiFieldPresence presence={anyPresence} />}\n </Flex>\n </Flex>\n </Card>\n )\n}\n","import {ArrowLeftIcon} from '@sanity/icons/ArrowLeft'\nimport {Button} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {aiInspectorId} from '../../../assistInspector/constants'\nimport {instructionParam} from '../../../types'\n\nexport function BackToInstructionListLink() {\n const {openInspector} = useDocumentPane()\n\n const goBack = useCallback(\n // oxlint-disable-next-line no-unsafe-type-assertion\n () => openInspector(aiInspectorId, {[instructionParam]: undefined as any}),\n [openInspector],\n )\n\n return (\n <div>\n <Button\n as=\"a\"\n fontSize={1}\n icon={ArrowLeftIcon}\n mode=\"bleed\"\n padding={1}\n gap={2}\n onClick={goBack}\n text=\" Instructions\"\n textAlign=\"left\"\n />\n </div>\n )\n}\n","import {createContext} from 'react'\nimport type {ObjectSchemaType, SchemaType} from 'sanity'\n\nexport interface SelectedFieldContextValue {\n documentSchema?: ObjectSchemaType\n fieldSchema?: SchemaType\n}\n\nexport const SelectedFieldContext = createContext<SelectedFieldContextValue | undefined>(undefined)\nexport const SelectedFieldContextProvider = SelectedFieldContext.Provider\n","import {Card, Stack, Text} from '@sanity/ui'\nimport {useContext, useEffect, useMemo, useRef} from 'react'\nimport {\n type FieldError,\n FormCallbacksProvider,\n type FormCallbacksValue,\n FormInput,\n insert,\n type KeyedSegment,\n MemberFieldError,\n type ObjectInputProps,\n type ObjectSchemaType,\n PatchEvent,\n type Path,\n type SchemaType,\n set,\n setIfMissing,\n stringToPath,\n typed,\n useFormCallbacks,\n useSchema,\n} from 'sanity'\n\nimport {useAiPaneRouter} from '../../assistInspector/helpers'\nimport {useAiAssistanceConfig} from '../../assistLayout/AiAssistanceConfigContext'\nimport {\n type AssistDocument,\n type AssistField,\n assistFieldTypeName,\n type AssistInspectorRouteParams,\n documentRootKey,\n fieldPathParam,\n instructionParam,\n type StudioInstruction,\n} from '../../types'\nimport {AssistTypeContext} from './AssistTypeContext'\nimport {BackToInstructionListLink} from './instruction/BackToInstructionsLink'\nimport {SelectedFieldContextProvider, type SelectedFieldContextValue} from './SelectedFieldContext'\n\nconst EMPTY_FIELDS: AssistField[] = []\n\nexport function AssistDocumentForm(props: ObjectInputProps) {\n if (props.readOnly) {\n return (\n <Card border tone=\"caution\" padding={2}>\n <Text size={1}> You do not have sufficient permissions to manage instructions.</Text>\n </Card>\n )\n }\n return <AssistDocumentFormEditable {...props} />\n}\nfunction AssistDocumentFormEditable(props: ObjectInputProps) {\n const {onChange} = props\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = props.value as AssistDocument | undefined\n const id = value?._id\n const fields = value?.fields\n\n const {params, setParams} = useAiPaneRouter()\n const pathKey = params[fieldPathParam]\n const {typePath, documentType: targetDocumentType} = useContext(AssistTypeContext)\n const instruction = params[instructionParam]\n\n const activeKey = useMemo(() => {\n if (!typePath) {\n return undefined\n }\n return (fields ?? EMPTY_FIELDS).find((f) => f.path === typePath)?._key\n }, [fields, typePath])\n\n const activePath: Path | undefined = useMemo(() => {\n if (!activeKey) {\n return undefined\n }\n const base = ['fields', {_key: activeKey}]\n return instruction ? [...base, 'instructions', {_key: instruction}] : base\n }, [activeKey, instruction])\n\n const schema = useSchema()\n const documentSchema: ObjectSchemaType | undefined = useMemo(() => {\n if (!targetDocumentType) {\n return undefined\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return schema.get(targetDocumentType) as ObjectSchemaType\n }, [schema, targetDocumentType])\n\n const fieldSchema = useSelectedSchema(pathKey, documentSchema)\n\n const context: SelectedFieldContextValue = useMemo(\n () => ({\n documentSchema,\n fieldSchema: fieldSchema ?? documentSchema,\n }),\n [fieldSchema, documentSchema],\n )\n\n const title = value?.['title']\n\n useEffect(() => {\n if (!title && documentSchema && !id?.startsWith('drafts.')) {\n onChange(set(documentSchema.title ?? documentSchema.name, ['title']))\n }\n }, [title, documentSchema, onChange, id])\n\n const {onPathOpen, ...formCallbacks} = useFormCallbacks()\n\n const newCallbacks: FormCallbacksValue = useMemo(\n () => ({\n ...formCallbacks,\n onPathOpen: (path) => {\n if (!instruction && path.length === 4 && path[2] === 'instructions') {\n setParams(\n typed<AssistInspectorRouteParams>({\n ...params,\n // oxlint-disable-next-line no-unsafe-type-assertion\n [instructionParam]: (path[3] as KeyedSegment)?._key,\n // oxlint-disable-next-line no-unsafe-type-assertion\n }) as Record<keyof AssistInspectorRouteParams, string | undefined>,\n )\n } else {\n setTimeout(() => onPathOpen(path), 0)\n }\n },\n }),\n [formCallbacks, onPathOpen, params, setParams, instruction],\n )\n\n // When showing the instruction list (no specific instruction selected),\n // tell the form to focus on the field path to close any open modals\n useEffect(() => {\n if (activePath && !instruction) {\n onPathOpen(activePath)\n }\n }, [activePath, instruction, onPathOpen])\n\n const fieldError = useMemo(() => {\n const fieldError = props.members.find(\n (m): m is FieldError => m.kind === 'error' && m.fieldName === 'fields',\n )\n if (fieldError) {\n return <MemberFieldError member={fieldError} />\n }\n return undefined\n }, [props.members])\n\n return (\n <SelectedFieldContextProvider value={context}>\n <Stack gap={5}>\n <FieldsInitializer\n key={typePath}\n pathKey={typePath}\n activePath={activePath}\n fields={fields}\n documentSchema={documentSchema}\n onChange={onChange}\n />\n {instruction && <BackToInstructionListLink />}\n\n {activePath && !fieldError && (\n <FormCallbacksProvider {...newCallbacks}>\n <div style={{lineHeight: '1.25em'}}>\n <FormInput {...props} absolutePath={activePath} />\n </div>\n </FormCallbacksProvider>\n )}\n\n {fieldError}\n\n {!activePath && props.renderDefault(props)}\n </Stack>\n </SelectedFieldContextProvider>\n )\n}\n\nfunction useSelectedSchema(\n fieldPath: string | undefined,\n documentSchema: ObjectSchemaType | undefined,\n): SchemaType | undefined {\n return useMemo(() => {\n if (!fieldPath) {\n return undefined\n }\n if (fieldPath === documentRootKey) {\n return documentSchema\n }\n\n const path = stringToPath(fieldPath)\n let currentSchema: ObjectSchemaType | undefined = documentSchema\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n const field = currentSchema?.fields.find((f) => f.name === segment)\n if (!field) {\n return undefined\n }\n if (i === path.length - 1) {\n return field.type\n }\n if (field.type.jsonType !== 'object') {\n return undefined\n }\n currentSchema = field.type\n }\n return currentSchema\n }, [documentSchema, fieldPath])\n}\n\nfunction FieldsInitializer({\n pathKey,\n activePath,\n fields,\n documentSchema,\n onChange,\n}: {\n pathKey?: string\n activePath?: Path\n fields: AssistField[] | undefined\n documentSchema: ObjectSchemaType | undefined\n onChange: ObjectInputProps['onChange']\n}) {\n const {\n config: {__presets: presets},\n } = useAiAssistanceConfig()\n\n const existingField = fields?.find((f) => f._key === pathKey)\n const documentPresets = !!documentSchema?.name && presets?.[documentSchema?.name]\n\n const missingPresetInstructions = useMemo(() => {\n if (!documentPresets || !pathKey) {\n return undefined\n }\n const existingInstructions = existingField?.instructions\n const presetField = documentPresets.fields?.find((f) => f.path === pathKey)\n return presetField?.instructions?.filter(\n (i) => !existingInstructions?.some((ei) => ei._key === i._key),\n )\n }, [documentPresets, pathKey, existingField])\n\n // need this to not fire onChange twice in React strict mode\n const initialized = useRef(false)\n useEffect(() => {\n if (initialized.current || !pathKey) {\n return\n }\n if (existingField && !missingPresetInstructions?.length) {\n return\n }\n\n let event = PatchEvent.from([setIfMissing([], ['fields'])])\n if (!existingField) {\n event = event.append(\n insert(\n [\n typed<AssistField>({\n _key: pathKey,\n _type: assistFieldTypeName,\n path: pathKey,\n instructions: [],\n }),\n ],\n 'after',\n ['fields', -1],\n ),\n )\n }\n\n if (!existingField?.instructions?.length) {\n event = event.append([setIfMissing([], ['fields', {_key: pathKey}, 'instructions'])])\n }\n\n if (missingPresetInstructions?.length) {\n event = event.append(\n insert(\n missingPresetInstructions.map((preset): StudioInstruction => ({\n ...preset,\n _type: 'sanity.assist.instruction',\n prompt: preset.prompt?.map((p) => ({markDefs: [], ...p})),\n })),\n 'after',\n ['fields', {_key: pathKey}, 'instructions', -1],\n ),\n )\n }\n onChange(event)\n initialized.current = true\n // oxlint-disable-next-line react/exhaustive-effect-dependencies\n }, [activePath, onChange, pathKey, existingField, missingPresetInstructions])\n\n return null\n}\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {useContext} from 'react'\nimport type {PreviewProps} from 'sanity'\n\nimport {InlineBlockValueContext} from '../../assistFormComponents/AssistInlineFormBlock'\nimport {useSelectedField} from '../../assistInspector/helpers'\nimport {SelectedFieldContext} from './SelectedFieldContext'\n\nexport function FieldRefPreview(props: PreviewProps & {path?: string}) {\n const {actions} = props\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n // oxlint-disable-next-line no-unsafe-type-assertion\n const path = (useContext(InlineBlockValueContext) as {path?: string})?.path ?? props.path\n const selectedField = useSelectedField(documentSchema, path)\n return (\n <Flex gap={2} align=\"center\" style={{width: '100%'}}>\n <Flex flex={1} gap={2} align=\"center\" paddingY={3} paddingX={1}>\n <Box>\n <Text size={1} textOverflow=\"ellipsis\">\n {selectedField?.title ?? 'Select field'}\n </Text>\n </Box>\n </Flex>\n {/* oxlint-disable-next-line no-unsafe-type-assertion */}\n {actions as any}\n </Flex>\n )\n}\n","import type {FieldProps} from 'sanity'\n\nexport function HiddenFieldTitle(props: FieldProps) {\n return props.renderDefault({...props, title: '', level: props.level - 2, changed: false})\n}\n","import {Card, Flex, Switch, Text} from '@sanity/ui'\nimport {useCallback, useId} from 'react'\nimport {set, type StringInputProps, unset, useCurrentUser} from 'sanity'\n\nexport function InstructionVisibility(props: StringInputProps) {\n const {value, onChange} = props\n\n const user = useCurrentUser()\n\n const handleChange = useCallback(() => {\n const newValue = value ? '' : (user?.id ?? '')\n onChange(newValue ? set(newValue) : unset())\n }, [onChange, user, value])\n\n const id = useId()\n\n return (\n <Card>\n <Flex gap={2} align=\"flex-start\">\n <div style={{margin: '-3px 0'}}>\n <Switch\n {...props.elementProps}\n id={id}\n value={`${!value}`}\n checked={!value}\n onChange={handleChange}\n disabled={props.elementProps.readOnly}\n />\n </div>\n\n <Text muted size={1} weight=\"medium\">\n <label htmlFor={id}>Make visible to all Studio members</label>\n </Text>\n </Flex>\n </Card>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useId, useRef} from 'react'\nimport {set, type StringInputProps} from 'sanity'\n\nimport {FieldAutocomplete} from '../../../assistInspector/FieldAutocomplete'\nimport type {FieldRef} from '../../../assistInspector/helpers'\nimport {AssistTypeContext} from '../AssistTypeContext'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function FieldRefPathInput(props: StringInputProps) {\n const documentSchema = useContext(SelectedFieldContext)?.documentSchema\n const {typePath} = useContext(AssistTypeContext)\n const ref = useRef<HTMLDivElement>(null)\n const id = useId()\n const {onChange} = props\n\n useEffect(() => {\n ref.current?.querySelector('input')?.focus()\n }, [])\n\n const onSelect = useCallback((path: string) => onChange(set(path)), [onChange])\n\n const filter = useCallback(\n (field: FieldRef) => {\n if (!field.key.includes('|') || !typePath) {\n return true\n }\n if (field.key.includes('|') && !typePath.includes('|')) {\n return false\n }\n\n const fieldSegments = field.key.split('.')\n const lastArrayItemIndex = fieldSegments.findLastIndex((s) => s.includes('|'))\n const mustStartWith = fieldSegments.slice(0, lastArrayItemIndex + 1).join('.')\n return typePath.startsWith(mustStartWith)\n },\n [typePath],\n )\n if (!documentSchema) {\n return props.renderDefault(props)\n }\n\n return (\n <Box flex={1} style={{minWidth: 300}} ref={ref}>\n <FieldAutocomplete\n id={id}\n schemaType={documentSchema}\n onSelect={onSelect}\n fieldPath={props.value}\n filter={filter}\n />\n </Box>\n )\n}\n","import type {FieldError, FieldMember, FieldSetMember, ObjectMember} from 'sanity'\n\nexport function findFieldMember(\n members: ObjectMember[],\n fieldName: string,\n): FieldMember | FieldError | undefined {\n return members.find(\n (m): m is FieldMember | FieldError =>\n (m.kind === 'field' && m.name === fieldName) ||\n (m.kind === 'error' && m.fieldName === fieldName),\n )\n}\n\nexport function findFieldsetMember(\n members: ObjectMember[],\n fieldsetName: string,\n): FieldSetMember | undefined {\n return members.find(\n (m): m is FieldSetMember => m.kind === 'fieldSet' && m.fieldSet.name === fieldsetName,\n )\n}\n","import {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {useId, useMemo} from 'react'\nimport {type FieldError, type FieldMember, ObjectInputMember, type ObjectInputProps} from 'sanity'\n\nimport {findFieldMember, findFieldsetMember} from '../helpers'\n\nexport function InstructionInput(props: ObjectInputProps) {\n return (\n <Stack gap={[4, 4, 4, 5]}>\n <NameField {...props} />\n <ShareField {...props} />\n <ObjectMember fieldName={'prompt'} {...props} />\n <ObjectMember fieldName={'output'} {...props} />\n </Stack>\n )\n}\n\nfunction ObjectMember({fieldName, ...props}: ObjectInputProps & {fieldName: string}) {\n const member = findFieldMember(props.members, fieldName)\n return member ? <ObjectInputMember {...props} member={member} /> : null\n}\n\nconst NONE: (FieldMember | FieldError)[] = []\n\nfunction NameField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const titleId = useId()\n\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const iconMember = findFieldMember(members, 'icon')\n const titleMember = findFieldMember(members, 'title')\n\n const titlePlaceholder = 'Untitled'\n const moddedTitleMember = useMemo(() => {\n if (!titleMember) {\n return undefined\n }\n if (titleMember.kind === 'error') {\n return titleMember\n }\n return {\n ...titleMember,\n field: {\n ...titleMember?.field,\n schemaType: {\n ...titleMember?.field.schemaType,\n placeholder: titlePlaceholder,\n },\n },\n }\n }, [titleMember, titlePlaceholder])\n\n return (\n <Stack gap={5}>\n <Stack gap={2}>\n <Flex gap={1}>\n <Text as=\"label\" weight=\"semibold\" size={1} htmlFor={titleId}>\n Name\n </Text>\n </Flex>\n\n <Text muted size={1}>\n How this instruction appears in menus\n </Text>\n\n <Flex align=\"center\">\n {iconMember && (\n <Box flex=\"none\">\n <ObjectInputMember {...props} member={iconMember} />\n </Box>\n )}\n {moddedTitleMember && (\n <Box flex={1} style={{marginLeft: -1}}>\n <ObjectInputMember {...props} member={moddedTitleMember} />\n </Box>\n )}\n </Flex>\n </Stack>\n </Stack>\n )\n}\n\nfunction ShareField(props: ObjectInputProps) {\n const fieldsetMember = findFieldsetMember(props.members, 'appearance')\n const members = fieldsetMember?.fieldSet.members ?? NONE\n const visibilityMember = findFieldMember(members, 'userId')\n\n return <>{visibilityMember && <ObjectInputMember {...props} member={visibilityMember} />}</>\n}\n","import {useCallback, useContext, useState} from 'react'\nimport {\n type ArrayFieldProps,\n type ArraySchemaType,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n type ObjectSchemaType,\n} from 'sanity'\n\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputField(props: ArrayFieldProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (\n !fieldSchema ||\n !(isObjectSchemaType(fieldSchema) || isArrayOfObjectsSchemaType(fieldSchema))\n ) {\n return null\n }\n\n return (\n <EnabledOutputField {...props} fieldSchema={fieldSchema}>\n {props.children}\n </EnabledOutputField>\n )\n}\n\nfunction EnabledOutputField({\n fieldSchema,\n ...props\n}: ArrayFieldProps & {fieldSchema: ObjectSchemaType | ArraySchemaType<ObjectSchemaType>}) {\n const [open, setOpen] = useState(!!props.value?.length)\n const onExpand = useCallback(() => setOpen(true), [])\n const onCollapse = useCallback(() => setOpen(false), [])\n\n return props.renderDefault({\n ...props,\n collapsible: true,\n onExpand,\n onCollapse,\n collapsed: !open,\n level: 1,\n title: isObjectSchemaType(fieldSchema) ? 'Allowed fields' : 'Allowed types',\n })\n}\n","import {Card, Checkbox, Flex, Stack, Text} from '@sanity/ui'\nimport {useCallback, useContext, useEffect, useMemo} from 'react'\nimport {\n type ArrayOfObjectsInputProps,\n type ArraySchemaType,\n type FormPatch,\n insert,\n isArrayOfObjectsSchemaType,\n isObjectSchemaType,\n type ObjectSchemaType,\n PatchEvent,\n setIfMissing,\n typed,\n unset,\n} from 'sanity'\n\nimport {isAssistSupported} from '../../../helpers/assistSupported'\nimport {isType} from '../../../helpers/typeUtils'\nimport {type OutputFieldItem, outputFieldTypeName, type OutputTypeItem} from '../../../types'\nimport {SelectedFieldContext} from '../SelectedFieldContext'\n\nexport function InstructionOutputInput(props: ArrayOfObjectsInputProps) {\n const {fieldSchema} = useContext(SelectedFieldContext) ?? {}\n\n if (!fieldSchema) {\n return null\n }\n\n if (isObjectSchemaType(fieldSchema)) {\n return <ObjectOutputInput {...props} fieldSchema={fieldSchema} />\n }\n\n if (isArrayOfObjectsSchemaType(fieldSchema)) {\n return <ArrayOutputInput {...props} fieldSchema={fieldSchema} />\n }\n return null\n}\n\nfunction useEmptySelectAllValue(\n value: (OutputTypeItem | OutputFieldItem)[],\n allowedValues: {name: string}[],\n onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void,\n) {\n useEffect(() => {\n const validValues = value?.filter((v) =>\n allowedValues.find(\n (f) => f.name === (v._type === outputFieldTypeName ? v.relativePath : v.type),\n ),\n )\n const valueLength = value?.length ?? 0\n const validLength = validValues?.length ?? 0\n if ((!validLength && valueLength) || validLength >= allowedValues.length) {\n // if we end up here, we consider this a \"no selected fields/types\" selections. This should render and behave as all values selected.\n // we need this behaviour to accommodate new fields/types being added to the model, so they get visited by instructions without having to update the filter\n // when things have been explicitly selected, we let the selection remain as is\n onChange(PatchEvent.from([unset()]))\n }\n }, [allowedValues, value, onChange])\n}\n\nfunction ObjectOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ObjectSchemaType}) {\n const {value, onChange} = props\n\n const fields = useMemo(\n () => fieldSchema.fields.filter((field) => isAssistSupported(field.type)),\n [fieldSchema.fields],\n )\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n useEmptySelectAllValue(value as OutputTypeItem[], fields, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = fields\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputFieldItem>({\n _key: field.name,\n _type: 'sanity.assist.output.field',\n relativePath: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputFieldItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.field',\n relativePath: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, fields],\n )\n\n return (\n <Stack gap={2}>\n {fields.map((field) => {\n return (\n <Flex key={field.name} align=\"center\" gap={2}>\n <Selectable\n value={field.name}\n title={field.type.title ?? field.name}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction ArrayOutputInput({\n fieldSchema,\n ...props\n}: ArrayOfObjectsInputProps & {fieldSchema: ArraySchemaType}) {\n const {value, onChange} = props\n\n const ofItems = useMemo(\n () => fieldSchema.of.filter((itemType) => isAssistSupported(itemType)),\n [fieldSchema.of],\n )\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n useEmptySelectAllValue(value as OutputTypeItem[], ofItems, onChange)\n\n const onSelectChange = useCallback(\n (checked: boolean, selectedValue: string) => {\n if (checked) {\n if (value?.length) {\n onChange(PatchEvent.from(unset([{_key: selectedValue}])))\n } else {\n // we went from empty array to everything selected but one\n const items = ofItems\n .filter((f) => f.name !== selectedValue)\n .map((field) =>\n typed<OutputTypeItem>({\n _key: field.name,\n _type: 'sanity.assist.output.type',\n type: field.name,\n }),\n )\n onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))\n }\n } else {\n const patchValue: OutputTypeItem = {\n _key: selectedValue,\n _type: 'sanity.assist.output.type',\n type: selectedValue,\n }\n onChange(PatchEvent.from([setIfMissing([]), insert([patchValue], 'after', [-1])]))\n }\n },\n [onChange, value, ofItems],\n )\n return (\n <Stack gap={2}>\n {ofItems.map((itemType) => {\n return (\n <Flex key={itemType.name}>\n <Selectable\n value={itemType.name}\n title={isType(itemType, 'block') ? 'Text' : (itemType.title ?? itemType.name)}\n arrayValue={value}\n onChange={onSelectChange}\n />\n </Flex>\n )\n })}\n </Stack>\n )\n}\n\nfunction Selectable({\n title,\n arrayValue,\n value,\n onChange,\n}: {\n title: string\n value: string\n arrayValue?: {_key: string}[]\n onChange: (checked: boolean, value: string) => void\n}) {\n const checked = !arrayValue?.length || !!arrayValue?.find((v) => v._key === value)\n const handleChange = useCallback(() => onChange(checked, value), [onChange, checked, value])\n\n return (\n <Flex gap={2} align=\"flex-start\">\n <Checkbox checked={checked} onChange={handleChange} />\n <Card marginTop={1} onClick={handleChange}>\n <Text style={{cursor: 'default'}} size={1}>\n {title}\n </Text>\n </Card>\n </Flex>\n )\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {Box, Stack, Text} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {type ArrayOfObjectsInputProps, set, typed} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {randomKey} from '../../../_lib/randomKey'\nimport {instructionGuideUrl} from '../../../constants'\nimport type {PromptBlock, PromptTextBlock} from '../../../types'\n\nconst PteMods = styled(Box)`\n & [data-testid='pt-editor__toolbar-card'] > div > div:last-child {\n display: none;\n }\n & [data-testid='pt-editor'] {\n min-height: 300px;\n }\n & [data-testid='pt-editor'] .pt-inline-object * {\n max-width: 400px;\n }\n`\n\nexport function PromptInput(props: ArrayOfObjectsInputProps) {\n // quickfixes the model (converts blocks to inline blocks for alpha customers)\n // backend supports both types, but this prevents \"missing block\" schema errors\n useOnlyInlineBlocks(props)\n return (\n <PteMods>\n <Stack gap={3}>\n <Box paddingBottom={1}>\n <Text size={1} muted>\n Learn from{' '}\n <a href={instructionGuideUrl} target=\"_blank\" rel=\"noreferrer\">\n our instruction guide <ArrowRightIcon />\n </a>\n </Text>\n </Box>\n\n {props.renderDefault(props)}\n </Stack>\n </PteMods>\n )\n}\n\nfunction useOnlyInlineBlocks(props: ArrayOfObjectsInputProps) {\n const {value, onChange} = props\n const didRunRef = useRef(false)\n\n useEffect(() => {\n // Legacy alpha documents only need this conversion once on first load.\n if (didRunRef.current) {\n return\n }\n didRunRef.current = true\n\n let needsFix = false\n // oxlint-disable-next-line no-unsafe-type-assertion\n const val = ((value as PromptBlock[]) ?? []).map((block) => {\n if (block._type === 'block') {\n return block\n }\n\n needsFix = true\n return typed<PromptTextBlock>({\n _key: randomKey(12),\n _type: 'block',\n level: 0,\n markDefs: [],\n style: 'normal',\n children: [block],\n })\n })\n\n if (needsFix) {\n onChange(set(val))\n }\n }, [onChange, value])\n}\n","import type {ArrayFieldProps} from 'sanity'\n\nexport function InstructionsArrayField(props: ArrayFieldProps) {\n return props.renderDefault({\n ...props,\n title: ' ',\n })\n}\n","import {useMemo} from 'react'\nimport {type ArrayOfObjectsInputProps, useCurrentUser} from 'sanity'\n\nimport type {StudioInstruction} from '../../types'\n\nexport function InstructionsArrayInput(props: ArrayOfObjectsInputProps) {\n const user = useCurrentUser()\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const originalValue = props.value as StudioInstruction[] | undefined\n const originalMembers = props.members\n const value = useMemo(\n () => (originalValue ?? []).filter((v) => !v.userId || v.userId === user?.id),\n [originalValue, user],\n )\n const members = useMemo(\n () =>\n (originalMembers ?? []).filter((v) => {\n if (v.kind === 'error') {\n return true\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = v?.item?.value as any\n return !value.userId || value.userId === user?.id\n }),\n [originalMembers, user],\n )\n return props.renderDefault({...props, value, members})\n}\n","import {Box} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nexport function HideReferenceChangedBannerInput(props: ObjectInputProps) {\n const ref = useRef<HTMLDivElement>(null)\n\n // hides \"reference was changed\" banner (it is incorrectly flashing because the pane handler does not support the way wie use the assist pane)\n useEffect(() => {\n const parent = ref.current?.closest('[data-testid=\"pane-content\"]')\n if (!parent) {\n return\n }\n const style = document.createElement('style')\n const parentId = `id-${Math.random()}`.replace('.', '-')\n parent.id = parentId\n\n style.innerText = `\n #${parentId} [data-testid=\"reference-changed-banner\"] { display: none; }\n `\n parent.prepend(style)\n }, [ref])\n\n return <Box ref={ref}>{props.renderDefault(props)}</Box>\n}\n","import {DocumentTextIcon} from '@sanity/icons/DocumentText'\nimport {TokenIcon} from '@sanity/icons/Token'\nimport {defineArrayMember, defineField, defineType} from 'sanity'\n\nimport {HideReferenceChangedBannerInput} from '../components/HideReferenceChangedBannerInput'\nimport {contextDocumentTypeName} from '../types'\n\nexport const contextDocumentSchema = defineType({\n type: 'document',\n name: contextDocumentTypeName,\n title: 'AI context',\n liveEdit: true,\n icon: TokenIcon,\n components: {\n input: HideReferenceChangedBannerInput,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n name: 'context',\n type: 'array',\n title: 'Context',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n }),\n ],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n context: 'context',\n },\n prepare({title, context}) {\n const text = context\n ?.flatMap((block: any) => block?.children)\n .flatMap((child: any) => child?.text?.split(' '))\n .filter(Boolean)\n const words = text?.length ?? 0\n return {\n title,\n subtitle: `Words: ${words}`,\n media: DocumentTextIcon,\n }\n },\n },\n})\n","import {Icon, type IconSymbol} from '@sanity/icons'\nimport {CodeIcon} from '@sanity/icons/Code'\nimport {ComposeIcon} from '@sanity/icons/Compose'\nimport {LockIcon} from '@sanity/icons/Lock'\nimport {SparklesIcon} from '@sanity/icons/Sparkles'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Box, Flex, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {isValidElement} from 'react'\nimport {defineArrayMember, defineField, defineType, type ObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentForm} from '../assistDocument/components/AssistDocumentForm'\nimport {FieldRefPreview} from '../assistDocument/components/FieldRefPreview'\nimport {HiddenFieldTitle} from '../assistDocument/components/generic/HiddenFieldTitle'\nimport {IconInput} from '../assistDocument/components/instruction/appearance/IconInput'\nimport {InstructionVisibility} from '../assistDocument/components/instruction/appearance/InstructionVisibility'\nimport {FieldRefPathInput} from '../assistDocument/components/instruction/FieldRefInput'\nimport {InstructionInput} from '../assistDocument/components/instruction/InstructionInput'\nimport {InstructionOutputField} from '../assistDocument/components/instruction/InstructionOutputField'\nimport {InstructionOutputInput} from '../assistDocument/components/instruction/InstructionOutputInput'\nimport {PromptInput} from '../assistDocument/components/instruction/PromptInput'\nimport {InstructionsArrayField} from '../assistDocument/components/InstructionsArrayField'\nimport {InstructionsArrayInput} from '../assistDocument/components/InstructionsArrayInput'\nimport {createFieldRefCache} from '../assistLayout/fieldRefCache'\nimport {getInstructionTitle} from '../helpers/misc'\nimport {\n assistDocumentIdPrefix,\n assistDocumentTypeName,\n assistFieldTypeName,\n assistTasksStatusTypeName,\n fieldReferenceTypeName,\n instructionContextTypeName,\n instructionTaskTypeName,\n instructionTypeName,\n outputFieldTypeName,\n outputTypeTypeName,\n promptTypeName,\n userInputTypeName,\n} from '../types'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\n/**\n * The validation rule resolves the selected path against the same field-ref tree the field picker\n * offers, so it has to be built with the same `assist.maxFieldSelectionDepth`.\n */\nexport function createFieldReferenceType(maxFieldSelectionDepth?: number) {\n return defineType({\n type: 'object',\n name: fieldReferenceTypeName,\n title: 'Field',\n icon: ThListIcon,\n\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Field',\n components: {\n input: FieldRefPathInput,\n },\n validation: (rule) => {\n const getForSchemaType = createFieldRefCache(maxFieldSelectionDepth)\n return rule.custom((value, context) => {\n if (!value) {\n return 'Please select a field'\n }\n try {\n const docId = context.document?._id\n if (!docId) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id.`\n }\n if (!docId.startsWith(assistDocumentIdPrefix)) {\n return `Field reference cannot be used outside document inspector context. Could not resolve document id: ${docId}`\n }\n const targetDocType = docId.slice(assistDocumentIdPrefix.length)\n const schema = context.schema.get(targetDocType)\n if (!schema) {\n return `Field reference cannot be used outside document inspector context. Could not resolve schema: ${targetDocType}`\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n const {fieldRefs} = getForSchemaType(schema as ObjectSchemaType)\n const fieldRef = fieldRefs.find((r) => r.key === value)\n if (!fieldRef) {\n return `Field with path \"${value}\" does not exist in the schema.`\n }\n return true\n } catch (e) {\n console.error('Failed to resolve field reference', e)\n return 'Invalid field reference.'\n }\n })\n },\n }),\n ],\n preview: {\n select: {\n path: 'path',\n },\n prepare({path}) {\n return {\n title: path,\n path,\n icon: CodeIcon,\n }\n },\n },\n components: {\n preview: FieldRefPreview,\n },\n options: {\n modal: {\n type: 'popover',\n },\n },\n })\n}\n\nexport const userInput = defineType({\n type: 'object',\n name: userInputTypeName,\n title: 'User input',\n icon: ComposeIcon,\n fields: [\n defineField({\n type: 'string',\n name: 'message',\n title: 'User input title',\n placeholder: 'Provide instruction text',\n description: 'The header above the user input text field',\n validation: (rule) => rule.required(),\n }),\n defineField({\n type: 'text',\n rows: 3,\n name: 'description',\n title: 'User input description',\n description: 'The description above the user input text field',\n }),\n ],\n preview: {\n select: {\n title: 'message',\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 1,\n },\n },\n})\n\nexport const promptContext = defineType({\n type: 'object',\n name: instructionContextTypeName,\n title: contextDocumentSchema.title,\n icon: contextDocumentSchema.icon,\n fields: [\n defineField({\n type: 'reference',\n name: 'reference',\n to: [{type: contextDocumentSchema.name}],\n title: 'Context',\n description: 'The referenced context will be inserted into the instruction',\n validation: (rule) => rule.required(),\n components: {\n input: function Fix(props) {\n return <Box style={{maxWidth: 300}}>{props.renderDefault(props)}</Box>\n },\n },\n }),\n ],\n preview: {\n select: {\n ref: 'reference._id',\n title: 'reference.title',\n context: 'reference.context',\n },\n prepare(select) {\n return select.ref\n ? (contextDocumentSchema?.preview?.prepare?.(select) ?? select)\n : {title: 'No reference selected', media: contextDocumentSchema.icon}\n },\n },\n options: {\n modal: {\n type: 'popover',\n width: 'auto',\n },\n },\n})\n\nexport const prompt = defineType({\n type: 'array',\n name: promptTypeName,\n title: 'Prompt',\n of: [\n defineArrayMember({\n type: 'block',\n styles: [{title: 'Normal', value: 'normal'}],\n lists: [],\n marks: {\n decorators: [],\n annotations: [],\n },\n of: [\n defineArrayMember({\n type: fieldReferenceTypeName,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),\n ],\n }),\n /* defineArrayMember({\n type: fieldReferenceTypeName,\n }),\n defineArrayMember({\n type: promptContext.name,\n }),\n defineArrayMember({\n type: userInput.name,\n }),*/\n ],\n})\n\nexport const outputFieldType = defineType({\n type: 'object',\n name: outputFieldTypeName,\n title: 'Output field',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n ],\n})\n\nexport const outputTypeType = defineType({\n type: 'object',\n name: outputTypeTypeName,\n title: 'Output type',\n fields: [\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n ],\n})\n\nexport const instruction = defineType({\n type: 'object',\n name: instructionTypeName,\n title: 'Instruction',\n fieldsets: [\n {name: 'appearance', title: 'Appearance', options: {collapsible: true, collapsed: true}},\n ],\n preview: {\n select: {\n icon: 'icon',\n title: 'title',\n userId: 'userId',\n },\n prepare: ({icon, title, userId}) => {\n return {\n title,\n // oxlint-disable-next-line no-unsafe-type-assertion\n icon: icon ? <Icon symbol={icon as IconSymbol} /> : SparklesIcon,\n userId,\n }\n },\n },\n components: {\n input: InstructionInput,\n preview: (props: any) => {\n // `icon` from `prepare` is either a rendered element (<Icon symbol={...} />) or a\n // component (the SparklesIcon fallback), so it cannot be rendered as <IconValue /> directly\n const IconValue = props.icon\n const icon = isValidElement(IconValue) ? IconValue : IconValue ? <IconValue /> : null\n return (\n <Flex gap={3} align=\"center\" padding={2}>\n {icon ? (\n <Box flex=\"none\">\n <Text size={1}>{icon}</Text>\n </Box>\n ) : null}\n\n <Stack flex={1} gap={2}>\n <Text size={1} textOverflow=\"ellipsis\" weight=\"medium\">\n {getInstructionTitle(props)}\n </Text>\n </Stack>\n\n {props.userId && (\n <Text size={1}>\n <Tooltip\n content={<Text size={1}>Only visible to you</Text>}\n padding={2}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n </Text>\n )}\n </Flex>\n )\n },\n },\n fields: [\n defineField({\n type: prompt.name,\n name: 'prompt',\n title: 'Instruction',\n components: {\n input: PromptInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'icon',\n title: 'Icon',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: IconInput,\n },\n }),\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n },\n }),\n defineField({\n type: 'string',\n name: 'userId',\n title: 'Visibility',\n fieldset: 'appearance',\n components: {\n field: HiddenFieldTitle,\n input: InstructionVisibility,\n },\n initialValue: (_params, context) => context.currentUser?.id ?? '',\n readOnly: (context) =>\n Boolean(\n context.parent?.createdById && context.parent?.createdById !== context.currentUser?.id,\n ),\n }),\n defineField({\n type: 'string',\n name: 'createdById',\n title: 'Created by',\n hidden: true,\n fieldset: 'appearance',\n initialValue: (_params, context) => {\n return context.currentUser?.id ?? ''\n },\n }),\n defineField({\n type: 'array',\n name: 'output',\n title: 'Output filter',\n components: {\n input: InstructionOutputInput,\n field: InstructionOutputField,\n },\n of: [\n defineArrayMember({type: outputFieldType.name}),\n defineArrayMember({type: outputTypeType.name}),\n ],\n }),\n ],\n})\n\nexport const fieldInstructions = defineType({\n type: 'object',\n name: assistFieldTypeName,\n title: 'Field prompt',\n /* components: {\n input: FieldPromptInput,\n },*/\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n readOnly: true,\n hidden: true,\n }),\n defineField({\n type: 'array',\n name: 'instructions',\n title: 'Instructions',\n of: [{type: instruction.name}],\n components: {\n field: InstructionsArrayField,\n input: InstructionsArrayInput,\n },\n }),\n ],\n preview: {\n select: {\n title: 'path',\n },\n },\n})\n\nexport const assistDocumentSchema = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({liveEdit: true} as any),\n name: assistDocumentTypeName,\n title: 'AI Document',\n\n components: {\n input: AssistDocumentForm,\n field: (props: any) => {\n return props.renderDefault({...props, title: ''})\n },\n },\n fields: [\n defineField({\n type: 'string',\n name: 'title',\n title: 'Title',\n }),\n defineField({\n type: 'array',\n name: 'fields',\n title: 'Fields',\n of: [{type: fieldInstructions.name}],\n }),\n ],\n preview: {\n select: {\n title: 'title',\n },\n },\n})\n\nexport const instructionTask = defineType({\n type: 'object',\n name: instructionTaskTypeName,\n title: 'Instruction task',\n fields: [\n defineField({\n type: 'string',\n name: 'path',\n title: 'Path',\n }),\n defineField({\n type: 'string',\n name: 'instructionKey',\n title: 'Instruction key',\n }),\n defineField({\n type: 'datetime',\n name: 'started',\n title: 'Started',\n }),\n defineField({\n type: 'datetime',\n name: 'updated',\n title: 'Updated',\n }),\n defineField({\n type: 'string',\n name: 'info',\n title: 'Info',\n }),\n ],\n})\n\nexport const documentInstructionStatus = defineType({\n //NOTE: this is a document type. Using object here ensures it does not appear in structure menus\n type: 'object',\n //workaround for using object and not document\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({liveEdit: true} as any),\n name: assistTasksStatusTypeName,\n title: 'Document instruction status',\n fields: [\n defineField({\n type: 'array',\n name: 'tasks',\n title: 'Tasks',\n of: [{type: instructionTask.name}],\n }),\n ],\n})\n","import type {ArrayOfType, FieldProps, SchemaTypeDefinition} from 'sanity'\n\nimport {\n assistDocumentSchema,\n createFieldReferenceType,\n documentInstructionStatus,\n fieldInstructions,\n instruction,\n instructionTask,\n outputFieldType,\n outputTypeType,\n prompt,\n promptContext,\n userInput,\n} from './assistDocumentSchema'\nimport {contextDocumentSchema} from './contextDocumentSchema'\n\nfunction excludeComments<T extends SchemaTypeDefinition | ArrayOfType>(type: T): T {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const existingRender = (type as any)?.components?.field\n return {\n ...type,\n ...('components' in type\n ? {\n components: {\n ...type.components,\n field: (props: FieldProps) => {\n const newProps = {...props, __internal_comments: undefined}\n if (typeof existingRender === 'function') {\n return existingRender(newProps)\n }\n return props.renderDefault(newProps)\n },\n },\n }\n : {}),\n ...('fields' in type\n ? {\n // recursively disable comments in fields\n fields: type.fields?.map((field) => excludeComments(field)),\n }\n : {}),\n ...('of' in type\n ? {\n // recursively disable comments in array items\n of: type.of?.map((arrayItemType) => excludeComments(arrayItemType)),\n }\n : {}),\n }\n}\n\n/**\n * @param maxFieldSelectionDepth - see `AssistConfig.maxFieldSelectionDepth`; the field reference\n * type validates picked paths against the field-ref tree, which must be built with the same depth\n */\nexport function createSchemaTypes(maxFieldSelectionDepth?: number) {\n const instructionForm = [\n fieldInstructions,\n instruction,\n createFieldReferenceType(maxFieldSelectionDepth),\n prompt,\n userInput,\n promptContext,\n ].map(excludeComments)\n\n return [\n ...instructionForm,\n outputFieldType,\n outputTypeType,\n assistDocumentSchema,\n documentInstructionStatus,\n instructionTask,\n contextDocumentSchema,\n ]\n}\n","import type {SanityClient} from '@sanity/client'\nimport {definePlugin, isObjectSchemaType} from 'sanity'\n\nimport {AssistDocumentInputWrapper} from './assistDocument/AssistDocumentInput'\nimport {AssistDocumentLayout} from './assistDocument/AssistDocumentLayout'\nimport {AssistFieldWrapper} from './assistFormComponents/AssistField'\nimport {AssistFormBlock} from './assistFormComponents/AssistFormBlock'\nimport {AssistInlineFormBlock} from './assistFormComponents/AssistInlineFormBlock'\nimport {AssistItem} from './assistFormComponents/AssistItem'\nimport {assistInspector} from './assistInspector'\nimport {AssistLayout} from './assistLayout/AssistLayout'\nimport type {AssistConfig} from './assistTypes'\nimport {ImageContextProvider} from './components/ImageContext'\nimport {SafeValueInput} from './components/SafeValueInput'\nimport {packageName} from './constants'\nimport {assistFieldActions} from './fieldActions/assistFieldActions'\nimport type {AssistFieldActionNode, AssistFieldActionProps} from './fieldActions/customFieldActions'\nimport {isSchemaAssistEnabled} from './helpers/assistSupported'\nimport {validateStyleguide} from './helpers/styleguide'\nimport {isImage} from './helpers/typeUtils'\nimport {createAssistDocumentPresence} from './presence/AssistDocumentPresence'\nimport {createSchemaTypes} from './schemas'\nimport type {TranslationConfig} from './translate/types'\nimport {assistDocumentTypeName, type AssistPreset} from './types'\n\nexport interface AssistPluginConfig {\n translate?: TranslationConfig\n\n /**\n * Config that affects all instructions\n */\n assist?: AssistConfig\n\n fieldActions?: {\n title?: string\n /**\n * The returned array can include `undefined` entries in the action array. These will be filtered out.\n */\n useFieldActions?: (props: AssistFieldActionProps) => (AssistFieldActionNode | undefined)[]\n }\n\n /**\n * @internal\n */\n __customApiClient?: (defaultClient: SanityClient) => SanityClient\n\n /**\n * @internal\n */\n __presets?: Record<string, AssistPreset>\n}\n\nexport const assist = definePlugin<AssistPluginConfig | void>((config) => {\n const configWithDefaults = config ?? {}\n const styleguide = configWithDefaults.translate?.styleguide || ''\n const maxPathDepth = configWithDefaults.assist?.maxPathDepth\n const maxFieldSelectionDepth = configWithDefaults.assist?.maxFieldSelectionDepth\n const temperature = configWithDefaults.assist?.temperature\n\n if (typeof styleguide === 'string') {\n validateStyleguide(styleguide)\n }\n\n if (maxPathDepth !== undefined && (maxPathDepth < 1 || maxPathDepth > 12)) {\n throw new Error(\n `[${packageName}]: \\`assist.maxPathDepth\\` must be be in the range [1,12] inclusive, but was ${maxPathDepth}`,\n )\n }\n\n if (\n maxFieldSelectionDepth !== undefined &&\n (!Number.isInteger(maxFieldSelectionDepth) ||\n maxFieldSelectionDepth < 1 ||\n maxFieldSelectionDepth > 12)\n ) {\n throw new Error(\n `[${packageName}]: \\`assist.maxFieldSelectionDepth\\` must be an integer in the range [1,12] inclusive, but was ${maxFieldSelectionDepth}`,\n )\n }\n\n if (temperature !== undefined && (temperature < 0 || temperature > 1)) {\n throw new Error(\n `[${packageName}]: \\`assist.temperature\\` must be in the range [0,1] inclusive, but was ${temperature}`,\n )\n }\n\n return {\n name: packageName,\n // the addition of global references broke auto updating studios\n // new versions of studio know to look for this prop on assist plugin, and filter + console.warn if it is missing\n // oxlint-disable-next-line no-unsafe-type-assertion\n ...({handlesGDR: true} as any),\n schema: {\n types: createSchemaTypes(maxFieldSelectionDepth),\n },\n i18n: {\n bundles: [{}],\n },\n\n document: {\n inspectors: (prev, context) => {\n const documentType = context.documentType\n const docSchema = context.schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistInspector]\n }\n return prev\n },\n unstable_fieldActions: (prev, {documentType, schema}) => {\n if (documentType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(documentType)\n if (docSchema && isSchemaAssistEnabled(docSchema)) {\n return [...prev, assistFieldActions]\n }\n return prev\n },\n unstable_languageFilter: (prev, {documentId, schema, schemaType}) => {\n if (schemaType === assistDocumentTypeName) {\n return []\n }\n const docSchema = schema.get(schemaType)\n if (docSchema && isObjectSchemaType(docSchema) && isSchemaAssistEnabled(docSchema)) {\n return [...prev, createAssistDocumentPresence(documentId)]\n }\n return prev\n },\n components: {\n unstable_layout: AssistDocumentLayout,\n },\n },\n\n studio: {\n components: {\n layout: function Layout(props) {\n return <AssistLayout {...props} config={configWithDefaults} />\n },\n },\n },\n\n form: {\n components: {\n input: AssistDocumentInputWrapper,\n field: AssistFieldWrapper,\n item: AssistItem,\n block: AssistFormBlock,\n inlineBlock: AssistInlineFormBlock,\n },\n },\n\n plugins: [\n definePlugin({\n name: `${packageName}/safe-value-input`,\n form: {components: {input: SafeValueInput}},\n })(),\n\n definePlugin({\n name: `${packageName}/generate-caption`,\n form: {\n components: {\n input: (props) => {\n const {schemaType} = props\n\n if (isImage(schemaType)) {\n return <ImageContextProvider {...props} />\n }\n return props.renderDefault(props)\n },\n },\n },\n })(),\n ],\n }\n})\n","import type {SanityClient} from '@sanity/client'\nimport {defer, delay, merge, Observable, of, partition, switchMap, throwError} from 'rxjs'\nimport {exhaustMapToWithTrailing} from 'rxjs-exhaustmap-with-trailing'\nimport {filter, mergeMap, share, take} from 'rxjs/operators'\nimport type {MutationEvent, ReconnectEvent, WelcomeEvent} from 'sanity'\n\n/** @internal */\nexport type ListenQueryParams = Record<string, string | number | boolean | string[]>\n\n/** @beta */\nexport interface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n throttleTime?: number\n transitions?: ('update' | 'appear' | 'disappear')[]\n}\n\nconst fetch = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(() =>\n // getVersionedClient(options.apiVersion)\n client.observable.fetch(query, params, {\n tag: options.tag,\n filterResponse: true,\n }),\n )\n\nconst listen = (\n client: SanityClient,\n query: string,\n params: ListenQueryParams,\n options: ListenQueryOptions,\n) =>\n defer(\n () =>\n // getVersionedClient(options.apiVersion)\n client.listen(query, params, {\n events: ['welcome', 'mutation', 'reconnect'],\n includeResult: false,\n visibility: 'query',\n tag: options.tag,\n }),\n // oxlint-disable-next-line no-unsafe-type-assertion\n ) as Observable<ReconnectEvent | WelcomeEvent | MutationEvent>\n\nfunction isWelcomeEvent(\n event: MutationEvent | ReconnectEvent | WelcomeEvent,\n): event is WelcomeEvent {\n return event.type === 'welcome'\n}\n\n/** @internal */\nexport const listenQuery = (\n client: SanityClient,\n query: string | {fetch: string; listen: string},\n params: ListenQueryParams = {},\n options: ListenQueryOptions = {},\n) => {\n const fetchQuery = typeof query === 'string' ? query : query.fetch\n const listenerQuery = typeof query === 'string' ? query : query.listen\n\n const fetchOnce$ = fetch(client, fetchQuery, params, options)\n\n const events$ = listen(client, listenerQuery, params, options).pipe(\n mergeMap((ev, i) => {\n const isFirst = i === 0\n if (isFirst && !isWelcomeEvent(ev)) {\n // if the first event is not welcome, it is most likely a reconnect and\n // if it's not a reconnect something is very wrong\n // oxlint-disable-next-line no-deprecated\n return throwError(\n new Error(\n ev.type === 'reconnect'\n ? 'Could not establish EventSource connection'\n : `Received unexpected type of first event \"${ev.type}\"`,\n ),\n )\n }\n return of(ev)\n }),\n share(),\n )\n\n const [welcome$, mutationAndReconnect$] = partition(events$, isWelcomeEvent)\n const isRelevantEvent = (event: MutationEvent | ReconnectEvent | WelcomeEvent): boolean => {\n if (!options.transitions || event.type !== 'mutation') {\n return true\n }\n\n return options.transitions.includes(event.transition)\n }\n\n return merge(\n welcome$.pipe(take(1)),\n mutationAndReconnect$.pipe(\n filter(isRelevantEvent),\n switchMap((event) => merge(of(event), of(event).pipe(delay(options.throttleTime || 1000)))),\n ),\n ).pipe(exhaustMapToWithTrailing(fetchOnce$))\n}\n","import {dequal as isEqual} from 'dequal/lite'\nimport {useEffect, useRef, useState} from 'react'\nimport {of} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, useClient} from 'sanity'\n\nimport {listenQuery} from './fixedListenQuery'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ntype ReturnShape<T> = {\n loading: boolean\n error: boolean\n data: T | null\n}\n\ntype Observable = {\n unsubscribe: () => void\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS: ListenQueryOptions = {apiVersion: `v2022-05-09`}\n\nexport function useListeningQuery<T>(\n query: string,\n params: Params = DEFAULT_PARAMS,\n options: ListenQueryOptions = DEFAULT_OPTIONS,\n): ReturnShape<T> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [data, setData] = useState<T | null>(null)\n const subscription = useRef<null | Observable>(null)\n\n const client = useClient({apiVersion: `v2022-05-09`})\n\n useEffect(() => {\n if (query) {\n subscription.current = listenQuery(client, query, params, options)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(true)\n setLoading(false)\n setData(null)\n\n return of(null)\n }),\n )\n .subscribe((documents) => {\n setData((current) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => {\n return subscription.current ? subscription.current.unsubscribe() : undefined\n }\n }, [query, params, options, client])\n\n return {loading, error, data}\n}\n","import {SyncIcon} from '@sanity/icons/Sync'\nimport {Box, Button, Card, Flex, Label, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useMemo, useState} from 'react'\nimport {useClient, useSchema} from 'sanity'\n\nimport {useListeningQuery} from '../../_lib/useListeningQuery'\nimport {assistSerializedTypeName, type SerializedSchemaType} from '../../types'\nimport {serializeSchema} from './serializeSchema'\n\nconst NO_DATA: SerializedSchemaType[] = []\n\nconst defaultTitle = 'Sync schema'\n\nexport function SchemaTypeTool() {\n const schema = useSchema()\n const client = useClient({apiVersion: '2023-01-01'})\n const [saving, setSaving] = useState(false)\n const [syncTitle, setSyncTitle] = useState(defaultTitle)\n\n const {data} = useListeningQuery<SerializedSchemaType[]>('*[_type==$type] | order(_type)', {\n type: assistSerializedTypeName,\n })\n\n const types = useMemo(() => {\n return serializeSchema(schema)\n }, [schema])\n\n const storeTypes = useCallback(() => {\n setSaving(true)\n let canSave = true\n async function store() {\n setSyncTitle(`Syncing 0/${types.length}`)\n const transaction = client.transaction()\n for (let i = 0; i < types.length; i++) {\n if (!canSave) {\n break\n }\n const type = types[i]!\n // oxlint-disable-next-line no-await-in-loop, no-unsafe-type-assertion, await-thenable\n await transaction.createOrReplace(type as Required<typeof type>)\n if (i > 0 && i % 50 === 0) {\n // oxlint-disable-next-line no-await-in-loop\n await transaction.commit()\n transaction.reset()\n setSyncTitle(`Syncing ${i}/${types.length}`)\n }\n }\n await transaction.commit()\n }\n store()\n .catch(console.error)\n .finally(() => {\n setSaving(false)\n setSyncTitle(defaultTitle)\n })\n return () => {\n canSave = false\n setSaving(false)\n setSyncTitle(defaultTitle)\n }\n }, [types, client, setSaving, setSyncTitle])\n\n return (\n <Card padding={4} overflow=\"auto\" style={{height: 'calc(100vh - 81px)'}}>\n <Stack gap={4}>\n <Box>\n <Button\n icon={saving ? <Spinner style={{marginTop: 5}} /> : SyncIcon}\n text={syncTitle}\n disabled={saving}\n onClick={storeTypes}\n />\n </Box>\n <Flex gap={2}>\n <Stack gap={2}>\n <Label>Studio schema</Label>\n <ul>\n {types.map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n\n <Stack gap={2}>\n <Label>Stored schema</Label>\n <ul>\n {(data ?? NO_DATA).map((type) => (\n <li key={type.name}>\n <SchemaEntry schemaStub={type} />\n </li>\n ))}\n </ul>\n </Stack>\n </Flex>\n </Stack>\n </Card>\n )\n}\n\nfunction SchemaEntry({schemaStub}: {schemaStub: SerializedSchemaType}) {\n const out = useMemo(() => JSON.stringify(schemaStub, null, 2), [schemaStub])\n return <pre>{out}</pre>\n}\n","import {useRunInstruction} from '../assistLayout/RunInstructionProvider'\n\nexport type GetUserInput = (args: {\n /**\n * Dialog title\n */\n title: string\n /**\n * One titled input per array item\n */\n inputs: CustomInput[]\n}) => Promise<CustomInputResult[] | undefined>\n\n/**\n *\n */\nexport interface CustomInput {\n /**\n * Id for the input\n */\n id: string\n /**\n * Title of the input field\n */\n title: string\n /**\n * Additional info that will be displayed over the input\n */\n description?: string\n}\n\nexport type CustomInputResult = {\n /**\n * Identifies which custom input the `result`belongs to\n */\n input: CustomInput\n\n /**\n * The text provided by the user in the input\n */\n result: string\n}\n\n/**\n * `useUserInput` returns a function that can be used to await user input.\n *\n * Useful for custom `fieldActions` to get user input for populating Agent Action requests,.\n *\n * ```ts\n * fieldActions: {\n * useFieldActions: (props) => {\n * const {\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * } = props\n * const client = useClient({apiVersion: 'vX'})\n * const getUserInput = useUserInput()\n * return useMemo(() => {\n * return [\n * defineAssistFieldAction({\n * title: 'Log user input',\n * icon: UserIcon,\n * onAction: async () => {\n * const input = await getUserInput({\n * title: 'Topic',\n * inputs: [{id: 'about', title: 'What should the article be about?'}],\n * })\n * if (!input) return // user canceled input\n * await client.agent.action.generate({\n * schemaId,\n * targetDocument: {\n * operation: 'createIfNotExists',\n * _id: documentIdForAction,\n * _type: documentSchemaType.name,\n * initialValues: getDocumentValue(),\n * },\n * instruction: `\n * Create a document about the following topic:\n * $about\n * ---\n * `,\n * instructionParams: {about: input[0].result},\n * conditionalPaths: {paths: getConditionalPaths()},\n * })\n * },\n * }),\n * ]\n * }, [\n * client,\n * documentSchemaType,\n * schemaId,\n * getDocumentValue,\n * getConditionalPaths,\n * documentIdForAction,\n * getUserInput,\n * ])\n * },\n * }\n * ```\n */\nexport function useUserInput(): GetUserInput {\n const {getUserInput} = useRunInstruction()\n return getUserInput\n}\n"],"mappings":"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"}
\ No newline at end of file