Skip to content

feat(conocimiento): leer Word/Excel/PowerPoint/PDF fuera del proceso main - #4

Merged
DannyBaanks merged 4 commits into
mainfrom
claude/nifty-ramanujan-daxt74-doctext
Sep 25, 2026
Merged

DannyBaanks merged 4 commits into
mainfrom
claude/nifty-ramanujan-daxt74-doctext

Conversation

@DannyBaanks

@DannyBaanks DannyBaanks commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

What & why

PR 1 de la serie; va apilado sobre #3. Porta desde agentvivekkumar/dontbemichael (Vivek Kumar, MIT) el lector de documentos: docText.ts, docTextCli.ts y macOcr.ts.

Bug que corrige: knowledge.ingestFile indexaba un .docx, .xlsx o .pptx como los bytes del zip, reportaba éxito y nada del documento quedaba buscable. Los PDF dependían de pdftotext.

Qué cambia respecto al original: en vez de parsear en el proceso main, la app corre docTextCli --json en un proceso hijo (ELECTRON_RUN_AS_NODE, timeout de 240 s, salida máxima de 64 MB). Así, un PDF o un zip hostil que explote pdf.js o fflate solo tumba ese proceso desechable y no el que guarda las PTYs y los secretos. KnowledgeManager.setExtractor() permite inyectar el extractor, y los tests usan el que corre en el mismo proceso.

Además:

  • kg:ingestFiles y kg:addFiles ahora son async e ingieren de uno en uno, porque index.jsonl solo admite escritura al final y en paralelo las líneas se mezclarían.
  • kg-core guarda qué conversor produjo cada documento y su mime.
  • Los agentes reciben en su prompt el comando exacto de doc-text, usando el Node del hive (funciona igual en Windows).
  • El OCR (macOcr) y textutil son solo para macOS. En Linux y Windows esos formatos responden "unsupported" con una razón y el resto (OOXML y PDF) funciona igual.

Type of change

  • Bug fix
  • New feature

Evidence

Before

knowledge.ingestFile('cotizacion.docx') devolvía un docId, pero el índice contenía PK\^C\^D… (el contenedor zip), y buscar "licencias" no encontraba nada.

After

CLI compilado (out/main/docTextCli.js), tal como lo corre la app:

$ ELECTRON_RUN_AS_NODE=1 node out/main/docTextCli.js --json cotizacion.docx
{"kind":"text","text":"Cotizacion ISyCo: 40 licencias","extractor":"docx-xml@1","modality":"doc",...}
$ ELECTRON_RUN_AS_NODE=1 node out/main/docTextCli.js --json basura.bin
{"kind":"unreadable","reason":"This isn't a document the app can read. Add it as Word, Excel, PowerPoint, PDF or plain text."}

Tests: doc-text 15/15, doc-text-cli 5/5, knowledge-ingest 4/4 (incluye uno nuevo que prueba que se usa el extractor inyectado y que lo ilegible se rechaza).

How I tested it

  • OS: Linux (contenedor), Node 22
  • Steps: npm run typecheck (limpio), electron-vite build (genera docTextCli.js), el CLI compilado sobre un .docx y un binario, y la suite completa: 874 pasan. Los 5 fallos son los mismos de entorno que ya había en main (node-pty y Electron sin compilar en el contenedor).

Checklist

  • Before/after arriba.
  • npm run typecheck pasa.
  • npm run build genera las dos entradas.
  • Leí el diff.

🤖 Generated with Claude Code


Generated by Claude Code

…main

Portado de agentvivekkumar/dontbemichael (docText, docTextCli, macOcr).
Antes knowledge.ingestFile indexaba un .docx/.xlsx como bytes del zip y
reportaba éxito; los PDF dependían de pdftotext.

- docText.ts convierte OOXML (fflate), PDF (unpdf/pdf.js), textutil y OCR de
  macOS; lo ilegible se rechaza con una razón clara en vez de guardarse.
- La app parsea en un proceso hijo (`docTextCli --json`, ELECTRON_RUN_AS_NODE)
  para que un PDF o zip hostil nunca se procese en main. KnowledgeManager
  recibe el extractor inyectado; los tests usan el de en-proceso.
- kg:ingestFiles / kg:addFiles ingieren en serie (index.jsonl es append).
- Los agentes reciben en su prompt el comando `doc-text` con el Node del hive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141jpRihLcQWr34jq6mvC7b
@github-actions

Copy link
Copy Markdown
Contributor

🚫 This PR is missing its before/after evidence

Every pull request here has to show its work. Screenshots or a short screen recording, before the change and after it.

  • Before — no image or video under that heading
  • After — no image or video under that heading

How to fix it: edit the description, keep the ### Before and ### After headings from the template, and drag an image or video under each. GitHub uploads it inline. This check re-runs the moment you save.

A bug fix with no visible surface still needs it: show the failing behaviour, then the same steps passing. A terminal recording is fine.

Genuinely nothing to show — a CI tweak, a typo, a dependency bump? A maintainer can apply the no-visual-change label. Please don't ask unless it truly has no observable effect.

📖 CONTRIBUTING.md → Evidence is mandatory

@DannyBaanks
DannyBaanks changed the base branch from claude/nifty-ramanujan-daxt74 to main September 25, 2026 11:07
…jo en macOS)

do_unlink comparaba `readlink -f "$dest"` (ruta canónica) contra "$STORE/..."
sin canonizar. En macOS el tmpdir es /var/folders -> /private/var, así que
nunca coincidían: --unlink salía 0 sin quitar ningún enlace, y
test/bridge-opencode.test.cjs dejaba en rojo el job Tests de main.
Ahora el lado del store también se canoniza (pwd -P). Test nuevo que lo
reproduce en Linux con un store detrás de un symlink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141jpRihLcQWr34jq6mvC7b

Copy link
Copy Markdown
Owner Author

Estado del CI en este PR. Los tres rojos vienen de main, no de este cambio:

  1. Tests: test/bridge-opencode.test.cjs falla en macOS (--unlink no borra nada porque /var es un symlink a /private/var). El arreglo está en fix(bridge-opencode): --unlink compara rutas canónicas (CI de main rojo en macOS) #9 y ya lo porté aquí (head e01d369). El run está en curso.
  2. Typecheck → "Release links consistent": también está rojo en main (2be6fb9) y en e5186bc. tools/check-release-links.cjs solo acepta versiones x.y.z, y la versión del fork es 0.5.2-ISyCo.1; además docs/llms.txt dice 0.4.6. Todavía no hay arreglo: hay que decidir si el check se adapta a versiones con sufijo o se quita del CI del fork.
  3. Before / after evidence: exige imágenes o video bajo Before/After, y yo no puedo subirlos. La evidencia está en texto en la descripción. Si te parece suficiente, ponle la etiqueta no-visual-change.

Generated by Claude Code

@DannyBaanks
DannyBaanks merged commit 0933901 into main Sep 25, 2026
3 of 5 checks passed
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.

2 participants