primocode 8.20.0 → 8.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/act.js +17 -1
  2. package/package.json +1 -1
package/lib/act.js CHANGED
@@ -377,6 +377,7 @@ async function runAct(userPrompt, opts) {
377
377
  // usuário — que não tem prompt nenhum para ajustar. É o modelo tropeçando
378
378
  // ao escrever o JSON da chamada, e quase sempre acerta na segunda.
379
379
  let funcoesQuebradas = 0;
380
+ let respostasVazias = 0;
380
381
  // O teto de tokens é POR MINUTO, somando TODAS as chamadas — o plano, o
381
382
  // resumo e cada rodada do loop dividem a mesma cota. Um pedido perfeito
382
383
  // estoura se a rodada anterior já gastou o minuto. Encolher não resolve
@@ -457,7 +458,11 @@ async function runAct(userPrompt, opts) {
457
458
  // isto o 400 cru do provedor ("Failed to call a function. Please
458
459
  // adjust your prompt.") caía na tela de quem não tem prompt nenhum
459
460
  // para ajustar.
460
- if (streamError && /failed to call a function|failed_generation|tool_use_failed/i.test(String(streamError))
461
+ // "failed to parse tool call arguments" é a variante nova do mesmo
462
+ // tropeço: o provedor recusou o JSON que o MODELO gerou. Medido em
463
+ // produção num "crie um vídeo" — o documento grande saía torto e o
464
+ // erro cru parava a tarefa com a corrente inteira ainda de pé.
465
+ if (streamError && /failed to call a function|failed to parse tool call|failed_generation|tool_use_failed/i.test(String(streamError))
461
466
  && funcoesQuebradas < 4 && !PARAR) {
462
467
  funcoesQuebradas++;
463
468
  if (!subagent) console.log(ident(profundidade) + c.dim(' ⎿ o modelo tropeçou na chamada — tentando de novo'));
@@ -506,12 +511,23 @@ async function runAct(userPrompt, opts) {
506
511
  // Sem tool_calls: o modelo respondeu e acabou.
507
512
  if (!toolCalls.length) {
508
513
  finalText = assistantText.trim();
514
+ // Resposta VAZIA não é resposta: sem tool, sem texto e sem erro é
515
+ // o modelo grátis engasgando. Cair direto no "parei sem concluir"
516
+ // jogava a tarefa fora quando repetir a MESMA rodada quase sempre
517
+ // resolve — visto em produção no primeiro pedido de vídeo.
518
+ if (!finalText && respostasVazias < 2 && !PARAR) {
519
+ respostasVazias++;
520
+ if (!subagent) console.log(ident(profundidade) + c.dim(' ⎿ o modelo respondeu vazio — tentando de novo'));
521
+ iteration--;
522
+ continue;
523
+ }
509
524
  if (!subagent) {
510
525
  if (finalText && !streaming) console.log('\n' + c.white(finalText));
511
526
  else if (streaming) process.stdout.write('\n');
512
527
  }
513
528
  break;
514
529
  }
530
+ respostasVazias = 0;
515
531
 
516
532
  if (streaming && !subagent) process.stdout.write('\n');
517
533
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primocode",
3
- "version": "8.20.0",
3
+ "version": "8.20.1",
4
4
  "description": "PrimoCode — agente de engenharia com IA e cursor próprio. Modelos grátis. Cria arquivos, roda comandos, controla navegador e desktop: abre apps, clica em botões e ícones pelo nome, digita e usa atalhos.",
5
5
  "main": "bin/primocode.js",
6
6
  "bin": {