# Referencia de IA, contexto y workflows

Proveedores, conversaciones, acciones, orquestación, permisos y liberación del subsistema de IA.

<span class="section-anchor" id="section-1"></span>

## Preparar una instancia de IA

Obtén `const ai = await wu.aiReady()` antes de configurar el subsistema. Solo `WuAI` es un export público del subpath `wu-framework/ai`; los objetos `context`, `conversation` y `permissions` exponen métodos concretos, no acceso irrestricto a sus clases internas.

En ejemplos de conversación configura primero un proveedor `demo` con transporte propio o un proxy de servidor. Una respuesta de acción con `success:false` debe manejarse aunque la promesa se haya resuelto. Los nombres de resultados en las firmas describen estructuras de datos y no prometen exports TypeScript adicionales.

La política de IA y los grants del core tienen propósitos diferentes. Los workflows deterministas ejecutan primitivas del host directamente; no son una API para conceder ejecución a código ajeno. Consulta la [receta de IA y MCP](/es/docs/framework/ai-recipes/) para una integración guiada.

<span class="section-anchor" id="section-2"></span>

## wu.aiReady

Carga el subsistema opcional y entrega una instancia lista para configurar.

`wu.aiReady(): Promise<WuAI>`

- **Parámetros:** No requiere importar wu-framework/ai si se utiliza la fachada del core.
- **Retorno:** Promesa de la instancia WuAI.
- **Errores:** Rechaza si no puede importar el módulo opcional.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
const ai = await wu.aiReady();
ai.init({ permissions: { executeActions: false } });
```

Para operaciones inmediatas de lectura, espera aiReady: la fachada lazy puede devolver valores iniciales antes de finalizar la carga.

Referencia: `src/index.js`.

<span class="section-anchor" id="section-3"></span>

## WuAI

Crea el coordinador de IA con dependencias explícitas.

`new WuAI({ eventBus, store, core?, token? })`

- **Parámetros:** eventBus y store compartidos con el host; core permite consultar apps.
- **Retorno:** Instancia aún sin inicializar.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
import { WuAI } from 'wu-framework/ai';
const ai = new WuAI({ eventBus: wu.eventBus, store: wu.store, core: wu });
ai.init();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-4"></span>

## ai.init

Inicializa proveedores, conversaciones, acciones, contexto y protección de ejecución.

`ai.init(config?): WuAI`

- **Parámetros:** permissions, context, conversation, triggers, agent, orchestrate, rateLimit, circuitBreaker, loopProtection, allowedDomains y browser. El proveedor se registra por separado con ai.provider(name, config).
- **Retorno:** La misma instancia; posteriores llamadas reconfiguran opciones soportadas.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
const ai = await wu.aiReady();
ai.init({ permissions: { executeActions: true, network: false }, allowedDomains: [] });
```

La autorización declarada no aísla JavaScript capturado por un handler propio: el código del host continúa siendo confiable.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-5"></span>

## ai.provider

Registra un proveedor integrado o funciones de transporte propias.

`ai.provider(name, config): WuAI`

- **Parámetros:** name; adapter, endpoint, model, active; o send/stream propios. Usa un proxy de servidor para credenciales.
- **Retorno:** La misma instancia.
- **Errores:** Lanza si no reconoce el adapter y no hay send/stream. Una API key directa se elimina por defecto al detectar producción.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
ai.provider('demo', {
  send: async () => ({ content: 'Respuesta determinista', usage: {} }),
});
const result = await ai.send('Hola', { provider: 'demo' });
```

Un transporte personalizado es código privilegiado del host, no una forma de probar el aislamiento de red.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-6"></span>

## ai.send

Envía un mensaje y procesa las herramientas que solicite el proveedor.

`ai.send(message, options?): Promise<ConversationResponse>`

- **Parámetros:** message string; namespace, provider, systemPrompt, templateVars, temperature, maxTokens, responseFormat y signal.
- **Retorno:** Respuesta con content, namespace y resultados/uso disponibles. Preflight denegado resuelve content:"[blocked] ..."; una cancelación resuelve content:"[aborted]".
- **Errores:** Los errores del proveedor normalmente rechazan; bloqueo de preflight y AbortError se representan como respuestas resueltas con marcador en content.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** ai.abort(namespace) interrumpe esa conversación; clear elimina historial, deleteNamespace elimina y aborta.

```js
const response = await ai.send('Resume el estado', { namespace: 'help', provider: 'demo' });
console.log(response.content);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-7"></span>

## ai.stream

Entrega texto y eventos de herramientas incrementalmente.

`ai.stream(message, options?): AsyncGenerator<StreamChunk>`

