Ir al contenido

Deploy y entornos

Ventana de terminal
cd emaemi
npm install
npm run dev # Wrangler dev server
npm run typecheck # TypeScript check
npm test # Vitest (unit + integration)
npm run deploy # wrangler deploy

Cloudflare Workers (single worker). Sin assets estáticos: emaemi expone sólo API. Custom domain emi.emahealth.io configurado.

POST /api/chat # Endpoint principal (auth + access + audit + agent)
GET /api/health # { status, service, version }

Set vía wrangler secret put <NOMBRE>. Agrupados por propósito:

SecretPara qué
ANTHROPIC_API_KEYLlamadas a Claude (requerido)
SecretProducto
EMAHEALTH_API_KEYemahealth.io
EMACLINIC_API_KEYemaclinic
EMALAB_API_KEYemalab
EMAVAULT_API_KEYemavault
EMAPATH_API_KEYemapath
EMAWELL_API_KEYemawell
SecretPara qué
AIDBOX_BASE_URLURL base del servidor Aidbox
AIDBOX_SECRET_KEY_V1Master key AES-GCM (32 bytes base64) para decryptar credenciales per-tenant

Supabase emashared (catálogo + activación + audit)

Sección titulada «Supabase emashared (catálogo + activación + audit)»
SecretPara qué
EMASHARED_SUPABASE_URLProyecto emahub donde viven las tablas Wave 3
EMASHARED_SUPABASE_SERVICE_KEYService role para escribir audit log y leer activación

Supabase Vault (analytics + sales lead management)

Sección titulada «Supabase Vault (analytics + sales lead management)»
SecretPara qué
VAULT_SUPABASE_URLMismo proyecto emahub, distinto schema
VAULT_SUPABASE_KEYService role para tools de AnalyticsAgent + lead upsert de SalesAgent

Deprecated (Wave 3 mantiene un release; Wave 4 los elimina)

Sección titulada «Deprecated (Wave 3 mantiene un release; Wave 4 los elimina)»

FHIR_SERVER_URL, FHIR_CLIENT_ID, FHIR_CLIENT_SECRET, FHIR_TOKEN_URL. Reemplazados por el patrón per-tenant via tenant_aidbox_credentials.

CódigoCausa
400Body inválido o falta X-Tenant-Id requerido
401API key inválida
403App inactiva para el tenant / sin row en tenant_emi_access / rate limited
501Agent no implementado (ej. WellnessCoach)
503Error de servicio (Anthropic, Supabase, Aidbox)
GotchaSolución
Wrangler secret put aplica al worker del directorio actualSiempre cd emaemi/ antes de configurar secrets
@anthropic-ai/sdk falla en CF Workers (bundling)Usar fetch nativo + wrapper en lib/claude.ts
Hardcodear URLs en build time complica OpenNext en consumidoresPasar URLs por env vars de runtime
Frontend que llama directo a emaemi sin apiFetch no incluye token SupabaseForzar uso de apiFetch para que el proxy del producto firme la request
Un audit fallido bloqueando la respuestalogInvocation es fail-silent (F006); errors van al logger estructurado
  • Cloudflare Observability habilitado en wrangler.toml.
  • Logger estructurado JSON (lib/logger.ts) para todas las invocaciones, errors y warnings.
  • Cost tracking USD por invocación en emi_invocations.cost_usd.

Vitest. Estructura:

tests/
├── unit/
├── integration/ # gated por env vars (ver abajo)
└── fixtures/
Ventana de terminal
npm test # unit + integration en una pasada
npm run test:integration # solo integration suite

Integration tests requieren:

  • TEST_API_URL (URL del worker en dev/staging)
  • TEST_TENANT_ID
  • TEST_EMASHARED_*

Si las env vars faltan, los integration tests se skippean silenciosamente (CI nunca depende de servicios externos vivos).