Proyecto independiente No afiliado, patrocinado ni avalado por la Watch Tower Bible and Tract Society o Jehovah's Witnesses.
jw-agent-toolkit
EN

Release 49-56 · jw-core completo + JS bridge

El toolkit habla 1672 idiomas

Ocho fases que pasan de "jw-core casi completo" a "jw-core es el SDK multilingüe oficial". Second-brain persistente, generación nativa de JWPUB y .jwlibrary, schemas interop con organized-app, Omnilingual ASR (1672 idiomas), NLLB-200 (200 idiomas, con preservación exacta de refs bíblicas), wire-up en 8 call sites y close-out honesto del bridge JS con CI anti-drift Python↔TypeScript.

Fases

8

Tests nuevos

197+

Commits

30+

Fase 49

second-brain

Memoria persistente estilo Karpathy + GraphRAG

✅ Entregada 🧪 95 tests ⊜ 22 commits T1 Multilingüe SOTA + integración
Guía técnica →

Compiler que extrae conocimiento del toolkit a un grafo consultable. Dual backend DuckDB/Neo4j, Wiki sobre Obsidian con human_edited honored. Multi-tenant. BrainDomain plugins via F41.

Qué se entregó

  • Karpathy-style: extrae entidades + relaciones desde el código y docs del toolkit.
  • Backends intercambiables: DuckDB (zero-config) o Neo4j (relación-pesada).
  • Wiki sobre Obsidian: el operador edita y human_edited=true preserva.
  • CLI: jw brain {init, compile, query, lint, status, snapshot, list}.
  • MCP tools: second_brain_query, second_brain_status, second_brain_compile.
  • Plugins F41: TJ builtin domain + financial fixture.

Fase 50

jwpub-writer

Generar .jwpub que JW Library nativo importa

✅ Entregada 🧪 9 tests ⊜ 1 commit T2 Generación y interop
Guía técnica →

Cierra el ciclo simétrico de Fase 5.5 (descifrado). Port de darioragusa/html2jwpub (MIT, Swift): SHA-256+XOR para key/IV, AES-128-CBC encrypt, zlib deflate del Content, SQLite manifest + ZIP outer. Crypto compartido jw_core.jwpub_crypto.

Qué se entregó

  • JwpubBuilder.add_document() / add_media() / build() — API simétrica al parser.
  • Schema SQLite de 750 líneas portado verbatim de dbQuery.swift.
  • encrypt_blob() (nuevo) + decrypt_blob() (existente) comparten constante XOR_KEY.
  • CLI nuevo: jw jwpub build <folder> --out --symbol --year --lang.
  • Tests parametrizados por content size (10/100/1000/10000) cubren PKCS7 boundary.
  • Round-trip verificado: builder → parser → bytes idénticos.

Fase 51

organized-app schemas

Pydantic v2 verbatim de sws2apps/organized-app

✅ Entregada 🧪 10 tests ⊜ 1 commit T2 Generación y interop
Guía técnica →

Port de los tipos TypeScript de organized-app (MIT) — la PWA React usada por cientos de congregaciones. Habilita interop sin depender de React/Firebase. Envelope CRDT Timestamped[T] preserva updatedAt por campo.

Qué se entregó

  • PersonType con publisher_baptized/unbaptized/midweek_meeting_student histories.
  • SchedWeekType con midweek (chairman, TGW, AYF parts 1-4, LC, CBS) y weekend completos.
  • WeekType IntEnum (NORMAL=1, MEMORIAL=5, WATCHTOWER_STUDY=13, NO_MEETING=20).
  • AssignmentCode IntEnum 100-300 (MM_BibleReading=100, MINISTRY_HOURS_CREDIT=300).
  • UserFieldServiceMonthlyReportType — S-21 layout post-2023.
  • Tests verifican enum values verbatim TS + round-trip JSON envelopes con by_alias.

Fase 52

jwlibrary-writer

Escribir .jwlibrary desde agentes y scripts

✅ Entregada 🧪 9 tests ⊜ 1 commit T2 Generación y interop
Guía técnica →

Cierra read-write loop con la app oficial JW Library (Fase 19 fue solo lectura). Port de erykjj/jwlmanager (MIT). El merge basado en libjwlCore queda fuera (blob nativo opaco). write_backup() empaqueta userData.db; update_backup() ofrece extract → modify(conn) → repack.

Qué se entregó

  • write_backup(out, *, user_data_db_path, ...) — userData.db + manifest + SHA-256 + ZIP.
  • update_backup(in, out, modify_fn) — round-trip extract → callback → repack.
  • PRAGMA user_version propagado al manifest.schemaVersion.
  • LastModified UPDATE timestampea cada repack (tolerante si la tabla falta).
  • CLI nuevo: jw library {inspect, re-export, from-notes}.
  • from-notes: agentes producen JSON de notas → .jwlibrary importable en JW Library.

