Skip to content

feat(#231): Omega Prism Fatia 1 — Segundo Cérebro por usuário (notas na conta)#299

Draft
Lucas-Belucci-Bellini wants to merge 4 commits into
mainfrom
claude/omega-fatia1-cerebro-notas
Draft

feat(#231): Omega Prism Fatia 1 — Segundo Cérebro por usuário (notas na conta)#299
Lucas-Belucci-Bellini wants to merge 4 commits into
mainfrom
claude/omega-fatia1-cerebro-notas

Conversation

@Lucas-Belucci-Bellini

Copy link
Copy Markdown
Owner

📝 Omega Prism · Fatia 1 — Segundo Cérebro por usuário

Fecha o L1 Conhecimento da Fatia 1 (o L2 Memória saiu em #297/#298). O /cerebro deixa de ser só leitura: o operador cria notas que viram nós no grafo, ligados aos conceitos — e, logado, sincronizam com a conta (cross-device), igual à Memória.

O que entrou

  • 🧩 src/core/knowledge-cloud.js — CRUD da tabela knowledge_notes por usuário (RLS dono-só), sem SDK, no-op sem login/Supabase. Mesmo padrão do memory-cloud.js.
  • 🗃️ src/core/knowledge.js — store local-first (localStorage baluarte:knowledge:notes): listNotes (local+conta, dedup por conteúdo), addNote/deleteNote (espelho best-effort na conta), syncNotes (pull da nuvem + push das locais).
  • 🖥️ src/pages/cerebro.jscompositor (título + corpo) + lista de notas (apagar) + botão ☁️ Conta (logado: sincroniza; deslogado: leva ao /perfil). As notas (📝) e memórias (🧠) viram nós de 1ª classe (cor própria + entrada na legenda); o grafo remonta ao adicionar/apagar. initGraph agora devolve um cleanup (cancela o loop/observers) — sem leak ao remontar.

🛟 Zero regressão / web leve (#238)

Verificação (Playwright, modo web)

  • Criar nota no compositor → vira card + nó 📝 no grafo, ligado a um conceito; métricas 29→32 nós, 41→46 conexões, 3 notas. ✅
  • npm run build limpo · smoke OK (boot + editor intactos). ✅
  • Round-trip na nuvem só roda logado → testável no preview/produção (sandbox não alcança o Supabase). knowledge_notes já estava aplicada/verificada (REST anon: GET→[], POST→401) em feat(#231): Omega Prism Fatia 1 — Memória por usuário (banco + cliente) #297.

⏭️ Fatia 1 fica completa (L1 + L2 por usuário, na web). Próximo: Fatia 2 (casca do Prisma — barra de comando única + contexto compartilhado).

🛡️ Backup pré-merge: backup/2026-06-24-pre-fatia1-web.


🤖 Generated with Claude Code

https://claude.ai/code/session_01WVGexdsK5EK86CD3QWkHoQ


Generated by Claude Code

…na conta)

Fecha o L1 Conhecimento da Fatia 1: o /cerebro deixa de ser só leitura e ganha
notas do operador, que viram nós no grafo ligados aos conceitos.

- knowledge-cloud.js: CRUD da tabela knowledge_notes por usuário (RLS dono-só),
  sem SDK, no-op sem login/Supabase (mesmo padrão do memory-cloud).
- knowledge.js: store local-first (localStorage) com dedup por conteúdo e
  espelho best-effort na conta (syncNotes pull+push). Cross-device logado.
- cerebro.js: compositor (título+corpo) + lista de notas (apagar) + botão
  ☁️ Conta; notas/memórias viram nós de 1ª classe (cor/legenda) e o grafo
  remonta ao mudar as notas. initGraph agora devolve cleanup (sem leak ao
  remontar).

Deslogado segue 100% local. Verificado (Playwright): criar nota → card + nó
no grafo (29→32 nós, 3 notas); build limpo + smoke ok.
@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
projeto-baluarte Ready Ready Preview, Comment Jun 25, 2026 6:35am

O label/corpo da nota é conteúdo do usuário; com innerHTML, um título
como <img src=x onerror=...> executaria ao passar o mouse no nó. Agora o
tooltip é montado via h()/textContent — sem sink de HTML. Resolve o
alerta high do CodeQL na PR #299.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WVGexdsK5EK86CD3QWkHoQ
… binário)

keyOf() usava um caractere NUL (0x00) como separador entre título e corpo,
o que fazia o git/file classificarem knowledge.js como binário ('data') e,
provavelmente, confundia o extractor do CodeQL (alerta high sem sink real
localizável no código). Troca por '\n' — separador de texto, mesmo efeito
de dedup, arquivo volta a ser texto UTF-8 limpo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WVGexdsK5EK86CD3QWkHoQ
…uest-forgery)

O user.id (da sessao em localStorage) e o id da nota (de linhas da rede)
entravam na querystring do PostgREST via dbFetch -> fetch(). CodeQL trata
isso como request-forgery (CWE-918, high): o sink fetch() vive no
supabase.js (inalterado), por isso o alerta nao aparecia em nenhum sink
dos arquivos do diff. Passa a validar formato UUID estrito antes de
interpolar na URL — barreira que o CodeQL reconhece; fora do formato vira
no-op. Mantem o mesmo comportamento (ids do Supabase sao UUID).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WVGexdsK5EK86CD3QWkHoQ
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