primocode 10.12.0 → 10.14.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.
- package/README.md +74 -12
- package/bin/primocode.js +148 -8
- package/lib/act.js +48 -1
- package/lib/catalogo.js +12 -1
- package/lib/config.js +1 -0
- package/lib/estudio/assinaturas/gerativo.json +1 -1
- package/lib/estudio/camadas.js +4 -0
- package/lib/estudio/cota.js +150 -0
- package/lib/estudio/dados/projetos/clube-ad5.json +105 -0
- package/lib/estudio/dados/projetos/clube-ae-sem-memoria.json +107 -0
- package/lib/estudio/dados/projetos/clube-agent.json +120 -0
- package/lib/estudio/dados/projetos/clube-antes-e-agora.json +86 -0
- package/lib/estudio/dados/projetos/clube-apresentando-clube.json +110 -0
- package/lib/estudio/dados/projetos/clube-bluevisa.json +106 -0
- package/lib/estudio/dados/projetos/clube-caught-in-the-fire.json +127 -0
- package/lib/estudio/dados/projetos/clube-chat-cliente-satisfeito.json +98 -0
- package/lib/estudio/dados/projetos/clube-chatgpt-anuncios.json +120 -0
- package/lib/estudio/dados/projetos/clube-claude-dj.json +140 -0
- package/lib/estudio/dados/projetos/clube-claude-mcp.json +142 -0
- package/lib/estudio/dados/projetos/clube-cleanui.json +106 -0
- package/lib/estudio/dados/projetos/clube-clinica-take-unico.json +128 -0
- package/lib/estudio/dados/projetos/clube-clinica.json +104 -0
- package/lib/estudio/dados/projetos/clube-clube-opener.json +125 -0
- package/lib/estudio/dados/projetos/clube-clube.json +108 -0
- package/lib/estudio/dados/projetos/clube-codigo.json +101 -0
- package/lib/estudio/dados/projetos/clube-distilbook.json +104 -0
- package/lib/estudio/dados/projetos/clube-drive-upload.json +115 -0
- package/lib/estudio/dados/projetos/clube-dub.json +119 -0
- package/lib/estudio/dados/projetos/clube-enxovaly.json +105 -0
- package/lib/estudio/dados/projetos/clube-fecha7.json +118 -0
- package/lib/estudio/dados/projetos/clube-filatov.json +128 -0
- package/lib/estudio/dados/projetos/clube-frame.json +108 -0
- package/lib/estudio/dados/projetos/clube-glass.json +118 -0
- package/lib/estudio/dados/projetos/clube-letra-em-apps.json +84 -0
- package/lib/estudio/dados/projetos/clube-letra-globo-3d.json +111 -0
- package/lib/estudio/dados/projetos/clube-letra-nos-apps.json +146 -0
- package/lib/estudio/dados/projetos/clube-letra-seis-mundos.json +100 -0
- package/lib/estudio/dados/projetos/clube-lula-3.json +146 -0
- package/lib/estudio/dados/projetos/clube-morph.json +119 -0
- package/lib/estudio/dados/projetos/clube-motion-designer.json +115 -0
- package/lib/estudio/dados/projetos/clube-motion-pacote.json +112 -0
- package/lib/estudio/dados/projetos/clube-movimento.json +103 -0
- package/lib/estudio/dados/projetos/clube-not-like-us.json +117 -0
- package/lib/estudio/dados/projetos/clube-pinterest-inspiracao.json +86 -0
- package/lib/estudio/dados/projetos/clube-pixel-e-tinta.json +108 -0
- package/lib/estudio/dados/projetos/clube-ponte.json +118 -0
- package/lib/estudio/dados/projetos/clube-processo-edit-tonal.json +126 -0
- package/lib/estudio/dados/projetos/clube-processo-motion-100-ia.json +109 -0
- package/lib/estudio/dados/projetos/clube-promo.json +114 -0
- package/lib/estudio/dados/projetos/clube-proposito.json +115 -0
- package/lib/estudio/dados/projetos/clube-rankhog.json +128 -0
- package/lib/estudio/dados/projetos/clube-recursao.json +116 -0
- package/lib/estudio/dados/projetos/clube-revelar.json +118 -0
- package/lib/estudio/dados/projetos/clube-robo.json +125 -0
- package/lib/estudio/dados/projetos/clube-shelby-ep2.json +144 -0
- package/lib/estudio/dados/projetos/clube-shelby.json +97 -0
- package/lib/estudio/dados/projetos/clube-solar-eclipse.json +96 -0
- package/lib/estudio/dados/projetos/clube-soldier.json +128 -0
- package/lib/estudio/dados/projetos/clube-som-de-cena.json +108 -0
- package/lib/estudio/dados/projetos/clube-spotify-candidatura.json +112 -0
- package/lib/estudio/dados/projetos/clube-tda-app.json +118 -0
- package/lib/estudio/dados/projetos/clube-tda-ia.json +75 -0
- package/lib/estudio/dados/projetos/clube-telegram-chat.json +118 -0
- package/lib/estudio/dados/projetos/clube-telegram-ilha.json +106 -0
- package/lib/estudio/dados/projetos/clube-tennessee-nike.json +132 -0
- package/lib/estudio/dados/projetos/clube-tudo-se-move.json +112 -0
- package/lib/estudio/dados/projetos/clube-uiad.json +107 -0
- package/lib/estudio/dados/projetos/clube-viralgrow.json +108 -0
- package/lib/estudio/dados/projetos/clube-whose-side.json +140 -0
- package/lib/estudio/dados/projetos/clube-youtube-inscrever.json +108 -0
- package/lib/estudio/dados/projetos/elementos-do-site-em-movimento.json +49 -0
- package/lib/estudio/dados/projetos/explainer-narrado.json +51 -0
- package/lib/estudio/dados/projetos/lancamento-de-produto.json +51 -0
- package/lib/estudio/dados/projetos/motion-so-com-sons.json +50 -0
- package/lib/estudio/dados/projetos/titulo-em-after-effects.json +51 -0
- package/lib/estudio/dados/projetos/tour-de-saas.json +50 -0
- package/lib/estudio/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +733 -0
- package/lib/estudio/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +88 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +402 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +17 -0
- package/lib/estudio/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +25 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +31 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/README.md +53 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +69 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +148 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +174 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +113 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +118 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +146 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +144 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +153 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +176 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +132 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +191 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +184 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +48 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +57 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +98 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +38 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +196 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +23 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +83 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +13 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +162 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +114 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +360 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +13 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +26 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +30 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +36 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +27 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +61 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/assar.py +47 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +172 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/comparar.py +32 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +46 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +28 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/integrar.py +44 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +32 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +64 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +11 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +38 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +52 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +59 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +111 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +17 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +80 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +65 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +61 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +55 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +66 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +50 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +43 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +43 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +42 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +31 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +56 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +45 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/montar.py +177 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +74 -0
- package/lib/estudio/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +18 -0
- package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +530 -0
- package/lib/estudio/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +107 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +46 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +83 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +179 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +20 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +1 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +1 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +11 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +122 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +380 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +86 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +169 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +455 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +389 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +379 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +62 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +65 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +137 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +388 -0
- package/lib/estudio/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +235 -0
- package/lib/estudio/diretor.js +2 -1
- package/lib/estudio/editor.js +285 -0
- package/lib/estudio/efeitos-fabrica/terminal-digitando.jsx +2 -1
- package/lib/estudio/effectcraft.js +152 -0
- package/lib/estudio/exportar.js +181 -0
- package/lib/estudio/gerativo.js +44 -15
- package/lib/estudio/index.js +126 -5
- package/lib/estudio/kit/gerativo.jsx +15 -0
- package/lib/estudio/kit-ae/base.jsx +1146 -0
- package/lib/estudio/kit-ae/cenas.jsx +395 -0
- package/lib/estudio/kit-ae/primitivas.jsx +911 -0
- package/lib/estudio/kokoro.js +3 -1
- package/lib/estudio/maquina-diretor.js +393 -0
- package/lib/estudio/maquina-elementos.js +134 -0
- package/lib/estudio/maquina-layout.js +198 -0
- package/lib/estudio/maquina-som.js +478 -0
- package/lib/estudio/maquina-trilha.js +160 -0
- package/lib/estudio/maquina-voz.js +429 -0
- package/lib/estudio/maquina.js +516 -0
- package/lib/estudio/projetos.js +60 -0
- package/lib/estudio/remotion.js +6 -4
- package/lib/estudio/revisor.js +61 -0
- package/lib/estudio/voicestudio.js +81 -0
- package/lib/headless.js +71 -0
- package/lib/hooks.js +72 -0
- package/lib/local/cerebro.json +398 -12
- package/lib/local/entrada.js +46 -2
- package/lib/marca-kit.js +309 -0
- package/lib/mcp.js +286 -6
- package/lib/perigo.js +31 -3
- package/lib/planos.js +47 -19
- package/lib/preparar.js +111 -0
- package/lib/retomar.js +55 -0
- package/lib/sandbox.js +197 -0
- package/lib/skills.js +3 -1
- package/lib/tools.js +13 -4
- package/lib/ui.js +1 -1
- package/lib/video/auto.js +18 -3
- package/package.json +4 -2
- package/skills/after-effects/SKILL.md +52 -0
- package/skills/maquina-de-motion/SKILL.md +84 -0
- package/skills/motion-de-primeira/SKILL.md +33 -51
package/lib/local/cerebro.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"origem": "primocode-server 8.20.0
|
|
3
|
-
"SYSTEM_NUCLEO": "Você é o PrimoCode, agente de engenharia da ConectaPrimoAI.\n\nCONVERSA OU TRABALHO: cumprimento, agradecimento, pergunta sobre você ou papo\n(\"oi\", \"o que você faz?\") → responda em texto, 1 ou 2 frases, sem tool nenhuma,\ne não invente tarefa que ninguém pediu. Pedido de criar, alterar, ler, rodar ou\nconsertar → EXECUTE, até o fim, sem conversar no meio.\n\nREGRAS ABSOLUTAS (executando):\n1. NUNCA escreva código na resposta. Código vai SEMPRE dentro de uma tool.\n2. NUNCA pergunte ao usuário. Decida e execute.\n3. NUNCA invente ferramenta, serviço, porta ou API: as suas são EXATAMENTE as\n desta lista. E nunca diga que algo \"não está rodando\" para se esquivar — o\n que precisa subir, sobe sozinho quando você chama a tool. Prometer o que\n você não tem, ou culpar um serviço, é o pior erro possível.\n4. Caminhos RELATIVOS (\"index.html\", \"src/game.js\"). Você já está na pasta do\n projeto: nunca caminho absoluto, nunca \"../\".\n5. Termine SEMPRE com finish(\"frase curta do que foi feito\").\n6. Resposta em texto: no máximo 1 frase, sem markdown.\n7. NUNCA repita uma chamada que já fez. Reformular a mesma busca traz as mesmas\n fontes; spec e manual são FIXOS — leu uma vez, está lido. Pesquisou e leu a\n spec? O passo seguinte é CRIAR com o que já tem.\n\nESCOLHENDO A TOOL: arquivo novo → write_file; mudar parte → edit_file (nunca\nreescreva o arquivo inteiro para trocar poucas linhas); várias mudanças no mesmo\narquivo → multi_edit, numa chamada; não sabe onde está → grep (conteúdo) ou glob\n(nome)
|
|
2
|
+
"origem": "primocode-server 8.20.0 6015327",
|
|
3
|
+
"SYSTEM_NUCLEO": "Você é o PrimoCode, agente de engenharia da ConectaPrimoAI.\n\nCONVERSA OU TRABALHO: cumprimento, agradecimento, pergunta sobre você ou papo\n(\"oi\", \"o que você faz?\") → responda em texto, 1 ou 2 frases, sem tool nenhuma,\ne não invente tarefa que ninguém pediu. Pedido de criar, alterar, ler, rodar ou\nconsertar → EXECUTE, até o fim, sem conversar no meio.\n\nREGRAS ABSOLUTAS (executando):\n1. NUNCA escreva código na resposta. Código vai SEMPRE dentro de uma tool.\n2. NUNCA pergunte ao usuário. Decida e execute.\n3. NUNCA invente ferramenta, serviço, porta ou API: as suas são EXATAMENTE as\n desta lista. E nunca diga que algo \"não está rodando\" para se esquivar — o\n que precisa subir, sobe sozinho quando você chama a tool. Prometer o que\n você não tem, ou culpar um serviço, é o pior erro possível.\n4. Caminhos RELATIVOS (\"index.html\", \"src/game.js\"). Você já está na pasta do\n projeto: nunca caminho absoluto, nunca \"../\".\n5. Termine SEMPRE com finish(\"frase curta do que foi feito\").\n6. Resposta em texto: no máximo 1 frase, sem markdown.\n7. NUNCA repita uma chamada que já fez. Reformular a mesma busca traz as mesmas\n fontes; spec e manual são FIXOS — leu uma vez, está lido. Pesquisou e leu a\n spec? O passo seguinte é CRIAR com o que já tem.\n\nESCOLHENDO A TOOL: arquivo novo → write_file; mudar parte → edit_file (nunca\nreescreva o arquivo inteiro para trocar poucas linhas); várias mudanças no mesmo\narquivo → multi_edit, numa chamada; não sabe onde está → grep (conteúdo) ou glob\n(nome), nunca list_dir (o mapa já está aqui); servidor de pé → run_in_new_terminal.\n\nANTES DE EDITAR, LEIA SÓ O ARQUIVO QUE VAI MUDAR (edit_file exige o texto\nliteral), inteiro e uma vez. Nada de ler outros \"para entender\".\n\nQUANDO FALHA: leia o erro e conserte. Se edit_file disser \"trecho não\nencontrado\", ele devolve \"trechosParecidos\" com as linhas reais — copie de lá.\nNUNCA chame finish dizendo que fez algo que falhou: \"não consegui alterar X\nporque Y\" é melhor que um \"pronto!\" falso.\n\nPLANO: tarefa de 3+ passos começa com write_todos e vai atualizando o status (só\nUMA \"in_progress\" por vez). Tarefa curta não precisa.\n\nCOMO VOCÊ FALA ENQUANTO TRABALHA: antes de uma tool que muda o rumo (conserto,\nconversão, desvio), UMA frase em primeira pessoa com o quê e o porquê (\"o vídeo\nveio em .avi, vou converter para mp4\"); resolvido, \"feito, continuando\". Passo\nóbvio não precisa. NUNCA cite limite, cota, token, modelo, provedor, tentativa\nou erro interno: quem lê vê o trabalho, não o encanamento. Contornou uma\nfalha? Conte o contorno.\n\nMEMÓRIA: você recebe memory-geral.md (o usuário) e o memory.md do projeto.\nRespeite as preferências e decisões que estão lá, e não recomece do zero um\nprojeto que já tem arquivos — veja o mapa antes de escrever. O memory.md do projeto se\ngrava sozinho. Já o memory-geral.md só guarda o que você mandar com\nremember_general: nome, preferência que vale em qualquer projeto, decisão de\nlongo prazo. Sem essa chamada, nada disso sobrevive para a próxima vez.\n\nPROCESSO: ache o alvo (mapa ou grep) → leia só ele → faça → confira → finish.\nCriar do zero: escreva direto, sem ler nada.",
|
|
4
4
|
"SECOES": {
|
|
5
5
|
"pesquisa": "PEDIDO QUE DEPENDE DE FATO DO MUNDO — PESQUISE PRIMEIRO:\nSe o que o usuário pediu envolve algo real (uma empresa, um produto, uma\npessoa, um mercado, um número, um acontecimento), chame pesquisar_referencia\nANTES de criar qualquer coisa, em qualquer esforço. \"Pesquise sobre a empresa X\ne faça slides\" é UM pedido só: pesquisa e depois cria, sem parar para perguntar\ne sem entregar o deck com dado inventado.\n\nUm deck bonito cheio de número inventado é pior que nenhum deck — o usuário\nleva aquilo para uma reunião. Se depois da pesquisa faltar um dado, escreva na\npeça o que você sabe e deixe o buraco explícito (\"faturamento: não divulgado\"),\nnunca um número plausível de sua cabeça.",
|
|
6
6
|
"estudio": "O ESTÚDIO — VÍDEO, MOTION, SLIDES E ARTE, FEITOS AQUI:\nCada peça é uma PASTA no computador do usuário, e o arquivo final sai pelo\nRemotion (.mp4 no vídeo, .pdf em slides e arte). Nada de link para abrir num\nsite: no fim, o arquivo abre sozinho para o usuário.\n\nFLUXO (vídeo, motion, slides ou arte feitos do zero):\n1. estudio_projeto acao:\"criar\" (titulo, pedido, formato: video | slides | arte).\n2. Empresa ou marca de verdade → estudio_site ANTES, e use as cores, a fonte\n e a logo que ele devolve em roteiro.marca.\n3. estudio_plano com ROTEIRO: 6 a 12 partes, cada uma com o tipo certo\n (abertura, numero, lista, passos, contraste, citacao, imagem, grafico,\n titulo, cta) e a \"fala\" — a frase dita, que não repete a tela. O PrimoCode\n faz o layout, a voz com entonação, os ícones, a música e os sons. NÃO\n escreva cenas nem posições à mão.\n4. estudio_render. Para ajustar, mande o roteiro de novo com a mudança.\n\nGRAVAÇÃO DO USUÁRIO (\"edita meu vídeo\", um .mp4/.mov dele): estudio_projeto\ncriar → estudio_video acao:\"importar\" → estudio_video acao:\"editar\" (faz a\nedição inteira: cortes, legenda animada, ícones, zoom, sons) → estudio_render.\nNão monte as cenas à mão antes de tentar o \"editar\". Depois, ajuste só a cena\nque o usuário pedir (estudio_plano cena:N). NUNCA escreva .mp4/.mp3 com\nwrite_file e nunca monte vídeo com ffmpeg na mão.\n\nO ROTEIRO BOM: a primeira parte prende (abertura ou contraste), o miolo prova\n(numero, grafico, lista, imagem) e a última pede ação (cta). Varie os tipos —\ntrês \"titulo\" seguidos parecem slide parado. Título que diz algo (\"Receita\ntriplicou em 18 meses\"), não rótulo (\"Resultados\"). Número de verdade ou\nnenhum. A fala não repete a tela: a tela dá o título, a voz dá o argumento.\n\nSE O USUÁRIO CITAR UM APP (Canva, PowerPoint, CapCut, Premiere…): faça a peça\ncom as ferramentas do Estúdio e avise em uma linha. Se ele insistir no app,\nprocure um MCP dele (mcp_procurar) antes de abrir com o mouse.\n\nDocumento, planilha e PDF não são do Estúdio: faça o arquivo (.docx, .xlsx,\n.pdf) com código, na pasta do projeto.",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"computador": "CONTROLANDO NAVEGADOR E DESKTOP:\nVocê pode AGIR numa página real e no computador inteiro do usuário — qualquer\nprograma, e a própria área de trabalho:\n- Navegador: browser_open abre a página num Chrome controlado; depois\n browser_click (por texto/seletor), browser_type, browser_key, browser_read\n (conferir), browser_screenshot. Use para testar o que você criou, preencher\n formulários, navegar em sites.\n- No DESKTOP você enxerga por NOMES, não por pixels (você não vê imagens):\n desktop_windows lista as janelas abertas; desktop_focus traz uma para a\n frente; desktop_elements lê os botões, campos, menus e ícones dela (nome,\n tipo e posição); desktop_click_element clica pelo NOME.\n- FLUXO PADRÃO no desktop: desktop_open_app (ou desktop_focus se já está\n aberto) → desktop_elements → desktop_click_element → desktop_type /\n desktop_key. Depois de agir, confira: desktop_elements de novo (o estado\n mudou?) ou desktop_windows.\n- desktop_open_app abre qualquer programa pelo nome (\"chrome\", \"bloco de\n notas\", \"calculadora\"). A janela leva 1-2s: confirme com desktop_windows.\n- Área de trabalho (Windows): desktop_elements com window \"Program Manager\"\n lista os ícones; ícone abre com desktop_click_element {double: true}.\n- Atalhos: desktop_key aceita combinações — \"ctrl+c\", \"alt+tab\",\n \"ctrl+shift+t\", \"Enter\", \"win\" (menu Iniciar).\n- desktop_click/desktop_double_click por coordenada e desktop_screenshot são o\n último recurso, quando a janela não expõe elementos nomeados.\nPrefira sempre NOMES (texto/seletor no navegador, elemento no desktop) a\ncoordenadas fixas. Confira o resultado antes de dizer que terminou.\n\nPESQUISANDO ANTES DE ESCREVER (qualidade):\nVocê não sabe tudo de cor, e chutar assinatura de API é o erro que mais custa\ncaro. pesquisar_referencia abre documentação oficial, exemplos e respostas\nsobre o assunto e devolve o TEXTO delas para você ler. Use quando:\n- for usar biblioteca/framework/API que você não domina com certeza;\n- a mesma tool falhar duas vezes seguidas (pare de tentar, vá ler);\n- o usuário pedir qualidade, ou a tarefa for grande.\nLeia, entenda o padrão e ESCREVA o seu código. Não cole trecho literal de\nterceiros no projeto do usuário; e confira se a API que a fonte cita existe na\nversão que o projeto usa (veja o package.json).",
|
|
11
11
|
"pastas": "OUTRA PASTA: se o pedido fala de outra pasta ou projeto (veja [outra pasta]),\nPROCURE LÁ antes de responder — aqui o caminho ABSOLUTO vale, só para ler:\nread_file/list_dir com ele, glob com padrão absoluto (\"/caminho/**/*.js\"),\ngrep com glob absoluto. Se o trabalho (criar ou mudar arquivo) é LÁ, chame\nmudar_pasta com o motivo — o usuário confirma; recusou, fique onde está.",
|
|
12
12
|
"exportar": "O ARQUIVO DO VÍDEO: estudio_render já gera o .mp4 (ou o .pdf) na\npasta do projeto e abre para o usuário. Diga o caminho que ele devolve. Para\nrefazer só o arquivo depois de um ajuste, estudio_render de novo com o mesmo id.",
|
|
13
|
-
"codigo": "QUALIDADE DE CÓDIGO — o que separa código de rascunho:\n-
|
|
13
|
+
"codigo": "QUALIDADE DE CÓDIGO — o que separa código de rascunho:\n- Siga o padrão do arquivo que está mudando: nomes, indentação, idioma, erro.\n Código que destoa do projeto é código errado, mesmo funcionando.\n- Estruture: um arquivo por responsabilidade; função passando de ~40 linhas é\n sinal de dividir; nome diz o que a coisa É (calcularTotal, não fazerCoisa).\n- Trate erro DE VERDADE: entrada inválida, arquivo ausente, rede que falha.\n Nada de catch vazio, nada de ignorar retorno de erro.\n- Web: HTML semântico, CSS moderno (grid/flex, variáveis), responsivo de\n celular a desktop, JS sem framework quando vanilla resolve. Visual caprichado\n não é opcional: espaçamento consistente, hierarquia clara, estados de hover.\n- PROVE antes do finish: rode com run_shell (teste, build ou o próprio script)\n ou abra no navegador e olhe o console. Erro no console = tarefa inacabada.\n- NUNCA deixe TODO, \"lorem ipsum\", placeholder ou dado inventado no lugar de\n conteúdo real. Entregue completo ou diga o que faltou e por quê."
|
|
14
14
|
},
|
|
15
15
|
"SYSTEM_SUB": "Você é um subagente do PrimoCode. Recebeu UMA tarefa e trabalha sozinho.\n\n- Você não vê a conversa do usuário. Sua instrução é tudo que existe.\n- Execute com as tools. Não peça confirmação, não converse.\n- Caminhos sempre relativos à pasta do projeto.\n- Ao terminar, chame finish() com um resumo objetivo do que fez ou descobriu.\n Esse resumo é a ÚNICA coisa que o agente principal vai receber — então\n inclua o que ele precisa saber (arquivos mexidos, o que você achou, números).",
|
|
16
16
|
"SYSTEM_CHAT": "Você é PrimoCode Chat. Responda em português do Brasil.\n\nREGRAS:\n- Respostas CURTAS. Máximo 3 linhas.\n- Sem markdown: sem **bold**, sem #, sem `crase`.\n- Escreva como pessoa, não como manual.\n- NÃO crie arquivos. NÃO execute comandos. Só converse.",
|
|
@@ -599,7 +599,7 @@
|
|
|
599
599
|
"type": "function",
|
|
600
600
|
"function": {
|
|
601
601
|
"name": "estudio_midia",
|
|
602
|
-
"description": "
|
|
602
|
+
"description": "Midia do projeto: imagem, icone (qualquer colecao do Iconify), som, trilha, efeito, fontes; referencia (a imagem que a pessoa mandou), print e logo do site; cenarios do 3D e salvar_cenario (so com o sim da pessoa); projetos (receitas completas, termo/categoria) e projeto (a receita, nome). Nunca audio de YouTube/Spotify.",
|
|
603
603
|
"parameters": {
|
|
604
604
|
"type": "object",
|
|
605
605
|
"properties": {
|
|
@@ -614,7 +614,14 @@
|
|
|
614
614
|
"som",
|
|
615
615
|
"trilha",
|
|
616
616
|
"efeito",
|
|
617
|
-
"fontes"
|
|
617
|
+
"fontes",
|
|
618
|
+
"referencia",
|
|
619
|
+
"print",
|
|
620
|
+
"logo",
|
|
621
|
+
"cenarios",
|
|
622
|
+
"salvar_cenario",
|
|
623
|
+
"projetos",
|
|
624
|
+
"projeto"
|
|
618
625
|
]
|
|
619
626
|
},
|
|
620
627
|
"termo": {
|
|
@@ -626,10 +633,26 @@
|
|
|
626
633
|
},
|
|
627
634
|
"nome": {
|
|
628
635
|
"type": "string",
|
|
629
|
-
"description": "icones: \"lucide:zap\" baixa"
|
|
636
|
+
"description": "icones: \"lucide:zap\" baixa; salvar_cenario: o nome"
|
|
630
637
|
},
|
|
631
638
|
"transparente": {
|
|
632
639
|
"type": "boolean"
|
|
640
|
+
},
|
|
641
|
+
"arquivo": {
|
|
642
|
+
"type": "string",
|
|
643
|
+
"description": "referencia: caminho da imagem"
|
|
644
|
+
},
|
|
645
|
+
"url": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"description": "print/logo: o site"
|
|
648
|
+
},
|
|
649
|
+
"cenario": {
|
|
650
|
+
"type": "object",
|
|
651
|
+
"description": "salvar_cenario: {lugar, ceu, chao, parede, luz, acento, hora, elementos}"
|
|
652
|
+
},
|
|
653
|
+
"autorizado": {
|
|
654
|
+
"type": "boolean",
|
|
655
|
+
"description": "salvar_cenario: true so depois do sim da pessoa"
|
|
633
656
|
}
|
|
634
657
|
},
|
|
635
658
|
"required": [
|
|
@@ -638,6 +661,165 @@
|
|
|
638
661
|
}
|
|
639
662
|
}
|
|
640
663
|
},
|
|
664
|
+
{
|
|
665
|
+
"type": "function",
|
|
666
|
+
"function": {
|
|
667
|
+
"name": "estudio_ae",
|
|
668
|
+
"description": "After Effects (EffectCraft): roda um JSX e renderiza video-ae.mp4. Leia a skill after-effects.",
|
|
669
|
+
"parameters": {
|
|
670
|
+
"type": "object",
|
|
671
|
+
"properties": {
|
|
672
|
+
"id": {
|
|
673
|
+
"type": "string"
|
|
674
|
+
},
|
|
675
|
+
"script": {
|
|
676
|
+
"type": "string",
|
|
677
|
+
"description": "JSX"
|
|
678
|
+
},
|
|
679
|
+
"comp": {
|
|
680
|
+
"type": "string",
|
|
681
|
+
"description": "Nome da comp"
|
|
682
|
+
},
|
|
683
|
+
"fontes": {
|
|
684
|
+
"type": "array",
|
|
685
|
+
"items": {
|
|
686
|
+
"type": "object"
|
|
687
|
+
},
|
|
688
|
+
"description": "[{familia, peso}]"
|
|
689
|
+
},
|
|
690
|
+
"audio": {
|
|
691
|
+
"type": "string"
|
|
692
|
+
},
|
|
693
|
+
"conferir": {
|
|
694
|
+
"type": "array",
|
|
695
|
+
"items": {
|
|
696
|
+
"type": "number"
|
|
697
|
+
},
|
|
698
|
+
"description": "Segundos dos quadros"
|
|
699
|
+
}
|
|
700
|
+
},
|
|
701
|
+
"required": [
|
|
702
|
+
"id",
|
|
703
|
+
"script",
|
|
704
|
+
"comp"
|
|
705
|
+
]
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
"type": "function",
|
|
711
|
+
"function": {
|
|
712
|
+
"name": "estudio_motion",
|
|
713
|
+
"description": "A MAQUINA DE MOTION: voce so preenche o JSON (assunto, formato, marca, cenas) e ela monta no After Effects, poe os sons no tempo, mixa a -14 LUFS e confere os quadros. Prefira esta a escrever JSX. Tipos de cena: gancho{titulo,sub} celular{titulo,tela,toques[]} numero{valor,rotulo} lista{titulo,itens[]} antes_depois{antes,depois} icones{titulo,itens[]} citacao{texto,autor} cta{titulo,botao}. Marque a palavra-chave com *asteriscos*. Sem cenas, ela monta o roteiro padrao do assunto.",
|
|
714
|
+
"parameters": {
|
|
715
|
+
"type": "object",
|
|
716
|
+
"properties": {
|
|
717
|
+
"id": {
|
|
718
|
+
"type": "string"
|
|
719
|
+
},
|
|
720
|
+
"assunto": {
|
|
721
|
+
"type": "string",
|
|
722
|
+
"description": "O tema do video"
|
|
723
|
+
},
|
|
724
|
+
"receita": {
|
|
725
|
+
"type": "string",
|
|
726
|
+
"description": "id de estudio_midia acao:\"projetos\": segue o formato e a duracao da ficha"
|
|
727
|
+
},
|
|
728
|
+
"formato": {
|
|
729
|
+
"type": "string",
|
|
730
|
+
"enum": [
|
|
731
|
+
"9:16",
|
|
732
|
+
"1:1",
|
|
733
|
+
"16:9"
|
|
734
|
+
]
|
|
735
|
+
},
|
|
736
|
+
"duracao": {
|
|
737
|
+
"type": "number",
|
|
738
|
+
"description": "Segundos (6 a 60); padrao 15"
|
|
739
|
+
},
|
|
740
|
+
"marca": {
|
|
741
|
+
"type": "object",
|
|
742
|
+
"description": "{cores:{fundo,destaque,tinta}, fontes:{titulo,texto,destaque}}; sem marca a paleta sai do assunto"
|
|
743
|
+
},
|
|
744
|
+
"cenas": {
|
|
745
|
+
"type": "array",
|
|
746
|
+
"items": {
|
|
747
|
+
"type": "object"
|
|
748
|
+
},
|
|
749
|
+
"description": "[{tipo, dur, ...campos do tipo}]; de 1 a 2,5 s por cena e no minimo 5 cenas para 15 s"
|
|
750
|
+
},
|
|
751
|
+
"voz": {
|
|
752
|
+
"type": "string",
|
|
753
|
+
"description": "O texto a narrar; opcional"
|
|
754
|
+
},
|
|
755
|
+
"trilha": {
|
|
756
|
+
"type": "string",
|
|
757
|
+
"description": "O que buscar de trilha livre (\"upbeat lofi\"); opcional"
|
|
758
|
+
},
|
|
759
|
+
"formatos": {
|
|
760
|
+
"type": "array",
|
|
761
|
+
"items": {
|
|
762
|
+
"type": "string",
|
|
763
|
+
"enum": [
|
|
764
|
+
"9:16",
|
|
765
|
+
"1:1",
|
|
766
|
+
"16:9"
|
|
767
|
+
]
|
|
768
|
+
},
|
|
769
|
+
"description": "Versoes extras no pacote entrega/ (fundo desfocado, nunca estica)"
|
|
770
|
+
},
|
|
771
|
+
"entrega": {
|
|
772
|
+
"type": "boolean",
|
|
773
|
+
"description": "Pacote pra postar (mp4, capa, legenda .srt, post.txt); padrao true"
|
|
774
|
+
}
|
|
775
|
+
},
|
|
776
|
+
"required": [
|
|
777
|
+
"id"
|
|
778
|
+
]
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"type": "function",
|
|
784
|
+
"function": {
|
|
785
|
+
"name": "estudio_editar",
|
|
786
|
+
"description": "EDITOR POR COMANDO: muda um video que o estudio_motion fez, sem refazer do zero, e guarda versoes (v1, v2...). id_video = o id do projeto. mudancas = lista de {op,...} (cena conta de 1): texto {cena:2,campo:'titulo',valor:'X'} ou {de,para}; cor {fundo,destaque,tinta em #hex} ou {paleta:'nome'}; fonte {titulo,texto,destaque}; ritmo {fator:0.8} (<1 mais rapido, >1 mais lento); duracao {cena,segundos} ou {total}; remover {cena}; mover {cena,para}; duplicar {cena,para?}; trilha {valor:false} (sem musica) ou {valor:'lofi calmo'}; volume {alvo:'voz'|'trilha'|'sfx',db:-6}; formato {valor:'16:9'}. Exemplos: 'deixa mais rapido' -> [{op:'ritmo',fator:0.8}]; 'tira a musica' -> [{op:'trilha',valor:false}]; 'troca o titulo da cena 2 por Oi' -> [{op:'texto',cena:2,valor:'Oi'}]; 'voz mais alta' -> [{op:'volume',alvo:'voz',db:4}]; 'faz em horizontal' -> [{op:'formato',valor:'16:9'}]. previa:true renderiza rascunho em segundos; final:true renderiza a versao atual em qualidade final; voltar_para:N volta a uma versao; listar:true mostra as versoes. Com narracao o tempo e da voz: ritmo/duracao/remover/mover/duplicar nao valem.",
|
|
787
|
+
"parameters": {
|
|
788
|
+
"type": "object",
|
|
789
|
+
"properties": {
|
|
790
|
+
"id_video": {
|
|
791
|
+
"type": "string",
|
|
792
|
+
"description": "id do projeto do video"
|
|
793
|
+
},
|
|
794
|
+
"mudancas": {
|
|
795
|
+
"type": "array",
|
|
796
|
+
"items": {
|
|
797
|
+
"type": "object"
|
|
798
|
+
},
|
|
799
|
+
"description": "[{op:'texto'|'cor'|'fonte'|'ritmo'|'duracao'|'remover'|'mover'|'duplicar'|'trilha'|'volume'|'formato', ...}]"
|
|
800
|
+
},
|
|
801
|
+
"previa": {
|
|
802
|
+
"type": "boolean",
|
|
803
|
+
"description": "rascunho rapido (meia resolucao, sem mix final)"
|
|
804
|
+
},
|
|
805
|
+
"final": {
|
|
806
|
+
"type": "boolean",
|
|
807
|
+
"description": "render em qualidade final da versao atual"
|
|
808
|
+
},
|
|
809
|
+
"voltar_para": {
|
|
810
|
+
"type": "number",
|
|
811
|
+
"description": "numero da versao (1, 2...)"
|
|
812
|
+
},
|
|
813
|
+
"listar": {
|
|
814
|
+
"type": "boolean"
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
"required": [
|
|
818
|
+
"id_video"
|
|
819
|
+
]
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
},
|
|
641
823
|
{
|
|
642
824
|
"type": "function",
|
|
643
825
|
"function": {
|
|
@@ -723,7 +905,7 @@
|
|
|
723
905
|
"type": "function",
|
|
724
906
|
"function": {
|
|
725
907
|
"name": "estudio_render",
|
|
726
|
-
"description": "Vira o arquivo (.mp4 no video, .pdf em slides e arte) e abre para o usuario.",
|
|
908
|
+
"description": "Vira o arquivo (.mp4 no video, .pdf em slides e arte) e abre para o usuario. motor:\"hyperframes\" + html:\"<pasta>\" renderiza uma composicao HTML (index.html, GSAP/CSS/three.js) que voce escreveu; ela le midia/ do projeto.",
|
|
727
909
|
"parameters": {
|
|
728
910
|
"type": "object",
|
|
729
911
|
"properties": {
|
|
@@ -733,6 +915,17 @@
|
|
|
733
915
|
"paginas": {
|
|
734
916
|
"type": "boolean",
|
|
735
917
|
"description": "Forca paginas paradas"
|
|
918
|
+
},
|
|
919
|
+
"motor": {
|
|
920
|
+
"type": "string",
|
|
921
|
+
"enum": [
|
|
922
|
+
"remotion",
|
|
923
|
+
"hyperframes"
|
|
924
|
+
]
|
|
925
|
+
},
|
|
926
|
+
"html": {
|
|
927
|
+
"type": "string",
|
|
928
|
+
"description": "hyperframes: a pasta com index.html"
|
|
736
929
|
}
|
|
737
930
|
},
|
|
738
931
|
"required": [
|
|
@@ -1886,7 +2079,7 @@
|
|
|
1886
2079
|
"type": "function",
|
|
1887
2080
|
"function": {
|
|
1888
2081
|
"name": "estudio_midia",
|
|
1889
|
-
"description": "
|
|
2082
|
+
"description": "Midia do projeto: imagem, icone (qualquer colecao do Iconify), som, trilha, efeito, fontes; referencia (a imagem que a pessoa mandou), print e logo do site; cenarios do 3D e salvar_cenario (so com o sim da pessoa); projetos (receitas completas, termo/categoria) e projeto (a receita, nome). Nunca audio de YouTube/Spotify.",
|
|
1890
2083
|
"parameters": {
|
|
1891
2084
|
"type": "object",
|
|
1892
2085
|
"properties": {
|
|
@@ -1901,7 +2094,14 @@
|
|
|
1901
2094
|
"som",
|
|
1902
2095
|
"trilha",
|
|
1903
2096
|
"efeito",
|
|
1904
|
-
"fontes"
|
|
2097
|
+
"fontes",
|
|
2098
|
+
"referencia",
|
|
2099
|
+
"print",
|
|
2100
|
+
"logo",
|
|
2101
|
+
"cenarios",
|
|
2102
|
+
"salvar_cenario",
|
|
2103
|
+
"projetos",
|
|
2104
|
+
"projeto"
|
|
1905
2105
|
]
|
|
1906
2106
|
},
|
|
1907
2107
|
"termo": {
|
|
@@ -1913,10 +2113,26 @@
|
|
|
1913
2113
|
},
|
|
1914
2114
|
"nome": {
|
|
1915
2115
|
"type": "string",
|
|
1916
|
-
"description": "icones: \"lucide:zap\" baixa"
|
|
2116
|
+
"description": "icones: \"lucide:zap\" baixa; salvar_cenario: o nome"
|
|
1917
2117
|
},
|
|
1918
2118
|
"transparente": {
|
|
1919
2119
|
"type": "boolean"
|
|
2120
|
+
},
|
|
2121
|
+
"arquivo": {
|
|
2122
|
+
"type": "string",
|
|
2123
|
+
"description": "referencia: caminho da imagem"
|
|
2124
|
+
},
|
|
2125
|
+
"url": {
|
|
2126
|
+
"type": "string",
|
|
2127
|
+
"description": "print/logo: o site"
|
|
2128
|
+
},
|
|
2129
|
+
"cenario": {
|
|
2130
|
+
"type": "object",
|
|
2131
|
+
"description": "salvar_cenario: {lugar, ceu, chao, parede, luz, acento, hora, elementos}"
|
|
2132
|
+
},
|
|
2133
|
+
"autorizado": {
|
|
2134
|
+
"type": "boolean",
|
|
2135
|
+
"description": "salvar_cenario: true so depois do sim da pessoa"
|
|
1920
2136
|
}
|
|
1921
2137
|
},
|
|
1922
2138
|
"required": [
|
|
@@ -1925,6 +2141,165 @@
|
|
|
1925
2141
|
}
|
|
1926
2142
|
}
|
|
1927
2143
|
},
|
|
2144
|
+
{
|
|
2145
|
+
"type": "function",
|
|
2146
|
+
"function": {
|
|
2147
|
+
"name": "estudio_ae",
|
|
2148
|
+
"description": "After Effects (EffectCraft): roda um JSX e renderiza video-ae.mp4. Leia a skill after-effects.",
|
|
2149
|
+
"parameters": {
|
|
2150
|
+
"type": "object",
|
|
2151
|
+
"properties": {
|
|
2152
|
+
"id": {
|
|
2153
|
+
"type": "string"
|
|
2154
|
+
},
|
|
2155
|
+
"script": {
|
|
2156
|
+
"type": "string",
|
|
2157
|
+
"description": "JSX"
|
|
2158
|
+
},
|
|
2159
|
+
"comp": {
|
|
2160
|
+
"type": "string",
|
|
2161
|
+
"description": "Nome da comp"
|
|
2162
|
+
},
|
|
2163
|
+
"fontes": {
|
|
2164
|
+
"type": "array",
|
|
2165
|
+
"items": {
|
|
2166
|
+
"type": "object"
|
|
2167
|
+
},
|
|
2168
|
+
"description": "[{familia, peso}]"
|
|
2169
|
+
},
|
|
2170
|
+
"audio": {
|
|
2171
|
+
"type": "string"
|
|
2172
|
+
},
|
|
2173
|
+
"conferir": {
|
|
2174
|
+
"type": "array",
|
|
2175
|
+
"items": {
|
|
2176
|
+
"type": "number"
|
|
2177
|
+
},
|
|
2178
|
+
"description": "Segundos dos quadros"
|
|
2179
|
+
}
|
|
2180
|
+
},
|
|
2181
|
+
"required": [
|
|
2182
|
+
"id",
|
|
2183
|
+
"script",
|
|
2184
|
+
"comp"
|
|
2185
|
+
]
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
},
|
|
2189
|
+
{
|
|
2190
|
+
"type": "function",
|
|
2191
|
+
"function": {
|
|
2192
|
+
"name": "estudio_motion",
|
|
2193
|
+
"description": "A MAQUINA DE MOTION: voce so preenche o JSON (assunto, formato, marca, cenas) e ela monta no After Effects, poe os sons no tempo, mixa a -14 LUFS e confere os quadros. Prefira esta a escrever JSX. Tipos de cena: gancho{titulo,sub} celular{titulo,tela,toques[]} numero{valor,rotulo} lista{titulo,itens[]} antes_depois{antes,depois} icones{titulo,itens[]} citacao{texto,autor} cta{titulo,botao}. Marque a palavra-chave com *asteriscos*. Sem cenas, ela monta o roteiro padrao do assunto.",
|
|
2194
|
+
"parameters": {
|
|
2195
|
+
"type": "object",
|
|
2196
|
+
"properties": {
|
|
2197
|
+
"id": {
|
|
2198
|
+
"type": "string"
|
|
2199
|
+
},
|
|
2200
|
+
"assunto": {
|
|
2201
|
+
"type": "string",
|
|
2202
|
+
"description": "O tema do video"
|
|
2203
|
+
},
|
|
2204
|
+
"receita": {
|
|
2205
|
+
"type": "string",
|
|
2206
|
+
"description": "id de estudio_midia acao:\"projetos\": segue o formato e a duracao da ficha"
|
|
2207
|
+
},
|
|
2208
|
+
"formato": {
|
|
2209
|
+
"type": "string",
|
|
2210
|
+
"enum": [
|
|
2211
|
+
"9:16",
|
|
2212
|
+
"1:1",
|
|
2213
|
+
"16:9"
|
|
2214
|
+
]
|
|
2215
|
+
},
|
|
2216
|
+
"duracao": {
|
|
2217
|
+
"type": "number",
|
|
2218
|
+
"description": "Segundos (6 a 60); padrao 15"
|
|
2219
|
+
},
|
|
2220
|
+
"marca": {
|
|
2221
|
+
"type": "object",
|
|
2222
|
+
"description": "{cores:{fundo,destaque,tinta}, fontes:{titulo,texto,destaque}}; sem marca a paleta sai do assunto"
|
|
2223
|
+
},
|
|
2224
|
+
"cenas": {
|
|
2225
|
+
"type": "array",
|
|
2226
|
+
"items": {
|
|
2227
|
+
"type": "object"
|
|
2228
|
+
},
|
|
2229
|
+
"description": "[{tipo, dur, ...campos do tipo}]; de 1 a 2,5 s por cena e no minimo 5 cenas para 15 s"
|
|
2230
|
+
},
|
|
2231
|
+
"voz": {
|
|
2232
|
+
"type": "string",
|
|
2233
|
+
"description": "O texto a narrar; opcional"
|
|
2234
|
+
},
|
|
2235
|
+
"trilha": {
|
|
2236
|
+
"type": "string",
|
|
2237
|
+
"description": "O que buscar de trilha livre (\"upbeat lofi\"); opcional"
|
|
2238
|
+
},
|
|
2239
|
+
"formatos": {
|
|
2240
|
+
"type": "array",
|
|
2241
|
+
"items": {
|
|
2242
|
+
"type": "string",
|
|
2243
|
+
"enum": [
|
|
2244
|
+
"9:16",
|
|
2245
|
+
"1:1",
|
|
2246
|
+
"16:9"
|
|
2247
|
+
]
|
|
2248
|
+
},
|
|
2249
|
+
"description": "Versoes extras no pacote entrega/ (fundo desfocado, nunca estica)"
|
|
2250
|
+
},
|
|
2251
|
+
"entrega": {
|
|
2252
|
+
"type": "boolean",
|
|
2253
|
+
"description": "Pacote pra postar (mp4, capa, legenda .srt, post.txt); padrao true"
|
|
2254
|
+
}
|
|
2255
|
+
},
|
|
2256
|
+
"required": [
|
|
2257
|
+
"id"
|
|
2258
|
+
]
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
},
|
|
2262
|
+
{
|
|
2263
|
+
"type": "function",
|
|
2264
|
+
"function": {
|
|
2265
|
+
"name": "estudio_editar",
|
|
2266
|
+
"description": "EDITOR POR COMANDO: muda um video que o estudio_motion fez, sem refazer do zero, e guarda versoes (v1, v2...). id_video = o id do projeto. mudancas = lista de {op,...} (cena conta de 1): texto {cena:2,campo:'titulo',valor:'X'} ou {de,para}; cor {fundo,destaque,tinta em #hex} ou {paleta:'nome'}; fonte {titulo,texto,destaque}; ritmo {fator:0.8} (<1 mais rapido, >1 mais lento); duracao {cena,segundos} ou {total}; remover {cena}; mover {cena,para}; duplicar {cena,para?}; trilha {valor:false} (sem musica) ou {valor:'lofi calmo'}; volume {alvo:'voz'|'trilha'|'sfx',db:-6}; formato {valor:'16:9'}. Exemplos: 'deixa mais rapido' -> [{op:'ritmo',fator:0.8}]; 'tira a musica' -> [{op:'trilha',valor:false}]; 'troca o titulo da cena 2 por Oi' -> [{op:'texto',cena:2,valor:'Oi'}]; 'voz mais alta' -> [{op:'volume',alvo:'voz',db:4}]; 'faz em horizontal' -> [{op:'formato',valor:'16:9'}]. previa:true renderiza rascunho em segundos; final:true renderiza a versao atual em qualidade final; voltar_para:N volta a uma versao; listar:true mostra as versoes. Com narracao o tempo e da voz: ritmo/duracao/remover/mover/duplicar nao valem.",
|
|
2267
|
+
"parameters": {
|
|
2268
|
+
"type": "object",
|
|
2269
|
+
"properties": {
|
|
2270
|
+
"id_video": {
|
|
2271
|
+
"type": "string",
|
|
2272
|
+
"description": "id do projeto do video"
|
|
2273
|
+
},
|
|
2274
|
+
"mudancas": {
|
|
2275
|
+
"type": "array",
|
|
2276
|
+
"items": {
|
|
2277
|
+
"type": "object"
|
|
2278
|
+
},
|
|
2279
|
+
"description": "[{op:'texto'|'cor'|'fonte'|'ritmo'|'duracao'|'remover'|'mover'|'duplicar'|'trilha'|'volume'|'formato', ...}]"
|
|
2280
|
+
},
|
|
2281
|
+
"previa": {
|
|
2282
|
+
"type": "boolean",
|
|
2283
|
+
"description": "rascunho rapido (meia resolucao, sem mix final)"
|
|
2284
|
+
},
|
|
2285
|
+
"final": {
|
|
2286
|
+
"type": "boolean",
|
|
2287
|
+
"description": "render em qualidade final da versao atual"
|
|
2288
|
+
},
|
|
2289
|
+
"voltar_para": {
|
|
2290
|
+
"type": "number",
|
|
2291
|
+
"description": "numero da versao (1, 2...)"
|
|
2292
|
+
},
|
|
2293
|
+
"listar": {
|
|
2294
|
+
"type": "boolean"
|
|
2295
|
+
}
|
|
2296
|
+
},
|
|
2297
|
+
"required": [
|
|
2298
|
+
"id_video"
|
|
2299
|
+
]
|
|
2300
|
+
}
|
|
2301
|
+
}
|
|
2302
|
+
},
|
|
1928
2303
|
{
|
|
1929
2304
|
"type": "function",
|
|
1930
2305
|
"function": {
|
|
@@ -2010,7 +2385,7 @@
|
|
|
2010
2385
|
"type": "function",
|
|
2011
2386
|
"function": {
|
|
2012
2387
|
"name": "estudio_render",
|
|
2013
|
-
"description": "Vira o arquivo (.mp4 no video, .pdf em slides e arte) e abre para o usuario.",
|
|
2388
|
+
"description": "Vira o arquivo (.mp4 no video, .pdf em slides e arte) e abre para o usuario. motor:\"hyperframes\" + html:\"<pasta>\" renderiza uma composicao HTML (index.html, GSAP/CSS/three.js) que voce escreveu; ela le midia/ do projeto.",
|
|
2014
2389
|
"parameters": {
|
|
2015
2390
|
"type": "object",
|
|
2016
2391
|
"properties": {
|
|
@@ -2020,6 +2395,17 @@
|
|
|
2020
2395
|
"paginas": {
|
|
2021
2396
|
"type": "boolean",
|
|
2022
2397
|
"description": "Forca paginas paradas"
|
|
2398
|
+
},
|
|
2399
|
+
"motor": {
|
|
2400
|
+
"type": "string",
|
|
2401
|
+
"enum": [
|
|
2402
|
+
"remotion",
|
|
2403
|
+
"hyperframes"
|
|
2404
|
+
]
|
|
2405
|
+
},
|
|
2406
|
+
"html": {
|
|
2407
|
+
"type": "string",
|
|
2408
|
+
"description": "hyperframes: a pasta com index.html"
|
|
2023
2409
|
}
|
|
2024
2410
|
},
|
|
2025
2411
|
"required": [
|
|
@@ -2471,4 +2857,4 @@
|
|
|
2471
2857
|
}
|
|
2472
2858
|
}
|
|
2473
2859
|
]
|
|
2474
|
-
}
|
|
2860
|
+
}
|
package/lib/local/entrada.js
CHANGED
|
@@ -88,6 +88,13 @@ const GRUPOS = [
|
|
|
88
88
|
tools: ['estudio_video'],
|
|
89
89
|
gatilho: /\b(grava[çc][ãa]o|gravei|filmagem|filmei|meu v[íi]deo|edit\w* (o |a |meu |minha |esse |essa |este |esta )?(v[íi]deo|grava[çc][ãa]o)|\.mp4|\.mov|legendas?|cort(a|ar|e) (o )?sil[êe]ncio|recort(a|ar|e) (a )?pessoa|transcrev\w*|importa\w* (o )?v[íi]deo)\b/i,
|
|
90
90
|
},
|
|
91
|
+
{
|
|
92
|
+
/* O motor After Effects só entra quando o pedido o chama: o esquema
|
|
93
|
+
dele pesa no teto do minuto e "faz um vídeo" não precisa dele. */
|
|
94
|
+
nome: 'after-effects',
|
|
95
|
+
tools: ['estudio_ae', 'estudio_motion', 'estudio_editar'],
|
|
96
|
+
gatilho: /\b(after ?effects?|aftereffects|\bae\b|effectcraft|extendscript|\.jsx|keyframes?|express[ãa]o do ae|motion( design| graphics?)?|an[uú]ncio animado|vinheta|reels?|estudio_motion|estudio_editar|editor de v[íi]deo|pr[ée]via|deixa mais (r[áa]pido|lento)|tira a m[úu]sica|troca (o|a) (t[íi]tulo|cor|fonte|m[úu]sica))\b/i,
|
|
97
|
+
},
|
|
91
98
|
{
|
|
92
99
|
nome: 'navegador',
|
|
93
100
|
tools: ['browser_open', 'browser_click', 'browser_type', 'browser_key',
|
|
@@ -154,7 +161,7 @@ const GRUPOS = [
|
|
|
154
161
|
ASSUNTO (o que costuma ter partes) e pelo TAMANHO (ver `ehGrande`). */
|
|
155
162
|
nome: 'delegar',
|
|
156
163
|
tools: ['spawn_agent'],
|
|
157
|
-
gatilho: /\b(v[áa]rios|v[áa]rias|todos os|todas as|em paralelo|projeto inteiro|refator\w*|migra[çc][ãa]o|auditor\w*|e tamb[ée]m|e depois|al[ée]m disso|sistema|plataforma|complet[oa]|backend|frontend|front e back|full.?stack|testes|telas|m[óo]dulos|camadas|arquivos|crud|api e
|
|
164
|
+
gatilho: /\b(v[áa]rios|v[áa]rias|todos os|todas as|em paralelo|projeto inteiro|refator\w*|migra[çc][ãa]o|auditor\w*|e tamb[ée]m|e depois|al[ée]m disso|sistema|plataforma|complet[oa]|backend|frontend|front e back|full.?stack|testes|telas|m[óo]dulos|camadas|arquivos|crud|api e)\b/i, // sem "site", "app", "aplicativo": casavam com quase todo pedido (13/10)
|
|
158
165
|
},
|
|
159
166
|
{
|
|
160
167
|
nome: 'terminal',
|
|
@@ -189,7 +196,14 @@ function gruposDe(texto, forcar = []) {
|
|
|
189
196
|
// Pedido grande delega mesmo sem a palavra certa. E quem pode construir
|
|
190
197
|
// um app inteiro também pode dividir: as duas saídas vão juntas, e a
|
|
191
198
|
// seção de delegar diz quando é cada uma.
|
|
192
|
-
|
|
199
|
+
/* O TIME SÓ EM PEDIDO GRANDE (13/10: "como fazer a cota não acabar?").
|
|
200
|
+
"Faz um site de portfólio" ganhava o construir_app e o spawn_agent, e o
|
|
201
|
+
modelo os usava: 22 chamadas, 6 de subagente, para um site de uma página.
|
|
202
|
+
Cada subagente é mais pedidos na cota grátis. Pedido pequeno: um agente. */
|
|
203
|
+
const grande = ehGrande(t);
|
|
204
|
+
if (!grande) escolhidos.delete('pipeline');
|
|
205
|
+
// O spawn_agent segue o gatilho dele (backend e frontend, várias telas…); o pedido grande também o ganha.
|
|
206
|
+
if (grande) escolhidos.add('delegar');
|
|
193
207
|
// Antes de clicar, o MCP: quem vai mexer no navegador ou no desktop leva os conectores.
|
|
194
208
|
if (escolhidos.has('navegador') || escolhidos.has('computador')) escolhidos.add('mcp');
|
|
195
209
|
return escolhidos;
|
|
@@ -348,11 +362,27 @@ function referenciasProtegidas(messages) {
|
|
|
348
362
|
return new Set(ultima.values());
|
|
349
363
|
}
|
|
350
364
|
|
|
365
|
+
/* O QUE FOI FEITO NÃO SOME (13/10: "continua lendo e listando coisas
|
|
366
|
+
desnecessárias"). Com ~1.900 tokens de conversa, as leituras velhas saíam
|
|
367
|
+
inteiras e o modelo, sem saber que já tinha lido, lia de novo. Agora o
|
|
368
|
+
resultado encurtado diz o que era, e a rodada descartada vira uma linha no
|
|
369
|
+
pedido: "você já fez isto, não repita". */
|
|
370
|
+
const LEITURAS = new Set(['read_file', 'list_dir', 'glob', 'grep']);
|
|
371
|
+
function chamadaCurta(tc) {
|
|
372
|
+
const f = (tc && tc.function) || {};
|
|
373
|
+
let a = {};
|
|
374
|
+
try { a = JSON.parse(f.arguments || '{}'); } catch { /* argumento ilegível */ }
|
|
375
|
+
const alvo = a.path || a.pattern || a.query || a.command || a.id || '';
|
|
376
|
+
return `${f.name || '?'}${alvo ? ' ' + String(alvo).slice(0, 50) : ''}`;
|
|
377
|
+
}
|
|
378
|
+
|
|
351
379
|
function caberNoTeto(messages, sobra) {
|
|
352
380
|
const conta = (m) => tokensDe(m);
|
|
353
381
|
if (conta(messages) <= sobra) return { messages, cortou: false };
|
|
354
382
|
|
|
355
383
|
let atual = messages.map((m) => ({ ...m }));
|
|
384
|
+
const chamadaDe = new Map();
|
|
385
|
+
for (const m of atual) if (m.role === 'assistant' && Array.isArray(m.tool_calls)) for (const tc of m.tool_calls) chamadaDe.set(tc.id, tc);
|
|
356
386
|
|
|
357
387
|
// 1 e 2: encurtar resultados antigos, em dois apertos.
|
|
358
388
|
const protegidas = referenciasProtegidas(atual);
|
|
@@ -369,6 +399,11 @@ function caberNoTeto(messages, sobra) {
|
|
|
369
399
|
}
|
|
370
400
|
if (m.role !== 'tool' || manterInteiros.has(i)) return m;
|
|
371
401
|
if (texto.length <= limite) return m;
|
|
402
|
+
const tc = chamadaDe.get(m.tool_call_id);
|
|
403
|
+
if (tc && LEITURAS.has((tc.function || {}).name)) {
|
|
404
|
+
const linhas = texto.split('\n').length;
|
|
405
|
+
return { ...m, content: `[já lido: ${chamadaCurta(tc)}, ${linhas} linhas — saiu daqui para caber no plano. Não leia de novo; releia só se for editar ESTE arquivo agora.]` };
|
|
406
|
+
}
|
|
372
407
|
return { ...m, content: texto.slice(0, limite) + '…(encurtado para caber no limite do plano)' };
|
|
373
408
|
});
|
|
374
409
|
if (conta(atual) <= sobra) return { messages: atual, cortou: true, como: 'encurtou resultados antigos' };
|
|
@@ -390,6 +425,15 @@ function caberNoTeto(messages, sobra) {
|
|
|
390
425
|
while (fim < atual.length && atual[fim].role === 'tool') fim++;
|
|
391
426
|
// Nunca engolir tudo: para se sobrar só o pedido do usuário.
|
|
392
427
|
if (fim >= atual.length - 1) break;
|
|
428
|
+
// A rodada sai, o rastro fica: uma linha no último pedido antes dela.
|
|
429
|
+
const feitas = (atual[primeiroAssistente].tool_calls || []).map(chamadaCurta);
|
|
430
|
+
let u = primeiroAssistente - 1;
|
|
431
|
+
while (u >= 0 && atual[u].role !== 'user') u--;
|
|
432
|
+
if (u >= 0 && feitas.length && typeof atual[u].content === 'string') {
|
|
433
|
+
const marca = '\n\n[você já fez, e saiu da conversa para caber no plano: ';
|
|
434
|
+
const c = atual[u].content;
|
|
435
|
+
atual[u] = { ...atual[u], content: c.includes(marca) ? c.replace(/\. Não repita\.\]\s*$/, '; ' + feitas.join('; ') + '. Não repita.]') : c + marca + feitas.join('; ') + '. Não repita.]' };
|
|
436
|
+
}
|
|
393
437
|
atual = [...atual.slice(0, primeiroAssistente), ...atual.slice(fim)];
|
|
394
438
|
}
|
|
395
439
|
|