Saltar al contenido principal

Configuración

Daimon se configura por completo con variables de entorno. Cada variable se resuelve en el mismo orden: gana el entorno del proceso, y todo lo que no esté ahí cae al archivo de entorno en ~/.daimon/env. La ubicación del archivo se puede cambiar con DAIMON_ENV_FILE.

El archivo de entorno existe porque los hooks corren con el entorno que el proceso host haya heredado — un agente lanzado desde la GUI no tiene perfil de shell, así que los exports del shell no son un canal confiable. Su formato es líneas KEY=VALUE; se toleran un export inicial, comillas alrededor, líneas en blanco y comentarios #. Mantenlo en chmod 600 — puede contener API keys.

daimon configure gestiona las perillas del backend LLM (mira Backend LLM) y las escribe en ~/.daimon/env. Todo lo demás se configura editando ese archivo o exportando la variable.

Las variables booleanas aceptan 1, true, yes u on como verdaderos (sin distinción de mayúsculas donde se indica). Unas pocas usan convenciones distintas — interruptores de apagado que están activos salvo que valgan 0, o flags por presencia — y se señalan en la columna "Qué hace".

Las perillas internas de ajuste de la serialización (umbrales de chunking, solapamiento, concurrencia, tamaño de grupo de merge) deliberadamente no se documentan aquí — son defaults de carga calibrados contra comportamiento medido, no configuración de usuario.

Núcleo

VariableDefaultQué hace
DAIMON_DISABLEoffInterruptor de apagado. Cuando es verdadero, cada hook se vuelve un no-op — sin captura, sin briefing.
DAIMON_ENV_FILE~/.daimon/envRuta del archivo de entorno que respalda a todas las demás variables. Se lee solo del entorno del proceso (nombra al archivo, así que no puede vivir dentro de él).
DAIMON_PROJECT_DIRsin definirDirectorio de trabajo de la sesión que se briefea o serializa, usado para enrutar checkpoints por proyecto. Los hooks pasan el cwd del host a través de ella; sin definir significa proyecto desconocido y daimon cae al puntero global.
DAIMON_MIN_MESSAGES10Conteo mínimo de mensajes para que una sesión valga la pena serializar. Las sesiones más cortas se omiten.
DAIMON_TIMEOUT420Presupuesto total de serialización en segundos, compartido entre reintentos (los timeouts de socket por intento se limitan al presupuesto restante). Las llamadas reales de serialize/merge en backends gateway y CLI corren 74s–25min; mantén ≥420 o las llamadas lentas y los reintentos no caben.
DAIMON_HUNG_AFTER1800Segundos tras los cuales un proceso de serialización sin línea de resultado se trata como colgado/matado en lugar de aún corriendo. El default de 30 min queda con margen sobre una corrida lenta (las serializaciones en producción toman 4–25 min).

Almacén de checkpoints y GC

VariableDefaultQué hace
DAIMON_CHECKPOINT_DIR~/.daimon/checkpointsRaíz del almacén de checkpoints por sesión.
DAIMON_CHECKPOINT_KEEP100Cuántos archivos de checkpoint por sesión retener (los N más nuevos). Los más viejos se recolectan tras una escritura exitosa. 0 desactiva el GC por completo (conservar para siempre).
DAIMON_CHECKPOINT_HISTORY3Cuántos punteros de checkpoint retener por directorio (latest.json más prev-1prev-(N-1)), para que una serialización fallida pueda caer a un puntero previo. Mínimo 1 (solo latest).
DAIMON_GC_PIN_IMPORTANCE9Umbral de importancia de ítem que fija un archivo de checkpoint contra el GC: un archivo cuya importancia máxima de ítem alcanza este valor sobrevive fuera de la ventana de los N más nuevos. 0 desactiva el fijado (ventana de recencia pura); valores sobre 10 se recortan a 10.

Arrastre (carry)

Arrastre determinista de ítems sin resolver entre sesiones.

