auroq-os 2.4.19 → 2.4.20
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/.auroq-core/core-config.yaml +1 -1
- package/CHANGELOG.md +15 -0
- package/bin/auroq-os.js +40 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.4.20] — 2026-09-04
|
|
4
|
+
|
|
5
|
+
### Dentro do Codex no Windows: "UNABLE_TO_VERIFY_LEAF_SIGNATURE" (EMB-028, causa vista na tela)
|
|
6
|
+
Com o motivo tecnico na mensagem (0.4.1), a aluna mostrou: dentro do Codex a conexao com o
|
|
7
|
+
servidor cai porque o Node nao confia no certificado que chega — algo entre o Codex e a internet
|
|
8
|
+
(antivirus, proxy ou o sandbox do Codex) reassina a conexao com um certificado que o Windows
|
|
9
|
+
conhece e o Node, por padrao, nao. No terminal funciona porque o ambiente carrega a confianca;
|
|
10
|
+
o Codex abre o MCP com ambiente minimo (openai/codex#29124).
|
|
11
|
+
- **`arcane-mcp@0.4.2`** (pin novo) confia tambem nos certificados do sistema, sem flag.
|
|
12
|
+
- **Registro do Codex** no Windows ganha `NODE_USE_SYSTEM_CA = '1'` e repassa, se existirem,
|
|
13
|
+
`NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE`, `SSL_CERT_DIR`, `NODE_OPTIONS`, `HTTPS_PROXY`,
|
|
14
|
+
`HTTP_PROXY`, `NO_PROXY`.
|
|
15
|
+
- **`doctor`** fecha o relatorio pedindo ao proprio Codex do aluno pra chamar o conteudo ao vivo
|
|
16
|
+
e imprime a resposta — o teste definitivo, na mesma tela.
|
|
17
|
+
|
|
3
18
|
## [2.4.19] — 2026-09-04
|
|
4
19
|
|
|
5
20
|
### O npx guarda cache por ambiente — o Codex abria "a frio" mesmo depois de aquecido
|
package/bin/auroq-os.js
CHANGED
|
@@ -426,7 +426,16 @@ async function runDoctor(targetDir) {
|
|
|
426
426
|
log(` ${DIM}Ultimas linhas do log do Codex sobre o arcane:${RESET}`);
|
|
427
427
|
for (const l of rastro) log(` ${DIM} ${l}${RESET}`);
|
|
428
428
|
}
|
|
429
|
-
|
|
429
|
+
let codexFalhou = false;
|
|
430
|
+
if (vCodex) {
|
|
431
|
+
log(` ${DIM}Pedindo ao proprio Codex pra chamar o conteudo ao vivo (pode levar 1-2 min)...${RESET}`);
|
|
432
|
+
const linhas = rodarNoCodex(targetDir);
|
|
433
|
+
const texto = linhas.join('\n');
|
|
434
|
+
codexFalhou = !/versao|catalogo_listar \(completed\)/i.test(texto) || /motivo t[eé]cnico|indispon[ií]vel|failed|timed out/i.test(texto);
|
|
435
|
+
(codexFalhou ? error : success)(codexFalhou ? 'Codex de verdade: NAO conseguiu usar o conteudo ao vivo' : 'Codex de verdade: usou o conteudo ao vivo');
|
|
436
|
+
for (const l of linhas) log(` ${DIM} ${l}${RESET}`);
|
|
437
|
+
}
|
|
438
|
+
if (r.subiu === null || !r.temForja || !r.chamada || r.chamada.erro || codexFalhou) {
|
|
430
439
|
problemas.push('Mande o print desta tela INTEIRA pro suporte (11 93621-4486) — ela ja traz tudo que precisamos.');
|
|
431
440
|
}
|
|
432
441
|
}
|
|
@@ -450,7 +459,7 @@ async function runDoctor(targetDir) {
|
|
|
450
459
|
// (rede domestica + antivirus) a aluna viu timeout em todas as que fez. Por isso:
|
|
451
460
|
// (1) o registro do Codex pede mais tempo, (2) instalacao/atualizacao ja baixam o
|
|
452
461
|
// pacote, (3) o doctor mede o arranque de verdade em vez de so olhar o registro.
|
|
453
|
-
const ARCANE_MCP_PIN = 'arcane-mcp@0.4.
|
|
462
|
+
const ARCANE_MCP_PIN = 'arcane-mcp@0.4.2';
|
|
454
463
|
const CODEX_MCP_STARTUP_SEC = 120;
|
|
455
464
|
const CODEX_ENV_MINIMO = ['PATH', 'PATHEXT', 'USERNAME', 'USERDOMAIN', 'USERPROFILE', 'TEMP', 'TMP',
|
|
456
465
|
'HOME', 'LOGNAME', 'SHELL', 'TERM', 'USER'];
|
|
@@ -464,7 +473,13 @@ const MCP_ARRANQUE_LIMITE_MS = 9000; // abaixo do que o Codex tolera (10s)
|
|
|
464
473
|
const CODEX_ENV_WINDOWS = [
|
|
465
474
|
'SystemRoot', 'windir', 'COMSPEC', 'SystemDrive', 'APPDATA', 'LOCALAPPDATA',
|
|
466
475
|
'ProgramData', 'ProgramFiles', 'HOMEDRIVE', 'HOMEPATH', 'USERPROFILE', 'TEMP', 'TMP',
|
|
476
|
+
// Confianca e proxy que o terminal do aluno tem e o Codex tira do MCP (openai/codex#29124).
|
|
477
|
+
'NODE_EXTRA_CA_CERTS', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'NODE_OPTIONS',
|
|
478
|
+
'HTTPS_PROXY', 'HTTP_PROXY', 'NO_PROXY',
|
|
467
479
|
];
|
|
480
|
+
// Dentro do Codex no Windows a conexao caia com UNABLE_TO_VERIFY_LEAF_SIGNATURE (04/09):
|
|
481
|
+
// o Node por padrao ignora a loja de certificados do Windows. Node >= 22.15 aceita isto.
|
|
482
|
+
const CODEX_ENV_FIXO_WINDOWS = { NODE_USE_SYSTEM_CA: '1' };
|
|
468
483
|
|
|
469
484
|
function envCodexArcane({ plataforma = process.platform, env = process.env } = {}) {
|
|
470
485
|
if (plataforma !== 'win32') return null;
|
|
@@ -475,6 +490,7 @@ function envCodexArcane({ plataforma = process.platform, env = process.env } = {
|
|
|
475
490
|
if (!valor || valor.includes("'") || /[\r\n]/.test(valor)) continue;
|
|
476
491
|
pares.push(`${nome} = '${valor}'`); // string literal do TOML: barra invertida sem escape
|
|
477
492
|
}
|
|
493
|
+
for (const [nome, valor] of Object.entries(CODEX_ENV_FIXO_WINDOWS)) pares.push(`${nome} = '${valor}'`);
|
|
478
494
|
return pares.length ? `env = { ${pares.join(', ')} }` : null;
|
|
479
495
|
}
|
|
480
496
|
|
|
@@ -492,7 +508,7 @@ function blocoCodexArcane(pin, opcoes) {
|
|
|
492
508
|
}
|
|
493
509
|
|
|
494
510
|
// Baixa o pacote do conteudo ao vivo com o MESMO nome que o registro usa (o cache do
|
|
495
|
-
// npx e por nome+versao: `arcane-mcp` e `arcane-mcp@0.4.
|
|
511
|
+
// npx e por nome+versao: `arcane-mcp` e `arcane-mcp@0.4.2` sao caches diferentes).
|
|
496
512
|
// `npx` no Windows e um .cmd: sem shell o Node recusa (EINVAL) e com `shell: true` o Node 24
|
|
497
513
|
// imprime um DeprecationWarning na tela do aluno (DEP0190). Chamar o cmd.exe direto, sem shell.
|
|
498
514
|
function comandoNpx(args) {
|
|
@@ -517,6 +533,7 @@ function envComoCodex({ plataforma = process.platform, env = process.env } = {})
|
|
|
517
533
|
const chave = Object.keys(env).find(k => k.toLowerCase() === nome.toLowerCase());
|
|
518
534
|
if (chave && env[chave]) base[nome] = env[chave];
|
|
519
535
|
}
|
|
536
|
+
Object.assign(base, CODEX_ENV_FIXO_WINDOWS);
|
|
520
537
|
}
|
|
521
538
|
return base;
|
|
522
539
|
}
|
|
@@ -730,6 +747,26 @@ async function rastroDoCodex(limite = 8) {
|
|
|
730
747
|
}
|
|
731
748
|
}
|
|
732
749
|
|
|
750
|
+
|
|
751
|
+
// O teste definitivo: o proprio Codex do aluno chamando a ferramenta. E o unico jeito de
|
|
752
|
+
// ver o que o Codex faz com o MCP (sandbox, proxy, certificado) sem pedir print atras de print.
|
|
753
|
+
function rodarNoCodex(pasta) {
|
|
754
|
+
const prompt = 'Chame a ferramenta MCP catalogo_listar do servidor arcane e responda SOMENTE com a primeira linha do resultado, ou com a mensagem de erro exata que a ferramenta devolveu.';
|
|
755
|
+
const args = ['exec', '--skip-git-repo-check', '-C', pasta, prompt];
|
|
756
|
+
const c = process.platform === 'win32'
|
|
757
|
+
? { cmd: process.env.ComSpec || 'cmd.exe', args: ['/d', '/s', '/c', `codex exec --skip-git-repo-check -C "${pasta}" "${prompt}"`], opts: { windowsVerbatimArguments: true } }
|
|
758
|
+
: { cmd: 'codex', args, opts: {} };
|
|
759
|
+
let saida = '';
|
|
760
|
+
try {
|
|
761
|
+
saida = execFileSync(c.cmd, c.args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 300000, ...c.opts });
|
|
762
|
+
} catch (e) {
|
|
763
|
+
saida = `${e.stdout || ''}\n${e.stderr || ''}\n[codex saiu com ${e.status ?? e.code ?? 'erro'}]`;
|
|
764
|
+
}
|
|
765
|
+
return saida.split('\n').map(l => l.replace(/\u001b\[[0-9;]*m/g, '').trim())
|
|
766
|
+
.filter(l => l && !/^hook:|^warning: Skill|usage limit|^Tip:|^tokens used|^[0-9.]+$/i.test(l))
|
|
767
|
+
.slice(-8).map(l => l.slice(0, 220));
|
|
768
|
+
}
|
|
769
|
+
|
|
733
770
|
async function writeArcaneMcpConfig(targetDir) {
|
|
734
771
|
const pin = ARCANE_MCP_PIN;
|
|
735
772
|
const mcpPath = path.join(targetDir, '.mcp.json');
|