From 729921e16e4754815a00a9c41cb1a0af753c12b1 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Thu, 4 Jun 2026 23:44:39 +0200 Subject: [PATCH] feat(cybersecurity): auto-commit con 48 cambios Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/settings.local.json | 36 +- .jupyter/collaboration_sessions.json | 7 + .jupyter_ystore.db | Bin 0 -> 585728 bytes docs/capabilities/INDEX.md | 3 +- docs/capabilities/e2e-messaging.md | 97 +++++ docs/capabilities/terminal-capture.md | 86 ++++ docs/capabilities/web-proxy.md | 1 + functions/core/strip_ansi.go | 38 ++ functions/core/strip_ansi.md | 55 +++ functions/core/strip_ansi_test.go | 53 +++ functions/core/text_prefix_delta.go | 23 ++ functions/core/text_prefix_delta.md | 63 +++ functions/core/text_prefix_delta_test.go | 87 ++++ .../e2e_messaging_crypto_test.go | 304 ++++++++++++++ functions/cybersecurity/generate_identity.go | 40 ++ functions/cybersecurity/generate_identity.md | 53 +++ functions/cybersecurity/open_aead.go | 29 ++ functions/cybersecurity/open_aead.md | 62 +++ functions/cybersecurity/open_key_box.go | 32 ++ functions/cybersecurity/open_key_box.md | 58 +++ functions/cybersecurity/seal_aead.go | 31 ++ functions/cybersecurity/seal_aead.md | 60 +++ functions/cybersecurity/seal_key_box.go | 28 ++ functions/cybersecurity/seal_key_box.md | 56 +++ functions/cybersecurity/sign_ed25519.go | 10 + functions/cybersecurity/sign_ed25519.md | 45 ++ functions/cybersecurity/verify_ed25519.go | 10 + functions/cybersecurity/verify_ed25519.md | 51 +++ functions/infra/pty_capture_idle.go | 149 +++++++ functions/infra/pty_capture_idle.md | 83 ++++ functions/infra/pty_capture_idle_test.go | 74 ++++ functions/infra/pty_capture_stream.go | 176 ++++++++ functions/infra/pty_capture_stream.md | 100 +++++ functions/infra/pty_capture_stream_test.go | 120 ++++++ functions/tui/parse_claude_tui.go | 390 ++++++++++++++++++ functions/tui/parse_claude_tui.md | 67 +++ functions/tui/parse_claude_tui_test.go | 214 ++++++++++ functions/tui/vt_render.go | 54 +++ functions/tui/vt_render.md | 64 +++ functions/tui/vt_render_test.go | 114 +++++ go.mod | 2 + go.sum | 4 + .../cybersecurity/tee_anthropic_sse.md | 95 +++++ .../cybersecurity/tee_anthropic_sse.py | 278 +++++++++++++ .../tests/test_tee_anthropic_sse.py | 283 +++++++++++++ types/cybersecurity/identity.md | 25 ++ types/tui/claude_tui_parse.md | 27 ++ types/tui/claude_turn.md | 36 ++ 48 files changed, 3765 insertions(+), 8 deletions(-) create mode 100644 .jupyter/collaboration_sessions.json create mode 100644 .jupyter_ystore.db create mode 100644 docs/capabilities/e2e-messaging.md create mode 100644 docs/capabilities/terminal-capture.md create mode 100644 functions/core/strip_ansi.go create mode 100644 functions/core/strip_ansi.md create mode 100644 functions/core/strip_ansi_test.go create mode 100644 functions/core/text_prefix_delta.go create mode 100644 functions/core/text_prefix_delta.md create mode 100644 functions/core/text_prefix_delta_test.go create mode 100644 functions/cybersecurity/e2e_messaging_crypto_test.go create mode 100644 functions/cybersecurity/generate_identity.go create mode 100644 functions/cybersecurity/generate_identity.md create mode 100644 functions/cybersecurity/open_aead.go create mode 100644 functions/cybersecurity/open_aead.md create mode 100644 functions/cybersecurity/open_key_box.go create mode 100644 functions/cybersecurity/open_key_box.md create mode 100644 functions/cybersecurity/seal_aead.go create mode 100644 functions/cybersecurity/seal_aead.md create mode 100644 functions/cybersecurity/seal_key_box.go create mode 100644 functions/cybersecurity/seal_key_box.md create mode 100644 functions/cybersecurity/sign_ed25519.go create mode 100644 functions/cybersecurity/sign_ed25519.md create mode 100644 functions/cybersecurity/verify_ed25519.go create mode 100644 functions/cybersecurity/verify_ed25519.md create mode 100644 functions/infra/pty_capture_idle.go create mode 100644 functions/infra/pty_capture_idle.md create mode 100644 functions/infra/pty_capture_idle_test.go create mode 100644 functions/infra/pty_capture_stream.go create mode 100644 functions/infra/pty_capture_stream.md create mode 100644 functions/infra/pty_capture_stream_test.go create mode 100644 functions/tui/parse_claude_tui.go create mode 100644 functions/tui/parse_claude_tui.md create mode 100644 functions/tui/parse_claude_tui_test.go create mode 100644 functions/tui/vt_render.go create mode 100644 functions/tui/vt_render.md create mode 100644 functions/tui/vt_render_test.go create mode 100644 python/functions/cybersecurity/tee_anthropic_sse.md create mode 100644 python/functions/cybersecurity/tee_anthropic_sse.py create mode 100644 python/functions/cybersecurity/tests/test_tee_anthropic_sse.py create mode 100644 types/cybersecurity/identity.md create mode 100644 types/tui/claude_tui_parse.md create mode 100644 types/tui/claude_turn.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json index b909c339..c077548d 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -4,8 +4,14 @@ { "matcher": "Bash", "hooks": [ - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_registry_mcp.sh" }, - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_fn_match.sh" } + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_registry_mcp.sh" + }, + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_fn_match.sh" + } ] } ], @@ -13,23 +19,39 @@ { "matcher": "Bash|Edit|Write|MultiEdit|mcp__registry__.*", "hooks": [ - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_call_monitor.sh" } + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_call_monitor.sh" + } ] }, { "matcher": "Edit|Write|MultiEdit|mcp__registry__fn_create_function", "hooks": [ - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_capability_tag_gate.sh" } + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_capability_tag_gate.sh" + } ] } ], "UserPromptSubmit": [ { "hooks": [ - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_capabilities_inject.sh" }, - { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_registry_first_reminder.sh" } + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_capabilities_inject.sh" + }, + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/hook_registry_first_reminder.sh" + } ] } ] - } + }, + "enabledMcpjsonServers": [ + "registry", + "jupyter" + ] } diff --git a/.jupyter/collaboration_sessions.json b/.jupyter/collaboration_sessions.json new file mode 100644 index 00000000..84e0be99 --- /dev/null +++ b/.jupyter/collaboration_sessions.json @@ -0,0 +1,7 @@ +{ + "0ea5e69b-9607-4f11-b740-005e835faef6": { + "version": "2.4.0", + "created_at": "2026-06-03T17:52:16.077873+00:00", + "document_version": "2.0.0" + } +} \ No newline at end of file diff --git a/.jupyter_ystore.db b/.jupyter_ystore.db new file mode 100644 index 0000000000000000000000000000000000000000..e9e35aa6b6e0fcf0378e92f37cbce64f45324d60 GIT binary patch literal 585728 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 z�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�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 Ur1d~E#x*AYcFC6(3jA$!Wq46?Vu5X-!TSt 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