Fase 53

omnilingual-asr

Meta Omnilingual ASR — 1672 idiomas, Apache 2.0

✅ Entregada 🧪 16 tests ⊜ 1 commit T1 Multilingüe SOTA + integración
Guía técnica →

Integra facebookresearch/omnilingual-asr como provider de primera clase. Polyglot Python: fairseq2 no tiene wheels cp313, así que OmnilingualProvider vive en venv Python 3.12 dedicado y se invoca via subprocess JSON. Quechua, Kinyarwanda, Aymara, Guaraní confirmados.

Qué se entregó

  • OmnilingualProvider dispara worker en venv 3.12 dedicado (~/.jw-core/omnilingual/venv).
  • 1672 idiomas — long tail que Deepgram (~16) y Whisper-large-v3 (~99) no cubren.
  • Mapeo ISO-639-1 → FLORES-200 curado para casos JW (qu → quy_Latn, rw → kin_Latn).
  • Default model: omniASR_CTC_300M (Mac M1/M2 8GB). 7B-Unlimited para servidor GPU.
  • CLI nuevo: jw omnilingual {install, status, transcribe, supports}.
  • End-to-end verificado: install real + supports en quechua/kinyarwanda/aymara/guaraní.

Fase 54

nllb-translation

NLLB-200 con preservación exacta de referencias bíblicas

✅ Entregada 🧪 10 tests ⊜ 1 commit T1 Multilingüe SOTA + integración
Guía técnica →

Proveedor NLLBProvider envuelve NLLB-200 de Meta (200 idiomas, CC-BY-NC-4.0) con backend CTranslate2 INT8 (~7 GB en M-series). Es commercial-safe = False a nivel de atributo — el router lo filtra estructuralmente. translate_preserving_references() enmascara refs antes del modelo y restaura en el idioma destino.

Qué se entregó

  • CTranslate2 4.7+ con cp313 wheels — sin venv aparte (in-process).
  • Mapeo ISO → FLORES con low-resource explícito (yor_Latn, kin_Latn, swh_Latn).
  • is_commercial_safe = False — el router F55.1 lo filtra cuando commercial=True.
  • translate_preserving_references(text, source, target, provider) en jw_core.translation.
  • Cero alucinación numérica en versículos: el modelo nunca ve la ref.
  • 10 tests con ctranslate2/transformers mockeados — sin descarga 7 GB en CI.

Fase 55

multilingual wire-up

8 call sites que activan F50-F54 en el toolkit

✅ Entregada 🧪 24 tests ⊜ 1 commit T1 Multilingüe SOTA + integración
Guía técnica →

Convierte F50-F54 de islas portadas en capacidades reales. Sin esto, los módulos existen pero nadie los llama. Auditoría honesta antes de F55: cero usos en agentes y CLI más allá de tests.

Qué se entregó

  • F55.1 — get_asr_provider(language) auto-routea quechua → Omnilingual sin nombrarlo.
  • F55.1 — get_translation_provider(commercial=True) excluye NLLB por licencia.
  • F55.2 — jw translate CLI + MCP translate_preserving_refs.
  • F55.3 — jw library CLI: agentes → .jwlibrary importable.
  • F55.4 — jw jwpub build CLI: HTML+media → .jwpub nativo.
  • F55.5 — parse/write_organized_backup() — JSON ↔ Pydantic models.
  • F55.6 — bridge ministry.MonthlyReport ↔ S-21 organized post-2023.
  • F55.7 — agente cross_lingual_research: query A → corpus B → resultados A con refs intactas.
  • F55.8 — broadcasting.transcribe_and_index_audio + translate_to opcional.

Fase 56

jw-core-js close-out

Cerrar honestamente el MVP F47 con CI anti-drift

✅ Entregada 🧪 24 tests ⊜ 2 commits T4 Superficie JS
Guía técnica →

Auditoría reveló 3 mentiras del ROADMAP F47: F48 ya integrado (no pendiente), cookbook 12 ya pasa, buckets B/C/D/E sin justificación real (Capacitor móvil es vaporware). F56 corrige docs, cierra paridad real Python↔TS y añade CI bloqueante.

Qué se entregó

  • F56.1 — ROADMAP + guía honestas: 3 inconsistencias corregidas; buckets B/C/D/E diferidos.
  • F56.2 — Language type re-exportado desde core, dedup en F48 (-7 LOC).
  • F56.3 — fixture 17 → 174 casos + verificar detected_language + raw_match.
  • F56.4 — .github/workflows/cross-lang.yml + Makefile dump-shared-data + git diff --exit-code.
  • F56.5 — BibleRef.fromWolUrl() + langFromWolPath() (inverso puro de wolUrl).
  • F48 verse_detector.ts: -35 LOC delegando URL parsing al core. Thin-adapter pattern.
  • Final cross-stack: 174 Python + 212 TS + 41 ext = 427 tests verdes.