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,243 +0,0 @@
1
- /* ==========================================================================
2
- render-grade.js — desenha uma PLANILHA (ferramenta Grade) e resolve fórmulas.
3
- doc = { tema, abas: [ {nome, colunas, linhas, formatos?, totais?, regras?} ] }
4
- Fórmulas na célula: "=SOMA(A1:A9)", "=B2*1.2", "=MEDIA(C1:C4)"
5
- ========================================================================== */
6
-
7
- function _soma(v) { return v.reduce(function (s, x) { return s + x; }, 0); }
8
-
9
- var FUNCOES = {
10
- SOMA: _soma,
11
- MEDIA: function (v) { return v.length ? _soma(v) / v.length : 0; },
12
- MIN: function (v) { return v.length ? Math.min.apply(null, v) : 0; },
13
- MAX: function (v) { return v.length ? Math.max.apply(null, v) : 0; },
14
- CONT: function (v) { return v.length; },
15
- ARRED: function (v) { return v.length > 1 ? +(v[0]).toFixed(v[1]) : Math.round(v[0] || 0); },
16
- ABS: function (v) { return Math.abs(v[0] || 0); },
17
- RAIZ: function (v) { return Math.sqrt(Math.abs(v[0] || 0)); },
18
- POT: function (v) { return Math.pow(v[0] || 0, v[1] || 2); },
19
- TETO: function (v) { return Math.ceil(v[0] || 0); },
20
- PISO: function (v) { return Math.floor(v[0] || 0); },
21
- MEDIANA: function (v) {
22
- if (!v.length) return 0;
23
- var o = v.slice().sort(function (a, b) { return a - b; });
24
- var m = Math.floor(o.length / 2);
25
- return o.length % 2 ? o[m] : (o[m - 1] + o[m]) / 2;
26
- },
27
- MAIOR: function (v) {
28
- var k = v.pop();
29
- return v.sort(function (a, b) { return b - a; })[Math.max(0, (k || 1) - 1)] || 0;
30
- },
31
- MENOR: function (v) {
32
- var k = v.pop();
33
- return v.sort(function (a, b) { return a - b; })[Math.max(0, (k || 1) - 1)] || 0;
34
- },
35
- SE: function (v) { return v[0] ? (v[1] != null ? v[1] : 1) : (v[2] != null ? v[2] : 0); },
36
- };
37
-
38
- /* Compara valores de uma faixa com um critério tipo ">100" ou "<>0". */
39
- function _criterio(texto) {
40
- var m = String(texto).trim().replace(/^["']|["']$/g, "").match(/^(<=|>=|<>|!=|<|>|=)?\s*(-?[\d.,]+)$/);
41
- if (!m) return function () { return false; };
42
- var op = m[1] || "=", alvo = parseFloat(m[2].replace(",", "."));
43
- return function (x) {
44
- switch (op) {
45
- case ">": return x > alvo;
46
- case "<": return x < alvo;
47
- case ">=": return x >= alvo;
48
- case "<=": return x <= alvo;
49
- case "<>": case "!=": return x !== alvo;
50
- default: return x === alvo;
51
- }
52
- };
53
- }
54
-
55
- function _colParaIndice(letras) {
56
- var n = 0;
57
- for (var i = 0; i < letras.length; i++) n = n * 26 + (letras.charCodeAt(i) - 64);
58
- return n - 1;
59
- }
60
-
61
- function _numero(v) {
62
- if (typeof v === "number") return v;
63
- if (v == null || v === "") return 0;
64
- var s = String(v).replace(/[R$\s%.]/g, "").replace(",", ".");
65
- var n = parseFloat(s);
66
- return isNaN(n) ? 0 : n;
67
- }
68
-
69
- /* Resolve todas as fórmulas de uma aba. Retorna matriz de valores calculados. */
70
- function calcular(aba) {
71
- var linhas = (aba.linhas || []).map(function (l) { return l.slice(); });
72
- var cache = {};
73
-
74
- function valorCelula(col, lin, profundidade) {
75
- var chave = col + ":" + lin;
76
- if (cache[chave] !== undefined) return cache[chave];
77
- if (profundidade > 24) return 0;
78
- var bruto = (linhas[lin] || [])[col];
79
- var v;
80
- if (typeof bruto === "string" && bruto.charAt(0) === "=") {
81
- v = avaliar(bruto.slice(1), profundidade + 1);
82
- } else {
83
- v = bruto;
84
- }
85
- cache[chave] = v;
86
- return v;
87
- }
88
-
89
- function faixa(ref, profundidade) {
90
- var m = ref.match(/^([A-Z]+)(\d+):([A-Z]+)(\d+)$/);
91
- if (!m) return [];
92
- var c1 = _colParaIndice(m[1]), l1 = +m[2] - 1;
93
- var c2 = _colParaIndice(m[3]), l2 = +m[4] - 1;
94
- var fora = [];
95
- for (var l = Math.min(l1, l2); l <= Math.max(l1, l2); l++) {
96
- for (var c = Math.min(c1, c2); c <= Math.max(c1, c2); c++) {
97
- fora.push(_numero(valorCelula(c, l, profundidade)));
98
- }
99
- }
100
- return fora;
101
- }
102
-
103
- function avaliar(expr, profundidade) {
104
- var e = expr;
105
-
106
- // funções: NOME(faixa ou lista)
107
- // repete até esgotar: resolve de dentro para fora em fórmula aninhada
108
- var voltas = 0;
109
- while (/[A-ZÇ]+\(/.test(e) && voltas++ < 12) {
110
- e = umaVolta(e);
111
- }
112
-
113
- function umaVolta(expr) {
114
- return expr.replace(/([A-ZÇ]+)\(([^()]*)\)/g, function (_, nome, args) {
115
- var partes = args.split(";").map(function (p) { return p.trim(); });
116
-
117
- // SOMASE(faixa; critério) e CONTSE(faixa; critério)
118
- if (nome === "SOMASE" || nome === "CONTSE") {
119
- var vals0 = /^[A-Z]+\d+:[A-Z]+\d+$/.test(partes[0]) ? faixa(partes[0], profundidade) : [];
120
- var testa = _criterio(partes[1] || "");
121
- var passou = vals0.filter(testa);
122
- return String(nome === "SOMASE" ? _soma(passou) : passou.length);
123
- }
124
-
125
- var fn = FUNCOES[nome];
126
- if (!fn) return "0";
127
- var vals = [];
128
- partes.forEach(function (parte) {
129
- if (/^[A-Z]+\d+:[A-Z]+\d+$/.test(parte)) vals = vals.concat(faixa(parte, profundidade));
130
- // qualquer outro argumento é uma expressão: resolve antes de somar
131
- else if (parte !== "") vals.push(_numero(avaliar(parte, profundidade)));
132
- });
133
- return String(fn(vals));
134
- });
135
- }
136
-
137
- // referências soltas: A1
138
- e = e.replace(/\b([A-Z]+)(\d+)\b/g, function (todo) {
139
- return String(_numero(refCelula(todo, profundidade)));
140
- });
141
-
142
- // comparações são permitidas para o SE funcionar
143
- if (!/^[-+*/().\d\s,<>=!]*$/.test(e)) return "#ERRO";
144
- try {
145
- var pronto = e.replace(/,/g, ".")
146
- .replace(/<>/g, "!==")
147
- .replace(/([^<>!=])=(?!=)/g, "$1===") || "0";
148
- var r = Function('"use strict";return (' + pronto + ")")();
149
- if (typeof r === "boolean") return r ? 1 : 0;
150
- return typeof r === "number" && isFinite(r) ? r : "#ERRO";
151
- } catch (_) {
152
- return "#ERRO";
153
- }
154
- }
155
-
156
- function refCelula(ref, profundidade) {
157
- var m = ref.match(/^([A-Z]+)(\d+)$/);
158
- if (!m) return 0;
159
- return valorCelula(_colParaIndice(m[1]), +m[2] - 1, profundidade);
160
- }
161
-
162
- return linhas.map(function (linha, li) {
163
- return linha.map(function (_, ci) { return valorCelula(ci, li, 0); });
164
- });
165
- }
166
-
167
- function formatar(valor, formato) {
168
- if (valor == null || valor === "") return "";
169
- if (!formato) return String(valor);
170
- var n = _numero(valor);
171
- if (formato === "moeda") return "R$ " + n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
172
- if (formato === "percentual") return n.toLocaleString("pt-BR", { maximumFractionDigits: 1 }) + "%";
173
- if (formato === "inteiro") return Math.round(n).toLocaleString("pt-BR");
174
- if (formato === "decimal") return n.toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
175
- return String(valor);
176
- }
177
-
178
- function renderGrade(doc, op) {
179
- op = op || {};
180
- var aba = (doc.abas || [])[op.aba || 0] || { colunas: [], linhas: [] };
181
- var calculadas = calcular(aba);
182
- var formatos = aba.formatos || {};
183
- var regras = aba.regras || [];
184
-
185
- var no = document.createElement("div");
186
- no.className = "planilha";
187
- no.setAttribute("data-tema", doc.tema || "claro");
188
-
189
- var colunas = aba.colunas || [];
190
- var h = ["<table><thead><tr><th></th>"];
191
- colunas.forEach(function (c, i) {
192
- h.push("<th>" + String.fromCharCode(65 + i) + " · " + _pFugir(c) + "</th>");
193
- });
194
- h.push("</tr></thead><tbody>");
195
-
196
- (aba.linhas || []).forEach(function (linha, li) {
197
- h.push("<tr><th>" + (li + 1) + "</th>");
198
- colunas.forEach(function (nomeCol, ci) {
199
- var calc = (calculadas[li] || [])[ci];
200
- var bruto = linha[ci];
201
- var fmt = formatos[nomeCol] || formatos[String.fromCharCode(65 + ci)];
202
- var ehNum = typeof calc === "number" || (fmt && fmt !== "texto");
203
- var cls = [];
204
- if (ehNum) cls.push("num");
205
- if (typeof bruto === "string" && bruto.charAt(0) === "=") cls.push("total");
206
-
207
- regras.forEach(function (r) {
208
- if (r.coluna !== nomeCol) return;
209
- var v = _numero(calc);
210
- if (r.acima != null && v > r.acima) cls.push("alto");
211
- if (r.abaixo != null && v < r.abaixo) cls.push("baixo");
212
- });
213
-
214
- h.push('<td class="' + cls.join(" ") + '" data-l="' + li + '" data-c="' + ci + '">' +
215
- _pFugir(formatar(calc, fmt)) + "</td>");
216
- });
217
- h.push("</tr>");
218
- });
219
-
220
- h.push("</tbody></table>");
221
- no.innerHTML = h.join("");
222
-
223
- if (aba.grafico) {
224
- var dados = (aba.linhas || []).map(function (l, li) {
225
- var ci = colunas.indexOf(aba.grafico.valor);
226
- var ri = colunas.indexOf(aba.grafico.rotulo);
227
- return [l[ri >= 0 ? ri : 0], _numero((calculadas[li] || [])[ci >= 0 ? ci : 1])];
228
- }).filter(function (d) { return d[0] != null && String(d[0]).charAt(0) !== "="; });
229
-
230
- var cx = document.createElement("div");
231
- cx.className = "cena";
232
- cx.setAttribute("data-tema", doc.tema || "claro");
233
- cx.style.cssText = "width:100%;height:340px;margin-top:18px;border-radius:12px;padding:10px";
234
- cx.innerHTML = svgGrafico({ grafico: aba.grafico.tipo || "barras", dados: dados }, 900, 320);
235
- no.appendChild(cx);
236
- }
237
-
238
- return no;
239
- }
240
-
241
- if (typeof module !== "undefined" && module.exports) {
242
- module.exports = { renderGrade: renderGrade, calcular: calcular, formatar: formatar };
243
- }
@@ -1,104 +0,0 @@
1
- /* ==========================================================================
2
- render-prosa.js — desenha um DOCUMENTO (ferramenta Prosa).
3
- doc = { tema, capa?, blocos: [ {tipo, ...} ] }
4
- ========================================================================== */
5
-
6
- function _pFugir(s) {
7
- return String(s == null ? "" : s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
8
- }
9
-
10
- function _pRico(s) {
11
- return _pFugir(s)
12
- .replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>")
13
- .replace(/(^|[^*])\*([^*\n]+)\*/g, "$1<em>$2</em>")
14
- .replace(/`([^`]+)`/g, "<code>$1</code>")
15
- .replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, '<a href="$2">$1</a>');
16
- }
17
-
18
- function renderProsa(doc, op) {
19
- op = op || {};
20
- var folha = document.createElement("div");
21
- folha.className = "folha-doc";
22
- folha.setAttribute("data-tema", doc.tema || "papel");
23
- if (doc.largura) folha.style.width = doc.largura + "px";
24
-
25
- var h = [];
26
-
27
- if (doc.capa) {
28
- var c = doc.capa;
29
- h.push('<div class="capa-doc" style="min-height:520px;display:flex;flex-direction:column;justify-content:center;gap:10px">');
30
- if (c.chapeu) h.push('<div class="chapeu-doc">' + _pFugir(c.chapeu) + "</div>");
31
- if (c.titulo) h.push("<h1>" + _pRico(c.titulo) + "</h1>");
32
- if (c.apoio) h.push('<p class="apoio">' + _pRico(c.apoio) + "</p>");
33
- if (c.autor || c.data) {
34
- h.push('<p class="apoio" style="font-size:14px;margin-top:20px">' +
35
- _pFugir([c.autor, c.data].filter(Boolean).join(" · ")) + "</p>");
36
- }
37
- h.push("</div><hr>");
38
- }
39
-
40
- var indice = [];
41
- (doc.blocos || []).forEach(function (b, i) {
42
- if (b.tipo === "secao") indice.push({ i: i, texto: b.texto });
43
- });
44
-
45
- (doc.blocos || []).forEach(function (b) {
46
- var t = b.tipo || "paragrafo";
47
- var texto = b.texto || "";
48
-
49
- switch (t) {
50
- case "titulo": h.push("<h1>" + _pRico(texto) + "</h1>"); break;
51
- case "chapeu": h.push('<div class="chapeu-doc">' + _pFugir(texto) + "</div>"); break;
52
- case "apoio": h.push('<p class="apoio">' + _pRico(texto) + "</p>"); break;
53
- case "secao": h.push("<h2>" + _pRico(texto) + "</h2>"); break;
54
- case "subsecao": h.push("<h3>" + _pRico(texto) + "</h3>"); break;
55
- case "citacao":
56
- h.push("<blockquote>" + _pRico(texto) +
57
- (b.autor ? '<div style="font-size:13px;margin-top:8px">— ' + _pFugir(b.autor) + "</div>" : "") +
58
- "</blockquote>");
59
- break;
60
- case "lista":
61
- h.push("<ul>" + (b.itens || []).map(function (i) { return "<li>" + _pRico(i) + "</li>"; }).join("") + "</ul>");
62
- break;
63
- case "numerada":
64
- h.push("<ol>" + (b.itens || []).map(function (i) { return "<li>" + _pRico(i) + "</li>"; }).join("") + "</ol>");
65
- break;
66
- case "codigo":
67
- h.push("<pre>" + _pFugir(texto) + "</pre>");
68
- break;
69
- case "tabela": {
70
- var linhas = b.linhas || [];
71
- var tab = "<table>";
72
- linhas.forEach(function (l, i) {
73
- tab += "<tr>" + l.map(function (cel) {
74
- return i === 0 ? "<th>" + _pFugir(cel) + "</th>" : "<td>" + _pRico(cel) + "</td>";
75
- }).join("") + "</tr>";
76
- });
77
- h.push(tab + "</table>");
78
- break;
79
- }
80
- case "imagem":
81
- h.push("<figure><img src=\"" + _pFugir(b.src) + "\" alt=\"" + _pFugir(b.alt || "") + "\">" +
82
- (b.legenda ? "<figcaption>" + _pRico(b.legenda) + "</figcaption>" : "") + "</figure>");
83
- break;
84
- case "destaque":
85
- h.push('<div style="background:var(--c-cartao);border:1px solid var(--c-linha);' +
86
- 'border-left:3px solid var(--c-tom);border-radius:10px;padding:16px 20px">' +
87
- (b.titulo ? "<strong>" + _pFugir(b.titulo) + "</strong><br>" : "") +
88
- _pRico(texto) + "</div>");
89
- break;
90
- case "sumario":
91
- h.push("<h2>" + _pFugir(texto || "Sumário") + "</h2><ol>" +
92
- indice.map(function (s) { return "<li>" + _pFugir(s.texto) + "</li>"; }).join("") + "</ol>");
93
- break;
94
- case "divisor": h.push("<hr>"); break;
95
- case "quebra": h.push('<div style="break-after:page;page-break-after:always;height:1px"></div>'); break;
96
- default: h.push("<p>" + _pRico(texto) + "</p>");
97
- }
98
- });
99
-
100
- folha.innerHTML = h.join("\n");
101
- return folha;
102
- }
103
-
104
- if (typeof module !== "undefined" && module.exports) module.exports = { renderProsa: renderProsa };