primocode 8.34.0 → 8.34.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/bin/primocode.js +45 -3
  2. package/package.json +1 -1
package/bin/primocode.js CHANGED
@@ -268,9 +268,31 @@ function refreshPrompt() { if (rl) rl.setPrompt(makePrompt()); }
268
268
  // — não um novo comando. Sem isso o "s" de confirmação virava prompt para a IA.
269
269
  let pendingAsk = null;
270
270
 
271
+ /* ── O QUE A PESSOA ADIANTA ──────────────────────────────────────────────
272
+ * Enquanto a abertura corre — e ela demora, porque confere o plano no
273
+ * servidor — o que for digitado não é comando nem resposta ainda: a pergunta
274
+ * ainda não apareceu. Fica aqui.
275
+ *
276
+ * Sem isto, esse texto caía como PEDIDO no agente. Medido no pacote
277
+ * publicado: o "2" da escolha da IA virou pergunta no chat e o modelo
278
+ * respondeu "Oi! Como posso ajudar?".
279
+ *
280
+ * E guardar não bastava: preso na fila de comandos, ele nunca chegava à
281
+ * pergunta que veio depois. Por isso o `ask` olha aqui ANTES de esperar uma
282
+ * linha nova — quem digitou 2 antes de ver o menu escolheu a 2, e a escolha
283
+ * dela vale.
284
+ */
285
+ let segurando = false;
286
+ const adiantadas = [];
287
+
271
288
  function ask(question) {
272
289
  return new Promise((resolve) => {
273
- if (rl) { process.stdout.write(question); pendingAsk = resolve; return; }
290
+ if (rl) {
291
+ process.stdout.write(question);
292
+ if (adiantadas.length) { const a = adiantadas.shift(); process.stdout.write(a + '\n'); return resolve(a); }
293
+ pendingAsk = resolve;
294
+ return;
295
+ }
274
296
  const tmp = readline.createInterface({ input: process.stdin, output: process.stdout });
275
297
  tmp.question(question, (a) => { tmp.close(); resolve(a); });
276
298
  });
@@ -1527,6 +1549,8 @@ async function main() {
1527
1549
 
1528
1550
  rl.on('line', (line) => {
1529
1551
  if (pendingAsk) { const resolve = pendingAsk; pendingAsk = null; resolve(line); return; }
1552
+ // Abertura correndo: guarda em vez de mandar ao agente.
1553
+ if (segurando) { adiantadas.push(line); return; }
1530
1554
  queue.push(line);
1531
1555
  drain();
1532
1556
  });
@@ -1540,6 +1564,18 @@ async function main() {
1540
1564
  * para pegar. Quem colasse dois comandos perdia o segundo, e quem
1541
1565
  * fechasse a entrada saía sem nem o "Até logo". Digitando devagar ninguém
1542
1566
  * via — os ouvintes ficam prontos milissegundos depois. */
1567
+ /* A FILA FICA SEGURA ENQUANTO A ABERTURA CORRE.
1568
+ *
1569
+ * `busy` já é o freio do `drain`, e é ele que se usa aqui. Sem isso, tudo
1570
+ * o que a pessoa digitar antes de a pergunta aparecer — e ela demora,
1571
+ * porque confere o plano no servidor — cai como PEDIDO no agente. Medido
1572
+ * no pacote publicado: o "2" da escolha da IA virou uma pergunta no chat,
1573
+ * e o modelo respondeu "Oi! Como posso ajudar?".
1574
+ *
1575
+ * O ouvinte de `line` continua atendendo o `ask` normalmente: ele olha o
1576
+ * `pendingAsk` antes da fila. O que fica retido é só o que não era
1577
+ * resposta a nada. */
1578
+ segurando = true;
1543
1579
  boasVindas.rodar({
1544
1580
  perguntar: ask,
1545
1581
  mostrar: (t) => console.log(t),
@@ -1555,8 +1591,14 @@ async function main() {
1555
1591
  // o primocode-server, que tem a chave do provedor.
1556
1592
  state.liberado = !r || r.liberado !== false;
1557
1593
  state.motivoBloqueio = r && r.motivo;
1558
- if (!closed && !busy) rl.prompt();
1559
- }).catch(() => { state.liberado = true; });
1594
+ }).catch(() => { state.liberado = true; }).then(() => {
1595
+ // O que sobrou de adiantado não era resposta de nada: vira comando,
1596
+ // na ordem em que foi digitado. Nada se perde, só esperou a vez.
1597
+ segurando = false;
1598
+ while (adiantadas.length) queue.push(adiantadas.shift());
1599
+ if (queue.length) drain();
1600
+ else if (!closed) rl.prompt();
1601
+ });
1560
1602
  }
1561
1603
 
1562
1604
  main().catch((e) => { console.error(c.err(e.message || e)); process.exit(1); });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primocode",
3
- "version": "8.34.0",
3
+ "version": "8.34.1",
4
4
  "description": "PrimoCode — agente de engenharia com IA e cursor próprio. Requer conta Conecta Primo AI (Premium ou Super). 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": {