- **Parámetros:** Mismas opciones de conversación que send; el proveedor debe soportar streaming.
- **Retorno:** Iterador asíncrono con chunks tipados por type.
- **Errores:** Errores del proveedor y abort se emiten como chunks type:"error". Construir el systemPrompt ocurre antes del try y sí puede rechazar la iteración.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
for await (const chunk of ai.stream('Explica el estado', { namespace: 'help' })) {
  if (chunk.type === 'text') console.log(chunk.content);
}
```

No presupongas que cada chunk contiene texto: hay resultados de herramientas, finalización y errores.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-8"></span>

## ai.json

Solicita salida JSON y separa el texto recibido del resultado parseado.

`ai.json(message, options?): Promise<JsonResponse>`

- **Parámetros:** schema/schemaName opcionales, además de opciones de send.
- **Retorno:** {data, raw, error, usage, namespace}.
- **Errores:** El JSON inválido se informa en error con data:null; los fallos del proveedor sí pueden rechazar.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
const result = await ai.json('Devuelve {"ready":true}', { provider: 'demo' });
if (result.error) console.error(result.error);
else console.log(result.data);
```

La disponibilidad de schema en el proveedor no sustituye la validación de negocio del resultado.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-9"></span>

## ai.abort

Cancela peticiones activas de una conversación o de todas.

`ai.abort(namespace?): void`

- **Parámetros:** Namespace opcional; omitirlo aborta todos.
- **Retorno:** void.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Abortar no borra mensajes anteriores; utiliza conversation.clear si también deseas vaciar el historial.

```js
ai.abort('help');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-10"></span>

## ai.action

Registra una operación ejecutable con descripción, parámetros y handler.

`ai.action(name, config): WuAI`

- **Parámetros:** description, parameters, handler; confirm, permissions, permissionsWhen y dangerous opcionales.
- **Retorno:** La misma instancia.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** executeActions autoriza la ejecución; permissions/permissionsWhen pueden exigir flags adicionales de IA.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
ai.action('math.double', {
  description: 'Duplica un número',
  parameters: { type: 'object', properties: { value: { type: 'number' } }, required: ['value'] },
  handler: ({ value }) => value * 2,
});
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-11"></span>

## ai.execute

Ejecuta una acción registrada pasando por la política y los controles del subsistema.

`ai.execute(actionName, params?): Promise<ActionResult>`

- **Parámetros:** Nombre exacto y objeto de argumentos.
- **Retorno:** {success, result?, reason?}; success:false también es una respuesta resuelta.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** Requiere executeActions y los permisos específicos de la acción; puede requerir confirmación.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
const result = await ai.execute('math.double', { value: 21 });
if (!result.success) throw new Error(result.reason);
console.log(result.result);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-12"></span>

## ai.trigger

Conecta un patrón de eventos con una petición al asistente.

`ai.trigger(name, config): WuAI`

- **Parámetros:** pattern, prompt; condition, debounce, priority y onResult opcionales.
- **Retorno:** La misma instancia.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** ai.destroy() retira las suscripciones creadas por triggers.

```js
ai.trigger('cart-help', {
  pattern: 'cart:help',
  prompt: 'Explica cómo revisar este carrito',
  debounce: 500,
  onResult: (response) => console.log(response.content),
});
```

Usa condition y debounce para limitar activaciones; no publiques datos sensibles en eventos destinados a contexto.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-13"></span>

## ai.fireTrigger

Solicita explícitamente la ejecución de un trigger registrado.

`ai.fireTrigger(name, data?): Promise<unknown>`

- **Parámetros:** Nombre y datos que recibe su configuración de prompt/condition.
- **Retorno:** Resultado asíncrono de la ejecución o ausencia de resultado cuando se omite.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
await ai.fireTrigger('cart-help', { itemCount: 2 });
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-14"></span>

## ai.agent

Ejecuta un bucle de pasos que puede consultar contexto y llamar acciones.

`ai.agent(goal, options?): AsyncGenerator<AgentStep>`

- **Parámetros:** goal string; opciones del agente, como maxSteps, namespace, provider y signal.
- **Retorno:** Iterador de pasos, no un texto único.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** Las acciones siguen sujetas a executeActions y sus flags. Limitar maxSteps no concede permisos.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
for await (const step of ai.agent('Explica las acciones disponibles', { maxSteps: 3 })) {
  console.log(step);
}
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-15"></span>

## ai.capability

Registra una acción bajo la identidad funcional de una aplicación para orquestación.

`ai.capability(appName, actionName, config): WuAI`

- **Parámetros:** appName, actionName y configuración de acción con description, parameters y handler.
- **Retorno:** La misma instancia.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
ai.capability('calculator', 'double', {
  description: 'Duplica un número',
  parameters: { value: { type: 'number', required: true } },
  handler: ({ value }) => value * 2,
});
```

Aquí capability significa acción publicada al orquestador. No crea un grant events.emit/rpc.call/store.write del core.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-16"></span>

