primocode 8.42.1 → 9.0.0

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 (102) hide show
  1. package/README.md +41 -37
  2. package/bin/primocode.js +599 -327
  3. package/lib/acervo.js +8 -1
  4. package/lib/act.js +205 -114
  5. package/lib/api.js +35 -4
  6. package/lib/boas-vindas.js +31 -192
  7. package/lib/catalogo.js +60 -60
  8. package/lib/config.js +1 -1
  9. package/lib/conta.js +3 -24
  10. package/lib/diff.js +161 -0
  11. package/lib/diretor.js +37 -47
  12. package/lib/entrada.js +545 -0
  13. package/lib/especialistas.js +2 -2
  14. package/lib/estudio/assets.js +343 -0
  15. package/lib/estudio/identidade.js +560 -0
  16. package/lib/estudio/index.js +565 -0
  17. package/lib/estudio/plano.js +327 -0
  18. package/lib/estudio/projeto.js +246 -0
  19. package/lib/estudio/remotion.js +606 -0
  20. package/lib/estudio/slides.js +190 -0
  21. package/lib/estudio/video.js +296 -0
  22. package/lib/fala.js +13 -1
  23. package/lib/marca.js +4 -1
  24. package/lib/marketplace.js +189 -0
  25. package/lib/permissao.js +137 -0
  26. package/lib/registro.js +229 -0
  27. package/lib/skills.js +329 -0
  28. package/lib/tools.js +51 -181
  29. package/lib/ui.js +7 -3
  30. package/lib/voz.js +239 -0
  31. package/package.json +12 -3
  32. package/skills/acessibilidade/SKILL.md +28 -0
  33. package/skills/api-que-nao-quebra/SKILL.md +27 -0
  34. package/skills/depurar-de-verdade/SKILL.md +29 -0
  35. package/skills/editar-meu-video/SKILL.md +59 -0
  36. package/skills/escrever-em-portugues/SKILL.md +28 -0
  37. package/skills/git-limpo/SKILL.md +28 -0
  38. package/skills/motion-de-primeira/SKILL.md +62 -0
  39. package/skills/pagina-que-converte/SKILL.md +28 -0
  40. package/skills/performance-web/SKILL.md +28 -0
  41. package/skills/revisao-antes-de-entregar/SKILL.md +27 -0
  42. package/skills/slides-que-prendem/SKILL.md +40 -0
  43. package/studio/edge.py +16 -66
  44. package/studio/narrar.py +274 -0
  45. package/studio/pessoa.py +167 -0
  46. package/voz/primo_voz/__init__.py +0 -0
  47. package/voz/primo_voz/__main__.py +325 -0
  48. package/voz/primo_voz/escuta.py +235 -0
  49. package/voz/primo_voz/orbe.py +216 -0
  50. package/lib/audio-livre.js +0 -177
  51. package/lib/chaves.js +0 -149
  52. package/lib/claude-engine.js +0 -631
  53. package/lib/codex-engine.js +0 -208
  54. package/lib/remotion.js +0 -663
  55. package/lib/studio.js +0 -960
  56. package/studio/PRIMOCODE.md +0 -58
  57. package/studio/README.md +0 -154
  58. package/studio/__pycache__/edge.cpython-311.pyc +0 -0
  59. package/studio/__pycache__/elevenlabs.cpython-311.pyc +0 -0
  60. package/studio/__pycache__/voz.cpython-311.pyc +0 -0
  61. package/studio/arquivos/corte-teste-de-camera-fb823.json +0 -57
  62. package/studio/ferramentas/00-protocolo.md +0 -125
  63. package/studio/ferramentas/01-modelos.md +0 -270
  64. package/studio/ferramentas/README.md +0 -32
  65. package/studio/ferramentas/corte.md +0 -919
  66. package/studio/ferramentas/grade.md +0 -92
  67. package/studio/ferramentas/prisma.md +0 -107
  68. package/studio/ferramentas/prosa.md +0 -86
  69. package/studio/ferramentas/tela.md +0 -93
  70. package/studio/ferramentas/traco.md +0 -79
  71. package/studio/server.py +0 -2254
  72. package/studio/studio.log +0 -57
  73. package/studio/voz.py +0 -388
  74. package/studio/web/analise.html +0 -52
  75. package/studio/web/core.css +0 -1167
  76. package/studio/web/fontes/bebas.woff2 +0 -0
  77. package/studio/web/fontes/grotesk-700.woff2 +0 -0
  78. package/studio/web/fontes/inter-400.woff2 +0 -0
  79. package/studio/web/fontes/inter-700.woff2 +0 -0
  80. package/studio/web/fontes/jetbrains-400.woff2 +0 -0
  81. package/studio/web/fontes/playfair-700.woff2 +0 -0
  82. package/studio/web/fontes.css +0 -23
  83. package/studio/web/home.html +0 -217
  84. package/studio/web/js/analise.js +0 -510
  85. package/studio/web/js/audio.js +0 -607
  86. package/studio/web/js/editor.js +0 -1802
  87. package/studio/web/js/exportar.js +0 -222
  88. package/studio/web/js/ferramentas.js +0 -108
  89. package/studio/web/js/icones.js +0 -120
  90. package/studio/web/js/midia.js +0 -157
  91. package/studio/web/js/narracao.js +0 -325
  92. package/studio/web/js/player.js +0 -903
  93. package/studio/web/js/render-grade.js +0 -243
  94. package/studio/web/js/render-prosa.js +0 -104
  95. package/studio/web/js/render.js +0 -1852
  96. package/studio/web/js/sfx.js +0 -233
  97. package/studio/web/js/video.js +0 -464
  98. package/studio/web/js/voz-neural.js +0 -152
  99. package/studio/web/render.css +0 -1352
  100. package/studio/web/tf.html +0 -15
  101. package/studio/web/tool.html +0 -78
  102. package/studio/web/view.html +0 -27
