@sanity/embeddings-index-ui

4.0.194.0.20
~

Modified (6 files)

Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -337,8 +337,13 @@
 }
 function _temp$3(error, i) {
 	return /* @__PURE__ */ jsx("li", { children: error }, `${error}-${i}`);
 }
+const INITIAL_PREVIEW_STATE = {
+	snapshot: null,
+	isLoading: !0,
+	original: null
+};
 function DocumentPreview(t0) {
 	let $ = c(23), buttonProps, documentId, schemaTypeName, style;
 	$[0] === t0 ? (buttonProps = $[1], documentId = $[2], schemaTypeName = $[3], style = $[4]) : ({documentId, style, schemaTypeName, ...buttonProps} = t0, $[0] = t0, $[1] = buttonProps, $[2] = documentId, $[3] = schemaTypeName, $[4] = style);
 	let schema = useSchema(), t1;
@@ -386,68 +391,62 @@
 		...buttonProps
 	}), $[17] = buttonProps, $[18] = documentId, $[19] = schemaType, $[20] = schemaTypeName, $[21] = style, $[22] = t2) : t2 = $[22], t2;
 }
 function DocumentPreviewInner(t0) {
-	let $ = c(31), { documentId, schemaType, style, button } = t0, documentPreviewStore = useDocumentPreviewStore(), t1;
+	let $ = c(30), { documentId, schemaType, style, button } = t0, documentPreviewStore = useDocumentPreviewStore(), t1;
 	$[0] !== documentId || $[1] !== documentPreviewStore || $[2] !== schemaType ? (t1 = getPreviewStateObservable(documentPreviewStore, schemaType, documentId), $[0] = documentId, $[1] = documentPreviewStore, $[2] = schemaType, $[3] = t1) : t1 = $[3];
-	let previewStateObservable = t1, t2;
-	$[4] === Symbol.for("react.memo_cache_sentinel") ? (t2 = {
-		snapshot: null,
-		isLoading: !0,
-		original: null
-	}, $[4] = t2) : t2 = $[4];
-	let { snapshot, original, isLoading: previewIsLoading } = useObservable(previewStateObservable, t2), t3;
-	$[5] !== documentId || $[6] !== schemaType?.name ? (t3 = () => ({
+	let { snapshot, original, isLoading: previewIsLoading } = useObservable(t1, INITIAL_PREVIEW_STATE), t2;
+	$[4] !== documentId || $[5] !== schemaType?.name ? (t2 = () => ({
 		_id: documentId,
 		_type: schemaType?.name
-	}), $[5] = documentId, $[6] = schemaType?.name, $[7] = t3) : t3 = $[7], schemaType?.name;
-	let t4;
-	$[8] === t3 ? t4 = $[9] : (t4 = t3(), $[8] = t3, $[9] = t4);
-	let sanityDocument = t4, t5 = schemaType?.name, t6;
-	$[10] !== documentId || $[11] !== t5 ? (t6 = {
+	}), $[4] = documentId, $[5] = schemaType?.name, $[6] = t2) : t2 = $[6], schemaType?.name;
+	let t3;
+	$[7] === t2 ? t3 = $[8] : (t3 = t2(), $[7] = t2, $[8] = t3);
+	let sanityDocument = t3, t4 = schemaType?.name, t5;
+	$[9] !== documentId || $[10] !== t4 ? (t5 = {
 		intent: "edit",
 		params: {
 			id: documentId,
-			type: t5
+			type: t4
 		}
-	}, $[10] = documentId, $[11] = t5, $[12] = t6) : t6 = $[12];
-	let { onClick: onIntentClick, href } = useIntentLink(t6), t7;
-	$[13] !== original || $[14] !== sanityDocument || $[15] !== snapshot ? (t7 = getPreviewValueWithFallback({
+	}, $[9] = documentId, $[10] = t4, $[11] = t5) : t5 = $[11];
+	let { onClick: onIntentClick, href } = useIntentLink(t5), t6;
+	$[12] !== original || $[13] !== sanityDocument || $[14] !== snapshot ? (t6 = getPreviewValueWithFallback({
 		snapshot,
 		original,
 		fallback: sanityDocument
-	}), $[13] = original, $[14] = sanityDocument, $[15] = snapshot, $[16] = t7) : t7 = $[16];
-	let t8 = previewIsLoading ?? !0, t9 = schemaType?.icon, t10;
-	$[17] !== t7 || $[18] !== t8 || $[19] !== t9 ? (t10 = /* @__PURE__ */ jsx(SanityDefaultPreview, {
-		...t7,
-		isPlaceholder: t8,
+	}), $[12] = original, $[13] = sanityDocument, $[14] = snapshot, $[15] = t6) : t6 = $[15];
+	let t7 = previewIsLoading ?? !0, t8 = schemaType?.icon, t9;
+	$[16] !== t6 || $[17] !== t7 || $[18] !== t8 ? (t9 = /* @__PURE__ */ jsx(SanityDefaultPreview, {
+		...t6,
+		isPlaceholder: t7,
 		layout: "default",
-		icon: t9
-	}), $[17] = t7, $[18] = t8, $[19] = t9, $[20] = t10) : t10 = $[20];
-	let preview = t10;
+		icon: t8
+	}), $[16] = t6, $[17] = t7, $[18] = t8, $[19] = t9) : t9 = $[19];
+	let preview = t9;
 	if (button) {
-		let t11;
-		$[21] === style ? t11 = $[22] : (t11 = {
+		let t10;
+		$[20] === style ? t10 = $[21] : (t10 = {
 			width: "100%",
 			...style
-		}, $[21] = style, $[22] = t11);
-		let t12;
-		return $[23] !== href || $[24] !== onIntentClick || $[25] !== preview || $[26] !== t11 ? (t12 = /* @__PURE__ */ jsx(Button, {
+		}, $[20] = style, $[21] = t10);
+		let t11;
+		return $[22] !== href || $[23] !== onIntentClick || $[24] !== preview || $[25] !== t10 ? (t11 = /* @__PURE__ */ jsx(Button, {
 			as: "a",
 			href,
 			onClick: onIntentClick,
 			mode: "ghost",
-			style: t11,
+			style: t10,
 			children: preview
-		}), $[23] = href, $[24] = onIntentClick, $[25] = preview, $[26] = t11, $[27] = t12) : t12 = $[27], t12;
+		}), $[22] = href, $[23] = onIntentClick, $[24] = preview, $[25] = t10, $[26] = t11) : t11 = $[26], t11;
 	}
+	let t10;
+	$[27] === Symbol.for("react.memo_cache_sentinel") ? (t10 = { width: "100%" }, $[27] = t10) : t10 = $[27];
 	let t11;
-	$[28] === Symbol.for("react.memo_cache_sentinel") ? (t11 = { width: "100%" }, $[28] = t11) : t11 = $[28];
-	let t12;
-	return $[29] === preview ? t12 = $[30] : (t12 = /* @__PURE__ */ jsx(Box, {
-		style: t11,
+	return $[28] === preview ? t11 = $[29] : (t11 = /* @__PURE__ */ jsx(Box, {
+		style: t10,
 		children: preview
-	}), $[29] = preview, $[30] = t12), t12;
+	}), $[28] = preview, $[29] = t11), t11;
 }
 const NO_OPTIONS = [], NO_FILTER = () => !0;
 function SemanticSearchAutocomplete(props) {
 	let $ = c(27), { indexConfig, filterResult, getEmptySearchValue, readOnly, onFocus, onBlur, onSelect, typeFilter, ref } = props, id = useId(), [query, setQuery] = useState(""), queryRef = useRef(query), debouncedQuery = useDebouncedValue(query, 300), prevDebouncedQuery = useRef(debouncedQuery), [searching, setSearching] = useState(!1), [options, setOptions] = useState(NO_OPTIONS), client = useApiClient(), t0;
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@sanity/embeddings-index-ui",
-  "version": "4.0.19",
+  "version": "4.0.20",
   "description": "Various Sanity Studio plugins for integrating with the embeddings index API",
   "keywords": [
     "sanity",
     "sanity-plugin"
@@ -27,23 +27,23 @@
     "./package.json": "./package.json"
   },
   "dependencies": {
     "@sanity/icons": "^5.2.3",
-    "@sanity/ui": "^4.4.0",
-    "react-rx": "^4.2.5"
+    "@sanity/ui": "^4.4.4",
+    "react-rx": "^7.0.1"
   },
   "devDependencies": {
     "@sanity/tsconfig": "^2.2.1",
-    "@sanity/tsdown-config": "^0.27.1",
+    "@sanity/tsdown-config": "^0.28.8",
     "@types/node": "^24.13.3",
     "@types/react": "^19.3.0",
     "@types/react-dom": "^19.3.0",
     "oxc-transform-react": "^0.153.0",
     "react": "^19.3.0",
     "react-dom": "^19.3.0",
-    "sanity": "^6.16.0",
+    "sanity": "^6.18.0",
     "styled-components": "^6.5.3",
-    "tsdown": "^0.22.14"
+    "tsdown": "^0.23.1"
   },
   "peerDependencies": {
     "react": "^19.2",
     "react-dom": "^19.2",
Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/schemas/typeDefExtensions.ts","../src/embeddingsIndexDashboard/dashboardPlugin.ts","../src/referenceInput/referencePlugin.tsx","../src/api/embeddingsApi.ts"],"mappings":";;UAAiB;;;;EAIf;EACA;;;;;;;;;EASA;;;YAIU;;;;;;;IAOR,yBAAyB;;;cCbhB,2CAAwB;cCAxB,gDAA6B,cAAA;UCVzB;EACf;EACA;EACA;EACA;EACA;;UAGe,mBAAmB;EAClC;EACA;EACA;EACA;;UAGe;EACf;EACA;IACE;IACA;;;UAIa;EACf;EACA;EACA;EACA;IACE;;;iBAIY,WAAW,aAAa,aAAa,QAAQ,eAAe,QAAQ;iBAiBpE,WAAW,QAAQ,eAAe,QAAQ;iBAS1C,YAAY,mBAAmB,QAAQ,eAAe,QAAQ"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/schemas/typeDefExtensions.ts","../src/embeddingsIndexDashboard/dashboardPlugin.ts","../src/referenceInput/referencePlugin.tsx","../src/api/embeddingsApi.ts"],"mappings":";;UAAiB;;;;EAIf;EACA;;;;;;;;;EASA;;;YAIU;;;;;;;IAOR,yBAAyB;;;qBCbhB,2CAAwB;qBCAxB,gDAA6B,cAAA;iBCVzB;EACf;EACA;EACA;EACA;EACA;;iBAGe,mBAAmB;EAClC;EACA;EACA;EACA;;iBAGe;EACf;EACA;IACE;IACA;;;iBAIa;EACf;EACA;EACA;EACA;IACE;;;wBAIY,WAAW,aAAa,aAAa,QAAQ,eAAe,QAAQ;wBAiBpE,WAAW,QAAQ,eAAe,QAAQ;wBAS1C,YAAY,mBAAmB,QAAQ,eAAe,QAAQ"}
\ No newline at end of file
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
Index: package/README.md
===================================================================
--- package/README.md
+++ package/README.md
@@ -49,10 +49,10 @@
 
 You can add the semantic reference search input by importing and adding `embeddingsIndexReferenceInput` as a plugin to `sanity.config.ts` (or `.js`):
 
 ```ts
-import {defineConfig} from 'sanity'
 import {embeddingsIndexReferenceInput} from '@sanity/embeddings-index-ui'
+import {defineConfig} from 'sanity'
 
 export default defineConfig({
   //...
   plugins: [embeddingsIndexReferenceInput()],
@@ -91,10 +91,10 @@
 
 Example:
 
 ```ts
