Documentation
¶
Overview ¶
Package ingest lee las sesiones de los agentes y las persiste en el Store de nem. La abstracción central es Source: una fuente de sesiones que aísla a nem de CÓMO persiste cada agente. Los agentes que guardan transcripts JSONL (Codex, Claude Code, Antigravity) se adaptan con NewFileSource sobre un Parser puro (archivo → ParsedChat); los de otra naturaleza (opencode y su SQLite) implementan Source directo. La orquestación inserta de forma idempotente.
Index ¶
Constants ¶
const ( RoleUser = "user" RoleAssistant = "assistant" RoleReasoning = "reasoning" RoleTool = "tool" )
Roles con los que se persisten los mensajes. user/assistant son la conversación; reasoning es el razonamiento del agente (thinking/reasoning); tool son las llamadas a herramientas y sus salidas (compactadas).
Variables ¶
This section is empty.
Functions ¶
func DefaultOpencodeDBPath ¶ added in v0.11.0
DefaultOpencodeDBPath devuelve la ruta por defecto de la DB de opencode, honrando XDG_DATA_HOME (opencode usa rutas XDG incluso en Windows).
Types ¶
type Incremental ¶ added in v0.12.0
type Incremental interface {
Source
// ChangedSessions itera solo las sesiones para las que changed(clave,
// huella) devuelve true; las demás se saltan sin leerse. La clave es
// estable por sesión (la ruta del transcript, o db#id si varias sesiones
// comparten archivo).
ChangedSessions(changed func(key, fingerprint string) bool) iter.Seq2[*ParsedChat, error]
}
Incremental es una Source capaz de saltarse las sesiones que no cambiaron desde la última ingesta. Es opcional: una Source que no la implementa se re-lee entera en cada corrida (la inserción igual es idempotente, solo más lenta).
type OpencodeStamp ¶ added in v0.11.0
OpencodeStamp es (id, última actualización) de una sesión de opencode. Lo consume el detector de sesión activa sin conocer el esquema de la DB.
func OpencodeSessionStamps ¶ added in v0.11.0
func OpencodeSessionStamps(dbPath string, since time.Time) ([]OpencodeStamp, error)
OpencodeSessionStamps devuelve las sesiones actualizadas desde `since`, de más nueva a más antigua. dbPath "" usa la ruta por defecto; sin DB devuelve nil sin error (opencode no instalado).
type ParsedChat ¶
type ParsedChat struct {
Chat db.Chat
Messages []db.Message
// CursorKey y Fingerprint identifican la sesión en su fuente y su huella
// al leerla ("" = la fuente no es Incremental). Ingest los registra tras
// persistir la sesión.
CursorKey string
Fingerprint string
}
ParsedChat es el resultado de parsear un archivo de sesión: el chat y sus mensajes, listos para persistir.
type Parser ¶
type Parser interface {
// Source identifica al agente: "codex" | "claude" | "antigravity".
Source() string
// DefaultRoot devuelve el directorio raíz por defecto de las sesiones.
DefaultRoot() (string, error)
// Parse parsea el contenido de un archivo de sesión.
Parse(r io.Reader, sessionPath string) (*ParsedChat, error)
}
Parser convierte un archivo de sesión de un agente en un ParsedChat. Es la abstracción que implementan los agentes con sesiones en archivos (codex, claude, antigravity); se eleva a Source con NewFileSource.
func NewAntigravityParser ¶ added in v0.5.0
func NewAntigravityParser() Parser
NewAntigravityParser crea el parser de sesiones del CLI de Antigravity.
func NewClaudeParser ¶
func NewClaudeParser() Parser
NewClaudeParser crea el parser de sesiones de Claude Code.
func NewCodexParser ¶
func NewCodexParser() Parser
NewCodexParser crea el parser de sesiones de Codex.
type Report ¶
type Report struct {
Source string
Scanned int // sesiones examinadas (archivos o filas, según la fuente)
Chats int
Messages int64
Skipped int
Unchanged int // sesiones saltadas sin parsear (huella igual a la ingestada)
Errors []string
}
Report resume el resultado de una corrida de ingesta.
type Source ¶ added in v0.11.0
type Source interface {
// Name identifica al agente: "codex" | "claude" | "antigravity" | "opencode".
Name() string
// Sessions itera las sesiones de la fuente. Cada elemento es una sesión
// parseada o un error de esa sesión; los errores por sesión no abortan la
// iteración. Una fuente cuyo agente no está instalado itera vacío.
Sessions() iter.Seq2[*ParsedChat, error]
}
Source es una fuente de sesiones de un agente. Es el seam que desacopla a nem del medio de persistencia de cada agente: Ingest solo conoce esta interfaz, y todo lo específico de un agente (formato, rutas, esquema) vive encapsulado en su Source. Si un agente cambia su forma de persistir, solo cambia su Source.
func NewFileSource ¶ added in v0.11.0
NewFileSource eleva un Parser de archivos a Source. Sin WithRoot usa el DefaultRoot del parser.
func NewOpencodeSource ¶ added in v0.11.0
NewOpencodeSource crea la fuente de sesiones de opencode. WithRoot fuerza la ruta de la DB (útil para tests); sin opciones usa la ruta por defecto.