SOWA Privacy para desarrolladores

Instalar desde el código fuente

SOWA Privacy se distribuye a través de la Chrome Web Store como binario, pero el código fuente está abierto para su inspección y uso personal bajo la licencia de fuente disponible en LICENSE. Para compilarlo y cargarlo localmente:

git clone https://github.com/Sowa-Privacy/sowa-privacy-chrome-extension.git
cd sowa-privacy-chrome-extension
npm install
npm run build

Luego abre chrome://extensions/, activa el Modo desarrollador y haz clic en Cargar descomprimida sobre la carpeta dist/.

Tres paquetes de terceros pesados

Se compilan una sola vez con esbuild antes de que Vite se ejecute, por lo que el build de producción es completamente autónomo:

  • web-llm.bundle.js – ~5,4 MB – inferencia LLM local (opcional, opt-in).
  • transformers.bundle.js + onnx-wasm/* – ~32 MB – runtime del pipeline NER (opcional, opt-in).
  • file-parsers.bundle.js + pdf.worker.min.mjs + xlsx-worker.bundle.js – ~2 MB – análisis de PDF, DOCX, XLSX para el interceptor de carga de archivos.

Qué hay dentro

manifest.json                 Chrome MV3 manifest (single source of truth for version)
contentScript.js              MV3 content script entrypoint
service_worker.js             MV3 service worker (stateless)
offscreen.js                  Offscreen doc for NER inference

lib/
  constants.js                DEF_CONFIG, PRESET_PATTERNS, NER_MODELS,
                              WEBLLM_MODELS, INDUSTRY_BLACKLISTS
  pii-core.js                 detectPII, mergeDetectionHits, blacklist + regex pipeline
  ner-detector.js             NER pipeline + diagnostic state surface
  ui-utils.js                 shouldUseRegex / NER / LLM helpers, theme, debounce
  ui_i18n.js                  t() + RESOURCES (4 locales) + applyI18n
  cs/
    owl-guardian.js           Owl widget Shadow DOM, continuous scan, badge counter
    upload-interceptor.js     File drag/drop / file input intercept
    host-matcher.js           contentIntegration.entries pattern matching

tests/unit/                   688 pruebas unitarias – mantener en verde
scripts/                      esbuild bundle + zip packaging

Garantías de privacidad

Estas son las reglas aplicadas en el código, no solo promesas en textos de marketing:

  • Sin telemetría, sin analíticas, sin llamadas a servidores propios – con una única excepción de ámbito restringido: la verificación de derechos del propio usuario (un único POST autenticado a /api/entitlements/me que solo devuelve los indicadores del plan del usuario). En caché durante una hora. Sin datos personales, sin prompts.
  • NER desactivado por defecto, solo opt-in – el modelo NER es una descarga de terceros de 65 MB (HuggingFace). No comienza a cargarse hasta que el usuario activa explícitamente la opción en Ajustes.
  • LLM local desactivado por defecto, solo opt-in – la misma regla. Los modelos WebLLM son grandes; descargar uno es decisión del usuario.
  • Owl tiene ámbito de sitio – el content script se registra en <all_urls> para los hooks del ciclo de vida, pero la detección, el precalentamiento del modelo y el widget del búho solo se ejecutan en los siete hosts definidos en contentIntegration.entries (ChatGPT, OpenAI, Claude, Gemini, Copilot, Grok, x.ai).
  • La CSP prohíbe la ejecución de código dinámico'wasm-unsafe-eval' para ONNX está permitido; 'unsafe-eval' no lo está. Sin Function desde cadenas, sin plugins basados en eval.
  • Solo Promises para las APIs de chrome.* – sin callbacks que oculten el manejo de errores.
  • Service worker sin estado – MV3 termina de forma agresiva; la persistencia reside en chrome.storage, no en variables globales del módulo.

Pruebas

Las pruebas son la puerta principal de corrección. A partir de la versión v1.2.5.x: 688 de 689 pasando en 17 suites. El nuevo código debe mantener este estado en verde.

npm run test:unit:nocov   # fast loop during development (~3s)
npm run test:unit          # CI gate with coverage
npm run typecheck          # tsc --noEmit
npm run lint               # eslint

Las correcciones de errores siguen un enfoque TDD: primero se escribe la prueba fallida, luego se corrige el error y la prueba permanece como barrera de regresión. Un ejemplo real incluido en tests/unit/lib/ner-detector.test.js – la prueba "detect-counter does NOT reset on subsequent init successes" se escribió antes de su corrección correspondiente y detectó un mal primer intento de implementación.

Contribuir

Las contribuciones al repositorio oficial son bienvenidas bajo los términos de la licencia. Abre un issue o envía un pull request siguiendo los estándares de ingeniería definidos en CONTRIBUTING.md:

  • Crea la rama desde main. Un cambio lógico por PR.
  • Convención de mensajes de commit: type(scope): description (vX.Y.Z.W).
  • Actualiza MIGRATION_LOG.md para cambios no triviales (nuevos módulos, cambios de contrato, cambios arquitectónicos).
  • Lista de verificación previa al envío para PRs que afecten a la detección o la red: ningún nuevo fetch() a un servidor propio, sin nueva telemetría, sin componentes pesados habilitados automáticamente, todo lo que se almacene debe figurar en el registro de migración y cualquier nuevo permiso debe justificarse para el revisor de la Chrome Web Store.

Divulgación responsable

Para vulnerabilidades de seguridad, por favor no abras issues públicos en GitHub. Envía un informe detallado a security@sowaprivacy.ai:

  • Descripción clara de la vulnerabilidad.
  • Pasos para reproducirla.
  • Versión afectada (el campo version en manifest.json).
  • Evaluación del impacto si dispones de ella.
  • Corrección sugerida si procede.

Nos comprometemos a acusar recibo de tu informe en un plazo de 72 horas, a proporcionar una actualización del estado en 7 días, a mencionarte en las notas de la versión (salvo que prefieras el anonimato) y a coordinar contigo el momento de la divulgación pública.

El ámbito publicado, ejemplos de lo que consideramos una vulnerabilidad y un Salón de la Fama se encuentran en SECURITY.md en la raíz del repositorio.