5&gT#t}0K1Hr&3}Atgh&y7I^msA%IFG{V@*+Ll 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/docs/capabilities/INDEX.md b/docs/capabilities/INDEX.md index 0c3177e2..4451e000 100644 --- a/docs/capabilities/INDEX.md +++ b/docs/capabilities/INDEX.md @@ -23,7 +23,7 @@ Indice de grupos de capacidades del registry. Cada grupo agrupa >=3 funciones qu | [nlp](nlp.md) | 33 | Extraccion NLP: PDFs, OCR, chunking, GLiNER/GLiREL, dedup, agregacion de entities/relations | | [docker](docker.md) | 38 | Operar Docker desde Go/Bash: build/run/stop, compose, networks, volumes, logs, deploys | | [android](android.md) | 37 | Toolbelt Android desde WSL2: adb, emuladores AVD, APK build/install, Capacitor, logcat | -| [web-proxy](web-proxy.md) | 4 | Captura de trafico HTTP/HTTPS liviana (mitmproxy): proxy con rotacion, navegador proxeado, consulta de capturas. Alternativa ligera a ZAP/Burp | +| [web-proxy](web-proxy.md) | 5 | Captura de trafico HTTP/HTTPS liviana (mitmproxy): proxy con rotacion, navegador proxeado, consulta de capturas, tee del SSE de claude. Alternativa ligera a ZAP/Burp | | [metabase](metabase.md) | 106 | Operar Metabase via API REST: auth, cards, dashboards, collections, snippets, permissions | | [doctor](doctor.md) | 11 | Diagnostico read-only del registry: artefactos, servicios, drift, funciones huerfanas | | [notebook](notebook.md) | 5 | Operar Jupyter Lab colaborativo (discover/read/exec/write/kernel) | @@ -45,6 +45,7 @@ Indice de grupos de capacidades del registry. Cada grupo agrupa >=3 funciones qu | [wireguard](wireguard.md) | 7 | Instalar, configurar, operar y monitorizar mesh WireGuard hub-and-spoke: keygen, hub setup, peer add/revoke, status JSON | | [matrix-mas](matrix-mas.md) | 5 | Migración Synapse→MAS: habilitar MSC3861, verificar login flows, parche .well-known, registro clientes OAuth2, syn2mas | | [mesh-3d](mesh-3d.md) | 3 | Carga y upload a GPU de meshes 3D (OBJ, GLB/glTF 2.0): loaders CPU + mesh_gpu_upload OpenGL | +| [terminal-capture](terminal-capture.md) | 6 | Automatizar y capturar el texto de una CLI/TUI interactiva via PTY headless: spawn+input scripteado (one-shot y streaming), render del layout 2D (emulador VT), strip ANSI, delta por prefijo, y parseo de la TUI de claude a datos | ## Como anadir grupo diff --git a/docs/capabilities/e2e-messaging.md b/docs/capabilities/e2e-messaging.md new file mode 100644 index 00000000..a1ee345c --- /dev/null +++ b/docs/capabilities/e2e-messaging.md @@ -0,0 +1,97 @@ +--- +group: e2e-messaging +description: "Criptografía extremo a extremo para bus de mensajería: identidades duales Ed25519/X25519, distribución de claves de sala con sealed box anónimo, cifrado simétrico AEAD por mensaje, y firma/verificación de mensajes." +functions: + - generate_identity_go_cybersecurity + - seal_aead_go_cybersecurity + - open_aead_go_cybersecurity + - seal_key_box_go_cybersecurity + - open_key_box_go_cybersecurity + - sign_ed25519_go_cybersecurity + - verify_ed25519_go_cybersecurity +--- + +## Funciones del grupo + +| ID | Firma corta | Qué hace | +|---|---|---| +| `generate_identity_go_cybersecurity` | `GenerateIdentity() (Identity, error)` | Genera par Ed25519 (firma) + par X25519 (kex) para un participante | +| `seal_aead_go_cybersecurity` | `SealAEAD(key, plaintext, aad []byte) (nonce, ct []byte, err error)` | Cifra mensaje con ChaCha20-Poly1305, nonce aleatorio por llamada | +| `open_aead_go_cybersecurity` | `OpenAEAD(key, nonce, ct, aad []byte) ([]byte, error)` | Descifra y autentica; error explícito si el tag falla | +| `seal_key_box_go_cybersecurity` | `SealKeyBox(recipientKexPub, secret []byte) ([]byte, error)` | Cifra room key para un destinatario con su X25519 pubkey (sealed box anónimo) | +| `open_key_box_go_cybersecurity` | `OpenKeyBox(kexPub, kexPriv, sealedMsg []byte) ([]byte, error)` | Abre sealed box con el par X25519 propio para recuperar la room key | +| `sign_ed25519_go_cybersecurity` | `SignEd25519(priv, msg []byte) []byte` | Firma determinista Ed25519 (pura, sin I/O) | +| `verify_ed25519_go_cybersecurity` | `VerifyEd25519(pub, msg, sig []byte) bool` | Verifica firma Ed25519 (pura, sin I/O) | + +## Ejemplo canónico end-to-end + +```go +package main + +import ( + "fmt" + "log" + cs "fn-registry/functions/cybersecurity" +) + +func main() { + // 1. Cada participante genera su identidad una sola vez + server, err := cs.GenerateIdentity() + if err != nil { log.Fatal(err) } + user, err := cs.GenerateIdentity() + if err != nil { log.Fatal(err) } + + // 2. Servidor genera room key y la distribuye al usuario cifrada + roomKey := make([]byte, 32) + // ... llenar roomKey con crypto/rand en producción ... + sealed, err := cs.SealKeyBox(user.KexPub, roomKey) + if err != nil { log.Fatal(err) } + + // 3. Usuario recupera la room key + gotKey, err := cs.OpenKeyBox(user.KexPub, user.KexPriv, sealed) + if err != nil { log.Fatal(err) } + + // 4. Usuario cifra un mensaje con la room key + aad := []byte("room:sala-general:seq:1") + nonce, ct, err := cs.SealAEAD(gotKey, []byte("hola sala"), aad) + if err != nil { log.Fatal(err) } + + // 5. Usuario firma el ciphertext para autenticar autoría + sig := cs.SignEd25519(user.SignPriv, ct) + + // 6. Receptor verifica firma y descifra + if !cs.VerifyEd25519(user.SignPub, ct, sig) { + log.Fatal("firma inválida") + } + plain, err := cs.OpenAEAD(gotKey, nonce, ct, aad) + if err != nil { log.Fatal(err) } + fmt.Printf("recibido: %s\n", plain) + _ = server // server.SignPub publicado en directorio de participantes +} +``` + +## Fronteras + +Este grupo cubre las primitivas criptográficas del bus, no el protocolo completo: + +- **No cubre**: transporte (WebSocket, gRPC), gestión de sesiones, ratchet de claves (doble ratchet), persistencia de identidades, revocación de claves. +- **No cubre**: cifrado de archivos adjuntos (usar SealAEAD directamente con una key derivada). +- **No reemplaza**: libsodium ni libolm para implementaciones de producción de Signal/Matrix — estas funciones son el sustrato criptográfico, no el protocolo completo. + +## Prerequisitos + +- `golang.org/x/crypto` ya en `go.mod` (presente en fn-registry). +- `crypto/ed25519` de stdlib (Go 1.13+). +- Identidades persistidas de forma segura (keyring, HSM, archivo cifrado): este grupo no gestiona almacenamiento. + +## Patrón de uso recomendado + +``` +GenerateIdentity() → persiste Identity por participante +SealKeyBox(kexPub, roomKey) → distribuye room key al unirse a sala +OpenKeyBox(kexPub, kexPriv) → recupera room key +SealAEAD(roomKey, msg, aad) → cifra cada mensaje +SignEd25519(signPriv, ct) → autentica autoría sobre ciphertext +VerifyEd25519(signPub, ct) → verifica antes de descifrar +OpenAEAD(roomKey, nonce, ct)→ descifra mensaje verificado +``` diff --git a/docs/capabilities/terminal-capture.md b/docs/capabilities/terminal-capture.md new file mode 100644 index 00000000..5b3420c5 --- /dev/null +++ b/docs/capabilities/terminal-capture.md @@ -0,0 +1,86 @@ +# terminal-capture + +Automatizar una CLI/TUI interactiva y capturar su texto, de forma headless, a través de un +pseudo-terminal (PTY). Cubre el ciclo completo: lanzar el proceso con un TTY real, inyectarle +input scripteado, esperar a que el render se estabilice, y convertir el stream crudo de bytes a +texto plano — bien reconstruyendo el layout 2D (TUIs con cursor absoluto), bien limpiando ANSI +de output secuencial. + +Existe porque muchas CLIs (sobre todo la CLI `claude`) solo entran en su modo interactivo rico +cuando detectan un TTY; un pipe normal las degrada. El PTY es virtual, en memoria: **nunca abre +una ventana de terminal**. + +## Funciones + +| ID | Firma | Qué hace | +|---|---|---| +| `pty_capture_idle_go_infra` | `func PTYCaptureIdle(ctx, name string, args []string, warmup time.Duration, inputs []string, stepDelay, idle, maxDur time.Duration) (string, error)` | Lanza `name args` en un PTY (40×120), espera `warmup`, escribe cada `inputs` separado por `stepDelay`, y captura todos los bytes hasta que pasa `idle` sin output nuevo o se alcanza `maxDur`. Devuelve el stream **crudo** (ANSI intacto). One-shot. | +| `pty_capture_stream_go_infra` | `func PTYCaptureStream(ctx, name string, args []string, warmup time.Duration, inputs []string, stepDelay, snapshotInterval, idle, maxDur time.Duration) (<-chan string, error)` | Igual que `pty_capture_idle` pero emite **snapshots acumulativos** del buffer por un canal cada `snapshotInterval` — para hacer streaming de la TUI mientras renderiza. El consumidor renderiza/parsea cada snapshot. | +| `text_prefix_delta_go_core` | `func PrefixDelta(prev, curr string) string` | Devuelve la parte de `curr` que sigue al prefijo común con `prev` (delta de streaming por snapshots). Pura, compara por runas. Heurística ante reflow. | +| `vt_render_go_tui` | `func VTRender(raw string, rows, cols int) string` | Emula un terminal VT100 de `rows×cols`, alimenta `raw`, y devuelve el estado final de la pantalla como texto plano **con el layout reconstruido** (espacios reales donde el stream tenía movimientos de cursor). Pura. | +| `strip_ansi_go_core` | `func StripANSI(s string) string` | Elimina secuencias ANSI/VT100 y caracteres de control de un stream **secuencial** (logs), preservando `\n`, `\t`, `\r`. Pura. NO reconstruye layout 2D. | +| `parse_claude_tui_go_tui` | `func ParseClaudeTUI(screen string) ClaudeTUIParse` | Parsea la pantalla renderizada de la TUI de `claude` (salida de `vt_render`) y extrae los turnos (user/assistant/tool_use/tool_result) + la respuesta final (`Answer`), equivalente a lo que devolvería `claude -p`. Pura, heurística, específica de la TUI de claude. | + +## Cuándo usar cada limpiador + +El corazón del grupo es `pty_capture_idle` (la captura). Lo que cambia es cómo conviertes el raw a texto: + +| Si la salida es… | Usa | Porque | +|---|---|---| +| Una TUI con posicionamiento absoluto (`claude`, `htop`, `dialog`) | `vt_render_go_tui` (modo screen) | Los "espacios" entre columnas eran movimientos de cursor; sin emular el grid las palabras se pegan (`2newMCPservers`). | +| Output secuencial línea a línea (logs, builds) | `strip_ansi_go_core` (modo stream) | No hay layout 2D que reconstruir; basta quitar los escape codes. | +| Quieres procesar los escape codes tú mismo | (ninguno — usa el raw) | El raw de `pty_capture_idle` ya los conserva. | + +## Ejemplo canónico (end-to-end) + +Capturar la respuesta de la CLI `claude` como texto con layout, en Go: + +```go +import ( + "context" + "time" + "fn-registry/functions/infra" + "fn-registry/functions/tui" +) + +func main() { + ctx := context.Background() + // Teclear el prompt y pulsar Enter como pasos separados: un "\r" pegado al + // texto lo trata claude como newline literal, no como submit. + inputs := []string{"resume el README en 3 lineas", "\r"} + raw, _ := infra.PTYCaptureIdle(ctx, "claude", nil, + 4*time.Second, // warmup: deja cargar la TUI + inputs, 600*time.Millisecond, + 4*time.Second, // idle: corta tras 4s de silencio + 60*time.Second) // maxDur: tope duro + screen := tui.VTRender(raw, 40, 120) // reconstruye el layout 2D + print(screen) +} +``` + +La app `claude_extract` (`apps/claude_extract`) empaqueta exactamente este flujo como CLI, con +modos `screen|stream|raw`, `--exec` para pipear a otro proceso, y `--cwd` para saltar el diálogo +de arranque de claude. Es el consumidor de referencia del grupo. + +La app `claude_pipe` (`apps/claude_pipe`) va un paso más allá: añade `parse_claude_tui_go_tui` +al final del pipeline para devolver la respuesta de claude **como dato** con el mismo shape que +`claude -p --output-format json` (`--format json|text|turns`). Es la alternativa "parsea la TUI" +a `claude -p`, para cuando se quiere expresamente ir a través de la TUI en vez del stream-json. + +## Fronteras + +- **No es `claude -p`**: este grupo captura la TUI real (lo que se ve). Para interacción programática + limpia con la CLI `claude`, usa `claude_stream_go_core` (`claude -p --output-format stream-json`). +- **Linux/Unix only**: PTY POSIX (`creack/pty`). No Windows. +- **Sin color**: `vt_render` reconstruye texto y layout, no atributos de color. +- **Idle es heurístico**: TUIs con render periódico (spinners, relojes) no disparan el idle y caen + al `maxDur`. Para `claude` el spinner se detiene al terminar la respuesta, así que corta bien. +- **Dimensiones fijas 40×120**: el render debe usar el mismo tamaño que la captura o el wrapping no + cuadra. + +## Notas + +- Las dos funciones de limpieza son **puras**; solo `pty_capture_idle` es impura (lanza procesos). + Puras en los bordes, impura en el centro de la captura. +- `pty_capture_idle` no fija el cwd del hijo: para controlarlo, cambia el cwd del proceso que la + invoca antes de llamarla (lo que hace `claude_extract --cwd`). diff --git a/docs/capabilities/web-proxy.md b/docs/capabilities/web-proxy.md index 1210c37a..b03bf574 100644 --- a/docs/capabilities/web-proxy.md +++ b/docs/capabilities/web-proxy.md @@ -12,6 +12,7 @@ Filtro MCP: `mcp__registry__fn_search query="" tag="web-proxy"`. | [rotate_capture_flows_py_cybersecurity](../../python/functions/cybersecurity/rotate_capture_flows.md) | `mitmdump -s rotate_capture_flows.py --set rotate_min=N --set capture_dir=DIR` | Addon de mitmproxy que trocea las capturas en archivos `traffic-YYYYmmdd-HHMMSS.mitm` por ventanas de tiempo. Hace `flush()` por flujo, asi que la captura sobrevive a un `kill -9`. | | [query_mitm_flows_bash_cybersecurity](../../bash/functions/cybersecurity/query_mitm_flows.md) | `query_mitm_flows [--filter EXPR] [--har OUT]` | Consulta capturas `.mitm` guardadas: vuelca los flujos que matchean un filtro de mitmproxy, o exporta a HAR. Acepta globs de varios archivos. | | [launch_chromium_proxy_bash_browser](../../bash/functions/browser/launch_chromium_proxy.md) | `launch_chromium_proxy [--proxy URL] [--profile DIR] [--url URL]` | Lanza Chromium apuntando al proxy con un perfil aislado, sin contaminar la sesion normal. Maneja el CA del proxy o cae a `--ignore-certificate-errors`. | +| [tee_anthropic_sse_py_cybersecurity](../../python/functions/cybersecurity/tee_anthropic_sse.md) | `mitmdump -s tee_anthropic_sse.py` | Addon mitmproxy que intercepta el SSE de `POST api.anthropic.com/v1/messages` (la respuesta del modelo de la CLI claude) y emite el texto exacto token a token como NDJSON. Filtra la respuesta principal (`has_tools`) de las auxiliares (titulo/clasificador en haiku). Strip de `Accept-Encoding` para ver el SSE sin comprimir. Lo consume `apps/claude_wire`. | Complementa: `port_kill_bash_infra` (limpieza de puertos ocupados). diff --git a/functions/core/strip_ansi.go b/functions/core/strip_ansi.go new file mode 100644 index 00000000..ec69d986 --- /dev/null +++ b/functions/core/strip_ansi.go @@ -0,0 +1,38 @@ +package core + +import ( + "regexp" + "strings" +) + +// ansiCSI matches CSI sequences: ESC [ ... +// Covers colors (SGR), cursor movement, erase, etc. +var ansiCSI = regexp.MustCompile(`\x1b\[[0-9;?]*[ -/]*[@-~]`) + +// ansiOSC matches OSC sequences: ESC ] ... +// Used for window titles, hyperlinks, etc. +var ansiOSC = regexp.MustCompile(`\x1b\][^\x07\x1b]*(\x07|\x1b\\)`) + +// ansiEsc matches other two-character escape sequences: ESC +// Covers ESC c (reset), ESC ( B, ESC ) 0, etc. +var ansiEsc = regexp.MustCompile(`\x1b[@-Z\\-_]|\x1b[()][0-9A-Za-z]`) + +// StripANSI removes ANSI/VT100 terminal escape sequences from s and filters +// non-printable control characters, preserving newlines (\n), tabs (\t) and +// carriage returns (\r). +func StripANSI(s string) string { + s = ansiCSI.ReplaceAllString(s, "") + s = ansiOSC.ReplaceAllString(s, "") + s = ansiEsc.ReplaceAllString(s, "") + return strings.Map(func(r rune) rune { + // Preserve printable characters, \n (0x0A), \t (0x09), \r (0x0D). + if r == '\n' || r == '\t' || r == '\r' { + return r + } + // Drop C0 control characters (0x00-0x1F) and DEL (0x7F). + if r < 0x20 || r == 0x7F { + return -1 + } + return r + }, s) +} diff --git a/functions/core/strip_ansi.md b/functions/core/strip_ansi.md new file mode 100644 index 00000000..1df0a325 --- /dev/null +++ b/functions/core/strip_ansi.md @@ -0,0 +1,55 @@ +--- +name: strip_ansi +kind: function +lang: go +domain: core +version: "1.0.0" +purity: pure +signature: "func StripANSI(s string) string" +description: "Elimina secuencias de escape ANSI/VT100 de un string y filtra caracteres de control no imprimibles, preservando \\n, \\t y \\r." +tags: ["terminal", "ansi", "string", "sanitize", "terminal-capture"] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "" +imports: ["regexp", "strings"] +params: + - name: s + desc: "String que puede contener secuencias de escape de terminal (CSI, OSC, escapes simples) y/o caracteres de control." +output: "String limpio: sin secuencias ANSI ni caracteres de control, preservando saltos de línea (\\n), tabulaciones (\\t) y retornos de carro (\\r)." +tested: true +tests: + - "golden: color SGR codes" + - "edge OSC titulo de ventana" + - "edge movimientos de cursor" + - "edge string sin escapes preserva saltos de linea" + - "edge string vacio" + - "edge preserva tabs" +test_file_path: "functions/core/strip_ansi_test.go" +file_path: "functions/core/strip_ansi.go" +--- + +## Ejemplo + +```go +// Limpiar output de terminal con color rojo +raw := "\x1b[31mError:\x1b[0m archivo no encontrado" +clean := core.StripANSI(raw) +// clean == "Error: archivo no encontrado" + +// Limpiar título de ventana OSC +raw2 := "\x1b]0;mi titulo\x07contenido real" +clean2 := core.StripANSI(raw2) +// clean2 == "contenido real" +``` + +## Cuando usarla + +Cuando captures output de un PTY/TUI/subprocess y necesites texto plano: antes de indexar logs con ANSI en un buscador, antes de difar output de terminal, o cuando muestres salida de comando en un contexto sin soporte de escape (UI web, archivo, base de datos). + +## Gotchas + +- Preserva `\n`, `\t` y `\r` a propósito: el output de terminales suele tener CRLF y tabulaciones con semántica propia. +- Cubre CSI, OSC y escapes simples de dos caracteres. Secuencias DCS o PM (rarísimas) no se eliminan; si las necesitas, añade una regex adicional antes de llamar a esta función. +- Las regexes están precompiladas a nivel de paquete: no hay coste de compilación por llamada. diff --git a/functions/core/strip_ansi_test.go b/functions/core/strip_ansi_test.go new file mode 100644 index 00000000..6db98f28 --- /dev/null +++ b/functions/core/strip_ansi_test.go @@ -0,0 +1,53 @@ +package core + +import "testing" + +func TestStripANSI(t *testing.T) { + t.Run("golden: color SGR codes", func(t *testing.T) { + got := StripANSI("\x1b[31mhola\x1b[0m mundo") + want := "hola mundo" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("edge OSC titulo de ventana", func(t *testing.T) { + got := StripANSI("\x1b]0;mi titulo\x07texto") + want := "texto" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("edge movimientos de cursor", func(t *testing.T) { + got := StripANSI("linea1\x1b[2K\x1b[1Glinea2") + want := "linea1linea2" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("edge string sin escapes preserva saltos de linea", func(t *testing.T) { + got := StripANSI("plano\ncon\nlineas") + want := "plano\ncon\nlineas" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("edge string vacio", func(t *testing.T) { + got := StripANSI("") + want := "" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("edge preserva tabs", func(t *testing.T) { + got := StripANSI("a\tb") + want := "a\tb" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) +} diff --git a/functions/core/text_prefix_delta.go b/functions/core/text_prefix_delta.go new file mode 100644 index 00000000..318c8da4 --- /dev/null +++ b/functions/core/text_prefix_delta.go @@ -0,0 +1,23 @@ +package core + +// PrefixDelta returns the portion of curr that follows the longest common +// prefix (LCP) shared with prev, comparing rune-by-rune to avoid splitting +// multi-byte characters. +// +// In the monotone streaming case (curr = prev + new), this returns exactly +// the new suffix. When the text diverges mid-way (reflow), it returns +// everything from the point of divergence to the end of curr. +func PrefixDelta(prev, curr string) string { + prevRunes := []rune(prev) + currRunes := []rune(curr) + + common := 0 + for common < len(prevRunes) && common < len(currRunes) { + if prevRunes[common] != currRunes[common] { + break + } + common++ + } + + return string(currRunes[common:]) +} diff --git a/functions/core/text_prefix_delta.md b/functions/core/text_prefix_delta.md new file mode 100644 index 00000000..dae9221d --- /dev/null +++ b/functions/core/text_prefix_delta.md @@ -0,0 +1,63 @@ +--- +name: text_prefix_delta +kind: function +lang: go +domain: core +version: "1.0.0" +purity: pure +signature: "func PrefixDelta(prev, curr string) string" +description: "Calcula el delta de streaming entre dos versiones de un texto: devuelve la porción de curr que sigue al prefijo común más largo con prev, comparando runa a runa para no partir caracteres multibyte." +tags: [string, diff, streaming, delta, terminal-capture] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "" +imports: [] +params: + - name: prev + desc: "Versión anterior del texto acumulativo (snapshot anterior del stream)." + - name: curr + desc: "Versión actual del texto acumulativo (snapshot actual, normalmente extiende a prev)." +output: "La porción de curr que sigue al prefijo común con prev (el 'delta' de streaming). Devuelve cadena vacía si curr no añade nada nuevo tras el prefijo común." +tested: true +tests: + - "monotono append normal" + - "prev vacio devuelve curr completo" + - "sin cambios devuelve vacio" + - "divergencia en medio devuelve desde divergencia" + - "curr mas corto que prev devuelve vacio" + - "multibyte cafe streaming" + - "multibyte prefijo parcial antes de acento" + - "ambos vacios devuelve vacio" + - "prev no vacio curr vacio devuelve vacio" + - "determinismo misma entrada misma salida" +test_file_path: "functions/core/text_prefix_delta_test.go" +file_path: "functions/core/text_prefix_delta.go" +--- + +## Ejemplo + +```go +// Bucle de streaming por snapshots acumulativos: +prev := "" +snapshots := []string{"Hola", "Hola, mun", "Hola, mundo!"} + +for _, curr := range snapshots { + delta := PrefixDelta(prev, curr) + if delta != "" { + fmt.Print(delta) // emite solo la parte nueva + } + prev = curr +} +// Output: Hola, mundo! +``` + +## Cuando usarla + +Cuando hagas streaming por snapshots acumulativos y necesites emitir solo la parte nueva de cada snapshot. Caso típico: consumir `pty_capture_stream_go_infra` donde cada captura de la TUI es un snapshot que extiende al anterior, y quieres emitir eventos `text_delta` estilo SSE/streaming sin reenviar texto ya enviado. + +## Gotchas + +- Compara por prefijo común, no por diff completo. Si el texto cambia en medio (reflow, borrado, sobreescritura de terminal), el delta incluye todo desde el punto de divergencia hasta el final de curr — puede re-emitir texto ya visto. Adecuado para append monótono; en streaming de TUI con reflow es heurístico, no exacto. +- Trabaja sobre runas (no bytes) para no partir caracteres UTF-8 multibyte como 'é', '中', '→'. El offset de corte siempre cae en un límite de runa válido. diff --git a/functions/core/text_prefix_delta_test.go b/functions/core/text_prefix_delta_test.go new file mode 100644 index 00000000..80005126 --- /dev/null +++ b/functions/core/text_prefix_delta_test.go @@ -0,0 +1,87 @@ +package core + +import "testing" + +func TestPrefixDelta(t *testing.T) { + tests := []struct { + name string + prev string + curr string + want string + }{ + { + name: "monotono append normal", + prev: "PON", + curr: "PONG", + want: "G", + }, + { + name: "prev vacio devuelve curr completo", + prev: "", + curr: "abc", + want: "abc", + }, + { + name: "sin cambios devuelve vacio", + prev: "abc", + curr: "abc", + want: "", + }, + { + name: "divergencia en medio devuelve desde divergencia", + prev: "abc", + curr: "abXY", + want: "XY", + }, + { + name: "curr mas corto que prev devuelve vacio", + prev: "abcdef", + curr: "abc", + want: "", + }, + { + name: "multibyte cafe streaming", + prev: "café", + curr: "café con leche", + want: " con leche", + }, + { + name: "multibyte prefijo parcial antes de acento", + prev: "ca", + curr: "café", + want: "fé", + }, + { + name: "ambos vacios devuelve vacio", + prev: "", + curr: "", + want: "", + }, + { + name: "prev no vacio curr vacio devuelve vacio", + prev: "hola", + curr: "", + want: "", + }, + { + name: "determinismo misma entrada misma salida", + prev: "hello world", + curr: "hello world!", + want: "!", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := PrefixDelta(tc.prev, tc.curr) + if got != tc.want { + t.Errorf("PrefixDelta(%q, %q) = %q, want %q", tc.prev, tc.curr, got, tc.want) + } + // Verificar determinismo: segunda llamada produce el mismo resultado. + got2 := PrefixDelta(tc.prev, tc.curr) + if got != got2 { + t.Errorf("no determinista: primera=%q segunda=%q", got, got2) + } + }) + } +} diff --git a/functions/cybersecurity/e2e_messaging_crypto_test.go b/functions/cybersecurity/e2e_messaging_crypto_test.go new file mode 100644 index 00000000..0d87a6d3 --- /dev/null +++ b/functions/cybersecurity/e2e_messaging_crypto_test.go @@ -0,0 +1,304 @@ +package cybersecurity + +import ( + "bytes" + "testing" +) + +// --- GenerateIdentity --- + +func TestGenerateIdentity(t *testing.T) { + t.Run("genera keypairs con longitudes correctas", func(t *testing.T) { + id, err := GenerateIdentity() + if err != nil { + t.Fatalf("GenerateIdentity() error = %v", err) + } + if len(id.SignPub) != 32 { + t.Errorf("SignPub len = %d, want 32", len(id.SignPub)) + } + if len(id.SignPriv) != 64 { + t.Errorf("SignPriv len = %d, want 64", len(id.SignPriv)) + } + if len(id.KexPub) != 32 { + t.Errorf("KexPub len = %d, want 32", len(id.KexPub)) + } + if len(id.KexPriv) != 32 { + t.Errorf("KexPriv len = %d, want 32", len(id.KexPriv)) + } + }) + + t.Run("dos llamadas producen identidades distintas", func(t *testing.T) { + id1, err1 := GenerateIdentity() + id2, err2 := GenerateIdentity() + if err1 != nil || err2 != nil { + t.Fatal("GenerateIdentity() error inesperado") + } + if bytes.Equal(id1.SignPub, id2.SignPub) { + t.Error("SignPub idénticos en dos identidades distintas") + } + if bytes.Equal(id1.KexPub, id2.KexPub) { + t.Error("KexPub idénticos en dos identidades distintas") + } + }) +} + +// --- SealAEAD / OpenAEAD --- + +func TestSealOpenAEAD(t *testing.T) { + key := make([]byte, 32) + for i := range key { + key[i] = byte(i + 1) + } + plaintext := []byte("mensaje secreto del bus de mensajería") + aad := []byte("room:sala-general") + + t.Run("round-trip con aad", func(t *testing.T) { + nonce, ct, err := SealAEAD(key, plaintext, aad) + if err != nil { + t.Fatalf("SealAEAD error = %v", err) + } + got, err := OpenAEAD(key, nonce, ct, aad) + if err != nil { + t.Fatalf("OpenAEAD error = %v", err) + } + if !bytes.Equal(got, plaintext) { + t.Errorf("got %q, want %q", got, plaintext) + } + }) + + t.Run("round-trip sin aad (nil)", func(t *testing.T) { + nonce, ct, err := SealAEAD(key, plaintext, nil) + if err != nil { + t.Fatalf("SealAEAD error = %v", err) + } + got, err := OpenAEAD(key, nonce, ct, nil) + if err != nil { + t.Fatalf("OpenAEAD error = %v", err) + } + if !bytes.Equal(got, plaintext) { + t.Errorf("got %q, want %q", got, plaintext) + } + }) + + t.Run("error con clave de longitud incorrecta", func(t *testing.T) { + _, _, err := SealAEAD(key[:16], plaintext, nil) + if err == nil { + t.Error("esperaba error con clave de 16 bytes, got nil") + } + }) + + t.Run("error de autenticacion con ciphertext modificado", func(t *testing.T) { + nonce, ct, err := SealAEAD(key, plaintext, aad) + if err != nil { + t.Fatalf("SealAEAD error = %v", err) + } + ct[0] ^= 0xFF // corromper el primer byte + _, err = OpenAEAD(key, nonce, ct, aad) + if err == nil { + t.Error("esperaba error de autenticación con ciphertext corrupto, got nil") + } + }) + + t.Run("error de autenticacion con aad distinto", func(t *testing.T) { + nonce, ct, err := SealAEAD(key, plaintext, aad) + if err != nil { + t.Fatalf("SealAEAD error = %v", err) + } + _, err = OpenAEAD(key, nonce, ct, []byte("room:otra-sala")) + if err == nil { + t.Error("esperaba error de autenticación con aad distinto, got nil") + } + }) + + t.Run("nonces distintos en llamadas sucesivas", func(t *testing.T) { + n1, _, err1 := SealAEAD(key, plaintext, nil) + n2, _, err2 := SealAEAD(key, plaintext, nil) + if err1 != nil || err2 != nil { + t.Fatal("SealAEAD error inesperado") + } + if bytes.Equal(n1, n2) { + t.Error("nonces iguales en dos llamadas sucesivas (no aleatorios)") + } + }) +} + +// --- SealKeyBox / OpenKeyBox --- + +func TestSealOpenKeyBox(t *testing.T) { + t.Run("round-trip con identidad generada", func(t *testing.T) { + id, err := GenerateIdentity() + if err != nil { + t.Fatalf("GenerateIdentity error = %v", err) + } + roomKey := make([]byte, 32) + for i := range roomKey { + roomKey[i] = byte(i + 42) + } + + sealed, err := SealKeyBox(id.KexPub, roomKey) + if err != nil { + t.Fatalf("SealKeyBox error = %v", err) + } + + opened, err := OpenKeyBox(id.KexPub, id.KexPriv, sealed) + if err != nil { + t.Fatalf("OpenKeyBox error = %v", err) + } + if !bytes.Equal(opened, roomKey) { + t.Errorf("got %x, want %x", opened, roomKey) + } + }) + + t.Run("error con recipientKexPub de longitud incorrecta", func(t *testing.T) { + _, err := SealKeyBox(make([]byte, 16), []byte("secret")) + if err == nil { + t.Error("esperaba error con kexPub de 16 bytes, got nil") + } + }) + + t.Run("error al abrir con clave equivocada", func(t *testing.T) { + id, _ := GenerateIdentity() + other, _ := GenerateIdentity() + sealed, err := SealKeyBox(id.KexPub, []byte("roomkey")) + if err != nil { + t.Fatalf("SealKeyBox error = %v", err) + } + _, err = OpenKeyBox(other.KexPub, other.KexPriv, sealed) + if err == nil { + t.Error("esperaba error al abrir con keypair distinto, got nil") + } + }) + + t.Run("error con mensaje truncado", func(t *testing.T) { + id, _ := GenerateIdentity() + _, err := OpenKeyBox(id.KexPub, id.KexPriv, []byte("corto")) + if err == nil { + t.Error("esperaba error con sealedMsg truncado, got nil") + } + }) +} + +// --- SignEd25519 / VerifyEd25519 --- + +func TestSignVerifyEd25519(t *testing.T) { + t.Run("firma y verificacion exitosa", func(t *testing.T) { + id, err := GenerateIdentity() + if err != nil { + t.Fatalf("GenerateIdentity error = %v", err) + } + msg := []byte("evento:room_key_rotation:v2") + sig := SignEd25519(id.SignPriv, msg) + if len(sig) != 64 { + t.Errorf("sig len = %d, want 64", len(sig)) + } + if !VerifyEd25519(id.SignPub, msg, sig) { + t.Error("VerifyEd25519 devolvió false para firma válida") + } + }) + + t.Run("firma es determinista (misma entrada, misma firma)", func(t *testing.T) { + id, _ := GenerateIdentity() + msg := []byte("determinismo criptografico") + sig1 := SignEd25519(id.SignPriv, msg) + sig2 := SignEd25519(id.SignPriv, msg) + if !bytes.Equal(sig1, sig2) { + t.Error("Ed25519 debe ser determinista: mismas entradas deben producir misma firma") + } + }) + + t.Run("falla con mensaje modificado", func(t *testing.T) { + id, _ := GenerateIdentity() + msg := []byte("mensaje original") + sig := SignEd25519(id.SignPriv, msg) + modified := []byte("mensaje modificado") + if VerifyEd25519(id.SignPub, modified, sig) { + t.Error("VerifyEd25519 devolvió true para mensaje modificado") + } + }) + + t.Run("falla con clave publica incorrecta", func(t *testing.T) { + id1, _ := GenerateIdentity() + id2, _ := GenerateIdentity() + msg := []byte("autenticidad del remitente") + sig := SignEd25519(id1.SignPriv, msg) + if VerifyEd25519(id2.SignPub, msg, sig) { + t.Error("VerifyEd25519 devolvió true con clave pública de otra identidad") + } + }) + + t.Run("falla con firma corrupta", func(t *testing.T) { + id, _ := GenerateIdentity() + msg := []byte("integridad") + sig := SignEd25519(id.SignPriv, msg) + sig[0] ^= 0xFF + if VerifyEd25519(id.SignPub, msg, sig) { + t.Error("VerifyEd25519 devolvió true con firma corrupta") + } + }) +} + +// --- Integración: flujo completo megolm-reducido --- + +func TestE2EMessagingFlow(t *testing.T) { + t.Run("flujo completo: generar identidad, distribuir clave de sala, cifrar y firmar mensaje", func(t *testing.T) { + // Servidor genera identidad + server, err := GenerateIdentity() + if err != nil { + t.Fatalf("GenerateIdentity server: %v", err) + } + // Usuario genera identidad + user, err := GenerateIdentity() + if err != nil { + t.Fatalf("GenerateIdentity user: %v", err) + } + + // Servidor genera clave de sala y la distribuye al usuario cifrada con su KexPub + roomKey := make([]byte, 32) + for i := range roomKey { + roomKey[i] = byte(i) + } + sealedKey, err := SealKeyBox(user.KexPub, roomKey) + if err != nil { + t.Fatalf("SealKeyBox: %v", err) + } + + // Usuario desella la clave de sala + gotRoomKey, err := OpenKeyBox(user.KexPub, user.KexPriv, sealedKey) + if err != nil { + t.Fatalf("OpenKeyBox: %v", err) + } + if !bytes.Equal(gotRoomKey, roomKey) { + t.Fatal("clave de sala distribuida no coincide") + } + + // Usuario cifra un mensaje con la clave de sala + plainMsg := []byte("hola sala, este es mi primer mensaje cifrado e2e") + aad := []byte("room:sala-secreta:seq:1") + nonce, ct, err := SealAEAD(gotRoomKey, plainMsg, aad) + if err != nil { + t.Fatalf("SealAEAD: %v", err) + } + + // Usuario firma el ciphertext para autenticación del remitente + sig := SignEd25519(user.SignPriv, ct) + + // Receptor verifica firma del remitente + if !VerifyEd25519(user.SignPub, ct, sig) { + t.Fatal("verificación de firma del remitente falló") + } + + // Receptor descifra el mensaje + decrypted, err := OpenAEAD(gotRoomKey, nonce, ct, aad) + if err != nil { + t.Fatalf("OpenAEAD: %v", err) + } + if !bytes.Equal(decrypted, plainMsg) { + t.Errorf("mensaje descifrado %q != original %q", decrypted, plainMsg) + } + + // Servidor tiene distinta identidad que el usuario (las claves no se confunden) + if bytes.Equal(server.SignPub, user.SignPub) { + t.Error("server y user tienen la misma clave pública de firma") + } + }) +} diff --git a/functions/cybersecurity/generate_identity.go b/functions/cybersecurity/generate_identity.go new file mode 100644 index 00000000..a2d6e901 --- /dev/null +++ b/functions/cybersecurity/generate_identity.go @@ -0,0 +1,40 @@ +package cybersecurity + +import ( + "crypto/ed25519" + "crypto/rand" + + "golang.org/x/crypto/nacl/box" +) + +// Identity holds a dual keypair for a messaging participant: +// an Ed25519 keypair for signing and a X25519 keypair for key exchange. +type Identity struct { + SignPub []byte // Ed25519 public key (32 bytes) + SignPriv []byte // Ed25519 private key (64 bytes) + KexPub []byte // X25519 public key (32 bytes) + KexPriv []byte // X25519 private key (32 bytes) +} + +// GenerateIdentity creates a new Identity with freshly generated Ed25519 and X25519 keypairs. +// Ed25519 keys are used for signing; X25519 keys for key exchange (sealed box). +func GenerateIdentity() (Identity, error) { + // Ed25519 keypair for message signing + signPub, signPriv, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + return Identity{}, err + } + + // X25519 keypair for key exchange (nacl/box uses Curve25519 internally) + kexPub, kexPriv, err := box.GenerateKey(rand.Reader) + if err != nil { + return Identity{}, err + } + + return Identity{ + SignPub: []byte(signPub), + SignPriv: []byte(signPriv), + KexPub: kexPub[:], + KexPriv: kexPriv[:], + }, nil +} diff --git a/functions/cybersecurity/generate_identity.md b/functions/cybersecurity/generate_identity.md new file mode 100644 index 00000000..e646c230 --- /dev/null +++ b/functions/cybersecurity/generate_identity.md @@ -0,0 +1,53 @@ +--- +name: generate_identity +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "func GenerateIdentity() (Identity, error)" +description: "Genera una identidad criptográfica dual con un par Ed25519 (firma) y un par X25519 (intercambio de claves). Punto de entrada obligatorio para cualquier participante en el bus de mensajería cifrado." +tags: [messaging, e2e-crypto, crypto, identity, ed25519, x25519, keygen, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - crypto/ed25519 + - crypto/rand + - golang.org/x/crypto/nacl/box +params: + - name: "(ninguno)" + desc: "Sin parámetros. Usa crypto/rand como fuente de entropía del sistema." +output: "Identity{SignPub []byte, SignPriv []byte, KexPub []byte, KexPriv []byte} o error si falla el RNG del sistema." +tested: true +tests: + - "genera keypairs con longitudes correctas" + - "dos llamadas producen identidades distintas" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/generate_identity.go" +--- + +## Ejemplo + +```go +id, err := cybersecurity.GenerateIdentity() +if err != nil { + log.Fatal(err) +} +// id.SignPub / id.SignPriv — par Ed25519 para firmar mensajes +// id.KexPub / id.KexPriv — par X25519 para recibir claves de sala cifradas +fmt.Printf("identity pub(sign)=%x pub(kex)=%x\n", id.SignPub, id.KexPub) +``` + +## Cuando usarla + +Al registrar un nuevo participante en el bus de mensajería: llama GenerateIdentity una sola vez por dispositivo/sesión, persiste los bytes de las cuatro claves de forma segura, y publica `SignPub` + `KexPub` en el directorio de participantes. + +## Gotchas + +- La función depende de `crypto/rand`; en entornos con entropía insuficiente (contenedores recién arrancados) puede bloquearse brevemente. +- `SignPriv` tiene 64 bytes (no 32): Ed25519 concatena seed (32) + clave pública (32) internamente. No truncar. +- `KexPub`/`KexPriv` son exactamente 32 bytes (Curve25519). Pasar exactamente esos slices a `SealKeyBox`/`OpenKeyBox`. +- Nunca reutilizar una identidad entre dispositivos distintos del mismo usuario sin un protocolo de clonado seguro. diff --git a/functions/cybersecurity/open_aead.go b/functions/cybersecurity/open_aead.go new file mode 100644 index 00000000..ac0eceff --- /dev/null +++ b/functions/cybersecurity/open_aead.go @@ -0,0 +1,29 @@ +package cybersecurity + +import ( + "fmt" + + "golang.org/x/crypto/chacha20poly1305" +) + +// OpenAEAD decrypts a ciphertext produced by SealAEAD using ChaCha20-Poly1305. +// key must be exactly 32 bytes. nonce must match the one returned by SealAEAD. +// aad must match what was passed to SealAEAD (can be nil). +// Returns an error if authentication fails (tampered ciphertext, wrong key, or wrong aad). +func OpenAEAD(key, nonce, ciphertext, aad []byte) ([]byte, error) { + if len(key) != chacha20poly1305.KeySize { + return nil, fmt.Errorf("open_aead: key must be %d bytes, got %d", chacha20poly1305.KeySize, len(key)) + } + + aead, err := chacha20poly1305.New(key) + if err != nil { + return nil, fmt.Errorf("open_aead: create cipher: %w", err) + } + + plaintext, err := aead.Open(nil, nonce, ciphertext, aad) + if err != nil { + return nil, fmt.Errorf("open_aead: authentication failed: %w", err) + } + + return plaintext, nil +} diff --git a/functions/cybersecurity/open_aead.md b/functions/cybersecurity/open_aead.md new file mode 100644 index 00000000..0d76364c --- /dev/null +++ b/functions/cybersecurity/open_aead.md @@ -0,0 +1,62 @@ +--- +name: open_aead +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "func OpenAEAD(key, nonce, ciphertext, aad []byte) ([]byte, error)" +description: "Descifra y autentica un ciphertext producido por SealAEAD usando ChaCha20-Poly1305. Devuelve error explícito si la autenticación falla (ciphertext alterado, clave incorrecta o AAD distinto)." +tags: [messaging, e2e-crypto, crypto, aead, chacha20poly1305, symmetric, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - golang.org/x/crypto/chacha20poly1305 +params: + - name: key + desc: "Clave simétrica de exactamente 32 bytes. Debe ser la misma usada en SealAEAD." + - name: nonce + desc: "Nonce de 12 bytes devuelto por SealAEAD. Debe transmitirse junto al ciphertext." + - name: ciphertext + desc: "Ciphertext producido por SealAEAD (incluye los 16 bytes del tag Poly1305)." + - name: aad + desc: "Datos autenticados adicionales. Debe ser idéntico al aad usado en SealAEAD, o nil si se pasó nil." +output: "Plaintext descifrado, o error si la autenticación falla o la clave tiene longitud incorrecta." +tested: true +tests: + - "round-trip con aad" + - "round-trip sin aad (nil)" + - "error con clave de longitud incorrecta" + - "error de autenticacion con ciphertext modificado" + - "error de autenticacion con aad distinto" + - "nonces distintos en llamadas sucesivas" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/open_aead.go" +--- + +## Ejemplo + +```go +// nonce y ct vienen de SealAEAD; aad debe reconstruirse igual +aad := []byte("room:sala-general:seq:42") +plaintext, err := cybersecurity.OpenAEAD(key, nonce, ct, aad) +if err != nil { + // mensaje alterado, clave incorrecta o aad distinto — descartar + log.Printf("autenticación fallida: %v", err) + return +} +fmt.Printf("mensaje: %s\n", plaintext) +``` + +## Cuando usarla + +Al recibir un mensaje del bus: después de resolver la room key con OpenKeyBox, llama OpenAEAD para descifrar y verificar integridad. Si devuelve error, el mensaje llegó corrupto o fue alterado en tránsito — descartar siempre, nunca procesar plaintext parcial. + +## Gotchas + +- El error no distingue entre "clave incorrecta", "nonce incorrecto" y "ciphertext alterado": todos devuelven el mismo error de autenticación por diseño (evita oráculos de padding). +- Si el ciphertext tiene menos de 16 bytes, la función devuelve error antes de intentar descifrar. +- El aad debe ser reconstructible por el receptor de forma independiente (no viaja en el mensaje cifrado). diff --git a/functions/cybersecurity/open_key_box.go b/functions/cybersecurity/open_key_box.go new file mode 100644 index 00000000..e2d1853d --- /dev/null +++ b/functions/cybersecurity/open_key_box.go @@ -0,0 +1,32 @@ +package cybersecurity + +import ( + "fmt" + + "golang.org/x/crypto/nacl/box" +) + +// OpenKeyBox decrypts a sealed box produced by SealKeyBox using the recipient's X25519 keypair. +// kexPub and kexPriv must each be exactly 32 bytes and correspond to the public key +// passed to SealKeyBox as recipientKexPub. +// Returns an error if decryption or authentication fails. +func OpenKeyBox(kexPub, kexPriv, sealedMsg []byte) ([]byte, error) { + if len(kexPub) != 32 { + return nil, fmt.Errorf("open_key_box: kexPub must be 32 bytes, got %d", len(kexPub)) + } + if len(kexPriv) != 32 { + return nil, fmt.Errorf("open_key_box: kexPriv must be 32 bytes, got %d", len(kexPriv)) + } + + var pub [32]byte + var priv [32]byte + copy(pub[:], kexPub) + copy(priv[:], kexPriv) + + plaintext, ok := box.OpenAnonymous(nil, sealedMsg, &pub, &priv) + if !ok { + return nil, fmt.Errorf("open_key_box: decryption failed (authentication error or corrupted message)") + } + + return plaintext, nil +} diff --git a/functions/cybersecurity/open_key_box.md b/functions/cybersecurity/open_key_box.md new file mode 100644 index 00000000..49dd1455 --- /dev/null +++ b/functions/cybersecurity/open_key_box.md @@ -0,0 +1,58 @@ +--- +name: open_key_box +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "func OpenKeyBox(kexPub, kexPriv, sealedMsg []byte) ([]byte, error)" +description: "Descifra un sealed box anónimo producido por SealKeyBox usando el par X25519 del destinatario. Devuelve error si la autenticación falla o el mensaje está corrupto." +tags: [messaging, e2e-crypto, crypto, nacl, x25519, sealed-box, key-distribution, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - golang.org/x/crypto/nacl/box +params: + - name: kexPub + desc: "Clave pública X25519 del destinatario (exactamente 32 bytes). Debe coincidir con la usada en SealKeyBox." + - name: kexPriv + desc: "Clave privada X25519 del destinatario (exactamente 32 bytes). Viene del campo KexPriv de su Identity." + - name: sealedMsg + desc: "Sealed box producido por SealKeyBox. Mínimo 48 bytes (32 overhead ephemeral + 16 tag)." +output: "Secreto descifrado (ej. room key de 32 bytes), o error si la autenticación falla, el par de claves no coincide, o el mensaje está truncado." +tested: true +tests: + - "round-trip con identidad generada" + - "error con recipientKexPub de longitud incorrecta" + - "error al abrir con clave equivocada" + - "error con mensaje truncado" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/open_key_box.go" +--- + +## Ejemplo + +```go +// Receptor obtiene su Identity del almacén seguro +id, _ := loadIdentityFromSecureStorage() +roomKey, err := cybersecurity.OpenKeyBox(id.KexPub, id.KexPriv, sealedMsgFromServer) +if err != nil { + log.Printf("no se pudo abrir la room key: %v", err) + return +} +// roomKey lista para usar en SealAEAD / OpenAEAD +``` + +## Cuando usarla + +Al recibir una distribución de clave de sala del servidor: llama OpenKeyBox con el par X25519 propio para recuperar la room key simétrica. Después de obtenerla, úsala en OpenAEAD para descifrar los mensajes de esa sala. + +## Gotchas + +- El error no distingue entre "clave incorrecta" y "mensaje corrupto" por diseño de seguridad. +- Si `sealedMsg` tiene menos de 48 bytes (overhead mínimo del sealed box), la función devuelve error sin intentar descifrar. +- `kexPub` y `kexPriv` deben ser el par correspondiente: pasar la pubkey de otro usuario con la privkey propia siempre falla. +- La room key recuperada es sensible: no logearla ni incluirla en mensajes de error. diff --git a/functions/cybersecurity/seal_aead.go b/functions/cybersecurity/seal_aead.go new file mode 100644 index 00000000..d602909f --- /dev/null +++ b/functions/cybersecurity/seal_aead.go @@ -0,0 +1,31 @@ +package cybersecurity + +import ( + "crypto/rand" + "fmt" + "io" + + "golang.org/x/crypto/chacha20poly1305" +) + +// SealAEAD encrypts plaintext with ChaCha20-Poly1305, returning a random nonce and ciphertext. +// key must be exactly 32 bytes. aad (additional authenticated data) may be nil. +// The returned nonce must be stored alongside the ciphertext and passed to OpenAEAD. +func SealAEAD(key, plaintext, aad []byte) (nonce, ciphertext []byte, err error) { + if len(key) != chacha20poly1305.KeySize { + return nil, nil, fmt.Errorf("seal_aead: key must be %d bytes, got %d", chacha20poly1305.KeySize, len(key)) + } + + aead, err := chacha20poly1305.New(key) + if err != nil { + return nil, nil, fmt.Errorf("seal_aead: create cipher: %w", err) + } + + nonce = make([]byte, aead.NonceSize()) + if _, err = io.ReadFull(rand.Reader, nonce); err != nil { + return nil, nil, fmt.Errorf("seal_aead: generate nonce: %w", err) + } + + ciphertext = aead.Seal(nil, nonce, plaintext, aad) + return nonce, ciphertext, nil +} diff --git a/functions/cybersecurity/seal_aead.md b/functions/cybersecurity/seal_aead.md new file mode 100644 index 00000000..b781147c --- /dev/null +++ b/functions/cybersecurity/seal_aead.md @@ -0,0 +1,60 @@ +--- +name: seal_aead +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "func SealAEAD(key, plaintext, aad []byte) (nonce, ciphertext []byte, err error)" +description: "Cifra plaintext con ChaCha20-Poly1305 usando una clave simétrica de 32 bytes. Genera un nonce aleatorio por llamada. Admite datos autenticados adicionales (AAD) para vincular contexto al cifrado sin cifrarlo." +tags: [messaging, e2e-crypto, crypto, aead, chacha20poly1305, symmetric, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - crypto/rand + - golang.org/x/crypto/chacha20poly1305 +params: + - name: key + desc: "Clave simétrica de exactamente 32 bytes (256 bits). Típicamente la room key distribuida con SealKeyBox." + - name: plaintext + desc: "Bytes a cifrar. Puede ser vacío." + - name: aad + desc: "Datos autenticados adicionales (AAD): se autentican pero no se cifran. Útil para room ID, número de secuencia, etc. Puede ser nil." +output: "nonce (12 bytes aleatorios), ciphertext (plaintext cifrado + 16 bytes de tag Poly1305), o error si la clave tiene longitud incorrecta o falla el RNG." +tested: true +tests: + - "round-trip con aad" + - "round-trip sin aad (nil)" + - "error con clave de longitud incorrecta" + - "error de autenticacion con ciphertext modificado" + - "error de autenticacion con aad distinto" + - "nonces distintos en llamadas sucesivas" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/seal_aead.go" +--- + +## Ejemplo + +```go +key := make([]byte, 32) // en producción: room key distribuida con SealKeyBox +aad := []byte("room:sala-general:seq:42") +nonce, ct, err := cybersecurity.SealAEAD(key, []byte("hola sala"), aad) +if err != nil { + log.Fatal(err) +} +// Almacenar nonce junto al ciphertext para descifrar después +``` + +## Cuando usarla + +Al cifrar cada mensaje en una sala del bus: usa la room key de la sala como `key`, incluye el ID de sala y número de secuencia en `aad` para prevenir replay attacks entre salas, y transmite `nonce + ciphertext` juntos al destinatario. + +## Gotchas + +- El nonce es aleatorio (12 bytes): con una misma key, la probabilidad de colisión de nonces es despreciable para <2^32 mensajes, pero en escenarios de alto volumen considera rotar la room key periódicamente. +- El ciphertext es 16 bytes más largo que el plaintext (tag Poly1305). +- `aad` no viaja cifrado: el destinatario debe reconstruirlo independientemente para verificar. Si aad difiere aunque sea 1 bit, OpenAEAD falla con error de autenticación. +- Nunca reutilizar `(key, nonce)` para dos plaintexts distintos: rompe la confidencialidad de ChaCha20. diff --git a/functions/cybersecurity/seal_key_box.go b/functions/cybersecurity/seal_key_box.go new file mode 100644 index 00000000..cb9d96c8 --- /dev/null +++ b/functions/cybersecurity/seal_key_box.go @@ -0,0 +1,28 @@ +package cybersecurity + +import ( + "crypto/rand" + "fmt" + + "golang.org/x/crypto/nacl/box" +) + +// SealKeyBox encrypts secret for a recipient identified by their X25519 public key, +// using an anonymous sealed box (ephemeral sender keypair, no sender authentication). +// Intended for distributing a symmetric room key to a participant. +// recipientKexPub must be exactly 32 bytes. +func SealKeyBox(recipientKexPub, secret []byte) ([]byte, error) { + if len(recipientKexPub) != 32 { + return nil, fmt.Errorf("seal_key_box: recipientKexPub must be 32 bytes, got %d", len(recipientKexPub)) + } + + var recipientKey [32]byte + copy(recipientKey[:], recipientKexPub) + + sealed, err := box.SealAnonymous(nil, secret, &recipientKey, rand.Reader) + if err != nil { + return nil, fmt.Errorf("seal_key_box: %w", err) + } + + return sealed, nil +} diff --git a/functions/cybersecurity/seal_key_box.md b/functions/cybersecurity/seal_key_box.md new file mode 100644 index 00000000..0e000331 --- /dev/null +++ b/functions/cybersecurity/seal_key_box.md @@ -0,0 +1,56 @@ +--- +name: seal_key_box +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "func SealKeyBox(recipientKexPub, secret []byte) ([]byte, error)" +description: "Cifra un secreto (típicamente una room key simétrica) para un destinatario identificado por su clave pública X25519, usando un sealed box anónimo (nacl/box). El emisor no se autentica; usar SignEd25519 por separado si se necesita autenticación del remitente." +tags: [messaging, e2e-crypto, crypto, nacl, x25519, sealed-box, key-distribution, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - crypto/rand + - golang.org/x/crypto/nacl/box +params: + - name: recipientKexPub + desc: "Clave pública X25519 del destinatario (exactamente 32 bytes). Viene del campo KexPub de su Identity." + - name: secret + desc: "Bytes a cifrar. Típicamente una room key de 32 bytes, pero puede ser cualquier secreto." +output: "Sealed box cifrado (overhead: 32 bytes de ephemeral pubkey + 16 bytes de tag Poly1305), o error si recipientKexPub no tiene 32 bytes o falla el RNG." +tested: true +tests: + - "round-trip con identidad generada" + - "error con recipientKexPub de longitud incorrecta" + - "error al abrir con clave equivocada" + - "error con mensaje truncado" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/seal_key_box.go" +--- + +## Ejemplo + +```go +// Distribuir room key al usuario al unirse a la sala +roomKey := make([]byte, 32) // generada por el servidor de sala +sealed, err := cybersecurity.SealKeyBox(user.KexPub, roomKey) +if err != nil { + log.Fatal(err) +} +// Enviar sealed al usuario; solo él puede abrirlo con OpenKeyBox +``` + +## Cuando usarla + +Al distribuir una clave simétrica de sala a un nuevo participante: cifra la room key con la KexPub del destinatario antes de transmitirla. El destinatario usa OpenKeyBox para recuperarla. Combinar con SignEd25519 sobre el sealed box si se necesita autenticar que el servidor distribuyó la clave. + +## Gotchas + +- El sealed box es anónimo: el receptor no puede verificar quién lo generó. Firmar el sealed box con SignEd25519 si la autenticación del emisor importa. +- Overhead fijo: 48 bytes adicionales sobre el secreto (32 ephemeral pubkey + 16 tag). +- El sealed box no puede abrirse sin la clave privada X25519 correspondiente: si el usuario pierde KexPriv, la room key es irrecuperable. +- `recipientKexPub` debe tener exactamente 32 bytes; la función valida y devuelve error claro si no. diff --git a/functions/cybersecurity/sign_ed25519.go b/functions/cybersecurity/sign_ed25519.go new file mode 100644 index 00000000..af2fcf90 --- /dev/null +++ b/functions/cybersecurity/sign_ed25519.go @@ -0,0 +1,10 @@ +package cybersecurity + +import "crypto/ed25519" + +// SignEd25519 signs msg with an Ed25519 private key and returns the 64-byte signature. +// priv must be a valid Ed25519 private key (64 bytes as returned by GenerateIdentity or ed25519.GenerateKey). +// This function is pure: same inputs always produce the same output (ed25519 is deterministic). +func SignEd25519(priv, msg []byte) []byte { + return ed25519.Sign(ed25519.PrivateKey(priv), msg) +} diff --git a/functions/cybersecurity/sign_ed25519.md b/functions/cybersecurity/sign_ed25519.md new file mode 100644 index 00000000..a91ed94b --- /dev/null +++ b/functions/cybersecurity/sign_ed25519.md @@ -0,0 +1,45 @@ +--- +name: sign_ed25519 +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: pure +signature: "func SignEd25519(priv, msg []byte) []byte" +description: "Firma un mensaje con una clave privada Ed25519 y devuelve la firma de 64 bytes. Determinista: mismas entradas producen siempre la misma firma. Sin efectos secundarios ni I/O." +tags: [messaging, e2e-crypto, crypto, ed25519, signing, pure, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "" +imports: + - crypto/ed25519 +params: + - name: priv + desc: "Clave privada Ed25519 de 64 bytes. Viene del campo SignPriv de Identity." + - name: msg + desc: "Bytes a firmar. Puede ser cualquier dato: ciphertext, evento, room key distribuida, etc." +output: "Firma Ed25519 de exactamente 64 bytes. Siempre determinista para la misma (priv, msg)." +tested: true +tests: + - "firma y verificacion exitosa" + - "firma es determinista (misma entrada, misma firma)" + - "falla con mensaje modificado" + - "falla con clave publica incorrecta" + - "falla con firma corrupta" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/sign_ed25519.go" +--- + +## Ejemplo + +```go +// Firmar el ciphertext de un mensaje antes de transmitirlo +sig := cybersecurity.SignEd25519(id.SignPriv, ciphertext) +// Transmitir ciphertext + sig; el receptor verifica con VerifyEd25519 +``` + +## Cuando usarla + +Después de cifrar un mensaje con SealAEAD: firma el ciphertext (no el plaintext) con tu SignPriv para que el receptor pueda verificar la autoría con VerifyEd25519. También útil para firmar eventos de control del bus (rotación de clave, join/leave de sala). diff --git a/functions/cybersecurity/verify_ed25519.go b/functions/cybersecurity/verify_ed25519.go new file mode 100644 index 00000000..64769e09 --- /dev/null +++ b/functions/cybersecurity/verify_ed25519.go @@ -0,0 +1,10 @@ +package cybersecurity + +import "crypto/ed25519" + +// VerifyEd25519 reports whether sig is a valid Ed25519 signature of msg under pub. +// pub must be a valid Ed25519 public key (32 bytes as returned by GenerateIdentity). +// Returns true only if the signature is authentic; false on any mismatch or invalid input. +func VerifyEd25519(pub, msg, sig []byte) bool { + return ed25519.Verify(ed25519.PublicKey(pub), msg, sig) +} diff --git a/functions/cybersecurity/verify_ed25519.md b/functions/cybersecurity/verify_ed25519.md new file mode 100644 index 00000000..d999acf1 --- /dev/null +++ b/functions/cybersecurity/verify_ed25519.md @@ -0,0 +1,51 @@ +--- +name: verify_ed25519 +kind: function +lang: go +domain: cybersecurity +version: "1.0.0" +purity: pure +signature: "func VerifyEd25519(pub, msg, sig []byte) bool" +description: "Verifica una firma Ed25519 sobre un mensaje usando la clave pública del firmante. Devuelve true solo si la firma es auténtica. Sin efectos secundarios ni I/O." +tags: [messaging, e2e-crypto, crypto, ed25519, signing, pure, e2e-messaging] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "" +imports: + - crypto/ed25519 +params: + - name: pub + desc: "Clave pública Ed25519 de 32 bytes del firmante. Viene del campo SignPub de su Identity." + - name: msg + desc: "Mensaje original que fue firmado. Debe ser idéntico al pasado a SignEd25519." + - name: sig + desc: "Firma de 64 bytes producida por SignEd25519." +output: "true si la firma es válida para (pub, msg). false en cualquier otro caso: firma incorrecta, pub equivocada, msg alterado, o sig corrupta." +tested: true +tests: + - "firma y verificacion exitosa" + - "firma es determinista (misma entrada, misma firma)" + - "falla con mensaje modificado" + - "falla con clave publica incorrecta" + - "falla con firma corrupta" +test_file_path: "functions/cybersecurity/e2e_messaging_crypto_test.go" +file_path: "functions/cybersecurity/verify_ed25519.go" +--- + +## Ejemplo + +```go +// Receptor verifica autoría antes de descifrar +if !cybersecurity.VerifyEd25519(sender.SignPub, ciphertext, sig) { + log.Println("firma inválida: mensaje descartado") + return +} +// Solo si la firma es válida, descifrar con OpenAEAD +plaintext, err := cybersecurity.OpenAEAD(roomKey, nonce, ciphertext, aad) +``` + +## Cuando usarla + +Al recibir un mensaje del bus: verifica la firma del remitente sobre el ciphertext antes de intentar descifrar. Devuelve false para cualquier fallo de autenticación — nunca procesar un mensaje con firma inválida. diff --git a/functions/infra/pty_capture_idle.go b/functions/infra/pty_capture_idle.go new file mode 100644 index 00000000..0d3dab6e --- /dev/null +++ b/functions/infra/pty_capture_idle.go @@ -0,0 +1,149 @@ +package infra + +import ( + "bytes" + "context" + "fmt" + "os/exec" + "sync" + "syscall" + "time" + + "github.com/creack/pty" +) + +// PTYCaptureIdle launches a command inside a pseudo-terminal (PTY) and captures +// all output until the terminal has been idle for at least idle duration, or +// maxDur has elapsed. Before sending inputs it waits warmup to let the process +// initialize. Between each input step it waits stepDelay. +// +// The returned string is the raw PTY output, ANSI escape sequences included. +// To turn it into plain text: use vt_render_go_tui to reconstruct the 2D screen +// layout for TUIs with absolute cursor positioning (claude, htop), or +// strip_ansi_go_core for sequential, log-like output. +func PTYCaptureIdle( + ctx context.Context, + name string, + args []string, + warmup time.Duration, + inputs []string, + stepDelay time.Duration, + idle time.Duration, + maxDur time.Duration, +) (string, error) { + cmd := exec.CommandContext(ctx, name, args...) + + ptmx, err := pty.Start(cmd) + if err != nil { + return "", fmt.Errorf("pty_capture_idle: pty.Start: %w", err) + } + + // Set a reasonable terminal size so TUIs render without truncating. + if szErr := pty.Setsize(ptmx, &pty.Winsize{Rows: 40, Cols: 120}); szErr != nil { + // Non-fatal: continue even if resize fails. + _ = szErr + } + + var ( + mu sync.Mutex + buf bytes.Buffer + lastByte = time.Now() + ) + + // Reader goroutine: copy PTY output into buf and track last-byte time. + readDone := make(chan struct{}) + go func() { + defer close(readDone) + tmp := make([]byte, 4096) + for { + n, rerr := ptmx.Read(tmp) + if n > 0 { + mu.Lock() + buf.Write(tmp[:n]) + lastByte = time.Now() + mu.Unlock() + } + if rerr != nil { + // EIO/EOF is normal on Linux when the PTY master is closed + // after the child exits. Not a real error. + return + } + } + }() + + start := time.Now() + + // Wait for warmup so the TUI/CLI has time to initialize. + select { + case <-time.After(warmup): + case <-ctx.Done(): + _ = ptmx.Close() + <-readDone + mu.Lock() + out := buf.String() + mu.Unlock() + return out, fmt.Errorf("pty_capture_idle: context cancelled during warmup: %w", ctx.Err()) + } + + // Send inputs one by one with stepDelay between them. + for _, in := range inputs { + if _, werr := ptmx.Write([]byte(in)); werr != nil { + // PTY may have closed already; stop sending. + break + } + select { + case <-time.After(stepDelay): + case <-ctx.Done(): + goto done + } + } + +done: + // Poll until idle or maxDur. + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + mu.Lock() + sinceLastByte := time.Since(lastByte) + mu.Unlock() + + elapsed := time.Since(start) + if sinceLastByte >= idle || elapsed >= maxDur { + goto shutdown + } + case <-ctx.Done(): + goto shutdown + } + } + +shutdown: + // Close the PTY master. This signals EOF to the reader goroutine. + _ = ptmx.Close() + + // Graceful shutdown: SIGTERM first, then SIGKILL after 2s. + if cmd.Process != nil { + _ = cmd.Process.Signal(syscall.SIGTERM) + killTimer := time.NewTimer(2 * time.Second) + waitCh := make(chan error, 1) + go func() { waitCh <- cmd.Wait() }() + select { + case <-waitCh: + // Process exited cleanly. + case <-killTimer.C: + _ = cmd.Process.Kill() + <-waitCh + } + killTimer.Stop() + } + + <-readDone + + mu.Lock() + out := buf.String() + mu.Unlock() + + return out, nil +} diff --git a/functions/infra/pty_capture_idle.md b/functions/infra/pty_capture_idle.md new file mode 100644 index 00000000..f214a502 --- /dev/null +++ b/functions/infra/pty_capture_idle.md @@ -0,0 +1,83 @@ +--- +name: pty_capture_idle +kind: function +lang: go +domain: infra +version: "1.0.0" +purity: impure +signature: "func PTYCaptureIdle(ctx context.Context, name string, args []string, warmup time.Duration, inputs []string, stepDelay, idle, maxDur time.Duration) (string, error)" +description: "Lanza un comando dentro de un pseudo-terminal (PTY) en memoria y captura todo su output hasta que el terminal permanece idle durante al menos `idle`, o se alcanza `maxDur`. Soporta envío de inputs interactivos tras el warmup inicial. Devuelve el output RAW con secuencias ANSI intactas." +tags: ["terminal", "pty", "tui", "capture", "automation", "terminal-capture"] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - "context" + - "time" + - "github.com/creack/pty" +tested: true +tests: + - "captura output de echo hola" + - "input interactivo con cat" + - "timeout duro con sleep 10" +test_file_path: "functions/infra/pty_capture_idle_test.go" +file_path: "functions/infra/pty_capture_idle.go" +params: + - name: ctx + desc: "Contexto de cancelación. Si se cancela, la función aborta la captura y retorna el output acumulado hasta ese momento." + - name: name + desc: "Nombre o path del ejecutable a lanzar (debe existir en PATH o ser un path absoluto)." + - name: args + desc: "Argumentos posicionales para el ejecutable. Puede ser nil o vacío." + - name: warmup + desc: "Tiempo que la función espera después de arrancar el proceso antes de enviar inputs. Permite que la TUI inicialice su render. Típico: 500ms–2s para CLIs lentas." + - name: inputs + desc: "Lista de strings a escribir al PTY en secuencia, uno por vez. Incluir '\\r' al final de cada string para simular Enter. Puede ser nil si solo se quiere observar la salida sin interactuar." + - name: stepDelay + desc: "Espera entre cada input enviado. Permite que la TUI procese y renderice la respuesta de cada paso antes de enviar el siguiente." + - name: idle + desc: "Tiempo sin nuevos bytes en el PTY que se considera 'respuesta terminada'. Cuando el terminal lleva idle sin actividad, la función retorna. Típico: 500ms–2s." + - name: maxDur + desc: "Timeout duro desde el inicio de la función. Garantiza que la función retorna aunque la TUI siga emitiendo output indefinidamente (spinners, relojes). Típico: 30s–120s." +output: "String con el output completo del terminal desde el arranque hasta la captura, incluyendo secuencias de escape ANSI. Vacío string si el proceso no produjo nada. Error si el PTY no pudo arrancar o el contexto fue cancelado durante warmup." +--- + +## Ejemplo + +```go +// Capturar una sesión de claude con un prompt automático +ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) +defer cancel() + +raw, err := PTYCaptureIdle( + ctx, + "claude", nil, + 2*time.Second, // warmup: esperar que claude cargue + []string{"hola, responde PONG\r"}, // inputs: enviar mensaje + Enter + 300*time.Millisecond, // stepDelay entre inputs + 2*time.Second, // idle: cortar cuando lleve 2s sin output + 120*time.Second, // maxDur: timeout duro +) +if err != nil { + log.Fatal(err) +} +// raw contiene el render completo con ANSI; limpiar antes de procesar texto: +// clean := StripANSI(raw) // strip_ansi_go_tui +fmt.Println(raw) +``` + +## Cuando usarla + +Cuando necesites automatizar o scriptear una CLI interactiva que solo entra en modo interactivo si detecta un TTY real (como `claude`, `vim`, `fzf`, `htop`, `python` REPL, `psql`). El PTY hace creer al proceso que habla con un terminal real, sin abrir ninguna ventana gráfica. + +## Gotchas + +- **Linux/Unix only.** Usa PTY POSIX (`creack/pty`). No funciona en Windows. +- **Output RAW con ANSI.** El string devuelto contiene secuencias de escape (`\x1b[...m`, cursor moves, etc.). Para convertirlo a texto plano: usa `vt_render_go_tui` (reconstruye el layout 2D — correcto para TUIs con posicionamiento absoluto como `claude` o `htop`) o `strip_ansi_go_core` (para output secuencial tipo log). `strip_ansi` sobre una TUI con layout absoluto deja las palabras pegadas porque los espacios entre columnas eran movimientos de cursor. +- **Idle es heurístico.** Si la TUI hace render periódico (spinners, relojes en pantalla, progress bars continuas), el idle nunca se dispara y la función esperará hasta `maxDur`. Aumentar `maxDur` o matar el spinner antes de capturar. +- **El binario debe existir en PATH** (o usar path absoluto en `name`). La función devuelve error si `pty.Start` falla. +- **EIO/EOF al cerrar PTY es normal en Linux.** El goroutine lector lo absorbe silenciosamente; no se propaga como error. +- **SIGTERM → SIGKILL.** Al terminar la captura, la función envía SIGTERM al proceso y espera 2s antes de SIGKILL. Procesos que ignoran SIGTERM (como `sleep`) se matan limpiamente. +- **Tamaño de terminal fijado a 40×120.** Suficiente para la mayoría de TUIs. Si el render se ve truncado, el llamador puede hacer `pty.Setsize` adicional después de obtener el ptmx (no expuesto por esta función; para casos avanzados, reimplementar con acceso directo al ptmx). diff --git a/functions/infra/pty_capture_idle_test.go b/functions/infra/pty_capture_idle_test.go new file mode 100644 index 00000000..84b227b3 --- /dev/null +++ b/functions/infra/pty_capture_idle_test.go @@ -0,0 +1,74 @@ +package infra + +import ( + "context" + "strings" + "testing" + "time" +) + +func TestPTYCaptureIdle(t *testing.T) { + t.Run("captura output de echo hola", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto") + } + ctx := context.Background() + out, err := PTYCaptureIdle(ctx, "echo", []string{"hola"}, 100*time.Millisecond, nil, 0, 300*time.Millisecond, 5*time.Second) + if err != nil { + t.Fatalf("error inesperado: %v", err) + } + if !strings.Contains(out, "hola") { + t.Errorf("se esperaba 'hola' en el output, got: %q", out) + } + }) + + t.Run("input interactivo con cat", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto: timing sensible en CI") + } + ctx := context.Background() + // cat repite stdin a stdout via PTY; el PTY hace echo del input ademas. + // "ping\r" simula Enter; la palabra "ping" debe aparecer en el output. + out, err := PTYCaptureIdle( + ctx, + "cat", nil, + 200*time.Millisecond, + []string{"ping\r"}, + 100*time.Millisecond, + 500*time.Millisecond, + 5*time.Second, + ) + if err != nil { + t.Fatalf("error inesperado: %v", err) + } + if !strings.Contains(out, "ping") { + t.Errorf("se esperaba 'ping' en el output, got: %q", out) + } + }) + + t.Run("timeout duro con sleep 10", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto: espera ~1s de timeout") + } + ctx := context.Background() + start := time.Now() + _, err := PTYCaptureIdle( + ctx, + "sleep", []string{"10"}, + 50*time.Millisecond, + nil, + 0, + 600*time.Millisecond, + 1*time.Second, + ) + elapsed := time.Since(start) + if err != nil { + // Un error de señal/exit es esperado; no falla el test. + t.Logf("error (esperado al matar sleep): %v", err) + } + // La función debe retornar en menos de 3s, no esperar los 10s del sleep. + if elapsed >= 3*time.Second { + t.Errorf("la función tardó %v, se esperaba < 3s", elapsed) + } + }) +} diff --git a/functions/infra/pty_capture_stream.go b/functions/infra/pty_capture_stream.go new file mode 100644 index 00000000..78f5e0f9 --- /dev/null +++ b/functions/infra/pty_capture_stream.go @@ -0,0 +1,176 @@ +package infra + +import ( + "bytes" + "context" + "fmt" + "os/exec" + "sync" + "syscall" + "time" + + "github.com/creack/pty" +) + +// PTYCaptureStream launches a command inside a pseudo-terminal (PTY) and +// streams periodic snapshots of the accumulated output through a channel. +// Unlike PTYCaptureIdle, which returns the full output at the end, +// PTYCaptureStream emits the ENTIRE buffer accumulated so far on every +// snapshotInterval tick — allowing callers to observe the terminal render +// while the process is still running. +// +// The returned channel is closed when capture ends (idle/maxDur/ctx cancel). +// The last value sent before closing is always a final snapshot of the +// complete buffer, regardless of tick alignment. +// +// Callers MUST drain the channel or cancel ctx to avoid blocking the +// internal goroutine. Error is returned only if pty.Start fails. +func PTYCaptureStream( + ctx context.Context, + name string, + args []string, + warmup time.Duration, + inputs []string, + stepDelay time.Duration, + snapshotInterval time.Duration, + idle time.Duration, + maxDur time.Duration, +) (<-chan string, error) { + cmd := exec.CommandContext(ctx, name, args...) + + ptmx, err := pty.Start(cmd) + if err != nil { + return nil, fmt.Errorf("pty_capture_stream: pty.Start: %w", err) + } + + // Set a reasonable terminal size so TUIs render without truncating. + if szErr := pty.Setsize(ptmx, &pty.Winsize{Rows: 40, Cols: 120}); szErr != nil { + // Non-fatal: continue even if resize fails. + _ = szErr + } + + var ( + mu sync.Mutex + buf bytes.Buffer + lastByte = time.Now() + ) + + // Reader goroutine: copy PTY output into buf and track last-byte time. + readDone := make(chan struct{}) + go func() { + defer close(readDone) + tmp := make([]byte, 4096) + for { + n, rerr := ptmx.Read(tmp) + if n > 0 { + mu.Lock() + buf.Write(tmp[:n]) + lastByte = time.Now() + mu.Unlock() + } + if rerr != nil { + // EIO/EOF is normal on Linux when the PTY master is closed + // after the child exits. Not a real error. + return + } + } + }() + + ch := make(chan string, 16) + + // snapshot returns a copy of the current buffer contents. + snapshot := func() string { + mu.Lock() + s := buf.String() + mu.Unlock() + return s + } + + // send emits a snapshot to ch, respecting ctx cancellation. + send := func(s string) bool { + select { + case ch <- s: + return true + case <-ctx.Done(): + return false + } + } + + // Conducting goroutine: handles warmup, inputs, periodic snapshots, + // idle/maxDur detection, and shutdown. + go func() { + defer func() { + // Shutdown: close PTY master, SIGTERM → SIGKILL, wait reader. + _ = ptmx.Close() + if cmd.Process != nil { + _ = cmd.Process.Signal(syscall.SIGTERM) + killTimer := time.NewTimer(2 * time.Second) + waitCh := make(chan error, 1) + go func() { waitCh <- cmd.Wait() }() + select { + case <-waitCh: + // Process exited cleanly. + case <-killTimer.C: + _ = cmd.Process.Kill() + <-waitCh + } + killTimer.Stop() + } + <-readDone + // Final snapshot — always emitted so consumers get the complete state. + send(snapshot()) + close(ch) + }() + + start := time.Now() + + // Wait for warmup so the TUI/CLI has time to initialize. + select { + case <-time.After(warmup): + case <-ctx.Done(): + return + } + + // Send inputs one by one with stepDelay between them. + for _, in := range inputs { + if _, werr := ptmx.Write([]byte(in)); werr != nil { + // PTY may have closed already; stop sending. + break + } + select { + case <-time.After(stepDelay): + case <-ctx.Done(): + return + } + } + + // Main loop: emit snapshots on ticker, cut on idle or maxDur. + ticker := time.NewTicker(snapshotInterval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + // Emit current accumulated snapshot. + if !send(snapshot()) { + return + } + + // Check termination conditions. + mu.Lock() + sinceLastByte := time.Since(lastByte) + mu.Unlock() + + elapsed := time.Since(start) + if sinceLastByte >= idle || elapsed >= maxDur { + return + } + + case <-ctx.Done(): + return + } + } + }() + + return ch, nil +} diff --git a/functions/infra/pty_capture_stream.md b/functions/infra/pty_capture_stream.md new file mode 100644 index 00000000..fd499795 --- /dev/null +++ b/functions/infra/pty_capture_stream.md @@ -0,0 +1,100 @@ +--- +name: pty_capture_stream +kind: function +lang: go +domain: infra +version: "1.0.0" +purity: impure +signature: "func PTYCaptureStream(ctx context.Context, name string, args []string, warmup time.Duration, inputs []string, stepDelay, snapshotInterval, idle, maxDur time.Duration) (<-chan string, error)" +description: "Lanza un comando dentro de un pseudo-terminal (PTY) y emite snapshots acumulativos del buffer de output a través de un canal, en intervalos regulares. Cada snapshot es el contenido RAW completo del PTY hasta ese instante (ANSI incluido). Permite hacer streaming del render de una TUI mientras sigue generando, sin esperar al final." +tags: ["terminal", "pty", "tui", "capture", "automation", "streaming", "terminal-capture"] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: + - "context" + - "time" + - "github.com/creack/pty" +tested: true +tests: + - "snapshots crecientes con pausas" + - "snapshot final siempre presente" + - "timeout duro con sleep 10" +test_file_path: "functions/infra/pty_capture_stream_test.go" +file_path: "functions/infra/pty_capture_stream.go" +params: + - name: ctx + desc: "Contexto de cancelación. Si se cancela, la goroutine interna aborta, emite el snapshot final y cierra el canal." + - name: name + desc: "Nombre o path del ejecutable a lanzar (debe existir en PATH o ser un path absoluto)." + - name: args + desc: "Argumentos posicionales para el ejecutable. Puede ser nil o vacío." + - name: warmup + desc: "Tiempo que se espera después de arrancar el proceso antes de enviar inputs. Permite que la TUI inicialice su render. Típico: 500ms–4s para CLIs lentas como claude." + - name: inputs + desc: "Lista de strings a escribir al PTY en secuencia. Incluir '\\r' al final para simular Enter. Puede ser nil si solo se quiere observar sin interactuar." + - name: stepDelay + desc: "Espera entre cada input enviado. Permite que la TUI procese y renderice la respuesta de cada paso antes de enviar el siguiente." + - name: snapshotInterval + desc: "Cada cuánto tiempo se emite un snapshot del buffer acumulado al canal. Controla la frecuencia de actualización del streaming. Valores recomendados: 100ms–300ms. Por debajo de 50ms genera mucho ruido y CPU innecesario." + - name: idle + desc: "Tiempo sin nuevos bytes en el PTY que se considera 'respuesta terminada'. Cuando el terminal lleva este tiempo sin actividad, la captura finaliza. Típico: 2s–4s para claude, 500ms para CLIs rápidas." + - name: maxDur + desc: "Timeout duro desde el inicio de la función. Garantiza que el canal se cierra aunque la TUI siga emitiendo (spinners, relojes, progress bars). Típico: 60s–120s para prompts de claude." +output: "Canal de strings (<-chan string). Cada string es el output RAW acumulado del terminal desde el arranque hasta ese instante, con secuencias ANSI intactas (no deltas). El canal se cierra cuando termina la captura; el último valor enviado antes del cierre es siempre el snapshot final completo. Error si pty.Start falla al arrancar el proceso." +--- + +## Ejemplo + +```go +// Streaming de una sesión claude: ver la respuesta formarse en tiempo real. +ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) +defer cancel() + +ch, err := PTYCaptureStream( + ctx, + "claude", nil, + 4*time.Second, // warmup: esperar que claude cargue + []string{"hola, responde PONG\r"}, // inputs: enviar mensaje + Enter + 300*time.Millisecond, // stepDelay entre inputs + 150*time.Millisecond, // snapshotInterval: snapshot cada 150ms + 4*time.Second, // idle: cortar cuando lleve 4s sin output + 120*time.Second, // maxDur: timeout duro +) +if err != nil { + log.Fatal(err) +} + +var lastRender string +for raw := range ch { + // Aplicar VT render para reconstruir la pantalla 2D desde ANSI. + screen := VTRender(raw) // vt_render_go_tui + // Parsear el estado actual de la respuesta de claude. + resp := ParseClaudeTUI(screen) // parse_claude_tui_go_tui + if resp.Response != lastRender { + fmt.Printf("\r[streaming] %s", resp.Response) + lastRender = resp.Response + } +} +// Al salir del for, el canal está cerrado: captura terminada. +fmt.Println("\n[done]", lastRender) +``` + +## Cuando usarla + +Cuando quieras observar el render de una TUI **mientras sigue generando** — por ejemplo, ver la respuesta de `claude` formarse en tiempo real en lugar de esperar al final. Cada snapshot del canal es el estado completo de la pantalla en ese instante; aplica `vt_render_go_tui` + `parse_claude_tui_go_tui` para extraer texto interpretado de cada frame. + +Para captura one-shot (solo quieres el output final), usa `pty_capture_idle_go_infra` — más simple, sin goroutina consumidora. + +## Gotchas + +- **Linux/Unix only.** Usa PTY POSIX (`creack/pty`). No funciona en Windows. +- **Snapshots ACUMULATIVOS, no deltas.** Cada string del canal es el buffer completo desde el inicio, no solo los bytes nuevos. Para calcular lo nuevo en cada tick: `delta := snapshot[len(prevSnapshot):]` — o usa `text_prefix_delta_go_core` si existe. El consumidor decide si quiere el frame completo o el incremento. +- **El consumidor DEBE drenar el canal o cancelar ctx.** Si el canal (capacidad 16) se llena y el consumidor deja de leer, la goroutina interna se bloquea. Patrón seguro: `for range ch {}` en goroutina separada si no se necesita el contenido. +- **La TUI re-renderiza el frame entero.** El buffer crudo crece monotónicamente en bytes, pero el render VT interpretado puede no ser monótono (la TUI puede limpiar la pantalla y re-dibujar). Comparar `VTRender(snapshot)` frame a frame para detectar cambios reales. +- **snapshotInterval < 50ms genera ruido.** El output ANSI de una TUI activa puede cambiar miles de veces por segundo; muestrear muy rápido satura el canal con frames casi idénticos y consume CPU innecesariamente. +- **Idle es heurístico.** Si la TUI tiene spinners o progress bars que emiten bytes continuamente, `idle` nunca se dispara y la función espera hasta `maxDur`. Subir `maxDur` o detener el spinner antes de capturar. +- **EIO/EOF al cerrar PTY es normal en Linux.** El goroutine lector lo absorbe silenciosamente. +- **SIGTERM → SIGKILL.** Al terminar, se envía SIGTERM y se espera 2s antes de SIGKILL. diff --git a/functions/infra/pty_capture_stream_test.go b/functions/infra/pty_capture_stream_test.go new file mode 100644 index 00000000..c721cdc8 --- /dev/null +++ b/functions/infra/pty_capture_stream_test.go @@ -0,0 +1,120 @@ +package infra + +import ( + "context" + "strings" + "testing" + "time" +) + +func TestPTYCaptureStream(t *testing.T) { + + t.Run("snapshots crecientes con pausas", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto: timing sensible") + } + ctx := context.Background() + // bash -lc imprime A, pausa 0.3s, B, pausa 0.3s, C, pausa 0.3s. + // Con snapshotInterval 100ms e idle 400ms debería recibir varios snapshots + // y el último debe contener A, B y C. + ch, err := PTYCaptureStream( + ctx, + "bash", []string{"-lc", "printf A; sleep 0.3; printf B; sleep 0.3; printf C; sleep 0.3"}, + 50*time.Millisecond, // warmup + nil, // inputs + 0, // stepDelay + 100*time.Millisecond, // snapshotInterval + 400*time.Millisecond, // idle + 5*time.Second, // maxDur + ) + if err != nil { + t.Fatalf("error inesperado al arrancar: %v", err) + } + + var snapshots []string + for s := range ch { + snapshots = append(snapshots, s) + } + + if len(snapshots) < 2 { + t.Errorf("se esperaban >=2 snapshots, got %d", len(snapshots)) + } + + // Snapshots deben ser acumulativos (monótonos en longitud). + for i := 1; i < len(snapshots); i++ { + if len(snapshots[i]) < len(snapshots[i-1]) { + t.Errorf("snapshot[%d] len=%d < snapshot[%d] len=%d — no acumulativo", + i, len(snapshots[i]), i-1, len(snapshots[i-1])) + } + } + + // El último snapshot debe contener A, B y C. + last := snapshots[len(snapshots)-1] + for _, want := range []string{"A", "B", "C"} { + if !strings.Contains(last, want) { + t.Errorf("último snapshot no contiene %q: %q", want, last) + } + } + }) + + t.Run("snapshot final siempre presente", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto") + } + ctx := context.Background() + // Output instantáneo; con idle 300ms el canal cierra rápido. + ch, err := PTYCaptureStream( + ctx, + "bash", []string{"-lc", "printf HOLA"}, + 50*time.Millisecond, + nil, + 0, + 150*time.Millisecond, // snapshotInterval + 300*time.Millisecond, // idle + 5*time.Second, + ) + if err != nil { + t.Fatalf("error inesperado: %v", err) + } + + var last string + for s := range ch { + last = s + } + + if !strings.Contains(last, "HOLA") { + t.Errorf("último snapshot no contiene 'HOLA': %q", last) + } + }) + + t.Run("timeout duro con sleep 10", func(t *testing.T) { + if testing.Short() { + t.Skip("skip en modo corto: espera ~1s de timeout") + } + ctx := context.Background() + start := time.Now() + ch, err := PTYCaptureStream( + ctx, + "sleep", []string{"10"}, + 50*time.Millisecond, + nil, + 0, + 200*time.Millisecond, // snapshotInterval + 600*time.Millisecond, // idle + 1*time.Second, // maxDur duro en 1s + ) + if err != nil { + t.Fatalf("error inesperado al arrancar: %v", err) + } + + // Drenar completamente el canal. + for range ch { + } + + elapsed := time.Since(start) + // La función debe retornar en menos de 3s, no esperar los 10s del sleep. + if elapsed >= 3*time.Second { + t.Errorf("la función tardó %v, se esperaba < 3s", elapsed) + } + }) +} diff --git a/functions/tui/parse_claude_tui.go b/functions/tui/parse_claude_tui.go new file mode 100644 index 00000000..150617e1 --- /dev/null +++ b/functions/tui/parse_claude_tui.go @@ -0,0 +1,390 @@ +package tui + +import ( + "regexp" + "strings" + "unicode" +) + +// Unicode markers used by the Claude Code TUI. +const ( + markerUser = '❯' // U+276F — user prompt + markerAssistant = '●' // U+25CF — assistant response / tool call + markerToolResult = '⎿' // U+23BF — tool result + markerProgress = '✻' // U+273B — progress indicator (ignore) + markerBoxTL = '╭' // U+256D — top-left box corner (banner start) + markerBoxBL = '╰' // U+2570 — bottom-left box corner (banner end) + markerBoxBR = '╯' // U+256F — bottom-right box corner (banner end) + markerHRule = '─' // U+2500 — horizontal rule +) + +// reToolUse matches "Identifier(anything)" — a tool_use line. +var reToolUse = regexp.MustCompile(`^([A-Za-z_][A-Za-z0-9_]*)\((.*)\)\s*$`) + +// reProgress matches Claude's generation status/spinner line by its stable +// signature: "(Ns … tokens" or "esc to interrupt". Used when the line still +// carries that suffix, e.g. "✽ Whatchamacalliting… (2s · ↓ 1 tokens · esc to interrupt)". +var reProgress = regexp.MustCompile(`\(\d+s\b[^)]*tokens?\b|esc to interrupt`) + +// reSpinner matches the spinner line by STRUCTURE rather than by its (infinite, +// ever-changing) gerund word: a non-alphanumeric glyph (✻ ✽ ✢ ✶ ✺ …) followed by +// a single word and a horizontal ellipsis, e.g. "✽ Forging…" or "✶ Puzzling…". +// This catches early frames that don't yet show the "(Ns · tokens)" suffix. The +// caller guards known turn markers (●/❯/⎿) so a legitimate answer ending in "…" +// is not misclassified. +var reSpinner = regexp.MustCompile(`^\s*[^\p{L}\p{N}\s]\s+\p{L}[\p{L}'’\-]*…`) + +// ClaudeTurnRole classifies each turn/block extracted from the screen. +type ClaudeTurnRole string + +const ( + // ClaudeTurnUser is a message typed by the user (line starting with "❯ "). + ClaudeTurnUser ClaudeTurnRole = "user" + // ClaudeTurnAssistant is a response block from the assistant. + ClaudeTurnAssistant ClaudeTurnRole = "assistant" + // ClaudeTurnToolUse is a tool invocation "● ToolName(args)". + ClaudeTurnToolUse ClaudeTurnRole = "tool_use" + // ClaudeTurnToolResult is a result line "⎿ ..." following a tool_use. + ClaudeTurnToolResult ClaudeTurnRole = "tool_result" +) + +// ClaudeTurn is a single conversation block extracted from the rendered screen. +type ClaudeTurn struct { + Role ClaudeTurnRole `json:"role"` + Text string `json:"text"` // textual content (multiline joined with \n) + ToolName string `json:"tool_name,omitempty"` // only for tool_use +} + +// ClaudeTUIParse is the result of parsing one captured Claude TUI screen. +type ClaudeTUIParse struct { + Turns []ClaudeTurn `json:"turns"` // all visible turns in order + Answer string `json:"answer"` // assistant reply to the last user turn (like `claude -p`) +} + +// ParseClaudeTUI parses the rendered text of a Claude Code TUI screen and +// extracts the conversation turns and the final assistant answer. +// +// The screen is expected to be the output of VTRender applied to a PTY +// capture of the claude CLI. Heuristics handle the welcome banner, status +// bar, progress lines and multi-line continuations. +func ParseClaudeTUI(screen string) ClaudeTUIParse { + lines := strings.Split(screen, "\n") + + // --- Step 1: strip the welcome banner (box drawn with ╭...╰/╯) --- + lines = stripBanner(lines) + + // --- Step 2: strip the status bar at the bottom --- + lines = stripStatusBar(lines) + + // --- Step 3: collect turns from the remaining lines --- + turns := extractTurns(lines) + + // --- Step 4: compute Answer from turns --- + answer := computeAnswer(turns) + + return ClaudeTUIParse{Turns: turns, Answer: answer} +} + +// stripBanner removes the welcome banner block from the top of the lines +// slice. The banner is a Unicode box that starts with a line containing ╭ +// and ends with a line containing ╰ or ╯. +func stripBanner(lines []string) []string { + // Find a banner start (╭) in the first ~15 lines. + startIdx := -1 + for i := 0; i < len(lines) && i < 15; i++ { + if strings.ContainsRune(lines[i], markerBoxTL) { + startIdx = i + break + } + } + if startIdx < 0 { + return lines + } + + // Find the matching close (╰ or ╯) after the start. + for i := startIdx; i < len(lines); i++ { + if strings.ContainsRune(lines[i], markerBoxBL) || strings.ContainsRune(lines[i], markerBoxBR) { + return lines[i+1:] + } + } + return lines +} + +// isHRule returns true when the line consists mostly of ─ (U+2500) characters +// — at least 40 of them and the line has no other significant content. +func isHRule(line string) bool { + count := 0 + for _, r := range line { + if r == markerHRule { + count++ + } + } + return count >= 40 +} + +// isStatusBarLine returns true for lines that belong to the Claude status bar +// (CTX:, IN:, OUT:, Total:, Limits:, $, "← for agents", etc.). +func isStatusBarLine(line string) bool { + trimmed := strings.TrimSpace(line) + if trimmed == "" { + return false + } + prefixes := []string{ + "CTX:", "IN:", "OUT:", "Total:", "Limits:", "$", "← for agents", + } + for _, p := range prefixes { + if strings.Contains(trimmed, p) { + return true + } + } + return false +} + +// stripStatusBar removes the status bar at the bottom of the lines slice. +// Strategy: scan from the bottom upward. The footer looks like: +// +// +// ❯ (empty prompt) +// +// +// +// We look for the LAST hrule that is followed by an empty-prompt line and +// another hrule, and discard everything from that hrule onward. +// Additionally, any trailing status-bar-flavored lines are dropped first. +func stripStatusBar(lines []string) []string { + if len(lines) == 0 { + return lines + } + + // Trim trailing blank lines first. + end := len(lines) + for end > 0 && strings.TrimSpace(lines[end-1]) == "" { + end-- + } + lines = lines[:end] + + // Remove explicit status-bar lines from the bottom. + for len(lines) > 0 && isStatusBarLine(lines[len(lines)-1]) { + lines = lines[:len(lines)-1] + } + + // Now find the pattern: hrule / empty-❯ / hrule and cut there. + // Scan from the bottom upward. + for i := len(lines) - 1; i >= 2; i-- { + if !isHRule(lines[i]) { + continue + } + // Check that lines[i-1] is the empty prompt "❯" (optional surrounding spaces). + mid := strings.TrimSpace(lines[i-1]) + if mid != string([]rune{markerUser}) && mid != string([]rune{markerUser, ' '}) { + // Also allow a completely empty line (prompt area can be blank). + if mid != "" { + continue + } + } + // Check lines[i-2] is also an hrule. + if isHRule(lines[i-2]) { + // Cut from lines[i-2] onward. + lines = lines[:i-2] + break + } + } + + // Trim trailing blank lines again after stripping. + for len(lines) > 0 && strings.TrimSpace(lines[len(lines)-1]) == "" { + lines = lines[:len(lines)-1] + } + + return lines +} + +// firstRune returns the first non-space rune in s, or 0 if s is blank. +func firstRune(s string) rune { + for _, r := range s { + if !unicode.IsSpace(r) { + return r + } + } + return 0 +} + +// isMarkerLine returns true when the line starts with one of the recognised +// turn markers (❯, ●, ⎿, ✻). +func isMarkerLine(line string) bool { + r := firstRune(line) + return r == markerUser || r == markerAssistant || r == markerToolResult || r == markerProgress +} + +// isProgressLine reports whether the line is a Claude generation status/spinner +// line (the animated "✻/✽ Word… (Ns · ↓ N tokens · esc to interrupt)" indicator). +// The glyph and the gerund word change on every frame, so it is detected by +// structure/signature, never by the specific word. These lines are noise and must +// never be folded into an assistant answer — critical when capturing frames +// mid-generation (streaming), where a different "loading" word appears each tick. +func isProgressLine(line string) bool { + r := firstRune(line) + if r == markerProgress { + return true + } + // Known turn markers are never progress, even if they end in "…". + if r == markerUser || r == markerAssistant || r == markerToolResult { + return false + } + return reProgress.MatchString(line) || reSpinner.MatchString(line) +} + +// isBreakLine reports whether the line should end an assistant/user/tool +// continuation: either a turn marker or a progress/spinner line. +func isBreakLine(line string) bool { + return isMarkerLine(line) || isProgressLine(line) +} + +// textAfterMarker returns the text that follows the first occurrence of +// marker in line, trimmed of leading spaces. +func textAfterMarker(line string, marker rune) string { + idx := strings.IndexRune(line, marker) + if idx < 0 { + return "" + } + rest := line[idx+len(string(marker)):] + return strings.TrimLeft(rest, " ") +} + +// extractTurns scans lines and groups them into ClaudeTurn slices. +func extractTurns(lines []string) []ClaudeTurn { + var turns []ClaudeTurn + + i := 0 + for i < len(lines) { + line := lines[i] + + // Progress/spinner lines are noise in any position — skip early so they + // are never folded into an assistant continuation (matters for streaming). + if isProgressLine(line) { + i++ + continue + } + + r := firstRune(line) + + switch r { + case markerProgress: + // ✻ lines are noise — skip (also covered by isProgressLine above). + i++ + + case markerUser: + text := textAfterMarker(line, markerUser) + if text == "" { + // Empty prompt — skip. + i++ + continue + } + // Collect continuation lines (indented, non-marker, non-empty). + i++ + for i < len(lines) { + cont := lines[i] + if isBreakLine(cont) || strings.TrimSpace(cont) == "" { + break + } + text += "\n" + strings.TrimRight(cont, " ") + i++ + } + turns = append(turns, ClaudeTurn{Role: ClaudeTurnUser, Text: strings.TrimRight(text, " ")}) + + case markerAssistant: + body := textAfterMarker(line, markerAssistant) + i++ + + // Determine if this is a tool_use or assistant text. + if m := reToolUse.FindStringSubmatch(body); m != nil { + // tool_use — do NOT collect continuation lines. + turns = append(turns, ClaudeTurn{ + Role: ClaudeTurnToolUse, + Text: body, + ToolName: m[1], + }) + } else { + // assistant text — collect continuation lines. + for i < len(lines) { + cont := lines[i] + if isBreakLine(cont) { + break + } + trimmed := strings.TrimSpace(cont) + if trimmed == "" { + // A single blank line may separate paragraphs; peek ahead. + // If the next non-blank line is also a continuation, keep it. + j := i + 1 + for j < len(lines) && strings.TrimSpace(lines[j]) == "" { + j++ + } + if j < len(lines) && !isBreakLine(lines[j]) { + // Include the blank line(s) as paragraph separator. + body += "\n" + i = j + continue + } + break + } + body += "\n" + strings.TrimRight(cont, " ") + i++ + } + turns = append(turns, ClaudeTurn{ + Role: ClaudeTurnAssistant, + Text: strings.TrimRight(body, " \n"), + }) + } + + case markerToolResult: + text := textAfterMarker(line, markerToolResult) + // Also accept └ as alias (some terminals substitute). + if text == "" { + text = textAfterMarker(line, '└') + } + i++ + // Collect continuation lines for the tool result. + for i < len(lines) { + cont := lines[i] + if isBreakLine(cont) || strings.TrimSpace(cont) == "" { + break + } + text += "\n" + strings.TrimRight(cont, " ") + i++ + } + turns = append(turns, ClaudeTurn{ + Role: ClaudeTurnToolResult, + Text: strings.TrimRight(text, " "), + }) + + default: + // Blank or unrecognised line — skip. + i++ + } + } + + return turns +} + +// computeAnswer finds the last user turn and concatenates all assistant +// (non-tool_use, non-tool_result) turns that follow it. +// If there is no user turn, concatenates all assistant turns. +func computeAnswer(turns []ClaudeTurn) string { + lastUserIdx := -1 + for i, t := range turns { + if t.Role == ClaudeTurnUser { + lastUserIdx = i + } + } + + var parts []string + start := 0 + if lastUserIdx >= 0 { + start = lastUserIdx + 1 + } + for _, t := range turns[start:] { + if t.Role == ClaudeTurnAssistant { + parts = append(parts, t.Text) + } + } + return strings.TrimSpace(strings.Join(parts, "\n")) +} diff --git a/functions/tui/parse_claude_tui.md b/functions/tui/parse_claude_tui.md new file mode 100644 index 00000000..2c6f8ae6 --- /dev/null +++ b/functions/tui/parse_claude_tui.md @@ -0,0 +1,67 @@ +--- +name: parse_claude_tui +kind: function +lang: go +domain: tui +version: "1.0.0" +purity: pure +signature: "func ParseClaudeTUI(screen string) ClaudeTUIParse" +description: "Parsea el texto renderizado de la pantalla de la TUI de Claude Code y extrae los turnos de la conversación (user, assistant, tool_use, tool_result) y la respuesta final del asistente. Equivalente a lo que devolvería `claude -p` pero operando sobre el render visual." +tags: [terminal-capture, claude, tui, parse, conversation] +uses_functions: + - vt_render_go_tui +uses_types: + - claude_turn_go_tui + - claude_tui_parse_go_tui +returns: + - claude_tui_parse_go_tui +returns_optional: false +error_type: "" +imports: [] +params: + - name: screen + desc: "Texto renderizado de la pantalla de la TUI de Claude Code, producido por VTRender(raw, rows, cols). Debe incluir el contenido visible completo: banner opcional, conversación y status bar opcional." +output: "ClaudeTUIParse con los turnos visibles en orden (Role, Text, ToolName) y Answer — la concatenación de los bloques assistant que siguen al último turno user, equivalente al output de `claude -p`." +tested: true +tests: + - "golden screen — banner + status bar + single Q&A" + - "multiline assistant response" + - "tool_use + tool_result + final assistant text" + - "multi-turn — answer from last user only" + - "no banner no status bar — minimal screen" + - "determinism — same input produces same output" +test_file_path: "functions/tui/parse_claude_tui_test.go" +file_path: "functions/tui/parse_claude_tui.go" +--- + +## Ejemplo + +```go +// Pipeline completo: PTY capture → VTRender → ParseClaudeTUI → usar .Answer +import ( + "fmt" + "fn-registry/functions/infra" + "fn-registry/functions/tui" +) + +raw, _ := infra.PtyCaptureIdle("claude", []string{}, 40, 220, 8000) +screen := tui.VTRender(raw, 40, 220) +result := tui.ParseClaudeTUI(screen) + +fmt.Println(result.Answer) // imprime la respuesta final del asistente + +for _, turn := range result.Turns { + fmt.Printf("[%s] %s\n", turn.Role, turn.Text) +} +``` + +## Cuando usarla + +Cuando captures la TUI de `claude` con `pty_capture_idle_go_infra` + `vt_render_go_tui` y necesites extraer la respuesta como dato estructurado (equivalente a `claude -p`) en vez de procesar el render visual crudo. Úsala para agentes que lanzan `claude` como subproceso TUI y quieren leer la respuesta sin requerir modo headless. + +## Gotchas + +- **Heurístico y dependiente del layout de la TUI de Claude Code**: si Claude cambia los marcadores (`❯`, `●`, `⎿`, `✻`) o el formato del banner/status-bar, el parser puede dejar de funcionar sin aviso. +- **Solo ve lo visible en el grid**: `VTRender` reconstruye únicamente lo que cabe en el terminal emulado (rows × cols). Respuestas largas que hacen scroll hacia arriba se truncan por arriba — no hay scrollback. Para respuestas largas, aumentar `rows` en `VTRender` o usar `claude -p` directamente. +- **tool_use/tool_result best-effort**: la TUI colapsa algunos bloques de herramientas. Los `ToolName` y textos de `tool_result` pueden quedar incompletos si la TUI los trunca con `…`. +- **Answer asume captura post-respuesta**: `PtyCaptureIdle` debe haberse disparado DESPUÉS de que la respuesta terminó de renderizarse (el spinner `✻` desapareció). Si se captura durante el streaming, `Answer` puede estar incompleto. diff --git a/functions/tui/parse_claude_tui_test.go b/functions/tui/parse_claude_tui_test.go new file mode 100644 index 00000000..eb3753e3 --- /dev/null +++ b/functions/tui/parse_claude_tui_test.go @@ -0,0 +1,214 @@ +package tui + +import ( + "testing" +) + +// goldenScreen is the exact sample screen from the spec. +const goldenScreen = `╭─── Claude Code v2.1.161 ─────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ Tips for getting started │ +│ Welcome back Enmanuel! │ Run /init to create a CLAUDE.md file with instructions for Cla… │ +│ │ ─────────────────────────────────────────────────────────────── │ +│ ▐▛███▜▌ │ What's new │ +│ ▝▜█████▛▘ │ ` + "`OTEL_RESOURCE_ATTRIBUTES`" + ` values are now included as labels o… │ +│ ▘▘ ▝▝ │ ` + "`claude agents`" + ` rows now show ` + "`done/total`" + ` before the detail w… │ +│ Opus 4.8 (1M context) with xh… · Claude Max · │ ` + "`/mcp`" + ` now collapses claude.ai connectors you've never signed … │ +│ gutierenmanuel15@gmail.com's Organization │ /release-notes for more │ +│ ~/fn_registry │ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + +❯ responde unicamente con la palabra PONG, sin explicaciones + +● PONG + +✻ Crunched for 2s + + +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +❯ +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Opus 4.8 (1M context) │ CTX: █░░░░░░░░░ 11% (107k/1.0M) │ IN:6k OUT:5 (cache:17k) │ ⎇ master [~4 ?28 ↑1] │ 22:26 + $0.565 │ +0/-0 │ Total: ↓107k/↑5 │ Limits: 5h:6% →02:40 │ 7d:11% →Sun 17:00 │ ⏱ 7s │ ~/fn_registry + ← for agents` + +func TestParseClaudeTUI(t *testing.T) { + t.Run("golden screen — banner + status bar + single Q&A", func(t *testing.T) { + got := ParseClaudeTUI(goldenScreen) + + if got.Answer != "PONG" { + t.Errorf("Answer = %q, want %q", got.Answer, "PONG") + } + if len(got.Turns) != 2 { + t.Errorf("len(Turns) = %d, want 2", len(got.Turns)) + for i, turn := range got.Turns { + t.Logf(" Turns[%d]: role=%s text=%q", i, turn.Role, turn.Text) + } + return + } + if got.Turns[0].Role != ClaudeTurnUser { + t.Errorf("Turns[0].Role = %q, want %q", got.Turns[0].Role, ClaudeTurnUser) + } + wantUserText := "responde unicamente con la palabra PONG, sin explicaciones" + if got.Turns[0].Text != wantUserText { + t.Errorf("Turns[0].Text = %q, want %q", got.Turns[0].Text, wantUserText) + } + if got.Turns[1].Role != ClaudeTurnAssistant { + t.Errorf("Turns[1].Role = %q, want %q", got.Turns[1].Role, ClaudeTurnAssistant) + } + if got.Turns[1].Text != "PONG" { + t.Errorf("Turns[1].Text = %q, want %q", got.Turns[1].Text, "PONG") + } + }) + + t.Run("multiline assistant response", func(t *testing.T) { + screen := `❯ explica brevemente + +● linea uno +linea dos` + got := ParseClaudeTUI(screen) + if len(got.Turns) != 2 { + t.Fatalf("len(Turns) = %d, want 2; turns: %+v", len(got.Turns), got.Turns) + } + wantText := "linea uno\nlinea dos" + if got.Turns[1].Text != wantText { + t.Errorf("Turns[1].Text = %q, want %q", got.Turns[1].Text, wantText) + } + if !contains(got.Answer, "linea uno") || !contains(got.Answer, "linea dos") { + t.Errorf("Answer %q should contain both continuation lines", got.Answer) + } + }) + + t.Run("tool_use + tool_result + final assistant text", func(t *testing.T) { + screen := `❯ pregunta + +● Read(main.go) + + ⎿ Read 50 lines + +● aqui esta el resumen` + got := ParseClaudeTUI(screen) + + if len(got.Turns) != 4 { + t.Fatalf("len(Turns) = %d, want 4; turns: %+v", len(got.Turns), got.Turns) + } + if got.Turns[0].Role != ClaudeTurnUser { + t.Errorf("Turns[0].Role = %q", got.Turns[0].Role) + } + if got.Turns[1].Role != ClaudeTurnToolUse { + t.Errorf("Turns[1].Role = %q, want tool_use", got.Turns[1].Role) + } + if got.Turns[1].ToolName != "Read" { + t.Errorf("Turns[1].ToolName = %q, want Read", got.Turns[1].ToolName) + } + if got.Turns[2].Role != ClaudeTurnToolResult { + t.Errorf("Turns[2].Role = %q, want tool_result", got.Turns[2].Role) + } + if got.Turns[3].Role != ClaudeTurnAssistant { + t.Errorf("Turns[3].Role = %q, want assistant", got.Turns[3].Role) + } + // Answer must be ONLY the assistant text, not the tool_use. + if got.Answer != "aqui esta el resumen" { + t.Errorf("Answer = %q, want %q", got.Answer, "aqui esta el resumen") + } + }) + + t.Run("multi-turn — answer from last user only", func(t *testing.T) { + screen := `❯ primera pregunta + +● primera respuesta + +❯ segunda pregunta + +● segunda respuesta` + got := ParseClaudeTUI(screen) + if len(got.Turns) != 4 { + t.Fatalf("len(Turns) = %d, want 4; turns: %+v", len(got.Turns), got.Turns) + } + if got.Answer != "segunda respuesta" { + t.Errorf("Answer = %q, want %q", got.Answer, "segunda respuesta") + } + }) + + t.Run("no banner no status bar — minimal screen", func(t *testing.T) { + screen := "❯ hola\n\n● mundo" + got := ParseClaudeTUI(screen) + if len(got.Turns) != 2 { + t.Fatalf("len(Turns) = %d, want 2; turns: %+v", len(got.Turns), got.Turns) + } + if got.Answer != "mundo" { + t.Errorf("Answer = %q, want %q", got.Answer, "mundo") + } + }) + + t.Run("determinism — same input produces same output", func(t *testing.T) { + first := ParseClaudeTUI(goldenScreen) + second := ParseClaudeTUI(goldenScreen) + if first.Answer != second.Answer { + t.Errorf("non-deterministic: %q != %q", first.Answer, second.Answer) + } + if len(first.Turns) != len(second.Turns) { + t.Errorf("non-deterministic turns count: %d != %d", len(first.Turns), len(second.Turns)) + } + }) +} + +// TestParseClaudeTUI_Spinner verifies that the generation spinner — which shows a +// DIFFERENT random gerund word on every frame ("Whatchamacalliting", "Forging", +// "Puzzling", "Crunched"...) — is never folded into the answer, regardless of the +// word, the glyph, or whether the "(Ns · tokens)" suffix is present yet. +func TestParseClaudeTUI_Spinner(t *testing.T) { + cases := []struct { + name string + screen string + want string + }{ + { + name: "spinner with tokens suffix glued after answer", + screen: "❯ di PONG\n\n● PONG\n\n✽ Whatchamacalliting… (2s · ↓ 1 tokens · esc to interrupt)\n", + want: "PONG", + }, + { + name: "spinner early frame, no suffix yet, different word", + screen: "❯ di HOLA\n\n● HOLA\n\n✶ Puzzling…\n", + want: "HOLA", + }, + { + name: "classic crunched line", + screen: "❯ x\n\n● respuesta\n\n✻ Crunched for 4s\n", + want: "respuesta", + }, + { + name: "spinner BEFORE the answer block (mid-generation snapshot)", + screen: "❯ pregunta\n\n✽ Forging… (1s · ↑ 3 tokens · esc to interrupt)\n\n● respuesta parcial\n", + want: "respuesta parcial", + }, + { + name: "assistant line ending in ellipsis is NOT treated as spinner", + screen: "❯ x\n\n● la historia continua…\n", + want: "la historia continua…", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got := ParseClaudeTUI(tc.screen) + if got.Answer != tc.want { + t.Errorf("Answer = %q, want %q", got.Answer, tc.want) + } + }) + } +} + +func contains(s, sub string) bool { + return len(sub) == 0 || (len(s) >= len(sub) && (s == sub || + len(s) > 0 && containsStr(s, sub))) +} + +func containsStr(s, sub string) bool { + for i := 0; i <= len(s)-len(sub); i++ { + if s[i:i+len(sub)] == sub { + return true + } + } + return false +} diff --git a/functions/tui/vt_render.go b/functions/tui/vt_render.go new file mode 100644 index 00000000..1a8f7cb3 --- /dev/null +++ b/functions/tui/vt_render.go @@ -0,0 +1,54 @@ +package tui + +import ( + "strings" + + "github.com/hinshun/vt10x" +) + +// VTRender emulates a terminal of size cols×rows, feeds raw into it, +// and returns the resulting screen as plain text preserving the visual layout. +// +// Unlike strip_ansi which removes escape sequences from sequential output, +// VTRender correctly handles TUIs that use absolute cursor positioning +// (ESC[row;colH, ESC[colG, etc.) by maintaining a 2D grid and reconstructing +// real spaces between columns. +// +// Defaults: rows<=0 → 40, cols<=0 → 120. +// Trailing spaces on each line are trimmed. Trailing empty lines are removed. +func VTRender(raw string, rows, cols int) string { + if rows <= 0 { + rows = 40 + } + if cols <= 0 { + cols = 120 + } + + // Create a fresh terminal emulator for each call — no shared state. + term := vt10x.New(vt10x.WithSize(cols, rows)) + term.Write([]byte(raw)) //nolint:errcheck // Write on vt10x never returns a meaningful error + + // String() returns all rows joined by '\n', one row per terminal line. + // Each row is exactly `cols` runes wide (padded with NUL/space for empty cells). + raw = term.String() + + lines := strings.Split(raw, "\n") + + // Trim trailing spaces from every line (cells that were never written + // contain NUL '\x00' in some versions, so we trim both NUL and space). + for i, line := range lines { + // Replace NUL characters (unwritten cells) with spaces first. + line = strings.ReplaceAll(line, "\x00", " ") + lines[i] = strings.TrimRight(line, " ") + } + + // Remove trailing empty lines — the TUI probably only used the top portion + // of the grid. Keep intermediate empty lines (real visual separators). + last := len(lines) - 1 + for last >= 0 && lines[last] == "" { + last-- + } + lines = lines[:last+1] + + return strings.Join(lines, "\n") +} diff --git a/functions/tui/vt_render.md b/functions/tui/vt_render.md new file mode 100644 index 00000000..99edeb02 --- /dev/null +++ b/functions/tui/vt_render.md @@ -0,0 +1,64 @@ +--- +name: vt_render +kind: function +lang: go +domain: tui +version: "1.0.0" +purity: pure +signature: "func VTRender(raw string, rows, cols int) string" +description: "Emula un terminal virtual de tamaño cols×rows, alimenta raw (stream con secuencias ANSI/VT100 incluyendo posicionamiento absoluto de cursor) y devuelve el estado final de la pantalla como texto plano que preserva el layout visual. A diferencia de strip_ansi, reconstruye espacios reales entre columnas posicionadas con movimientos de cursor absolutos." +tags: ["terminal", "vt100", "tui", "render", "ansi", "screen", "terminal-capture"] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "" +imports: + - "github.com/hinshun/vt10x" + - "strings" +tested: true +tests: + - "layout absoluto basico A y B separados por movimiento de cursor" + - "dos palabras separadas por movimiento de columna no aparecen pegadas" + - "texto multilinea simple con CRLF" + - "trim de filas vacias al final de grid grande" + - "determinismo misma entrada misma salida" + - "defaults rows y cols al pasar cero" +test_file_path: "functions/tui/vt_render_test.go" +file_path: "functions/tui/vt_render.go" +params: + - name: raw + desc: "Stream crudo de bytes de terminal, con secuencias de escape ANSI/VT100 intactas (colores, cursor moves, borrados de línea, scroll). Típicamente la salida de pty_capture_idle_go_infra." + - name: rows + desc: "Número de filas del terminal virtual. Debe coincidir con el tamaño de PTY usado al capturar. Si <=0 usa 40 como default." + - name: cols + desc: "Número de columnas del terminal virtual. Debe coincidir con el ancho de PTY usado al capturar. Si <=0 usa 120 como default." +output: "Texto plano multilínea con el layout visual de la pantalla: espacios reales entre columnas, sin trailing spaces por línea, sin filas vacías finales. Las líneas vacías intermedias se conservan (son separación visual real)." +--- + +## Ejemplo + +```go +// Capturar output crudo de una TUI (ej. claude CLI) con el PTY del mismo tamaño. +raw, _ := pty_capture_idle("claude", []string{"--help"}, 40, 120, 2*time.Second, 10*time.Second) + +// Renderizar el grid final como texto plano. +screen := tui.VTRender(raw, 40, 120) +fmt.Println(screen) +// Salida: texto con columnas alineadas, igual a lo que se vería en pantalla. +// Ejemplo real: "foo bar" si foo y bar estaban separados por ESC[10G. +``` + +## Cuando usarla + +Úsala cuando captures el output crudo de una TUI con layout absoluto (claude CLI, htop, dialog, ncurses) y `strip_ansi_go_core` te deje las palabras pegadas (ej. "2newMCPservers"). Contrasta con `strip_ansi_go_core` y `strip_ansi_go_tui`, que sirven para output secuencial tipo logs donde no hay movimientos de cursor absolutos. Si el stream tiene `ESC[row;colH` o `ESC[colG`, este es el correcto. + +Librería emuladora usada: `github.com/hinshun/vt10x` (vt10x v0.0.0-20220301184237-5011da428d02). Implementa VT10x completo sin CGO. API: `vt10x.New(vt10x.WithSize(cols, rows))` + `Write([]byte)` + `String()`. + +## Gotchas + +- **Tamaño debe coincidir**: rows×cols deben ser iguales a los que se usaron al capturar (pty_capture_idle usa 40×120 por defecto). Si no coinciden, el wrapping del texto no cuadra y las columnas se descuadran. +- **Solo texto, sin color**: la función vuelca únicamente los caracteres (rune de cada celda). Los atributos de color se pierden — es texto plano. +- **Solo estado final del grid**: si la TUI hizo scroll durante su ejecución, solo se ve el estado final de las 40 filas visibles. El historial de scroll no está disponible. +- **Emojis y caracteres de doble ancho**: algunos caracteres Unicode (emojis, CJK) ocupan 2 columnas visualmente pero solo 1 celda en el grid de vt10x, lo que puede descuadrar columnas en TUIs que los usan. +- **NUL en celdas vacías**: las celdas no escritas contienen `\x00` en algunas versiones del emulador. La función los reemplaza por espacio antes del trim, pero si el raw contiene NUL intencional, se trataría como espacio. diff --git a/functions/tui/vt_render_test.go b/functions/tui/vt_render_test.go new file mode 100644 index 00000000..bc299382 --- /dev/null +++ b/functions/tui/vt_render_test.go @@ -0,0 +1,114 @@ +package tui + +import ( + "strings" + "testing" +) + +func TestVTRender(t *testing.T) { + t.Run("layout absoluto basico A y B separados por movimiento de cursor", func(t *testing.T) { + // ESC[1;5H mueve el cursor a fila 1 columna 5 (1-indexed). + // Resultado esperado: 'A' en col 1, espacios, 'B' en col 5. + out := VTRender("A\x1b[1;5HB", 2, 10) + lines := strings.Split(out, "\n") + if len(lines) == 0 { + t.Fatalf("resultado vacio") + } + first := lines[0] + if len(first) < 5 { + t.Fatalf("linea demasiado corta: %q", first) + } + if first[0] != 'A' { + t.Errorf("esperaba 'A' en columna 0, got %q en linea %q", string(first[0]), first) + } + if first[4] != 'B' { + t.Errorf("esperaba 'B' en columna 4 (0-indexed), got %q en linea %q", string(first[4]), first) + } + // Verificar que hay espacios entre A y B (no están pegadas). + if strings.Contains(first, "AB") { + t.Errorf("A y B estan pegadas en %q, deberían estar separadas", first) + } + }) + + t.Run("dos palabras separadas por movimiento de columna no aparecen pegadas", func(t *testing.T) { + // ESC[10G mueve el cursor a la columna 10 (1-indexed) de la línea actual. + out := VTRender("foo\x1b[10Gbar", 2, 20) + lines := strings.Split(out, "\n") + if len(lines) == 0 { + t.Fatalf("resultado vacio") + } + first := lines[0] + if strings.Contains(first, "foobar") { + t.Errorf("foo y bar estan pegadas: %q — esperaba espacios entre ellas", first) + } + if !strings.Contains(first, "foo") { + t.Errorf("no encontre 'foo' en %q", first) + } + if !strings.Contains(first, "bar") { + t.Errorf("no encontre 'bar' en %q", first) + } + // foo en col 0-2, bar en col 9-11 (columna 10 es 0-indexed 9). + if len(first) < 12 { + t.Fatalf("linea demasiado corta para verificar: %q", first) + } + // Debe haber al menos un espacio entre foo y bar. + fooEnd := strings.Index(first, "foo") + 3 + barStart := strings.Index(first, "bar") + if barStart <= fooEnd { + t.Errorf("bar empieza en %d pero foo termina en %d — sin separacion en %q", barStart, fooEnd, first) + } + }) + + t.Run("texto multilinea simple con CRLF", func(t *testing.T) { + out := VTRender("linea1\r\nlinea2", 5, 40) + if !strings.Contains(out, "linea1") { + t.Errorf("no encontre 'linea1' en %q", out) + } + if !strings.Contains(out, "linea2") { + t.Errorf("no encontre 'linea2' en %q", out) + } + lines := strings.Split(out, "\n") + // linea1 y linea2 deben estar en líneas distintas. + found1, found2 := -1, -1 + for i, l := range lines { + if strings.Contains(l, "linea1") { + found1 = i + } + if strings.Contains(l, "linea2") { + found2 = i + } + } + if found1 == found2 { + t.Errorf("linea1 y linea2 estan en la misma linea (%d) de la salida: %q", found1, out) + } + }) + + t.Run("trim de filas vacias al final de grid grande", func(t *testing.T) { + // Input corto en un grid de 40 filas — no debe producir 40 lineas. + out := VTRender("hola", 40, 120) + count := strings.Count(out, "\n") + if count >= 3 { + t.Errorf("demasiadas lineas (%d) para 'hola' en grid de 40 filas: %q", count, out) + } + if !strings.Contains(out, "hola") { + t.Errorf("no encontre 'hola' en %q", out) + } + }) + + t.Run("determinismo misma entrada misma salida", func(t *testing.T) { + input := "foo\x1b[10Gbar\r\n\x1b[2;1Hbaz" + out1 := VTRender(input, 10, 40) + out2 := VTRender(input, 10, 40) + if out1 != out2 { + t.Errorf("resultados distintos:\nout1=%q\nout2=%q", out1, out2) + } + }) + + t.Run("defaults rows y cols al pasar cero", func(t *testing.T) { + // Verificar que no entra en pánico con valores <= 0. + out := VTRender("test", 0, 0) + if !strings.Contains(out, "test") { + t.Errorf("no encontre 'test' con defaults (rows=0,cols=0): %q", out) + } + }) +} diff --git a/go.mod b/go.mod index d6a5738a..f77db7bd 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/clipperhouse/displaywidth v0.9.0 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect github.com/clipperhouse/uax29/v2 v2.5.0 // indirect + github.com/creack/pty v1.1.24 // indirect github.com/danieljoos/wincred v1.2.3 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-faster/city v1.0.1 // indirect @@ -49,6 +50,7 @@ require ( github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/google/flatbuffers v25.1.24+incompatible // indirect github.com/gorilla/css v1.0.1 // indirect + github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect diff --git a/go.sum b/go.sum index e5ca2517..92057c8f 100644 --- a/go.sum +++ b/go.sum @@ -40,6 +40,8 @@ github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfa github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.5.0 h1:x7T0T4eTHDONxFJsL94uKNKPHrclyFI0lm7+w94cO8U= github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -74,6 +76,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= +github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02 h1:AgcIVYPa6XJnU3phs104wLj8l5GEththEw6+F79YsIY= +github.com/hinshun/vt10x v0.0.0-20220301184237-5011da428d02/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= diff --git a/python/functions/cybersecurity/tee_anthropic_sse.md b/python/functions/cybersecurity/tee_anthropic_sse.md new file mode 100644 index 00000000..2b61d91b --- /dev/null +++ b/python/functions/cybersecurity/tee_anthropic_sse.md @@ -0,0 +1,95 @@ +--- +name: tee_anthropic_sse +kind: function +lang: py +domain: cybersecurity +version: "1.0.0" +purity: impure +signature: "class AnthropicSSETee — mitmproxy addon loaded via mitmdump -s" +description: "Addon de mitmproxy que intercepta el stream SSE de la API de Anthropic (/v1/messages) y emite cada evento significativo a stdout como NDJSON en tiempo real. Cada interaccion de la CLI claude dispara una o varias llamadas a /v1/messages; el addon las etiqueta con stream_id, model y has_tools para que el consumidor pueda distinguir la respuesta principal (claude-opus-X con tools) de las auxiliares (titulo/clasificador en haiku sin tools). Las funciones puras split_sse_events y event_to_ndjson son testeables sin mitmproxy." +tags: [web-proxy, claude, mitmproxy, sse, streaming, anthropic, cybersecurity] +uses_functions: [] +uses_types: [] +returns: [] +returns_optional: false +error_type: "error_go_core" +imports: ["json", "os", "sys", "mitmproxy"] +tested: true +tests: + - "split buffer completo devuelve 8 bloques" + - "split bloques contienen event y data" + - "split buffer cortado preserva incompleto" + - "split resto mas continuacion reconstruye evento" + - "split buffer vacio" + - "split evento unico sin separador final" + - "text delta p" + - "text delta ong" + - "message stop con stop holder previo" + - "ping devuelve lista vacia" + - "content block start text devuelve vacio" + - "content block start tool use" + - "tool json delta" + - "json invalido en data devuelve vacio" + - "bloque sin data devuelve vacio" + - "integracion secuencia completa produce pong y stop" + - "integracion stream id se propaga" + - "integracion determinismo" +test_file_path: "python/functions/cybersecurity/tests/test_tee_anthropic_sse.py" +file_path: "python/functions/cybersecurity/tee_anthropic_sse.py" +params: + - name: mitmdump_invocation + desc: "No recibe argumentos directos. Se carga con `mitmdump -s tee_anthropic_sse.py`. El puerto del proxy se controla con el flag -p de mitmdump (ej. -p 8901). La flag -q suprime el log de mitmdump en stderr dejando solo el NDJSON en stdout." + - name: FN_WIRE_ONLY_TOOLS + desc: "Variable de entorno opcional. Si vale '1', suprime los streams cuyo request body no incluye el array 'tools' (llamadas auxiliares de titulo/clasificador que usan haiku). Por defecto (sin la env) emite todos los streams etiquetados con stream_id, model y has_tools para que el consumidor filtre." +output: "NDJSON a stdout, un objeto JSON por linea (flush inmediato). Tipos de linea: message_start{stream_id,model,has_tools} al inicio de cada stream; text_delta{stream_id,text} por cada fragmento de texto del modelo; tool_use_start{stream_id,tool_name,tool_id} cuando el modelo inicia una herramienta; tool_json_delta{stream_id,partial_json} por cada fragmento de argumentos JSON de la herramienta; message_stop{stream_id,stop_reason} al finalizar el stream. stderr recibe solo mensajes de diagnóstico del addon (errores, warnings), nunca NDJSON." +--- + +## Ejemplo + +```bash +# Terminal 1: lanzar mitmproxy como proxy de interceptacion +# -q suprime el log de mitmdump; solo se ve el NDJSON en stdout +mitmdump -p 8901 \ + -s python/functions/cybersecurity/tee_anthropic_sse.py \ + -q + +# Terminal 2: lanzar claude por el proxy +# NODE_EXTRA_CA_CERTS hace que el runtime Node de claude confie en la CA de mitmproxy +export HTTPS_PROXY=http://127.0.0.1:8901 +export NODE_EXTRA_CA_CERTS="$HOME/.mitmproxy/mitmproxy-ca-cert.pem" +claude -p "di hola" + +# Salida en stdout de mitmdump (Terminal 1): +# {"type": "message_start", "stream_id": 1, "model": "claude-haiku-4-5", "has_tools": false} +# {"type": "text_delta", "stream_id": 1, "text": "H"} +# {"type": "text_delta", "stream_id": 1, "text": "ola"} +# {"type": "message_stop", "stream_id": 1, "stop_reason": "end_turn"} +# ... +# {"type": "message_start", "stream_id": 2, "model": "claude-opus-4-8", "has_tools": true} +# {"type": "text_delta", "stream_id": 2, "text": "Hola"} +# ... + +# Filtrar solo la respuesta principal (has_tools=true) con jq: +mitmdump -p 8901 -s python/functions/cybersecurity/tee_anthropic_sse.py -q \ + | jq -c 'select(.has_tools == true or .stream_id != null and (.type == "text_delta"))' + +# O usar la variable de entorno para que el addon ya filtre en origen: +FN_WIRE_ONLY_TOOLS=1 mitmdump -p 8901 \ + -s python/functions/cybersecurity/tee_anthropic_sse.py -q +``` + +## Cuando usarla + +Cuando quieras el texto exacto que el modelo genera en tiempo real desde una sesion claude (TUI interactiva o `claude -p`), interceptando la red, sin parsear el render de la terminal ni depender de warmup/idle de la TUI. Util para: capturar la salida del modelo para procesado downstream (logging estructurado, metricas de tokens, replay), observar tool_use en construccion (argumentos parciales), o depurar la diferencia entre streams principales y auxiliares en una misma sesion TUI. + +## Gotchas + +- **Descompresion via strip de Accept-Encoding**: el hook `request` elimina el header `Accept-Encoding` de las llamadas a `/v1/messages` para que la API responda con el SSE SIN comprimir. Esto es obligatorio: el modo streaming de mitmproxy (`flow.response.stream`) entrega al tee los bytes CRUDOS del cuerpo, que si vinieran con `Content-Encoding: gzip`/`br` nunca contendrian el delimitador `\n\n` de eventos SSE (se veria binario) y no se emitiria ningun delta. Verificado empiricamente el 2026-06-04: sin el strip, solo se emitia `message_start`; con el strip, los `text_delta` salen correctamente. La alternativa (un decompresor de streaming con estado por flujo) es mas fragil. El coste es unos bytes extra en el salto local, irrelevante. +- **NO usar `--set stream_large_bodies`**: el modo streaming se activa con `flow.response.stream = func` en `responseheaders`, sin necesidad de ese flag. Ademas `stream_large_bodies=N` bajo rompe el acceso a `flow.request.content` (necesario para `has_tools`), porque tambien streamea el cuerpo del request y deja de bufferearlo. +- **Requiere mitmproxy + CA confiada por claude**: la CA de mitmproxy (`~/.mitmproxy/mitmproxy-ca-cert.pem`) debe estar configurada en `NODE_EXTRA_CA_CERTS` para que el runtime Node de la CLI claude acepte el certificado MITM. Sin esto, claude rechaza la conexion con error de TLS. Instalar mitmproxy: `uv tool install mitmproxy` o `pip install mitmproxy`. claude tambien respeta `HTTPS_PROXY` para enrutar su trafico por el proxy. +- **Una interaccion TUI dispara varias /v1/messages**: la respuesta real del usuario usa el modelo principal (p.ej. claude-opus-4-8) y su request body incluye el array `tools` con las herramientas de Claude Code. Las llamadas auxiliares (generador de titulo, clasificador) usan claude-haiku y su request NO lleva `tools`. Usa `has_tools=true` o `FN_WIRE_ONLY_TOOLS=1` para aislar la respuesta principal y no mezclar streams. +- **Solo funciona mientras claude no haga TLS pinning**: hoy (2026-06-04) la CLI claude no hace certificate pinning, por lo que el MITM funciona con `NODE_EXTRA_CA_CERTS`. Si una version futura de claude añade pinning, el addon dejara de interceptar. +- **Es trafico de tu propia cuenta y maquina**: el addon captura unicamente el trafico local que tu proxy intercepta. No hay acceso a otras cuentas ni sesiones remotas. El NDJSON se emite solo a stdout local. +- **El endpoint puede cambiar**: la CLI claude hoy usa `POST /v1/messages?beta=true`. El addon filtra por prefix `/v1/messages` para tolerar variantes de query string, pero si Anthropic cambia la ruta base en versiones futuras del protocolo, actualizar el check en `responseheaders`. +- **Chunks parciales**: el addon mantiene un buffer por stream para manejar eventos SSE partidos entre chunks TCP. Si mitmdump se mata con SIGKILL durante un stream activo, el ultimo bloque incompleto del buffer se descarta (no se emite un message_stop artificial). +- **stdout debe ser exclusivamente NDJSON**: no añadir prints de debug a stdout; redirigir diagnosticos a stderr. Si se canaliza la salida a `jq` u otro parser, cualquier linea no-JSON rompe el pipeline. diff --git a/python/functions/cybersecurity/tee_anthropic_sse.py b/python/functions/cybersecurity/tee_anthropic_sse.py new file mode 100644 index 00000000..1e7ecec9 --- /dev/null +++ b/python/functions/cybersecurity/tee_anthropic_sse.py @@ -0,0 +1,278 @@ +"""mitmproxy addon that tees Anthropic SSE streams to stdout as NDJSON. + +Load with: mitmdump -p 8901 -s tee_anthropic_sse.py -q + +For each POST /v1/messages response that streams text/event-stream, the addon +emits one NDJSON line per meaningful SSE event to stdout: + + {"type":"message_start","stream_id":1,"model":"claude-opus-4-8","has_tools":true} + {"type":"text_delta","stream_id":1,"text":"Hello"} + {"type":"tool_use_start","stream_id":1,"tool_name":"Bash","tool_id":"toolu_01..."} + {"type":"tool_json_delta","stream_id":1,"partial_json":"{\"command\":\"ls"} + {"type":"message_stop","stream_id":1,"stop_reason":"end_turn"} + +stdout is EXCLUSIVELY NDJSON — suitable for piping. All addon diagnostics go +to stderr. + +Set FN_WIRE_ONLY_TOOLS=1 to suppress streams whose request body has no "tools" +array (title generators, classifiers, etc.). +""" + +from __future__ import annotations + +import json +import os +import sys +from typing import Iterator + + +# --------------------------------------------------------------------------- +# Pure helpers — testable without mitmproxy +# --------------------------------------------------------------------------- + + +def split_sse_events(buf: bytes) -> tuple[list[str], bytes]: + """Split a byte buffer into complete SSE event blocks and a leftover tail. + + SSE events are separated by a blank line (``\\n\\n``). Any bytes after + the last complete event are returned unchanged as *leftover* so they can + be prepended to the next chunk. + + Args: + buf: Raw bytes accumulated from one or more SSE chunks. + + Returns: + A 2-tuple ``(events, leftover)`` where *events* is a list of complete + event block strings (without the trailing ``\\n\\n``) and *leftover* + is the remaining bytes that do not yet form a complete event. + """ + text = buf.decode("utf-8", errors="replace") + # Split on the blank-line delimiter that separates SSE events. + parts = text.split("\n\n") + # The last element is either empty (buffer ended exactly on \n\n) or an + # incomplete event that must be carried forward. + complete = [p for p in parts[:-1] if p.strip()] + leftover_str = parts[-1] + return complete, leftover_str.encode("utf-8") + + +def event_to_ndjson( + event_block: str, + stream_id: int, + stop_holder: dict, +) -> list[dict]: + """Parse one SSE event block and return zero or more NDJSON dicts. + + Args: + event_block: A single SSE event block string (the content between two + ``\\n\\n`` separators), e.g. ``"event: content_block_delta\\ndata: {...}"``. + stream_id: Monotonic integer that identifies the current stream. + stop_holder: A mutable dict used to carry ``stop_reason`` across calls. + The caller passes the same dict for all events of one stream; this + function writes ``stop_holder["stop_reason"]`` on ``message_delta`` + events and reads it on ``message_stop``. + + Returns: + A (possibly empty) list of dicts ready to be JSON-serialised as NDJSON. + """ + event_type = "" + data_str = "" + + for line in event_block.splitlines(): + if line.startswith("event:"): + event_type = line[len("event:"):].strip() + elif line.startswith("data:"): + data_str = line[len("data:"):].strip() + + if not data_str: + return [] + + try: + data = json.loads(data_str) + except json.JSONDecodeError: + return [] + + results: list[dict] = [] + + if event_type == "content_block_delta": + delta = data.get("delta", {}) + delta_type = delta.get("type", "") + if delta_type == "text_delta": + results.append( + { + "type": "text_delta", + "stream_id": stream_id, + "text": delta.get("text", ""), + } + ) + elif delta_type == "input_json_delta": + results.append( + { + "type": "tool_json_delta", + "stream_id": stream_id, + "partial_json": delta.get("partial_json", ""), + } + ) + + elif event_type == "content_block_start": + cb = data.get("content_block", {}) + if cb.get("type") == "tool_use": + results.append( + { + "type": "tool_use_start", + "stream_id": stream_id, + "tool_name": cb.get("name", ""), + "tool_id": cb.get("id", ""), + } + ) + # content_block_start for text blocks → nothing to emit + + elif event_type == "message_delta": + delta = data.get("delta", {}) + reason = delta.get("stop_reason") + if reason: + stop_holder["stop_reason"] = reason + + elif event_type == "message_stop": + results.append( + { + "type": "message_stop", + "stream_id": stream_id, + "stop_reason": stop_holder.get("stop_reason", "end_turn"), + } + ) + + return results + + +# --------------------------------------------------------------------------- +# mitmproxy addon +# --------------------------------------------------------------------------- + + +class AnthropicSSETee: + """mitmproxy addon: tee Anthropic /v1/messages SSE streams to stdout. + + One instance is shared across all intercepted flows. Each SSE stream gets + a monotonically increasing ``stream_id`` so the consumer can correlate + lines from concurrent or sequential streams. + """ + + def __init__(self) -> None: + self._stream_counter: int = 0 + self._wire_only_tools: bool = os.environ.get("FN_WIRE_ONLY_TOOLS", "") == "1" + + # ------------------------------------------------------------------ + # mitmproxy hooks + # ------------------------------------------------------------------ + + def request(self, flow) -> None: # noqa: ANN001 + """Called when a request is received (before it is sent upstream). + + For the target /v1/messages endpoint, strip the Accept-Encoding header so + the API responds with an uncompressed SSE stream. Otherwise the streaming + tee would see gzip/brotli bytes (which never contain the ``\\n\\n`` event + delimiter) and a stateful streaming decompressor would be required. The + extra bytes on the local hop are irrelevant; claude still parses the SSE + normally. + """ + req = flow.request + if req.method == "POST" and req.path.startswith("/v1/messages"): + req.headers.pop("accept-encoding", None) + + def responseheaders(self, flow) -> None: # noqa: ANN001 + """Called when response headers are received (before body). + + If the flow is a streaming Anthropic messages endpoint, activate + mitmproxy's streaming mode and attach the tee function so the response + body is forwarded to claude in real time while we parse it. + """ + req = flow.request + resp = flow.response + + # Filter: must be POST /v1/messages (with or without query params) + if req.method != "POST": + return + if not req.path.startswith("/v1/messages"): + return + + # Filter: response must be SSE + ct = resp.headers.get("content-type", "") + if "event-stream" not in ct: + return + + # Parse request body for metadata + try: + body = json.loads(req.content or b"{}") + except (json.JSONDecodeError, Exception): + # Cannot parse body — skip this flow without breaking the proxy + print( + f"[tee_anthropic_sse] WARN: could not parse request body for {req.path}", + file=sys.stderr, + flush=True, + ) + return + + model: str = body.get("model", "unknown") + has_tools: bool = bool(body.get("tools")) + + # Optionally suppress non-tool streams (title/classifier calls) + if self._wire_only_tools and not has_tools: + return + + self._stream_counter += 1 + stream_id = self._stream_counter + + # Emit the stream-start event so the consumer knows what is coming + _emit({"type": "message_start", "stream_id": stream_id, "model": model, "has_tools": has_tools}) + + # Build the per-stream tee closure and hand it to mitmproxy + flow.response.stream = _make_tee(stream_id) + + +# --------------------------------------------------------------------------- +# Private helpers +# --------------------------------------------------------------------------- + + +def _emit(obj: dict) -> None: + """Write one NDJSON line to stdout (flush immediately).""" + print(json.dumps(obj), flush=True) + + +def _make_tee(stream_id: int): + """Return a mitmproxy streaming function for a single SSE stream. + + The returned callable is assigned to ``flow.response.stream`` and will be + called by mitmproxy for each chunk of the response body. It MUST return + the chunk unchanged so claude receives the full stream. + """ + buf: bytearray = bytearray() + stop_holder: dict = {} + + def tee(chunk: bytes) -> bytes: + nonlocal buf + buf.extend(chunk) + try: + events, leftover = split_sse_events(bytes(buf)) + buf = bytearray(leftover) + for block in events: + for obj in event_to_ndjson(block, stream_id, stop_holder): + _emit(obj) + except Exception as exc: # noqa: BLE001 + print( + f"[tee_anthropic_sse] ERROR in tee for stream {stream_id}: {exc}", + file=sys.stderr, + flush=True, + ) + # Always return the original chunk — claude must receive its stream + return chunk + + return tee + + +# --------------------------------------------------------------------------- +# mitmproxy entrypoint +# --------------------------------------------------------------------------- + +addons = [AnthropicSSETee()] diff --git a/python/functions/cybersecurity/tests/test_tee_anthropic_sse.py b/python/functions/cybersecurity/tests/test_tee_anthropic_sse.py new file mode 100644 index 00000000..cb36a3c6 --- /dev/null +++ b/python/functions/cybersecurity/tests/test_tee_anthropic_sse.py @@ -0,0 +1,283 @@ +"""Tests para las funciones puras de tee_anthropic_sse. + +Cubre split_sse_events y event_to_ndjson sin necesitar mitmproxy. +""" + +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +from tee_anthropic_sse import split_sse_events, event_to_ndjson + +# --------------------------------------------------------------------------- +# SSE fixture — captura real de la API de Anthropic +# --------------------------------------------------------------------------- + +_RAW_SSE = ( + b"event: message_start\n" + b'data: {"type":"message_start","message":{"model":"claude-opus-4-8","id":"msg_x",' + b'"type":"message","role":"assistant","content":[],"stop_reason":null}}\n' + b"\n" + b"event: content_block_start\n" + b'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}\n' + b"\n" + b"event: ping\n" + b'data: {"type": "ping"}\n' + b"\n" + b"event: content_block_delta\n" + b'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"P"}}\n' + b"\n" + b"event: content_block_delta\n" + b'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ONG"}}\n' + b"\n" + b"event: content_block_stop\n" + b'data: {"type":"content_block_stop","index":0}\n' + b"\n" + b"event: message_delta\n" + b'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},' + b'"usage":{"output_tokens":5}}\n' + b"\n" + b"event: message_stop\n" + b'data: {"type":"message_stop"}\n' + b"\n" +) + + +# --------------------------------------------------------------------------- +# split_sse_events +# --------------------------------------------------------------------------- + + +def test_split_buffer_completo_devuelve_8_bloques(): + """Con el buffer completo devuelve los 8 bloques y leftover vacio.""" + events, leftover = split_sse_events(_RAW_SSE) + assert len(events) == 8 + assert leftover == b"" + + +def test_split_bloques_contienen_event_y_data(): + """Cada bloque contiene las lineas event: y data: esperadas.""" + events, _ = split_sse_events(_RAW_SSE) + assert "event: message_start" in events[0] + assert "event: ping" in events[2] + assert "event: message_stop" in events[7] + + +def test_split_buffer_cortado_preserva_incompleto(): + """Con un buffer cortado a la mitad de un evento, devuelve solo los completos.""" + # Encontrar la SEGUNDA aparicion de content_block_delta (quinto evento en total) + first_occ = _RAW_SSE.find(b"event: content_block_delta\ndata:") + second_occ = _RAW_SSE.find(b"event: content_block_delta\ndata:", first_occ + 1) + # Cortar en medio del data: del segundo content_block_delta + cut_buf = _RAW_SSE[:second_occ + 20] + + events, leftover = split_sse_events(cut_buf) + # Debe haber exactamente 4 eventos completos: + # message_start, content_block_start, ping, primer content_block_delta + assert len(events) == 4 + # El leftover no debe estar vacio (el segundo delta queda a medias) + assert len(leftover) > 0 + + +def test_split_resto_mas_continuacion_reconstruye_evento(): + """Concatenar leftover + continuacion reconstituye el evento cortado.""" + # Cortar justo antes del \n\n que cierra el primer delta + cut_point = _RAW_SSE.find(b"\n\nevent: content_block_delta\n", 100) + first_half = _RAW_SSE[:cut_point + 1] # termina dentro del separador + second_half = _RAW_SSE[cut_point + 1:] + + events1, leftover1 = split_sse_events(first_half) + combined = leftover1 + second_half + events2, leftover2 = split_sse_events(combined) + + # La union debe cubrir todos los bloques del segundo tramo + all_events = events1 + events2 + assert len(all_events) == 8 + assert leftover2 == b"" + + +def test_split_buffer_vacio(): + """Buffer vacio devuelve lista vacia y leftover vacio.""" + events, leftover = split_sse_events(b"") + assert events == [] + assert leftover == b"" + + +def test_split_evento_unico_sin_separador_final(): + """Un evento sin separador final queda como leftover.""" + chunk = b"event: ping\ndata: {\"type\":\"ping\"}" + events, leftover = split_sse_events(chunk) + assert events == [] + assert b"ping" in leftover + + +# --------------------------------------------------------------------------- +# event_to_ndjson +# --------------------------------------------------------------------------- + + +def test_text_delta_p(): + """content_block_delta text_delta 'P' -> [{type:text_delta, stream_id:1, text:'P'}].""" + block = ( + "event: content_block_delta\n" + 'data: {"type":"content_block_delta","index":0,' + '"delta":{"type":"text_delta","text":"P"}}' + ) + result = event_to_ndjson(block, 1, {}) + assert result == [{"type": "text_delta", "stream_id": 1, "text": "P"}] + + +def test_text_delta_ong(): + """content_block_delta text_delta 'ONG' -> text 'ONG'.""" + block = ( + "event: content_block_delta\n" + 'data: {"type":"content_block_delta","index":0,' + '"delta":{"type":"text_delta","text":"ONG"}}' + ) + result = event_to_ndjson(block, 1, {}) + assert result == [{"type": "text_delta", "stream_id": 1, "text": "ONG"}] + + +def test_message_stop_con_stop_holder_previo(): + """message_stop con stop_holder ya cargado -> stop_reason end_turn.""" + stop_holder: dict = {} + + # Primero simular message_delta para poblar el holder + delta_block = ( + "event: message_delta\n" + 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn",' + '"stop_sequence":null},"usage":{"output_tokens":5}}' + ) + event_to_ndjson(delta_block, 1, stop_holder) + assert stop_holder.get("stop_reason") == "end_turn" + + # Ahora message_stop + stop_block = ( + "event: message_stop\n" + 'data: {"type":"message_stop"}' + ) + result = event_to_ndjson(stop_block, 1, stop_holder) + assert result == [{"type": "message_stop", "stream_id": 1, "stop_reason": "end_turn"}] + + +def test_ping_devuelve_lista_vacia(): + """ping -> [].""" + block = "event: ping\ndata: {\"type\": \"ping\"}" + result = event_to_ndjson(block, 1, {}) + assert result == [] + + +def test_content_block_start_text_devuelve_vacio(): + """content_block_start para un bloque de texto -> [].""" + block = ( + "event: content_block_start\n" + 'data: {"type":"content_block_start","index":0,' + '"content_block":{"type":"text","text":""}}' + ) + result = event_to_ndjson(block, 1, {}) + assert result == [] + + +def test_content_block_start_tool_use(): + """content_block_start tool_use -> tool_use_start con name e id.""" + block = ( + "event: content_block_start\n" + 'data: {"type":"content_block_start","index":1,' + '"content_block":{"type":"tool_use","id":"toolu_01abc","name":"Bash"}}' + ) + result = event_to_ndjson(block, 2, {}) + assert result == [ + { + "type": "tool_use_start", + "stream_id": 2, + "tool_name": "Bash", + "tool_id": "toolu_01abc", + } + ] + + +def test_tool_json_delta(): + """content_block_delta input_json_delta -> tool_json_delta.""" + # Construir el bloque SSE con json.dumps para que el partial_json quede + # correctamente escapado dentro del JSON del campo data: + import json as _json + data_payload = { + "type": "content_block_delta", + "index": 1, + "delta": { + "type": "input_json_delta", + "partial_json": '{"command":"ls', + }, + } + block = "event: content_block_delta\ndata: " + _json.dumps(data_payload) + result = event_to_ndjson(block, 3, {}) + assert result == [ + { + "type": "tool_json_delta", + "stream_id": 3, + "partial_json": '{"command":"ls', + } + ] + + +def test_json_invalido_en_data_devuelve_vacio(): + """Linea data: con JSON invalido -> [] (sin excepcion).""" + block = "event: content_block_delta\ndata: {esto no es json" + result = event_to_ndjson(block, 1, {}) + assert result == [] + + +def test_bloque_sin_data_devuelve_vacio(): + """Bloque sin linea data: -> [].""" + block = "event: content_block_stop\n" + result = event_to_ndjson(block, 1, {}) + assert result == [] + + +# --------------------------------------------------------------------------- +# Integración del parseo: secuencia completa produce PONG + message_stop +# --------------------------------------------------------------------------- + + +def test_integracion_secuencia_completa_produce_pong_y_stop(): + """Los 8 bloques en orden producen text_delta 'P'+'ONG' y un message_stop end_turn.""" + events, leftover = split_sse_events(_RAW_SSE) + assert leftover == b"" + + stop_holder: dict = {} + all_ndjson: list[dict] = [] + for block in events: + all_ndjson.extend(event_to_ndjson(block, 1, stop_holder)) + + text_deltas = [o for o in all_ndjson if o["type"] == "text_delta"] + message_stops = [o for o in all_ndjson if o["type"] == "message_stop"] + + concatenated = "".join(d["text"] for d in text_deltas) + assert concatenated == "PONG" + + assert len(message_stops) == 1 + assert message_stops[0]["stop_reason"] == "end_turn" + assert message_stops[0]["stream_id"] == 1 + + +def test_integracion_stream_id_se_propaga(): + """stream_id se propaga correctamente a todos los eventos emitidos.""" + events, _ = split_sse_events(_RAW_SSE) + stop_holder: dict = {} + for block in events: + for obj in event_to_ndjson(block, 42, stop_holder): + assert obj["stream_id"] == 42 + + +def test_integracion_determinismo(): + """Parsear el mismo buffer dos veces produce exactamente el mismo resultado.""" + def parse_all(stream_id: int) -> list[dict]: + evs, _ = split_sse_events(_RAW_SSE) + holder: dict = {} + result: list[dict] = [] + for b in evs: + result.extend(event_to_ndjson(b, stream_id, holder)) + return result + + assert parse_all(1) == parse_all(1) diff --git a/types/cybersecurity/identity.md b/types/cybersecurity/identity.md new file mode 100644 index 00000000..87c09eb9 --- /dev/null +++ b/types/cybersecurity/identity.md @@ -0,0 +1,25 @@ +--- +name: identity +lang: go +domain: cybersecurity +version: "1.0.0" +algebraic: product +definition: | + type Identity struct { + SignPub []byte + SignPriv []byte + KexPub []byte + KexPriv []byte + } +description: "Identidad criptográfica dual de un participante en el bus de mensajería. Contiene un par Ed25519 para firma (SignPub/SignPriv) y un par X25519 para intercambio de claves (KexPub/KexPriv)." +tags: [messaging, e2e-crypto, crypto, identity, ed25519, x25519, e2e-messaging] +uses_types: [] +file_path: "functions/cybersecurity/generate_identity.go" +--- + +## Notas + +- `SignPub` (32 bytes) y `SignPriv` (64 bytes): par Ed25519. SignPriv concatena seed (32) + pubkey (32). +- `KexPub` (32 bytes) y `KexPriv` (32 bytes): par Curve25519 para sealed box anónimo. +- Generado exclusivamente con `GenerateIdentity()`. No construir manualmente. +- Publicar solo `SignPub` + `KexPub` en el directorio de participantes; nunca las claves privadas. diff --git a/types/tui/claude_tui_parse.md b/types/tui/claude_tui_parse.md new file mode 100644 index 00000000..17135e44 --- /dev/null +++ b/types/tui/claude_tui_parse.md @@ -0,0 +1,27 @@ +--- +name: claude_tui_parse +lang: go +domain: tui +version: "1.0.0" +algebraic: product +definition: | + type ClaudeTUIParse struct { + Turns []ClaudeTurn `json:"turns"` + Answer string `json:"answer"` + } +description: "Resultado del parseo de una pantalla capturada de la TUI de Claude Code. Turns contiene todos los bloques de conversación visibles en orden (user, assistant, tool_use, tool_result). Answer es la concatenación de los bloques assistant que siguen al último turno user — equivalente al output de `claude -p`." +tags: [terminal-capture, claude, tui, conversation] +uses_types: + - claude_turn_go_tui +file_path: "functions/tui/parse_claude_tui.go" +--- + +## Notas + +`Answer` se calcula así: +1. Localizar el último turno con `Role == user`. +2. Concatenar con `\n` el `Text` de todos los turnos `assistant` (no `tool_use`, no `tool_result`) que aparecen después. +3. Si no hay ningún turno `user`, concatenar todos los `assistant`. +4. Hacer trim del resultado. + +Este valor es el equivalente programático de lo que imprime `claude -p` cuando la respuesta termina. Es vacío si la pantalla capturada no contiene respuesta del asistente (por ejemplo, captura prematura durante el streaming). diff --git a/types/tui/claude_turn.md b/types/tui/claude_turn.md new file mode 100644 index 00000000..4589d620 --- /dev/null +++ b/types/tui/claude_turn.md @@ -0,0 +1,36 @@ +--- +name: claude_turn +lang: go +domain: tui +version: "1.0.0" +algebraic: product +definition: | + type ClaudeTurnRole string + + const ( + ClaudeTurnUser ClaudeTurnRole = "user" + ClaudeTurnAssistant ClaudeTurnRole = "assistant" + ClaudeTurnToolUse ClaudeTurnRole = "tool_use" + ClaudeTurnToolResult ClaudeTurnRole = "tool_result" + ) + + type ClaudeTurn struct { + Role ClaudeTurnRole `json:"role"` + Text string `json:"text"` + ToolName string `json:"tool_name,omitempty"` + } +description: "Un bloque de la conversación extraído de la pantalla renderizada de la TUI de Claude Code. El campo Role clasifica el tipo de turno; Text contiene el contenido textual (multilinea unido con \\n); ToolName solo se rellena cuando Role == tool_use." +tags: [terminal-capture, claude, tui, conversation] +uses_types: [] +file_path: "functions/tui/parse_claude_tui.go" +--- + +## Notas + +`ClaudeTurnRole` es un string enum con cuatro valores: +- `user` — mensaje escrito por el usuario (línea que empieza con `❯`). +- `assistant` — bloque de texto de respuesta del asistente (línea que empieza con `●` y no es una llamada a herramienta). +- `tool_use` — llamada a herramienta `● ToolName(args)`. `ToolName` contiene el identificador de la herramienta. +- `tool_result` — resultado de herramienta `⎿ ...`. Asociado al `tool_use` inmediatamente anterior. + +El tipo vive en `functions/tui/parse_claude_tui.go` junto al resto de la función, en el mismo paquete `tui`.