VariableDefaultQué hace
DAIMON_CARRYonInterruptor maestro del arrastre. Activo salvo que valga exactamente 0 (cualquier otro valor lo mantiene activo).
DAIMON_CARRY_FLOOR0.05Peso efectivo mínimo para que un ítem arrastrado siga arrastrándose. Con el default, las decisiones expiran en ~5–6 semanas (graduado por importancia) y las preguntas abiertas escaladas viven ~3–4 meses.
DAIMON_CARRY_MAX8Tope de ítems arrastrados por tipo (los ítems nativos nunca cuentan contra él ni se descartan). Mínimo 1.

Briefing

VariableDefaultQué hace
DAIMON_BRIEF_MAX_TOKENS3000Presupuesto de tokens para el briefing inyectado, estimado como len(text)//4 (sin dependencia de tokenizador). 0 = sin límite.
DAIMON_MAX_BRIEFING_DECISIONS10Tope de decisiones mostradas en el briefing (solo vista de renderizado — el checkpoint las conserva todas). 0 = sin límite.
DAIMON_BRIEF_GLOBAL_FALLBACKsolo encabezadoControla el fallback al puntero global entre proyectos cuando un proyecto no tiene checkpoint propio. El default muestra solo un encabezado; ponlo en full (o 1) para inyectar el cuerpo foráneo completo.
DAIMON_STALE_DAYS7.0Umbral de edad (días) tras el cual el sello efectivo de última verificación de un ítem arrastrado (su last_verified, si no el último evento de resolutions.jsonl, si no first_seen) está lo bastante desactualizado para que brief lo advierta. 0 advierte en cada ítem arrastrado.
DAIMON_PLAINoffCuando es verdadero (sin distinción de mayúsculas), fuerza salida de texto plano — desactiva las tablas/paneles enriquecidos en status, brief y --help.
NO_COLORsin definirPor presencia, según la convención NO_COLOR: si la variable está definida con cualquier valor (incluso vacío), la salida enriquecida se desactiva.

Recall

VariableDefaultQué hace
DAIMON_RECALL_DB~/.daimon/recall.dbUbicación del índice derivado de recall (SQLite FTS). Nunca es fuente de verdad — es seguro borrarlo en cualquier momento; recall lo reconstruye escaneando los directorios de checkpoints y de equipo.
DAIMON_RECALL_SEEN_DIR~/.daimon/recall_seenEstado de enfriamiento de sugerencias por sesión para que un tema repetido nunca se re-inyecte. Desechable — borrarlo solo reinicia los enfriamientos.

Memoria de equipo

Mirror de memoria compartida opt-in. Mira memoria de equipo para el flujo completo.

VariableDefaultQué hace
DAIMON_TEAMoffCuando es verdadero, refleja cada checkpoint en el directorio de equipo compartido para que brief --team pueda mostrar a los compañeros. Regula escrituras solamente — las lecturas del directorio de equipo siempre están permitidas. Un remoto sincronizado exige además que el proyecto esté en su allowlist de alcance (mira team.md); los proyectos fuera de alcance se reflejan solo al directorio local.
DAIMON_AUTHORuser.name de git, luego el usuario del SOIdentidad de autor de equipo usada para separar tus checkpoints. Cae a git config user.name, luego al usuario del SO, luego a unknown.
DAIMON_TEAM_DIR~/.daimon/teamRaíz del mirror de memoria de equipo compartida.
DAIMON_TEAM_PROJECTsin definirRuta lógica de proyecto explícita para las sesiones de esta máquina (relativa, p. ej. core/api-gateway). Prevalece sobre el mapeo de daimon-team.toml del sidecar y sobre el fallback derivado del origin al enrutar checkpoints bajo projects/.
DAIMON_TEAM_RETENTION_DAYS365Ventana de edad al leer: los checkpoints de compañeros más viejos que esta cantidad de días se omiten al leer. 0 = conservar todos. Nunca borra físicamente de la rama compartida de solo-anexado.
DAIMON_TEAM_APPLY_FORGEToffConsentimiento permanente para que el tombstone de olvido publicado por un COMPAÑERO reescriba los checkpoints propios de esta máquina. NO alcanza por sí solo — el borrado además exige el daimon team sync --apply-forget escrito a mano, porque un daimon team sync pelado se lanza en segundo plano al iniciar la sesión. Por defecto apagado: un tombstone ajeno siempre suprime el valor al leer y en el índice, pero borrar estado local a partir del hash de otra persona es una decisión que se toma a conciencia — la rama compartida es de solo-anexado, así que no hay vuelta atrás.