## ai.intent

Resuelve una intención utilizando las capacidades registradas por las aplicaciones.

`ai.intent(description, options?): Promise<IntentResult>`

- **Parámetros:** Descripción y opciones de orquestación/proveedor.
- **Retorno:** Resultado con content, tool_results, usage, resolved y appsInvolved.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
const result = await ai.intent('Duplica 7 usando calculator');
console.log(result.resolved, result.appsInvolved);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-17"></span>

## ai.removeApp

Retira las capacidades de IA asociadas con una aplicación.

`ai.removeApp(appName): WuAI`

- **Parámetros:** Nombre utilizado al registrar capability.
- **Retorno:** La misma instancia.
- **Errores:** Propaga errores de configuración o ejecución; captura rechazos y revisa los resultados de acciones.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** No desmonta la aplicación del core ni borra su estado global.

```js
ai.removeApp('calculator');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-18"></span>

## ai.workflow

Registra una secuencia de acciones determinista o pasos interpretados por un agente.

`ai.workflow(name, config): WuAI`

- **Parámetros:** steps no vacío; modo deterministic admite click, type, navigate, wait, emit y setState. Modo ai admite descripciones. parameters, maxSteps, provider y temperature opcionales.
- **Retorno:** La misma instancia.
- **Errores:** Nombre ausente o steps vacío/inválido lanzan al registrar.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
ai.workflow('mark-ready', {
  mode: 'deterministic',
  steps: [{ action: 'setState', path: 'workflow.ready', value: true }],
});
```

Los pasos deterministas son primitivas del host y no llaman a acciones registradas con ai.action. Se ejecutan directamente, sin pasar por ai.execute ni sus comprobaciones de permisos.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-19"></span>

## ai.runWorkflow

Ejecuta un workflow y emite el progreso de sus pasos.

`ai.runWorkflow(name, params?, options?): AsyncGenerator<WorkflowStep>`

- **Parámetros:** Nombre registrado, parámetros requeridos por workflow.parameters y opciones de ejecución.
- **Retorno:** Iterador asíncrono de resultados.
- **Errores:** Workflow desconocido o parámetro requerido ausente producen un rechazo durante iteración.
- **Permisos:** El modo AI controla sus llamadas de herramientas; el modo deterministic ejecuta primitivas del host directamente y no aplica los flags de ai.permissions. Acepta únicamente workflows y parámetros de confianza.
- **Limpieza:** Llama ai.destroy() cuando finalice el runtime propietario.

```js
for await (const step of ai.runWorkflow('mark-ready')) console.log(step);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-20"></span>

## ai.context.configure

Configura selección y presupuesto del contexto.

`ai.context.configure(config): void`

- **Parámetros:** budget, charRatio y sources con store, events y custom.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.context.configure({ budget: 1500, sources: { store: { include: ['cart'] } } });
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-21"></span>

## ai.context.register

Añade un colector de contexto propio.

`ai.context.register(name, config): void`

- **Parámetros:** Nombre y {collector,priority}; collector puede ser asíncrono.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.context.register('build', { collector: () => ({ release: 'demo' }), priority: 'high' });
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-22"></span>

## ai.context.collect

Recoge apps, estado, eventos y colectores configurados.

`ai.context.collect(): Promise<ContextSnapshot>`

- **Parámetros:** Sin parámetros.
- **Retorno:** Promise<ContextSnapshot>
- **Errores:** Los fallos de colectores individuales se registran y no detienen los restantes.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
await ai.context.collect();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-23"></span>

## ai.context.getSnapshot

Devuelve el último contexto recogido sin volver a consultar fuentes.

`ai.context.getSnapshot(): ContextSnapshot | null`

- **Parámetros:** Sin parámetros.
- **Retorno:** ContextSnapshot | null
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.context.getSnapshot();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-24"></span>

## ai.conversation.getHistory

Lee el historial de una conversación.

`ai.conversation.getHistory(namespace?): Message[]`

- **Parámetros:** Namespace; default cuando se omite.
- **Retorno:** Message[]
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.getHistory('help');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-25"></span>

## ai.conversation.clear

Vacía mensajes de una conversación.

`ai.conversation.clear(namespace?): void`

- **Parámetros:** Namespace; no equivale a abortar una petición activa.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.clear('help');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-26"></span>

## ai.conversation.clearAll

Vacía los mensajes de todos los namespaces existentes.

`ai.conversation.clearAll(): void`

- **Parámetros:** Sin parámetros.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.clearAll();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-27"></span>

## ai.conversation.inject

Añade un mensaje al historial sin enviarlo al proveedor.

`ai.conversation.inject(role, content, options?): void`

- **Parámetros:** role, content y {namespace}.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.inject('user', 'Necesito ayuda con el catálogo', { namespace: 'help' });
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-28"></span>

## ai.conversation.getNamespaces

Enumera conversaciones creadas.

`ai.conversation.getNamespaces(): string[]`

- **Parámetros:** Sin parámetros.
- **Retorno:** string[]
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.getNamespaces();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-29"></span>

## ai.conversation.deleteNamespace

Aborta y elimina un namespace.

`ai.conversation.deleteNamespace(namespace): void`

- **Parámetros:** Nombre exacto.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.conversation.deleteNamespace('help');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-30"></span>

## ai.permissions.configure

Actualiza flags booleanos reconocidos de IA.

`ai.permissions.configure(flags): void`

- **Parámetros:** Objeto de flags; ignora nombres desconocidos y valores que no sean booleanos.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.permissions.configure({ executeActions: true, network: false });
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-31"></span>

## ai.permissions.check

Comprueba si un flag de IA está habilitado.

`ai.permissions.check(permission): boolean`

- **Parámetros:** Nombre del permiso; desconocido produce false.
- **Retorno:** boolean
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.permissions.check('executeActions');
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-32"></span>

## ai.permissions.getPermissions

Entrega una copia de los flags de IA.

`ai.permissions.getPermissions(): Record<string, boolean>`

- **Parámetros:** Sin parámetros.
- **Retorno:** Record<string, boolean>
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.permissions.getPermissions();
```

