Skip to content

feat: Grok Build como engine da FIA (assinatura xAI) + troca de LLM por run (--llm) - #55

Merged
elberrd merged 1 commit into
mainfrom
feat/grok-engine-e-llm-por-run
Aug 24, 2026
Merged

feat: Grok Build como engine da FIA (assinatura xAI) + troca de LLM por run (--llm)#55
elberrd merged 1 commit into
mainfrom
feat/grok-engine-e-llm-por-run

Conversation

@elberrd

@elberrd elberrd commented Aug 24, 2026

Copy link
Copy Markdown
Owner

O que muda

Duas coisas pedidas nesta sessão:

  1. Grok Build vira o quarto engine da FIA (coding_agent: grok), reconhecido automaticamente pela assinatura xAI — nunca por API key.
  2. --llm em todo FDA: rodar UM run em outra LLM/effort sem tocar em imp/fia.config.yaml.

Engine grok (verificado contra o CLI grok 1.0.5 instalado)

  • Detecção: binário no PATH, em ~/.grok/bin/grok (o install.sh só mexe no rc do shell) ou via GROK_PATH; login lido de ~/.grok/auth.json (entrada OIDC com refresh_tokenexpires_at vencido não é logout, o CLI renova sozinho). XAI_API_KEY nunca conta como 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 — 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-effort clampado pelo ladder do modelo (grok-4.5 não anuncia xhigh); 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ó vira no-op silencioso no outro engine.

Flag --llm (escopo de um run)

node imp/fda_sdlc.mjs <brief> --llm "grok 4.6 high"                              # todos os agentes deste run
node imp/fda_sdlc.mjs <brief> --llm "builder=opus xhigh" --llm "reviewer=grok-4.5"

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.6grok-4.6), clampa o nível por engine (max no grok → xhigh) e recusa id ambíguo com a correção exata. É impressa no início do run, traçada como llm_override e salva com o run (imp/data/sessions/<id>/llm_override.json): um --resume sem 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 (os phase_overrides do roster caem só ali). Dentro do Pi: /task 12 --llm "grok 4.6 high".

Registro (regra do CLAUDE.md)

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.

Verificação

  • npm test 1511/1511 + npm run lint limpos. Novos: fia-grok-engine.test.js (auth, cascata do trust, 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 para o resume), mais os dois dialetos nos testes dos hooks.
  • Run REAL no grok, não só unitário: 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 negou orca computer get-app-state dentro do run ("Hook denied: Blocked: Orca computer-use…") e o --resume sem flag reaplicou o override salvo → ACCEPTED (goal met).

🤖 Generated with Claude Code

https://claude.ai/code/session_01QiJUQ9UtghDyy6qixym8uW

…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
elberrd merged commit 3085ebc into main Aug 24, 2026
5 of 7 checks passed
@elberrd
elberrd deleted the feat/grok-engine-e-llm-por-run branch August 24, 2026 03:08
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>
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.

1 participant