Skip to content

feat(wsl): seguimiento de #91 — pendientes de la revisión (issue #243) - #248

Open
sosan wants to merge 3 commits into
egdev6:mainfrom
sosan:feat/wsl-sessions-followup
Open

sosan wants to merge 3 commits into
egdev6:mainfrom
sosan:feat/wsl-sessions-followup

Conversation

@sosan

@sosan sosan commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

PR encadenada tras #239 (ya mergeada). Implementa los cinco pendientes acordados en la revisión de #91 (issue #243), sin tocar el diseño del SessionResolver ni el layout de rutas acordado.

1. Regresión directa del WslCall en fetch_account

Test fetch_account_sends_the_exact_guest_path_for_extra_accounts: el invitado recibe la ruta POSIX exacta de la cuenta adicional (/home/user/.quorb/accounts/claude-w1/.credentials.json) vía mock de la distro Running. Determinista y sin red: las credenciales del mock llevan expiresAt en el pasado, así que claude::fetch responde NeedsLogin antes de tocar HTTP (rt.enter() + block_on(timeout(10s, …)) para acotar).

2. Ajustes permite activar el modo WSL

  • sessionEnv: 'host' | 'wsl' y wslDistro: string en el tipo AppConfig del frontend (src/lib/types.ts), coherentes con el serde del backend (lowercase para el enum, camelCase para los campos).
  • Tarjeta de «Proveedores»: select «Sesión de los CLIs» (Windows/WSL) y campo «Distro WSL» con placeholder, visibles solo cuando el entorno es WSL.
  • i18n es/en añadido; test de i18n de la tarjeta actualizado.

3. Costo del sello en WSL

wsl_session_stamp lee ahora en paralelo (futures::future::join_all de read_async, que usa spawn_blocking): deja de pagar un wsl.exe cat por proveedor en serie cada 15 s. La suma es conmutativa (wrapping_add), así el orden de resultados no altera la huella. Límite documentado: un fallo de la distro y «no hay sesiones» siguen produciendo la misma huella — la distinción la da el fetch de cada cuenta, cuyo error se ve en el orbe.

Además, las rutas de los proveedores principales salen de una única fuente (session_relative sobre el nuevo enum CliSessionKind), usada por los cuatro fetch y por el sello — ya no se repiten a mano.

4. Distro vacía → host, valorado

Se mantiene el comportamiento actual (documentado en config.rs): la resolución nunca inventa una distro. Con la UI de este PR (punto 2), el usuario puede elegir WSL y ver el campo de distro con placeholder; el estado «sin configurar» explícito en el backend queda como seguimiento si la UI lo requiere.

5. expect("proveedor CLI") eliminado

provider_session_relative(provider: &str) -> Option<PathBuf> + .expect(...) se sustituye por el enum CliSessionKind con match exhaustivo (session_relative(kind) -> PathBuf): no hay expect posible en runtime.

Extra: regla POSIX en una sola fuente

La regla «absoluta del guest y sin \» vive ahora en wsl::guest_path_problem y la usan SessionResolver::resolve (ruta pegada a mano en Ajustes), wsl::session_path y account_session_path (carpetas de cuentas) — una sola fuente para que los tres mensajes no diverjan.

Validación

  • Review de la skill rust-review (2 pasadas): la primera con veredicto warn (el join_all del sello no estaba aplicado de verdad) → corregido; la final APPROVE.
  • CI de Windows sobre el head d999f5e (tras el merge de main): success — crate real, cargo test --locked, npm test, inventario i18n, build.
  • Harness aislado local: 180/180 (módulos reales wsl, config, providers con el mod.rs real).
  • cargo fmt --check limpio, inventario i18n regenerado (--check OK), git diff --check limpio.

Seguimiento (fuera de alcance aquí)

Closes #243

🤖 Generated with Claude Code

sosan and others added 3 commits November 7, 2026 01:24
…6#243

Los cinco pendientes de la issue egdev6#243 (seguimiento de egdev6#91):