-import {defineConfig} from 'sanity'
 import {embeddingsIndexReferenceInput} from '@sanity/embeddings-index-ui'
+import {defineConfig} from 'sanity'
 
 export default defineConfig({
   //...
   plugins: [
@@ -132,10 +132,10 @@
 
 Add `embeddingsIndexDashboard` as a plugin to `sanity.config.ts` (or `.js`):
 
 ```ts
-import {defineConfig} from 'sanity'
 import {embeddingsIndexDashboard} from '@sanity/embeddings-index-ui'
+import {defineConfig} from 'sanity'
 
 export default defineConfig({
   //...
   plugins: [
@@ -150,10 +150,10 @@
 
 If you want to enable the tool based on user access roles:
 
 ```ts
-import {defineConfig} from 'sanity'
 import {embeddingsIndexDashboard} from '@sanity/embeddings-index-ui'
+import {defineConfig} from 'sanity'
 
 export default defineConfig({
   //...
   plugins: [embeddingsIndexDashboard()],
Index: package/dist/index.d.ts
===================================================================
--- package/dist/index.d.ts
+++ package/dist/index.d.ts
@@ -26,39 +26,39 @@
      */
     embeddingsIndex?: true | EmbeddingsIndexConfig;
   }
 }
-declare const embeddingsIndexDashboard: import("sanity").Plugin<void>;
-declare const embeddingsIndexReferenceInput: import("sanity").Plugin<void | EmbeddingsIndexConfig>;
-interface NamedIndex {
+export declare const embeddingsIndexDashboard: import("sanity").Plugin<void>;
+export declare const embeddingsIndexReferenceInput: import("sanity").Plugin<void | EmbeddingsIndexConfig>;
+export interface NamedIndex {
   indexName: string;
   dataset: string;
   project: string;
   projection: string;
   filter: string;
 }
-interface IndexState extends NamedIndex {
+export interface IndexState extends NamedIndex {
   status: string;
   startDocumentCount: number;
   remainingDocumentCount: number;
   failedDocumentCount: number;
 }
-interface QueryResult {
+export interface QueryResult {
   score: number;
   value: {
     documentId: string;
     type: string;
   };
 }
-interface QueryConfig {
+export interface QueryConfig {
   query: string;
   indexName: string;
   maxResults?: number;
   filter?: {
     type?: string | string[];
   };
 }
-declare function queryIndex(queryConfig: QueryConfig, client: SanityClient): Promise<QueryResult[]>;
-declare function getIndexes(client: SanityClient): Promise<IndexState[]>;
-declare function deleteIndex(indexName: string, client: SanityClient): Promise<IndexState>;
-export { IndexState, NamedIndex, QueryConfig, QueryResult, deleteIndex, embeddingsIndexDashboard, embeddingsIndexReferenceInput, getIndexes, queryIndex };
+export declare function queryIndex(queryConfig: QueryConfig, client: SanityClient): Promise<QueryResult[]>;
+export declare function getIndexes(client: SanityClient): Promise<IndexState[]>;
+export declare function deleteIndex(indexName: string, client: SanityClient): Promise<IndexState>;
+export {};
 //# sourceMappingURL=index.d.ts.map
\ No newline at end of file