Una copia de flags no concede autorización a una aplicación scoped.

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-33"></span>

## ai.permissions.setAllowedDomains

Reemplaza los dominios permitidos para transporte controlado por IA.

`ai.permissions.setAllowedDomains(domains): void`

- **Parámetros:** Lista de strings; filtra entradas inválidas.
- **Retorno:** void
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.permissions.setAllowedDomains(["api.example.com"]);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-34"></span>

## ai.tools

Describe las acciones en formato de herramientas.

`ai.tools(): ToolSchema[]`

- **Parámetros:** Sin parámetros.
- **Retorno:** ToolSchema[]
- **Errores:** Puede inicializar el subsistema si todavía no está listo; los métodos que solo leen no realizan solicitudes al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.tools();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-35"></span>

## ai.expose

Registra las acciones en navigator.modelContext cuando el navegador lo ofrece.

`ai.expose(): Promise<boolean>`

- **Parámetros:** Sin parámetros; integración experimental de WebMCP.
- **Retorno:** Promise<boolean>
- **Errores:** Devuelve false sin navigator.modelContext; captura errores de registro individuales. true no garantiza que todas las herramientas quedaran registradas.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
await ai.expose();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-36"></span>

## ai.confirmTool

Acepta una confirmación pendiente de herramienta.

`ai.confirmTool(confirmationId): void`

- **Parámetros:** Identificador emitido por el flujo de confirmación.
- **Retorno:** void
- **Errores:** Si la instancia no está inicializada retorna sin inicializarla; no ejecuta una solicitud al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.confirmTool(confirmationId);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-37"></span>

## ai.rejectTool

Rechaza una confirmación pendiente de herramienta.

`ai.rejectTool(confirmationId): void`

- **Parámetros:** Identificador emitido por el flujo de confirmación.
- **Retorno:** void
- **Errores:** Si la instancia no está inicializada retorna sin inicializarla; no ejecuta una solicitud al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.rejectTool(confirmationId);
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-38"></span>

## ai.getStats

Resume los módulos y contadores del coordinador de IA.

`ai.getStats(): object`

- **Parámetros:** Sin parámetros.
- **Retorno:** {initialized:false} o un objeto con initialized:true y estadísticas de los módulos.
- **Errores:** Sin inicializar devuelve {initialized:false}; no inicializa módulos.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El propietario del coordinador llama ai.destroy() al cerrar.

```js
ai.getStats();
```

Referencia: `src/ai/wu-ai.js`.

<span class="section-anchor" id="section-39"></span>

## ai.destroy

Aborta conversaciones, retira triggers y libera módulos del coordinador.

`ai.destroy(): void`

- **Parámetros:** Sin parámetros.
- **Retorno:** void
- **Errores:** Si la instancia no está inicializada retorna sin inicializarla; no ejecuta una solicitud al proveedor.
- **Permisos:** La política de IA es independiente de los grants de microfrontends. Configura solo las operaciones necesarias.
- **Limpieza:** El objeto puede volver a inicializarse; los recursos de la ejecución anterior se liberan.

```js
ai.destroy();
```

Referencia: `src/ai/wu-ai.js`.

En flujos deterministas de 4.0, los pasos `emit` requieren `emitEvents` y no pueden dirigirse a eventos `wu:`, `system:` o `app:`. Los pasos `setState` requieren `writeStore`. Estos flags siguen siendo controles IA del host, independientes de los grants técnicos de las apps.