@sanity/embeddings-index-ui
4.0.194.0.20
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":["{apiVersion: 'vX'}","useMemo(() => {\n const customHost = localStorage.getItem('embeddings-index-host')\n if (customHost) {\n return client.withConfig({\n apiHost: customHost,\n // Required so the override host is used as-is (not `{projectId}.{apiHost}`).\n // There is no non-deprecated replacement for this client flag.\n // oxlint-disable-next-line no-deprecated -- custom embeddings-index-host must not be project-prefixed\n useProjectHostname: false,\n withCredentials: false,\n })\n }\n return client\n }, [client])","_c","() => {\n client\n .request<{enabled: boolean}>({\n method: 'GET',\n url: `/embeddings-index/status`,\n })\n .then((response) => {\n setStatus(response.enabled ? 'enabled' : 'disabled')\n })\n .catch((err) => {\n console.error(err)\n setStatus('error')\n })\n }","[client]","<FeatureEnabledContext.Provider value={status}>{props.children}</FeatureEnabledContext.Provider>","children","FeatureEnabledContext.Provider","<Card tone=\"primary\" border padding={4}>\n <Text size={1}>\n 💎 Unlock semantic search with the Embeddings Index API — available on Team, Business, and\n Enterprise plans.{' '}\n <a href={`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`}>\n Upgrade now →\n </a>\n </Text>\n </Card>","`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`","<Card padding={4} border tone=\"critical\">\n An error occurred. See console for details.\n </Card>","_c","schema\n .getTypeNames()\n .map((n) => schema.get(n))\n .filter((schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document')),\n )\n .filter(\n (documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document',\n )\n .map((documentType) => `\"${documentType.name}\"`)\n .join(',\\n')","(schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document'))","(documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document'","(documentType) => `\"${documentType.name}\"`","{\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }","useMemo(\n () => ({\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }),\n [defaultFilter, dataset],\n )","documentType","_c","_temp","_temp2","(propValue: string) => onChange((current) => ({...current, [prop]: propValue}))","useCallback(\n (propValue: string) => onChange((current) => ({...current, [prop]: propValue})),\n [onChange, prop],\n )","<FormInput\n label={label}\n description={description}\n onChange={handleChange}\n value={index[prop] ?? ''}\n readOnly={readOnly}\n placeholder={placeholder}\n type={type}\n />","index[prop] ?? ''","type = 'text'","(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value)","useCallback(\n (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value),\n [onChange],\n )","<Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>","description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )","type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )","<Stack gap={3}>\n <Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>\n {description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )}\n {type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )}\n </Stack>","_c","() => {\n if (!open) {\n return\n }\n setTimeout(() => ref.current?.querySelector('input')?.focus())\n }","[ref, open]","(index: IndexState) => {\n onSubmit(index)\n onClose()\n }","useCallback(\n (index: IndexState) => {\n onSubmit(index)\n onClose()\n },\n [onSubmit, onClose],\n )","open ? (\n <Dialog id={id} width={1} ref={ref} onClose={onClose} header=\"Create embeddings index\">\n <Stack padding={4} gap={5}>\n <IndexEditor readOnly={false} onSubmit={handleSubmit} />\n </Stack>\n </Dialog>\n ) : null","client.config().dataset ?? ''","() => ({\n ...defaultIndex,\n ...selectedIndex,\n })","() => setIndex(selectedIndex ?? {...defaultIndex})","[selectedIndex, defaultIndex]","(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n }","index.indexName","useCallback(\n (e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [index, readOnly, onSubmit, client],\n )","errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null","(error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n )","errors?.length","<IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />","<IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />","<IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />","filter","<IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />","projection","onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )","<Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>","<form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>\n </form>","_c","_temp","{\n documentId,\n style,\n schemaTypeName,\n ...buttonProps\n}: ResultPreviewProps & ButtonProps","schemaTypeName ? schema.get(schemaTypeName) : undefined","{minHeight: '36px'}","<Card style={{minHeight: '36px'}}>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n title={'Loading...'}\n schemaType={schemaType}\n isPlaceholder\n />\n </Card>","<ErrorOutlineIcon />","<code>{schemaTypeName ?? 'N/A'}</code>","schemaTypeName ?? 'N/A'","<Card>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n media={<ErrorOutlineIcon />}\n title={\n <>\n Unknown type <code>{schemaTypeName ?? 'N/A'}</code> for {documentId}\n </>\n }\n />\n </Card>","<DocumentPreviewInner\n documentId={documentId}\n schemaTypeName={schemaTypeName}\n schemaType={schemaType}\n style={style}\n {...buttonProps}\n />","{\n documentId,\n schemaType,\n style,\n button,\n}: ResultPreviewProps & {schemaType: SchemaType} & ButtonProps","getPreviewStateObservable(documentPreviewStore, schemaType, documentId)","useMemo(\n () => getPreviewStateObservable(documentPreviewStore, schemaType, documentId),\n [documentId, documentPreviewStore, schemaType],\n )","{\n snapshot: null,\n isLoading: true,\n original: null,\n }","() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }","name","useMemo(() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }, [documentId, schemaType?.name])","{\n intent: 'edit',\n params: {\n id: documentId,\n type: schemaType?.name,\n },\n }","schemaType?.name","getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })","<SanityDefaultPreview\n {...getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })}\n isPlaceholder={previewIsLoading ?? true}\n layout=\"default\"\n icon={schemaType?.icon}\n />","previewIsLoading ?? true","schemaType?.icon","{width: '100%', ...style}","<Button\n as={'a'}\n href={href}\n onClick={onIntentClick}\n mode=\"ghost\"\n style={{width: '100%', ...style}}\n >\n {preview}\n </Button>","{width: '100%'}","<Box style={{width: '100%'}}>{preview}</Box>","_c","_Fragment","(queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n }","indexName","maxResults","(r) => typed<Option>({result: r, value: r.value.documentId})","useCallback(\n (queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n },\n [client, indexConfig, getEmptySearchValue, filterResult, typeFilter],\n )","() => {\n if (prevDebouncedQuery.current !== debouncedQuery) {\n runIndexQuery(debouncedQuery)\n }\n prevDebouncedQuery.current = debouncedQuery\n }","[debouncedQuery, runIndexQuery]","{onClick: () => runIndexQuery(queryRef.current)}","useMemo(\n () => ({onClick: () => runIndexQuery(queryRef.current)}),\n [runIndexQuery, queryRef],\n )","(newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n }","useCallback(\n (newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n },\n [setQuery],\n )","(value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n }","(r): r is Option => 'result' in r","r","useCallback(\n (value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n },\n [onSelect, options],\n )","<Autocomplete\n id={id}\n ref={ref}\n data-testid=\"semantic-autocomplete\"\n placeholder=\"Type to search...\"\n openButton={openButtonConfig}\n onFocus={onFocus}\n onChange={handleChange}\n loading={searching}\n onBlur={onBlur}\n readOnly={readOnly}\n filterOption={NO_FILTER}\n onQueryChange={handleQueryChange}\n options={options}\n renderOption={AutocompleteOption}\n />","{width: '100%'}","<Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>","documentId","type","<Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>","Math.floor(props.result.score * 100)","<Button mode=\"bleed\" padding={1} style={{width: '100%'}}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>\n <Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>\n </Flex>\n </Button>","<Button mode=\"bleed\" padding={1} style={{width: '100%'}} disabled>\n <Flex gap={2} align=\"center\">\n No results.\n </Flex>\n </Button>","() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value)\n }, ms)\n return () => clearTimeout(timeoutId)\n }","[value, ms]","_c","_temp","_temp2","useCallback(() => 'anything', [])","{indexName, maxResults: 8}","useMemo(\n () => ({indexName, maxResults: 8}),\n [indexName],\n )","(hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n }","useCallback(\n (hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n },\n [resolveIntentLink, navigateUrl],\n )","<SemanticSearchAutocomplete\n getEmptySearchValue={getEmpty}\n indexConfig={indexConfig}\n onSelect={onSelect}\n />","_c","_temp","{selectedIndex, onDeleteIndex}: IndexInfoProps","() => onDeleteIndex(selectedIndex)","useCallback(\n () => onDeleteIndex(selectedIndex),\n [selectedIndex, onDeleteIndex],\n )","<Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>","selectedIndex?.indexName ?? 'Untitled'","<Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />","<Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>","{placement: 'right'}","<Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>","`button-${selectedIndex.indexName}`","<Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>","{maxWidth: 600}","<Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>","<Label muted>Query index</Label>","<Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>","indexName","<Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>","<Stack gap={4} flex={1}>\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>\n\n <Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>\n </Stack>","{selectedIndex}: {selectedIndex: IndexState}","<Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>","<Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>","status","<Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>","<Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>","startDocumentCount","selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount","<Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>","<Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>","failedDocumentCount","<Stack gap={4} flex={1}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>\n </Stack>","_c","{opacity: loading ? 0.5 : 1}","loading ? 0.5 : 1","<Box flex={1}>\n <Label muted>Index name</Label>\n </Box>","<Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>","<Box flex={1}>\n <Label muted>Status</Label>\n </Box>","<Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>","<Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>","indexes.length","<Card tone=\"default\" style={{opacity: loading ? 0.5 : 1}}>\n <Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>\n </Card>","() => onIndexSelected(index)","useCallback(() => onIndexSelected(index), [onIndexSelected, index])","<Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>","indexName","<Box flex={1}>{index.dataset}</Box>","dataset","<Box flex={1}>{index.status}</Box>","status","<Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>","index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'","<Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>","<Button\n tone={selectedIndex?.indexName === index.indexName ? 'primary' : 'default'}\n mode={selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'}\n onClick={onSelect}\n key={index.indexName}\n padding={3}\n >\n <Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>\n </Button>","selectedIndex?.indexName === index.indexName ? 'primary' : 'default'","selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'","_c","featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null","featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null","featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null","featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null","<Card flex={1}>\n <Flex justify=\"center\" flex={1}>\n {featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n {featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null}\n\n {featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null}\n\n {featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null}\n </Flex>\n </Card>","() => setCreateIndexOpen(false)","useCallback(() => setCreateIndexOpen(false), [])","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSelectedIndex(indexes.find((i) => i.indexName === selectedIndex?.indexName))\n }","indexName","[indexes, selectedIndex]","() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }","useCallback(() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [client])","(index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }","e","useCallback(\n (index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [client, updateIndexes],\n )","(index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n }","index","useCallback(\n (index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n },\n [setSelectedIndex, updateIndexes],\n )","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n updateIndexes()\n }","[updateIndexes]","() => setCreateIndexOpen(true)","useCallback(() => setCreateIndexOpen(true), [])","(index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n }","useCallback(\n (index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n },\n [updateIndexes],\n )","{height: 30}","<Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>","<Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>","loading ? <Spinner /> : UndoIcon","<Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>","error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null","<IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />","selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )","<EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />","<Stack gap={4}>\n <Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>\n {error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null}\n <IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />\n {selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )}\n <EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />\n </Stack>","_c","useMemo(() => {\n if (embeddingsIndexConfig === true || !embeddingsIndexConfig) {\n if (!defaultConfig?.indexName) {\n throw new Error(\n 'Default embeddingsIndex config is missing. When options.embeddingsIndex: true, embeddingsIndexReferenceInput plugin config is required.',\n )\n }\n return defaultConfig\n }\n\n const finalConfig = {\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }\n\n if (!finalConfig?.indexName) {\n throw new Error(\n 'indexName is missing. Either set it in options.embeddingsIndex or configure defaults using plugin config.',\n )\n }\n\n return finalConfig\n }, [defaultConfig, embeddingsIndexConfig])","{\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }","() => setSemantic((current) => !current)","(current) => !current","useCallback(() => setSemantic((current) => !current), [])","{width: '100%'}","semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null","semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null","semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null","{maxHeight: 36, overflow: 'hidden'}","semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )","<Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>","<Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />","semantic ? EarthGlobeIcon : LinkIcon","semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'","<Flex gap={2} flex={1} style={{width: '100%'}}>\n {semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null}\n\n {semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null}\n\n {semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n <Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>\n <Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />\n </Flex>","() => {\n docRef.current = currentDocument\n }","[currentDocument]","() => {\n // if this component is rendered, and there is a value, replace was selected\n if (value?.['_ref']) {\n autocompleteRef.current?.focus()\n }\n // intentional empty deps — focus once on mount when replacing an existing reference\n // oxlint-disable-next-line react/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps\n }","'_ref'","[]","() => onPathFocus(['_ref'])","useCallback(() => onPathFocus(['_ref']), [onPathFocus])","() => onPathFocus([])","useCallback(() => onPathFocus([]), [onPathFocus])","(result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n }","name","useCallback(\n (result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n },\n [onChange, onPathFocus, schemaType.name],\n )","(r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n }","useCallback(\n (r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n },\n [docRef],\n )","() => JSON.stringify(docRef.current)","useCallback(() => JSON.stringify(docRef.current), [docRef])","(schemaType as ReferenceSchemaType).to.map((refType) => refType.name)","to","schemaType as ReferenceSchemaType","(refType) => refType.name","useMemo(\n () => (schemaType as ReferenceSchemaType).to.map((refType) => refType.name),\n [schemaType],\n )","<SemanticSearchAutocomplete\n ref={autocompleteRef}\n typeFilter={typeFilter}\n indexConfig={indexConfig}\n onSelect={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n getEmptySearchValue={getEmptySearchValue}\n filterResult={filterResult}\n readOnly={readOnly}\n />","_c","\"_ref\""],"sources":["../src/api/embeddingsApi.ts","../src/api/embeddingsApiHooks.ts","../src/api/isEnabled.tsx","../src/utils/types.ts","../src/embeddingsIndexDashboard/hooks.ts","../src/embeddingsIndexDashboard/IndexFormInput.tsx","../src/embeddingsIndexDashboard/IndexEditor.tsx","../src/preview/DocumentPreview.tsx","../src/referenceInput/SemanticSearchAutocomplete.tsx","../src/embeddingsIndexDashboard/QueryIndex.tsx","../src/embeddingsIndexDashboard/IndexInfo.tsx","../src/embeddingsIndexDashboard/IndexList.tsx","../src/embeddingsIndexDashboard/EmbeddingsIndexTool.tsx","../src/embeddingsIndexDashboard/dashboardPlugin.ts","../src/utils/id.ts","../src/referenceInput/SemanticSearchReferenceInput.tsx","../src/referenceInput/referencePlugin.tsx"],"sourcesContent":["import {type SanityClient} from 'sanity'\n\nexport interface NamedIndex {\n indexName: string\n dataset: string\n project: string\n projection: string\n filter: string\n}\n\nexport interface IndexState extends NamedIndex {\n status: string\n startDocumentCount: number\n remainingDocumentCount: number\n failedDocumentCount: number\n}\n\nexport interface QueryResult {\n score: number\n value: {\n documentId: string\n type: string\n }\n}\n\nexport interface QueryConfig {\n query: string\n indexName: string\n maxResults?: number\n filter?: {\n type?: string | string[]\n }\n}\n\nexport function queryIndex(queryConfig: QueryConfig, client: SanityClient): Promise<QueryResult[]> {\n const {query, indexName, maxResults, filter} = queryConfig\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n const queryString = query?.trim()\n\n return client.request<QueryResult[]>({\n method: 'POST',\n url: `/embeddings-index/query/${dataset}/${indexName}?projectId=${projectId}`,\n body: {\n query: queryString,\n maxResults,\n filter,\n },\n })\n}\n\nexport function getIndexes(client: SanityClient): Promise<IndexState[]> {\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n return client.request<IndexState[]>({\n method: 'GET',\n url: `/embeddings-index/${dataset}?projectId=${projectId}`,\n })\n}\n\nexport function deleteIndex(indexName: string, client: SanityClient): Promise<IndexState> {\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n return client.request<IndexState>({\n method: 'DELETE',\n url: `/embeddings-index/${dataset}/${indexName}?projectId=${projectId}`,\n })\n}\n","import {useMemo} from 'react'\nimport {type SanityClient, useClient} from 'sanity'\n\nexport function useApiClient(): SanityClient {\n const client = useClient({apiVersion: 'vX'})\n return useMemo(() => {\n const customHost = localStorage.getItem('embeddings-index-host')\n if (customHost) {\n return client.withConfig({\n apiHost: customHost,\n // Required so the override host is used as-is (not `{projectId}.{apiHost}`).\n // There is no non-deprecated replacement for this client flag.\n // oxlint-disable-next-line no-deprecated -- custom embeddings-index-host must not be project-prefixed\n useProjectHostname: false,\n withCredentials: false,\n })\n }\n return client\n }, [client])\n}\n","import {Card, Text} from '@sanity/ui'\nimport {createContext, type PropsWithChildren, useContext, useEffect, useState} from 'react'\nimport {useProjectId} from 'sanity'\n\nimport {useApiClient} from './embeddingsApiHooks'\n\nexport type FeatureStatus = 'enabled' | 'disabled' | 'loading' | 'error'\nconst FeatureEnabledContext = createContext<FeatureStatus>('loading')\n\nexport function useIsFeatureEnabled() {\n const client = useApiClient()\n const [status, setStatus] = useState<FeatureStatus>('loading')\n\n useEffect(() => {\n client\n .request<{enabled: boolean}>({\n method: 'GET',\n url: `/embeddings-index/status`,\n })\n .then((response) => {\n setStatus(response.enabled ? 'enabled' : 'disabled')\n })\n .catch((err) => {\n console.error(err)\n setStatus('error')\n })\n }, [client])\n\n return status\n}\n\nexport function FeatureEnabledProvider(props: PropsWithChildren) {\n const status = useIsFeatureEnabled()\n return (\n <FeatureEnabledContext.Provider value={status}>{props.children}</FeatureEnabledContext.Provider>\n )\n}\n\nexport function useIsFeatureEnabledContext(): FeatureStatus {\n return useContext(FeatureEnabledContext)\n}\n\nexport function FeatureDisabledNotice(props: {urlSuffix?: string}) {\n const projectId = useProjectId()\n\n return (\n <Card tone=\"primary\" border padding={4}>\n <Text size={1}>\n 💎 Unlock semantic search with the Embeddings Index API — available on Team, Business, and\n Enterprise plans.{' '}\n <a href={`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`}>\n Upgrade now →\n </a>\n </Text>\n </Card>\n )\n}\n\nexport function FeatureError() {\n return (\n <Card padding={4} border tone=\"critical\">\n An error occurred. See console for details.\n </Card>\n )\n}\n","import type {SchemaType} from 'sanity'\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","import {useMemo} from 'react'\nimport type {ObjectSchemaType, Schema} from 'sanity'\n\nimport {isType} from '../utils/types'\n\nconst defaultProjection = '{...}'\n\nexport function useDefaultIndex(schema: Schema, dataset: string) {\n const defaultFilter = useMemo(\n () =>\n `_type in [${schema\n .getTypeNames()\n .map((n) => schema.get(n))\n .filter((schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document')),\n )\n .filter(\n (documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document',\n )\n .map((documentType) => `\"${documentType.name}\"`)\n .join(',\\n')}]`,\n [schema],\n )\n\n return useMemo(\n () => ({\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }),\n [defaultFilter, dataset],\n )\n}\n","import {Box, Label, Stack, Text, TextArea, TextInput} from '@sanity/ui'\nimport {type Dispatch, type ChangeEvent, type SetStateAction, useCallback, useId} from 'react'\n\nimport {type NamedIndex} from '../api/embeddingsApi'\n\nexport interface IndexFormInputProps {\n index: Partial<NamedIndex>\n prop: keyof NamedIndex\n label: string\n description?: string\n onChange: Dispatch<SetStateAction<Partial<NamedIndex>>>\n readOnly: boolean\n placeholder?: string\n type?: 'text' | 'textarea'\n}\n\nexport function IndexFormInput(props: IndexFormInputProps) {\n const {label, description, index, prop, onChange, readOnly, placeholder, type} = props\n const handleChange = useCallback(\n (propValue: string) => onChange((current) => ({...current, [prop]: propValue})),\n [onChange, prop],\n )\n return (\n <FormInput\n label={label}\n description={description}\n onChange={handleChange}\n value={index[prop] ?? ''}\n readOnly={readOnly}\n placeholder={placeholder}\n type={type}\n />\n )\n}\n\ninterface FormInputProps {\n label: string\n description?: string\n onChange: (value: string) => void\n value: string\n readOnly: boolean\n placeholder?: string\n type?: 'text' | 'textarea'\n}\n\nfunction FormInput(props: FormInputProps) {\n const {label, description, onChange, value, readOnly, placeholder, type = 'text'} = props\n const id = useId()\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value),\n [onChange],\n )\n return (\n <Stack gap={3}>\n <Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>\n {description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )}\n {type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )}\n </Stack>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Box, Button, Card, Dialog, Spinner, Stack, Text} from '@sanity/ui'\nimport {type SubmitEvent, useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {useSchema} from 'sanity'\n\nimport {type IndexState, type NamedIndex} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {useDefaultIndex} from './hooks'\nimport {IndexFormInput} from './IndexFormInput'\n\nexport function EditIndexDialog(props: {\n open: boolean\n onClose: () => void\n onSubmit: (index: IndexState) => void\n}) {\n const {open, onClose, onSubmit} = props\n const id = useId()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) {\n return\n }\n setTimeout(() => ref.current?.querySelector('input')?.focus())\n }, [ref, open])\n\n const handleSubmit = useCallback(\n (index: IndexState) => {\n onSubmit(index)\n onClose()\n },\n [onSubmit, onClose],\n )\n\n return open ? (\n <Dialog id={id} width={1} ref={ref} onClose={onClose} header=\"Create embeddings index\">\n <Stack padding={4} gap={5}>\n <IndexEditor readOnly={false} onSubmit={handleSubmit} />\n </Stack>\n </Dialog>\n ) : null\n}\n\nexport function IndexEditor(props: {\n index?: Partial<NamedIndex>\n readOnly: boolean\n onSubmit?: (index: IndexState) => void\n}) {\n const {readOnly, index: selectedIndex, onSubmit} = props\n const client = useApiClient()\n const schema = useSchema()\n const defaultIndex = useDefaultIndex(schema, client.config().dataset ?? '')\n const [errors, setErrors] = useState<string[] | undefined>()\n const [loading, setLoading] = useState<boolean>()\n const [index, setIndex] = useState<Partial<NamedIndex>>(() => ({\n ...defaultIndex,\n ...selectedIndex,\n }))\n\n // oxlint-disable-next-line react/set-state-in-effect\n useEffect(() => setIndex(selectedIndex ?? {...defaultIndex}), [selectedIndex, defaultIndex])\n\n const handleSubmit = useCallback(\n (e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [index, readOnly, onSubmit, client],\n )\n\n return (\n <form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>\n </form>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Button, type ButtonProps, Card} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport {\n DefaultPreview,\n getPreviewStateObservable,\n getPreviewValueWithFallback,\n SanityDefaultPreview,\n type SanityDocument,\n type SchemaType,\n useDocumentPreviewStore,\n useSchema,\n} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ninterface ResultPreviewProps {\n documentId: string\n schemaTypeName: string\n button?: boolean\n style?: CSSProperties\n}\n\nexport function DocumentPreview({\n documentId,\n style,\n schemaTypeName,\n ...buttonProps\n}: ResultPreviewProps & ButtonProps) {\n const schema = useSchema()\n const schemaType = schemaTypeName ? schema.get(schemaTypeName) : undefined\n\n if (!schemaTypeName) {\n return (\n <Card style={{minHeight: '36px'}}>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n title={'Loading...'}\n schemaType={schemaType}\n isPlaceholder\n />\n </Card>\n )\n }\n\n if (!schemaType) {\n return (\n <Card>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n media={<ErrorOutlineIcon />}\n title={\n <>\n Unknown type <code>{schemaTypeName ?? 'N/A'}</code> for {documentId}\n </>\n }\n />\n </Card>\n )\n }\n\n return (\n <DocumentPreviewInner\n documentId={documentId}\n schemaTypeName={schemaTypeName}\n schemaType={schemaType}\n style={style}\n {...buttonProps}\n />\n )\n}\n\nfunction DocumentPreviewInner({\n documentId,\n schemaType,\n style,\n button,\n}: ResultPreviewProps & {schemaType: SchemaType} & ButtonProps) {\n const documentPreviewStore = useDocumentPreviewStore()\n\n const previewStateObservable = useMemo(\n () => getPreviewStateObservable(documentPreviewStore, schemaType, documentId),\n [documentId, documentPreviewStore, schemaType],\n )\n\n const {\n snapshot,\n original,\n isLoading: previewIsLoading,\n } = useObservable(previewStateObservable, {\n snapshot: null,\n isLoading: true,\n original: null,\n })\n\n const sanityDocument = useMemo(() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }, [documentId, schemaType?.name])\n\n const {onClick: onIntentClick, href} = useIntentLink({\n intent: 'edit',\n params: {\n id: documentId,\n type: schemaType?.name,\n },\n })\n\n const preview = (\n <SanityDefaultPreview\n {...getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })}\n isPlaceholder={previewIsLoading ?? true}\n layout=\"default\"\n icon={schemaType?.icon}\n />\n )\n if (button) {\n return (\n <Button\n as={'a'}\n href={href}\n onClick={onIntentClick}\n mode=\"ghost\"\n style={{width: '100%', ...style}}\n >\n {preview}\n </Button>\n )\n }\n return <Box style={{width: '100%'}}>{preview}</Box>\n}\n","import {Box, Button, Flex, Text} from '@sanity/ui'\nimport {Autocomplete, type AutocompleteOpenButtonProps} from '@sanity/ui/autocomplete'\nimport {\n type FocusEventHandler,\n type Ref,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {typed} from 'sanity'\n\nimport {queryIndex, type QueryResult} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {DocumentPreview} from '../preview/DocumentPreview'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\n\nexport interface SemanticSearchAutocompleteProps {\n indexConfig: EmbeddingsIndexConfig\n getEmptySearchValue: () => string\n typeFilter?: string[]\n filterResult?: (hit: QueryResult) => boolean\n onSelect?: (value: QueryResult) => void\n onFocus?: FocusEventHandler<HTMLInputElement>\n onBlur?: FocusEventHandler<HTMLInputElement>\n readOnly?: boolean\n}\n\ninterface Option {\n result: QueryResult\n value: string\n}\n\nconst NO_RESULTS_VALUE = '' as const\n\ninterface NoResultOption {\n value: string\n}\n\nconst NO_OPTIONS: NoResultOption[] = []\nconst NO_FILTER = () => true\n\nexport function SemanticSearchAutocomplete(\n props: SemanticSearchAutocompleteProps & {ref?: Ref<HTMLInputElement>},\n) {\n const {\n indexConfig,\n filterResult,\n getEmptySearchValue,\n readOnly,\n onFocus,\n onBlur,\n onSelect,\n typeFilter,\n ref,\n } = props\n const id = useId()\n const [query, setQuery] = useState('')\n const queryRef = useRef(query)\n const debouncedQuery = useDebouncedValue(query, 300)\n const prevDebouncedQuery = useRef(debouncedQuery)\n\n const [searching, setSearching] = useState(false)\n const [options, setOptions] = useState<Option[] | NoResultOption[]>(NO_OPTIONS)\n\n const client = useApiClient()\n\n const runIndexQuery = useCallback(\n (queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n },\n [client, indexConfig, getEmptySearchValue, filterResult, typeFilter],\n )\n\n useEffect(() => {\n if (prevDebouncedQuery.current !== debouncedQuery) {\n runIndexQuery(debouncedQuery)\n }\n prevDebouncedQuery.current = debouncedQuery\n }, [debouncedQuery, runIndexQuery])\n\n const openButtonConfig: AutocompleteOpenButtonProps = useMemo(\n () => ({onClick: () => runIndexQuery(queryRef.current)}),\n [runIndexQuery, queryRef],\n )\n\n const handleQueryChange = useCallback(\n (newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n },\n [setQuery],\n )\n\n const handleChange = useCallback(\n (value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n },\n [onSelect, options],\n )\n\n return (\n <Autocomplete\n id={id}\n ref={ref}\n data-testid=\"semantic-autocomplete\"\n placeholder=\"Type to search...\"\n openButton={openButtonConfig}\n onFocus={onFocus}\n onChange={handleChange}\n loading={searching}\n onBlur={onBlur}\n readOnly={readOnly}\n filterOption={NO_FILTER}\n onQueryChange={handleQueryChange}\n options={options}\n renderOption={AutocompleteOption}\n />\n )\n}\n\nfunction AutocompleteOption(props: Option | NoResultOption) {\n if ('result' in props) {\n const value = props.result.value\n return (\n <Button mode=\"bleed\" padding={1} style={{width: '100%'}}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>\n <Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>\n </Flex>\n </Button>\n )\n }\n\n return (\n <Button mode=\"bleed\" padding={1} style={{width: '100%'}} disabled>\n <Flex gap={2} align=\"center\">\n No results.\n </Flex>\n </Button>\n )\n}\n\nfunction useDebouncedValue<T>(value: T, ms: number) {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value)\n }, ms)\n return () => clearTimeout(timeoutId)\n }, [value, ms])\n\n return debouncedValue\n}\n","import {useCallback, useMemo} from 'react'\nimport {useRouter} from 'sanity/router'\n\nimport {type QueryResult} from '../api/embeddingsApi'\nimport {SemanticSearchAutocomplete} from '../referenceInput/SemanticSearchAutocomplete'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\n\nexport function QueryIndex(props: {indexName: string}) {\n const {indexName} = props\n const getEmpty = useCallback(() => 'anything', [])\n const indexConfig: EmbeddingsIndexConfig = useMemo(\n () => ({indexName, maxResults: 8}),\n [indexName],\n )\n\n const {resolveIntentLink, navigateUrl} = useRouter()\n const onSelect = useCallback(\n (hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n },\n [resolveIntentLink, navigateUrl],\n )\n return (\n <SemanticSearchAutocomplete\n getEmptySearchValue={getEmpty}\n indexConfig={indexConfig}\n onSelect={onSelect}\n />\n )\n}\n","import {EllipsisVerticalIcon} from '@sanity/icons/EllipsisVertical'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Flex, Heading, Label, Stack, Text} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {useCallback} from 'react'\n\nimport {type IndexState} from '../api/embeddingsApi'\nimport {IndexEditor} from './IndexEditor'\nimport {QueryIndex} from './QueryIndex'\n\nexport interface IndexInfoProps {\n selectedIndex: IndexState\n onDeleteIndex: (index: IndexState) => void\n}\n\nexport function IndexInfo({selectedIndex, onDeleteIndex}: IndexInfoProps) {\n const handleDelete = useCallback(\n () => onDeleteIndex(selectedIndex),\n [selectedIndex, onDeleteIndex],\n )\n return (\n <Stack gap={4} flex={1}>\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>\n\n <Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>\n </Stack>\n )\n}\n\nfunction IndexStatus({selectedIndex}: {selectedIndex: IndexState}) {\n return (\n <Stack gap={4} flex={1}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>\n </Stack>\n )\n}\n","import {Box, Button, Card, Flex, Label, Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {type IndexState} from '../api/embeddingsApi'\n\nexport interface IndexListProps {\n loading: boolean\n selectedIndex?: IndexState\n indexes: IndexState[]\n onIndexSelected: (index: IndexState) => void\n}\n\nexport function IndexList(props: IndexListProps) {\n const {loading, selectedIndex, indexes, onIndexSelected} = props\n return (\n <Card tone=\"default\" style={{opacity: loading ? 0.5 : 1}}>\n <Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>\n </Card>\n )\n}\n\nfunction IndexRow(props: {\n selectedIndex?: IndexState\n index: IndexState\n onIndexSelected: (index: IndexState) => void\n}) {\n const {selectedIndex, index, onIndexSelected} = props\n const onSelect = useCallback(() => onIndexSelected(index), [onIndexSelected, index])\n return (\n <Button\n tone={selectedIndex?.indexName === index.indexName ? 'primary' : 'default'}\n mode={selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'}\n onClick={onSelect}\n key={index.indexName}\n padding={3}\n >\n <Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>\n </Button>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {UndoIcon} from '@sanity/icons/Undo'\nimport {Box, Button, Card, Flex, Heading, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useEffect, useState} from 'react'\n\nimport {deleteIndex, getIndexes, type IndexState, type NamedIndex} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {FeatureDisabledNotice, FeatureError, useIsFeatureEnabled} from '../api/isEnabled'\nimport {EditIndexDialog} from './IndexEditor'\nimport {IndexInfo} from './IndexInfo'\nimport {IndexList} from './IndexList'\n\nexport function EmbeddingsIndexTool() {\n const featureState = useIsFeatureEnabled()\n return (\n <Card flex={1}>\n <Flex justify=\"center\" flex={1}>\n {featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n {featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null}\n\n {featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null}\n\n {featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null}\n </Flex>\n </Card>\n )\n}\n\nconst NO_INDEXES: IndexState[] = []\n\nfunction Indexes() {\n const client = useApiClient()\n const [indexes, setIndexes] = useState<IndexState[]>(NO_INDEXES)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState(false)\n const [createIndexOpen, setCreateIndexOpen] = useState(false)\n const [selectedIndex, setSelectedIndex] = useState<IndexState | undefined>(undefined)\n\n const onCreateIndexClose = useCallback(() => setCreateIndexOpen(false), [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSelectedIndex(indexes.find((i) => i.indexName === selectedIndex?.indexName))\n }, [indexes, selectedIndex])\n\n const updateIndexes = useCallback(() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [client])\n\n const deleteNamedIndex = useCallback(\n (index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [client, updateIndexes],\n )\n\n const onSelectIndex = useCallback(\n (index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n },\n [setSelectedIndex, updateIndexes],\n )\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n updateIndexes()\n }, [updateIndexes])\n\n const openCreate = useCallback(() => setCreateIndexOpen(true), [])\n const onSubmit = useCallback(\n (index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n },\n [updateIndexes],\n )\n return (\n <Stack gap={4}>\n <Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>\n {error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null}\n <IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />\n {selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )}\n <EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />\n </Stack>\n )\n}\n","import {EarthGlobeIcon} from '@sanity/icons/EarthGlobe'\nimport {definePlugin, type Tool} from 'sanity'\n\nimport {EmbeddingsIndexTool} from './EmbeddingsIndexTool'\n\nconst embeddingsIndexTool: Tool = {\n name: 'embeddings-index',\n title: 'Embeddings',\n icon: EarthGlobeIcon,\n component: EmbeddingsIndexTool,\n}\n\nexport const embeddingsIndexDashboard = definePlugin({\n name: '@sanity/embeddings-index-dashboard',\n tools: [embeddingsIndexTool],\n})\n","export function publicId(id: string): string {\n return id.replace('drafts.', '')\n}\n","import {EarthGlobeIcon} from '@sanity/icons/EarthGlobe'\nimport {LinkIcon} from '@sanity/icons/Link'\nimport {Box, Button, Flex, Spinner} from '@sanity/ui'\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {\n type ObjectInputProps,\n type ReferenceBaseOptions,\n type ReferenceSchemaType,\n set,\n setIfMissing,\n unset,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {type QueryResult} from '../api/embeddingsApi'\nimport {FeatureDisabledNotice, FeatureError, useIsFeatureEnabledContext} from '../api/isEnabled'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\nimport {publicId} from '../utils/id'\nimport {SemanticSearchAutocomplete} from './SemanticSearchAutocomplete'\n\nfunction useEmeddingsConfig(\n embeddingsIndexConfig: ReferenceBaseOptions['embeddingsIndex'],\n defaultConfig: EmbeddingsIndexConfig | undefined,\n) {\n return useMemo(() => {\n if (embeddingsIndexConfig === true || !embeddingsIndexConfig) {\n if (!defaultConfig?.indexName) {\n throw new Error(\n 'Default embeddingsIndex config is missing. When options.embeddingsIndex: true, embeddingsIndexReferenceInput plugin config is required.',\n )\n }\n return defaultConfig\n }\n\n const finalConfig = {\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }\n\n if (!finalConfig?.indexName) {\n throw new Error(\n 'indexName is missing. Either set it in options.embeddingsIndex or configure defaults using plugin config.',\n )\n }\n\n return finalConfig\n }, [defaultConfig, embeddingsIndexConfig])\n}\n\nexport function SemanticSearchReferenceInput(\n props: ObjectInputProps & {defaultConfig?: EmbeddingsIndexConfig},\n) {\n const embeddingsIndexConfig = (props.schemaType as ReferenceSchemaType)?.options?.embeddingsIndex\n\n const config = useEmeddingsConfig(embeddingsIndexConfig, props.defaultConfig)\n\n const defaultEnabled = config.searchMode === 'embeddings'\n\n const featureState = useIsFeatureEnabledContext()\n\n const [semantic, setSemantic] = useState<boolean>(defaultEnabled)\n const toggleSemantic = useCallback(() => setSemantic((current) => !current), [])\n\n return (\n <Flex gap={2} flex={1} style={{width: '100%'}}>\n {semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null}\n\n {semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null}\n\n {semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n <Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>\n <Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />\n </Flex>\n )\n}\n\nfunction SemanticSearchInput(props: ObjectInputProps & {indexConfig: EmbeddingsIndexConfig}) {\n const {indexConfig, onPathFocus, onChange, readOnly, schemaType, value} = props\n\n const {value: currentDocument} = useDocumentPane()\n const docRef = useRef(currentDocument)\n const autocompleteRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n docRef.current = currentDocument\n }, [currentDocument])\n\n useEffect(() => {\n // if this component is rendered, and there is a value, replace was selected\n if (value?.['_ref']) {\n autocompleteRef.current?.focus()\n }\n // intentional empty deps — focus once on mount when replacing an existing reference\n // oxlint-disable-next-line react/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps\n }, [])\n\n const handleFocus = useCallback(() => onPathFocus(['_ref']), [onPathFocus])\n const handleBlur = useCallback(() => onPathFocus([]), [onPathFocus])\n\n const handleChange = useCallback(\n (result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n },\n [onChange, onPathFocus, schemaType.name],\n )\n\n const filterResult = useCallback(\n (r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n },\n [docRef],\n )\n\n const getEmptySearchValue = useCallback(() => JSON.stringify(docRef.current), [docRef])\n const typeFilter = useMemo(\n () => (schemaType as ReferenceSchemaType).to.map((refType) => refType.name),\n [schemaType],\n )\n\n return (\n <SemanticSearchAutocomplete\n ref={autocompleteRef}\n typeFilter={typeFilter}\n indexConfig={indexConfig}\n onSelect={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n getEmptySearchValue={getEmptySearchValue}\n filterResult={filterResult}\n readOnly={readOnly}\n />\n )\n}\n","import {\n definePlugin,\n isObjectInputProps,\n type ObjectInputProps,\n type ReferenceSchemaType,\n} from 'sanity'\n\nimport {FeatureEnabledProvider} from '../api/isEnabled'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\nimport {isType} from '../utils/types'\nimport {SemanticSearchReferenceInput} from './SemanticSearchReferenceInput'\n\nexport const embeddingsIndexReferenceInput = definePlugin<EmbeddingsIndexConfig | void>(\n (defaultConfig) => {\n const config = typeof defaultConfig === 'object' ? defaultConfig : undefined\n\n return {\n name: '@sanity/embeddings-index-reference-input',\n studio: {\n components: {\n layout: (props) => {\n return <FeatureEnabledProvider>{props.renderDefault(props)}</FeatureEnabledProvider>\n },\n },\n },\n form: {\n components: {\n input: (props) => {\n const embeddingsIndexConfig = (props.schemaType as ReferenceSchemaType)?.options\n ?.embeddingsIndex\n if (\n isObjectInputProps(props) &&\n isType(props.schemaType, 'reference') &&\n (embeddingsIndexConfig === true || embeddingsIndexConfig?.indexName)\n ) {\n return (\n <SemanticSearchReferenceInput\n {...(props as ObjectInputProps)}\n defaultConfig={config}\n />\n )\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{apiVersion: 'vX'}","useMemo(() => {\n const customHost = localStorage.getItem('embeddings-index-host')\n if (customHost) {\n return client.withConfig({\n apiHost: customHost,\n // Required so the override host is used as-is (not `{projectId}.{apiHost}`).\n // There is no non-deprecated replacement for this client flag.\n // oxlint-disable-next-line no-deprecated -- custom embeddings-index-host must not be project-prefixed\n useProjectHostname: false,\n withCredentials: false,\n })\n }\n return client\n }, [client])","_c","() => {\n client\n .request<{enabled: boolean}>({\n method: 'GET',\n url: `/embeddings-index/status`,\n })\n .then((response) => {\n setStatus(response.enabled ? 'enabled' : 'disabled')\n })\n .catch((err) => {\n console.error(err)\n setStatus('error')\n })\n }","[client]","<FeatureEnabledContext.Provider value={status}>{props.children}</FeatureEnabledContext.Provider>","children","FeatureEnabledContext.Provider","<Card tone=\"primary\" border padding={4}>\n <Text size={1}>\n 💎 Unlock semantic search with the Embeddings Index API — available on Team, Business, and\n Enterprise plans.{' '}\n <a href={`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`}>\n Upgrade now →\n </a>\n </Text>\n </Card>","`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`","<Card padding={4} border tone=\"critical\">\n An error occurred. See console for details.\n </Card>","_c","schema\n .getTypeNames()\n .map((n) => schema.get(n))\n .filter((schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document')),\n )\n .filter(\n (documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document',\n )\n .map((documentType) => `\"${documentType.name}\"`)\n .join(',\\n')","(schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document'))","(documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document'","(documentType) => `\"${documentType.name}\"`","{\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }","useMemo(\n () => ({\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }),\n [defaultFilter, dataset],\n )","documentType","_c","_temp","_temp2","(propValue: string) => onChange((current) => ({...current, [prop]: propValue}))","useCallback(\n (propValue: string) => onChange((current) => ({...current, [prop]: propValue})),\n [onChange, prop],\n )","<FormInput\n label={label}\n description={description}\n onChange={handleChange}\n value={index[prop] ?? ''}\n readOnly={readOnly}\n placeholder={placeholder}\n type={type}\n />","index[prop] ?? ''","type = 'text'","(e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value)","useCallback(\n (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value),\n [onChange],\n )","<Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>","description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )","type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )","<Stack gap={3}>\n <Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>\n {description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )}\n {type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )}\n </Stack>","_c","() => {\n if (!open) {\n return\n }\n setTimeout(() => ref.current?.querySelector('input')?.focus())\n }","[ref, open]","(index: IndexState) => {\n onSubmit(index)\n onClose()\n }","useCallback(\n (index: IndexState) => {\n onSubmit(index)\n onClose()\n },\n [onSubmit, onClose],\n )","open ? (\n <Dialog id={id} width={1} ref={ref} onClose={onClose} header=\"Create embeddings index\">\n <Stack padding={4} gap={5}>\n <IndexEditor readOnly={false} onSubmit={handleSubmit} />\n </Stack>\n </Dialog>\n ) : null","client.config().dataset ?? ''","() => ({\n ...defaultIndex,\n ...selectedIndex,\n })","() => setIndex(selectedIndex ?? {...defaultIndex})","[selectedIndex, defaultIndex]","(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n }","index.indexName","useCallback(\n (e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [index, readOnly, onSubmit, client],\n )","errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null","(error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n )","errors?.length","<IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />","<IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />","<IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />","filter","<IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />","projection","onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )","<Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>","<form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>\n </form>","_c","_temp","{\n documentId,\n style,\n schemaTypeName,\n ...buttonProps\n}: ResultPreviewProps & ButtonProps","schemaTypeName ? schema.get(schemaTypeName) : undefined","{minHeight: '36px'}","<Card style={{minHeight: '36px'}}>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n title={'Loading...'}\n schemaType={schemaType}\n isPlaceholder\n />\n </Card>","<ErrorOutlineIcon />","<code>{schemaTypeName ?? 'N/A'}</code>","schemaTypeName ?? 'N/A'","<Card>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n media={<ErrorOutlineIcon />}\n title={\n <>\n Unknown type <code>{schemaTypeName ?? 'N/A'}</code> for {documentId}\n </>\n }\n />\n </Card>","<DocumentPreviewInner\n documentId={documentId}\n schemaTypeName={schemaTypeName}\n schemaType={schemaType}\n style={style}\n {...buttonProps}\n />","{\n documentId,\n schemaType,\n style,\n button,\n}: ResultPreviewProps & {schemaType: SchemaType} & ButtonProps","getPreviewStateObservable(documentPreviewStore, schemaType, documentId)","useMemo(\n () => getPreviewStateObservable(documentPreviewStore, schemaType, documentId),\n [documentId, documentPreviewStore, schemaType],\n )","() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }","name","useMemo(() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }, [documentId, schemaType?.name])","{\n intent: 'edit',\n params: {\n id: documentId,\n type: schemaType?.name,\n },\n }","schemaType?.name","getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })","<SanityDefaultPreview\n {...getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })}\n isPlaceholder={previewIsLoading ?? true}\n layout=\"default\"\n icon={schemaType?.icon}\n />","previewIsLoading ?? true","schemaType?.icon","{width: '100%', ...style}","<Button\n as={'a'}\n href={href}\n onClick={onIntentClick}\n mode=\"ghost\"\n style={{width: '100%', ...style}}\n >\n {preview}\n </Button>","{width: '100%'}","<Box style={{width: '100%'}}>{preview}</Box>","_c","_Fragment","previewStateObservable","(queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n }","indexName","maxResults","(r) => typed<Option>({result: r, value: r.value.documentId})","useCallback(\n (queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n },\n [client, indexConfig, getEmptySearchValue, filterResult, typeFilter],\n )","() => {\n if (prevDebouncedQuery.current !== debouncedQuery) {\n runIndexQuery(debouncedQuery)\n }\n prevDebouncedQuery.current = debouncedQuery\n }","[debouncedQuery, runIndexQuery]","{onClick: () => runIndexQuery(queryRef.current)}","useMemo(\n () => ({onClick: () => runIndexQuery(queryRef.current)}),\n [runIndexQuery, queryRef],\n )","(newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n }","useCallback(\n (newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n },\n [setQuery],\n )","(value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n }","(r): r is Option => 'result' in r","r","useCallback(\n (value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n },\n [onSelect, options],\n )","<Autocomplete\n id={id}\n ref={ref}\n data-testid=\"semantic-autocomplete\"\n placeholder=\"Type to search...\"\n openButton={openButtonConfig}\n onFocus={onFocus}\n onChange={handleChange}\n loading={searching}\n onBlur={onBlur}\n readOnly={readOnly}\n filterOption={NO_FILTER}\n onQueryChange={handleQueryChange}\n options={options}\n renderOption={AutocompleteOption}\n />","{width: '100%'}","<Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>","documentId","type","<Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>","Math.floor(props.result.score * 100)","<Button mode=\"bleed\" padding={1} style={{width: '100%'}}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>\n <Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>\n </Flex>\n </Button>","<Button mode=\"bleed\" padding={1} style={{width: '100%'}} disabled>\n <Flex gap={2} align=\"center\">\n No results.\n </Flex>\n </Button>","() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value)\n }, ms)\n return () => clearTimeout(timeoutId)\n }","[value, ms]","_c","_temp","_temp2","useCallback(() => 'anything', [])","{indexName, maxResults: 8}","useMemo(\n () => ({indexName, maxResults: 8}),\n [indexName],\n )","(hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n }","useCallback(\n (hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n },\n [resolveIntentLink, navigateUrl],\n )","<SemanticSearchAutocomplete\n getEmptySearchValue={getEmpty}\n indexConfig={indexConfig}\n onSelect={onSelect}\n />","_c","_temp","{selectedIndex, onDeleteIndex}: IndexInfoProps","() => onDeleteIndex(selectedIndex)","useCallback(\n () => onDeleteIndex(selectedIndex),\n [selectedIndex, onDeleteIndex],\n )","<Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>","selectedIndex?.indexName ?? 'Untitled'","<Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />","<Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>","{placement: 'right'}","<Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>","`button-${selectedIndex.indexName}`","<Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>","{maxWidth: 600}","<Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>","<Label muted>Query index</Label>","<Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>","indexName","<Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>","<Stack gap={4} flex={1}>\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>\n\n <Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>\n </Stack>","{selectedIndex}: {selectedIndex: IndexState}","<Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>","<Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>","status","<Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>","<Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>","startDocumentCount","selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount","<Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>","<Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>","failedDocumentCount","<Stack gap={4} flex={1}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>\n </Stack>","_c","{opacity: loading ? 0.5 : 1}","loading ? 0.5 : 1","<Box flex={1}>\n <Label muted>Index name</Label>\n </Box>","<Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>","<Box flex={1}>\n <Label muted>Status</Label>\n </Box>","<Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>","<Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>","indexes.length","<Card tone=\"default\" style={{opacity: loading ? 0.5 : 1}}>\n <Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>\n </Card>","() => onIndexSelected(index)","useCallback(() => onIndexSelected(index), [onIndexSelected, index])","<Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>","indexName","<Box flex={1}>{index.dataset}</Box>","dataset","<Box flex={1}>{index.status}</Box>","status","<Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>","index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'","<Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>","<Button\n tone={selectedIndex?.indexName === index.indexName ? 'primary' : 'default'}\n mode={selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'}\n onClick={onSelect}\n key={index.indexName}\n padding={3}\n >\n <Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>\n </Button>","selectedIndex?.indexName === index.indexName ? 'primary' : 'default'","selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'","_c","featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null","featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null","featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null","featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null","<Card flex={1}>\n <Flex justify=\"center\" flex={1}>\n {featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n {featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null}\n\n {featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null}\n\n {featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null}\n </Flex>\n </Card>","() => setCreateIndexOpen(false)","useCallback(() => setCreateIndexOpen(false), [])","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSelectedIndex(indexes.find((i) => i.indexName === selectedIndex?.indexName))\n }","indexName","[indexes, selectedIndex]","() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }","useCallback(() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [client])","(index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }","e","useCallback(\n (index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [client, updateIndexes],\n )","(index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n }","index","useCallback(\n (index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n },\n [setSelectedIndex, updateIndexes],\n )","() => {\n // oxlint-disable-next-line react/set-state-in-effect\n updateIndexes()\n }","[updateIndexes]","() => setCreateIndexOpen(true)","useCallback(() => setCreateIndexOpen(true), [])","(index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n }","useCallback(\n (index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n },\n [updateIndexes],\n )","{height: 30}","<Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>","<Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>","loading ? <Spinner /> : UndoIcon","<Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>","error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null","<IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />","selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )","<EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />","<Stack gap={4}>\n <Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>\n {error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null}\n <IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />\n {selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )}\n <EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />\n </Stack>","_c","useMemo(() => {\n if (embeddingsIndexConfig === true || !embeddingsIndexConfig) {\n if (!defaultConfig?.indexName) {\n throw new Error(\n 'Default embeddingsIndex config is missing. When options.embeddingsIndex: true, embeddingsIndexReferenceInput plugin config is required.',\n )\n }\n return defaultConfig\n }\n\n const finalConfig = {\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }\n\n if (!finalConfig?.indexName) {\n throw new Error(\n 'indexName is missing. Either set it in options.embeddingsIndex or configure defaults using plugin config.',\n )\n }\n\n return finalConfig\n }, [defaultConfig, embeddingsIndexConfig])","{\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }","() => setSemantic((current) => !current)","(current) => !current","useCallback(() => setSemantic((current) => !current), [])","{width: '100%'}","semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null","semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null","semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null","{maxHeight: 36, overflow: 'hidden'}","semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )","<Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>","<Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />","semantic ? EarthGlobeIcon : LinkIcon","semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'","<Flex gap={2} flex={1} style={{width: '100%'}}>\n {semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null}\n\n {semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null}\n\n {semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n <Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>\n <Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />\n </Flex>","() => {\n docRef.current = currentDocument\n }","[currentDocument]","() => {\n // if this component is rendered, and there is a value, replace was selected\n if (value?.['_ref']) {\n autocompleteRef.current?.focus()\n }\n // intentional empty deps — focus once on mount when replacing an existing reference\n // oxlint-disable-next-line react/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps\n }","'_ref'","[]","() => onPathFocus(['_ref'])","useCallback(() => onPathFocus(['_ref']), [onPathFocus])","() => onPathFocus([])","useCallback(() => onPathFocus([]), [onPathFocus])","(result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n }","name","useCallback(\n (result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n },\n [onChange, onPathFocus, schemaType.name],\n )","(r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n }","useCallback(\n (r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n },\n [docRef],\n )","() => JSON.stringify(docRef.current)","useCallback(() => JSON.stringify(docRef.current), [docRef])","(schemaType as ReferenceSchemaType).to.map((refType) => refType.name)","to","schemaType as ReferenceSchemaType","(refType) => refType.name","useMemo(\n () => (schemaType as ReferenceSchemaType).to.map((refType) => refType.name),\n [schemaType],\n )","<SemanticSearchAutocomplete\n ref={autocompleteRef}\n typeFilter={typeFilter}\n indexConfig={indexConfig}\n onSelect={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n getEmptySearchValue={getEmptySearchValue}\n filterResult={filterResult}\n readOnly={readOnly}\n />","_c","\"_ref\""],"sources":["../src/api/embeddingsApi.ts","../src/api/embeddingsApiHooks.ts","../src/api/isEnabled.tsx","../src/utils/types.ts","../src/embeddingsIndexDashboard/hooks.ts","../src/embeddingsIndexDashboard/IndexFormInput.tsx","../src/embeddingsIndexDashboard/IndexEditor.tsx","../src/preview/DocumentPreview.tsx","../src/referenceInput/SemanticSearchAutocomplete.tsx","../src/embeddingsIndexDashboard/QueryIndex.tsx","../src/embeddingsIndexDashboard/IndexInfo.tsx","../src/embeddingsIndexDashboard/IndexList.tsx","../src/embeddingsIndexDashboard/EmbeddingsIndexTool.tsx","../src/embeddingsIndexDashboard/dashboardPlugin.ts","../src/utils/id.ts","../src/referenceInput/SemanticSearchReferenceInput.tsx","../src/referenceInput/referencePlugin.tsx"],"sourcesContent":["import {type SanityClient} from 'sanity'\n\nexport interface NamedIndex {\n indexName: string\n dataset: string\n project: string\n projection: string\n filter: string\n}\n\nexport interface IndexState extends NamedIndex {\n status: string\n startDocumentCount: number\n remainingDocumentCount: number\n failedDocumentCount: number\n}\n\nexport interface QueryResult {\n score: number\n value: {\n documentId: string\n type: string\n }\n}\n\nexport interface QueryConfig {\n query: string\n indexName: string\n maxResults?: number\n filter?: {\n type?: string | string[]\n }\n}\n\nexport function queryIndex(queryConfig: QueryConfig, client: SanityClient): Promise<QueryResult[]> {\n const {query, indexName, maxResults, filter} = queryConfig\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n const queryString = query?.trim()\n\n return client.request<QueryResult[]>({\n method: 'POST',\n url: `/embeddings-index/query/${dataset}/${indexName}?projectId=${projectId}`,\n body: {\n query: queryString,\n maxResults,\n filter,\n },\n })\n}\n\nexport function getIndexes(client: SanityClient): Promise<IndexState[]> {\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n return client.request<IndexState[]>({\n method: 'GET',\n url: `/embeddings-index/${dataset}?projectId=${projectId}`,\n })\n}\n\nexport function deleteIndex(indexName: string, client: SanityClient): Promise<IndexState> {\n const projectId = client.config().projectId\n const dataset = client.config().dataset\n return client.request<IndexState>({\n method: 'DELETE',\n url: `/embeddings-index/${dataset}/${indexName}?projectId=${projectId}`,\n })\n}\n","import {useMemo} from 'react'\nimport {type SanityClient, useClient} from 'sanity'\n\nexport function useApiClient(): SanityClient {\n const client = useClient({apiVersion: 'vX'})\n return useMemo(() => {\n const customHost = localStorage.getItem('embeddings-index-host')\n if (customHost) {\n return client.withConfig({\n apiHost: customHost,\n // Required so the override host is used as-is (not `{projectId}.{apiHost}`).\n // There is no non-deprecated replacement for this client flag.\n // oxlint-disable-next-line no-deprecated -- custom embeddings-index-host must not be project-prefixed\n useProjectHostname: false,\n withCredentials: false,\n })\n }\n return client\n }, [client])\n}\n","import {Card, Text} from '@sanity/ui'\nimport {createContext, type PropsWithChildren, useContext, useEffect, useState} from 'react'\nimport {useProjectId} from 'sanity'\n\nimport {useApiClient} from './embeddingsApiHooks'\n\nexport type FeatureStatus = 'enabled' | 'disabled' | 'loading' | 'error'\nconst FeatureEnabledContext = createContext<FeatureStatus>('loading')\n\nexport function useIsFeatureEnabled() {\n const client = useApiClient()\n const [status, setStatus] = useState<FeatureStatus>('loading')\n\n useEffect(() => {\n client\n .request<{enabled: boolean}>({\n method: 'GET',\n url: `/embeddings-index/status`,\n })\n .then((response) => {\n setStatus(response.enabled ? 'enabled' : 'disabled')\n })\n .catch((err) => {\n console.error(err)\n setStatus('error')\n })\n }, [client])\n\n return status\n}\n\nexport function FeatureEnabledProvider(props: PropsWithChildren) {\n const status = useIsFeatureEnabled()\n return (\n <FeatureEnabledContext.Provider value={status}>{props.children}</FeatureEnabledContext.Provider>\n )\n}\n\nexport function useIsFeatureEnabledContext(): FeatureStatus {\n return useContext(FeatureEnabledContext)\n}\n\nexport function FeatureDisabledNotice(props: {urlSuffix?: string}) {\n const projectId = useProjectId()\n\n return (\n <Card tone=\"primary\" border padding={4}>\n <Text size={1}>\n 💎 Unlock semantic search with the Embeddings Index API — available on Team, Business, and\n Enterprise plans.{' '}\n <a href={`https://www.sanity.io/manage/project/${projectId}/plan${props.urlSuffix ?? ''}`}>\n Upgrade now →\n </a>\n </Text>\n </Card>\n )\n}\n\nexport function FeatureError() {\n return (\n <Card padding={4} border tone=\"critical\">\n An error occurred. See console for details.\n </Card>\n )\n}\n","import type {SchemaType} from 'sanity'\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","import {useMemo} from 'react'\nimport type {ObjectSchemaType, Schema} from 'sanity'\n\nimport {isType} from '../utils/types'\n\nconst defaultProjection = '{...}'\n\nexport function useDefaultIndex(schema: Schema, dataset: string) {\n const defaultFilter = useMemo(\n () =>\n `_type in [${schema\n .getTypeNames()\n .map((n) => schema.get(n))\n .filter((schemaType): schemaType is ObjectSchemaType =>\n Boolean(schemaType && isType(schemaType, 'document')),\n )\n .filter(\n (documentType) =>\n !documentType.name.startsWith('sanity.') &&\n !documentType.name.startsWith('assist.') &&\n documentType.name !== 'document',\n )\n .map((documentType) => `\"${documentType.name}\"`)\n .join(',\\n')}]`,\n [schema],\n )\n\n return useMemo(\n () => ({\n dataset,\n projection: defaultProjection,\n filter: defaultFilter,\n }),\n [defaultFilter, dataset],\n )\n}\n","import {Box, Label, Stack, Text, TextArea, TextInput} from '@sanity/ui'\nimport {type Dispatch, type ChangeEvent, type SetStateAction, useCallback, useId} from 'react'\n\nimport {type NamedIndex} from '../api/embeddingsApi'\n\nexport interface IndexFormInputProps {\n index: Partial<NamedIndex>\n prop: keyof NamedIndex\n label: string\n description?: string\n onChange: Dispatch<SetStateAction<Partial<NamedIndex>>>\n readOnly: boolean\n placeholder?: string\n type?: 'text' | 'textarea'\n}\n\nexport function IndexFormInput(props: IndexFormInputProps) {\n const {label, description, index, prop, onChange, readOnly, placeholder, type} = props\n const handleChange = useCallback(\n (propValue: string) => onChange((current) => ({...current, [prop]: propValue})),\n [onChange, prop],\n )\n return (\n <FormInput\n label={label}\n description={description}\n onChange={handleChange}\n value={index[prop] ?? ''}\n readOnly={readOnly}\n placeholder={placeholder}\n type={type}\n />\n )\n}\n\ninterface FormInputProps {\n label: string\n description?: string\n onChange: (value: string) => void\n value: string\n readOnly: boolean\n placeholder?: string\n type?: 'text' | 'textarea'\n}\n\nfunction FormInput(props: FormInputProps) {\n const {label, description, onChange, value, readOnly, placeholder, type = 'text'} = props\n const id = useId()\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => onChange(e.currentTarget.value),\n [onChange],\n )\n return (\n <Stack gap={3}>\n <Label as=\"label\" muted htmlFor={id}>\n {label}\n </Label>\n {description && (\n <Box>\n <Text size={1} muted>\n {description}\n </Text>\n </Box>\n )}\n {type === 'text' ? (\n <TextInput\n id={id}\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n />\n ) : (\n <TextArea\n id={id}\n value={value}\n rows={3}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n style={{resize: 'vertical'}}\n />\n )}\n </Stack>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Box, Button, Card, Dialog, Spinner, Stack, Text} from '@sanity/ui'\nimport {type SubmitEvent, useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {useSchema} from 'sanity'\n\nimport {type IndexState, type NamedIndex} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {useDefaultIndex} from './hooks'\nimport {IndexFormInput} from './IndexFormInput'\n\nexport function EditIndexDialog(props: {\n open: boolean\n onClose: () => void\n onSubmit: (index: IndexState) => void\n}) {\n const {open, onClose, onSubmit} = props\n const id = useId()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) {\n return\n }\n setTimeout(() => ref.current?.querySelector('input')?.focus())\n }, [ref, open])\n\n const handleSubmit = useCallback(\n (index: IndexState) => {\n onSubmit(index)\n onClose()\n },\n [onSubmit, onClose],\n )\n\n return open ? (\n <Dialog id={id} width={1} ref={ref} onClose={onClose} header=\"Create embeddings index\">\n <Stack padding={4} gap={5}>\n <IndexEditor readOnly={false} onSubmit={handleSubmit} />\n </Stack>\n </Dialog>\n ) : null\n}\n\nexport function IndexEditor(props: {\n index?: Partial<NamedIndex>\n readOnly: boolean\n onSubmit?: (index: IndexState) => void\n}) {\n const {readOnly, index: selectedIndex, onSubmit} = props\n const client = useApiClient()\n const schema = useSchema()\n const defaultIndex = useDefaultIndex(schema, client.config().dataset ?? '')\n const [errors, setErrors] = useState<string[] | undefined>()\n const [loading, setLoading] = useState<boolean>()\n const [index, setIndex] = useState<Partial<NamedIndex>>(() => ({\n ...defaultIndex,\n ...selectedIndex,\n }))\n\n // oxlint-disable-next-line react/set-state-in-effect\n useEffect(() => setIndex(selectedIndex ?? {...defaultIndex}), [selectedIndex, defaultIndex])\n\n const handleSubmit = useCallback(\n (e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (readOnly) {\n return\n }\n\n const validationErrors: string[] = []\n\n if (!index.indexName) {\n validationErrors.push('Index name is required')\n } else if (!index.indexName.match(/^[a-zA-Z0-9-_]+$/g)) {\n validationErrors.push('Index name can only contain the letters a-z, numbers - and _')\n }\n\n if (!index.dataset) {\n validationErrors.push('Dataset is required')\n }\n\n if (!index.filter) {\n validationErrors.push('Filter is required')\n }\n\n if (!index.projection) {\n validationErrors.push('Projection is required')\n }\n\n if (validationErrors.length) {\n setErrors(validationErrors)\n return\n }\n\n const {projectId} = client.config()\n setLoading(true)\n client\n .request({\n method: 'POST',\n url: `/embeddings-index/${index.dataset}?projectId=${projectId}`,\n body: {\n indexName: index.indexName,\n projection: index.projection,\n filter: index.filter,\n },\n })\n .then((response: {index: IndexState}) => {\n if (onSubmit) {\n onSubmit(response.index)\n }\n })\n .catch((err: any) => {\n console.error(err)\n setErrors([err.message])\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [index, readOnly, onSubmit, client],\n )\n\n return (\n <form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {errors?.length ? (\n <Card tone=\"critical\" border padding={2}>\n <Text>\n <ul style={{marginLeft: -10}}>\n {errors?.map((error, i) => (\n <li\n // oxlint-disable-next-line react/no-array-index-key\n key={`${error}-${i}`}\n >\n {error}\n </li>\n ))}\n </ul>\n </Text>\n </Card>\n ) : null}\n <IndexFormInput\n label=\"Index name\"\n placeholder={'Name of index without spaces...'}\n index={index}\n prop=\"indexName\"\n onChange={setIndex}\n readOnly={readOnly}\n />\n <IndexFormInput label=\"Dataset\" index={index} prop=\"dataset\" onChange={setIndex} readOnly />\n <IndexFormInput\n label=\"Filter\"\n description=\"Must be a valid GROQ filter\"\n placeholder={defaultIndex.filter}\n index={index}\n prop=\"filter\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n <IndexFormInput\n label=\"Projection\"\n description=\"Must be a valid GROQ projection, starting { and ending with }\"\n placeholder={defaultIndex.projection}\n index={index}\n prop=\"projection\"\n onChange={setIndex}\n readOnly={readOnly}\n type=\"textarea\"\n />\n {onSubmit && (\n <Button\n type=\"submit\"\n text=\"Create index\"\n icon={\n loading ? (\n <Box style={{marginTop: 5}}>\n <Spinner />\n </Box>\n ) : (\n AddIcon\n )\n }\n disabled={readOnly || loading}\n tone=\"primary\"\n />\n )}\n </Stack>\n </form>\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Button, type ButtonProps, Card} from '@sanity/ui'\nimport {type CSSProperties, useMemo} from 'react'\nimport {useObservable} from 'react-rx'\nimport {\n DefaultPreview,\n getPreviewStateObservable,\n getPreviewValueWithFallback,\n SanityDefaultPreview,\n type SanityDocument,\n type SchemaType,\n useDocumentPreviewStore,\n useSchema,\n} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ninterface ResultPreviewProps {\n documentId: string\n schemaTypeName: string\n button?: boolean\n style?: CSSProperties\n}\n\nconst INITIAL_PREVIEW_STATE = {\n snapshot: null,\n isLoading: true,\n original: null,\n}\n\nexport function DocumentPreview({\n documentId,\n style,\n schemaTypeName,\n ...buttonProps\n}: ResultPreviewProps & ButtonProps) {\n const schema = useSchema()\n const schemaType = schemaTypeName ? schema.get(schemaTypeName) : undefined\n\n if (!schemaTypeName) {\n return (\n <Card style={{minHeight: '36px'}}>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n title={'Loading...'}\n schemaType={schemaType}\n isPlaceholder\n />\n </Card>\n )\n }\n\n if (!schemaType) {\n return (\n <Card>\n <DefaultPreview\n withShadow={false}\n withBorder={false}\n media={<ErrorOutlineIcon />}\n title={\n <>\n Unknown type <code>{schemaTypeName ?? 'N/A'}</code> for {documentId}\n </>\n }\n />\n </Card>\n )\n }\n\n return (\n <DocumentPreviewInner\n documentId={documentId}\n schemaTypeName={schemaTypeName}\n schemaType={schemaType}\n style={style}\n {...buttonProps}\n />\n )\n}\n\nfunction DocumentPreviewInner({\n documentId,\n schemaType,\n style,\n button,\n}: ResultPreviewProps & {schemaType: SchemaType} & ButtonProps) {\n const documentPreviewStore = useDocumentPreviewStore()\n\n const previewStateObservable = useMemo(\n () => getPreviewStateObservable(documentPreviewStore, schemaType, documentId),\n [documentId, documentPreviewStore, schemaType],\n )\n\n const {\n snapshot,\n original,\n isLoading: previewIsLoading,\n } = useObservable(previewStateObservable, INITIAL_PREVIEW_STATE)\n\n const sanityDocument = useMemo(() => {\n return {\n _id: documentId,\n _type: schemaType?.name,\n } as SanityDocument\n }, [documentId, schemaType?.name])\n\n const {onClick: onIntentClick, href} = useIntentLink({\n intent: 'edit',\n params: {\n id: documentId,\n type: schemaType?.name,\n },\n })\n\n const preview = (\n <SanityDefaultPreview\n {...getPreviewValueWithFallback({\n snapshot,\n original,\n fallback: sanityDocument,\n })}\n isPlaceholder={previewIsLoading ?? true}\n layout=\"default\"\n icon={schemaType?.icon}\n />\n )\n if (button) {\n return (\n <Button\n as={'a'}\n href={href}\n onClick={onIntentClick}\n mode=\"ghost\"\n style={{width: '100%', ...style}}\n >\n {preview}\n </Button>\n )\n }\n return <Box style={{width: '100%'}}>{preview}</Box>\n}\n","import {Box, Button, Flex, Text} from '@sanity/ui'\nimport {Autocomplete, type AutocompleteOpenButtonProps} from '@sanity/ui/autocomplete'\nimport {\n type FocusEventHandler,\n type Ref,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {typed} from 'sanity'\n\nimport {queryIndex, type QueryResult} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {DocumentPreview} from '../preview/DocumentPreview'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\n\nexport interface SemanticSearchAutocompleteProps {\n indexConfig: EmbeddingsIndexConfig\n getEmptySearchValue: () => string\n typeFilter?: string[]\n filterResult?: (hit: QueryResult) => boolean\n onSelect?: (value: QueryResult) => void\n onFocus?: FocusEventHandler<HTMLInputElement>\n onBlur?: FocusEventHandler<HTMLInputElement>\n readOnly?: boolean\n}\n\ninterface Option {\n result: QueryResult\n value: string\n}\n\nconst NO_RESULTS_VALUE = '' as const\n\ninterface NoResultOption {\n value: string\n}\n\nconst NO_OPTIONS: NoResultOption[] = []\nconst NO_FILTER = () => true\n\nexport function SemanticSearchAutocomplete(\n props: SemanticSearchAutocompleteProps & {ref?: Ref<HTMLInputElement>},\n) {\n const {\n indexConfig,\n filterResult,\n getEmptySearchValue,\n readOnly,\n onFocus,\n onBlur,\n onSelect,\n typeFilter,\n ref,\n } = props\n const id = useId()\n const [query, setQuery] = useState('')\n const queryRef = useRef(query)\n const debouncedQuery = useDebouncedValue(query, 300)\n const prevDebouncedQuery = useRef(debouncedQuery)\n\n const [searching, setSearching] = useState(false)\n const [options, setOptions] = useState<Option[] | NoResultOption[]>(NO_OPTIONS)\n\n const client = useApiClient()\n\n const runIndexQuery = useCallback(\n (queryString: string) => {\n setSearching(true)\n const indexName = indexConfig?.indexName\n const maxResults = indexConfig?.maxResults\n\n if (!indexName) {\n throw new Error(`Reference option embeddingsIndex.indexName is required, but was missing`)\n }\n\n queryIndex(\n {\n query: queryString.trim().length ? queryString : (getEmptySearchValue() ?? ''),\n indexName,\n maxResults,\n filter: {\n type: typeFilter,\n },\n },\n client,\n )\n .then((result: QueryResult[]) => {\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([])\n const resultOptions = result\n .filter((hit) => (filterResult ? filterResult(hit) : true))\n .map((r) => typed<Option>({result: r, value: r.value.documentId}))\n if (resultOptions.length) {\n setOptions(resultOptions)\n } else {\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n }\n })\n .catch((e) => {\n console.error(e)\n if (queryRef.current === queryString) {\n setSearching(false)\n setOptions([{value: NO_RESULTS_VALUE}])\n }\n })\n },\n [client, indexConfig, getEmptySearchValue, filterResult, typeFilter],\n )\n\n useEffect(() => {\n if (prevDebouncedQuery.current !== debouncedQuery) {\n runIndexQuery(debouncedQuery)\n }\n prevDebouncedQuery.current = debouncedQuery\n }, [debouncedQuery, runIndexQuery])\n\n const openButtonConfig: AutocompleteOpenButtonProps = useMemo(\n () => ({onClick: () => runIndexQuery(queryRef.current)}),\n [runIndexQuery, queryRef],\n )\n\n const handleQueryChange = useCallback(\n (newValue: string | null) => {\n const newQuery = newValue ?? ''\n queryRef.current = newQuery\n setQuery(newQuery)\n },\n [setQuery],\n )\n\n const handleChange = useCallback(\n (value: string) => {\n if (value === NO_RESULTS_VALUE) {\n setOptions(NO_OPTIONS)\n return\n }\n const option = (options as Option[])\n .filter((r): r is Option => 'result' in r)\n .find((r) => r.result.value.documentId === value)\n if (option && onSelect) {\n onSelect(option.result)\n }\n },\n [onSelect, options],\n )\n\n return (\n <Autocomplete\n id={id}\n ref={ref}\n data-testid=\"semantic-autocomplete\"\n placeholder=\"Type to search...\"\n openButton={openButtonConfig}\n onFocus={onFocus}\n onChange={handleChange}\n loading={searching}\n onBlur={onBlur}\n readOnly={readOnly}\n filterOption={NO_FILTER}\n onQueryChange={handleQueryChange}\n options={options}\n renderOption={AutocompleteOption}\n />\n )\n}\n\nfunction AutocompleteOption(props: Option | NoResultOption) {\n if ('result' in props) {\n const value = props.result.value\n return (\n <Button mode=\"bleed\" padding={1} style={{width: '100%'}}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <DocumentPreview documentId={value.documentId} schemaTypeName={value.type} />\n </Box>\n <Box padding={2}>\n <Text size={1} muted title={'Relevance'}>\n {Math.floor(props.result.score * 100)}%\n </Text>\n </Box>\n </Flex>\n </Button>\n )\n }\n\n return (\n <Button mode=\"bleed\" padding={1} style={{width: '100%'}} disabled>\n <Flex gap={2} align=\"center\">\n No results.\n </Flex>\n </Button>\n )\n}\n\nfunction useDebouncedValue<T>(value: T, ms: number) {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n setDebouncedValue(value)\n }, ms)\n return () => clearTimeout(timeoutId)\n }, [value, ms])\n\n return debouncedValue\n}\n","import {useCallback, useMemo} from 'react'\nimport {useRouter} from 'sanity/router'\n\nimport {type QueryResult} from '../api/embeddingsApi'\nimport {SemanticSearchAutocomplete} from '../referenceInput/SemanticSearchAutocomplete'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\n\nexport function QueryIndex(props: {indexName: string}) {\n const {indexName} = props\n const getEmpty = useCallback(() => 'anything', [])\n const indexConfig: EmbeddingsIndexConfig = useMemo(\n () => ({indexName, maxResults: 8}),\n [indexName],\n )\n\n const {resolveIntentLink, navigateUrl} = useRouter()\n const onSelect = useCallback(\n (hit: QueryResult) => {\n navigateUrl({\n path: resolveIntentLink('edit', {id: hit.value.documentId, type: hit.value.type}),\n })\n },\n [resolveIntentLink, navigateUrl],\n )\n return (\n <SemanticSearchAutocomplete\n getEmptySearchValue={getEmpty}\n indexConfig={indexConfig}\n onSelect={onSelect}\n />\n )\n}\n","import {EllipsisVerticalIcon} from '@sanity/icons/EllipsisVertical'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Flex, Heading, Label, Stack, Text} from '@sanity/ui'\nimport {Menu, MenuButton, MenuItem} from '@sanity/ui/menu'\nimport {useCallback} from 'react'\n\nimport {type IndexState} from '../api/embeddingsApi'\nimport {IndexEditor} from './IndexEditor'\nimport {QueryIndex} from './QueryIndex'\n\nexport interface IndexInfoProps {\n selectedIndex: IndexState\n onDeleteIndex: (index: IndexState) => void\n}\n\nexport function IndexInfo({selectedIndex, onDeleteIndex}: IndexInfoProps) {\n const handleDelete = useCallback(\n () => onDeleteIndex(selectedIndex),\n [selectedIndex, onDeleteIndex],\n )\n return (\n <Stack gap={4} flex={1}>\n <Flex align=\"center\" flex={1} gap={2}>\n <Box flex={1}>\n <Heading>Index: {selectedIndex?.indexName ?? 'Untitled'}</Heading>\n </Box>\n <Box>\n <MenuButton\n button={\n <Button\n title=\"Open index actions\"\n icon={EllipsisVerticalIcon}\n padding={2}\n mode=\"ghost\"\n />\n }\n id={`button-${selectedIndex.indexName}`}\n menu={\n <Menu>\n <MenuItem\n text=\"Delete index\"\n icon={TrashIcon}\n tone=\"critical\"\n onClick={handleDelete}\n />\n </Menu>\n }\n popover={{placement: 'right'}}\n />\n </Box>\n </Flex>\n\n <Flex gap={6}>\n <Stack gap={4} flex={1} style={{maxWidth: 600}}>\n <Box>\n <IndexEditor index={selectedIndex} readOnly />\n </Box>\n <IndexStatus selectedIndex={selectedIndex} />\n </Stack>\n\n <Stack gap={3} flex={1}>\n <Label muted>Query index</Label>\n <QueryIndex indexName={selectedIndex.indexName} key={selectedIndex.indexName} />\n </Stack>\n </Flex>\n </Stack>\n )\n}\n\nfunction IndexStatus({selectedIndex}: {selectedIndex: IndexState}) {\n return (\n <Stack gap={4} flex={1}>\n <Flex gap={2} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Status\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.status}</Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Indexing progress\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>\n {selectedIndex.startDocumentCount - selectedIndex.remainingDocumentCount} /{' '}\n {selectedIndex.startDocumentCount}\n </Text>\n </Stack>\n </Flex>\n <Flex gap={5} align=\"center\">\n <Box flex={1}>\n <Label size={1} muted>\n Failed documents\n </Label>\n </Box>\n <Stack gap={2}>\n <Text>{selectedIndex.failedDocumentCount}</Text>\n </Stack>\n </Flex>\n </Stack>\n )\n}\n","import {Box, Button, Card, Flex, Label, Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\n\nimport {type IndexState} from '../api/embeddingsApi'\n\nexport interface IndexListProps {\n loading: boolean\n selectedIndex?: IndexState\n indexes: IndexState[]\n onIndexSelected: (index: IndexState) => void\n}\n\nexport function IndexList(props: IndexListProps) {\n const {loading, selectedIndex, indexes, onIndexSelected} = props\n return (\n <Card tone=\"default\" style={{opacity: loading ? 0.5 : 1}}>\n <Stack gap={2}>\n <Card borderBottom flex={1} paddingBottom={2} padding={3}>\n <Flex>\n <Box flex={1}>\n <Label muted>Index name</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Dataset</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Status</Label>\n </Box>\n <Box flex={1}>\n <Label muted>Progress</Label>\n </Box>\n </Flex>\n </Card>\n {indexes.length ? (\n <Stack gap={2} style={{maxHeight: 200, overflow: 'auto'}}>\n {indexes.map((index) => (\n <IndexRow\n selectedIndex={selectedIndex}\n index={index}\n onIndexSelected={onIndexSelected}\n key={index.indexName}\n />\n ))}\n </Stack>\n ) : (\n <Text muted>No indexes found.</Text>\n )}\n </Stack>\n </Card>\n )\n}\n\nfunction IndexRow(props: {\n selectedIndex?: IndexState\n index: IndexState\n onIndexSelected: (index: IndexState) => void\n}) {\n const {selectedIndex, index, onIndexSelected} = props\n const onSelect = useCallback(() => onIndexSelected(index), [onIndexSelected, index])\n return (\n <Button\n tone={selectedIndex?.indexName === index.indexName ? 'primary' : 'default'}\n mode={selectedIndex?.indexName === index.indexName ? 'default' : 'ghost'}\n onClick={onSelect}\n key={index.indexName}\n padding={3}\n >\n <Flex>\n <Box flex={1}>\n <strong>{index.indexName}</strong>\n </Box>\n <Box flex={1}>{index.dataset}</Box>\n <Box flex={1}>{index.status}</Box>\n <Box flex={1}>\n {index.startDocumentCount\n ? Math.floor(\n ((index.startDocumentCount - index.remainingDocumentCount) /\n index.startDocumentCount) *\n 100,\n )\n : '?'}\n %\n </Box>\n </Flex>\n </Button>\n )\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport {UndoIcon} from '@sanity/icons/Undo'\nimport {Box, Button, Card, Flex, Heading, Spinner, Stack} from '@sanity/ui'\nimport {useCallback, useEffect, useState} from 'react'\n\nimport {deleteIndex, getIndexes, type IndexState, type NamedIndex} from '../api/embeddingsApi'\nimport {useApiClient} from '../api/embeddingsApiHooks'\nimport {FeatureDisabledNotice, FeatureError, useIsFeatureEnabled} from '../api/isEnabled'\nimport {EditIndexDialog} from './IndexEditor'\nimport {IndexInfo} from './IndexInfo'\nimport {IndexList} from './IndexList'\n\nexport function EmbeddingsIndexTool() {\n const featureState = useIsFeatureEnabled()\n return (\n <Card flex={1}>\n <Flex justify=\"center\" flex={1}>\n {featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n {featureState === 'disabled' ? (\n <Box padding={4}>\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-tab\" />\n </Box>\n ) : null}\n\n {featureState === 'loading' ? (\n <Box padding={6}>\n <Spinner size={4} />\n </Box>\n ) : null}\n\n {featureState === 'enabled' ? (\n <Card flex={1} style={{maxWidth: 1200}} padding={5}>\n <Indexes />\n </Card>\n ) : null}\n </Flex>\n </Card>\n )\n}\n\nconst NO_INDEXES: IndexState[] = []\n\nfunction Indexes() {\n const client = useApiClient()\n const [indexes, setIndexes] = useState<IndexState[]>(NO_INDEXES)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState(false)\n const [createIndexOpen, setCreateIndexOpen] = useState(false)\n const [selectedIndex, setSelectedIndex] = useState<IndexState | undefined>(undefined)\n\n const onCreateIndexClose = useCallback(() => setCreateIndexOpen(false), [])\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n setSelectedIndex(indexes.find((i) => i.indexName === selectedIndex?.indexName))\n }, [indexes, selectedIndex])\n\n const updateIndexes = useCallback(() => {\n setLoading(true)\n setError(false)\n getIndexes(client)\n .then((response: IndexState[]) => {\n setLoading(false)\n setIndexes(response)\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n }, [client])\n\n const deleteNamedIndex = useCallback(\n (index: NamedIndex) => {\n if (\n !confirm(`Are you sure you want to delete ${index.indexName} for dataset ${index.dataset}?`)\n ) {\n return\n }\n setLoading(true)\n setError(false)\n deleteIndex(index.indexName, client)\n .then(() => {\n setTimeout(() => updateIndexes())\n })\n .catch((e) => {\n console.error(e)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n })\n },\n [client, updateIndexes],\n )\n\n const onSelectIndex = useCallback(\n (index: IndexState) => {\n setSelectedIndex(index)\n updateIndexes()\n },\n [setSelectedIndex, updateIndexes],\n )\n\n useEffect(() => {\n // oxlint-disable-next-line react/set-state-in-effect\n updateIndexes()\n }, [updateIndexes])\n\n const openCreate = useCallback(() => setCreateIndexOpen(true), [])\n const onSubmit = useCallback(\n (index: IndexState) => {\n setIndexes((current) => [...current, index])\n setSelectedIndex(index)\n updateIndexes()\n },\n [updateIndexes],\n )\n return (\n <Stack gap={4}>\n <Flex gap={2} align=\"center\" style={{height: 30}}>\n <Box flex={1}>\n <Heading size={1}>Embeddings indexes</Heading>\n </Box>\n <Box style={{justifySelf: 'flex-end'}}>\n <Button\n icon={AddIcon}\n text={'New index'}\n tone=\"default\"\n mode=\"ghost\"\n onClick={openCreate}\n />\n </Box>\n <Button\n icon={loading ? <Spinner /> : UndoIcon}\n title={'Refresh index list'}\n tone=\"default\"\n mode=\"bleed\"\n onClick={updateIndexes}\n disabled={loading}\n />\n </Flex>\n {error ? (\n <Card tone=\"critical\" padding={2} border>\n An error occurred. See console for details.\n </Card>\n ) : null}\n <IndexList\n loading={loading}\n indexes={indexes}\n selectedIndex={selectedIndex}\n onIndexSelected={onSelectIndex}\n />\n {selectedIndex && (\n <IndexInfo selectedIndex={selectedIndex} onDeleteIndex={deleteNamedIndex} />\n )}\n <EditIndexDialog open={createIndexOpen} onClose={onCreateIndexClose} onSubmit={onSubmit} />\n </Stack>\n )\n}\n","import {EarthGlobeIcon} from '@sanity/icons/EarthGlobe'\nimport {definePlugin, type Tool} from 'sanity'\n\nimport {EmbeddingsIndexTool} from './EmbeddingsIndexTool'\n\nconst embeddingsIndexTool: Tool = {\n name: 'embeddings-index',\n title: 'Embeddings',\n icon: EarthGlobeIcon,\n component: EmbeddingsIndexTool,\n}\n\nexport const embeddingsIndexDashboard = definePlugin({\n name: '@sanity/embeddings-index-dashboard',\n tools: [embeddingsIndexTool],\n})\n","export function publicId(id: string): string {\n return id.replace('drafts.', '')\n}\n","import {EarthGlobeIcon} from '@sanity/icons/EarthGlobe'\nimport {LinkIcon} from '@sanity/icons/Link'\nimport {Box, Button, Flex, Spinner} from '@sanity/ui'\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {\n type ObjectInputProps,\n type ReferenceBaseOptions,\n type ReferenceSchemaType,\n set,\n setIfMissing,\n unset,\n} from 'sanity'\nimport {useDocumentPane} from 'sanity/structure'\n\nimport {type QueryResult} from '../api/embeddingsApi'\nimport {FeatureDisabledNotice, FeatureError, useIsFeatureEnabledContext} from '../api/isEnabled'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\nimport {publicId} from '../utils/id'\nimport {SemanticSearchAutocomplete} from './SemanticSearchAutocomplete'\n\nfunction useEmeddingsConfig(\n embeddingsIndexConfig: ReferenceBaseOptions['embeddingsIndex'],\n defaultConfig: EmbeddingsIndexConfig | undefined,\n) {\n return useMemo(() => {\n if (embeddingsIndexConfig === true || !embeddingsIndexConfig) {\n if (!defaultConfig?.indexName) {\n throw new Error(\n 'Default embeddingsIndex config is missing. When options.embeddingsIndex: true, embeddingsIndexReferenceInput plugin config is required.',\n )\n }\n return defaultConfig\n }\n\n const finalConfig = {\n ...defaultConfig,\n ...embeddingsIndexConfig,\n }\n\n if (!finalConfig?.indexName) {\n throw new Error(\n 'indexName is missing. Either set it in options.embeddingsIndex or configure defaults using plugin config.',\n )\n }\n\n return finalConfig\n }, [defaultConfig, embeddingsIndexConfig])\n}\n\nexport function SemanticSearchReferenceInput(\n props: ObjectInputProps & {defaultConfig?: EmbeddingsIndexConfig},\n) {\n const embeddingsIndexConfig = (props.schemaType as ReferenceSchemaType)?.options?.embeddingsIndex\n\n const config = useEmeddingsConfig(embeddingsIndexConfig, props.defaultConfig)\n\n const defaultEnabled = config.searchMode === 'embeddings'\n\n const featureState = useIsFeatureEnabledContext()\n\n const [semantic, setSemantic] = useState<boolean>(defaultEnabled)\n const toggleSemantic = useCallback(() => setSemantic((current) => !current), [])\n\n return (\n <Flex gap={2} flex={1} style={{width: '100%'}}>\n {semantic && featureState == 'loading' ? (\n <Box padding={2}>\n <Spinner />\n </Box>\n ) : null}\n\n {semantic && featureState == 'disabled' ? (\n <FeatureDisabledNotice urlSuffix=\"?ref=embeddings-ref\" />\n ) : null}\n\n {semantic && featureState === 'error' ? (\n <Box padding={4}>\n <FeatureError />\n </Box>\n ) : null}\n\n <Box flex={1} style={{maxHeight: 36, overflow: 'hidden'}}>\n {semantic && featureState == 'enabled' ? (\n <SemanticSearchInput {...props} indexConfig={config} />\n ) : (\n props.renderDefault(props)\n )}\n </Box>\n <Button\n icon={semantic ? EarthGlobeIcon : LinkIcon}\n onClick={toggleSemantic}\n mode=\"bleed\"\n title={\n semantic ? 'Switch to standard reference search' : 'Switch to semantic reference search'\n }\n />\n </Flex>\n )\n}\n\nfunction SemanticSearchInput(props: ObjectInputProps & {indexConfig: EmbeddingsIndexConfig}) {\n const {indexConfig, onPathFocus, onChange, readOnly, schemaType, value} = props\n\n const {value: currentDocument} = useDocumentPane()\n const docRef = useRef(currentDocument)\n const autocompleteRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n docRef.current = currentDocument\n }, [currentDocument])\n\n useEffect(() => {\n // if this component is rendered, and there is a value, replace was selected\n if (value?.['_ref']) {\n autocompleteRef.current?.focus()\n }\n // intentional empty deps — focus once on mount when replacing an existing reference\n // oxlint-disable-next-line react/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps\n }, [])\n\n const handleFocus = useCallback(() => onPathFocus(['_ref']), [onPathFocus])\n const handleBlur = useCallback(() => onPathFocus([]), [onPathFocus])\n\n const handleChange = useCallback(\n (result: QueryResult) => {\n if (!result) {\n onChange(unset())\n onPathFocus([])\n return\n }\n const patches = [\n setIfMissing({}),\n set(schemaType.name, ['_type']),\n set(publicId(result.value.documentId), ['_ref']),\n unset(['_weak']),\n unset(['_strengthenOnPublish']),\n ]\n\n onChange(patches)\n // Move focus away from _ref and one level up\n onPathFocus([])\n },\n [onChange, onPathFocus, schemaType.name],\n )\n\n const filterResult = useCallback(\n (r: QueryResult) => {\n const currentId = docRef.current?._id\n return !currentId || r.value.documentId !== publicId(currentId)\n },\n [docRef],\n )\n\n const getEmptySearchValue = useCallback(() => JSON.stringify(docRef.current), [docRef])\n const typeFilter = useMemo(\n () => (schemaType as ReferenceSchemaType).to.map((refType) => refType.name),\n [schemaType],\n )\n\n return (\n <SemanticSearchAutocomplete\n ref={autocompleteRef}\n typeFilter={typeFilter}\n indexConfig={indexConfig}\n onSelect={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n getEmptySearchValue={getEmptySearchValue}\n filterResult={filterResult}\n readOnly={readOnly}\n />\n )\n}\n","import {\n definePlugin,\n isObjectInputProps,\n type ObjectInputProps,\n type ReferenceSchemaType,\n} from 'sanity'\n\nimport {FeatureEnabledProvider} from '../api/isEnabled'\nimport {type EmbeddingsIndexConfig} from '../schemas/typeDefExtensions'\nimport {isType} from '../utils/types'\nimport {SemanticSearchReferenceInput} from './SemanticSearchReferenceInput'\n\nexport const embeddingsIndexReferenceInput = definePlugin<EmbeddingsIndexConfig | void>(\n (defaultConfig) => {\n const config = typeof defaultConfig === 'object' ? defaultConfig : undefined\n\n return {\n name: '@sanity/embeddings-index-reference-input',\n studio: {\n components: {\n layout: (props) => {\n return <FeatureEnabledProvider>{props.renderDefault(props)}</FeatureEnabledProvider>\n },\n },\n },\n form: {\n components: {\n input: (props) => {\n const embeddingsIndexConfig = (props.schemaType as ReferenceSchemaType)?.options\n ?.embeddingsIndex\n if (\n isObjectInputProps(props) &&\n isType(props.schemaType, 'reference') &&\n (embeddingsIndexConfig === true || embeddingsIndexConfig?.indexName)\n ) {\n return (\n <SemanticSearchReferenceInput\n {...(props as ObjectInputProps)}\n defaultConfig={config}\n />\n )\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
\ No newline at end of file