Receipts

Receipts de procedencia firmados, opt-in (#204). Al habilitarlos, cada checkpoint se empareja con un receipt de vinculación local de vitni: una declaración firmada con Ed25519 que vincula los bytes exactos en disco del checkpoint (outputs_hash) con su transcript de origen (inputs_hash), escrita en un archivo lateral <session>.receipt. Esto hace detectable una edición posterior al archivo del checkpoint. Los receipts son totalmente válidos offline — nada sale de la máquina.

Cada paso es fail-open: un CLI ausente, un openssl ausente, un timeout o una salida mala registran una línea en serialize.log y se continúa sin receipt — una falla de receipts nunca bloquea ni hace fallar una serialización o un briefing. Verifica un checkpoint bajo demanda con daimon verify-receipt [session]; al momento del briefing, un checkpoint de la era de receipts cuyo receipt falta o ya no coincide con sus bytes tiene sus etiquetas ✓ verbatim degradadas con una nota visible.

La derivación de la llave pública prefiere el comando keygen del CLI de vitni (vitni 0.5.0+) y cae a openssl en CLIs más viejos o ante un probe fallido — así en macOS, donde el LibreSSL de Apple no tiene Ed25519 en openssl pkey, los receipts funcionan una vez instalado vitni ≥ 0.5.0, sin necesidad de un openssl con Ed25519.

VariableDefaultQué hace
DAIMON_RECEIPTSoffCuando es verdadero, mintea un receipt firmado junto a cada checkpoint. Off por defecto — un subproceso nuevo por serialización es opt-in.
DAIMON_VITNI_CLIvitni-verify (en el PATH)El CLI verificador de vitni usado para firmar/verificar. Una ruta o un nombre resuelto en el PATH. Contrato: <cli> <command> con un objeto JSON por stdin y una línea JSON por stdout.
DAIMON_KEYS_DIR~/.daimon/keysDónde viven la semilla de firma Ed25519 (signing.seed, modo 0600, auto-creada en el primer minteo) y la llave pública cacheada (signing.pub.json).

Hooks de host

Perillas de throttle de serialización para hosts sin un evento limpio de fin de sesión. Mira Hosts para la configuración por host.

VariableDefaultQué hace
DAIMON_CODEX_SERIALIZE_ON_STOPonSi el hook Stop de Codex serializa en absoluto. Activo salvo que valga 0, false, no u off (sin distinción de mayúsculas).
DAIMON_CODEX_MIN_SERIALIZE_INTERVAL300Segundos mínimos entre lanzamientos de serialización de Codex. 0 serializa en cada Stop.
DAIMON_WINDSURF_MIN_SERIALIZE_INTERVAL300Segundos mínimos entre lanzamientos de serialización de Windsurf (Windsurf no tiene evento de fin de sesión, así que la captura corre con este throttle). 0 serializa cada turno.
DAIMON_WINDSURF_FINALIZER_QUIET_SECONDS600Periodo de silencio tras la última actividad de Windsurf antes de que un finalizador con debounce serialice el estado final del transcript de la trayectoria — cubre sesiones cuyos últimos turnos caen dentro de la ventana del throttle. Acepta valores fraccionarios; 0 desactiva el finalizador.
DAIMON_WINDSURF_DIR~/.daimon/windsurfDónde guarda el adaptador de Windsurf los transcripts que acumula. Lo leen tanto el hook que los escribe como las rutas de forget/heal que los borran — cámbialo en un solo sitio, o el que escribe y el que borra dejan de coincidir.
DAIMON_WINDSURF_STATE_DAYS7Ventana de antigüedad para los transcripts de Windsurf que escribe daimon y los volcados unparsed, recogidos por daimon heal. Es un límite de privacidad: un valor olvidado no puede localizarse dentro de la prosa, así que esto acota cuánto tiempo permanece la conversación de origen entre ejecuciones de forget. Con mínimo 1 — a diferencia de los otros ajustes de Windsurf, 0 no lo desactiva.

Operación y diagnóstico

VariableDefaultQué hace
DAIMON_LOG_DIR~/.daimon/logsDirectorio de logs. serialize-crash.log respeta esta variable de los dos lados: los hooks que lanzan el proceso hijo de serialize la leen (del entorno y de este archivo) igual que el CLI, porque daimon forget borra ese archivo y quien escribe y quien borra tienen que coincidir en dónde está. serialize.log es la excepción: los hooks lo siguen escribiendo en ~/.daimon/logs siempre, y este override solo cambia dónde lo busca el CLI (y los tests).
DAIMON_CLAUDE_PROJECTS_DIR~/.claude/projectsDónde viven los transcripts del host (<slug>/<session>.jsonl). Solo-lectura — la auditoría de re-verificación de citas los lee para re-revisar citas almacenadas contra su fuente.
DAIMON_SCAR_HARVESToffCuando es verdadero, borra candidatos de scar (conocimiento negativo) desde el transcript al fin de sesión.

Backend LLM

La serialización necesita un endpoint de LLM. daimon configure es la vía prevista para definir estas variables. La URL, la key y el modelo caen cada uno a una variable LITELLM_* si la forma DAIMON_* no está definida.

VariableDefaultQué hace
DAIMON_LLM_BACKENDautoTransporte: auto (litellm si hay credenciales, si no un CLI de comando nombrado si alguno resuelve), litellm, command o claude-cli. claude-cli es la opción sin configuración: ejecuta un claude encontrado en el PATH con un preset incorporado y no necesita nada más. command requiere DAIMON_LLM_COMMAND.
DAIMON_LLM_BASE_URLhttp://localhost:4000URL del endpoint compatible con OpenAI (se recorta la barra final). Cae a LITELLM_BASE_URL.
DAIMON_LLM_API_KEYsin definirAPI key del endpoint. Cae a LITELLM_API_KEY.
DAIMON_LLM_MODELsin definirNombre de modelo a enviar. Cae a LITELLM_MODEL.
DAIMON_LLM_TEMPERATURE0.0Temperatura de muestreo de cada llamada de chat. 0.0 para extracción determinista; algunos upstreams rechazan cualquier valor que no sea uno fijo.
DAIMON_LLM_FALLBACKonCuando el backend primario falla, cae automáticamente al comando de rescate (DAIMON_LLM_COMMAND_FALLBACK). Aplica tanto a un primario litellm como a uno command. Ponlo en 0 para desactivarlo.
DAIMON_FALLBACK_MIN_SECONDSDAIMON_TIMEOUTPresupuesto mínimo garantizado al comando de rescate al entrar. El primario pudo haber agotado el deadline compartido reintentando la misma falla que el rescate existe para resolver, lo que lo mataría al llegar; un presupuesto restante sano nunca se recorta.
DAIMON_LLM_STREAMonTransmite la respuesta de litellm para que el timeout del socket acote el intervalo entre frames y no la longitud total de la respuesta. Sin esto, una respuesta larga dispara el timeout y reintenta desde cero. Ponlo en 0 para desactivarlo.
DAIMON_LLM_NO_CACHEoffCuando es verdadero, evita el cache de respuestas del gateway por request — necesario cuando una respuesta mala cacheada fija una falla o cuando las corridas deben ser estadísticamente independientes.
DAIMON_LLM_BRIEFINGoffCuando es verdadero, renderiza el briefing vía LLM en lugar de la plantilla determinista.
DAIMON_LLM_COMMANDsin definirInvocación completa del CLI para el backend command (binario + modelo + flags). Obligatoria para command, y obligatoria para que un claude en el PATH sea usado por cualquier backend que no sea claude-cli.
DAIMON_LLM_COMMAND_OUTPUTsin definirCómo extraer el texto del asistente del stdout del comando: text (stdout crudo) o json:<key> (parsear JSON, leer <key>).
DAIMON_LLM_COMMAND_INPUTstdinCómo llega el prompt al backend de comando: stdin (por tubería), arg (anexado como último elemento de argv) o file:<flag> (escrito a un archivo temporal, luego se anexa <flag> <path>). Un valor no reconocido registra una advertencia y cae a stdin.
DAIMON_LLM_COMMAND_FALLBACKsin definirEl único CLI de rescate, usado cuando el backend primario falla. Sirve tanto para un primario litellm como para uno command, que antes no tenía ninguna dirección de rescate. Un solo fallback, nunca una cadena: si el primario y este fallan, la causa casi siempre es del entorno, y un tercer CLI gasta presupuesto para llegar al mismo error mientras hace que la instalación parezca más protegida de lo que está. Si no se define, un primario litellm sigue cayendo a DAIMON_LLM_COMMAND como antes.
DAIMON_LLM_COMMAND_FALLBACK_OUTPUTsin definirEspecificación de salida del CLI de rescate, misma gramática que DAIMON_LLM_COMMAND_OUTPUT. Se lleva por separado porque el rescate es otro binario.
DAIMON_LLM_COMMAND_FALLBACK_INPUTstdinEspecificación de entrada del CLI de rescate, misma gramática que DAIMON_LLM_COMMAND_INPUT.
Qué proceso recibe tu transcripción

Un binario claude que simplemente esté en el PATH no se adopta automáticamente. Serializar envía la transcripción completa de la sesión al CLI configurado, así que ese CLI debe nombrarse: o DAIMON_LLM_COMMAND, o DAIMON_LLM_BACKEND=claude-cli para optar por el preset incorporado.

Antes bastaba con dejar DAIMON_LLM_COMMAND sin definir y tener un claude en cualquier parte del PATH, tanto para instalaciones en auto como para la ruta de rescate de litellm. Si dependías de eso, definí una de las dos variables de arriba. daimon configure nombra el binario resuelto y su ruta para que puedas ver exactamente cuál está en uso.

Chunking del serializador

Las sesiones largas se serializan en chunks solapados cuyos checkpoints parciales se fusionan jerárquicamente. Los defaults vienen de mediciones de campo; solo importan si tus sesiones son rutinariamente muy largas.

VariableDefaultQué hace
DAIMON_CHUNK_LINES1200Conteo de líneas del transcript renderizado sobre el cual la serialización cambia a modo chunked.
DAIMON_CHUNK_OVERLAP100Líneas de solapamiento entre chunks adyacentes, para que un ítem que cruza un borde sea visto entero por al menos un chunk.
DAIMON_CHUNK_CONCURRENCY4Llamadas LLM de serialización de chunks en paralelo. Mínimo 1 (secuencial).
DAIMON_MERGE_GROUP_SIZE3Máximo de checkpoints parciales fusionados por llamada de merge jerárquico. Mínimo 2. Bájalo a 2 si las llamadas de merge mueren en un gateway con techo de request del lado del servidor (los modelos de razonamiento generando merges de 3 vías pueden excederlo; subir DAIMON_TIMEOUT no ayuda — el kill es del lado del servidor).