feat: Grok Build como engine da FIA (assinatura xAI) + troca de LLM por run (--llm) - #55
Merged
Merged
Conversation
…or run (--llm)
Grok Build vira o quarto engine (coding_agent: grok), reconhecido
automaticamente pela ASSINATURA — nunca por API key — e todo FDA passa a
aceitar --llm para rodar UM run em outra LLM/effort sem tocar no roster.
Engine grok (verificado contra o CLI grok 1.0.5):
- Detecção: binário em PATH, em ~/.grok/bin/grok (o install.sh só mexe no rc
do shell) ou via GROK_PATH + login em ~/.grok/auth.json (entrada OIDC com
refresh_token; expires_at vencido NÃO é logout — o CLI renova sozinho).
XAI_API_KEY nunca é sinal e é REMOVIDA do env filho: com ela o CLI troca
para cobrança por token, fora da assinatura.
- Adaptador modules/agent-grok.mjs: prompt em -p (não posicional),
--output-format streaming-messages-json (mesmo dialeto stream-json do
Claude, então as tool calls aparecem ao vivo no viewer e na TUI),
--resume <sessionId> nas rodadas de correção, papel do agente via --rules
(APPEND — nunca --system-prompt-override: o prefixo cacheável fica de pé),
--reasoning-effort clampado pelo ladder do modelo (grok-4.5 não anuncia
xhigh) e fallback que parseia o stdout inteiro quando a saída é um objeto
JSON pretty-printed.
- Trust de pasta: sem entrada em ~/.grok/trusted_folders.toml o grok PULA os
hooks do projeto em silêncio. session.ensure concede uma vez
(grok --trust, 1 turno sem tools) e RECUSA o run se não conseguir.
- Hooks bilíngues (fda-lock.mjs, desktop-guard.mjs): leem tool_name|toolName
e tool_input|toolInput, reconhecem os ids do grok (run_terminal_command,
search_replace) e negam nos dois protocolos no MESMO objeto — exit 2 +
stderr (Claude Code) e stdout {"decision":"deny", hookSpecificOutput}
(grok). Um hook que fala um dialeto só é no-op silencioso no outro engine.
Flag --llm (escopo de UM run, roster intocado):
- Gramática [agent[,agent]=]<model>[ <level>], repetível, resolvida pelo
módulo único modules/llm-target.mjs — o mesmo de `imp llm set`, então as
duas grafias não podem divergir. Normaliza ("grok 4.6" → grok-4.6),
clampa o nível por engine (max no grok → xhigh) e recusa id ambíguo com a
correção exata.
- Impresso no início do run, traçado como llm_override e salvo em
imp/data/sessions/<id>/llm_override.json: um --resume sem a flag reaplica
a mesma LLM (trocar de modelo no meio quebraria sessão e cache); uma flag
explícita no resume substitui a salva. Nível explícito vale para todas as
fases do agente naquele run (os phase_overrides do roster caem só ali).
Registro em todos os lugares: roster/validate (ENGINE_NAMES como fonte
única), imp llm//llm, aba Agents do viewer (segmento grok, modelos do cache
do próprio CLI, pills de effort por engine, card lateral com login/trust/
XAI_API_KEY), TUI, header do fia.config.yaml, preflight/doctor/finish
(src/lib/grok-auth.js), prompts /task /goal /quick /bug /llm, cookbooks,
README e DOCS.
Testes: fia-grok-engine.test.js (auth, trust cascata, models cache, argv,
clamp de effort, parsing do stream via binário falso) e
fia-llm-override.test.js (gramática, precedência de specs, persistência p/
resume), mais os dois dialetos nos testes dos hooks. 1511 verdes + lint.
Validado com run REAL: fda_scout --llm "scout=grok 4.6 low" fechou ACCEPTED,
com o desktop-guard negando `orca computer` dentro do run.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiJUQ9UtghDyy6qixym8uW
elberrd
added a commit
that referenced
this pull request
Aug 24, 2026
…56) Fecha o ciclo de release da PR #55: o engine `grok` (assinatura xAI, reconhecido por ~/.grok/auth.json) e a flag --llm de escopo por run precisam de uma versão nova para o npm publish. Claude-Session: https://claude.ai/code/session_01QiJUQ9UtghDyy6qixym8uW Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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.
O que muda
Duas coisas pedidas nesta sessão:
coding_agent: grok), reconhecido automaticamente pela assinatura xAI — nunca por API key.--llmem todo FDA: rodar UM run em outra LLM/effort sem tocar emimp/fia.config.yaml.Engine
grok(verificado contra o CLIgrok1.0.5 instalado)~/.grok/bin/grok(oinstall.shsó mexe no rc do shell) ou viaGROK_PATH; login lido de~/.grok/auth.json(entrada OIDC comrefresh_token—expires_atvencido não é logout, o CLI renova sozinho).XAI_API_KEYnunca conta como sinal e é removida do env filho: com ela o CLI troca para cobrança por token, fora da assinatura.modules/agent-grok.mjs: prompt em-p(não posicional),--output-format streaming-messages-json— que é o mesmo dialeto stream-json do Claude Code, então as tool calls do grok aparecem ao vivo no viewer e na TUI;--resume <sessionId>nas rodadas de correção; papel do agente via--rules(APPEND, nunca--system-prompt-override, para o prefixo cacheável ficar de pé);--reasoning-effortclampado pelo ladder do modelo (grok-4.5 não anunciaxhigh); fallback que parseia o stdout inteiro quando a saída é um objeto JSON pretty-printed.~/.grok/trusted_folders.tomlo grok pula os hooks do projeto em silêncio.session.ensureconcede uma vez (grok --trust, 1 turno sem tools) e recusa o run se não conseguir.fda-lock.mjs,desktop-guard.mjs): leemtool_name|toolNameetool_input|toolInput, reconhecem os ids do grok (run_terminal_command,search_replace) e negam nos dois protocolos no mesmo objeto — exit 2 + stderr (Claude Code) e stdout{"decision":"deny", hookSpecificOutput}(grok). Um hook que fala um dialeto só vira no-op silencioso no outro engine.Flag
--llm(escopo de um run)Gramática
[agent[,agent]=]<model>[ <level>], repetível, resolvida pelo módulo únicomodules/llm-target.mjs— o mesmo deimp llm set, então as duas grafias não podem divergir. Normaliza (grok 4.6→grok-4.6), clampa o nível por engine (maxno grok →xhigh) e recusa id ambíguo com a correção exata. É impressa no início do run, traçada comollm_overridee salva com o run (imp/data/sessions/<id>/llm_override.json): um--resumesem a flag reaplica a mesma LLM — trocar de modelo no meio quebraria a sessão e o cache. Nível explícito vale para todas as fases daquele agente no run (osphase_overridesdo roster caem só ali). Dentro do Pi:/task 12 --llm "grok 4.6 high".Registro (regra do CLAUDE.md)
roster/
validate(ENGINE_NAMEScomo fonte única),imp llm//llm, aba Agents do viewer (segmento grok, modelos do cache do próprio CLI, pills de effort por engine, card lateral com login/trust/XAI_API_KEY), TUI, header dofia.config.yaml, preflight/doctor/finish (src/lib/grok-auth.js), prompts/task/goal/quick/bug/llm, cookbooks, README e DOCS.Verificação
npm test1511/1511 +npm run lintlimpos. Novos:fia-grok-engine.test.js(auth, cascata do trust, models cache, argv, clamp de effort, parsing do stream via binário falso) efia-llm-override.test.js(gramática, precedência de specs, persistência para o resume), mais os dois dialetos nos testes dos hooks.fda_scout --llm "scout=grok 4.6 low"em projeto temporário — trust concedido automaticamente, 93k tokens/20s, tool calls traçadas, o desktop-guard negouorca computer get-app-statedentro do run ("Hook denied: Blocked: Orca computer-use…") e o--resumesem flag reaplicou o override salvo →ACCEPTED (goal met).🤖 Generated with Claude Code
https://claude.ai/code/session_01QiJUQ9UtghDyy6qixym8uW