primocode 8.42.0 → 8.42.2

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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # PrimoCode v8.42.0
1
+ # PrimoCode v8.42.2
2
2
 
3
3
  Agente de engenharia brasileiro para o terminal, no estilo Claude Code.
4
4
  Cria arquivos de verdade, roda comandos, **controla o navegador e o desktop** —
@@ -11,7 +11,7 @@ do Claude ou do GPT escolhe isso na abertura, com as setinhas, e passa a usar a
11
11
  assinatura dele.
12
12
 
13
13
  ```
14
- ▐▛███▜▌ Primo Code v8.42.0
14
+ ▐▛███▜▌ Primo Code v8.42.2
15
15
  ▝▜█████▛▘ Bem-vindo de volta, Joel
16
16
  ▘▘ ▝▝ ~/primocode · /dir <pasta> muda
17
17
  ```
package/bin/primocode.js CHANGED
@@ -344,6 +344,26 @@ function makePrompt() {
344
344
  }
345
345
  function refreshPrompt() { if (rl) rl.setPrompt(makePrompt()); }
346
346
 
347
+ /**
348
+ * O portão do plano (`state.liberado`) SÓ era decidido uma vez, na abertura.
349
+ * Quem conectava DEPOIS — `/connect` manual, `/connect trocar`, `/logout` —
350
+ * mudava a conta de verdade e o portão continuava com a resposta antiga.
351
+ *
352
+ * "conecta mas depois de uns 10 segundos desconecta": era exatamente isto.
353
+ * A pessoa via "Conectado. Plano premium" — real, acabou de vir do
354
+ * servidor — e no pedido seguinte caía em "O PrimoCode pede o plano
355
+ * Premium ou Super", porque `state.liberado` tinha ficado `false` de uma
356
+ * tentativa anterior (sem plano, ou login que não deu) e nada o atualizava.
357
+ *
358
+ * Toda vez que a conexão muda, chame isto com o que se sabe AGORA — o
359
+ * `{ pro }` que já veio de `conta.entrar()` ou de `conta.atual()`, sem ir à
360
+ * rede de novo: essas chamadas já confirmaram o servidor há segundos.
361
+ */
362
+ function sincronizarLiberacao({ pro, motivo } = {}) {
363
+ state.liberado = !!pro;
364
+ state.motivoBloqueio = pro ? null : (motivo || 'sem-plano');
365
+ }
366
+
347
367
  // Enquanto uma pergunta está no ar, a próxima linha digitada é a RESPOSTA dela
348
368
  // — não um novo comando. Sem isso o "s" de confirmação virava prompt para a IA.
349
369
  let pendingAsk = null;
@@ -1323,6 +1343,11 @@ async function handleSlash(text) {
1323
1343
  console.log(c.muted(' Já conectado como ') + c.brand(jaEsta.uid.slice(0, 12) + '…')
1324
1344
  + c.muted(` · plano ${jaEsta.plano}`));
1325
1345
  console.log(c.dim(' Para entrar com outra conta: ') + c.brand('/connect trocar'));
1346
+ // Sem isto, quem tinha sido barrado na abertura (plano velho,
1347
+ // login que não deu a tempo) e depois só confere com um
1348
+ // `/connect` continuava barrado: este comando não passava por
1349
+ // `entrar()`, e nada reabria o portão.
1350
+ sincronizarLiberacao(jaEsta);
1326
1351
  break;
1327
1352
  }
1328
1353
  if (rest === 'trocar') conta.sair();
