# Partners — un agente para cada uno de tus clientes

> Con ghosty partner le das un asistente a cada negocio que usa tu producto — un agente compartido que sólo usa tu MCP, memoria por cliente y credenciales para tu servidor.

URL: https://www.ghosty.studio/docs/cli/partners

`ghosty partner` es para cuando **tu producto** le quiere dar un asistente a cada uno de sus clientes. Tú tienes un espacio de partner; cada negocio que usa tu producto es un **tenant** (lo identificas con tu propio `externalId`) y cada persona que le escribe a ese negocio es un **usuario final** (`groupId`).

- Hay **un solo agente compartido**, en modo **solo-MCP**: no tiene máquina ni disco; sus únicas herramientas son las de tus servidores MCP por HTTPS.
- Cada turno lleva un **token de corta vida** que Ghosty le pasa a tu MCP. Nunca va al prompt, a la memoria ni a los registros.
- La **memoria es por tenant y usuario final**: un negocio nunca ve la de otro.

## Tu espacio de partner

Estos comandos los corre la dueña del espacio, con su sesión (`ghosty login`).

```bash
ghosty partner ls                                  # tus espacios de partner
ghosty partner enable <espacio>                    # convierte uno de tus espacios en espacio de partner
ghosty partner credentials ls                      # credenciales del servidor (sin secretos)
ghosty partner credentials create --label produccion   # emite una: el secreto sale UNA vez
ghosty partner credentials rotate gpk_… --grace 60     # secreto nuevo, mismo keyId
ghosty partner credentials revoke gpk_…            # la revoca (idempotente)
ghosty partner audit                               # quién hizo qué y cuándo
```

- `create` imprime `GHOSTY_PARTNER_KEY=gpk_…` y `GHOSTY_PARTNER_SECRET=gps_…`. Guárdalas en tu servidor en ese momento: el secreto no se vuelve a enseñar.
- `rotate --grace MIN` deja válido el secreto anterior esos minutos (default 60) para que cambies tu servidor sin cortes.
- `creds` es alias de `credentials`; `revoke` también se escribe `rm`.
- Si tienes más de un espacio de partner, elige cuál con `--workspace <slug>` en cualquier comando.

## El agente compartido

```bash
ghosty partner agent get                           # la plantilla y su versión
ghosty partner agent apply --file agent.json       # la crea o la actualiza (idempotente)
```

`agent.json` lleva sólo lo que quieras cambiar:

```json
{
  "name": "Nik",
  "engine": "deepseek",
  "prompt": "Eres el asistente de {negocio}…",
  "mcp": [
    { "name": "agenda", "url": "https://api.tu-producto.com/mcp", "headers": { "Authorization": "Bearer ${turn.token}" } }
  ]
}
```

Sólo servidores MCP por HTTPS. En los headers no van llaves fijas: sólo los placeholders `${turn.token}` y `${tenant.externalId}`. Si nada cambió, no se crea una versión nueva.

## Tenants

```bash
ghosty partner tenants ls
ghosty partner tenants get org_123
ghosty partner tenants set org_123 --config '{"name":"Spa Luna","timezone":"America/Mexico_City"}'
ghosty partner tenants rm org_123                  # borra su configuración Y su memoria
```

Un tenant es sólo configuración (`name`, `tone`, `timezone`, `locale`, `notes`): no tiene máquina propia. El primer turno de un `externalId` nuevo también lo da de alta.

## Probar un turno

```bash
ghosty partner try org_123 "¿qué citas tengo hoy?"
ghosty partner try org_123 "¿y mañana?" --group cliente-42 --turn-token <token-de-corta-vida>
```

- `--group` es el usuario final (default `cli`); cada uno tiene su propia conversación.
- `--turn-token` es el token que Ghosty le pasará a tu MCP como `${turn.token}`. Aquí `--token` también funciona y significa lo mismo (no es tu sesión).
- Con `--json` sale una línea por evento del turno (`chunk`, `tool`, `error`…).

## Probar como tu servidor

Con la credencial en el entorno, el CLI firma cada petición igual que lo hará tu backend (HMAC de `${ts}.${keyId}.${body}`):

```bash
export GHOSTY_PARTNER_KEY=gpk_…
export GHOSTY_PARTNER_SECRET=gps_…
ghosty partner agent get
ghosty partner try org_123 "hola"
```

Así funcionan `agent`, `tenants` y `try`. `ls`, `enable`, `credentials` y `audit` siempre usan tu sesión: una credencial no puede fabricar otras.
