La capa oficial `@kirchdev/duxt-meilisearch` consume toda la instantánea
[`duxt:search:records`](/reference/hooks). Conserva los identificadores derivados
de la URL, texto normalizado, fuente, versión e idioma, incluidas las secciones
generadas. Meilisearch es opcional; la búsqueda integrada no necesita un servicio.

::package-managers{command="add @kirchdev/duxt-meilisearch"}
::

```ts [nuxt.config.ts]
export default defineNuxtConfig({
  extends: ['@kirchdev/duxt', '@kirchdev/duxt-meilisearch'],
  duxtMeilisearch: {
    host: process.env.MEILISEARCH_HOST,
    index: 'docs',
    searchKey: process.env.MEILISEARCH_SEARCH_KEY,
    syncKey: process.env.MEILISEARCH_SYNC_KEY,
    taskKey: process.env.MEILISEARCH_TASK_KEY,
    sync: {
      enabled: process.env.MEILISEARCH_SYNC_ENABLED === 'true',
      deployment: process.env.DUXT_DEPLOYMENT === 'production'
        ? 'production' : 'preview'
    }
  }
})
```

Activa ambas opciones de producción solo en el trabajo de publicación.
La presencia de `syncKey` no habilita escrituras. El desarrollo, Nuxt prepare y
los contextos reconocidos de PR o vista previa omiten la sincronización. Otros
sistemas CI deben usar `deployment: 'preview'` para las vistas previas.
Cloudflare Pages también exige que `DUXT_PRODUCTION_BRANCH` coincida con
`CF_PAGES_BRANCH`.

Usa un índice exclusivo `docs`. La clave privada de compilación necesita
`indexes.create`, `indexes.get`, `indexes.delete`, `indexes.swap`,
`settings.update`, `documents.add` y `tasks.get` para `docs` y `docs__duxt_*`.
La capa crea un índice provisional único, espera las tareas de configuración e
importación, lo intercambia atómicamente con `docs`, espera el éxito del
intercambio y elimina la instantánea anterior. Las siguientes compilaciones
eliminan páginas borradas; una instantánea vacía vacía el índice. Los errores de
importación conservan el índice anterior. Un intercambio incierto conserva el
índice provisional para no borrar datos posiblemente publicados; los errores de
limpieza se notifican. Serializa las publicaciones si importa su orden. La
primera sincronización crea el destino vacío cuando el índice provisional está listo.

La clave privada nunca entra en la configuración del navegador. Omite
`searchKey` para conservar la búsqueda integrada mientras sincronizas. Para
conectar el diálogo existente, crea otra clave con **solo** la acción `search` y
**solo** el índice configurado `docs`. La clave de búsqueda predeterminada cubre
todos los índices; no la uses. Nunca publiques una clave maestra o administrativa.
La capa rechaza reutilizar la clave privada conocida; una cadena opaca no revela
sus permisos, por lo que el operador debe aprovisionar la clave restringida.
La búsqueda exclusiva del navegador no necesita clave privada. Permite el origen
del sitio mediante CORS en el servicio.

La búsqueda mantiene la versión seleccionada o predeterminada de cada artefacto
y la cadena de idiomas de reserva. Una traducción sustituye su página original;
las páginas sin traducción siguen apareciendo en el idioma original. La capa
lee un inventario de rutas almacenado en caché mediante Content y excluye las
páginas cubiertas por fuente, versión e idioma antes de ordenar y limitar.
El campo `page`, usado solo para filtrar, contiene la URL sin ancla; las secciones
ocultas no ocupan la ventana de 1.000 resultados. Sincroniza una vez antes de usar
la búsqueda del navegador con un índice creado por una compilación anterior.
Los errores
del servicio producen resultados vacíos y una advertencia en consola. Las
peticiones HTTP caducan tras 30 segundos; las tareas tienen cinco minutos,
configurables con `sync.taskTimeoutMs`, hasta una hora.

El paquete tiene versión y changelog propios. duxt no recibe SDK, credenciales ni
configuración del proveedor. Las interfaces propias pueden usar
`@kirchdev/duxt-meilisearch/search`; las herramientas de compilación pueden usar
`@kirchdev/duxt-meilisearch/sync` con las mismas opciones de producción.

Consulta el [intercambio atómico](https://specs.meilisearch.dev/specifications/text/0191-swap-indexes-api.html),
las [tareas asíncronas](https://www.meilisearch.com/docs/reference/api/async-task-management/get-task)
y las [claves restringidas](https://www.meilisearch.com/docs/reference/api/keys/create-api-key) de Meilisearch.

Meilisearch 1.54.3 oculta la tarea global `indexSwap` (`indexUid: null`) a las
claves restringidas por índice, aunque incluyan ambos índices. Con una clave de
escritura restringida, añade un `taskKey` privado con solo
`actions: ['tasks.get']` e `indexes: ['*']`. Se usa únicamente para consultar
tareas y nunca se publica. Sin él, `syncKey` debe poder leer tareas globales. Un
404 oculto no confirma la publicación y conserva el índice provisional. Este
comportamiento se verificó con el motor real.