@@ -1332,31 +1357,29 @@ async function handleSlash(text) {
1332
1357
  abrir: (u) => tools.openInBrowser(u),
1333
1358
  contar: (info) => {
1334
1359
  sp.stop();
1335
- const meio = info.codigo.length === 8
1336
- ? info.codigo.slice(0, 4) + '-' + info.codigo.slice(4) : info.codigo;
1360
+ /* O CÓDIGO NÃO APARECE MAIS NO TERMINAL.
1361
+ *
1362
+ * "Pode tirar essa parte no login onde aparece o código
1363
+ * — o terminal mandou o código, pode tirar."
1364
+ *
1365
+ * A página do token já resolve o pareamento sozinha: ela
1366
+ * pergunta o código ao 127.0.0.1 desta máquina, e onde o
1367
+ * navegador bloqueia isso (Safari) ela oferece "Colar" —
1368
+ * o código continua indo para a área de transferência,
1369
+ * que é o caminho sem leitura. Oito letras impressas aqui
1370
+ * eram uma tarefa para a pessoa que o produto já não
1371
+ * precisa, e a tela ficava dizendo que talvez precisasse.
1372
+ *
1373
+ * O código continua existindo no protocolo (lib/conta.js)
1374
+ * — some da TELA, não do pareamento. */
1337
1375
  console.log(c.muted(' Abrindo no navegador:'));
1338
1376
  console.log(' ' + c.brand(info.url.replace(/[?&]porta=\d+/, '')));
1339
1377
  console.log('');
1340
- if (info.porta) {
1341
- /* COM O SERVIDOR LOCAL DE PÉ, NÃO HÁ CÓDIGO PARA LER. A
1342
- página pergunta ao 127.0.0.1 desta máquina, recebe o
1343
- código e aprova sozinha assim que a pessoa entra com a
1344
- conta — "não precisa colocar código, não precisa pra
1345
- nada, porque ele já libera". Mostrar as oito letras
1346
- grandes aqui era pedir para ler o que ninguém precisa
1347
- mais; elas ficam numa linha apagada, só para o caso
1348
- de o navegador bloquear o 127.0.0.1 (Safari) e a
1349
- página voltar a pedir. */
1350
- console.log(' ' + c.white('Entre com a sua conta na página que abriu — o resto é automático.'));
1351
- console.log(c.dim(` Se a página pedir um código: ${meio}${info.copiado ? ' (já copiado)' : ''}.`));
1352
- } else {
1353
- /* Sem porta local (ocupadas, ou bloqueadas), o código
1354
- volta a ser o caminho — grande, partido em dois,
1355
- porque é o que se lê de uma tela e se confere noutra. */
1356
- console.log(' ' + c.bold(c.brand(meio.split('').join(' '))));
1357
- console.log('');
1358
- console.log(c.dim(' ' + (info.copiado ? 'O código já está copiado — cole na página.'
1359
- : 'Digite o código na página.')));
1378
+ console.log(' ' + c.white('Entre com a sua conta na página que abriu — o resto é automático.'));
1379
+ if (!info.porta && info.copiado) {
1380
+ // Sem a porta local, quem fecha o pareamento é a área de
1381
+ // transferência: a página pede um toque em "Colar".
1382
+ console.log(c.dim(' Se a página pedir para colar, é só colar — já está na sua área de transferência.'));
1360
1383
  }
1361
1384
  console.log(c.dim(' Esperando o navegador…'));
1362
1385
  },
@@ -1365,6 +1388,11 @@ async function handleSlash(text) {
1365
1388
  if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
1366
1389
  console.log(c.ok(' Conectado.')
1367
1390
  + c.muted(` Plano ${r.plano}${r.pro ? '' : ' — assine Premium no app para liberar tudo'}`));
1391
+ // O QUE FALTAVA: sem isto, "Conectado. Plano premium" na tela e o
1392
+ // PRÓXIMO pedido caindo em "O PrimoCode pede Premium ou Super" —
1393
+ // porque o portão (`state.liberado`) só era decidido na abertura,
1394
+ // e um /connect no meio da sessão nunca o reabria.
1395
+ sincronizarLiberacao(r);
1368
1396
  break;
1369
1397
  }
1370
1398
 
@@ -1422,6 +1450,10 @@ async function handleSlash(text) {
1422
1450
  conta.sair();
1423
1451
  console.log(c.ok(' Desconectado deste computador.')
1424
1452
  + c.dim(' A conta continua intacta; entre de novo com /connect.'));
1453
+ // O mesmo portão do connect: sem login não há como confirmar
1454
+ // Premium/Super, e deixar `state.liberado` de pé seria a mesma
1455
+ // dessincronia ao contrário — trabalhando sem estar conectado.
1456
+ sincronizarLiberacao({ pro: false, motivo: 'sem-login' });
1425
1457
  break;
1426
1458
  }
1427
1459
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primocode",
3
- "version": "8.42.0",
3
+ "version": "8.42.2",
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": {