Repository navigation
Conversation
…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
left a comment
There was a problem hiding this comment.
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_alllanza todos loswsl.exea 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á enmaindesde #239 y no forma parte de este diff. Conviene aclararlo para quien revise.
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
SessionResolverni el layout de rutas acordado.1. Regresión directa del
WslCallenfetch_accountTest
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 llevanexpiresAten el pasado, así queclaude::fetchrespondeNeedsLoginantes de tocar HTTP (rt.enter()+block_on(timeout(10s, …))para acotar).2. Ajustes permite activar el modo WSL
sessionEnv: 'host' | 'wsl'ywslDistro: stringen el tipoAppConfigdel frontend (src/lib/types.ts), coherentes con el serde del backend (lowercasepara el enum,camelCasepara los campos).3. Costo del sello en WSL
wsl_session_stamplee ahora en paralelo (futures::future::join_allderead_async, que usaspawn_blocking): deja de pagar unwsl.exe catpor 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_relativesobre el nuevo enumCliSessionKind), usada por los cuatrofetchy 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")eliminadoprovider_session_relative(provider: &str) -> Option<PathBuf>+.expect(...)se sustituye por el enumCliSessionKindcon match exhaustivo (session_relative(kind) -> PathBuf): no hayexpectposible en runtime.Extra: regla POSIX en una sola fuente
La regla «absoluta del guest y sin
\» vive ahora enwsl::guest_path_problemy la usanSessionResolver::resolve(ruta pegada a mano en Ajustes),wsl::session_pathyaccount_session_path(carpetas de cuentas) — una sola fuente para que los tres mensajes no diverjan.Validación
rust-review(2 pasadas): la primera con veredictowarn(eljoin_alldel sello no estaba aplicado de verdad) → corregido; la final APPROVE.d999f5e(tras el merge demain): success — crate real,cargo test --locked,npm test, inventario i18n, build.wsl,config,providerscon elmod.rsreal).cargo fmt --checklimpio, inventario i18n regenerado (--checkOK),git diff --checklimpio.Seguimiento (fuera de alcance aquí)
api.tssolo recibe bools) — iteración de UI.grep→killconpidfd(documentada en feat(wsl): sesiones de proveedores por el adaptador — issue #91 #239; el fail-closed ya impide señalar un PID reutilizado).Closes #243
🤖 Generated with Claude Code