Estrutura do Código
Trace de request
Dois diagramas de fluxo — um pela CLI, um pelo navegador.
O jeito mais claro de ver como os oito arquivos interagem é traçar uma única pergunta pelos dois pontos de entrada.
Trace de pergunta na CLI
CLI question
→ cli.ts (parse argv, instantiate LocalLensApp)
→ locallens.ts (createBrainFromFolder)
→ files.ts (discoverTextDocuments)
→ rag.ts (chunkDocuments → ragChunk)
→ qvac.ts (ingestChunks → ragIngest)
→ store.ts (saveBrain, saveChunks)
→ locallens.ts (askBrain)
→ qvac.ts (search → ragSearch)
→ rag.ts (buildGroundedHistory)
→ qvac.ts (answer → completion stream)
→ locallens.ts (assemble ChatAnswer)
→ cli.ts (print answer + sources, deleteBrain, close)Duas coisas para notar:
- O trace abre em leque para fora de
locallens.tspara os gateways e volta. Toda chamada interno-para-interno roteia pela classe de workflow. domain.tsnão aparece no trace. Isso é por design. Tipos não participam do runtime — só restringem ele.
Trace de pergunta no navegador
Browser question
→ ui/app.js (event handler, fetch POST /api/brains/:id/chat)
→ server.ts (route match, JSON parse)
→ locallens.ts (askBrain)
→ qvac.ts (search)
→ rag.ts (buildGroundedHistory)
→ qvac.ts (answer)
→ locallens.ts (assemble ChatAnswer)
→ server.ts (JSON serialize, write response)
→ ui/app.js (render markdown, append to chat thread)O trace do navegador é o trace da CLI mais um hop HTTP em cada ponta.
Quando o request chega em locallens.ts, o caminho é idêntico ao
caminho da CLI.
Por que esse formato importa
Três propriedades caem de uma classe de workflow com pontos de entrada finos:
- Um lugar para adicionar uma feature.
LocalLensApp.askBrainé o único método de responder-a-pergunta. A CLI e o navegador beneficiam ambos no momento em que você adiciona algo. - Superfície de erro estável. Erros fluem para cima por
LocalLensApp, chegam emcli.tsouserver.tscomoAppErrorouErrorgenérico, e são formatados por um helper na borda. - Fácil de testar.
LocalLensApppode ser unit-testado sem subir um servidor ou shell. O store troca por uma variante de diretório temp; o gateway QVAC pode ser stubbed.
Onde quebraria
Se uma feature precisasse de um workflow diferente no caminho do navegador
do que no caminho da CLI, a simetria racharia. O movimento certo
então é adicionar um método novo no LocalLensApp (ou um helper novo
que consome ele), não empurrar lógica para server.ts. Mantém os
pontos de entrada finos.