Cierra audit Codex P1 #2: «command-shortcut.svelte.ts registra
window.addEventListener('keydown', ...) directamente». Eidos no debe
gestionar DOM activity por su cuenta — todo binding pasa por
ActiveDom (regla: «toda DOM activity via ActiveDom»).
Cambios:
- `command-shortcut.svelte.ts`: signature ahora es
`bindCommandShortcut(dom: ActiveDom, shortcut, onTrigger)`. Usa
`dom.getWindow()` + `dom.listen(win, 'keydown', handler)` en vez de
`window.addEventListener('keydown', handler)`. Retorna la cleanup
function de dom.listen (sigue siendo el contrato esperado por el
$effect del consumer).
- `command.svelte`: pasa `eidos.dom` como primer arg (ya tenia
`const eidos = ActiveEidos.require()`).
- `command-dialog.svelte`: anadido `import { ActiveEidos }` +
`const eidos = ActiveEidos.require()` (no lo tenia). Mismo patron.
Beneficios:
- ActiveDom owns el lifecycle (cleanup tracked, pause-on-dispose,
iframe/popup-aware via targetWindow).
- Eidos visual layer queda sin DOM API directo (regla cumplida).
- Tests pueden mockear `dom.listen` sin parchear window globalmente.
Verificacion:
- `grep window.addEventListener src/uix/eidos/components/`: cero
matches (solo la mencion en JSDoc del cambio explicativo).
- `npm run check`: 0 errors mantenido.
- HTTP 200 en `/uix/components/command`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>