mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-10-13 17:47:09 +00:00
Release v3.8.51 — 2,022 documented changes (235 features, 1,454 fixes, 333 maintenance) from 1,973 cycle commits and 301 external contributors; full changelog in CHANGELOG.md → [3.8.51]. Full ci.yml matrix green on 2f42a9ac (57 checks).
3.7 KiB
3.7 KiB
Task C1 — History hidrata memoryHits (PR-C, Refs #12639)
Commit: da8014442debd2eca7a326472ab704aa86aefba1
Branch: feat/orch-fase3-c · 2 arquivos, +164/-16
O que mudou
src/app/api/a2a/tasks/[id]/route.ts
- Novas constantes
MEMORY_HITS_EVENT_TYPE = "memory_hits"eMEMORY_HIT_FIELDS = ["id","key","type","snippet"], interfaceMemoryHit. - Nova função
parseMemoryHits(dataJson):safeJsonParse(try/catch já existente) →Array.isArray→ filtro por item exigindo os 4 campos comostring. Nunca lança; payload ruim vira lista vazia. reconstituteHistoricalTask:listA2ATaskEvents(row.id)agora é lido uma vez emeventRows; os eventosmemory_hitssão extraídos paramemoryHitse filtrados fora deevents;metadatapassou de{}fixo paramemoryHits.length > 0 ? { memoryHits } : {}.
tests/unit/a2a-history-route.test.ts (+104 linhas, 365 no total — teto 1200 ok)
7 testes novos:
- hidrata
metadata.memoryHitscom 2 hits e o evento de memória NÃO aparece emevents(timeline fica["submitted","completed"]). - descarta entradas malformadas (
sem snippet,keyobjeto,null, string, número) e mantém só a válida. 3–7. tabela de payloads ruins ({not-json, string JSON pura, objeto JSON, array 100% inválido, array vazio) ⇒ HTTP 200,metadata{}, e o evento de memória continua fora da timeline.
Gates (saída real)
$ node --import tsx/esm --test tests/unit/a2a-history-route.test.ts # ANTES do fix (C1.2)
✔ 10 pré-existentes ✖ 7 novos (falha típica: metadata {} esperado ≠ { memoryHits: [...] } / timeline extra 'completed')
$ node --import tsx/esm --test tests/unit/a2a-history-route.test.ts # DEPOIS (C1.4)
ℹ tests 17
ℹ pass 17
ℹ fail 0
$ node --import tsx/esm --test tests/unit/db-a2a-tasks.test.ts
ℹ tests 7
ℹ pass 7
ℹ fail 0
$ npm run typecheck:core
npm notice run tsc --pretty false -p tsconfig.typecheck-core.json
(sem erros, exit 0)
$ npx eslint 'src/app/api/a2a/tasks/[id]/route.ts' tests/unit/a2a-history-route.test.ts
eslint exit=0
$ git commit (husky ativo, sem --no-verify)
lint-staged: prettier + eslint --fix ✔
[docs-sync] PASS
[t11:any-budget] PASS
[tracked-artifacts] OK
Divergências entre plano e código real
Nenhuma divergência material. Confirmado no código:
event_typeexato ="memory_hits"(src/lib/a2a/taskExecution.ts:143,appendA2ATaskEvent(task.id, "memory_hits", JSON.stringify(hits))).- Shape de
listA2ATaskEvents={ event_type, data_json, created_at }(src/lib/db/a2aTasks.ts,A2ATaskHistoryEventRow) — semidexposto, ordenaçãoORDER BY id ASC. STATE_EVENT_PREFIX = "state:"continua governando só os eventos de transição; omemory_hitscaía noelsee herdavarow.state, o que o fazia aparecer como uma transição duplicada na timeline — daí o filtro ser obrigatório, não cosmético.
Observações (não são divergência):
- A validação implementada é espelho exata da que já existe no drawer (
DrawerMemory/MEMORY_HIT_FIELDSemOrchestrationDrawer.tsx:275), incluindo o motivo dos 4 campos:type/key/snippetsão renderizados como React children. - Zod não foi usado: esta rota não valida body (é GET sem query schema) e a leitura é de JSON persistido, coberto pelo
safeJsonParsejá existente no arquivo. Hard Rule #12 intocada — o catch da rota continua usandosanitizeErrorMessage. - Hard Rule #5 respeitada: nenhum SQL na rota; tudo por
src/lib/db/a2aTasks.ts.
Trabalho paralelo
src/lib/a2a/taskExecution.ts e tests/unit/a2a-memory-hits.test.ts (Task C2) aparecem como M no git status — não foram tocados nem adicionados por esta task. O commit contém exclusivamente os 2 arquivos da C1.