@@ -1,208 +0,0 @@
1
- /**
2
- * codex-engine.js — motor do agente rodando no Codex da SUA conta.
3
- *
4
- * "Você pode usar a barra codex para usar os modelos com a sua conta. No
5
- * Claude ele usa o modelo Opus 5; no Codex ele vai usar o modelo baratinho
6
- * ali."
7
- *
8
- * ── É UM MOTOR NOVO, NÃO UM PROTOCOLO NOVO ───────────────────────────────
9
- * O que ensina um modelo de fora a ser cérebro do PrimoCode — o texto do
10
- * protocolo, a leitura do bloco marcado, a volta para consertar o que veio
11
- * torto — mora inteiro no claude-engine.js e é IMPORTADO daqui. Copiar
12
- * aquilo para cá daria dois protocolos, e o segundo começaria a divergir do
13
- * primeiro na primeira correção feita só de um lado — sem erro nenhum
14
- * aparecendo, só um dos motores ficando pior que o outro com o tempo.
15
- *
16
- * O que muda de verdade entre os dois é uma coisa só: qual programa se chama
17
- * e com quais argumentos. É isso, e só isso, que este arquivo tem.
18
- *
19
- * ── POR QUE LER A SAÍDA COMO TEXTO CRU ───────────────────────────────────
20
- * O `claude -p` tem `--output-format json` e o formato é estável. O `codex`
21
- * mudou de forma mais de uma vez, e amarrar-se ao JSON dele seria escolher
22
- * quebrar no dia em que ele mudar de novo — calado, porque a saída
23
- * continuaria vindo, só que com outras chaves.
24
- *
25
- * Então aqui se lê o texto e se procura o bloco marcado nele, que é o que o
26
- * `extrairDecisao` já faz: ele varre ruído de terminal e fica com o último
27
- * bloco legível. Enquanto o Codex escrever o bloco em algum lugar da saída,
28
- * este motor funciona — independente de como ele embrulhe o resto.
29
- */
30
-
31
- 'use strict';
32
-
33
- const { execSync, execFileSync } = require('child_process');
34
-
35
- /* O MOTOR EXTERNO NÃO APARECE — a mesma regra do claude-engine, e o mesmo
36
- comentário longo mora lá. Em resumo: `execFileSync` sem `stdio` HERDA o
37
- stderr, e um aviso do Codex cairia no meio da tela do PrimoCode com a cara de
38
- outro produto. Capturado, ele some da tela e `e.stderr` passa a existir — o
39
- `catch` daqui já lia esse campo e estava lendo `null` desde sempre. */
40
- const SEM_APARECER = { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true };
41
-
42
- const claude = require('./claude-engine');
43
- const chaves = require('./chaves');
44
-
45
- /**
46
- * O modelo barato do Codex.
47
- *
48
- * O /claude vai no Opus porque ali o que se quer é a decisão mais certa. Aqui
49
- * o pedido foi o contrário — "o modelo baratinho" — e faz sentido: quem liga
50
- * o /codex está usando a franquia da própria conta, e o motor do PrimoCode dá
51
- * muitas voltas por tarefa.
52
- *
53
- * Vazio manda sem `--model`, e vale o padrão da conta. E se o Codex recusar
54
- * este modelo, o motor tenta de novo SEM ele em vez de morrer — ver
55
- * `chamarCodex`.
56
- */
57
- const MODELO_CODEX = process.env.PRIMOCODE_CODEX_MODELO !== undefined
58
- ? process.env.PRIMOCODE_CODEX_MODELO
59
- : 'gpt-5-mini';
60
-
61
- /** O programa. Trocável para o teste pôr um de mentira no lugar. */
62
- const CODEX = process.env.PRIMOCODE_CODEX_BIN || 'codex';
63
-
64
- const TEMPO = 180000;
65
- const BUFFER = 32 * 1024 * 1024;
66
-
67
- function temCodex(executor = (cmd) => execSync(cmd, { stdio: ['ignore', 'pipe', 'ignore'] })) {
68
- try { executor(`${CODEX} --version`); return true; }
69
- catch { return false; }
70
- }
71
-
72
- /**
73
- * O que o `codex exec` desta máquina aceita.
74
- *
75
- * Passar uma opção que a versão instalada não conhece não dá "opção
76
- * desconhecida" e pronto: dá uma saída de ajuda no lugar da resposta, e o
77
- * motor devolveria "não consegui ler a decisão" em toda rodada — com a
78
- * pessoa sem nenhuma pista de que o problema é uma flag.
79
- *
80
- * Perguntar ao `--help` custa uma chamada por sessão e responde com o que
81
- * ESTA versão faz, em vez do que a versão de hoje fazia quando isto foi
82
- * escrito.
83
- */
84
- let _ajuda = null;
85
- function ajudaDoExec(executor) {
86
- if (_ajuda !== null) return _ajuda;
87
- const rodar = executor || ((args) => execFileSync(CODEX, args,
88
- { encoding: 'utf-8', timeout: 20000, ...SEM_APARECER }));
89
- try { _ajuda = String(rodar(['exec', '--help']) || ''); }
90
- catch { _ajuda = ''; } // sem ajuda: segue com o mínimo
91
- return _ajuda;
92
- }
93
-
94
- function esquecerAjuda() { _ajuda = null; }
95
-
96
- /**
97
- * Os argumentos da chamada.
98
- *
99
- * `--skip-git-repo-check` só entra se esta versão o conhecer: sem ele, o
100
- * Codex se recusa a rodar fora de um repositório git — e o PrimoCode trabalha
101
- * em pasta comum o tempo todo.
102
- */
103
- function argsDoExec({ comModelo = true, ajuda = null } = {}) {
104
- const h = ajuda === null ? ajudaDoExec() : ajuda;
105
- const args = ['exec'];
106
- if (h.includes('--skip-git-repo-check')) args.push('--skip-git-repo-check');
107
- // O Codex pede confirmação para agir na máquina. Aqui ele não age: o
108
- // protocolo proíbe ferramenta nativa, quem executa é o PrimoCode. A opção
109
- // só evita que ele pare esperando uma resposta que ninguém vai dar.
110
- if (h.includes('--dangerously-bypass-approvals-and-sandbox')) {
111
- args.push('--dangerously-bypass-approvals-and-sandbox');
112
- } else if (h.includes('--full-auto')) {
113
- args.push('--full-auto');
114
- }
115
- if (comModelo && MODELO_CODEX) args.push('--model', MODELO_CODEX);
116
- // O prompt vai por STDIN: por argumento ele teria limite de tamanho (a
117
- // conversa cresce) e qualquer texto começando com traço seria lido como
118
- // opção. `-` é como o exec pede para ler da entrada.
119
- args.push('-');
120
- return args;
121
- }
122
-
123
- /** Um modelo que a conta não tem é o erro mais provável desta chamada — e o
124
- * único que dá para consertar sozinho. */
125
- function recusouOModelo(texto) {
126
- return /model|modelo/i.test(texto)
127
- && /not (found|available|supported)|unknown|invalid|does not|inexistente|inválid/i.test(texto);
128
- }
129
-
130
- /**
131
- * Chama o Codex e devolve o texto. Se ele recusar o modelo, tenta UMA vez sem
132
- * `--model` e avisa — cair para o padrão da conta é melhor que a tarefa
133
- * morrer por causa de um nome que mudou de catálogo.
134
- */
135
- function chamarCodex(prompt, { executor, avisar = () => {} } = {}) {
136
- // A chave própria da pessoa, quando ela configurou uma. Sem configuração
137
- // o ambiente vai INTACTO — passar a variável vazia apagaria a chave que
138
- // ela já tem exportada no shell, e o Codex pararia de funcionar por ter
139
- // sido "configurado".
140
- const rodar = executor || ((args, entrada) => execFileSync(CODEX, args, {
141
- encoding: 'utf-8', timeout: TEMPO, input: entrada, maxBuffer: BUFFER,
142
- env: chaves.ambienteDe('codex'), ...SEM_APARECER,
143
- }));
144
- try {
145
- return rodar(argsDoExec(), prompt);
146
- } catch (e) {
147
- const detalhe = `${e.message || ''}\n${(e.stderr || '')}\n${(e.stdout || '')}`;
148
- if (MODELO_CODEX && recusouOModelo(detalhe)) {
149
- avisar(`o Codex não aceitou o modelo ${MODELO_CODEX} — indo com o padrão da sua conta`);
150
- return rodar(argsDoExec({ comModelo: false }), prompt);
151
- }
152
- throw new Error(primeiraLinhaUtil(detalhe) || e.message);
153
- }
154
- }
155
-
156
- /** A primeira linha que diz alguma coisa. O erro do Codex costuma vir com
157
- * banner, versão e caminho antes do motivo, e jogar tudo isso na tela é
158
- * esconder o motivo no meio. */
159
- function primeiraLinhaUtil(texto) {
160
- for (const linha of String(texto || '').split('\n')) {
161
- const l = linha.trim();
162
- if (l && !/^(Command failed|codex\b|\s*$)/i.test(l)) return l.slice(0, 300);
163
- }
164
- return '';
165
- }
166
-
167
- function garantirEngine() {
168
- if (!temCodex()) {
169
- return {
170
- ok: false,
171
- error: 'O Codex não está instalado nesta máquina.',
172
- comoResolver: 'Instale o Codex CLI da OpenAI, entre na sua conta com `codex login`, '
173
- + 'e rode /codex de novo.',
174
- };
175
- }
176
- return { ok: true, modelo: MODELO_CODEX || '(o padrão da sua conta)' };
177
- }
178
-
179
- /** Mesma forma de api.requestAct(server, payload, onEvent) — é isso que deixa
180
- * o lib/act.js trocar de motor sem saber de nada disto. */
181
- async function requestAct(server, payload, onEvent) {
182
- try {
183
- const pronto = garantirEngine();
184
- if (!pronto.ok) {
185
- onEvent({ erro: `${pronto.error} ${pronto.comoResolver || ''}`.trim() });
186
- return;
187
- }
188
- const prompt = claude.promptDoProtocolo(payload);
189
- const saida = chamarCodex(prompt, { avisar: (m) => onEvent({ aviso: m }) });
190
-
191
- // A correção é uma segunda ida ao motor, com o mesmo protocolo e o
192
- // diagnóstico do que saiu errado. Barata, e evita que um erro de forma
193
- // do motor vire erro na cara de quem pediu a tarefa.
194
- const pedirCorrecao = (aviso) => chamarCodex(claude.promptDeCorrecao(aviso));
195
-
196
- await claude.emitirDecisao(saida, onEvent, pedirCorrecao, 0,
197
- claude.nomesDasTools(payload));
198
- } catch (e) {
199
- onEvent({ erro: e.message });
200
- }
201
- }
202
-
203
- module.exports = {
204
- MODELO_CODEX, CODEX,
205
- temCodex, garantirEngine, requestAct,
206
- argsDoExec, ajudaDoExec, esquecerAjuda,
207
- chamarCodex, recusouOModelo, primeiraLinhaUtil,
208
- };