Repository navigation
Conversation
- src/renderer/src/i18n/index.ts: LANGUAGES + resources + supportedLngs - src/renderer/src/i18n/locales/pt-BR.json: stub inicial (copia de en.json, 1203 chaves) - tools/check-ptBR-parity.cjs + npm run check:ptBR: ausentes/orfas/placeholders
common, settings, settingsHero, onboarding, setupPanel. Glossario: agente, escritorio (floor), colmeia (hive), criar (spawn), quadro (board), tarefa (task), gatilho (trigger), Configuracoes.
agentCard, agentDetail, agentControl, agentStrip, addAgent, askMe, badge, blockedBanner. Aba 'ask me' -> 'me pergunte'; botao spawn -> criar.
commandCenter, kanban, queueComposer, triggersUi, triggersTab, triggerHistory, schedulesSection, workersTab. dispatch->despachar, tabs: monitor/tarefas/me pergunte/gatilhos/historico/memoria/grafo.
Contributor
|
✅ Evidence received. Before and after are both attached. Thanks — this is what makes a PR reviewable in one pass. |
office, tema, sidebar, commandBar, custos, engines, MCP, integracoes, memoria, skills, arquivos, git, IDE, terminal, voz, updates, org, contexto, webhooks, waterfall, threads. 1203/1203 chaves traduzidas.
HivePicker, acoes live dos agentes (mapa agentAction), auto mode, portao de spawn, terminal pty, telas vazias, editor/IDE, toasts, splitter, release drop, hero, booting. ar/zh-CN com ingles marcado pending translator (allowlist). skills/workers/disjuntor em pt-BR.
nativeMenu.* nos 4 locales; preload setMenuLabels; main valida e reconstroi (registerAccelerator:false e multiWindow preservados); hook useMenuLabelsSync no boot + troca de idioma. Submenus View/Window por role seguem em ingles (documentado). Teste native-menu.
Todo agente OpenCode aparecia com tokens=0, usd=0 e lastActiveSecAgo=null no fleet.json -- inclusive o deus, que por isso nao conseguia medir o seu proprio consumo. A causa nao era so o layout. Duas: 1. A telemetria so conhecia o layout do Claude Code (~/.claude/projects). OpenCode guarda sessao em SQLite. Corrigido com readOpencodeUsage: mapeia session_v2.directory -> cwd e agrega os tokens EM SQL, nunca em JS (session_message.data e JSON de varios KB e um diretorio tem ~17k linhas; somar em JS alocava dezenas de MB a cada 30s). Nunca soma o diretorio inteiro (D11). 2. O leitor abria ~/.local/share/opencode/opencode.db, mas o spawn aponta XDG_DATA_HOME para <harnessHome>/.opencode-data. Eram DOIS bancos: 62,8 MB dos agentes contra 535,4 MB do opencode interativo. Compilava, os testes passavam, e os numeros continuavam a zero. Agora opencodeDbPath(harnessHome) e a UNICA computacao dos dois lados -- o spawn deriva XDG_DATA_HOME dela e a telemetria le com ela. Testes: test/opencode-usage-db.test.cjs (novo) abre um SQLite de verdade -- o caminho de leitura nao tinha cobertura nenhuma. Inclui a trava do D11 (um segundo agente no mesmo cwd nao contamina a soma) e um guard que falha se o spawn voltar a computar o caminho a parte. Verificado que morde: revertendo o reader, 2 testes caem. Harness corrigido pelo caminho: transcript-usage.test.cjs transpilava transcript.ts achatado e so mapeava ./pricing; com o ./fs novo o modulo nem carregava. Passa a espelhar a arvore real (main/ + shared/). O teste do XDG_DATA_HOME deixou de fixar a expressao literal e passou a fixar o helper partilhado -- que e o que deve estar travado. Reparado encoding em telemetry.ts e transcript.ts: BOM + mojibake cp1252 (20x em dash, 287x box drawing, 7x seta, 1x lock) deixados pelo trabalho nao commitado. Comentarios so; as 22 falhas de suite sao as mesmas antes e depois. Suite: 937 -> 942 a passar, 22 a falhar (identicas ao baseline Windows). Typecheck node e web limpos. Ainda precisa de `npm run dist:win` + reinstalar para chegar ao binario.
O deus conseguia hirear workers efemeros (spawn-requests/) mas nao kill,
reset, restore nem create de agentes cheios. Estas quatro ops passam a ser
possiveis escrevendo UM ficheiro JSON em HIVE_ROOT/agent-ops/:
{ op: kill|reset|restore|create, id?, params?, reason }
`reason` e obrigatorio em todas: quem gasta justifica, e o humano audita na
aba Atividade.
src/main/agentOps.ts (novo) e PURO -- sem fs, sem config, sem catalogo. Todo o
contexto de que precisa (ids vivos, ids arquivados, contagem da frota,
providers) chega como argumento, o que o torna testavel sem Electron. Same
postura do processSpawnRequest: fechar a porta com um motivo, nunca throw.
kill recusa o proprio deus; id verbatim, nunca reescrito (reescrever
mataria o agente errado)
reset digita o comando de clear do provider no PTY, sem tocar no roster:
mesmo agente, mesmo cwd, mesma memoria, conversa nova. Recusa se o
terminal produziu ha menos de 30s -- digitar no meio do output
corrompe o run
restore ressuscita um ARQUIVADO sob o mesmo id (memoria e inbox religam),
reutilizando a command line que aquela execucao usou
create exige role/cwd/provider/model + tokenCap inteiro positivo, e trava
em 6 agentes plenos vivos. Se o tokenCap for rejeitado depois do
spawn, o agente e morto na hora -- um spawn que o cap recusa nao
pode sobreviver sem teto
Sem IPC novo e sem poll. create/restore retransmitem `hive:agentSpawned` e kill
transmite `hive:agentArchived`, que o useHive JA tratava; o renderer descobre o
resultado pelos canais que a UI ja usava. Main nunca escreve no espelho
roster.json.
Duas decisoes que divergem do plano original:
- restore/create honram o gate `orchestratorMaySpawn` (OFF por default), igual
aos spawn-requests: deixar o orquestrador subir agentes sem pedido e uma
decisao de GASTO. Com o gate OFF o ficheiro ESPERA na fila, nao falha. kill e
reset nao gastam nada e correm sempre.
- Falha vai para os DOIS lados: informGod (inbox do deus) E kind:'agent-op-failed'
na aba Atividade. Recusa que so chega ao inbox do deus e invisivel a quem tem
de decidir se reenvia -- foi o buraco que o bug HarnessMD#113 deixou.
Testes: test/agent-ops.test.cjs cobre as 4 ops, auto-kill do deus, teto, tokenCap
nao-inteiro, recusa de id desconhecido e o cursor idempotente de resultados, mais
um guard de wiring que falha se o watcher nao for ligado como o dos workers.
Suite: 929 -> 939 a passar (965 -> 975 testes, +10), 22 a falhar no baseline e
22 depois -- as mesmas, todas de symlink/EPERM no Windows, nenhuma tocada.
agent-ops 10/10. Typecheck node e web limpos.
Falta o E2E manual (Task 5): matar, resetar, restaurar, criar, estourar o teto
com o deus a dirigir.
Uma branch so. `feat/agent-ops` era baseada no upstream HEAD e nao tinha a
traducao; este merge junta as duas coisas em `feat/pt-BR`, que e a branch que o
app corre a partir.
Conflito unico em test/arabic-ui.test.cjs: os dois lados acrescentaram entradas
a allowlist SAME_ON_PURPOSE (as de agent-ops e as da traducao). Resolvido
mantendo as duas listas -- cada entrada e uma chave que o tradutor ainda nao
traduziu e que por isso esta em ingles, igual ao fallback.
As 4 chaves de activity ficaram traduzidas em pt-BR, fechando a pendencia que
tasks/todo-restore.md registava:
logRestored {{name}} restaurado
logKilled {{name}} parado
logReset {{name}} reiniciado
logOpFailed {{op}} recusado para {{name}}: {{reason}}
Verificado: check:ptBR 1292 chaves, 0 ausentes, 0 orfas, placeholders intactos.
Typecheck node e web limpos. Suite 942 -> 952 a passar, 22 a falhar -- lista
nominalmente identica ao baseline (symlinks/EPERM no Windows). agent-ops,
arabic-ui, opencode-usage-db, opencode-datadir e transcript-usage: 33/33.
The hand-edited %APPDATA%\npm\opencode.cmd that points at the OpenCode
desktop V2 CLI through %LOCALAPPDATA% used to fall out of the shim parser
to the cmd.exe route, where the 8191-char ceiling gutted the multi-line
--prompt hive brief ('Linha de comando muito longa', exit 1). expand()
now resolves well-formed %VAR% tokens against the real environment;
undefined variables still refuse (never resolves to garbage). +2 tests
pinning the exact hand-authored shape.
The PTY status parser only recognised Claude Code's 'esc to interrupt'
footer and ●-tool lines, so every OpenCode agent drifted to the 4s idle
timer mid-turn and read 'ocioso' while actively streaming. Now the
OpenCode busy footer ('esc stop · …') and its 'Thinking:' reasoning
blocks count as mid-turn heartbeats. Over-pinning is still impossible:
the floor-wide 12s lastOutputAt quiescence sweep remains the backstop.
Mirrors upstream 0.5.6+ so the god can run engines whose presets cannot express the right shape (the OpenCode desktop V2 CLI rejects --model, which buildSpawnCommand unconditionally emits from godModel). The hive injection (OPENCODE_CONFIG_CONTENT, hooks plugin, --prompt seed) still applies on top — only the BASE command is overridden.
node:sqlite only exists on Node >= 22 (Electron 39+); the packaged 0.5.7 upstream actually ships Electron 32.3.3, where importing it crashes the main process at boot. better-sqlite3 is rebuilt against the running Electron's ABI by electron-rebuild (same driver the persist store uses), its require() does not dlopen until instantiated, and the prepare/all/get/close API is a near drop-in for this read-only reader. Usage semantics unchanged: newest-session-only aggregation (D11).
The asar's package.json declares 39.8.5 as a devDependency, but the bundled exe runtime reports 32.3.3. Align the fork's dev runtime to the executed version: node:sqlite is absent on 32 (the transcript reader now uses better-sqlite3, see previous commit), the ABI-locked native modules (better-sqlite3) already target 32, and node-pty is NAPI-stable.
Today the floor seats everyone automatically (god → 0, workers → first free in add order). Edit Agent now exposes a Desk picker; a pin beats every auto rule — including the god's reserved seat 0 — and NEVER evicts the agent already sitting on a pinned seat (out-of-range/taken pins degrade to auto with a console warning). Pins persist in the roster (durable Agent.seat): the god's pin is captured from the stale entry before respawn re-creates him, workers survive via their restore spread. A pin change re-seats the avatar live (removeCharacter releases the old seat, addCharacter re-claims under the new pin). OfficeFloor publishes seatCount for the picker; +6 tests pin the claim semantics.
…localtunnel (TSF-8, Onda-1 TSF-13, re-remoção TSF-17)
…a-2) - vite pinned exact 7.3.7 (latest 7.3.x), electron-vite ^4.0.1 - no config changes needed; typecheck PASS (node+web); electron-vite build PASS - plugin-react kept at ^4.3.2 (4.7.0 peers vite ^7) - audit: 30 (2C/23H/5M) -> 27 (2C/22H/3M) - branch tsf9-wave2-vite7 from c531426
Quando o motor opencode-cli imprime 'Free usage limit reached', o fork troca a conta ATIVA do CLI para a proxima credencial ja armazenada (opencode auth switch), poe a conta que falhou em cooldown de 4h e reinicia o terminal do agente afetado. O pool e automatico: qualquer conta logada no desktop entra sozinha. Sem cobranca, sem pedir login novo. - src/main/opencode-pool.ts: seletor puro (pickNextAccount/pooledCredentials/decodeJwtEmail) + rotateOpencodeCredential com cooldown em userData/opencode-rotation.json. Le o store via better-sqlite3 (lazy), troca pelo comando nativo do CLI (locks/migracoes ficam com ele) e verifica o flag active=1 no DB. No Windows, shims .cmd/bat passam por cmd.exe (execFile nao executa .cmd). - deteccao num unico ponto: terminalPool.watchQuota (cauda de 400 chars, throttle 60s) dispara 'hive:quota-hit' - useHive effect HarnessMD#8: ouve o evento, pede a troca ao main, escreve no feed do agente e respawna via o revive do auto-revive (effect HarnessMD#7 publica reviveRef). Um switch por vez: varios agentes no mesmo segundo descrevem a mesma conta. - test/opencode-pool.test.cjs: 9 testes do seletor (conta atual nunca repete, frescor por conta, cooldown/liberacao, store de 1 conta)
O TUI do opencode colore a frase e pode quebra-la na largura do terminal. A cauda do PTY agora e normalizada (ANSI fora, \\r\\n -> espaco) antes do match de 'Free usage limit reached', para a rotacao nao depender da pintura exata.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Type of change
Evidence
Before
![HivePicker em inglês]


After
![Centro de Comando em português]


How I tested it
npm install(Node 20) →npm run check:ptBR(paridade 1288 chaves OK) →npm run typecheck(node + web verdes) →npm run test:focused→npm run dev→ Settings → General → Language → Português (BR) → navegação manual nas telas (config picker, agentes, command center, kanban, settings, terminal, menu nativo).Credit (optional)
Discord:
X:
Checklist
npm run typecheckpasses.npm run test:focusedpasses. (nota: 933/970 no Windows — as 23 falhas são idênticas nomainpristino, ambiente: symlinks/privilégios; zero regressão do diff)npm run buildsucceeds. (não rodei build empacotado aqui — sódev)DESIGN.md/tokens.ts— nenhum pixel novo, só strings.