1. Regresión directa del WslCall desde fetch_account: el invitado recibe
   la ruta POSIX exacta de la cuenta adicional
   (fetch_account_sends_the_exact_guest_path_for_extra_accounts), con token
   vencido que responde NeedsLogin sin tocar la red.
2. Ajustes permite activar el modo WSL: select «Sesión de los CLIs»
   (Windows/WSL) y campo «Distro WSL» en la tarjeta de Proveedores;
   sessionEnv y wslDistro en el tipo AppConfig del frontend.
3. El sello lee en PARALELO (join_all de read_async) y las rutas salen de
   la fuente única (session_relative). El límite «fallo de distro = misma
   huella» queda documentado.
4. Distino vacía → host: documentado como intencional (nunca inventa una
   distro); el estado «sin configurar» espera a la UI de este PR.
5. expect("proveedor CLI") eliminado: enum CliSessionKind con match
   exhaustivo (session_relative), sin Option ni expect posible.

Además: la regla «POSIX absoluta del guest» vive en UNA sola fuente
(wsl::guest_path_problem) usada por resolve, session_path y
account_session_path.

Revisión de la skill (final, APPROVE): join_all del sello real en el
working tree, cero expect en runtime, test determinista sin red y serde
coherente con el frontend.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…llowup

# Conflicts:
#	docs/i18n-inventory.md

@egdev6 egdev6 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buen trabajo con el seguimiento. El enum con match exhaustivo elimina de verdad el expect, y el test de regresión del WslCall es determinista (token vencido, timeout acotado y la ruta exacta del guest). Antes de mergear hay un punto que bloquea y tres menores.

Bloqueante

1. El selector de WSL se muestra en macOS y Linux (src/Settings.tsx, ProvidersCard)

El select «Sesión de los CLIs» se renderiza en todas las plataformas. Si un usuario de macOS o Linux elige WSL y escribe una distro, session_resolver (lib.rs) intentará ejecutar wsl.exe en cada fetch y todos los orbes quedarán en error. Además, la opción «Windows» y la ayuda «Host usa las credenciales de Windows» no son correctas fuera de Windows.

Propuesta: mostrar el bloque solo en Windows usando el helper existente osFromUA(navigator.userAgent) (ya se usa en Widget.tsx), y añadir un test que compruebe que no se renderiza en otras plataformas.

Menores

2. Doc comment obsoleto sobre el test nuevo (providers/mod.rs, mod tests)

El test fetch_account_sends_the_exact_guest_path_for_extra_accounts quedó debajo del bloque /// que dice «El test directo de fetch_account necesita un cliente reqwest con reactor, que el tokio de CI no expone…». En Rust el doc comment se adjunta al siguiente ítem aunque haya una línea en blanco, así que la documentación del test nuevo empieza afirmando que ese test no es posible. Conviene eliminar o reescribir ese párrafo.

3. Doc comment desplazado sobre CliSessionKind (providers/mod.rs)

La línea /// Consulta una cuenta adicional con la config de su proveedor adaptada a ella. ahora documenta el enum. Debería ir sobre fetch_account.

4. clippy::manual_flatten en wsl_session_stamp

for result in results { if let Ok(contents) = result { … } } puede escribirse como for contents in results.into_iter().flatten(). El CI no ejecuta clippy, por eso no aparece.

No bloqueante

  • join_all lanza todos los wsl.exe a la vez sin límite. Con pocas cuentas está bien; si crecen, buffer_unordered(n) lo acota. Basta con dejarlo anotado.
  • La UI permite guardar «WSL» con la distro vacía, y el backend lo trata como host sin avisar. Entiendo que el estado «sin configurar» queda como seguimiento (punto 4 de la descripción), pero una pista en la UI («sin distro se usa el host») evitaría confusión mientras tanto.
  • La sección «Extra: regla POSIX en una sola fuente» de la descripción describe guest_path_problem, que ya está en main desde #239 y no forma parte de este diff. Conviene aclararlo para quien revise.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(wsl): seguimiento de la revisión de #239 (sesiones por entorno)

2 participants