primocode 11.0.0 → 11.2.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 (3879) hide show
  1. package/README.md +18 -4
  2. package/agentes/algoritmos.md +10 -0
  3. package/agentes/angular.md +10 -0
  4. package/agentes/animacao-web.md +10 -0
  5. package/agentes/anuncios.md +10 -0
  6. package/agentes/apresentacao.md +10 -0
  7. package/agentes/arquitetura.md +10 -0
  8. package/agentes/audio.md +10 -0
  9. package/agentes/auth.md +10 -0
  10. package/agentes/automacao.md +10 -0
  11. package/agentes/bash.md +10 -0
  12. package/agentes/blockchain.md +10 -0
  13. package/agentes/brand.md +10 -0
  14. package/agentes/canvas.md +10 -0
  15. package/agentes/ci-cd.md +10 -0
  16. package/agentes/cloud.md +10 -0
  17. package/agentes/cores.md +10 -0
  18. package/agentes/cpp.md +10 -0
  19. package/agentes/csharp.md +10 -0
  20. package/agentes/css-layout.md +1 -1
  21. package/agentes/dados-sql-analise.md +10 -0
  22. package/agentes/depuracao.md +1 -1
  23. package/agentes/design-system.md +10 -0
  24. package/agentes/docker.md +10 -0
  25. package/agentes/electron.md +10 -0
  26. package/agentes/email-mkt.md +10 -0
  27. package/agentes/extensao-chrome.md +10 -0
  28. package/agentes/filas.md +10 -0
  29. package/agentes/firebase.md +10 -0
  30. package/agentes/flutter.md +10 -0
  31. package/agentes/games.md +10 -0
  32. package/agentes/geral/capacidades/backend.json +246 -0
  33. package/agentes/geral/capacidades/banco.json +186 -0
  34. package/agentes/geral/capacidades/codigo.json +576 -0
  35. package/agentes/geral/capacidades/depuracao.json +570 -0
  36. package/agentes/geral/capacidades/design.json +246 -0
  37. package/agentes/geral/capacidades/devops.json +240 -0
  38. package/agentes/geral/capacidades/frontend.json +252 -0
  39. package/agentes/geral/capacidades/git.json +558 -0
  40. package/agentes/geral/capacidades/ia-llm.json +246 -0
  41. package/agentes/geral/capacidades/marketing.json +252 -0
  42. package/agentes/geral/capacidades/mobile.json +192 -0
  43. package/agentes/geral/capacidades/produto-negocio.json +186 -0
  44. package/agentes/geral/capacidades/shell.json +522 -0
  45. package/agentes/geral/capacidades/testes.json +186 -0
  46. package/agentes/geral/capacidades/video-motion.json +246 -0
  47. package/agentes/geral/capacidades/windows-linux.json +216 -0
  48. package/agentes/go.md +10 -0
  49. package/agentes/graphql.md +10 -0
  50. package/agentes/growth.md +10 -0
  51. package/agentes/ia-evals.md +10 -0
  52. package/agentes/ilustracao.md +10 -0
  53. package/agentes/indice.md +1 -86
  54. package/agentes/iot.md +10 -0
  55. package/agentes/java.md +10 -0
  56. package/agentes/javascript.md +10 -0
  57. package/agentes/juridico-basico.md +10 -0
  58. package/agentes/kotlin.md +10 -0
  59. package/agentes/kubernetes.md +10 -0
  60. package/agentes/landing.md +10 -0
  61. package/agentes/legado.md +10 -0
  62. package/agentes/linux.md +10 -0
  63. package/agentes/llm-prompts.md +10 -0
  64. package/agentes/mcp.md +10 -0
  65. package/agentes/ml.md +10 -0
  66. package/agentes/mongodb.md +10 -0
  67. package/agentes/motion.md +10 -0
  68. package/agentes/negocio.md +10 -0
  69. package/agentes/observabilidade.md +10 -0
  70. package/agentes/orm.md +10 -0
  71. package/agentes/pagamentos.md +10 -0
  72. package/agentes/pentest.md +10 -0
  73. package/agentes/performance.md +1 -1
  74. package/agentes/pesquisa-usuario.md +10 -0
  75. package/agentes/php.md +10 -0
  76. package/agentes/planilhas.md +10 -0
  77. package/agentes/privacidade.md +10 -0
  78. package/agentes/produto.md +10 -0
  79. package/agentes/pwa.md +10 -0
  80. package/agentes/qa-manual.md +10 -0
  81. package/agentes/raspagem.md +10 -0
  82. package/agentes/react-native.md +10 -0
  83. package/agentes/rede.md +10 -0
  84. package/agentes/redis.md +10 -0
  85. package/agentes/regex.md +10 -0
  86. package/agentes/revisao-texto.md +10 -0
  87. package/agentes/ruby.md +10 -0
  88. package/agentes/rust.md +10 -0
  89. package/agentes/seo.md +10 -0
  90. package/agentes/social.md +10 -0
  91. package/agentes/svelte.md +10 -0
  92. package/agentes/swift.md +10 -0
  93. package/agentes/tailwind.md +10 -0
  94. package/agentes/testes-carga.md +10 -0
  95. package/agentes/testes-e2e.md +10 -0
  96. package/agentes/testes-unit.md +10 -0
  97. package/agentes/thumbnails.md +10 -0
  98. package/agentes/tipografia.md +10 -0
  99. package/agentes/traducao.md +10 -0
  100. package/agentes/ui-mobile.md +10 -0
  101. package/agentes/video-edicao.md +10 -0
  102. package/agentes/video-roteiro.md +10 -0
  103. package/agentes/visualizacao.md +10 -0
  104. package/agentes/vue.md +10 -0
  105. package/agentes/web3d.md +10 -0
  106. package/agentes/websocket.md +10 -0
  107. package/bin/primocode-rpc.js +100 -0
  108. package/bin/primocode.js +3 -4209
  109. package/editor/modelo-projeto/build.py +12 -4
  110. package/kits/KITS.md +4 -0
  111. package/lib/agentes/index.js +47 -4
  112. package/lib/agentes/nucleo.js +1 -1
  113. package/lib/agentes-pessoais.js +117 -0
  114. package/lib/agents-md.js +1 -1
  115. package/lib/app-chat.js +1 -1
  116. package/lib/app-server/cli.js +61 -0
  117. package/lib/app-server/index.js +3 -0
  118. package/lib/app-server/pareamento.js +61 -0
  119. package/lib/app-server/protocolo.js +86 -0
  120. package/lib/app-server/servidor.js +685 -0
  121. package/lib/app-server/websocket.js +87 -0
  122. package/lib/avisos.js +64 -0
  123. package/lib/backup-banco.js +1 -1
  124. package/lib/browser.js +7 -3
  125. package/lib/cli/boas-vindas.js +153 -0
  126. package/lib/cli/comando-api.js +85 -0
  127. package/lib/cli/comandos-extra.js +553 -0
  128. package/lib/cli/comandos.js +104 -0
  129. package/lib/cli/headless.js +102 -0
  130. package/lib/cli/sessao.js +4179 -0
  131. package/lib/cli/statusline.js +52 -0
  132. package/lib/cli/util.js +2 -2
  133. package/lib/cli-nova.js +237 -0
  134. package/lib/conferir.js +4 -4
  135. package/lib/config/config.js +419 -0
  136. package/lib/config/limites.js +100 -0
  137. package/lib/cursor.js +3 -3
  138. package/lib/diff.js +1 -1
  139. package/lib/effort.js +1 -1
  140. package/lib/entrega.js +1 -1
  141. package/lib/escopo.js +1 -1
  142. package/lib/explicar.js +1 -1
  143. package/lib/fala.js +2 -2
  144. package/lib/guardar.js +2 -2
  145. package/lib/mcp/mcp.js +819 -0
  146. package/lib/memoria-usuario.js +1 -1
  147. package/lib/motor/aprovacao.js +114 -0
  148. package/lib/motor/eventos.js +77 -0
  149. package/lib/motor/index.js +8 -0
  150. package/lib/motor/tela-terminal.js +64 -0
  151. package/lib/motor/turno.js +43 -0
  152. package/lib/motor/voz.js +65 -0
  153. package/lib/mudou.js +1 -1
  154. package/lib/nome-projeto.js +1 -1
  155. package/lib/nuvem.js +2 -2
  156. package/lib/permission/perigo.js +401 -0
  157. package/lib/permission/permissao.js +137 -0
  158. package/lib/permission/sandbox.js +252 -0
  159. package/lib/piloto.js +39 -0
  160. package/lib/placar.js +1 -1
  161. package/lib/plano-previo.js +1 -1
  162. package/lib/plugin/auto-preview.js +71 -0
  163. package/lib/plugin/autoteste.js +1 -0
  164. package/lib/plugin/desktop.js +756 -0
  165. package/lib/plugin/editor-pro-maquina.js +355 -0
  166. package/lib/plugin/editor-pro.js +1022 -0
  167. package/lib/plugin/entregaveis/carrossel.js +93 -0
  168. package/lib/plugin/entregaveis/cartaz.js +112 -0
  169. package/lib/plugin/entregaveis/cli.js +36 -0
  170. package/lib/plugin/entregaveis/documento.js +169 -0
  171. package/lib/plugin/entregaveis/especialistas.js +72 -0
  172. package/lib/plugin/entregaveis/nucleo.js +243 -0
  173. package/lib/plugin/entregaveis/slides.js +232 -0
  174. package/lib/plugin/estudio/acervo.js +418 -0
  175. package/lib/plugin/estudio/assets.js +497 -0
  176. package/lib/plugin/estudio/assinatura.js +108 -0
  177. package/lib/plugin/estudio/conferencia-visual.js +76 -0
  178. package/lib/plugin/estudio/conferir-quadros.js +56 -0
  179. package/lib/plugin/estudio/cota.js +157 -0
  180. package/lib/plugin/estudio/criar.js +113 -0
  181. package/lib/plugin/estudio/diretor.js +392 -0
  182. package/lib/plugin/estudio/editor.js +290 -0
  183. package/lib/plugin/estudio/gosto-descrever.js +87 -0
  184. package/lib/plugin/estudio/gosto.js +608 -0
  185. package/lib/plugin/estudio/historico.js +60 -0
  186. package/lib/plugin/estudio/identidade.js +560 -0
  187. package/lib/plugin/estudio/index.js +2725 -0
  188. package/lib/plugin/estudio/kit.js +91 -0
  189. package/lib/plugin/estudio/kits-tela.js +199 -0
  190. package/lib/plugin/estudio/kokoro.js +127 -0
  191. package/lib/plugin/estudio/maquina-foto.js +177 -0
  192. package/lib/plugin/estudio/maquina-trilha.js +199 -0
  193. package/lib/plugin/estudio/maquina-voz.js +429 -0
  194. package/lib/plugin/estudio/marca.js +398 -0
  195. package/lib/plugin/estudio/materiais.js +218 -0
  196. package/lib/plugin/estudio/miniatura.js +56 -0
  197. package/lib/plugin/estudio/morfar.js +191 -0
  198. package/lib/plugin/estudio/print-site.js +341 -0
  199. package/lib/plugin/estudio/projeto.js +340 -0
  200. package/lib/plugin/estudio/projetos.js +72 -0
  201. package/lib/plugin/kits-parecidos.js +99 -0
  202. package/lib/plugin/kits.js +585 -0
  203. package/lib/plugin/marca-kit.js +312 -0
  204. package/lib/plugin/motioncraft.js +67 -0
  205. package/lib/plugin/pesquisar.js +7 -4
  206. package/lib/plugin/video/analise.js +89 -0
  207. package/lib/plugin/video/auto.js +344 -0
  208. package/lib/plugin/video/catalogo.js +20 -0
  209. package/lib/plugin/video/mutar.js +28 -0
  210. package/lib/plugin/video/ops-fx.js +453 -0
  211. package/lib/plugin/video/ops.js +373 -0
  212. package/lib/plugin/video/pedido.js +191 -0
  213. package/lib/plugin/video/projeto.js +133 -0
  214. package/lib/plugin/video/rastrear.js +95 -0
  215. package/lib/plugin/video/render.js +274 -0
  216. package/lib/plugin/video/transcript.js +124 -0
  217. package/lib/plugin/video/zoom.js +275 -0
  218. package/lib/plugin/voz-ponte.js +15 -0
  219. package/lib/plugin/voz.js +532 -0
  220. package/lib/porta.js +4 -4
  221. package/lib/pre-leitura.js +2 -2
  222. package/lib/preparar.js +11 -11
  223. package/lib/projetos-meta.js +90 -0
  224. package/lib/provider/api.js +310 -0
  225. package/lib/provider/claude-engine.js +673 -0
  226. package/lib/provider/codex-engine.js +225 -0
  227. package/lib/provider/local/motor-cli.js +93 -0
  228. package/lib/provider/local/motor.js +267 -0
  229. package/lib/provider/local/provedor.js +169 -0
  230. package/lib/publicar.js +2 -2
  231. package/lib/qr.js +209 -0
  232. package/lib/registro.js +2 -2
  233. package/lib/repeticao.js +2 -2
  234. package/lib/segredos.js +2 -2
  235. package/lib/session/checkpoint-git.js +221 -0
  236. package/lib/session/checkpoint.js +366 -0
  237. package/lib/session/compactacao.js +1 -1
  238. package/lib/session/exportar-conversa.js +49 -0
  239. package/lib/session/linha-do-tempo.js +130 -0
  240. package/lib/session/runner/act.js +2562 -0
  241. package/lib/skill/catalogo.js +369 -0
  242. package/lib/skill/marketplace.js +189 -0
  243. package/lib/skill/skills.js +468 -0
  244. package/lib/team.js +4 -4
  245. package/lib/tool/diagnostico.js +14 -3
  246. package/lib/tool/lsp.js +211 -0
  247. package/lib/tool/perguntar.js +55 -1
  248. package/lib/tool/tools.js +1101 -0
  249. package/lib/trava.js +1 -1
  250. package/lib/travado.js +1 -1
  251. package/lib/tui/entrada.js +1031 -0
  252. package/lib/tui/tela.js +245 -0
  253. package/lib/tui/ui.js +763 -0
  254. package/materiais/adesivos/base.ts +101 -0
  255. package/materiais/adesivos/camera/CameraDeriva.tsx +37 -0
  256. package/materiais/adesivos/cores/paleta.json +30 -0
  257. package/materiais/adesivos/cores/paleta.png +0 -0
  258. package/materiais/adesivos/formas/AdesivoForma.tsx +42 -0
  259. package/materiais/adesivos/formas/AdesivoFoto.tsx +36 -0
  260. package/materiais/adesivos/formas/SeloPreco.tsx +38 -0
  261. package/materiais/adesivos/pecas.json +496 -0
  262. package/materiais/adesivos/referencia/analise.md +85 -0
  263. package/materiais/adesivos/referencia/quadro-1.png +0 -0
  264. package/materiais/adesivos/referencia/quadro-2.png +0 -0
  265. package/materiais/adesivos/referencia/quadro-3.png +0 -0
  266. package/materiais/adesivos/referencia/quadro-4.png +0 -0
  267. package/materiais/adesivos/referencia/referencia.mp4 +0 -0
  268. package/materiais/adesivos/regras.md +138 -0
  269. package/materiais/adesivos/sons/Som.tsx +33 -0
  270. package/materiais/adesivos/texturas/ChuvaDeAdesivos.tsx +29 -0
  271. package/materiais/adesivos/texturas/Fundo.tsx +21 -0
  272. package/materiais/adesivos/texturas/Particulas.tsx +22 -0
  273. package/materiais/adesivos/tipografia/AdesivoTexto.tsx +35 -0
  274. package/materiais/adesivos/tipografia/AssinaturaMarca.tsx +36 -0
  275. package/materiais/adesivos/tipografia/TituloEtiquetas.tsx +33 -0
  276. package/materiais/adesivos/transicoes/Cena.tsx +48 -0
  277. package/materiais/adesivos/transicoes/CorteImpacto.tsx +16 -0
  278. package/materiais/antes-depois/base.ts +82 -0
  279. package/materiais/antes-depois/camera/CameraDeriva.tsx +37 -0
  280. package/materiais/antes-depois/cores/paleta.json +28 -0
  281. package/materiais/antes-depois/cores/paleta.png +0 -0
  282. package/materiais/antes-depois/formas/BarraMedidor.tsx +43 -0
  283. package/materiais/antes-depois/formas/FaixaMarquee.tsx +35 -0
  284. package/materiais/antes-depois/formas/ListaMudancas.tsx +37 -0
  285. package/materiais/antes-depois/formas/RotuloAntesDepois.tsx +26 -0
  286. package/materiais/antes-depois/formas/TelaDividida.tsx +68 -0
  287. package/materiais/antes-depois/pecas.json +520 -0
  288. package/materiais/antes-depois/referencia/analise.md +85 -0
  289. package/materiais/antes-depois/referencia/quadro-1.png +0 -0
  290. package/materiais/antes-depois/referencia/quadro-2.png +0 -0
  291. package/materiais/antes-depois/referencia/quadro-3.png +0 -0
  292. package/materiais/antes-depois/referencia/quadro-4.png +0 -0
  293. package/materiais/antes-depois/referencia/referencia.mp4 +0 -0
  294. package/materiais/antes-depois/regras.md +141 -0
  295. package/materiais/antes-depois/sons/Som.tsx +40 -0
  296. package/materiais/antes-depois/texturas/Fundo.tsx +24 -0
  297. package/materiais/antes-depois/texturas/Particulas.tsx +22 -0
  298. package/materiais/antes-depois/tipografia/NumeroDelta.tsx +36 -0
  299. package/materiais/antes-depois/transicoes/Cena.tsx +41 -0
  300. package/materiais/antes-depois/transicoes/CorteImpacto.tsx +16 -0
  301. package/materiais/apple-tipografico/base.ts +111 -0
  302. package/materiais/apple-tipografico/camera/Camera.tsx +23 -0
  303. package/materiais/apple-tipografico/camera/CameraDeriva.tsx +37 -0
  304. package/materiais/apple-tipografico/cores/paleta.json +21 -0
  305. package/materiais/apple-tipografico/cores/paleta.png +0 -0
  306. package/materiais/apple-tipografico/formas/CartaoRadial.tsx +41 -0
  307. package/materiais/apple-tipografico/formas/Produto3D.tsx +126 -0
  308. package/materiais/apple-tipografico/formas/ProdutoFoto.tsx +47 -0
  309. package/materiais/apple-tipografico/lib/produto3d-apoio.ts +22 -0
  310. package/materiais/apple-tipografico/pecas.json +491 -0
  311. package/materiais/apple-tipografico/referencia/analise.md +87 -0
  312. package/materiais/apple-tipografico/referencia/quadro-1.png +0 -0
  313. package/materiais/apple-tipografico/referencia/quadro-2.png +0 -0
  314. package/materiais/apple-tipografico/referencia/quadro-3.png +0 -0
  315. package/materiais/apple-tipografico/referencia/quadro-4.png +0 -0
  316. package/materiais/apple-tipografico/referencia/referencia.mp4 +0 -0
  317. package/materiais/apple-tipografico/regras.md +171 -0
  318. package/materiais/apple-tipografico/sons/Som.tsx +40 -0
  319. package/materiais/apple-tipografico/texturas/Fundo.tsx +21 -0
  320. package/materiais/apple-tipografico/texturas/Particulas.tsx +22 -0
  321. package/materiais/apple-tipografico/tipografia/AssinaturaPreta.tsx +33 -0
  322. package/materiais/apple-tipografico/tipografia/LegendaCurta.tsx +51 -0
  323. package/materiais/apple-tipografico/transicoes/Cena.tsx +55 -0
  324. package/materiais/apple-tipografico/transicoes/CorteImpacto.tsx +16 -0
  325. package/materiais/aquarela/base.ts +97 -0
  326. package/materiais/aquarela/camera/CameraDeriva.tsx +37 -0
  327. package/materiais/aquarela/cores/paleta.json +30 -0
  328. package/materiais/aquarela/cores/paleta.png +0 -0
  329. package/materiais/aquarela/formas/AnotacaoManual.tsx +40 -0
  330. package/materiais/aquarela/formas/ManchaTinta.tsx +46 -0
  331. package/materiais/aquarela/formas/Pincelada.tsx +43 -0
  332. package/materiais/aquarela/formas/Pingos.tsx +31 -0
  333. package/materiais/aquarela/pecas.json +498 -0
  334. package/materiais/aquarela/referencia/analise.md +87 -0
  335. package/materiais/aquarela/referencia/quadro-1.png +0 -0
  336. package/materiais/aquarela/referencia/quadro-2.png +0 -0
  337. package/materiais/aquarela/referencia/quadro-3.png +0 -0
  338. package/materiais/aquarela/referencia/quadro-4.png +0 -0
  339. package/materiais/aquarela/referencia/referencia.mp4 +0 -0
  340. package/materiais/aquarela/regras.md +141 -0
  341. package/materiais/aquarela/sons/Som.tsx +33 -0
  342. package/materiais/aquarela/texturas/Fundo.tsx +24 -0
  343. package/materiais/aquarela/texturas/PapelRasgado.tsx +50 -0
  344. package/materiais/aquarela/texturas/Particulas.tsx +22 -0
  345. package/materiais/aquarela/tipografia/AssinaturaMarca.tsx +33 -0
  346. package/materiais/aquarela/tipografia/TituloPincel.tsx +51 -0
  347. package/materiais/aquarela/transicoes/Cena.tsx +48 -0
  348. package/materiais/aquarela/transicoes/CorteImpacto.tsx +16 -0
  349. package/materiais/aurora/base.ts +93 -0
  350. package/materiais/aurora/camera/CameraDeriva.tsx +37 -0
  351. package/materiais/aurora/cores/paleta.json +30 -0
  352. package/materiais/aurora/cores/paleta.png +0 -0
  353. package/materiais/aurora/formas/CartaoVidro.tsx +29 -0
  354. package/materiais/aurora/formas/CeuEstrelado.tsx +22 -0
  355. package/materiais/aurora/formas/Montanhas.tsx +24 -0
  356. package/materiais/aurora/pecas.json +485 -0
  357. package/materiais/aurora/referencia/analise.md +84 -0
  358. package/materiais/aurora/referencia/quadro-1.png +0 -0
  359. package/materiais/aurora/referencia/quadro-2.png +0 -0
  360. package/materiais/aurora/referencia/quadro-3.png +0 -0
  361. package/materiais/aurora/referencia/quadro-4.png +0 -0
  362. package/materiais/aurora/referencia/referencia.mp4 +0 -0
  363. package/materiais/aurora/regras.md +140 -0
  364. package/materiais/aurora/sons/Som.tsx +33 -0
  365. package/materiais/aurora/texturas/Fundo.tsx +35 -0
  366. package/materiais/aurora/texturas/Particulas.tsx +22 -0
  367. package/materiais/aurora/tipografia/AssinaturaMarca.tsx +24 -0
  368. package/materiais/aurora/tipografia/Legenda.tsx +23 -0
  369. package/materiais/aurora/tipografia/TituloSerif.tsx +36 -0
  370. package/materiais/aurora/transicoes/Cena.tsx +48 -0
  371. package/materiais/aurora/transicoes/CorteImpacto.tsx +16 -0
  372. package/materiais/aurora/transicoes/CortinaDeLuz.tsx +36 -0
  373. package/materiais/bauhaus/base.ts +74 -0
  374. package/materiais/bauhaus/camera/Camera.tsx +21 -0
  375. package/materiais/bauhaus/camera/CameraDeriva.tsx +37 -0
  376. package/materiais/bauhaus/cores/paleta.json +27 -0
  377. package/materiais/bauhaus/cores/paleta.png +0 -0
  378. package/materiais/bauhaus/formas/BarraDiagonal.tsx +20 -0
  379. package/materiais/bauhaus/formas/ComposicaoGeometrica.tsx +54 -0
  380. package/materiais/bauhaus/formas/ListaFaixas.tsx +27 -0
  381. package/materiais/bauhaus/formas/Overlay.tsx +18 -0
  382. package/materiais/bauhaus/pecas.json +520 -0
  383. package/materiais/bauhaus/referencia/analise.md +81 -0
  384. package/materiais/bauhaus/referencia/quadro-1.png +0 -0
  385. package/materiais/bauhaus/referencia/quadro-2.png +0 -0
  386. package/materiais/bauhaus/referencia/quadro-3.png +0 -0
  387. package/materiais/bauhaus/referencia/quadro-4.png +0 -0
  388. package/materiais/bauhaus/referencia/referencia.mp4 +0 -0
  389. package/materiais/bauhaus/regras.md +127 -0
  390. package/materiais/bauhaus/sons/Som.tsx +30 -0
  391. package/materiais/bauhaus/texturas/Fundo.tsx +13 -0
  392. package/materiais/bauhaus/texturas/Particulas.tsx +22 -0
  393. package/materiais/bauhaus/tipografia/AssinaturaMarca.tsx +26 -0
  394. package/materiais/bauhaus/tipografia/NumeroBauhaus.tsx +21 -0
  395. package/materiais/bauhaus/tipografia/TituloBauhaus.tsx +32 -0
  396. package/materiais/bauhaus/transicoes/Cena.tsx +36 -0
  397. package/materiais/bauhaus/transicoes/CorteImpacto.tsx +16 -0
  398. package/materiais/brutalista/base.ts +71 -0
  399. package/materiais/brutalista/camera/CameraDeriva.tsx +37 -0
  400. package/materiais/brutalista/cores/paleta.json +25 -0
  401. package/materiais/brutalista/cores/paleta.png +0 -0
  402. package/materiais/brutalista/formas/BlocoSombra.tsx +18 -0
  403. package/materiais/brutalista/formas/CartaoFotoBruto.tsx +19 -0
  404. package/materiais/brutalista/formas/FitaAlerta.tsx +20 -0
  405. package/materiais/brutalista/formas/ListaBruta.tsx +23 -0
  406. package/materiais/brutalista/formas/MonoEnorme.tsx +43 -0
  407. package/materiais/brutalista/formas/QuadroCor.tsx +14 -0
  408. package/materiais/brutalista/formas/Terminal.tsx +25 -0
  409. package/materiais/brutalista/pecas.json +559 -0
  410. package/materiais/brutalista/referencia/analise.md +81 -0
  411. package/materiais/brutalista/referencia/quadro-1.png +0 -0
  412. package/materiais/brutalista/referencia/quadro-2.png +0 -0
  413. package/materiais/brutalista/referencia/quadro-3.png +0 -0
  414. package/materiais/brutalista/referencia/quadro-4.png +0 -0
  415. package/materiais/brutalista/referencia/referencia.mp4 +0 -0
  416. package/materiais/brutalista/regras.md +128 -0
  417. package/materiais/brutalista/sons/Som.tsx +38 -0
  418. package/materiais/brutalista/texturas/Fundo.tsx +9 -0
  419. package/materiais/brutalista/texturas/Particulas.tsx +22 -0
  420. package/materiais/brutalista/tipografia/AssinaturaMarca.tsx +21 -0
  421. package/materiais/brutalista/tipografia/ContadorGrande.tsx +21 -0
  422. package/materiais/brutalista/transicoes/Cena.tsx +41 -0
  423. package/materiais/brutalista/transicoes/CorteImpacto.tsx +16 -0
  424. package/materiais/campos-de-cor/base.ts +87 -0
  425. package/materiais/campos-de-cor/camera/Camera.tsx +23 -0
  426. package/materiais/campos-de-cor/camera/CameraDeriva.tsx +37 -0
  427. package/materiais/campos-de-cor/cores/paleta.json +25 -0
  428. package/materiais/campos-de-cor/cores/paleta.png +0 -0
  429. package/materiais/campos-de-cor/formas/Asterisco.tsx +26 -0
  430. package/materiais/campos-de-cor/formas/CampoDeCor.tsx +39 -0
  431. package/materiais/campos-de-cor/formas/FormaGeometrica.tsx +37 -0
  432. package/materiais/campos-de-cor/formas/ListaRegua.tsx +30 -0
  433. package/materiais/campos-de-cor/pecas.json +534 -0
  434. package/materiais/campos-de-cor/referencia/analise.md +81 -0
  435. package/materiais/campos-de-cor/referencia/quadro-1.png +0 -0
  436. package/materiais/campos-de-cor/referencia/quadro-2.png +0 -0
  437. package/materiais/campos-de-cor/referencia/quadro-3.png +0 -0
  438. package/materiais/campos-de-cor/referencia/quadro-4.png +0 -0
  439. package/materiais/campos-de-cor/referencia/referencia.mp4 +0 -0
  440. package/materiais/campos-de-cor/regras.md +125 -0
  441. package/materiais/campos-de-cor/sons/Som.tsx +39 -0
  442. package/materiais/campos-de-cor/texturas/Fundo.tsx +11 -0
  443. package/materiais/campos-de-cor/texturas/Particulas.tsx +22 -0
  444. package/materiais/campos-de-cor/tipografia/AssinaturaMarca.tsx +18 -0
  445. package/materiais/campos-de-cor/tipografia/FitaDeTexto.tsx +24 -0
  446. package/materiais/campos-de-cor/tipografia/LegendaItalica.tsx +12 -0
  447. package/materiais/campos-de-cor/tipografia/PalavraGigante.tsx +44 -0
  448. package/materiais/campos-de-cor/transicoes/Cena.tsx +46 -0
  449. package/materiais/campos-de-cor/transicoes/CorteImpacto.tsx +16 -0
  450. package/materiais/cartaz-cinetico/base.ts +72 -0
  451. package/materiais/cartaz-cinetico/camera/CameraDeriva.tsx +37 -0
  452. package/materiais/cartaz-cinetico/cores/paleta.json +26 -0
  453. package/materiais/cartaz-cinetico/cores/paleta.png +0 -0
  454. package/materiais/cartaz-cinetico/formas/CirculoPoster.tsx +22 -0
  455. package/materiais/cartaz-cinetico/formas/PilhaCartaz.tsx +40 -0
  456. package/materiais/cartaz-cinetico/formas/Selo.tsx +25 -0
  457. package/materiais/cartaz-cinetico/pecas.json +524 -0
  458. package/materiais/cartaz-cinetico/referencia/analise.md +83 -0
  459. package/materiais/cartaz-cinetico/referencia/quadro-1.png +0 -0
  460. package/materiais/cartaz-cinetico/referencia/quadro-2.png +0 -0
  461. package/materiais/cartaz-cinetico/referencia/quadro-3.png +0 -0
  462. package/materiais/cartaz-cinetico/referencia/quadro-4.png +0 -0
  463. package/materiais/cartaz-cinetico/referencia/referencia.mp4 +0 -0
  464. package/materiais/cartaz-cinetico/regras.md +131 -0
  465. package/materiais/cartaz-cinetico/sons/Som.tsx +38 -0
  466. package/materiais/cartaz-cinetico/texturas/Fundo.tsx +16 -0
  467. package/materiais/cartaz-cinetico/texturas/Particulas.tsx +22 -0
  468. package/materiais/cartaz-cinetico/tipografia/AssinaturaMarca.tsx +31 -0
  469. package/materiais/cartaz-cinetico/tipografia/CartazPalavra.tsx +40 -0
  470. package/materiais/cartaz-cinetico/tipografia/EcoPalavra.tsx +27 -0
  471. package/materiais/cartaz-cinetico/tipografia/RoletaPalavras.tsx +30 -0
  472. package/materiais/cartaz-cinetico/transicoes/Cena.tsx +41 -0
  473. package/materiais/cartaz-cinetico/transicoes/CorteImpacto.tsx +16 -0
  474. package/materiais/colagem/base.ts +77 -0
  475. package/materiais/colagem/camera/Camera.tsx +21 -0
  476. package/materiais/colagem/camera/CameraDeriva.tsx +37 -0
  477. package/materiais/colagem/cores/paleta.json +30 -0
  478. package/materiais/colagem/cores/paleta.png +0 -0
  479. package/materiais/colagem/formas/FitaAdesiva.tsx +11 -0
  480. package/materiais/colagem/formas/FotoRasgada.tsx +26 -0
  481. package/materiais/colagem/formas/ListaRecortes.tsx +23 -0
  482. package/materiais/colagem/formas/NotaDatilografada.tsx +35 -0
  483. package/materiais/colagem/formas/RecorteForma.tsx +23 -0
  484. package/materiais/colagem/lib/rasgado.ts +16 -0
  485. package/materiais/colagem/pecas.json +547 -0
  486. package/materiais/colagem/referencia/analise.md +82 -0
  487. package/materiais/colagem/referencia/quadro-1.png +0 -0
  488. package/materiais/colagem/referencia/quadro-2.png +0 -0
  489. package/materiais/colagem/referencia/quadro-3.png +0 -0
  490. package/materiais/colagem/referencia/quadro-4.png +0 -0
  491. package/materiais/colagem/referencia/referencia.mp4 +0 -0
  492. package/materiais/colagem/regras.md +129 -0
  493. package/materiais/colagem/sons/Som.tsx +30 -0
  494. package/materiais/colagem/texturas/Fundo.tsx +16 -0
  495. package/materiais/colagem/texturas/Particulas.tsx +22 -0
  496. package/materiais/colagem/tipografia/AssinaturaMarca.tsx +17 -0
  497. package/materiais/colagem/tipografia/TituloRecorte.tsx +34 -0
  498. package/materiais/colagem/transicoes/Cena.tsx +36 -0
  499. package/materiais/colagem/transicoes/CorteImpacto.tsx +16 -0
  500. package/materiais/contagem/base.ts +79 -0
  501. package/materiais/contagem/camera/CameraDeriva.tsx +37 -0
  502. package/materiais/contagem/cores/paleta.json +27 -0
  503. package/materiais/contagem/cores/paleta.png +0 -0
  504. package/materiais/contagem/formas/AnelTempo.tsx +36 -0
  505. package/materiais/contagem/formas/BarraDias.tsx +41 -0
  506. package/materiais/contagem/formas/CarimboData.tsx +37 -0
  507. package/materiais/contagem/formas/RelogioFlip.tsx +51 -0
  508. package/materiais/contagem/pecas.json +509 -0
  509. package/materiais/contagem/referencia/analise.md +85 -0
  510. package/materiais/contagem/referencia/quadro-1.png +0 -0
  511. package/materiais/contagem/referencia/quadro-2.png +0 -0
  512. package/materiais/contagem/referencia/quadro-3.png +0 -0
  513. package/materiais/contagem/referencia/quadro-4.png +0 -0
  514. package/materiais/contagem/referencia/referencia.mp4 +0 -0
  515. package/materiais/contagem/regras.md +134 -0
  516. package/materiais/contagem/sons/Som.tsx +41 -0
  517. package/materiais/contagem/texturas/Fundo.tsx +27 -0
  518. package/materiais/contagem/texturas/Particulas.tsx +22 -0
  519. package/materiais/contagem/tipografia/NumeroRolando.tsx +49 -0
  520. package/materiais/contagem/transicoes/Cena.tsx +39 -0
  521. package/materiais/contagem/transicoes/CorteImpacto.tsx +16 -0
  522. package/materiais/convite-evento/base.ts +82 -0
  523. package/materiais/convite-evento/camera/CameraDeriva.tsx +37 -0
  524. package/materiais/convite-evento/cores/paleta.json +27 -0
  525. package/materiais/convite-evento/cores/paleta.png +0 -0
  526. package/materiais/convite-evento/formas/BotaoInscricao.tsx +36 -0
  527. package/materiais/convite-evento/formas/DataGigante.tsx +37 -0
  528. package/materiais/convite-evento/formas/IngressoBilhete.tsx +40 -0
  529. package/materiais/convite-evento/formas/LugarGigante.tsx +38 -0
  530. package/materiais/convite-evento/formas/SeloRotativo.tsx +32 -0
  531. package/materiais/convite-evento/pecas.json +511 -0
  532. package/materiais/convite-evento/referencia/analise.md +84 -0
  533. package/materiais/convite-evento/referencia/quadro-1.png +0 -0
  534. package/materiais/convite-evento/referencia/quadro-2.png +0 -0
  535. package/materiais/convite-evento/referencia/quadro-3.png +0 -0
  536. package/materiais/convite-evento/referencia/quadro-4.png +0 -0
  537. package/materiais/convite-evento/referencia/referencia.mp4 +0 -0
  538. package/materiais/convite-evento/regras.md +135 -0
  539. package/materiais/convite-evento/sons/Som.tsx +40 -0
  540. package/materiais/convite-evento/texturas/Fundo.tsx +30 -0
  541. package/materiais/convite-evento/texturas/Particulas.tsx +22 -0
  542. package/materiais/convite-evento/tipografia/TituloEvento.tsx +33 -0
  543. package/materiais/convite-evento/transicoes/Cena.tsx +39 -0
  544. package/materiais/convite-evento/transicoes/CorteImpacto.tsx +16 -0
  545. package/materiais/corte-podcast/base.ts +82 -0
  546. package/materiais/corte-podcast/camera/CameraDeriva.tsx +37 -0
  547. package/materiais/corte-podcast/cores/paleta.json +28 -0
  548. package/materiais/corte-podcast/cores/paleta.png +0 -0
  549. package/materiais/corte-podcast/formas/BarraEpisodio.tsx +43 -0
  550. package/materiais/corte-podcast/formas/CartaoConvidado.tsx +32 -0
  551. package/materiais/corte-podcast/formas/OndaAudio.tsx +41 -0
  552. package/materiais/corte-podcast/formas/SeloEpisodio.tsx +33 -0
  553. package/materiais/corte-podcast/pecas.json +516 -0
  554. package/materiais/corte-podcast/referencia/analise.md +84 -0
  555. package/materiais/corte-podcast/referencia/quadro-1.png +0 -0
  556. package/materiais/corte-podcast/referencia/quadro-2.png +0 -0
  557. package/materiais/corte-podcast/referencia/quadro-3.png +0 -0
  558. package/materiais/corte-podcast/referencia/quadro-4.png +0 -0
  559. package/materiais/corte-podcast/referencia/referencia.mp4 +0 -0
  560. package/materiais/corte-podcast/regras.md +132 -0
  561. package/materiais/corte-podcast/sons/Som.tsx +40 -0
  562. package/materiais/corte-podcast/texturas/Fundo.tsx +27 -0
  563. package/materiais/corte-podcast/texturas/Particulas.tsx +22 -0
  564. package/materiais/corte-podcast/tipografia/CitacaoGrande.tsx +42 -0
  565. package/materiais/corte-podcast/tipografia/LegendaKaraoke.tsx +32 -0
  566. package/materiais/corte-podcast/transicoes/Cena.tsx +41 -0
  567. package/materiais/corte-podcast/transicoes/CorteImpacto.tsx +16 -0
  568. package/materiais/cubos/base.ts +97 -0
  569. package/materiais/cubos/camera/CameraDeriva.tsx +37 -0
  570. package/materiais/cubos/cores/paleta.json +29 -0
  571. package/materiais/cubos/cores/paleta.png +0 -0
  572. package/materiais/cubos/formas/Cubo.tsx +40 -0
  573. package/materiais/cubos/formas/CuboGiratorio.tsx +37 -0
  574. package/materiais/cubos/formas/MontagemDeCubos.tsx +58 -0
  575. package/materiais/cubos/formas/PlacaBloco.tsx +29 -0
  576. package/materiais/cubos/formas/TorreDeCubos.tsx +39 -0
  577. package/materiais/cubos/pecas.json +477 -0
  578. package/materiais/cubos/referencia/analise.md +83 -0
  579. package/materiais/cubos/referencia/quadro-1.png +0 -0
  580. package/materiais/cubos/referencia/quadro-2.png +0 -0
  581. package/materiais/cubos/referencia/quadro-3.png +0 -0
  582. package/materiais/cubos/referencia/quadro-4.png +0 -0
  583. package/materiais/cubos/referencia/referencia.mp4 +0 -0
  584. package/materiais/cubos/regras.md +136 -0
  585. package/materiais/cubos/sons/Som.tsx +33 -0
  586. package/materiais/cubos/texturas/Fundo.tsx +15 -0
  587. package/materiais/cubos/texturas/Particulas.tsx +22 -0
  588. package/materiais/cubos/tipografia/AssinaturaMarca.tsx +29 -0
  589. package/materiais/cubos/transicoes/Cena.tsx +48 -0
  590. package/materiais/cubos/transicoes/CorteImpacto.tsx +16 -0
  591. package/materiais/dashboard-dados/base.ts +87 -0
  592. package/materiais/dashboard-dados/camera/Camera.tsx +23 -0
  593. package/materiais/dashboard-dados/camera/CameraDeriva.tsx +37 -0
  594. package/materiais/dashboard-dados/cores/paleta.json +30 -0
  595. package/materiais/dashboard-dados/cores/paleta.png +0 -0
  596. package/materiais/dashboard-dados/formas/BarrasCrescendo.tsx +27 -0
  597. package/materiais/dashboard-dados/formas/LinhaTendencia.tsx +29 -0
  598. package/materiais/dashboard-dados/formas/RankingBarras.tsx +27 -0
  599. package/materiais/dashboard-dados/formas/RoscaDados.tsx +39 -0
  600. package/materiais/dashboard-dados/pecas.json +490 -0
  601. package/materiais/dashboard-dados/referencia/analise.md +84 -0
  602. package/materiais/dashboard-dados/referencia/quadro-1.png +0 -0
  603. package/materiais/dashboard-dados/referencia/quadro-2.png +0 -0
  604. package/materiais/dashboard-dados/referencia/quadro-3.png +0 -0
  605. package/materiais/dashboard-dados/referencia/quadro-4.png +0 -0
  606. package/materiais/dashboard-dados/referencia/referencia.mp4 +0 -0
  607. package/materiais/dashboard-dados/regras.md +130 -0
  608. package/materiais/dashboard-dados/sons/Som.tsx +39 -0
  609. package/materiais/dashboard-dados/texturas/Fundo.tsx +12 -0
  610. package/materiais/dashboard-dados/texturas/Particulas.tsx +22 -0
  611. package/materiais/dashboard-dados/tipografia/AssinaturaMarca.tsx +19 -0
  612. package/materiais/dashboard-dados/tipografia/NumeroGigante.tsx +21 -0
  613. package/materiais/dashboard-dados/transicoes/Cena.tsx +46 -0
  614. package/materiais/dashboard-dados/transicoes/CorteImpacto.tsx +16 -0
  615. package/materiais/depoimento/base.ts +83 -0
  616. package/materiais/depoimento/camera/CameraDeriva.tsx +37 -0
  617. package/materiais/depoimento/cores/paleta.json +29 -0
  618. package/materiais/depoimento/cores/paleta.png +0 -0
  619. package/materiais/depoimento/formas/Avatar.tsx +37 -0
  620. package/materiais/depoimento/formas/CartaoDepoimento.tsx +69 -0
  621. package/materiais/depoimento/formas/FaixaAvatares.tsx +41 -0
  622. package/materiais/depoimento/formas/NotaGigante.tsx +38 -0
  623. package/materiais/depoimento/formas/PilhaCartoes.tsx +37 -0
  624. package/materiais/depoimento/formas/SeloVerificado.tsx +29 -0
  625. package/materiais/depoimento/pecas.json +548 -0
  626. package/materiais/depoimento/referencia/analise.md +84 -0
  627. package/materiais/depoimento/referencia/quadro-1.png +0 -0
  628. package/materiais/depoimento/referencia/quadro-2.png +0 -0
  629. package/materiais/depoimento/referencia/quadro-3.png +0 -0
  630. package/materiais/depoimento/referencia/quadro-4.png +0 -0
  631. package/materiais/depoimento/referencia/referencia.mp4 +0 -0
  632. package/materiais/depoimento/regras.md +135 -0
  633. package/materiais/depoimento/sons/Som.tsx +41 -0
  634. package/materiais/depoimento/texturas/Estrelas.tsx +34 -0
  635. package/materiais/depoimento/texturas/Fundo.tsx +23 -0
  636. package/materiais/depoimento/texturas/Particulas.tsx +22 -0
  637. package/materiais/depoimento/transicoes/Cena.tsx +39 -0
  638. package/materiais/depoimento/transicoes/CorteImpacto.tsx +16 -0
  639. package/materiais/infografico/base.ts +80 -0
  640. package/materiais/infografico/camera/CameraDeriva.tsx +37 -0
  641. package/materiais/infografico/cores/paleta.json +28 -0
  642. package/materiais/infografico/cores/paleta.png +0 -0
  643. package/materiais/infografico/formas/Anotacao.tsx +34 -0
  644. package/materiais/infografico/formas/CadeiaPassos.tsx +49 -0
  645. package/materiais/infografico/formas/GraficoBarras.tsx +41 -0
  646. package/materiais/infografico/formas/Icone.tsx +35 -0
  647. package/materiais/infografico/formas/NoProcesso.tsx +33 -0
  648. package/materiais/infografico/formas/SetaCurva.tsx +33 -0
  649. package/materiais/infografico/pecas.json +540 -0
  650. package/materiais/infografico/referencia/analise.md +84 -0
  651. package/materiais/infografico/referencia/quadro-1.png +0 -0
  652. package/materiais/infografico/referencia/quadro-2.png +0 -0
  653. package/materiais/infografico/referencia/quadro-3.png +0 -0
  654. package/materiais/infografico/referencia/quadro-4.png +0 -0
  655. package/materiais/infografico/referencia/referencia.mp4 +0 -0
  656. package/materiais/infografico/regras.md +132 -0
  657. package/materiais/infografico/sons/Som.tsx +40 -0
  658. package/materiais/infografico/texturas/Fundo.tsx +23 -0
  659. package/materiais/infografico/texturas/Particulas.tsx +22 -0
  660. package/materiais/infografico/tipografia/NumeroDestaque.tsx +35 -0
  661. package/materiais/infografico/transicoes/Cena.tsx +39 -0
  662. package/materiais/infografico/transicoes/CorteImpacto.tsx +16 -0
  663. package/materiais/isometrico/base.ts +86 -0
  664. package/materiais/isometrico/camera/Camera.tsx +23 -0
  665. package/materiais/isometrico/camera/CameraDeriva.tsx +37 -0
  666. package/materiais/isometrico/cores/paleta.json +29 -0
  667. package/materiais/isometrico/cores/paleta.png +0 -0
  668. package/materiais/isometrico/formas/BlocosMontando.tsx +36 -0
  669. package/materiais/isometrico/formas/CidadeDeDados.tsx +33 -0
  670. package/materiais/isometrico/formas/RedeDeBlocos.tsx +41 -0
  671. package/materiais/isometrico/pecas.json +503 -0
  672. package/materiais/isometrico/referencia/analise.md +83 -0
  673. package/materiais/isometrico/referencia/quadro-1.png +0 -0
  674. package/materiais/isometrico/referencia/quadro-2.png +0 -0
  675. package/materiais/isometrico/referencia/quadro-3.png +0 -0
  676. package/materiais/isometrico/referencia/quadro-4.png +0 -0
  677. package/materiais/isometrico/referencia/referencia.mp4 +0 -0
  678. package/materiais/isometrico/regras.md +125 -0
  679. package/materiais/isometrico/sons/Som.tsx +39 -0
  680. package/materiais/isometrico/texturas/Fundo.tsx +13 -0
  681. package/materiais/isometrico/texturas/Particulas.tsx +22 -0
  682. package/materiais/isometrico/tipografia/AssinaturaMarca.tsx +24 -0
  683. package/materiais/isometrico/tipografia/LegendaPlaca.tsx +18 -0
  684. package/materiais/isometrico/tipografia/TextoNoChao.tsx +28 -0
  685. package/materiais/isometrico/transicoes/Cena.tsx +46 -0
  686. package/materiais/isometrico/transicoes/CorteImpacto.tsx +16 -0
  687. package/materiais/jornal/base.ts +76 -0
  688. package/materiais/jornal/camera/CameraDeriva.tsx +37 -0
  689. package/materiais/jornal/cores/paleta.json +27 -0
  690. package/materiais/jornal/cores/paleta.png +0 -0
  691. package/materiais/jornal/formas/Cabecalho.tsx +21 -0
  692. package/materiais/jornal/formas/Carimbo.tsx +18 -0
  693. package/materiais/jornal/formas/Colunas.tsx +24 -0
  694. package/materiais/jornal/formas/FotoMeiaTinta.tsx +20 -0
  695. package/materiais/jornal/formas/JornalGirando.tsx +27 -0
  696. package/materiais/jornal/formas/Ticker.tsx +19 -0
  697. package/materiais/jornal/pecas.json +535 -0
  698. package/materiais/jornal/referencia/analise.md +81 -0
  699. package/materiais/jornal/referencia/quadro-1.png +0 -0
  700. package/materiais/jornal/referencia/quadro-2.png +0 -0
  701. package/materiais/jornal/referencia/quadro-3.png +0 -0
  702. package/materiais/jornal/referencia/quadro-4.png +0 -0
  703. package/materiais/jornal/referencia/referencia.mp4 +0 -0
  704. package/materiais/jornal/regras.md +131 -0
  705. package/materiais/jornal/sons/Som.tsx +38 -0
  706. package/materiais/jornal/texturas/Fundo.tsx +18 -0
  707. package/materiais/jornal/texturas/Particulas.tsx +22 -0
  708. package/materiais/jornal/tipografia/AssinaturaMarca.tsx +25 -0
  709. package/materiais/jornal/tipografia/Manchete.tsx +30 -0
  710. package/materiais/jornal/transicoes/Cena.tsx +41 -0
  711. package/materiais/jornal/transicoes/CorteImpacto.tsx +16 -0
  712. package/materiais/legenda-viva/base.ts +73 -0
  713. package/materiais/legenda-viva/camera/CameraDeriva.tsx +37 -0
  714. package/materiais/legenda-viva/cores/paleta.json +27 -0
  715. package/materiais/legenda-viva/cores/paleta.png +0 -0
  716. package/materiais/legenda-viva/formas/ChipTema.tsx +19 -0
  717. package/materiais/legenda-viva/formas/OndaVoz.tsx +23 -0
  718. package/materiais/legenda-viva/formas/QuadroFalante.tsx +17 -0
  719. package/materiais/legenda-viva/pecas.json +503 -0
  720. package/materiais/legenda-viva/referencia/analise.md +79 -0
  721. package/materiais/legenda-viva/referencia/quadro-1.png +0 -0
  722. package/materiais/legenda-viva/referencia/quadro-2.png +0 -0
  723. package/materiais/legenda-viva/referencia/quadro-3.png +0 -0
  724. package/materiais/legenda-viva/referencia/quadro-4.png +0 -0
  725. package/materiais/legenda-viva/referencia/referencia.mp4 +0 -0
  726. package/materiais/legenda-viva/regras.md +130 -0
  727. package/materiais/legenda-viva/sons/Som.tsx +38 -0
  728. package/materiais/legenda-viva/texturas/Fundo.tsx +6 -0
  729. package/materiais/legenda-viva/texturas/Particulas.tsx +22 -0
  730. package/materiais/legenda-viva/tipografia/AssinaturaMarca.tsx +29 -0
  731. package/materiais/legenda-viva/tipografia/LegendaCaixa.tsx +36 -0
  732. package/materiais/legenda-viva/tipografia/LegendaPalavra.tsx +32 -0
  733. package/materiais/legenda-viva/tipografia/PalavraGigante.tsx +18 -0
  734. package/materiais/legenda-viva/transicoes/Cena.tsx +41 -0
  735. package/materiais/legenda-viva/transicoes/CorteImpacto.tsx +16 -0
  736. package/materiais/luxo/base.ts +85 -0
  737. package/materiais/luxo/camera/CameraDeriva.tsx +37 -0
  738. package/materiais/luxo/cores/paleta.json +28 -0
  739. package/materiais/luxo/cores/paleta.png +0 -0
  740. package/materiais/luxo/formas/ConviteOuro.tsx +34 -0
  741. package/materiais/luxo/formas/LinhaOuro.tsx +24 -0
  742. package/materiais/luxo/formas/MolduraArco.tsx +36 -0
  743. package/materiais/luxo/formas/Monograma.tsx +35 -0
  744. package/materiais/luxo/pecas.json +505 -0
  745. package/materiais/luxo/referencia/analise.md +82 -0
  746. package/materiais/luxo/referencia/quadro-1.png +0 -0
  747. package/materiais/luxo/referencia/quadro-2.png +0 -0
  748. package/materiais/luxo/referencia/quadro-3.png +0 -0
  749. package/materiais/luxo/referencia/quadro-4.png +0 -0
  750. package/materiais/luxo/referencia/referencia.mp4 +0 -0
  751. package/materiais/luxo/regras.md +132 -0
  752. package/materiais/luxo/sons/Som.tsx +40 -0
  753. package/materiais/luxo/texturas/Fundo.tsx +26 -0
  754. package/materiais/luxo/texturas/Particulas.tsx +22 -0
  755. package/materiais/luxo/tipografia/LegendaFina.tsx +25 -0
  756. package/materiais/luxo/tipografia/TituloSerifa.tsx +35 -0
  757. package/materiais/luxo/transicoes/Cena.tsx +36 -0
  758. package/materiais/luxo/transicoes/CorteImpacto.tsx +16 -0
  759. package/materiais/mapa/base.ts +89 -0
  760. package/materiais/mapa/camera/CameraDeriva.tsx +37 -0
  761. package/materiais/mapa/cores/paleta.json +33 -0
  762. package/materiais/mapa/cores/paleta.png +0 -0
  763. package/materiais/mapa/formas/CartaoEndereco.tsx +40 -0
  764. package/materiais/mapa/formas/ChipTempo.tsx +29 -0
  765. package/materiais/mapa/formas/MapaBase.tsx +63 -0
  766. package/materiais/mapa/formas/Pino.tsx +38 -0
  767. package/materiais/mapa/formas/RotaAnimada.tsx +38 -0
  768. package/materiais/mapa/pecas.json +529 -0
  769. package/materiais/mapa/referencia/analise.md +85 -0
  770. package/materiais/mapa/referencia/quadro-1.png +0 -0
  771. package/materiais/mapa/referencia/quadro-2.png +0 -0
  772. package/materiais/mapa/referencia/quadro-3.png +0 -0
  773. package/materiais/mapa/referencia/quadro-4.png +0 -0
  774. package/materiais/mapa/referencia/referencia.mp4 +0 -0
  775. package/materiais/mapa/regras.md +135 -0
  776. package/materiais/mapa/sons/Som.tsx +41 -0
  777. package/materiais/mapa/texturas/Fundo.tsx +25 -0
  778. package/materiais/mapa/texturas/Particulas.tsx +22 -0
  779. package/materiais/mapa/tipografia/TituloLocal.tsx +38 -0
  780. package/materiais/mapa/transicoes/Cena.tsx +41 -0
  781. package/materiais/mapa/transicoes/CorteImpacto.tsx +16 -0
  782. package/materiais/massinha/base.ts +79 -0
  783. package/materiais/massinha/camera/Camera.tsx +21 -0
  784. package/materiais/massinha/camera/CameraDeriva.tsx +37 -0
  785. package/materiais/massinha/cores/paleta.json +32 -0
  786. package/materiais/massinha/cores/paleta.png +0 -0
  787. package/materiais/massinha/formas/BichinhoMassa.tsx +30 -0
  788. package/materiais/massinha/formas/BolasMassa.tsx +25 -0
  789. package/materiais/massinha/formas/FormaMassa.tsx +23 -0
  790. package/materiais/massinha/formas/ListaMassa.tsx +19 -0
  791. package/materiais/massinha/formas/Overlay.tsx +11 -0
  792. package/materiais/massinha/formas/PlacaMassa.tsx +24 -0
  793. package/materiais/massinha/pecas.json +544 -0
  794. package/materiais/massinha/referencia/analise.md +81 -0
  795. package/materiais/massinha/referencia/quadro-1.png +0 -0
  796. package/materiais/massinha/referencia/quadro-2.png +0 -0
  797. package/materiais/massinha/referencia/quadro-3.png +0 -0
  798. package/materiais/massinha/referencia/quadro-4.png +0 -0
  799. package/materiais/massinha/referencia/referencia.mp4 +0 -0
  800. package/materiais/massinha/regras.md +129 -0
  801. package/materiais/massinha/sons/Som.tsx +30 -0
  802. package/materiais/massinha/texturas/Fundo.tsx +12 -0
  803. package/materiais/massinha/texturas/Particulas.tsx +22 -0
  804. package/materiais/massinha/tipografia/AssinaturaMarca.tsx +20 -0
  805. package/materiais/massinha/tipografia/TituloMassa.tsx +31 -0
  806. package/materiais/massinha/transicoes/Cena.tsx +36 -0
  807. package/materiais/massinha/transicoes/CorteImpacto.tsx +16 -0
  808. package/materiais/memphis/base.ts +78 -0
  809. package/materiais/memphis/camera/Camera.tsx +21 -0
  810. package/materiais/memphis/camera/CameraDeriva.tsx +37 -0
  811. package/materiais/memphis/cores/paleta.json +31 -0
  812. package/materiais/memphis/cores/paleta.png +0 -0
  813. package/materiais/memphis/formas/CartaoMemphis.tsx +16 -0
  814. package/materiais/memphis/formas/FitaMarquee.tsx +21 -0
  815. package/materiais/memphis/formas/FormasMemphis.tsx +46 -0
  816. package/materiais/memphis/formas/ListaPilulas.tsx +17 -0
  817. package/materiais/memphis/formas/Overlay.tsx +23 -0
  818. package/materiais/memphis/pecas.json +544 -0
  819. package/materiais/memphis/referencia/analise.md +82 -0
  820. package/materiais/memphis/referencia/quadro-1.png +0 -0
  821. package/materiais/memphis/referencia/quadro-2.png +0 -0
  822. package/materiais/memphis/referencia/quadro-3.png +0 -0
  823. package/materiais/memphis/referencia/quadro-4.png +0 -0
  824. package/materiais/memphis/referencia/referencia.mp4 +0 -0
  825. package/materiais/memphis/regras.md +130 -0
  826. package/materiais/memphis/sons/Som.tsx +30 -0
  827. package/materiais/memphis/texturas/Fundo.tsx +15 -0
  828. package/materiais/memphis/texturas/Particulas.tsx +22 -0
  829. package/materiais/memphis/tipografia/AssinaturaMarca.tsx +20 -0
  830. package/materiais/memphis/tipografia/NumeroGigante.tsx +19 -0
  831. package/materiais/memphis/tipografia/TituloMemphis.tsx +28 -0
  832. package/materiais/memphis/transicoes/Cena.tsx +36 -0
  833. package/materiais/memphis/transicoes/CorteImpacto.tsx +16 -0
  834. package/materiais/metal-liquido/base.ts +94 -0
  835. package/materiais/metal-liquido/camera/CameraDeriva.tsx +37 -0
  836. package/materiais/metal-liquido/cores/paleta.json +30 -0
  837. package/materiais/metal-liquido/cores/paleta.png +0 -0
  838. package/materiais/metal-liquido/formas/AnelCromo.tsx +28 -0
  839. package/materiais/metal-liquido/formas/BolhasCromadas.tsx +53 -0
  840. package/materiais/metal-liquido/formas/EsferaCromo.tsx +32 -0
  841. package/materiais/metal-liquido/formas/PilulaCromo.tsx +23 -0
  842. package/materiais/metal-liquido/pecas.json +469 -0
  843. package/materiais/metal-liquido/referencia/analise.md +84 -0
  844. package/materiais/metal-liquido/referencia/quadro-1.png +0 -0
  845. package/materiais/metal-liquido/referencia/quadro-2.png +0 -0
  846. package/materiais/metal-liquido/referencia/quadro-3.png +0 -0
  847. package/materiais/metal-liquido/referencia/quadro-4.png +0 -0
  848. package/materiais/metal-liquido/referencia/referencia.mp4 +0 -0
  849. package/materiais/metal-liquido/regras.md +135 -0
  850. package/materiais/metal-liquido/sons/Som.tsx +33 -0
  851. package/materiais/metal-liquido/texturas/Fundo.tsx +20 -0
  852. package/materiais/metal-liquido/texturas/Particulas.tsx +22 -0
  853. package/materiais/metal-liquido/tipografia/AssinaturaMarca.tsx +26 -0
  854. package/materiais/metal-liquido/tipografia/TituloCromo.tsx +32 -0
  855. package/materiais/metal-liquido/transicoes/Cena.tsx +48 -0
  856. package/materiais/metal-liquido/transicoes/CorteImpacto.tsx +16 -0
  857. package/materiais/minimal/base.ts +80 -0
  858. package/materiais/minimal/camera/CameraDeriva.tsx +37 -0
  859. package/materiais/minimal/cores/paleta.json +26 -0
  860. package/materiais/minimal/cores/paleta.png +0 -0
  861. package/materiais/minimal/formas/FormaMorph.tsx +44 -0
  862. package/materiais/minimal/formas/LinhaFina.tsx +24 -0
  863. package/materiais/minimal/formas/PontoMovel.tsx +27 -0
  864. package/materiais/minimal/pecas.json +505 -0
  865. package/materiais/minimal/referencia/analise.md +84 -0
  866. package/materiais/minimal/referencia/quadro-1.png +0 -0
  867. package/materiais/minimal/referencia/quadro-2.png +0 -0
  868. package/materiais/minimal/referencia/quadro-3.png +0 -0
  869. package/materiais/minimal/referencia/quadro-4.png +0 -0
  870. package/materiais/minimal/referencia/referencia.mp4 +0 -0
  871. package/materiais/minimal/regras.md +127 -0
  872. package/materiais/minimal/sons/Som.tsx +40 -0
  873. package/materiais/minimal/texturas/Fundo.tsx +20 -0
  874. package/materiais/minimal/texturas/Particulas.tsx +22 -0
  875. package/materiais/minimal/tipografia/FraseUnica.tsx +33 -0
  876. package/materiais/minimal/tipografia/NumeroSolo.tsx +33 -0
  877. package/materiais/minimal/tipografia/RodapeMinimal.tsx +26 -0
  878. package/materiais/minimal/transicoes/Cena.tsx +39 -0
  879. package/materiais/minimal/transicoes/CorteImpacto.tsx +16 -0
  880. package/materiais/neon-cidade/base.ts +100 -0
  881. package/materiais/neon-cidade/camera/CameraDeriva.tsx +37 -0
  882. package/materiais/neon-cidade/cores/paleta.json +29 -0
  883. package/materiais/neon-cidade/cores/paleta.png +0 -0
  884. package/materiais/neon-cidade/formas/CaixaLuminosa.tsx +40 -0
  885. package/materiais/neon-cidade/formas/FormaNeon.tsx +42 -0
  886. package/materiais/neon-cidade/formas/Horizonte.tsx +34 -0
  887. package/materiais/neon-cidade/formas/LetreiroNeon.tsx +46 -0
  888. package/materiais/neon-cidade/pecas.json +464 -0
  889. package/materiais/neon-cidade/referencia/analise.md +84 -0
  890. package/materiais/neon-cidade/referencia/quadro-1.png +0 -0
  891. package/materiais/neon-cidade/referencia/quadro-2.png +0 -0
  892. package/materiais/neon-cidade/referencia/quadro-3.png +0 -0
  893. package/materiais/neon-cidade/referencia/quadro-4.png +0 -0
  894. package/materiais/neon-cidade/referencia/referencia.mp4 +0 -0
  895. package/materiais/neon-cidade/regras.md +137 -0
  896. package/materiais/neon-cidade/sons/Som.tsx +33 -0
  897. package/materiais/neon-cidade/texturas/Chuva.tsx +23 -0
  898. package/materiais/neon-cidade/texturas/Fundo.tsx +18 -0
  899. package/materiais/neon-cidade/texturas/Particulas.tsx +22 -0
  900. package/materiais/neon-cidade/tipografia/AssinaturaMarca.tsx +24 -0
  901. package/materiais/neon-cidade/transicoes/Cena.tsx +48 -0
  902. package/materiais/neon-cidade/transicoes/CorteImpacto.tsx +16 -0
  903. package/materiais/notion-editorial/base.ts +87 -0
  904. package/materiais/notion-editorial/camera/Camera.tsx +23 -0
  905. package/materiais/notion-editorial/camera/CameraDeriva.tsx +37 -0
  906. package/materiais/notion-editorial/cores/paleta.json +28 -0
  907. package/materiais/notion-editorial/cores/paleta.png +0 -0
  908. package/materiais/notion-editorial/formas/BlocoNota.tsx +38 -0
  909. package/materiais/notion-editorial/formas/Diagrama.tsx +29 -0
  910. package/materiais/notion-editorial/formas/PassosNumerados.tsx +23 -0
  911. package/materiais/notion-editorial/formas/RabiscoIcone.tsx +33 -0
  912. package/materiais/notion-editorial/pecas.json +496 -0
  913. package/materiais/notion-editorial/referencia/analise.md +83 -0
  914. package/materiais/notion-editorial/referencia/quadro-1.png +0 -0
  915. package/materiais/notion-editorial/referencia/quadro-2.png +0 -0
  916. package/materiais/notion-editorial/referencia/quadro-3.png +0 -0
  917. package/materiais/notion-editorial/referencia/quadro-4.png +0 -0
  918. package/materiais/notion-editorial/referencia/referencia.mp4 +0 -0
  919. package/materiais/notion-editorial/regras.md +126 -0
  920. package/materiais/notion-editorial/sons/Som.tsx +39 -0
  921. package/materiais/notion-editorial/texturas/Fundo.tsx +12 -0
  922. package/materiais/notion-editorial/texturas/Particulas.tsx +22 -0
  923. package/materiais/notion-editorial/tipografia/AssinaturaMarca.tsx +20 -0
  924. package/materiais/notion-editorial/tipografia/TextoSerifa.tsx +53 -0
  925. package/materiais/notion-editorial/transicoes/Cena.tsx +46 -0
  926. package/materiais/notion-editorial/transicoes/CorteImpacto.tsx +16 -0
  927. package/materiais/papel-recortado/base.ts +51 -0
  928. package/materiais/papel-recortado/camera/Camera.tsx +28 -0
  929. package/materiais/papel-recortado/camera/CameraDeriva.tsx +37 -0
  930. package/materiais/papel-recortado/cores/paleta.json +28 -0
  931. package/materiais/papel-recortado/cores/paleta.png +0 -0
  932. package/materiais/papel-recortado/formas/CamadaPapel.tsx +81 -0
  933. package/materiais/papel-recortado/formas/CartaoCamadas.tsx +38 -0
  934. package/materiais/papel-recortado/formas/EtiquetaPapel.tsx +40 -0
  935. package/materiais/papel-recortado/formas/Fita.tsx +21 -0
  936. package/materiais/papel-recortado/formas/FolhaPopUp.tsx +49 -0
  937. package/materiais/papel-recortado/formas/MolduraPapel.tsx +12 -0
  938. package/materiais/papel-recortado/pecas.json +545 -0
  939. package/materiais/papel-recortado/referencia/analise.md +82 -0
  940. package/materiais/papel-recortado/referencia/quadro-1.png +0 -0
  941. package/materiais/papel-recortado/referencia/quadro-2.png +0 -0
  942. package/materiais/papel-recortado/referencia/quadro-3.png +0 -0
  943. package/materiais/papel-recortado/referencia/quadro-4.png +0 -0
  944. package/materiais/papel-recortado/referencia/referencia.mp4 +0 -0
  945. package/materiais/papel-recortado/regras.md +117 -0
  946. package/materiais/papel-recortado/sons/Som.tsx +30 -0
  947. package/materiais/papel-recortado/texturas/Fundo.tsx +10 -0
  948. package/materiais/papel-recortado/texturas/Particulas.tsx +22 -0
  949. package/materiais/papel-recortado/tipografia/LetrasRecortadas.tsx +48 -0
  950. package/materiais/papel-recortado/transicoes/Cena.tsx +29 -0
  951. package/materiais/papel-recortado/transicoes/CorteImpacto.tsx +16 -0
  952. package/materiais/pixel/base.ts +79 -0
  953. package/materiais/pixel/camera/Camera.tsx +21 -0
  954. package/materiais/pixel/camera/CameraDeriva.tsx +37 -0
  955. package/materiais/pixel/cores/paleta.json +32 -0
  956. package/materiais/pixel/cores/paleta.png +0 -0
  957. package/materiais/pixel/formas/CaixaDialogo.tsx +22 -0
  958. package/materiais/pixel/formas/HudPlacar.tsx +19 -0
  959. package/materiais/pixel/formas/MenuPixel.tsx +19 -0
  960. package/materiais/pixel/formas/Overlay.tsx +14 -0
  961. package/materiais/pixel/formas/Sprite.tsx +33 -0
  962. package/materiais/pixel/pecas.json +543 -0
  963. package/materiais/pixel/referencia/analise.md +82 -0
  964. package/materiais/pixel/referencia/quadro-1.png +0 -0
  965. package/materiais/pixel/referencia/quadro-2.png +0 -0
  966. package/materiais/pixel/referencia/quadro-3.png +0 -0
  967. package/materiais/pixel/referencia/quadro-4.png +0 -0
  968. package/materiais/pixel/referencia/referencia.mp4 +0 -0
  969. package/materiais/pixel/regras.md +129 -0
  970. package/materiais/pixel/sons/Som.tsx +30 -0
  971. package/materiais/pixel/texturas/ChuvaDeSprites.tsx +15 -0
  972. package/materiais/pixel/texturas/Fundo.tsx +23 -0
  973. package/materiais/pixel/texturas/Particulas.tsx +22 -0
  974. package/materiais/pixel/tipografia/AssinaturaMarca.tsx +18 -0
  975. package/materiais/pixel/tipografia/TituloPixel.tsx +31 -0
  976. package/materiais/pixel/transicoes/Cena.tsx +36 -0
  977. package/materiais/pixel/transicoes/CorteImpacto.tsx +16 -0
  978. package/materiais/pontos-3d/base.ts +92 -0
  979. package/materiais/pontos-3d/camera/CameraDeriva.tsx +37 -0
  980. package/materiais/pontos-3d/cores/paleta.json +28 -0
  981. package/materiais/pontos-3d/cores/paleta.png +0 -0
  982. package/materiais/pontos-3d/formas/NuvemDePontos.tsx +84 -0
  983. package/materiais/pontos-3d/formas/RotuloPonto.tsx +32 -0
  984. package/materiais/pontos-3d/pecas.json +481 -0
  985. package/materiais/pontos-3d/referencia/analise.md +85 -0
  986. package/materiais/pontos-3d/referencia/quadro-1.png +0 -0
  987. package/materiais/pontos-3d/referencia/quadro-2.png +0 -0
  988. package/materiais/pontos-3d/referencia/quadro-3.png +0 -0
  989. package/materiais/pontos-3d/referencia/quadro-4.png +0 -0
  990. package/materiais/pontos-3d/referencia/referencia.mp4 +0 -0
  991. package/materiais/pontos-3d/regras.md +136 -0
  992. package/materiais/pontos-3d/sons/Som.tsx +33 -0
  993. package/materiais/pontos-3d/texturas/Fundo.tsx +20 -0
  994. package/materiais/pontos-3d/texturas/Particulas.tsx +22 -0
  995. package/materiais/pontos-3d/tipografia/AssinaturaMarca.tsx +23 -0
  996. package/materiais/pontos-3d/tipografia/Contador.tsx +32 -0
  997. package/materiais/pontos-3d/tipografia/TextoDePontos.tsx +55 -0
  998. package/materiais/pontos-3d/tipografia/TituloSora.tsx +36 -0
  999. package/materiais/pontos-3d/transicoes/Cena.tsx +48 -0
  1000. package/materiais/pontos-3d/transicoes/CorteImpacto.tsx +16 -0
  1001. package/materiais/produto-3d/base.ts +109 -0
  1002. package/materiais/produto-3d/camera/Camera.tsx +23 -0
  1003. package/materiais/produto-3d/camera/CameraDeriva.tsx +37 -0
  1004. package/materiais/produto-3d/cores/paleta.json +31 -0
  1005. package/materiais/produto-3d/cores/paleta.png +0 -0
  1006. package/materiais/produto-3d/formas/Produto3D.tsx +131 -0
  1007. package/materiais/produto-3d/lib/produto3d-apoio.ts +21 -0
  1008. package/materiais/produto-3d/pecas.json +516 -0
  1009. package/materiais/produto-3d/referencia/analise.md +83 -0
  1010. package/materiais/produto-3d/referencia/quadro-1.png +0 -0
  1011. package/materiais/produto-3d/referencia/quadro-2.png +0 -0
  1012. package/materiais/produto-3d/referencia/quadro-3.png +0 -0
  1013. package/materiais/produto-3d/referencia/quadro-4.png +0 -0
  1014. package/materiais/produto-3d/referencia/referencia.mp4 +0 -0
  1015. package/materiais/produto-3d/regras.md +128 -0
  1016. package/materiais/produto-3d/sons/Som.tsx +39 -0
  1017. package/materiais/produto-3d/texturas/Fundo.tsx +45 -0
  1018. package/materiais/produto-3d/texturas/Particulas.tsx +22 -0
  1019. package/materiais/produto-3d/tipografia/AssinaturaMarca.tsx +28 -0
  1020. package/materiais/produto-3d/tipografia/NumeroDestaque.tsx +35 -0
  1021. package/materiais/produto-3d/tipografia/RotuloChamada.tsx +43 -0
  1022. package/materiais/produto-3d/tipografia/TituloMinimo.tsx +45 -0
  1023. package/materiais/produto-3d/transicoes/Cena.tsx +55 -0
  1024. package/materiais/produto-3d/transicoes/CorteImpacto.tsx +16 -0
  1025. package/materiais/produto-3d/transicoes/VarreduraLuz.tsx +22 -0
  1026. package/materiais/quadro-giz/base.ts +78 -0
  1027. package/materiais/quadro-giz/camera/Camera.tsx +21 -0
  1028. package/materiais/quadro-giz/camera/CameraDeriva.tsx +37 -0
  1029. package/materiais/quadro-giz/cores/paleta.json +31 -0
  1030. package/materiais/quadro-giz/cores/paleta.png +0 -0
  1031. package/materiais/quadro-giz/formas/ApagadorVarrendo.tsx +32 -0
  1032. package/materiais/quadro-giz/formas/CartaoGiz.tsx +25 -0
  1033. package/materiais/quadro-giz/formas/ContaNoQuadro.tsx +34 -0
  1034. package/materiais/quadro-giz/formas/DesenhoGiz.tsx +29 -0
  1035. package/materiais/quadro-giz/formas/ListaGiz.tsx +21 -0
  1036. package/materiais/quadro-giz/formas/Overlay.tsx +12 -0
  1037. package/materiais/quadro-giz/lib/traco.ts +9 -0
  1038. package/materiais/quadro-giz/pecas.json +546 -0
  1039. package/materiais/quadro-giz/referencia/analise.md +82 -0
  1040. package/materiais/quadro-giz/referencia/quadro-1.png +0 -0
  1041. package/materiais/quadro-giz/referencia/quadro-2.png +0 -0
  1042. package/materiais/quadro-giz/referencia/quadro-3.png +0 -0
  1043. package/materiais/quadro-giz/referencia/quadro-4.png +0 -0
  1044. package/materiais/quadro-giz/referencia/referencia.mp4 +0 -0
  1045. package/materiais/quadro-giz/regras.md +132 -0
  1046. package/materiais/quadro-giz/sons/Som.tsx +30 -0
  1047. package/materiais/quadro-giz/texturas/Fundo.tsx +21 -0
  1048. package/materiais/quadro-giz/texturas/Particulas.tsx +22 -0
  1049. package/materiais/quadro-giz/tipografia/AssinaturaMarca.tsx +20 -0
  1050. package/materiais/quadro-giz/tipografia/TituloGiz.tsx +29 -0
  1051. package/materiais/quadro-giz/transicoes/Cena.tsx +36 -0
  1052. package/materiais/quadro-giz/transicoes/CorteImpacto.tsx +16 -0
  1053. package/materiais/rabisco/base.ts +76 -0
  1054. package/materiais/rabisco/camera/Camera.tsx +21 -0
  1055. package/materiais/rabisco/camera/CameraDeriva.tsx +37 -0
  1056. package/materiais/rabisco/cores/paleta.json +29 -0
  1057. package/materiais/rabisco/cores/paleta.png +0 -0
  1058. package/materiais/rabisco/formas/Bonequinho.tsx +31 -0
  1059. package/materiais/rabisco/formas/CartaoRabiscado.tsx +27 -0
  1060. package/materiais/rabisco/formas/ListaRabiscada.tsx +23 -0
  1061. package/materiais/rabisco/formas/TracoDesenhando.tsx +31 -0
  1062. package/materiais/rabisco/lib/traco.ts +10 -0
  1063. package/materiais/rabisco/pecas.json +520 -0
  1064. package/materiais/rabisco/referencia/analise.md +82 -0
  1065. package/materiais/rabisco/referencia/quadro-1.png +0 -0
  1066. package/materiais/rabisco/referencia/quadro-2.png +0 -0
  1067. package/materiais/rabisco/referencia/quadro-3.png +0 -0
  1068. package/materiais/rabisco/referencia/quadro-4.png +0 -0
  1069. package/materiais/rabisco/referencia/referencia.mp4 +0 -0
  1070. package/materiais/rabisco/regras.md +126 -0
  1071. package/materiais/rabisco/sons/Som.tsx +30 -0
  1072. package/materiais/rabisco/texturas/Fundo.tsx +17 -0
  1073. package/materiais/rabisco/texturas/Particulas.tsx +22 -0
  1074. package/materiais/rabisco/tipografia/AssinaturaMarca.tsx +21 -0
  1075. package/materiais/rabisco/tipografia/TituloRabisco.tsx +28 -0
  1076. package/materiais/rabisco/transicoes/Cena.tsx +36 -0
  1077. package/materiais/rabisco/transicoes/CorteImpacto.tsx +16 -0
  1078. package/materiais/retro-70/base.ts +73 -0
  1079. package/materiais/retro-70/camera/CameraDeriva.tsx +37 -0
  1080. package/materiais/retro-70/cores/paleta.json +27 -0
  1081. package/materiais/retro-70/cores/paleta.png +0 -0
  1082. package/materiais/retro-70/formas/ArcoListras.tsx +25 -0
  1083. package/materiais/retro-70/formas/CartaoData.tsx +24 -0
  1084. package/materiais/retro-70/formas/FaixaOnda.tsx +27 -0
  1085. package/materiais/retro-70/formas/Flor70.tsx +25 -0
  1086. package/materiais/retro-70/formas/FotoArredondada.tsx +19 -0
  1087. package/materiais/retro-70/formas/RaiosDeSol.tsx +27 -0
  1088. package/materiais/retro-70/pecas.json +533 -0
  1089. package/materiais/retro-70/referencia/analise.md +81 -0
  1090. package/materiais/retro-70/referencia/quadro-1.png +0 -0
  1091. package/materiais/retro-70/referencia/quadro-2.png +0 -0
  1092. package/materiais/retro-70/referencia/quadro-3.png +0 -0
  1093. package/materiais/retro-70/referencia/quadro-4.png +0 -0
  1094. package/materiais/retro-70/referencia/referencia.mp4 +0 -0
  1095. package/materiais/retro-70/regras.md +132 -0
  1096. package/materiais/retro-70/sons/Som.tsx +38 -0
  1097. package/materiais/retro-70/texturas/Fundo.tsx +11 -0
  1098. package/materiais/retro-70/texturas/Particulas.tsx +22 -0
  1099. package/materiais/retro-70/tipografia/AssinaturaMarca.tsx +21 -0
  1100. package/materiais/retro-70/tipografia/TituloGordo.tsx +28 -0
  1101. package/materiais/retro-70/transicoes/Cena.tsx +41 -0
  1102. package/materiais/retro-70/transicoes/CorteImpacto.tsx +16 -0
  1103. package/materiais/revista/base.ts +76 -0
  1104. package/materiais/revista/camera/CameraDeriva.tsx +37 -0
  1105. package/materiais/revista/cores/paleta.json +27 -0
  1106. package/materiais/revista/cores/paleta.png +0 -0
  1107. package/materiais/revista/formas/ColagemFotos.tsx +22 -0
  1108. package/materiais/revista/formas/Folio.tsx +19 -0
  1109. package/materiais/revista/formas/FotoSangrando.tsx +24 -0
  1110. package/materiais/revista/formas/PaginaDupla.tsx +36 -0
  1111. package/materiais/revista/pecas.json +506 -0
  1112. package/materiais/revista/referencia/analise.md +80 -0
  1113. package/materiais/revista/referencia/quadro-1.png +0 -0
  1114. package/materiais/revista/referencia/quadro-2.png +0 -0
  1115. package/materiais/revista/referencia/quadro-3.png +0 -0
  1116. package/materiais/revista/referencia/quadro-4.png +0 -0
  1117. package/materiais/revista/referencia/referencia.mp4 +0 -0
  1118. package/materiais/revista/regras.md +130 -0
  1119. package/materiais/revista/sons/Som.tsx +38 -0
  1120. package/materiais/revista/texturas/Fundo.tsx +11 -0
  1121. package/materiais/revista/texturas/Particulas.tsx +22 -0
  1122. package/materiais/revista/tipografia/AssinaturaMarca.tsx +23 -0
  1123. package/materiais/revista/tipografia/CitacaoGrande.tsx +27 -0
  1124. package/materiais/revista/tipografia/TituloEditorial.tsx +31 -0
  1125. package/materiais/revista/transicoes/Cena.tsx +41 -0
  1126. package/materiais/revista/transicoes/CorteImpacto.tsx +16 -0
  1127. package/materiais/risografia/base.ts +73 -0
  1128. package/materiais/risografia/camera/Camera.tsx +21 -0
  1129. package/materiais/risografia/camera/CameraDeriva.tsx +37 -0
  1130. package/materiais/risografia/cores/paleta.json +26 -0
  1131. package/materiais/risografia/cores/paleta.png +0 -0
  1132. package/materiais/risografia/formas/BolaReticula.tsx +26 -0
  1133. package/materiais/risografia/formas/FormaRiso.tsx +24 -0
  1134. package/materiais/risografia/formas/ListaRiso.tsx +22 -0
  1135. package/materiais/risografia/formas/Overlay.tsx +18 -0
  1136. package/materiais/risografia/formas/TarjaCarimbo.tsx +20 -0
  1137. package/materiais/risografia/pecas.json +538 -0
  1138. package/materiais/risografia/referencia/analise.md +82 -0
  1139. package/materiais/risografia/referencia/quadro-1.png +0 -0
  1140. package/materiais/risografia/referencia/quadro-2.png +0 -0
  1141. package/materiais/risografia/referencia/quadro-3.png +0 -0
  1142. package/materiais/risografia/referencia/quadro-4.png +0 -0
  1143. package/materiais/risografia/referencia/referencia.mp4 +0 -0
  1144. package/materiais/risografia/regras.md +123 -0
  1145. package/materiais/risografia/sons/Som.tsx +30 -0
  1146. package/materiais/risografia/texturas/Fundo.tsx +12 -0
  1147. package/materiais/risografia/texturas/Particulas.tsx +22 -0
  1148. package/materiais/risografia/tipografia/AssinaturaMarca.tsx +21 -0
  1149. package/materiais/risografia/tipografia/NumeroRiso.tsx +21 -0
  1150. package/materiais/risografia/tipografia/TituloRiso.tsx +26 -0
  1151. package/materiais/risografia/transicoes/Cena.tsx +36 -0
  1152. package/materiais/risografia/transicoes/CorteImpacto.tsx +16 -0
  1153. package/materiais/saas-linear/camera/CameraDeriva.tsx +37 -0
  1154. package/materiais/saas-linear/cores/paleta.png +0 -0
  1155. package/materiais/saas-linear/pecas.json +40 -34
  1156. package/materiais/saas-linear/referencia/analise.md +87 -0
  1157. package/materiais/saas-linear/referencia/quadro-1.png +0 -0
  1158. package/materiais/saas-linear/referencia/quadro-2.png +0 -0
  1159. package/materiais/saas-linear/referencia/quadro-3.png +0 -0
  1160. package/materiais/saas-linear/referencia/quadro-4.png +0 -0
  1161. package/materiais/saas-linear/referencia/referencia.mp4 +0 -0
  1162. package/materiais/saas-linear/sons/Som.tsx +1 -1
  1163. package/materiais/stripe-ondas/base.ts +85 -0
  1164. package/materiais/stripe-ondas/camera/Camera.tsx +23 -0
  1165. package/materiais/stripe-ondas/camera/CameraDeriva.tsx +37 -0
  1166. package/materiais/stripe-ondas/cores/paleta.json +28 -0
  1167. package/materiais/stripe-ondas/cores/paleta.png +0 -0
  1168. package/materiais/stripe-ondas/formas/CartaoPagamento.tsx +35 -0
  1169. package/materiais/stripe-ondas/formas/FaixaDeOndas.tsx +49 -0
  1170. package/materiais/stripe-ondas/formas/GraficoOnda.tsx +34 -0
  1171. package/materiais/stripe-ondas/formas/PainelCodigo.tsx +36 -0
  1172. package/materiais/stripe-ondas/formas/SelosDeMetodo.tsx +27 -0
  1173. package/materiais/stripe-ondas/pecas.json +510 -0
  1174. package/materiais/stripe-ondas/referencia/analise.md +83 -0
  1175. package/materiais/stripe-ondas/referencia/quadro-1.png +0 -0
  1176. package/materiais/stripe-ondas/referencia/quadro-2.png +0 -0
  1177. package/materiais/stripe-ondas/referencia/quadro-3.png +0 -0
  1178. package/materiais/stripe-ondas/referencia/quadro-4.png +0 -0
  1179. package/materiais/stripe-ondas/referencia/referencia.mp4 +0 -0
  1180. package/materiais/stripe-ondas/regras.md +131 -0
  1181. package/materiais/stripe-ondas/sons/Som.tsx +39 -0
  1182. package/materiais/stripe-ondas/texturas/Fundo.tsx +11 -0
  1183. package/materiais/stripe-ondas/texturas/Particulas.tsx +22 -0
  1184. package/materiais/stripe-ondas/tipografia/AssinaturaMarca.tsx +18 -0
  1185. package/materiais/stripe-ondas/tipografia/TituloLimpo.tsx +27 -0
  1186. package/materiais/stripe-ondas/transicoes/Cena.tsx +46 -0
  1187. package/materiais/stripe-ondas/transicoes/CorteImpacto.tsx +16 -0
  1188. package/materiais/suica/base.ts +76 -0
  1189. package/materiais/suica/camera/CameraDeriva.tsx +37 -0
  1190. package/materiais/suica/cores/paleta.json +27 -0
  1191. package/materiais/suica/cores/paleta.png +0 -0
  1192. package/materiais/suica/formas/DiscoFoto.tsx +20 -0
  1193. package/materiais/suica/formas/Indice.tsx +17 -0
  1194. package/materiais/suica/formas/ListaIndice.tsx +25 -0
  1195. package/materiais/suica/formas/Regua.tsx +20 -0
  1196. package/materiais/suica/pecas.json +528 -0
  1197. package/materiais/suica/referencia/analise.md +80 -0
  1198. package/materiais/suica/referencia/quadro-1.png +0 -0
  1199. package/materiais/suica/referencia/quadro-2.png +0 -0
  1200. package/materiais/suica/referencia/quadro-3.png +0 -0
  1201. package/materiais/suica/referencia/quadro-4.png +0 -0
  1202. package/materiais/suica/referencia/referencia.mp4 +0 -0
  1203. package/materiais/suica/regras.md +129 -0
  1204. package/materiais/suica/sons/Som.tsx +38 -0
  1205. package/materiais/suica/texturas/Fundo.tsx +16 -0
  1206. package/materiais/suica/texturas/GradeFotos.tsx +21 -0
  1207. package/materiais/suica/texturas/Particulas.tsx +22 -0
  1208. package/materiais/suica/tipografia/AssinaturaMarca.tsx +21 -0
  1209. package/materiais/suica/tipografia/NumeroGigante.tsx +21 -0
  1210. package/materiais/suica/tipografia/TituloGrade.tsx +38 -0
  1211. package/materiais/suica/transicoes/Cena.tsx +41 -0
  1212. package/materiais/suica/transicoes/CorteImpacto.tsx +16 -0
  1213. package/materiais/synthwave/base.ts +75 -0
  1214. package/materiais/synthwave/camera/CameraDeriva.tsx +37 -0
  1215. package/materiais/synthwave/cores/paleta.json +29 -0
  1216. package/materiais/synthwave/cores/paleta.png +0 -0
  1217. package/materiais/synthwave/formas/Montanhas.tsx +27 -0
  1218. package/materiais/synthwave/formas/Palmeiras.tsx +30 -0
  1219. package/materiais/synthwave/formas/QuadroHUD.tsx +33 -0
  1220. package/materiais/synthwave/formas/SolListrado.tsx +29 -0
  1221. package/materiais/synthwave/pecas.json +491 -0
  1222. package/materiais/synthwave/referencia/analise.md +81 -0
  1223. package/materiais/synthwave/referencia/quadro-1.png +0 -0
  1224. package/materiais/synthwave/referencia/quadro-2.png +0 -0
  1225. package/materiais/synthwave/referencia/quadro-3.png +0 -0
  1226. package/materiais/synthwave/referencia/quadro-4.png +0 -0
  1227. package/materiais/synthwave/referencia/referencia.mp4 +0 -0
  1228. package/materiais/synthwave/regras.md +132 -0
  1229. package/materiais/synthwave/sons/Som.tsx +38 -0
  1230. package/materiais/synthwave/texturas/Estrelas.tsx +27 -0
  1231. package/materiais/synthwave/texturas/Fundo.tsx +20 -0
  1232. package/materiais/synthwave/texturas/Particulas.tsx +22 -0
  1233. package/materiais/synthwave/tipografia/AssinaturaMarca.tsx +26 -0
  1234. package/materiais/synthwave/tipografia/TituloNeon.tsx +30 -0
  1235. package/materiais/synthwave/transicoes/Cena.tsx +41 -0
  1236. package/materiais/synthwave/transicoes/CorteImpacto.tsx +16 -0
  1237. package/materiais/terminal/base.ts +67 -0
  1238. package/materiais/terminal/camera/Camera.tsx +23 -0
  1239. package/materiais/terminal/camera/CameraDeriva.tsx +37 -0
  1240. package/materiais/terminal/cores/paleta.json +32 -0
  1241. package/materiais/terminal/cores/paleta.png +0 -0
  1242. package/materiais/terminal/formas/ArteAscii.tsx +61 -0
  1243. package/materiais/terminal/formas/BarraProgresso.tsx +42 -0
  1244. package/materiais/terminal/formas/BarraStatus.tsx +18 -0
  1245. package/materiais/terminal/formas/BootBios.tsx +41 -0
  1246. package/materiais/terminal/formas/LinhaComando.tsx +31 -0
  1247. package/materiais/terminal/formas/Monitor.tsx +42 -0
  1248. package/materiais/terminal/formas/PainelCaixa.tsx +35 -0
  1249. package/materiais/terminal/formas/Tela.tsx +25 -0
  1250. package/materiais/terminal/pecas.json +591 -0
  1251. package/materiais/terminal/referencia/analise.md +84 -0
  1252. package/materiais/terminal/referencia/quadro-1.png +0 -0
  1253. package/materiais/terminal/referencia/quadro-2.png +0 -0
  1254. package/materiais/terminal/referencia/quadro-3.png +0 -0
  1255. package/materiais/terminal/referencia/quadro-4.png +0 -0
  1256. package/materiais/terminal/referencia/referencia.mp4 +0 -0
  1257. package/materiais/terminal/regras.md +124 -0
  1258. package/materiais/terminal/sons/Som.tsx +32 -0
  1259. package/materiais/terminal/texturas/Fundo.tsx +22 -0
  1260. package/materiais/terminal/texturas/Particulas.tsx +22 -0
  1261. package/materiais/terminal/tipografia/TextoGrande.tsx +35 -0
  1262. package/materiais/terminal/transicoes/Cena.tsx +25 -0
  1263. package/materiais/terminal/transicoes/CorteImpacto.tsx +16 -0
  1264. package/materiais/tiktok-energia/base.ts +92 -0
  1265. package/materiais/tiktok-energia/camera/CameraDeriva.tsx +37 -0
  1266. package/materiais/tiktok-energia/cores/paleta.json +27 -0
  1267. package/materiais/tiktok-energia/cores/paleta.png +0 -0
  1268. package/materiais/tiktok-energia/formas/EmojiSticker.tsx +21 -0
  1269. package/materiais/tiktok-energia/formas/FotoSoco.tsx +27 -0
  1270. package/materiais/tiktok-energia/pecas.json +470 -0
  1271. package/materiais/tiktok-energia/referencia/analise.md +87 -0
  1272. package/materiais/tiktok-energia/referencia/quadro-1.png +0 -0
  1273. package/materiais/tiktok-energia/referencia/quadro-2.png +0 -0
  1274. package/materiais/tiktok-energia/referencia/quadro-3.png +0 -0
  1275. package/materiais/tiktok-energia/referencia/quadro-4.png +0 -0
  1276. package/materiais/tiktok-energia/referencia/referencia.mp4 +0 -0
  1277. package/materiais/tiktok-energia/regras.md +135 -0
  1278. package/materiais/tiktok-energia/sons/Som.tsx +33 -0
  1279. package/materiais/tiktok-energia/texturas/Fundo.tsx +8 -0
  1280. package/materiais/tiktok-energia/texturas/Particulas.tsx +22 -0
  1281. package/materiais/tiktok-energia/tipografia/AssinaturaMarca.tsx +25 -0
  1282. package/materiais/tiktok-energia/tipografia/PalavraSoco.tsx +29 -0
  1283. package/materiais/tiktok-energia/tipografia/TextoCaixa.tsx +25 -0
  1284. package/materiais/tiktok-energia/transicoes/Cena.tsx +48 -0
  1285. package/materiais/tiktok-energia/transicoes/CorteDeCor.tsx +22 -0
  1286. package/materiais/tiktok-energia/transicoes/CorteImpacto.tsx +16 -0
  1287. package/materiais/tunel/base.ts +97 -0
  1288. package/materiais/tunel/camera/CameraDeriva.tsx +37 -0
  1289. package/materiais/tunel/cores/paleta.json +28 -0
  1290. package/materiais/tunel/cores/paleta.png +0 -0
  1291. package/materiais/tunel/formas/LinhasDeVelocidade.tsx +25 -0
  1292. package/materiais/tunel/formas/PlacaVoadora.tsx +28 -0
  1293. package/materiais/tunel/formas/TunelDeFormas.tsx +52 -0
  1294. package/materiais/tunel/pecas.json +475 -0
  1295. package/materiais/tunel/referencia/analise.md +83 -0
  1296. package/materiais/tunel/referencia/quadro-1.png +0 -0
  1297. package/materiais/tunel/referencia/quadro-2.png +0 -0
  1298. package/materiais/tunel/referencia/quadro-3.png +0 -0
  1299. package/materiais/tunel/referencia/quadro-4.png +0 -0
  1300. package/materiais/tunel/referencia/referencia.mp4 +0 -0
  1301. package/materiais/tunel/regras.md +134 -0
  1302. package/materiais/tunel/sons/Som.tsx +33 -0
  1303. package/materiais/tunel/texturas/Fundo.tsx +13 -0
  1304. package/materiais/tunel/texturas/Particulas.tsx +22 -0
  1305. package/materiais/tunel/tipografia/AssinaturaMarca.tsx +22 -0
  1306. package/materiais/tunel/tipografia/NumeroGigante.tsx +28 -0
  1307. package/materiais/tunel/tipografia/TituloTunel.tsx +32 -0
  1308. package/materiais/tunel/transicoes/Cena.tsx +48 -0
  1309. package/materiais/tunel/transicoes/CorteImpacto.tsx +16 -0
  1310. package/materiais/tutorial-tela/base.ts +65 -0
  1311. package/materiais/tutorial-tela/camera/CameraDeriva.tsx +37 -0
  1312. package/materiais/tutorial-tela/camera/CameraTela.tsx +29 -0
  1313. package/materiais/tutorial-tela/cores/paleta.json +32 -0
  1314. package/materiais/tutorial-tela/cores/paleta.png +0 -0
  1315. package/materiais/tutorial-tela/formas/Cursor.tsx +36 -0
  1316. package/materiais/tutorial-tela/formas/DestaqueCaixa.tsx +17 -0
  1317. package/materiais/tutorial-tela/formas/JanelaApp.tsx +81 -0
  1318. package/materiais/tutorial-tela/formas/TeclaAtalho.tsx +29 -0
  1319. package/materiais/tutorial-tela/pecas.json +526 -0
  1320. package/materiais/tutorial-tela/referencia/analise.md +86 -0
  1321. package/materiais/tutorial-tela/referencia/quadro-1.png +0 -0
  1322. package/materiais/tutorial-tela/referencia/quadro-2.png +0 -0
  1323. package/materiais/tutorial-tela/referencia/quadro-3.png +0 -0
  1324. package/materiais/tutorial-tela/referencia/quadro-4.png +0 -0
  1325. package/materiais/tutorial-tela/referencia/referencia.mp4 +0 -0
  1326. package/materiais/tutorial-tela/regras.md +139 -0
  1327. package/materiais/tutorial-tela/sons/Som.tsx +41 -0
  1328. package/materiais/tutorial-tela/texturas/Fundo.tsx +12 -0
  1329. package/materiais/tutorial-tela/texturas/Particulas.tsx +22 -0
  1330. package/materiais/tutorial-tela/tipografia/PassoChamada.tsx +22 -0
  1331. package/materiais/tutorial-tela/tipografia/TituloTela.tsx +30 -0
  1332. package/materiais/tutorial-tela/transicoes/Cena.tsx +33 -0
  1333. package/materiais/tutorial-tela/transicoes/CorteImpacto.tsx +16 -0
  1334. package/materiais/ugc-reels/base.ts +92 -0
  1335. package/materiais/ugc-reels/camera/CameraDeriva.tsx +37 -0
  1336. package/materiais/ugc-reels/cores/paleta.json +28 -0
  1337. package/materiais/ugc-reels/cores/paleta.png +0 -0
  1338. package/materiais/ugc-reels/formas/BotaoLink.tsx +24 -0
  1339. package/materiais/ugc-reels/formas/CabecalhoPerfil.tsx +38 -0
  1340. package/materiais/ugc-reels/formas/Comentario.tsx +29 -0
  1341. package/materiais/ugc-reels/formas/NotaDeMao.tsx +29 -0
  1342. package/materiais/ugc-reels/formas/Reacoes.tsx +26 -0
  1343. package/materiais/ugc-reels/formas/VideoCelular.tsx +37 -0
  1344. package/materiais/ugc-reels/pecas.json +512 -0
  1345. package/materiais/ugc-reels/referencia/analise.md +85 -0
  1346. package/materiais/ugc-reels/referencia/quadro-1.png +0 -0
  1347. package/materiais/ugc-reels/referencia/quadro-2.png +0 -0
  1348. package/materiais/ugc-reels/referencia/quadro-3.png +0 -0
  1349. package/materiais/ugc-reels/referencia/quadro-4.png +0 -0
  1350. package/materiais/ugc-reels/referencia/referencia.mp4 +0 -0
  1351. package/materiais/ugc-reels/regras.md +138 -0
  1352. package/materiais/ugc-reels/sons/Som.tsx +33 -0
  1353. package/materiais/ugc-reels/texturas/Fundo.tsx +8 -0
  1354. package/materiais/ugc-reels/texturas/Particulas.tsx +22 -0
  1355. package/materiais/ugc-reels/tipografia/AssinaturaMarca.tsx +28 -0
  1356. package/materiais/ugc-reels/tipografia/LegendaEmoji.tsx +43 -0
  1357. package/materiais/ugc-reels/transicoes/Cena.tsx +48 -0
  1358. package/materiais/ugc-reels/transicoes/CorteImpacto.tsx +16 -0
  1359. package/materiais/vercel-mono/base.ts +82 -0
  1360. package/materiais/vercel-mono/camera/Camera.tsx +23 -0
  1361. package/materiais/vercel-mono/camera/CameraDeriva.tsx +37 -0
  1362. package/materiais/vercel-mono/cores/paleta.json +25 -0
  1363. package/materiais/vercel-mono/cores/paleta.png +0 -0
  1364. package/materiais/vercel-mono/formas/FaixaOutline.tsx +25 -0
  1365. package/materiais/vercel-mono/formas/Quadro.tsx +28 -0
  1366. package/materiais/vercel-mono/formas/TerminalComando.tsx +33 -0
  1367. package/materiais/vercel-mono/formas/TrianguloGigante.tsx +27 -0
  1368. package/materiais/vercel-mono/pecas.json +504 -0
  1369. package/materiais/vercel-mono/referencia/analise.md +82 -0
  1370. package/materiais/vercel-mono/referencia/quadro-1.png +0 -0
  1371. package/materiais/vercel-mono/referencia/quadro-2.png +0 -0
  1372. package/materiais/vercel-mono/referencia/quadro-3.png +0 -0
  1373. package/materiais/vercel-mono/referencia/quadro-4.png +0 -0
  1374. package/materiais/vercel-mono/referencia/referencia.mp4 +0 -0
  1375. package/materiais/vercel-mono/regras.md +120 -0
  1376. package/materiais/vercel-mono/sons/Som.tsx +39 -0
  1377. package/materiais/vercel-mono/texturas/Fundo.tsx +6 -0
  1378. package/materiais/vercel-mono/texturas/GradeDeNumeros.tsx +27 -0
  1379. package/materiais/vercel-mono/texturas/Particulas.tsx +22 -0
  1380. package/materiais/vercel-mono/tipografia/AssinaturaMarca.tsx +18 -0
  1381. package/materiais/vercel-mono/tipografia/PalavraMono.tsx +31 -0
  1382. package/materiais/vercel-mono/transicoes/Cena.tsx +46 -0
  1383. package/materiais/vercel-mono/transicoes/CorteImpacto.tsx +16 -0
  1384. package/materiais/vhs-90/base.ts +75 -0
  1385. package/materiais/vhs-90/camera/CameraDeriva.tsx +37 -0
  1386. package/materiais/vhs-90/cores/paleta.json +29 -0
  1387. package/materiais/vhs-90/cores/paleta.png +0 -0
  1388. package/materiais/vhs-90/formas/BarrasRastreio.tsx +21 -0
  1389. package/materiais/vhs-90/formas/CapaVHS.tsx +28 -0
  1390. package/materiais/vhs-90/formas/CarimboData.tsx +19 -0
  1391. package/materiais/vhs-90/formas/MenuOSD.tsx +27 -0
  1392. package/materiais/vhs-90/formas/TelaAzul.tsx +29 -0
  1393. package/materiais/vhs-90/pecas.json +507 -0
  1394. package/materiais/vhs-90/referencia/analise.md +81 -0
  1395. package/materiais/vhs-90/referencia/quadro-1.png +0 -0
  1396. package/materiais/vhs-90/referencia/quadro-2.png +0 -0
  1397. package/materiais/vhs-90/referencia/quadro-3.png +0 -0
  1398. package/materiais/vhs-90/referencia/quadro-4.png +0 -0
  1399. package/materiais/vhs-90/referencia/referencia.mp4 +0 -0
  1400. package/materiais/vhs-90/regras.md +133 -0
  1401. package/materiais/vhs-90/sons/Som.tsx +38 -0
  1402. package/materiais/vhs-90/texturas/Fundo.tsx +27 -0
  1403. package/materiais/vhs-90/texturas/Particulas.tsx +22 -0
  1404. package/materiais/vhs-90/tipografia/AssinaturaMarca.tsx +29 -0
  1405. package/materiais/vhs-90/tipografia/TituloFita.tsx +40 -0
  1406. package/materiais/vhs-90/transicoes/Cena.tsx +41 -0
  1407. package/materiais/vhs-90/transicoes/CorteImpacto.tsx +16 -0
  1408. package/materiais/vidro-ios/base.ts +87 -0
  1409. package/materiais/vidro-ios/camera/Camera.tsx +23 -0
  1410. package/materiais/vidro-ios/camera/CameraDeriva.tsx +37 -0
  1411. package/materiais/vidro-ios/cores/paleta.json +28 -0
  1412. package/materiais/vidro-ios/cores/paleta.png +0 -0
  1413. package/materiais/vidro-ios/formas/IlhaDinamica.tsx +24 -0
  1414. package/materiais/vidro-ios/formas/PainelControle.tsx +33 -0
  1415. package/materiais/vidro-ios/formas/PilhaNotificacoes.tsx +29 -0
  1416. package/materiais/vidro-ios/formas/WidgetsGrade.tsx +34 -0
  1417. package/materiais/vidro-ios/formas/vidro.tsx +20 -0
  1418. package/materiais/vidro-ios/pecas.json +504 -0
  1419. package/materiais/vidro-ios/referencia/analise.md +84 -0
  1420. package/materiais/vidro-ios/referencia/quadro-1.png +0 -0
  1421. package/materiais/vidro-ios/referencia/quadro-2.png +0 -0
  1422. package/materiais/vidro-ios/referencia/quadro-3.png +0 -0
  1423. package/materiais/vidro-ios/referencia/quadro-4.png +0 -0
  1424. package/materiais/vidro-ios/referencia/referencia.mp4 +0 -0
  1425. package/materiais/vidro-ios/regras.md +127 -0
  1426. package/materiais/vidro-ios/sons/Som.tsx +39 -0
  1427. package/materiais/vidro-ios/texturas/Fundo.tsx +17 -0
  1428. package/materiais/vidro-ios/texturas/Particulas.tsx +22 -0
  1429. package/materiais/vidro-ios/tipografia/AssinaturaMarca.tsx +21 -0
  1430. package/materiais/vidro-ios/tipografia/TituloVidro.tsx +22 -0
  1431. package/materiais/vidro-ios/transicoes/Cena.tsx +46 -0
  1432. package/materiais/vidro-ios/transicoes/CorteImpacto.tsx +16 -0
  1433. package/materiais/y2k-cromado/base.ts +75 -0
  1434. package/materiais/y2k-cromado/camera/CameraDeriva.tsx +37 -0
  1435. package/materiais/y2k-cromado/cores/paleta.json +29 -0
  1436. package/materiais/y2k-cromado/cores/paleta.png +0 -0
  1437. package/materiais/y2k-cromado/formas/Bolhas.tsx +30 -0
  1438. package/materiais/y2k-cromado/formas/CartaoGloss.tsx +26 -0
  1439. package/materiais/y2k-cromado/formas/FitaMarquee.tsx +20 -0
  1440. package/materiais/y2k-cromado/formas/JanelaY2K.tsx +31 -0
  1441. package/materiais/y2k-cromado/formas/OrbeCromo.tsx +20 -0
  1442. package/materiais/y2k-cromado/pecas.json +527 -0
  1443. package/materiais/y2k-cromado/referencia/analise.md +81 -0
  1444. package/materiais/y2k-cromado/referencia/quadro-1.png +0 -0
  1445. package/materiais/y2k-cromado/referencia/quadro-2.png +0 -0
  1446. package/materiais/y2k-cromado/referencia/quadro-3.png +0 -0
  1447. package/materiais/y2k-cromado/referencia/quadro-4.png +0 -0
  1448. package/materiais/y2k-cromado/referencia/referencia.mp4 +0 -0
  1449. package/materiais/y2k-cromado/regras.md +133 -0
  1450. package/materiais/y2k-cromado/sons/Som.tsx +38 -0
  1451. package/materiais/y2k-cromado/texturas/Brilhos.tsx +28 -0
  1452. package/materiais/y2k-cromado/texturas/Fundo.tsx +18 -0
  1453. package/materiais/y2k-cromado/texturas/Particulas.tsx +22 -0
  1454. package/materiais/y2k-cromado/tipografia/AssinaturaMarca.tsx +25 -0
  1455. package/materiais/y2k-cromado/tipografia/TextoCromo.tsx +34 -0
  1456. package/materiais/y2k-cromado/transicoes/Cena.tsx +41 -0
  1457. package/materiais/y2k-cromado/transicoes/CorteImpacto.tsx +16 -0
  1458. package/package.json +6 -2
  1459. package/skills/apresentacao-pptx/SKILL.md +1 -1
  1460. package/skills/carrossel-conferido/SKILL.md +21 -0
  1461. package/skills/cartaz-conferido/SKILL.md +28 -0
  1462. package/skills/deck-conferido/SKILL.md +5 -4
  1463. package/skills/documento-conferido/SKILL.md +23 -0
  1464. package/vendor/fontes/anton.woff2 +0 -0
  1465. package/vendor/fontes/caveat.woff2 +0 -0
  1466. package/vendor/fontes/inter.woff2 +0 -0
  1467. package/vendor/fontes/jetbrains-mono.woff2 +0 -0
  1468. package/vendor/fontes/montserrat.woff2 +0 -0
  1469. package/voz/primo_voz/__main__.py +1 -1
  1470. package/voz/primo_voz/app.py +8 -8
  1471. package/voz/primo_voz/transcrever.py +2 -2
  1472. package/kits/adesivos/assets/ASSETS.md +0 -22
  1473. package/kits/adesivos/elementos/AdesivoForma.tsx +0 -42
  1474. package/kits/adesivos/elementos/AdesivoFoto.tsx +0 -36
  1475. package/kits/adesivos/elementos/AdesivoTexto.tsx +0 -35
  1476. package/kits/adesivos/elementos/AssinaturaMarca.tsx +0 -36
  1477. package/kits/adesivos/elementos/Cena.tsx +0 -48
  1478. package/kits/adesivos/elementos/ChuvaDeAdesivos.tsx +0 -29
  1479. package/kits/adesivos/elementos/Fundo.tsx +0 -21
  1480. package/kits/adesivos/elementos/Montagem.tsx +0 -68
  1481. package/kits/adesivos/elementos/SeloPreco.tsx +0 -38
  1482. package/kits/adesivos/elementos/Som.tsx +0 -33
  1483. package/kits/adesivos/elementos/TituloEtiquetas.tsx +0 -33
  1484. package/kits/adesivos/elementos/base.ts +0 -101
  1485. package/kits/adesivos/elementos/index.ts +0 -16
  1486. package/kits/adesivos/exemplos/fotos/foto-01.jpg +0 -0
  1487. package/kits/adesivos/exemplos/fotos/foto-02.jpg +0 -0
  1488. package/kits/adesivos/exemplos/fotos/foto-03.jpg +0 -0
  1489. package/kits/adesivos/exemplos/logo-grude.svg +0 -1
  1490. package/kits/adesivos/exemplos/plano.json +0 -328
  1491. package/kits/adesivos/exemplos/roteiro.md +0 -21
  1492. package/kits/adesivos/preview.tsx +0 -15
  1493. package/kits/adesivos/receita.json +0 -212
  1494. package/kits/adesivos/regras/area-segura.md +0 -17
  1495. package/kits/adesivos/regras/cor.md +0 -23
  1496. package/kits/adesivos/regras/movimento.md +0 -17
  1497. package/kits/adesivos/regras/ritmo.md +0 -16
  1498. package/kits/adesivos/regras/som.md +0 -20
  1499. package/kits/adesivos/regras/tipografia.md +0 -16
  1500. package/kits/antes-depois/assets/ASSETS.md +0 -23
  1501. package/kits/antes-depois/elementos/BarraMedidor.tsx +0 -43
  1502. package/kits/antes-depois/elementos/Cena.tsx +0 -41
  1503. package/kits/antes-depois/elementos/FaixaMarquee.tsx +0 -35
  1504. package/kits/antes-depois/elementos/Fundo.tsx +0 -24
  1505. package/kits/antes-depois/elementos/ListaMudancas.tsx +0 -37
  1506. package/kits/antes-depois/elementos/Montagem.tsx +0 -59
  1507. package/kits/antes-depois/elementos/NumeroDelta.tsx +0 -36
  1508. package/kits/antes-depois/elementos/RotuloAntesDepois.tsx +0 -26
  1509. package/kits/antes-depois/elementos/Som.tsx +0 -40
  1510. package/kits/antes-depois/elementos/TelaDividida.tsx +0 -68
  1511. package/kits/antes-depois/elementos/base.ts +0 -82
  1512. package/kits/antes-depois/elementos/index.ts +0 -15
  1513. package/kits/antes-depois/exemplos/fotos/foto-07.jpg +0 -0
  1514. package/kits/antes-depois/exemplos/fotos/foto-08.jpg +0 -0
  1515. package/kits/antes-depois/exemplos/plano.json +0 -276
  1516. package/kits/antes-depois/exemplos/roteiro.md +0 -19
  1517. package/kits/antes-depois/preview.tsx +0 -13
  1518. package/kits/antes-depois/receita.json +0 -21
  1519. package/kits/antes-depois/regras/area-segura.md +0 -21
  1520. package/kits/antes-depois/regras/cor.md +0 -15
  1521. package/kits/antes-depois/regras/movimento.md +0 -23
  1522. package/kits/antes-depois/regras/ritmo.md +0 -15
  1523. package/kits/antes-depois/regras/som.md +0 -20
  1524. package/kits/antes-depois/regras/tipografia.md +0 -18
  1525. package/kits/apple-tipografico/assets/ASSETS.md +0 -23
  1526. package/kits/apple-tipografico/elementos/AssinaturaPreta.tsx +0 -33
  1527. package/kits/apple-tipografico/elementos/Camera.tsx +0 -23
  1528. package/kits/apple-tipografico/elementos/CartaoRadial.tsx +0 -41
  1529. package/kits/apple-tipografico/elementos/Cena.tsx +0 -55
  1530. package/kits/apple-tipografico/elementos/Fundo.tsx +0 -21
  1531. package/kits/apple-tipografico/elementos/LegendaCurta.tsx +0 -51
  1532. package/kits/apple-tipografico/elementos/Montagem.tsx +0 -55
  1533. package/kits/apple-tipografico/elementos/Produto3D.tsx +0 -140
  1534. package/kits/apple-tipografico/elementos/ProdutoFoto.tsx +0 -47
  1535. package/kits/apple-tipografico/elementos/Som.tsx +0 -40
  1536. package/kits/apple-tipografico/elementos/base.ts +0 -111
  1537. package/kits/apple-tipografico/elementos/index.ts +0 -18
  1538. package/kits/apple-tipografico/exemplos/logo-lume.svg +0 -1
  1539. package/kits/apple-tipografico/exemplos/plano.json +0 -56
  1540. package/kits/apple-tipografico/exemplos/roteiro.md +0 -19
  1541. package/kits/apple-tipografico/preview.tsx +0 -12
  1542. package/kits/apple-tipografico/receita.json +0 -22
  1543. package/kits/apple-tipografico/regras/area-segura.md +0 -19
  1544. package/kits/apple-tipografico/regras/cor.md +0 -24
  1545. package/kits/apple-tipografico/regras/movimento.md +0 -29
  1546. package/kits/apple-tipografico/regras/ritmo.md +0 -29
  1547. package/kits/apple-tipografico/regras/som.md +0 -20
  1548. package/kits/apple-tipografico/regras/tipografia.md +0 -21
  1549. package/kits/aquarela/assets/ASSETS.md +0 -21
  1550. package/kits/aquarela/elementos/AnotacaoManual.tsx +0 -40
  1551. package/kits/aquarela/elementos/AssinaturaMarca.tsx +0 -33
  1552. package/kits/aquarela/elementos/Cena.tsx +0 -48
  1553. package/kits/aquarela/elementos/Fundo.tsx +0 -24
  1554. package/kits/aquarela/elementos/ManchaTinta.tsx +0 -46
  1555. package/kits/aquarela/elementos/Montagem.tsx +0 -60
  1556. package/kits/aquarela/elementos/PapelRasgado.tsx +0 -50
  1557. package/kits/aquarela/elementos/Pincelada.tsx +0 -43
  1558. package/kits/aquarela/elementos/Pingos.tsx +0 -31
  1559. package/kits/aquarela/elementos/Som.tsx +0 -33
  1560. package/kits/aquarela/elementos/TituloPincel.tsx +0 -51
  1561. package/kits/aquarela/elementos/base.ts +0 -97
  1562. package/kits/aquarela/elementos/index.ts +0 -16
  1563. package/kits/aquarela/exemplos/logo-mare.svg +0 -1
  1564. package/kits/aquarela/exemplos/plano.json +0 -62
  1565. package/kits/aquarela/exemplos/roteiro.md +0 -21
  1566. package/kits/aquarela/preview.tsx +0 -12
  1567. package/kits/aquarela/receita.json +0 -213
  1568. package/kits/aquarela/regras/area-segura.md +0 -17
  1569. package/kits/aquarela/regras/cor.md +0 -23
  1570. package/kits/aquarela/regras/movimento.md +0 -19
  1571. package/kits/aquarela/regras/ritmo.md +0 -17
  1572. package/kits/aquarela/regras/som.md +0 -20
  1573. package/kits/aquarela/regras/tipografia.md +0 -16
  1574. package/kits/aurora/assets/ASSETS.md +0 -21
  1575. package/kits/aurora/elementos/AssinaturaMarca.tsx +0 -24
  1576. package/kits/aurora/elementos/CartaoVidro.tsx +0 -29
  1577. package/kits/aurora/elementos/Cena.tsx +0 -48
  1578. package/kits/aurora/elementos/CeuEstrelado.tsx +0 -22
  1579. package/kits/aurora/elementos/CortinaDeLuz.tsx +0 -36
  1580. package/kits/aurora/elementos/Fundo.tsx +0 -35
  1581. package/kits/aurora/elementos/Legenda.tsx +0 -23
  1582. package/kits/aurora/elementos/Montagem.tsx +0 -68
  1583. package/kits/aurora/elementos/Montanhas.tsx +0 -24
  1584. package/kits/aurora/elementos/Som.tsx +0 -33
  1585. package/kits/aurora/elementos/TituloSerif.tsx +0 -36
  1586. package/kits/aurora/elementos/base.ts +0 -93
  1587. package/kits/aurora/elementos/index.ts +0 -16
  1588. package/kits/aurora/exemplos/logo-boreal.svg +0 -1
  1589. package/kits/aurora/exemplos/plano.json +0 -204
  1590. package/kits/aurora/exemplos/roteiro.md +0 -19
  1591. package/kits/aurora/preview.tsx +0 -12
  1592. package/kits/aurora/receita.json +0 -146
  1593. package/kits/aurora/regras/area-segura.md +0 -18
  1594. package/kits/aurora/regras/cor.md +0 -24
  1595. package/kits/aurora/regras/movimento.md +0 -20
  1596. package/kits/aurora/regras/ritmo.md +0 -14
  1597. package/kits/aurora/regras/som.md +0 -20
  1598. package/kits/aurora/regras/tipografia.md +0 -15
  1599. package/kits/bauhaus/assets/ASSETS.md +0 -18
  1600. package/kits/bauhaus/elementos/AssinaturaMarca.tsx +0 -26
  1601. package/kits/bauhaus/elementos/BarraDiagonal.tsx +0 -20
  1602. package/kits/bauhaus/elementos/Camera.tsx +0 -21
  1603. package/kits/bauhaus/elementos/Cena.tsx +0 -36
  1604. package/kits/bauhaus/elementos/ComposicaoGeometrica.tsx +0 -54
  1605. package/kits/bauhaus/elementos/Fundo.tsx +0 -13
  1606. package/kits/bauhaus/elementos/ListaFaixas.tsx +0 -27
  1607. package/kits/bauhaus/elementos/Montagem.tsx +0 -55
  1608. package/kits/bauhaus/elementos/NumeroBauhaus.tsx +0 -21
  1609. package/kits/bauhaus/elementos/Overlay.tsx +0 -18
  1610. package/kits/bauhaus/elementos/Som.tsx +0 -30
  1611. package/kits/bauhaus/elementos/TituloBauhaus.tsx +0 -32
  1612. package/kits/bauhaus/elementos/base.ts +0 -74
  1613. package/kits/bauhaus/elementos/index.ts +0 -16
  1614. package/kits/bauhaus/exemplos/plano.json +0 -221
  1615. package/kits/bauhaus/exemplos/roteiro.md +0 -20
  1616. package/kits/bauhaus/preview.tsx +0 -12
  1617. package/kits/bauhaus/receita.json +0 -174
  1618. package/kits/bauhaus/regras/area-segura.md +0 -15
  1619. package/kits/bauhaus/regras/cor.md +0 -13
  1620. package/kits/bauhaus/regras/movimento.md +0 -17
  1621. package/kits/bauhaus/regras/ritmo.md +0 -15
  1622. package/kits/bauhaus/regras/som.md +0 -18
  1623. package/kits/bauhaus/regras/tipografia.md +0 -20
  1624. package/kits/brutalista/assets/ASSETS.md +0 -23
  1625. package/kits/brutalista/elementos/AssinaturaMarca.tsx +0 -21
  1626. package/kits/brutalista/elementos/BlocoSombra.tsx +0 -18
  1627. package/kits/brutalista/elementos/CartaoFotoBruto.tsx +0 -19
  1628. package/kits/brutalista/elementos/Cena.tsx +0 -41
  1629. package/kits/brutalista/elementos/ContadorGrande.tsx +0 -21
  1630. package/kits/brutalista/elementos/FitaAlerta.tsx +0 -20
  1631. package/kits/brutalista/elementos/Fundo.tsx +0 -9
  1632. package/kits/brutalista/elementos/ListaBruta.tsx +0 -23
  1633. package/kits/brutalista/elementos/MonoEnorme.tsx +0 -43
  1634. package/kits/brutalista/elementos/Montagem.tsx +0 -62
  1635. package/kits/brutalista/elementos/QuadroCor.tsx +0 -14
  1636. package/kits/brutalista/elementos/Som.tsx +0 -38
  1637. package/kits/brutalista/elementos/Terminal.tsx +0 -25
  1638. package/kits/brutalista/elementos/base.ts +0 -71
  1639. package/kits/brutalista/elementos/index.ts +0 -18
  1640. package/kits/brutalista/exemplos/fotos/foto-02.jpg +0 -0
  1641. package/kits/brutalista/exemplos/fotos/foto-03.jpg +0 -0
  1642. package/kits/brutalista/exemplos/fotos/foto-05.jpg +0 -0
  1643. package/kits/brutalista/exemplos/fotos/foto-07.jpg +0 -0
  1644. package/kits/brutalista/exemplos/fotos/foto-08.jpg +0 -0
  1645. package/kits/brutalista/exemplos/logo-bloco.svg +0 -1
  1646. package/kits/brutalista/exemplos/plano.json +0 -52
  1647. package/kits/brutalista/exemplos/roteiro.md +0 -19
  1648. package/kits/brutalista/preview.tsx +0 -20
  1649. package/kits/brutalista/receita.json +0 -195
  1650. package/kits/brutalista/regras/area-segura.md +0 -18
  1651. package/kits/brutalista/regras/cor.md +0 -12
  1652. package/kits/brutalista/regras/movimento.md +0 -16
  1653. package/kits/brutalista/regras/ritmo.md +0 -16
  1654. package/kits/brutalista/regras/som.md +0 -21
  1655. package/kits/brutalista/regras/tipografia.md +0 -16
  1656. package/kits/campos-de-cor/assets/ASSETS.md +0 -19
  1657. package/kits/campos-de-cor/elementos/AssinaturaMarca.tsx +0 -18
  1658. package/kits/campos-de-cor/elementos/Asterisco.tsx +0 -26
  1659. package/kits/campos-de-cor/elementos/Camera.tsx +0 -23
  1660. package/kits/campos-de-cor/elementos/CampoDeCor.tsx +0 -39
  1661. package/kits/campos-de-cor/elementos/Cena.tsx +0 -46
  1662. package/kits/campos-de-cor/elementos/FitaDeTexto.tsx +0 -24
  1663. package/kits/campos-de-cor/elementos/FormaGeometrica.tsx +0 -37
  1664. package/kits/campos-de-cor/elementos/Fundo.tsx +0 -11
  1665. package/kits/campos-de-cor/elementos/LegendaItalica.tsx +0 -12
  1666. package/kits/campos-de-cor/elementos/ListaRegua.tsx +0 -30
  1667. package/kits/campos-de-cor/elementos/Montagem.tsx +0 -62
  1668. package/kits/campos-de-cor/elementos/PalavraGigante.tsx +0 -44
  1669. package/kits/campos-de-cor/elementos/Som.tsx +0 -39
  1670. package/kits/campos-de-cor/elementos/base.ts +0 -87
  1671. package/kits/campos-de-cor/elementos/index.ts +0 -17
  1672. package/kits/campos-de-cor/exemplos/logo-pulso.svg +0 -1
  1673. package/kits/campos-de-cor/exemplos/plano.json +0 -258
  1674. package/kits/campos-de-cor/exemplos/roteiro.md +0 -19
  1675. package/kits/campos-de-cor/preview.tsx +0 -12
  1676. package/kits/campos-de-cor/receita.json +0 -174
  1677. package/kits/campos-de-cor/regras/area-segura.md +0 -15
  1678. package/kits/campos-de-cor/regras/cor.md +0 -14
  1679. package/kits/campos-de-cor/regras/movimento.md +0 -15
  1680. package/kits/campos-de-cor/regras/ritmo.md +0 -15
  1681. package/kits/campos-de-cor/regras/som.md +0 -18
  1682. package/kits/campos-de-cor/regras/tipografia.md +0 -13
  1683. package/kits/cartaz-cinetico/assets/ASSETS.md +0 -22
  1684. package/kits/cartaz-cinetico/elementos/AssinaturaMarca.tsx +0 -31
  1685. package/kits/cartaz-cinetico/elementos/CartazPalavra.tsx +0 -40
  1686. package/kits/cartaz-cinetico/elementos/Cena.tsx +0 -41
  1687. package/kits/cartaz-cinetico/elementos/CirculoPoster.tsx +0 -22
  1688. package/kits/cartaz-cinetico/elementos/EcoPalavra.tsx +0 -27
  1689. package/kits/cartaz-cinetico/elementos/Fundo.tsx +0 -16
  1690. package/kits/cartaz-cinetico/elementos/Montagem.tsx +0 -59
  1691. package/kits/cartaz-cinetico/elementos/PilhaCartaz.tsx +0 -40
  1692. package/kits/cartaz-cinetico/elementos/RoletaPalavras.tsx +0 -30
  1693. package/kits/cartaz-cinetico/elementos/Selo.tsx +0 -25
  1694. package/kits/cartaz-cinetico/elementos/Som.tsx +0 -38
  1695. package/kits/cartaz-cinetico/elementos/base.ts +0 -72
  1696. package/kits/cartaz-cinetico/elementos/index.ts +0 -16
  1697. package/kits/cartaz-cinetico/exemplos/logo-feira.svg +0 -1
  1698. package/kits/cartaz-cinetico/exemplos/plano.json +0 -55
  1699. package/kits/cartaz-cinetico/exemplos/roteiro.md +0 -20
  1700. package/kits/cartaz-cinetico/preview.tsx +0 -16
  1701. package/kits/cartaz-cinetico/receita.json +0 -209
  1702. package/kits/cartaz-cinetico/regras/area-segura.md +0 -19
  1703. package/kits/cartaz-cinetico/regras/cor.md +0 -13
  1704. package/kits/cartaz-cinetico/regras/movimento.md +0 -16
  1705. package/kits/cartaz-cinetico/regras/ritmo.md +0 -17
  1706. package/kits/cartaz-cinetico/regras/som.md +0 -21
  1707. package/kits/cartaz-cinetico/regras/tipografia.md +0 -16
  1708. package/kits/colagem/assets/ASSETS.md +0 -25
  1709. package/kits/colagem/elementos/AssinaturaMarca.tsx +0 -17
  1710. package/kits/colagem/elementos/Camera.tsx +0 -21
  1711. package/kits/colagem/elementos/Cena.tsx +0 -36
  1712. package/kits/colagem/elementos/FitaAdesiva.tsx +0 -11
  1713. package/kits/colagem/elementos/FotoRasgada.tsx +0 -26
  1714. package/kits/colagem/elementos/Fundo.tsx +0 -16
  1715. package/kits/colagem/elementos/ListaRecortes.tsx +0 -23
  1716. package/kits/colagem/elementos/Montagem.tsx +0 -56
  1717. package/kits/colagem/elementos/NotaDatilografada.tsx +0 -35
  1718. package/kits/colagem/elementos/RecorteForma.tsx +0 -23
  1719. package/kits/colagem/elementos/Som.tsx +0 -30
  1720. package/kits/colagem/elementos/TituloRecorte.tsx +0 -34
  1721. package/kits/colagem/elementos/base.ts +0 -77
  1722. package/kits/colagem/elementos/index.ts +0 -17
  1723. package/kits/colagem/elementos/rasgado.ts +0 -16
  1724. package/kits/colagem/exemplos/fotos/foto-01.jpg +0 -0
  1725. package/kits/colagem/exemplos/fotos/foto-02.jpg +0 -0
  1726. package/kits/colagem/exemplos/plano.json +0 -228
  1727. package/kits/colagem/exemplos/roteiro.md +0 -20
  1728. package/kits/colagem/preview.tsx +0 -13
  1729. package/kits/colagem/receita.json +0 -171
  1730. package/kits/colagem/regras/area-segura.md +0 -15
  1731. package/kits/colagem/regras/cor.md +0 -16
  1732. package/kits/colagem/regras/movimento.md +0 -18
  1733. package/kits/colagem/regras/ritmo.md +0 -15
  1734. package/kits/colagem/regras/som.md +0 -18
  1735. package/kits/colagem/regras/tipografia.md +0 -18
  1736. package/kits/contagem/assets/ASSETS.md +0 -20
  1737. package/kits/contagem/elementos/AnelTempo.tsx +0 -36
  1738. package/kits/contagem/elementos/BarraDias.tsx +0 -41
  1739. package/kits/contagem/elementos/CarimboData.tsx +0 -37
  1740. package/kits/contagem/elementos/Cena.tsx +0 -39
  1741. package/kits/contagem/elementos/Fundo.tsx +0 -27
  1742. package/kits/contagem/elementos/Montagem.tsx +0 -58
  1743. package/kits/contagem/elementos/NumeroRolando.tsx +0 -49
  1744. package/kits/contagem/elementos/RelogioFlip.tsx +0 -51
  1745. package/kits/contagem/elementos/Som.tsx +0 -41
  1746. package/kits/contagem/elementos/base.ts +0 -79
  1747. package/kits/contagem/elementos/index.ts +0 -14
  1748. package/kits/contagem/exemplos/plano.json +0 -48
  1749. package/kits/contagem/exemplos/roteiro.md +0 -19
  1750. package/kits/contagem/preview.tsx +0 -9
  1751. package/kits/contagem/receita.json +0 -21
  1752. package/kits/contagem/regras/area-segura.md +0 -16
  1753. package/kits/contagem/regras/cor.md +0 -14
  1754. package/kits/contagem/regras/movimento.md +0 -23
  1755. package/kits/contagem/regras/ritmo.md +0 -15
  1756. package/kits/contagem/regras/som.md +0 -21
  1757. package/kits/contagem/regras/tipografia.md +0 -16
  1758. package/kits/convite-evento/assets/ASSETS.md +0 -19
  1759. package/kits/convite-evento/elementos/BotaoInscricao.tsx +0 -36
  1760. package/kits/convite-evento/elementos/Cena.tsx +0 -39
  1761. package/kits/convite-evento/elementos/DataGigante.tsx +0 -37
  1762. package/kits/convite-evento/elementos/Fundo.tsx +0 -30
  1763. package/kits/convite-evento/elementos/IngressoBilhete.tsx +0 -40
  1764. package/kits/convite-evento/elementos/LugarGigante.tsx +0 -38
  1765. package/kits/convite-evento/elementos/Montagem.tsx +0 -59
  1766. package/kits/convite-evento/elementos/SeloRotativo.tsx +0 -32
  1767. package/kits/convite-evento/elementos/Som.tsx +0 -40
  1768. package/kits/convite-evento/elementos/TituloEvento.tsx +0 -33
  1769. package/kits/convite-evento/elementos/base.ts +0 -82
  1770. package/kits/convite-evento/elementos/index.ts +0 -15
  1771. package/kits/convite-evento/exemplos/plano.json +0 -49
  1772. package/kits/convite-evento/exemplos/roteiro.md +0 -19
  1773. package/kits/convite-evento/preview.tsx +0 -9
  1774. package/kits/convite-evento/receita.json +0 -21
  1775. package/kits/convite-evento/regras/area-segura.md +0 -20
  1776. package/kits/convite-evento/regras/cor.md +0 -13
  1777. package/kits/convite-evento/regras/movimento.md +0 -20
  1778. package/kits/convite-evento/regras/ritmo.md +0 -15
  1779. package/kits/convite-evento/regras/som.md +0 -20
  1780. package/kits/convite-evento/regras/tipografia.md +0 -18
  1781. package/kits/corte-podcast/assets/ASSETS.md +0 -19
  1782. package/kits/corte-podcast/elementos/BarraEpisodio.tsx +0 -43
  1783. package/kits/corte-podcast/elementos/CartaoConvidado.tsx +0 -32
  1784. package/kits/corte-podcast/elementos/Cena.tsx +0 -41
  1785. package/kits/corte-podcast/elementos/CitacaoGrande.tsx +0 -42
  1786. package/kits/corte-podcast/elementos/Fundo.tsx +0 -27
  1787. package/kits/corte-podcast/elementos/LegendaKaraoke.tsx +0 -32
  1788. package/kits/corte-podcast/elementos/Montagem.tsx +0 -59
  1789. package/kits/corte-podcast/elementos/OndaAudio.tsx +0 -41
  1790. package/kits/corte-podcast/elementos/SeloEpisodio.tsx +0 -33
  1791. package/kits/corte-podcast/elementos/Som.tsx +0 -40
  1792. package/kits/corte-podcast/elementos/base.ts +0 -82
  1793. package/kits/corte-podcast/elementos/index.ts +0 -15
  1794. package/kits/corte-podcast/exemplos/plano.json +0 -62
  1795. package/kits/corte-podcast/exemplos/roteiro.md +0 -20
  1796. package/kits/corte-podcast/preview.tsx +0 -9
  1797. package/kits/corte-podcast/receita.json +0 -21
  1798. package/kits/corte-podcast/regras/area-segura.md +0 -18
  1799. package/kits/corte-podcast/regras/cor.md +0 -15
  1800. package/kits/corte-podcast/regras/movimento.md +0 -18
  1801. package/kits/corte-podcast/regras/ritmo.md +0 -16
  1802. package/kits/corte-podcast/regras/som.md +0 -20
  1803. package/kits/corte-podcast/regras/tipografia.md +0 -16
  1804. package/kits/cubos/assets/ASSETS.md +0 -21
  1805. package/kits/cubos/elementos/AssinaturaMarca.tsx +0 -29
  1806. package/kits/cubos/elementos/Cena.tsx +0 -48
  1807. package/kits/cubos/elementos/Cubo.tsx +0 -40
  1808. package/kits/cubos/elementos/CuboGiratorio.tsx +0 -37
  1809. package/kits/cubos/elementos/Fundo.tsx +0 -15
  1810. package/kits/cubos/elementos/Montagem.tsx +0 -67
  1811. package/kits/cubos/elementos/MontagemDeCubos.tsx +0 -58
  1812. package/kits/cubos/elementos/PlacaBloco.tsx +0 -29
  1813. package/kits/cubos/elementos/Som.tsx +0 -33
  1814. package/kits/cubos/elementos/TorreDeCubos.tsx +0 -39
  1815. package/kits/cubos/elementos/base.ts +0 -97
  1816. package/kits/cubos/elementos/index.ts +0 -15
  1817. package/kits/cubos/exemplos/logo-encaixa.svg +0 -1
  1818. package/kits/cubos/exemplos/plano.json +0 -45
  1819. package/kits/cubos/exemplos/roteiro.md +0 -20
  1820. package/kits/cubos/preview.tsx +0 -12
  1821. package/kits/cubos/receita.json +0 -151
  1822. package/kits/cubos/regras/area-segura.md +0 -18
  1823. package/kits/cubos/regras/cor.md +0 -23
  1824. package/kits/cubos/regras/movimento.md +0 -17
  1825. package/kits/cubos/regras/ritmo.md +0 -14
  1826. package/kits/cubos/regras/som.md +0 -20
  1827. package/kits/cubos/regras/tipografia.md +0 -15
  1828. package/kits/dashboard-dados/assets/ASSETS.md +0 -18
  1829. package/kits/dashboard-dados/elementos/AssinaturaMarca.tsx +0 -19
  1830. package/kits/dashboard-dados/elementos/BarrasCrescendo.tsx +0 -27
  1831. package/kits/dashboard-dados/elementos/Camera.tsx +0 -23
  1832. package/kits/dashboard-dados/elementos/Cena.tsx +0 -46
  1833. package/kits/dashboard-dados/elementos/Fundo.tsx +0 -12
  1834. package/kits/dashboard-dados/elementos/LinhaTendencia.tsx +0 -29
  1835. package/kits/dashboard-dados/elementos/Montagem.tsx +0 -60
  1836. package/kits/dashboard-dados/elementos/NumeroGigante.tsx +0 -21
  1837. package/kits/dashboard-dados/elementos/RankingBarras.tsx +0 -27
  1838. package/kits/dashboard-dados/elementos/RoscaDados.tsx +0 -39
  1839. package/kits/dashboard-dados/elementos/Som.tsx +0 -39
  1840. package/kits/dashboard-dados/elementos/base.ts +0 -87
  1841. package/kits/dashboard-dados/elementos/index.ts +0 -16
  1842. package/kits/dashboard-dados/exemplos/logo-radar.svg +0 -1
  1843. package/kits/dashboard-dados/exemplos/plano.json +0 -325
  1844. package/kits/dashboard-dados/exemplos/roteiro.md +0 -20
  1845. package/kits/dashboard-dados/preview.tsx +0 -12
  1846. package/kits/dashboard-dados/receita.json +0 -173
  1847. package/kits/dashboard-dados/regras/area-segura.md +0 -13
  1848. package/kits/dashboard-dados/regras/cor.md +0 -17
  1849. package/kits/dashboard-dados/regras/movimento.md +0 -17
  1850. package/kits/dashboard-dados/regras/ritmo.md +0 -14
  1851. package/kits/dashboard-dados/regras/som.md +0 -18
  1852. package/kits/dashboard-dados/regras/tipografia.md +0 -16
  1853. package/kits/depoimento/assets/ASSETS.md +0 -20
  1854. package/kits/depoimento/elementos/Avatar.tsx +0 -37
  1855. package/kits/depoimento/elementos/CartaoDepoimento.tsx +0 -69
  1856. package/kits/depoimento/elementos/Cena.tsx +0 -39
  1857. package/kits/depoimento/elementos/Estrelas.tsx +0 -34
  1858. package/kits/depoimento/elementos/FaixaAvatares.tsx +0 -41
  1859. package/kits/depoimento/elementos/Fundo.tsx +0 -23
  1860. package/kits/depoimento/elementos/Montagem.tsx +0 -60
  1861. package/kits/depoimento/elementos/NotaGigante.tsx +0 -38
  1862. package/kits/depoimento/elementos/PilhaCartoes.tsx +0 -37
  1863. package/kits/depoimento/elementos/SeloVerificado.tsx +0 -29
  1864. package/kits/depoimento/elementos/Som.tsx +0 -41
  1865. package/kits/depoimento/elementos/base.ts +0 -83
  1866. package/kits/depoimento/elementos/index.ts +0 -16
  1867. package/kits/depoimento/exemplos/plano.json +0 -57
  1868. package/kits/depoimento/exemplos/roteiro.md +0 -19
  1869. package/kits/depoimento/preview.tsx +0 -9
  1870. package/kits/depoimento/receita.json +0 -21
  1871. package/kits/depoimento/regras/area-segura.md +0 -17
  1872. package/kits/depoimento/regras/cor.md +0 -16
  1873. package/kits/depoimento/regras/movimento.md +0 -20
  1874. package/kits/depoimento/regras/ritmo.md +0 -15
  1875. package/kits/depoimento/regras/som.md +0 -21
  1876. package/kits/depoimento/regras/tipografia.md +0 -17
  1877. package/kits/infografico/assets/ASSETS.md +0 -19
  1878. package/kits/infografico/elementos/Anotacao.tsx +0 -34
  1879. package/kits/infografico/elementos/CadeiaPassos.tsx +0 -49
  1880. package/kits/infografico/elementos/Cena.tsx +0 -39
  1881. package/kits/infografico/elementos/Fundo.tsx +0 -23
  1882. package/kits/infografico/elementos/GraficoBarras.tsx +0 -41
  1883. package/kits/infografico/elementos/Icone.tsx +0 -35
  1884. package/kits/infografico/elementos/Montagem.tsx +0 -60
  1885. package/kits/infografico/elementos/NoProcesso.tsx +0 -33
  1886. package/kits/infografico/elementos/NumeroDestaque.tsx +0 -35
  1887. package/kits/infografico/elementos/SetaCurva.tsx +0 -33
  1888. package/kits/infografico/elementos/Som.tsx +0 -40
  1889. package/kits/infografico/elementos/base.ts +0 -80
  1890. package/kits/infografico/elementos/index.ts +0 -16
  1891. package/kits/infografico/exemplos/plano.json +0 -49
  1892. package/kits/infografico/exemplos/roteiro.md +0 -19
  1893. package/kits/infografico/preview.tsx +0 -9
  1894. package/kits/infografico/receita.json +0 -21
  1895. package/kits/infografico/regras/area-segura.md +0 -17
  1896. package/kits/infografico/regras/cor.md +0 -15
  1897. package/kits/infografico/regras/movimento.md +0 -20
  1898. package/kits/infografico/regras/ritmo.md +0 -15
  1899. package/kits/infografico/regras/som.md +0 -20
  1900. package/kits/infografico/regras/tipografia.md +0 -16
  1901. package/kits/isometrico/assets/ASSETS.md +0 -18
  1902. package/kits/isometrico/elementos/AssinaturaMarca.tsx +0 -24
  1903. package/kits/isometrico/elementos/BlocosMontando.tsx +0 -36
  1904. package/kits/isometrico/elementos/Camera.tsx +0 -23
  1905. package/kits/isometrico/elementos/Cena.tsx +0 -46
  1906. package/kits/isometrico/elementos/CidadeDeDados.tsx +0 -33
  1907. package/kits/isometrico/elementos/Fundo.tsx +0 -13
  1908. package/kits/isometrico/elementos/LegendaPlaca.tsx +0 -18
  1909. package/kits/isometrico/elementos/Montagem.tsx +0 -60
  1910. package/kits/isometrico/elementos/RedeDeBlocos.tsx +0 -41
  1911. package/kits/isometrico/elementos/Som.tsx +0 -39
  1912. package/kits/isometrico/elementos/TextoNoChao.tsx +0 -28
  1913. package/kits/isometrico/elementos/base.ts +0 -86
  1914. package/kits/isometrico/elementos/index.ts +0 -16
  1915. package/kits/isometrico/exemplos/logo-nodo.svg +0 -1
  1916. package/kits/isometrico/exemplos/plano.json +0 -433
  1917. package/kits/isometrico/exemplos/roteiro.md +0 -20
  1918. package/kits/isometrico/preview.tsx +0 -12
  1919. package/kits/isometrico/receita.json +0 -155
  1920. package/kits/isometrico/regras/area-segura.md +0 -13
  1921. package/kits/isometrico/regras/cor.md +0 -18
  1922. package/kits/isometrico/regras/movimento.md +0 -16
  1923. package/kits/isometrico/regras/ritmo.md +0 -13
  1924. package/kits/isometrico/regras/som.md +0 -18
  1925. package/kits/isometrico/regras/tipografia.md +0 -12
  1926. package/kits/jornal/assets/ASSETS.md +0 -24
  1927. package/kits/jornal/elementos/AssinaturaMarca.tsx +0 -25
  1928. package/kits/jornal/elementos/Cabecalho.tsx +0 -21
  1929. package/kits/jornal/elementos/Carimbo.tsx +0 -18
  1930. package/kits/jornal/elementos/Cena.tsx +0 -41
  1931. package/kits/jornal/elementos/Colunas.tsx +0 -24
  1932. package/kits/jornal/elementos/FotoMeiaTinta.tsx +0 -20
  1933. package/kits/jornal/elementos/Fundo.tsx +0 -18
  1934. package/kits/jornal/elementos/JornalGirando.tsx +0 -27
  1935. package/kits/jornal/elementos/Manchete.tsx +0 -30
  1936. package/kits/jornal/elementos/Montagem.tsx +0 -61
  1937. package/kits/jornal/elementos/Som.tsx +0 -38
  1938. package/kits/jornal/elementos/Ticker.tsx +0 -19
  1939. package/kits/jornal/elementos/base.ts +0 -76
  1940. package/kits/jornal/elementos/index.ts +0 -17
  1941. package/kits/jornal/exemplos/fotos/foto-03.jpg +0 -0
  1942. package/kits/jornal/exemplos/fotos/foto-07.jpg +0 -0
  1943. package/kits/jornal/exemplos/logo-esquina.svg +0 -1
  1944. package/kits/jornal/exemplos/plano.json +0 -48
  1945. package/kits/jornal/exemplos/roteiro.md +0 -19
  1946. package/kits/jornal/preview.tsx +0 -17
  1947. package/kits/jornal/receita.json +0 -170
  1948. package/kits/jornal/regras/area-segura.md +0 -19
  1949. package/kits/jornal/regras/cor.md +0 -14
  1950. package/kits/jornal/regras/movimento.md +0 -16
  1951. package/kits/jornal/regras/ritmo.md +0 -15
  1952. package/kits/jornal/regras/som.md +0 -21
  1953. package/kits/jornal/regras/tipografia.md +0 -17
  1954. package/kits/legenda-viva/assets/ASSETS.md +0 -23
  1955. package/kits/legenda-viva/elementos/AssinaturaMarca.tsx +0 -29
  1956. package/kits/legenda-viva/elementos/Cena.tsx +0 -41
  1957. package/kits/legenda-viva/elementos/ChipTema.tsx +0 -19
  1958. package/kits/legenda-viva/elementos/Fundo.tsx +0 -6
  1959. package/kits/legenda-viva/elementos/LegendaCaixa.tsx +0 -36
  1960. package/kits/legenda-viva/elementos/LegendaPalavra.tsx +0 -32
  1961. package/kits/legenda-viva/elementos/Montagem.tsx +0 -59
  1962. package/kits/legenda-viva/elementos/OndaVoz.tsx +0 -23
  1963. package/kits/legenda-viva/elementos/PalavraGigante.tsx +0 -18
  1964. package/kits/legenda-viva/elementos/QuadroFalante.tsx +0 -17
  1965. package/kits/legenda-viva/elementos/Som.tsx +0 -38
  1966. package/kits/legenda-viva/elementos/base.ts +0 -73
  1967. package/kits/legenda-viva/elementos/index.ts +0 -16
  1968. package/kits/legenda-viva/exemplos/fotos/foto-01.jpg +0 -0
  1969. package/kits/legenda-viva/exemplos/fotos/foto-02.jpg +0 -0
  1970. package/kits/legenda-viva/exemplos/fotos/foto-03.jpg +0 -0
  1971. package/kits/legenda-viva/exemplos/fotos/foto-05.jpg +0 -0
  1972. package/kits/legenda-viva/exemplos/logo-dica.svg +0 -1
  1973. package/kits/legenda-viva/exemplos/plano.json +0 -45
  1974. package/kits/legenda-viva/exemplos/roteiro.md +0 -18
  1975. package/kits/legenda-viva/preview.tsx +0 -19
  1976. package/kits/legenda-viva/receita.json +0 -171
  1977. package/kits/legenda-viva/regras/area-segura.md +0 -19
  1978. package/kits/legenda-viva/regras/cor.md +0 -14
  1979. package/kits/legenda-viva/regras/movimento.md +0 -16
  1980. package/kits/legenda-viva/regras/ritmo.md +0 -15
  1981. package/kits/legenda-viva/regras/som.md +0 -21
  1982. package/kits/legenda-viva/regras/tipografia.md +0 -16
  1983. package/kits/luxo/assets/ASSETS.md +0 -20
  1984. package/kits/luxo/elementos/Cena.tsx +0 -36
  1985. package/kits/luxo/elementos/ConviteOuro.tsx +0 -34
  1986. package/kits/luxo/elementos/Fundo.tsx +0 -26
  1987. package/kits/luxo/elementos/LegendaFina.tsx +0 -25
  1988. package/kits/luxo/elementos/LinhaOuro.tsx +0 -24
  1989. package/kits/luxo/elementos/MolduraArco.tsx +0 -36
  1990. package/kits/luxo/elementos/Monograma.tsx +0 -35
  1991. package/kits/luxo/elementos/Montagem.tsx +0 -59
  1992. package/kits/luxo/elementos/Som.tsx +0 -40
  1993. package/kits/luxo/elementos/TituloSerifa.tsx +0 -35
  1994. package/kits/luxo/elementos/base.ts +0 -85
  1995. package/kits/luxo/elementos/index.ts +0 -15
  1996. package/kits/luxo/exemplos/fotos/foto-07.jpg +0 -0
  1997. package/kits/luxo/exemplos/fotos/foto-08.jpg +0 -0
  1998. package/kits/luxo/exemplos/plano.json +0 -145
  1999. package/kits/luxo/exemplos/roteiro.md +0 -18
  2000. package/kits/luxo/preview.tsx +0 -13
  2001. package/kits/luxo/receita.json +0 -18
  2002. package/kits/luxo/regras/area-segura.md +0 -16
  2003. package/kits/luxo/regras/cor.md +0 -16
  2004. package/kits/luxo/regras/movimento.md +0 -19
  2005. package/kits/luxo/regras/ritmo.md +0 -14
  2006. package/kits/luxo/regras/som.md +0 -21
  2007. package/kits/luxo/regras/tipografia.md +0 -17
  2008. package/kits/mapa/assets/ASSETS.md +0 -20
  2009. package/kits/mapa/elementos/CartaoEndereco.tsx +0 -40
  2010. package/kits/mapa/elementos/Cena.tsx +0 -41
  2011. package/kits/mapa/elementos/ChipTempo.tsx +0 -29
  2012. package/kits/mapa/elementos/Fundo.tsx +0 -25
  2013. package/kits/mapa/elementos/MapaBase.tsx +0 -63
  2014. package/kits/mapa/elementos/Montagem.tsx +0 -59
  2015. package/kits/mapa/elementos/Pino.tsx +0 -38
  2016. package/kits/mapa/elementos/RotaAnimada.tsx +0 -38
  2017. package/kits/mapa/elementos/Som.tsx +0 -41
  2018. package/kits/mapa/elementos/TituloLocal.tsx +0 -38
  2019. package/kits/mapa/elementos/base.ts +0 -89
  2020. package/kits/mapa/elementos/index.ts +0 -15
  2021. package/kits/mapa/exemplos/plano.json +0 -48
  2022. package/kits/mapa/exemplos/roteiro.md +0 -19
  2023. package/kits/mapa/preview.tsx +0 -9
  2024. package/kits/mapa/receita.json +0 -21
  2025. package/kits/mapa/regras/area-segura.md +0 -15
  2026. package/kits/mapa/regras/cor.md +0 -18
  2027. package/kits/mapa/regras/movimento.md +0 -21
  2028. package/kits/mapa/regras/ritmo.md +0 -15
  2029. package/kits/mapa/regras/som.md +0 -21
  2030. package/kits/mapa/regras/tipografia.md +0 -16
  2031. package/kits/massinha/assets/ASSETS.md +0 -18
  2032. package/kits/massinha/elementos/AssinaturaMarca.tsx +0 -20
  2033. package/kits/massinha/elementos/BichinhoMassa.tsx +0 -30
  2034. package/kits/massinha/elementos/BolasMassa.tsx +0 -25
  2035. package/kits/massinha/elementos/Camera.tsx +0 -21
  2036. package/kits/massinha/elementos/Cena.tsx +0 -36
  2037. package/kits/massinha/elementos/FormaMassa.tsx +0 -23
  2038. package/kits/massinha/elementos/Fundo.tsx +0 -12
  2039. package/kits/massinha/elementos/ListaMassa.tsx +0 -19
  2040. package/kits/massinha/elementos/Montagem.tsx +0 -56
  2041. package/kits/massinha/elementos/Overlay.tsx +0 -11
  2042. package/kits/massinha/elementos/PlacaMassa.tsx +0 -24
  2043. package/kits/massinha/elementos/Som.tsx +0 -30
  2044. package/kits/massinha/elementos/TituloMassa.tsx +0 -31
  2045. package/kits/massinha/elementos/base.ts +0 -79
  2046. package/kits/massinha/elementos/index.ts +0 -17
  2047. package/kits/massinha/exemplos/plano.json +0 -220
  2048. package/kits/massinha/exemplos/roteiro.md +0 -20
  2049. package/kits/massinha/preview.tsx +0 -12
  2050. package/kits/massinha/receita.json +0 -170
  2051. package/kits/massinha/regras/area-segura.md +0 -15
  2052. package/kits/massinha/regras/cor.md +0 -18
  2053. package/kits/massinha/regras/movimento.md +0 -17
  2054. package/kits/massinha/regras/ritmo.md +0 -15
  2055. package/kits/massinha/regras/som.md +0 -17
  2056. package/kits/massinha/regras/tipografia.md +0 -18
  2057. package/kits/memphis/assets/ASSETS.md +0 -18
  2058. package/kits/memphis/elementos/AssinaturaMarca.tsx +0 -20
  2059. package/kits/memphis/elementos/Camera.tsx +0 -21
  2060. package/kits/memphis/elementos/CartaoMemphis.tsx +0 -16
  2061. package/kits/memphis/elementos/Cena.tsx +0 -36
  2062. package/kits/memphis/elementos/FitaMarquee.tsx +0 -21
  2063. package/kits/memphis/elementos/FormasMemphis.tsx +0 -46
  2064. package/kits/memphis/elementos/Fundo.tsx +0 -15
  2065. package/kits/memphis/elementos/ListaPilulas.tsx +0 -17
  2066. package/kits/memphis/elementos/Montagem.tsx +0 -56
  2067. package/kits/memphis/elementos/NumeroGigante.tsx +0 -19
  2068. package/kits/memphis/elementos/Overlay.tsx +0 -23
  2069. package/kits/memphis/elementos/Som.tsx +0 -30
  2070. package/kits/memphis/elementos/TituloMemphis.tsx +0 -28
  2071. package/kits/memphis/elementos/base.ts +0 -78
  2072. package/kits/memphis/elementos/index.ts +0 -17
  2073. package/kits/memphis/exemplos/plano.json +0 -314
  2074. package/kits/memphis/exemplos/roteiro.md +0 -20
  2075. package/kits/memphis/preview.tsx +0 -12
  2076. package/kits/memphis/receita.json +0 -174
  2077. package/kits/memphis/regras/area-segura.md +0 -14
  2078. package/kits/memphis/regras/cor.md +0 -17
  2079. package/kits/memphis/regras/movimento.md +0 -18
  2080. package/kits/memphis/regras/ritmo.md +0 -15
  2081. package/kits/memphis/regras/som.md +0 -18
  2082. package/kits/memphis/regras/tipografia.md +0 -19
  2083. package/kits/metal-liquido/assets/ASSETS.md +0 -21
  2084. package/kits/metal-liquido/elementos/AnelCromo.tsx +0 -28
  2085. package/kits/metal-liquido/elementos/AssinaturaMarca.tsx +0 -26
  2086. package/kits/metal-liquido/elementos/BolhasCromadas.tsx +0 -53
  2087. package/kits/metal-liquido/elementos/Cena.tsx +0 -48
  2088. package/kits/metal-liquido/elementos/EsferaCromo.tsx +0 -32
  2089. package/kits/metal-liquido/elementos/Fundo.tsx +0 -20
  2090. package/kits/metal-liquido/elementos/Montagem.tsx +0 -67
  2091. package/kits/metal-liquido/elementos/PilulaCromo.tsx +0 -23
  2092. package/kits/metal-liquido/elementos/Som.tsx +0 -33
  2093. package/kits/metal-liquido/elementos/TituloCromo.tsx +0 -32
  2094. package/kits/metal-liquido/elementos/base.ts +0 -94
  2095. package/kits/metal-liquido/elementos/index.ts +0 -15
  2096. package/kits/metal-liquido/exemplos/logo-mercurio.svg +0 -1
  2097. package/kits/metal-liquido/exemplos/plano.json +0 -48
  2098. package/kits/metal-liquido/exemplos/roteiro.md +0 -20
  2099. package/kits/metal-liquido/preview.tsx +0 -12
  2100. package/kits/metal-liquido/receita.json +0 -173
  2101. package/kits/metal-liquido/regras/area-segura.md +0 -16
  2102. package/kits/metal-liquido/regras/cor.md +0 -23
  2103. package/kits/metal-liquido/regras/movimento.md +0 -18
  2104. package/kits/metal-liquido/regras/ritmo.md +0 -14
  2105. package/kits/metal-liquido/regras/som.md +0 -20
  2106. package/kits/metal-liquido/regras/tipografia.md +0 -15
  2107. package/kits/minimal/assets/ASSETS.md +0 -19
  2108. package/kits/minimal/elementos/Cena.tsx +0 -39
  2109. package/kits/minimal/elementos/FormaMorph.tsx +0 -44
  2110. package/kits/minimal/elementos/FraseUnica.tsx +0 -33
  2111. package/kits/minimal/elementos/Fundo.tsx +0 -20
  2112. package/kits/minimal/elementos/LinhaFina.tsx +0 -24
  2113. package/kits/minimal/elementos/Montagem.tsx +0 -59
  2114. package/kits/minimal/elementos/NumeroSolo.tsx +0 -33
  2115. package/kits/minimal/elementos/PontoMovel.tsx +0 -27
  2116. package/kits/minimal/elementos/RodapeMinimal.tsx +0 -26
  2117. package/kits/minimal/elementos/Som.tsx +0 -40
  2118. package/kits/minimal/elementos/base.ts +0 -80
  2119. package/kits/minimal/elementos/index.ts +0 -15
  2120. package/kits/minimal/exemplos/plano.json +0 -48
  2121. package/kits/minimal/exemplos/roteiro.md +0 -19
  2122. package/kits/minimal/preview.tsx +0 -9
  2123. package/kits/minimal/receita.json +0 -21
  2124. package/kits/minimal/regras/area-segura.md +0 -15
  2125. package/kits/minimal/regras/cor.md +0 -12
  2126. package/kits/minimal/regras/movimento.md +0 -20
  2127. package/kits/minimal/regras/ritmo.md +0 -15
  2128. package/kits/minimal/regras/som.md +0 -21
  2129. package/kits/minimal/regras/tipografia.md +0 -15
  2130. package/kits/neon-cidade/assets/ASSETS.md +0 -21
  2131. package/kits/neon-cidade/elementos/AssinaturaMarca.tsx +0 -24
  2132. package/kits/neon-cidade/elementos/CaixaLuminosa.tsx +0 -40
  2133. package/kits/neon-cidade/elementos/Cena.tsx +0 -48
  2134. package/kits/neon-cidade/elementos/Chuva.tsx +0 -23
  2135. package/kits/neon-cidade/elementos/FormaNeon.tsx +0 -42
  2136. package/kits/neon-cidade/elementos/Fundo.tsx +0 -18
  2137. package/kits/neon-cidade/elementos/Horizonte.tsx +0 -34
  2138. package/kits/neon-cidade/elementos/LetreiroNeon.tsx +0 -46
  2139. package/kits/neon-cidade/elementos/Montagem.tsx +0 -67
  2140. package/kits/neon-cidade/elementos/Som.tsx +0 -33
  2141. package/kits/neon-cidade/elementos/base.ts +0 -100
  2142. package/kits/neon-cidade/elementos/index.ts +0 -15
  2143. package/kits/neon-cidade/exemplos/logo-fenix.svg +0 -1
  2144. package/kits/neon-cidade/exemplos/plano.json +0 -50
  2145. package/kits/neon-cidade/exemplos/roteiro.md +0 -20
  2146. package/kits/neon-cidade/preview.tsx +0 -12
  2147. package/kits/neon-cidade/receita.json +0 -151
  2148. package/kits/neon-cidade/regras/area-segura.md +0 -18
  2149. package/kits/neon-cidade/regras/cor.md +0 -23
  2150. package/kits/neon-cidade/regras/movimento.md +0 -18
  2151. package/kits/neon-cidade/regras/ritmo.md +0 -14
  2152. package/kits/neon-cidade/regras/som.md +0 -20
  2153. package/kits/neon-cidade/regras/tipografia.md +0 -15
  2154. package/kits/notion-editorial/assets/ASSETS.md +0 -19
  2155. package/kits/notion-editorial/elementos/AssinaturaMarca.tsx +0 -20
  2156. package/kits/notion-editorial/elementos/BlocoNota.tsx +0 -38
  2157. package/kits/notion-editorial/elementos/Camera.tsx +0 -23
  2158. package/kits/notion-editorial/elementos/Cena.tsx +0 -46
  2159. package/kits/notion-editorial/elementos/Diagrama.tsx +0 -29
  2160. package/kits/notion-editorial/elementos/Fundo.tsx +0 -12
  2161. package/kits/notion-editorial/elementos/Montagem.tsx +0 -60
  2162. package/kits/notion-editorial/elementos/PassosNumerados.tsx +0 -23
  2163. package/kits/notion-editorial/elementos/RabiscoIcone.tsx +0 -33
  2164. package/kits/notion-editorial/elementos/Som.tsx +0 -39
  2165. package/kits/notion-editorial/elementos/TextoSerifa.tsx +0 -53
  2166. package/kits/notion-editorial/elementos/base.ts +0 -87
  2167. package/kits/notion-editorial/elementos/index.ts +0 -16
  2168. package/kits/notion-editorial/exemplos/logo-pauta.svg +0 -1
  2169. package/kits/notion-editorial/exemplos/plano.json +0 -254
  2170. package/kits/notion-editorial/exemplos/roteiro.md +0 -20
  2171. package/kits/notion-editorial/preview.tsx +0 -12
  2172. package/kits/notion-editorial/receita.json +0 -165
  2173. package/kits/notion-editorial/regras/area-segura.md +0 -13
  2174. package/kits/notion-editorial/regras/cor.md +0 -15
  2175. package/kits/notion-editorial/regras/movimento.md +0 -16
  2176. package/kits/notion-editorial/regras/ritmo.md +0 -14
  2177. package/kits/notion-editorial/regras/som.md +0 -18
  2178. package/kits/notion-editorial/regras/tipografia.md +0 -15
  2179. package/kits/papel-recortado/assets/ASSETS.md +0 -18
  2180. package/kits/papel-recortado/elementos/CamadaPapel.tsx +0 -81
  2181. package/kits/papel-recortado/elementos/Camera.tsx +0 -28
  2182. package/kits/papel-recortado/elementos/CartaoCamadas.tsx +0 -38
  2183. package/kits/papel-recortado/elementos/Cena.tsx +0 -29
  2184. package/kits/papel-recortado/elementos/EtiquetaPapel.tsx +0 -40
  2185. package/kits/papel-recortado/elementos/Fita.tsx +0 -21
  2186. package/kits/papel-recortado/elementos/FolhaPopUp.tsx +0 -49
  2187. package/kits/papel-recortado/elementos/Fundo.tsx +0 -10
  2188. package/kits/papel-recortado/elementos/LetrasRecortadas.tsx +0 -48
  2189. package/kits/papel-recortado/elementos/MolduraPapel.tsx +0 -12
  2190. package/kits/papel-recortado/elementos/Montagem.tsx +0 -42
  2191. package/kits/papel-recortado/elementos/Som.tsx +0 -30
  2192. package/kits/papel-recortado/elementos/base.ts +0 -51
  2193. package/kits/papel-recortado/elementos/index.ts +0 -15
  2194. package/kits/papel-recortado/exemplos/plano.json +0 -410
  2195. package/kits/papel-recortado/exemplos/roteiro.md +0 -13
  2196. package/kits/papel-recortado/preview.tsx +0 -9
  2197. package/kits/papel-recortado/receita.json +0 -14
  2198. package/kits/papel-recortado/regras/area-segura.md +0 -13
  2199. package/kits/papel-recortado/regras/cor.md +0 -16
  2200. package/kits/papel-recortado/regras/movimento.md +0 -17
  2201. package/kits/papel-recortado/regras/ritmo.md +0 -13
  2202. package/kits/papel-recortado/regras/som.md +0 -17
  2203. package/kits/papel-recortado/regras/tipografia.md +0 -12
  2204. package/kits/pixel/assets/ASSETS.md +0 -18
  2205. package/kits/pixel/elementos/AssinaturaMarca.tsx +0 -18
  2206. package/kits/pixel/elementos/CaixaDialogo.tsx +0 -22
  2207. package/kits/pixel/elementos/Camera.tsx +0 -21
  2208. package/kits/pixel/elementos/Cena.tsx +0 -36
  2209. package/kits/pixel/elementos/ChuvaDeSprites.tsx +0 -15
  2210. package/kits/pixel/elementos/Fundo.tsx +0 -23
  2211. package/kits/pixel/elementos/HudPlacar.tsx +0 -19
  2212. package/kits/pixel/elementos/MenuPixel.tsx +0 -19
  2213. package/kits/pixel/elementos/Montagem.tsx +0 -56
  2214. package/kits/pixel/elementos/Overlay.tsx +0 -14
  2215. package/kits/pixel/elementos/Som.tsx +0 -30
  2216. package/kits/pixel/elementos/Sprite.tsx +0 -33
  2217. package/kits/pixel/elementos/TituloPixel.tsx +0 -31
  2218. package/kits/pixel/elementos/base.ts +0 -79
  2219. package/kits/pixel/elementos/index.ts +0 -17
  2220. package/kits/pixel/exemplos/plano.json +0 -309
  2221. package/kits/pixel/exemplos/roteiro.md +0 -20
  2222. package/kits/pixel/preview.tsx +0 -12
  2223. package/kits/pixel/receita.json +0 -175
  2224. package/kits/pixel/regras/area-segura.md +0 -14
  2225. package/kits/pixel/regras/cor.md +0 -17
  2226. package/kits/pixel/regras/movimento.md +0 -18
  2227. package/kits/pixel/regras/ritmo.md +0 -15
  2228. package/kits/pixel/regras/som.md +0 -18
  2229. package/kits/pixel/regras/tipografia.md +0 -18
  2230. package/kits/pontos-3d/assets/ASSETS.md +0 -21
  2231. package/kits/pontos-3d/elementos/AssinaturaMarca.tsx +0 -23
  2232. package/kits/pontos-3d/elementos/Cena.tsx +0 -48
  2233. package/kits/pontos-3d/elementos/Contador.tsx +0 -32
  2234. package/kits/pontos-3d/elementos/Fundo.tsx +0 -20
  2235. package/kits/pontos-3d/elementos/Montagem.tsx +0 -67
  2236. package/kits/pontos-3d/elementos/NuvemDePontos.tsx +0 -84
  2237. package/kits/pontos-3d/elementos/RotuloPonto.tsx +0 -32
  2238. package/kits/pontos-3d/elementos/Som.tsx +0 -33
  2239. package/kits/pontos-3d/elementos/TextoDePontos.tsx +0 -55
  2240. package/kits/pontos-3d/elementos/TituloSora.tsx +0 -36
  2241. package/kits/pontos-3d/elementos/base.ts +0 -92
  2242. package/kits/pontos-3d/elementos/index.ts +0 -15
  2243. package/kits/pontos-3d/exemplos/logo-malha.svg +0 -1
  2244. package/kits/pontos-3d/exemplos/plano.json +0 -46
  2245. package/kits/pontos-3d/exemplos/roteiro.md +0 -20
  2246. package/kits/pontos-3d/preview.tsx +0 -12
  2247. package/kits/pontos-3d/receita.json +0 -153
  2248. package/kits/pontos-3d/regras/area-segura.md +0 -17
  2249. package/kits/pontos-3d/regras/cor.md +0 -21
  2250. package/kits/pontos-3d/regras/movimento.md +0 -19
  2251. package/kits/pontos-3d/regras/ritmo.md +0 -14
  2252. package/kits/pontos-3d/regras/som.md +0 -20
  2253. package/kits/pontos-3d/regras/tipografia.md +0 -16
  2254. package/kits/produto-3d/assets/ASSETS.md +0 -18
  2255. package/kits/produto-3d/elementos/AssinaturaMarca.tsx +0 -28
  2256. package/kits/produto-3d/elementos/Camera.tsx +0 -23
  2257. package/kits/produto-3d/elementos/Cena.tsx +0 -55
  2258. package/kits/produto-3d/elementos/Fundo.tsx +0 -45
  2259. package/kits/produto-3d/elementos/Montagem.tsx +0 -53
  2260. package/kits/produto-3d/elementos/NumeroDestaque.tsx +0 -35
  2261. package/kits/produto-3d/elementos/Produto3D.tsx +0 -144
  2262. package/kits/produto-3d/elementos/RotuloChamada.tsx +0 -43
  2263. package/kits/produto-3d/elementos/Som.tsx +0 -39
  2264. package/kits/produto-3d/elementos/TituloMinimo.tsx +0 -45
  2265. package/kits/produto-3d/elementos/VarreduraLuz.tsx +0 -22
  2266. package/kits/produto-3d/elementos/base.ts +0 -109
  2267. package/kits/produto-3d/elementos/index.ts +0 -13
  2268. package/kits/produto-3d/exemplos/plano.json +0 -53
  2269. package/kits/produto-3d/exemplos/roteiro.md +0 -15
  2270. package/kits/produto-3d/preview.tsx +0 -9
  2271. package/kits/produto-3d/receita.json +0 -16
  2272. package/kits/produto-3d/regras/area-segura.md +0 -14
  2273. package/kits/produto-3d/regras/cor.md +0 -20
  2274. package/kits/produto-3d/regras/movimento.md +0 -19
  2275. package/kits/produto-3d/regras/ritmo.md +0 -15
  2276. package/kits/produto-3d/regras/som.md +0 -18
  2277. package/kits/produto-3d/regras/tipografia.md +0 -13
  2278. package/kits/quadro-giz/assets/ASSETS.md +0 -18
  2279. package/kits/quadro-giz/elementos/ApagadorVarrendo.tsx +0 -32
  2280. package/kits/quadro-giz/elementos/AssinaturaMarca.tsx +0 -20
  2281. package/kits/quadro-giz/elementos/Camera.tsx +0 -21
  2282. package/kits/quadro-giz/elementos/CartaoGiz.tsx +0 -25
  2283. package/kits/quadro-giz/elementos/Cena.tsx +0 -36
  2284. package/kits/quadro-giz/elementos/ContaNoQuadro.tsx +0 -34
  2285. package/kits/quadro-giz/elementos/DesenhoGiz.tsx +0 -29
  2286. package/kits/quadro-giz/elementos/Fundo.tsx +0 -21
  2287. package/kits/quadro-giz/elementos/ListaGiz.tsx +0 -21
  2288. package/kits/quadro-giz/elementos/Montagem.tsx +0 -56
  2289. package/kits/quadro-giz/elementos/Overlay.tsx +0 -12
  2290. package/kits/quadro-giz/elementos/Som.tsx +0 -30
  2291. package/kits/quadro-giz/elementos/TituloGiz.tsx +0 -29
  2292. package/kits/quadro-giz/elementos/base.ts +0 -78
  2293. package/kits/quadro-giz/elementos/index.ts +0 -17
  2294. package/kits/quadro-giz/elementos/traco.ts +0 -9
  2295. package/kits/quadro-giz/exemplos/plano.json +0 -237
  2296. package/kits/quadro-giz/exemplos/roteiro.md +0 -20
  2297. package/kits/quadro-giz/preview.tsx +0 -12
  2298. package/kits/quadro-giz/receita.json +0 -193
  2299. package/kits/quadro-giz/regras/area-segura.md +0 -15
  2300. package/kits/quadro-giz/regras/cor.md +0 -17
  2301. package/kits/quadro-giz/regras/movimento.md +0 -18
  2302. package/kits/quadro-giz/regras/ritmo.md +0 -16
  2303. package/kits/quadro-giz/regras/som.md +0 -18
  2304. package/kits/quadro-giz/regras/tipografia.md +0 -19
  2305. package/kits/rabisco/assets/ASSETS.md +0 -18
  2306. package/kits/rabisco/elementos/AssinaturaMarca.tsx +0 -21
  2307. package/kits/rabisco/elementos/Bonequinho.tsx +0 -31
  2308. package/kits/rabisco/elementos/Camera.tsx +0 -21
  2309. package/kits/rabisco/elementos/CartaoRabiscado.tsx +0 -27
  2310. package/kits/rabisco/elementos/Cena.tsx +0 -36
  2311. package/kits/rabisco/elementos/Fundo.tsx +0 -17
  2312. package/kits/rabisco/elementos/ListaRabiscada.tsx +0 -23
  2313. package/kits/rabisco/elementos/Montagem.tsx +0 -55
  2314. package/kits/rabisco/elementos/Som.tsx +0 -30
  2315. package/kits/rabisco/elementos/TituloRabisco.tsx +0 -28
  2316. package/kits/rabisco/elementos/TracoDesenhando.tsx +0 -31
  2317. package/kits/rabisco/elementos/base.ts +0 -76
  2318. package/kits/rabisco/elementos/index.ts +0 -16
  2319. package/kits/rabisco/elementos/traco.ts +0 -10
  2320. package/kits/rabisco/exemplos/plano.json +0 -238
  2321. package/kits/rabisco/exemplos/roteiro.md +0 -20
  2322. package/kits/rabisco/preview.tsx +0 -12
  2323. package/kits/rabisco/receita.json +0 -171
  2324. package/kits/rabisco/regras/area-segura.md +0 -14
  2325. package/kits/rabisco/regras/cor.md +0 -15
  2326. package/kits/rabisco/regras/movimento.md +0 -18
  2327. package/kits/rabisco/regras/ritmo.md +0 -15
  2328. package/kits/rabisco/regras/som.md +0 -17
  2329. package/kits/rabisco/regras/tipografia.md +0 -18
  2330. package/kits/retro-70/assets/ASSETS.md +0 -23
  2331. package/kits/retro-70/elementos/ArcoListras.tsx +0 -25
  2332. package/kits/retro-70/elementos/AssinaturaMarca.tsx +0 -21
  2333. package/kits/retro-70/elementos/CartaoData.tsx +0 -24
  2334. package/kits/retro-70/elementos/Cena.tsx +0 -41
  2335. package/kits/retro-70/elementos/FaixaOnda.tsx +0 -27
  2336. package/kits/retro-70/elementos/Flor70.tsx +0 -25
  2337. package/kits/retro-70/elementos/FotoArredondada.tsx +0 -19
  2338. package/kits/retro-70/elementos/Fundo.tsx +0 -11
  2339. package/kits/retro-70/elementos/Montagem.tsx +0 -60
  2340. package/kits/retro-70/elementos/RaiosDeSol.tsx +0 -27
  2341. package/kits/retro-70/elementos/Som.tsx +0 -38
  2342. package/kits/retro-70/elementos/TituloGordo.tsx +0 -28
  2343. package/kits/retro-70/elementos/base.ts +0 -73
  2344. package/kits/retro-70/elementos/index.ts +0 -17
  2345. package/kits/retro-70/exemplos/fotos/foto-02.jpg +0 -0
  2346. package/kits/retro-70/exemplos/fotos/foto-03.jpg +0 -0
  2347. package/kits/retro-70/exemplos/logo-girassol.svg +0 -1
  2348. package/kits/retro-70/exemplos/plano.json +0 -50
  2349. package/kits/retro-70/exemplos/roteiro.md +0 -19
  2350. package/kits/retro-70/preview.tsx +0 -17
  2351. package/kits/retro-70/receita.json +0 -172
  2352. package/kits/retro-70/regras/area-segura.md +0 -20
  2353. package/kits/retro-70/regras/cor.md +0 -14
  2354. package/kits/retro-70/regras/movimento.md +0 -16
  2355. package/kits/retro-70/regras/ritmo.md +0 -15
  2356. package/kits/retro-70/regras/som.md +0 -21
  2357. package/kits/retro-70/regras/tipografia.md +0 -17
  2358. package/kits/revista/assets/ASSETS.md +0 -24
  2359. package/kits/revista/elementos/AssinaturaMarca.tsx +0 -23
  2360. package/kits/revista/elementos/Cena.tsx +0 -41
  2361. package/kits/revista/elementos/CitacaoGrande.tsx +0 -27
  2362. package/kits/revista/elementos/ColagemFotos.tsx +0 -22
  2363. package/kits/revista/elementos/Folio.tsx +0 -19
  2364. package/kits/revista/elementos/FotoSangrando.tsx +0 -24
  2365. package/kits/revista/elementos/Fundo.tsx +0 -11
  2366. package/kits/revista/elementos/Montagem.tsx +0 -59
  2367. package/kits/revista/elementos/PaginaDupla.tsx +0 -36
  2368. package/kits/revista/elementos/Som.tsx +0 -38
  2369. package/kits/revista/elementos/TituloEditorial.tsx +0 -31
  2370. package/kits/revista/elementos/base.ts +0 -76
  2371. package/kits/revista/elementos/index.ts +0 -16
  2372. package/kits/revista/exemplos/fotos/foto-02.jpg +0 -0
  2373. package/kits/revista/exemplos/fotos/foto-03.jpg +0 -0
  2374. package/kits/revista/exemplos/fotos/foto-05.jpg +0 -0
  2375. package/kits/revista/exemplos/fotos/foto-06.jpg +0 -0
  2376. package/kits/revista/exemplos/fotos/foto-07.jpg +0 -0
  2377. package/kits/revista/exemplos/fotos/foto-08.jpg +0 -0
  2378. package/kits/revista/exemplos/logo-linho.svg +0 -1
  2379. package/kits/revista/exemplos/plano.json +0 -44
  2380. package/kits/revista/exemplos/roteiro.md +0 -19
  2381. package/kits/revista/preview.tsx +0 -21
  2382. package/kits/revista/receita.json +0 -168
  2383. package/kits/revista/regras/area-segura.md +0 -19
  2384. package/kits/revista/regras/cor.md +0 -14
  2385. package/kits/revista/regras/movimento.md +0 -15
  2386. package/kits/revista/regras/ritmo.md +0 -15
  2387. package/kits/revista/regras/som.md +0 -21
  2388. package/kits/revista/regras/tipografia.md +0 -17
  2389. package/kits/risografia/assets/ASSETS.md +0 -18
  2390. package/kits/risografia/elementos/AssinaturaMarca.tsx +0 -21
  2391. package/kits/risografia/elementos/BolaReticula.tsx +0 -26
  2392. package/kits/risografia/elementos/Camera.tsx +0 -21
  2393. package/kits/risografia/elementos/Cena.tsx +0 -36
  2394. package/kits/risografia/elementos/FormaRiso.tsx +0 -24
  2395. package/kits/risografia/elementos/Fundo.tsx +0 -12
  2396. package/kits/risografia/elementos/ListaRiso.tsx +0 -22
  2397. package/kits/risografia/elementos/Montagem.tsx +0 -56
  2398. package/kits/risografia/elementos/NumeroRiso.tsx +0 -21
  2399. package/kits/risografia/elementos/Overlay.tsx +0 -18
  2400. package/kits/risografia/elementos/Som.tsx +0 -30
  2401. package/kits/risografia/elementos/TarjaCarimbo.tsx +0 -20
  2402. package/kits/risografia/elementos/TituloRiso.tsx +0 -26
  2403. package/kits/risografia/elementos/base.ts +0 -73
  2404. package/kits/risografia/elementos/index.ts +0 -17
  2405. package/kits/risografia/exemplos/plano.json +0 -209
  2406. package/kits/risografia/exemplos/roteiro.md +0 -20
  2407. package/kits/risografia/preview.tsx +0 -12
  2408. package/kits/risografia/receita.json +0 -169
  2409. package/kits/risografia/regras/area-segura.md +0 -14
  2410. package/kits/risografia/regras/cor.md +0 -12
  2411. package/kits/risografia/regras/movimento.md +0 -18
  2412. package/kits/risografia/regras/ritmo.md +0 -15
  2413. package/kits/risografia/regras/som.md +0 -17
  2414. package/kits/risografia/regras/tipografia.md +0 -18
  2415. package/kits/saas-linear/assets/ASSETS.md +0 -19
  2416. package/kits/saas-linear/assets/fontes/OFL-Inter.txt +0 -93
  2417. package/kits/saas-linear/assets/fontes/OFL-Newsreader.txt +0 -93
  2418. package/kits/saas-linear/assets/fontes/inter-400.woff2 +0 -0
  2419. package/kits/saas-linear/assets/fontes/inter-600.woff2 +0 -0
  2420. package/kits/saas-linear/assets/fontes/newsreader-400.woff2 +0 -0
  2421. package/kits/saas-linear/elementos/Agenda.tsx +0 -46
  2422. package/kits/saas-linear/elementos/CaixaPrompt.tsx +0 -41
  2423. package/kits/saas-linear/elementos/Camera.tsx +0 -38
  2424. package/kits/saas-linear/elementos/CartoesIntegracao.tsx +0 -57
  2425. package/kits/saas-linear/elementos/Cena.tsx +0 -38
  2426. package/kits/saas-linear/elementos/Cursor.tsx +0 -40
  2427. package/kits/saas-linear/elementos/FraseSerifa.tsx +0 -25
  2428. package/kits/saas-linear/elementos/Fundo.tsx +0 -18
  2429. package/kits/saas-linear/elementos/Marca.tsx +0 -20
  2430. package/kits/saas-linear/elementos/MarcaFinal.tsx +0 -22
  2431. package/kits/saas-linear/elementos/Menu.tsx +0 -46
  2432. package/kits/saas-linear/elementos/Monitor.tsx +0 -28
  2433. package/kits/saas-linear/elementos/Montagem.tsx +0 -67
  2434. package/kits/saas-linear/elementos/Saudacao.tsx +0 -27
  2435. package/kits/saas-linear/elementos/Som.tsx +0 -39
  2436. package/kits/saas-linear/elementos/base.ts +0 -84
  2437. package/kits/saas-linear/elementos/index.ts +0 -21
  2438. package/kits/saas-linear/exemplos/plano.json +0 -459
  2439. package/kits/saas-linear/exemplos/roteiro.md +0 -15
  2440. package/kits/saas-linear/preview.tsx +0 -9
  2441. package/kits/saas-linear/receita.json +0 -32
  2442. package/kits/saas-linear/regras/area-segura.md +0 -17
  2443. package/kits/saas-linear/regras/cor.md +0 -19
  2444. package/kits/saas-linear/regras/movimento.md +0 -20
  2445. package/kits/saas-linear/regras/ritmo.md +0 -14
  2446. package/kits/saas-linear/regras/som.md +0 -16
  2447. package/kits/saas-linear/regras/tipografia.md +0 -17
  2448. package/kits/stripe-ondas/assets/ASSETS.md +0 -18
  2449. package/kits/stripe-ondas/elementos/AssinaturaMarca.tsx +0 -18
  2450. package/kits/stripe-ondas/elementos/Camera.tsx +0 -23
  2451. package/kits/stripe-ondas/elementos/CartaoPagamento.tsx +0 -35
  2452. package/kits/stripe-ondas/elementos/Cena.tsx +0 -46
  2453. package/kits/stripe-ondas/elementos/FaixaDeOndas.tsx +0 -49
  2454. package/kits/stripe-ondas/elementos/Fundo.tsx +0 -11
  2455. package/kits/stripe-ondas/elementos/GraficoOnda.tsx +0 -34
  2456. package/kits/stripe-ondas/elementos/Montagem.tsx +0 -61
  2457. package/kits/stripe-ondas/elementos/PainelCodigo.tsx +0 -36
  2458. package/kits/stripe-ondas/elementos/SelosDeMetodo.tsx +0 -27
  2459. package/kits/stripe-ondas/elementos/Som.tsx +0 -39
  2460. package/kits/stripe-ondas/elementos/TituloLimpo.tsx +0 -27
  2461. package/kits/stripe-ondas/elementos/base.ts +0 -85
  2462. package/kits/stripe-ondas/elementos/index.ts +0 -16
  2463. package/kits/stripe-ondas/exemplos/logo-cais.svg +0 -1
  2464. package/kits/stripe-ondas/exemplos/plano.json +0 -366
  2465. package/kits/stripe-ondas/exemplos/roteiro.md +0 -20
  2466. package/kits/stripe-ondas/preview.tsx +0 -12
  2467. package/kits/stripe-ondas/receita.json +0 -177
  2468. package/kits/stripe-ondas/regras/area-segura.md +0 -16
  2469. package/kits/stripe-ondas/regras/cor.md +0 -17
  2470. package/kits/stripe-ondas/regras/movimento.md +0 -16
  2471. package/kits/stripe-ondas/regras/ritmo.md +0 -14
  2472. package/kits/stripe-ondas/regras/som.md +0 -18
  2473. package/kits/stripe-ondas/regras/tipografia.md +0 -15
  2474. package/kits/suica/assets/ASSETS.md +0 -23
  2475. package/kits/suica/elementos/AssinaturaMarca.tsx +0 -21
  2476. package/kits/suica/elementos/Cena.tsx +0 -41
  2477. package/kits/suica/elementos/DiscoFoto.tsx +0 -20
  2478. package/kits/suica/elementos/Fundo.tsx +0 -16
  2479. package/kits/suica/elementos/GradeFotos.tsx +0 -21
  2480. package/kits/suica/elementos/Indice.tsx +0 -17
  2481. package/kits/suica/elementos/ListaIndice.tsx +0 -25
  2482. package/kits/suica/elementos/Montagem.tsx +0 -60
  2483. package/kits/suica/elementos/NumeroGigante.tsx +0 -21
  2484. package/kits/suica/elementos/Regua.tsx +0 -20
  2485. package/kits/suica/elementos/Som.tsx +0 -38
  2486. package/kits/suica/elementos/TituloGrade.tsx +0 -38
  2487. package/kits/suica/elementos/base.ts +0 -76
  2488. package/kits/suica/elementos/index.ts +0 -17
  2489. package/kits/suica/exemplos/fotos/foto-01.jpg +0 -0
  2490. package/kits/suica/exemplos/fotos/foto-02.jpg +0 -0
  2491. package/kits/suica/exemplos/fotos/foto-03.jpg +0 -0
  2492. package/kits/suica/exemplos/fotos/foto-05.jpg +0 -0
  2493. package/kits/suica/exemplos/fotos/foto-06.jpg +0 -0
  2494. package/kits/suica/exemplos/fotos/foto-07.jpg +0 -0
  2495. package/kits/suica/exemplos/logo-ponto.svg +0 -1
  2496. package/kits/suica/exemplos/plano.json +0 -268
  2497. package/kits/suica/exemplos/roteiro.md +0 -19
  2498. package/kits/suica/preview.tsx +0 -21
  2499. package/kits/suica/receita.json +0 -197
  2500. package/kits/suica/regras/area-segura.md +0 -18
  2501. package/kits/suica/regras/cor.md +0 -13
  2502. package/kits/suica/regras/movimento.md +0 -15
  2503. package/kits/suica/regras/ritmo.md +0 -17
  2504. package/kits/suica/regras/som.md +0 -21
  2505. package/kits/suica/regras/tipografia.md +0 -16
  2506. package/kits/synthwave/assets/ASSETS.md +0 -22
  2507. package/kits/synthwave/elementos/AssinaturaMarca.tsx +0 -26
  2508. package/kits/synthwave/elementos/Cena.tsx +0 -41
  2509. package/kits/synthwave/elementos/Estrelas.tsx +0 -27
  2510. package/kits/synthwave/elementos/Fundo.tsx +0 -20
  2511. package/kits/synthwave/elementos/Montagem.tsx +0 -59
  2512. package/kits/synthwave/elementos/Montanhas.tsx +0 -27
  2513. package/kits/synthwave/elementos/Palmeiras.tsx +0 -30
  2514. package/kits/synthwave/elementos/QuadroHUD.tsx +0 -33
  2515. package/kits/synthwave/elementos/SolListrado.tsx +0 -29
  2516. package/kits/synthwave/elementos/Som.tsx +0 -38
  2517. package/kits/synthwave/elementos/TituloNeon.tsx +0 -30
  2518. package/kits/synthwave/elementos/base.ts +0 -75
  2519. package/kits/synthwave/elementos/index.ts +0 -16
  2520. package/kits/synthwave/exemplos/logo-arcade.svg +0 -1
  2521. package/kits/synthwave/exemplos/plano.json +0 -50
  2522. package/kits/synthwave/exemplos/roteiro.md +0 -19
  2523. package/kits/synthwave/preview.tsx +0 -16
  2524. package/kits/synthwave/receita.json +0 -170
  2525. package/kits/synthwave/regras/area-segura.md +0 -19
  2526. package/kits/synthwave/regras/cor.md +0 -16
  2527. package/kits/synthwave/regras/movimento.md +0 -16
  2528. package/kits/synthwave/regras/ritmo.md +0 -15
  2529. package/kits/synthwave/regras/som.md +0 -21
  2530. package/kits/synthwave/regras/tipografia.md +0 -16
  2531. package/kits/terminal/assets/ASSETS.md +0 -20
  2532. package/kits/terminal/elementos/ArteAscii.tsx +0 -61
  2533. package/kits/terminal/elementos/BarraProgresso.tsx +0 -42
  2534. package/kits/terminal/elementos/BarraStatus.tsx +0 -18
  2535. package/kits/terminal/elementos/BootBios.tsx +0 -41
  2536. package/kits/terminal/elementos/Camera.tsx +0 -23
  2537. package/kits/terminal/elementos/Cena.tsx +0 -25
  2538. package/kits/terminal/elementos/Fundo.tsx +0 -22
  2539. package/kits/terminal/elementos/LinhaComando.tsx +0 -31
  2540. package/kits/terminal/elementos/Monitor.tsx +0 -42
  2541. package/kits/terminal/elementos/Montagem.tsx +0 -52
  2542. package/kits/terminal/elementos/PainelCaixa.tsx +0 -35
  2543. package/kits/terminal/elementos/Som.tsx +0 -32
  2544. package/kits/terminal/elementos/Tela.tsx +0 -25
  2545. package/kits/terminal/elementos/TextoGrande.tsx +0 -35
  2546. package/kits/terminal/elementos/base.ts +0 -67
  2547. package/kits/terminal/elementos/index.ts +0 -16
  2548. package/kits/terminal/exemplos/plano.json +0 -330
  2549. package/kits/terminal/exemplos/roteiro.md +0 -14
  2550. package/kits/terminal/preview.tsx +0 -9
  2551. package/kits/terminal/receita.json +0 -14
  2552. package/kits/terminal/regras/area-segura.md +0 -18
  2553. package/kits/terminal/regras/cor.md +0 -16
  2554. package/kits/terminal/regras/movimento.md +0 -15
  2555. package/kits/terminal/regras/ritmo.md +0 -14
  2556. package/kits/terminal/regras/som.md +0 -17
  2557. package/kits/terminal/regras/tipografia.md +0 -15
  2558. package/kits/tiktok-energia/assets/ASSETS.md +0 -22
  2559. package/kits/tiktok-energia/elementos/AssinaturaMarca.tsx +0 -25
  2560. package/kits/tiktok-energia/elementos/Cena.tsx +0 -48
  2561. package/kits/tiktok-energia/elementos/CorteDeCor.tsx +0 -22
  2562. package/kits/tiktok-energia/elementos/EmojiSticker.tsx +0 -21
  2563. package/kits/tiktok-energia/elementos/FotoSoco.tsx +0 -27
  2564. package/kits/tiktok-energia/elementos/Fundo.tsx +0 -8
  2565. package/kits/tiktok-energia/elementos/Montagem.tsx +0 -67
  2566. package/kits/tiktok-energia/elementos/PalavraSoco.tsx +0 -29
  2567. package/kits/tiktok-energia/elementos/Som.tsx +0 -33
  2568. package/kits/tiktok-energia/elementos/TextoCaixa.tsx +0 -25
  2569. package/kits/tiktok-energia/elementos/base.ts +0 -92
  2570. package/kits/tiktok-energia/elementos/index.ts +0 -15
  2571. package/kits/tiktok-energia/exemplos/fotos/foto-03.jpg +0 -0
  2572. package/kits/tiktok-energia/exemplos/logo-pulo.svg +0 -1
  2573. package/kits/tiktok-energia/exemplos/plano.json +0 -66
  2574. package/kits/tiktok-energia/exemplos/roteiro.md +0 -22
  2575. package/kits/tiktok-energia/preview.tsx +0 -13
  2576. package/kits/tiktok-energia/receita.json +0 -166
  2577. package/kits/tiktok-energia/regras/area-segura.md +0 -19
  2578. package/kits/tiktok-energia/regras/cor.md +0 -20
  2579. package/kits/tiktok-energia/regras/movimento.md +0 -17
  2580. package/kits/tiktok-energia/regras/ritmo.md +0 -15
  2581. package/kits/tiktok-energia/regras/som.md +0 -20
  2582. package/kits/tiktok-energia/regras/tipografia.md +0 -15
  2583. package/kits/tunel/assets/ASSETS.md +0 -21
  2584. package/kits/tunel/elementos/AssinaturaMarca.tsx +0 -22
  2585. package/kits/tunel/elementos/Cena.tsx +0 -48
  2586. package/kits/tunel/elementos/Fundo.tsx +0 -13
  2587. package/kits/tunel/elementos/LinhasDeVelocidade.tsx +0 -25
  2588. package/kits/tunel/elementos/Montagem.tsx +0 -67
  2589. package/kits/tunel/elementos/NumeroGigante.tsx +0 -28
  2590. package/kits/tunel/elementos/PlacaVoadora.tsx +0 -28
  2591. package/kits/tunel/elementos/Som.tsx +0 -33
  2592. package/kits/tunel/elementos/TituloTunel.tsx +0 -32
  2593. package/kits/tunel/elementos/TunelDeFormas.tsx +0 -52
  2594. package/kits/tunel/elementos/base.ts +0 -97
  2595. package/kits/tunel/elementos/index.ts +0 -15
  2596. package/kits/tunel/exemplos/logo-rota21.svg +0 -1
  2597. package/kits/tunel/exemplos/plano.json +0 -51
  2598. package/kits/tunel/exemplos/roteiro.md +0 -20
  2599. package/kits/tunel/preview.tsx +0 -12
  2600. package/kits/tunel/receita.json +0 -153
  2601. package/kits/tunel/regras/area-segura.md +0 -18
  2602. package/kits/tunel/regras/cor.md +0 -21
  2603. package/kits/tunel/regras/movimento.md +0 -17
  2604. package/kits/tunel/regras/ritmo.md +0 -14
  2605. package/kits/tunel/regras/som.md +0 -20
  2606. package/kits/tunel/regras/tipografia.md +0 -15
  2607. package/kits/tutorial-tela/assets/ASSETS.md +0 -20
  2608. package/kits/tutorial-tela/elementos/CameraTela.tsx +0 -29
  2609. package/kits/tutorial-tela/elementos/Cursor.tsx +0 -36
  2610. package/kits/tutorial-tela/elementos/DestaqueCaixa.tsx +0 -17
  2611. package/kits/tutorial-tela/elementos/Fundo.tsx +0 -12
  2612. package/kits/tutorial-tela/elementos/JanelaApp.tsx +0 -81
  2613. package/kits/tutorial-tela/elementos/Montagem.tsx +0 -49
  2614. package/kits/tutorial-tela/elementos/PassoChamada.tsx +0 -22
  2615. package/kits/tutorial-tela/elementos/Som.tsx +0 -41
  2616. package/kits/tutorial-tela/elementos/TeclaAtalho.tsx +0 -29
  2617. package/kits/tutorial-tela/elementos/TituloTela.tsx +0 -30
  2618. package/kits/tutorial-tela/elementos/base.ts +0 -65
  2619. package/kits/tutorial-tela/elementos/index.ts +0 -12
  2620. package/kits/tutorial-tela/exemplos/plano.json +0 -41
  2621. package/kits/tutorial-tela/exemplos/roteiro.md +0 -14
  2622. package/kits/tutorial-tela/preview.tsx +0 -9
  2623. package/kits/tutorial-tela/receita.json +0 -15
  2624. package/kits/tutorial-tela/regras/area-segura.md +0 -13
  2625. package/kits/tutorial-tela/regras/cor.md +0 -17
  2626. package/kits/tutorial-tela/regras/movimento.md +0 -20
  2627. package/kits/tutorial-tela/regras/ritmo.md +0 -24
  2628. package/kits/tutorial-tela/regras/som.md +0 -21
  2629. package/kits/tutorial-tela/regras/tipografia.md +0 -15
  2630. package/kits/ugc-reels/assets/ASSETS.md +0 -22
  2631. package/kits/ugc-reels/elementos/AssinaturaMarca.tsx +0 -28
  2632. package/kits/ugc-reels/elementos/BotaoLink.tsx +0 -24
  2633. package/kits/ugc-reels/elementos/CabecalhoPerfil.tsx +0 -38
  2634. package/kits/ugc-reels/elementos/Cena.tsx +0 -48
  2635. package/kits/ugc-reels/elementos/Comentario.tsx +0 -29
  2636. package/kits/ugc-reels/elementos/Fundo.tsx +0 -8
  2637. package/kits/ugc-reels/elementos/LegendaEmoji.tsx +0 -43
  2638. package/kits/ugc-reels/elementos/Montagem.tsx +0 -69
  2639. package/kits/ugc-reels/elementos/NotaDeMao.tsx +0 -29
  2640. package/kits/ugc-reels/elementos/Reacoes.tsx +0 -26
  2641. package/kits/ugc-reels/elementos/Som.tsx +0 -33
  2642. package/kits/ugc-reels/elementos/VideoCelular.tsx +0 -37
  2643. package/kits/ugc-reels/elementos/base.ts +0 -92
  2644. package/kits/ugc-reels/elementos/index.ts +0 -17
  2645. package/kits/ugc-reels/exemplos/fotos/foto-02.jpg +0 -0
  2646. package/kits/ugc-reels/exemplos/fotos/foto-03.jpg +0 -0
  2647. package/kits/ugc-reels/exemplos/fotos/foto-04.jpg +0 -0
  2648. package/kits/ugc-reels/exemplos/fotos/foto-06.jpg +0 -0
  2649. package/kits/ugc-reels/exemplos/logo-rotina.svg +0 -1
  2650. package/kits/ugc-reels/exemplos/plano.json +0 -54
  2651. package/kits/ugc-reels/exemplos/roteiro.md +0 -20
  2652. package/kits/ugc-reels/preview.tsx +0 -16
  2653. package/kits/ugc-reels/receita.json +0 -147
  2654. package/kits/ugc-reels/regras/area-segura.md +0 -18
  2655. package/kits/ugc-reels/regras/cor.md +0 -22
  2656. package/kits/ugc-reels/regras/movimento.md +0 -19
  2657. package/kits/ugc-reels/regras/ritmo.md +0 -14
  2658. package/kits/ugc-reels/regras/som.md +0 -20
  2659. package/kits/ugc-reels/regras/tipografia.md +0 -16
  2660. package/kits/vercel-mono/assets/ASSETS.md +0 -18
  2661. package/kits/vercel-mono/assets/sons/assinatura.mp3 +0 -0
  2662. package/kits/vercel-mono/assets/sons/clique.mp3 +0 -0
  2663. package/kits/vercel-mono/assets/sons/impacto.mp3 +0 -0
  2664. package/kits/vercel-mono/assets/sons/pop-cartao.mp3 +0 -0
  2665. package/kits/vercel-mono/assets/sons/pop-palavra.mp3 +0 -0
  2666. package/kits/vercel-mono/assets/sons/subida.mp3 +0 -0
  2667. package/kits/vercel-mono/assets/sons/swoosh.mp3 +0 -0
  2668. package/kits/vercel-mono/assets/sons/whoosh-entra.mp3 +0 -0
  2669. package/kits/vercel-mono/assets/sons/whoosh-sai.mp3 +0 -0
  2670. package/kits/vercel-mono/elementos/AssinaturaMarca.tsx +0 -18
  2671. package/kits/vercel-mono/elementos/Camera.tsx +0 -23
  2672. package/kits/vercel-mono/elementos/Cena.tsx +0 -46
  2673. package/kits/vercel-mono/elementos/FaixaOutline.tsx +0 -25
  2674. package/kits/vercel-mono/elementos/Fundo.tsx +0 -6
  2675. package/kits/vercel-mono/elementos/GradeDeNumeros.tsx +0 -27
  2676. package/kits/vercel-mono/elementos/Montagem.tsx +0 -61
  2677. package/kits/vercel-mono/elementos/PalavraMono.tsx +0 -31
  2678. package/kits/vercel-mono/elementos/Quadro.tsx +0 -28
  2679. package/kits/vercel-mono/elementos/Som.tsx +0 -39
  2680. package/kits/vercel-mono/elementos/TerminalComando.tsx +0 -33
  2681. package/kits/vercel-mono/elementos/TrianguloGigante.tsx +0 -27
  2682. package/kits/vercel-mono/elementos/base.ts +0 -82
  2683. package/kits/vercel-mono/elementos/index.ts +0 -16
  2684. package/kits/vercel-mono/exemplos/logo-vetor.svg +0 -1
  2685. package/kits/vercel-mono/exemplos/plano.json +0 -318
  2686. package/kits/vercel-mono/exemplos/roteiro.md +0 -20
  2687. package/kits/vercel-mono/preview.tsx +0 -12
  2688. package/kits/vercel-mono/receita.json +0 -156
  2689. package/kits/vercel-mono/regras/area-segura.md +0 -13
  2690. package/kits/vercel-mono/regras/cor.md +0 -12
  2691. package/kits/vercel-mono/regras/movimento.md +0 -15
  2692. package/kits/vercel-mono/regras/ritmo.md +0 -13
  2693. package/kits/vercel-mono/regras/som.md +0 -18
  2694. package/kits/vercel-mono/regras/tipografia.md +0 -14
  2695. package/kits/vhs-90/assets/ASSETS.md +0 -23
  2696. package/kits/vhs-90/elementos/AssinaturaMarca.tsx +0 -29
  2697. package/kits/vhs-90/elementos/BarrasRastreio.tsx +0 -21
  2698. package/kits/vhs-90/elementos/CapaVHS.tsx +0 -28
  2699. package/kits/vhs-90/elementos/CarimboData.tsx +0 -19
  2700. package/kits/vhs-90/elementos/Cena.tsx +0 -41
  2701. package/kits/vhs-90/elementos/Fundo.tsx +0 -27
  2702. package/kits/vhs-90/elementos/MenuOSD.tsx +0 -27
  2703. package/kits/vhs-90/elementos/Montagem.tsx +0 -60
  2704. package/kits/vhs-90/elementos/Som.tsx +0 -38
  2705. package/kits/vhs-90/elementos/TelaAzul.tsx +0 -29
  2706. package/kits/vhs-90/elementos/TituloFita.tsx +0 -40
  2707. package/kits/vhs-90/elementos/base.ts +0 -75
  2708. package/kits/vhs-90/elementos/index.ts +0 -16
  2709. package/kits/vhs-90/exemplos/fotos/foto-05.jpg +0 -0
  2710. package/kits/vhs-90/exemplos/fotos/foto-07.jpg +0 -0
  2711. package/kits/vhs-90/exemplos/logo-rewind.svg +0 -1
  2712. package/kits/vhs-90/exemplos/plano.json +0 -47
  2713. package/kits/vhs-90/exemplos/roteiro.md +0 -19
  2714. package/kits/vhs-90/preview.tsx +0 -17
  2715. package/kits/vhs-90/receita.json +0 -189
  2716. package/kits/vhs-90/regras/area-segura.md +0 -18
  2717. package/kits/vhs-90/regras/cor.md +0 -16
  2718. package/kits/vhs-90/regras/movimento.md +0 -16
  2719. package/kits/vhs-90/regras/ritmo.md +0 -16
  2720. package/kits/vhs-90/regras/som.md +0 -21
  2721. package/kits/vhs-90/regras/tipografia.md +0 -17
  2722. package/kits/vidro-ios/assets/ASSETS.md +0 -18
  2723. package/kits/vidro-ios/elementos/AssinaturaMarca.tsx +0 -21
  2724. package/kits/vidro-ios/elementos/Camera.tsx +0 -23
  2725. package/kits/vidro-ios/elementos/Cena.tsx +0 -46
  2726. package/kits/vidro-ios/elementos/Fundo.tsx +0 -17
  2727. package/kits/vidro-ios/elementos/IlhaDinamica.tsx +0 -24
  2728. package/kits/vidro-ios/elementos/Montagem.tsx +0 -60
  2729. package/kits/vidro-ios/elementos/PainelControle.tsx +0 -33
  2730. package/kits/vidro-ios/elementos/PilhaNotificacoes.tsx +0 -29
  2731. package/kits/vidro-ios/elementos/Som.tsx +0 -39
  2732. package/kits/vidro-ios/elementos/TituloVidro.tsx +0 -22
  2733. package/kits/vidro-ios/elementos/WidgetsGrade.tsx +0 -34
  2734. package/kits/vidro-ios/elementos/base.ts +0 -87
  2735. package/kits/vidro-ios/elementos/index.ts +0 -16
  2736. package/kits/vidro-ios/elementos/vidro.tsx +0 -20
  2737. package/kits/vidro-ios/exemplos/logo-vento.svg +0 -1
  2738. package/kits/vidro-ios/exemplos/plano.json +0 -288
  2739. package/kits/vidro-ios/exemplos/roteiro.md +0 -20
  2740. package/kits/vidro-ios/preview.tsx +0 -12
  2741. package/kits/vidro-ios/receita.json +0 -170
  2742. package/kits/vidro-ios/regras/area-segura.md +0 -13
  2743. package/kits/vidro-ios/regras/cor.md +0 -16
  2744. package/kits/vidro-ios/regras/movimento.md +0 -16
  2745. package/kits/vidro-ios/regras/ritmo.md +0 -14
  2746. package/kits/vidro-ios/regras/som.md +0 -18
  2747. package/kits/vidro-ios/regras/tipografia.md +0 -15
  2748. package/kits/y2k-cromado/assets/ASSETS.md +0 -23
  2749. package/kits/y2k-cromado/elementos/AssinaturaMarca.tsx +0 -25
  2750. package/kits/y2k-cromado/elementos/Bolhas.tsx +0 -30
  2751. package/kits/y2k-cromado/elementos/Brilhos.tsx +0 -28
  2752. package/kits/y2k-cromado/elementos/CartaoGloss.tsx +0 -26
  2753. package/kits/y2k-cromado/elementos/Cena.tsx +0 -41
  2754. package/kits/y2k-cromado/elementos/FitaMarquee.tsx +0 -20
  2755. package/kits/y2k-cromado/elementos/Fundo.tsx +0 -18
  2756. package/kits/y2k-cromado/elementos/JanelaY2K.tsx +0 -31
  2757. package/kits/y2k-cromado/elementos/Montagem.tsx +0 -60
  2758. package/kits/y2k-cromado/elementos/OrbeCromo.tsx +0 -20
  2759. package/kits/y2k-cromado/elementos/Som.tsx +0 -38
  2760. package/kits/y2k-cromado/elementos/TextoCromo.tsx +0 -34
  2761. package/kits/y2k-cromado/elementos/base.ts +0 -75
  2762. package/kits/y2k-cromado/elementos/index.ts +0 -17
  2763. package/kits/y2k-cromado/exemplos/fotos/foto-02.jpg +0 -0
  2764. package/kits/y2k-cromado/exemplos/fotos/foto-03.jpg +0 -0
  2765. package/kits/y2k-cromado/exemplos/logo-bolha.svg +0 -1
  2766. package/kits/y2k-cromado/exemplos/plano.json +0 -47
  2767. package/kits/y2k-cromado/exemplos/roteiro.md +0 -19
  2768. package/kits/y2k-cromado/preview.tsx +0 -17
  2769. package/kits/y2k-cromado/receita.json +0 -174
  2770. package/kits/y2k-cromado/regras/area-segura.md +0 -19
  2771. package/kits/y2k-cromado/regras/cor.md +0 -16
  2772. package/kits/y2k-cromado/regras/movimento.md +0 -16
  2773. package/kits/y2k-cromado/regras/ritmo.md +0 -15
  2774. package/kits/y2k-cromado/regras/som.md +0 -21
  2775. package/kits/y2k-cromado/regras/tipografia.md +0 -17
  2776. package/lib/act.js +0 -2512
  2777. package/lib/api.js +0 -310
  2778. package/lib/boas-vindas.js +0 -153
  2779. package/lib/catalogo.js +0 -367
  2780. package/lib/checkpoint-git.js +0 -221
  2781. package/lib/checkpoint.js +0 -366
  2782. package/lib/claude-engine.js +0 -673
  2783. package/lib/codex-engine.js +0 -225
  2784. package/lib/comandos-extra.js +0 -553
  2785. package/lib/comandos.js +0 -104
  2786. package/lib/config.js +0 -414
  2787. package/lib/desktop.js +0 -756
  2788. package/lib/editor-pro-maquina.js +0 -165
  2789. package/lib/editor-pro.js +0 -930
  2790. package/lib/entrada.js +0 -1031
  2791. package/lib/entregaveis/cli.js +0 -26
  2792. package/lib/entregaveis/especialistas.js +0 -50
  2793. package/lib/entregaveis/nucleo.js +0 -111
  2794. package/lib/entregaveis/slides.js +0 -221
  2795. package/lib/estudio/acervo.js +0 -418
  2796. package/lib/estudio/assets.js +0 -497
  2797. package/lib/estudio/assinatura.js +0 -108
  2798. package/lib/estudio/conferencia-visual.js +0 -76
  2799. package/lib/estudio/cota.js +0 -157
  2800. package/lib/estudio/diretor.js +0 -392
  2801. package/lib/estudio/editor.js +0 -290
  2802. package/lib/estudio/gosto-descrever.js +0 -87
  2803. package/lib/estudio/gosto.js +0 -608
  2804. package/lib/estudio/identidade.js +0 -560
  2805. package/lib/estudio/index.js +0 -2712
  2806. package/lib/estudio/kit.js +0 -91
  2807. package/lib/estudio/kits-tela.js +0 -199
  2808. package/lib/estudio/kokoro.js +0 -127
  2809. package/lib/estudio/maquina-foto.js +0 -177
  2810. package/lib/estudio/maquina-trilha.js +0 -160
  2811. package/lib/estudio/maquina-voz.js +0 -429
  2812. package/lib/estudio/marca.js +0 -398
  2813. package/lib/estudio/materiais.js +0 -172
  2814. package/lib/estudio/morfar.js +0 -191
  2815. package/lib/estudio/print-site.js +0 -341
  2816. package/lib/estudio/projeto.js +0 -340
  2817. package/lib/estudio/projetos.js +0 -72
  2818. package/lib/exportar-conversa.js +0 -49
  2819. package/lib/headless.js +0 -102
  2820. package/lib/kits-parecidos.js +0 -99
  2821. package/lib/kits-plano.js +0 -557
  2822. package/lib/kits.js +0 -1084
  2823. package/lib/limites.js +0 -100
  2824. package/lib/linha-do-tempo.js +0 -130
  2825. package/lib/local/motor-cli.js +0 -93
  2826. package/lib/local/motor.js +0 -267
  2827. package/lib/local/provedor.js +0 -169
  2828. package/lib/marca-kit.js +0 -312
  2829. package/lib/marketplace.js +0 -189
  2830. package/lib/mcp.js +0 -819
  2831. package/lib/motioncraft.js +0 -67
  2832. package/lib/perigo.js +0 -401
  2833. package/lib/permissao.js +0 -137
  2834. package/lib/sandbox.js +0 -252
  2835. package/lib/skills.js +0 -468
  2836. package/lib/statusline.js +0 -52
  2837. package/lib/tela.js +0 -245
  2838. package/lib/tools.js +0 -1086
  2839. package/lib/ui.js +0 -763
  2840. package/lib/video/analise.js +0 -89
  2841. package/lib/video/auto.js +0 -344
  2842. package/lib/video/ops-fx.js +0 -453
  2843. package/lib/video/ops.js +0 -384
  2844. package/lib/video/pedido.js +0 -191
  2845. package/lib/video/projeto.js +0 -133
  2846. package/lib/video/rastrear.js +0 -95
  2847. package/lib/video/render.js +0 -274
  2848. package/lib/video/transcript.js +0 -124
  2849. package/lib/video/zoom.js +0 -275
  2850. package/lib/voz-ponte.js +0 -15
  2851. package/lib/voz.js +0 -532
  2852. package/materiais/saas-linear/sons/trilha.mp3 +0 -0
  2853. /package/lib/{comecar.js → cli/comecar.js} +0 -0
  2854. /package/lib/{conta.js → config/conta.js} +0 -0
  2855. /package/lib/{limite.js → config/limite.js} +0 -0
  2856. /package/lib/{protecao.js → permission/protecao.js} +0 -0
  2857. /package/lib/{entregaveis.js → plugin/entregaveis.js} +0 -0
  2858. /package/lib/{estudio → plugin/estudio}/acervo-site.js +0 -0
  2859. /package/lib/{estudio → plugin/estudio}/assinaturas/fluido.json +0 -0
  2860. /package/lib/{estudio → plugin/estudio}/assinaturas/gerativo.json +0 -0
  2861. /package/lib/{estudio → plugin/estudio}/batida.js +0 -0
  2862. /package/lib/{estudio → plugin/estudio}/biblioteca.js +0 -0
  2863. /package/lib/{estudio → plugin/estudio}/camadas.js +0 -0
  2864. /package/lib/{estudio → plugin/estudio}/cena.js +0 -0
  2865. /package/lib/{estudio → plugin/estudio}/cenarios.js +0 -0
  2866. /package/lib/{estudio → plugin/estudio}/cinema.js +0 -0
  2867. /package/lib/{estudio → plugin/estudio}/colecao.js +0 -0
  2868. /package/lib/{estudio → plugin/estudio}/composicao.js +0 -0
  2869. /package/lib/{estudio → plugin/estudio}/conferencia.js +0 -0
  2870. /package/lib/{estudio → plugin/estudio}/dados/fluent-3d.json +0 -0
  2871. /package/lib/{estudio → plugin/estudio}/dados/noto-animado.json +0 -0
  2872. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ad5.json +0 -0
  2873. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ae-sem-memoria.json +0 -0
  2874. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-agent.json +0 -0
  2875. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-antes-e-agora.json +0 -0
  2876. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-apresentando-clube.json +0 -0
  2877. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-bluevisa.json +0 -0
  2878. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-caught-in-the-fire.json +0 -0
  2879. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-chat-cliente-satisfeito.json +0 -0
  2880. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-chatgpt-anuncios.json +0 -0
  2881. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-claude-dj.json +0 -0
  2882. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-claude-mcp.json +0 -0
  2883. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-cleanui.json +0 -0
  2884. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clinica-take-unico.json +0 -0
  2885. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clinica.json +0 -0
  2886. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clube-opener.json +0 -0
  2887. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-clube.json +0 -0
  2888. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-codigo.json +0 -0
  2889. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-distilbook.json +0 -0
  2890. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-drive-upload.json +0 -0
  2891. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-dub.json +0 -0
  2892. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-enxovaly.json +0 -0
  2893. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-fecha7.json +0 -0
  2894. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-filatov.json +0 -0
  2895. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-frame.json +0 -0
  2896. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-glass.json +0 -0
  2897. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-em-apps.json +0 -0
  2898. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-globo-3d.json +0 -0
  2899. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-nos-apps.json +0 -0
  2900. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-letra-seis-mundos.json +0 -0
  2901. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-lula-3.json +0 -0
  2902. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-morph.json +0 -0
  2903. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-motion-designer.json +0 -0
  2904. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-motion-pacote.json +0 -0
  2905. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-movimento.json +0 -0
  2906. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-not-like-us.json +0 -0
  2907. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-pinterest-inspiracao.json +0 -0
  2908. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-pixel-e-tinta.json +0 -0
  2909. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-ponte.json +0 -0
  2910. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-processo-edit-tonal.json +0 -0
  2911. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-processo-motion-100-ia.json +0 -0
  2912. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-promo.json +0 -0
  2913. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-proposito.json +0 -0
  2914. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-rankhog.json +0 -0
  2915. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-recursao.json +0 -0
  2916. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-revelar.json +0 -0
  2917. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-robo.json +0 -0
  2918. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-shelby-ep2.json +0 -0
  2919. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-shelby.json +0 -0
  2920. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-solar-eclipse.json +0 -0
  2921. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-soldier.json +0 -0
  2922. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-som-de-cena.json +0 -0
  2923. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-spotify-candidatura.json +0 -0
  2924. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tda-app.json +0 -0
  2925. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tda-ia.json +0 -0
  2926. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-telegram-chat.json +0 -0
  2927. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-telegram-ilha.json +0 -0
  2928. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tennessee-nike.json +0 -0
  2929. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-tudo-se-move.json +0 -0
  2930. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-uiad.json +0 -0
  2931. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-viralgrow.json +0 -0
  2932. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-whose-side.json +0 -0
  2933. /package/lib/{estudio → plugin/estudio}/dados/projetos/clube-youtube-inscrever.json +0 -0
  2934. /package/lib/{estudio → plugin/estudio}/dados/projetos/elementos-do-site-em-movimento.json +0 -0
  2935. /package/lib/{estudio → plugin/estudio}/dados/projetos/explainer-narrado.json +0 -0
  2936. /package/lib/{estudio → plugin/estudio}/dados/projetos/lancamento-de-produto.json +0 -0
  2937. /package/lib/{estudio → plugin/estudio}/dados/projetos/motion-so-com-sons.json +0 -0
  2938. /package/lib/{estudio → plugin/estudio}/dados/projetos/titulo-em-after-effects.json +0 -0
  2939. /package/lib/{estudio → plugin/estudio}/dados/projetos/tour-de-saas.json +0 -0
  2940. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/antes-e-agora/ae/cenas.jsx +0 -0
  2941. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/antes-e-agora/assets/fazer_assets.py +0 -0
  2942. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/ae/cenas.jsx +0 -0
  2943. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/assets/preparar_assets.py +0 -0
  2944. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-em-apps/assets/svg_para_ae.py +0 -0
  2945. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/BRIEF-AGENTES.md +0 -0
  2946. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/README.md +0 -0
  2947. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ROTEIRO-CENAS.md +0 -0
  2948. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/A-agenda.jsx +0 -0
  2949. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/B-docs.jsx +0 -0
  2950. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/C-alttab.jsx +0 -0
  2951. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/D-spotify.jsx +0 -0
  2952. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/E-notas.jsx +0 -0
  2953. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/F-jornal1.jsx +0 -0
  2954. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/G-google.jsx +0 -0
  2955. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/H-mapa.jsx +0 -0
  2956. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/I-imagens.jsx +0 -0
  2957. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/J-jornal2.jsx +0 -0
  2958. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/K-maps.jsx +0 -0
  2959. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/camera-movimentos.jsx +0 -0
  2960. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/camera.jsx +0 -0
  2961. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/card-spotify.jsx +0 -0
  2962. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/digitar.jsx +0 -0
  2963. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/jornal-comum.jsx +0 -0
  2964. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/letra.jsx +0 -0
  2965. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/letra_automatica.py +0 -0
  2966. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/montagem.jsx +0 -0
  2967. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-agenda/render_html.py +0 -0
  2968. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-agenda/util.jsx +0 -0
  2969. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/w-midia-comum.jsx +0 -0
  2970. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/ae/wg-util.jsx +0 -0
  2971. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/F-jornal1/render_html.py +0 -0
  2972. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/render_w-midia.py +0 -0
  2973. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/inclin.py +0 -0
  2974. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_d.py +0 -0
  2975. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/assets/w-midia-ferramentas/medir_e.py +0 -0
  2976. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/ajustar_movimentos.py +0 -0
  2977. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/ancorar.py +0 -0
  2978. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/assar.py +0 -0
  2979. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/camera3d_jornal.py +0 -0
  2980. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/comparar.py +0 -0
  2981. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/dados_ae_jornal.py +0 -0
  2982. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/folha_contato.py +0 -0
  2983. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/homografia_jornal.py +0 -0
  2984. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/integrar.py +0 -0
  2985. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/medir_quadro_a_quadro.py +0 -0
  2986. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/mesa_2d.py +0 -0
  2987. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/plot_cenas.py +0 -0
  2988. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/retificar_quadros.py +0 -0
  2989. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/w-agenda/assar_ab.py +0 -0
  2990. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/w-agenda/medir_ab.py +0 -0
  2991. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_ajustar_h.py +0 -0
  2992. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_corrige_cam.py +0 -0
  2993. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_ecc_cadeia.py +0 -0
  2994. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_finalizar_cam.py +0 -0
  2995. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/camera/wg_mosaico.py +0 -0
  2996. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/01-gramatica-e-roteiro.md +0 -0
  2997. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/02-camera.md +0 -0
  2998. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/03-montagem-no-ae.md +0 -0
  2999. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/04-render-e-conferencia.md +0 -0
  3000. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces/05-abertura-celular-mergulho.md +0 -0
  3001. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/guia-do-metodo/tutorial-lyric-edit-interfaces.md +0 -0
  3002. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/atraso_imagem.py +0 -0
  3003. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/fundo.py +0 -0
  3004. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/juntar.py +0 -0
  3005. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/montar.py +0 -0
  3006. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/rastreio.py +0 -0
  3007. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/letra-nos-apps/transicao/sincronia.py +0 -0
  3008. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/pinterest-inspiracao/ae/cenas.jsx +0 -0
  3009. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/pinterest-inspiracao/assets/fazer_assets.py +0 -0
  3010. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/assets/pessoas/figurinha.py +0 -0
  3011. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/BRIEF-A.md +0 -0
  3012. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/audio.py +0 -0
  3013. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/confere.py +0 -0
  3014. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte1.js +0 -0
  3015. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/dados/tempo-parte2.js +0 -0
  3016. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/gerar_emojis.py +0 -0
  3017. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/img/filmes/_indice.js +0 -0
  3018. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/base.js +0 -0
  3019. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/main.js +0 -0
  3020. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1a.js +0 -0
  3021. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1b.js +0 -0
  3022. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p1c.js +0 -0
  3023. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/js/p2.js +0 -0
  3024. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/comp-a/video.py +0 -0
  3025. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/README.md +0 -0
  3026. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/oraculo_take.py +0 -0
  3027. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/render_take.py +0 -0
  3028. /package/lib/{estudio → plugin/estudio}/dados/projetos-ae/processo-motion-100-ia/take-unico/take.js +0 -0
  3029. /package/lib/{estudio → plugin/estudio}/decisao.js +0 -0
  3030. /package/lib/{estudio → plugin/estudio}/edicao.js +0 -0
  3031. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/brilho-varredura.jsx +0 -0
  3032. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/camadas-empilhadas.jsx +0 -0
  3033. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/cor-inunda.jsx +0 -0
  3034. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/mola-com-peso.jsx +0 -0
  3035. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/peca-impacto-3d.jsx +0 -0
  3036. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/raios-de-luz.jsx +0 -0
  3037. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/risco-multilinha.jsx +0 -0
  3038. /package/lib/{estudio → plugin/estudio}/efeitos-fabrica/terminal-digitando.jsx +0 -0
  3039. /package/lib/{estudio → plugin/estudio}/efeitos.js +0 -0
  3040. /package/lib/{estudio → plugin/estudio}/effectcraft.js +0 -0
  3041. /package/lib/{estudio → plugin/estudio}/ende.js +0 -0
  3042. /package/lib/{estudio → plugin/estudio}/estilo.js +0 -0
  3043. /package/lib/{estudio → plugin/estudio}/estilos.js +0 -0
  3044. /package/lib/{estudio → plugin/estudio}/exportar.js +0 -0
  3045. /package/lib/{estudio → plugin/estudio}/falantes.js +0 -0
  3046. /package/lib/{estudio → plugin/estudio}/fluido.js +0 -0
  3047. /package/lib/{estudio → plugin/estudio}/gerativo.js +0 -0
  3048. /package/lib/{estudio → plugin/estudio}/glifos.js +0 -0
  3049. /package/lib/{estudio → plugin/estudio}/gosto/tela.html +0 -0
  3050. /package/lib/{estudio → plugin/estudio}/gosto-medir.js +0 -0
  3051. /package/lib/{estudio → plugin/estudio}/gosto-prova.js +0 -0
  3052. /package/lib/{estudio → plugin/estudio}/hibrido.js +0 -0
  3053. /package/lib/{estudio → plugin/estudio}/impacto.js +0 -0
  3054. /package/lib/{estudio → plugin/estudio}/kit/animacao.jsx +0 -0
  3055. /package/lib/{estudio → plugin/estudio}/kit/base.jsx +0 -0
  3056. /package/lib/{estudio → plugin/estudio}/kit/fluido.jsx +0 -0
  3057. /package/lib/{estudio → plugin/estudio}/kit/gerativo.jsx +0 -0
  3058. /package/lib/{estudio → plugin/estudio}/kit/index.jsx +0 -0
  3059. /package/lib/{estudio → plugin/estudio}/kit/marca.jsx +0 -0
  3060. /package/lib/{estudio → plugin/estudio}/kit/mundo.jsx +0 -0
  3061. /package/lib/{estudio → plugin/estudio}/kit/natural.js +0 -0
  3062. /package/lib/{estudio → plugin/estudio}/kit/personagem.jsx +0 -0
  3063. /package/lib/{estudio → plugin/estudio}/kit/rosto.jsx +0 -0
  3064. /package/lib/{estudio → plugin/estudio}/kit/tres.jsx +0 -0
  3065. /package/lib/{estudio → plugin/estudio}/kit/vox.jsx +0 -0
  3066. /package/lib/{estudio → plugin/estudio}/kit/voxel.jsx +0 -0
  3067. /package/lib/{estudio → plugin/estudio}/kit-ae/base.jsx +0 -0
  3068. /package/lib/{estudio → plugin/estudio}/kit-ae/cenas.jsx +0 -0
  3069. /package/lib/{estudio → plugin/estudio}/kit-ae/guarda.jsx +0 -0
  3070. /package/lib/{estudio → plugin/estudio}/kit-ae/primitivas.jsx +0 -0
  3071. /package/lib/{estudio → plugin/estudio}/kits/tela.html +0 -0
  3072. /package/lib/{estudio → plugin/estudio}/lancamento.js +0 -0
  3073. /package/lib/{estudio → plugin/estudio}/legibilidade.js +0 -0
  3074. /package/lib/{estudio → plugin/estudio}/maquina-diretor.js +0 -0
  3075. /package/lib/{estudio → plugin/estudio}/maquina-elementos.js +0 -0
  3076. /package/lib/{estudio → plugin/estudio}/maquina-guarda.js +0 -0
  3077. /package/lib/{estudio → plugin/estudio}/maquina-layout.js +0 -0
  3078. /package/lib/{estudio → plugin/estudio}/maquina-som.js +0 -0
  3079. /package/lib/{estudio → plugin/estudio}/maquina.js +0 -0
  3080. /package/lib/{estudio → plugin/estudio}/margem.js +0 -0
  3081. /package/lib/{estudio → plugin/estudio}/motion.js +0 -0
  3082. /package/lib/{estudio → plugin/estudio}/movimentos.js +0 -0
  3083. /package/lib/{estudio → plugin/estudio}/mundo.js +0 -0
  3084. /package/lib/{estudio → plugin/estudio}/personagem.js +0 -0
  3085. /package/lib/{estudio → plugin/estudio}/plano.js +0 -0
  3086. /package/lib/{estudio → plugin/estudio}/producao.js +0 -0
  3087. /package/lib/{estudio → plugin/estudio}/referencias.js +0 -0
  3088. /package/lib/{estudio → plugin/estudio}/regras-motion.js +0 -0
  3089. /package/lib/{estudio → plugin/estudio}/remotion.js +0 -0
  3090. /package/lib/{estudio → plugin/estudio}/revisor.js +0 -0
  3091. /package/lib/{estudio → plugin/estudio}/ritmo.js +0 -0
  3092. /package/lib/{estudio → plugin/estudio}/sem-narracao.js +0 -0
  3093. /package/lib/{estudio → plugin/estudio}/slides.js +0 -0
  3094. /package/lib/{estudio → plugin/estudio}/sons-leves.js +0 -0
  3095. /package/lib/{estudio → plugin/estudio}/variacao3d.js +0 -0
  3096. /package/lib/{estudio → plugin/estudio}/variedade.js +0 -0
  3097. /package/lib/{estudio → plugin/estudio}/video.js +0 -0
  3098. /package/lib/{estudio → plugin/estudio}/visao/visao.swift +0 -0
  3099. /package/lib/{estudio → plugin/estudio}/visao.js +0 -0
  3100. /package/lib/{estudio → plugin/estudio}/voicestudio.js +0 -0
  3101. /package/lib/{estudio → plugin/estudio}/vox.js +0 -0
  3102. /package/lib/{video → plugin/video}/camadas.js +0 -0
  3103. /package/lib/{video → plugin/video}/cli.js +0 -0
  3104. /package/lib/{video → plugin/video}/conferir-legenda.js +0 -0
  3105. /package/lib/{video → plugin/video}/cor.js +0 -0
  3106. /package/lib/{video → plugin/video}/delta.js +0 -0
  3107. /package/lib/{video → plugin/video}/edits.js +0 -0
  3108. /package/lib/{video → plugin/video}/filters.js +0 -0
  3109. /package/lib/{video → plugin/video}/fx3d/Camadas.jsx +0 -0
  3110. /package/lib/{video → plugin/video}/fx3d/Objetos.jsx +0 -0
  3111. /package/lib/{video → plugin/video}/fx3d/Root.jsx +0 -0
  3112. /package/lib/{video → plugin/video}/fx3d/modelos.jsx +0 -0
  3113. /package/lib/{video → plugin/video}/fx3d.js +0 -0
  3114. /package/lib/{video → plugin/video}/gerados.js +0 -0
  3115. /package/lib/{video → plugin/video}/objetos.js +0 -0
  3116. /package/lib/{video → plugin/video}/paralelo.js +0 -0
  3117. /package/lib/{video → plugin/video}/rastro.js +0 -0
  3118. /package/lib/{video → plugin/video}/texto.js +0 -0
  3119. /package/lib/{video → plugin/video}/timeline.js +0 -0
  3120. /package/lib/{local → provider/local}/cerebro.json +0 -0
  3121. /package/lib/{local → provider/local}/entrada.js +0 -0
  3122. /package/lib/{encolheu.js → session/encolheu.js} +0 -0
  3123. /package/lib/{memoria-conversa.js → session/memoria-conversa.js} +0 -0
  3124. /package/lib/{retomar.js → session/retomar.js} +0 -0
  3125. /package/lib/{snapshot.js → session/snapshot.js} +0 -0
  3126. /package/lib/{titulo-conversa.js → session/titulo-conversa.js} +0 -0
  3127. /package/lib/{especialistas.js → skill/especialistas.js} +0 -0
  3128. /package/lib/{personas.js → skill/personas.js} +0 -0
  3129. /package/lib/{portao-skill.js → skill/portao-skill.js} +0 -0
  3130. /package/lib/{casar.js → tool/casar.js} +0 -0
  3131. /package/lib/{markdown.js → tui/markdown.js} +0 -0
  3132. /package/{kits/adesivos/elementos → materiais/adesivos/camera}/Camera.tsx +0 -0
  3133. /package/{kits/adesivos/assets → materiais/adesivos}/fontes/OFL-BowlbyOne.txt +0 -0
  3134. /package/{kits/adesivos/assets → materiais/adesivos}/fontes/OFL-Nunito.txt +0 -0
  3135. /package/{kits/adesivos/assets → materiais/adesivos}/fontes/bowlby-latin.woff2 +0 -0
  3136. /package/{kits/adesivos/assets → materiais/adesivos}/fontes/nunito-latin.woff2 +0 -0
  3137. /package/{kits/adesivos/assets → materiais/adesivos}/sons/assinatura.mp3 +0 -0
  3138. /package/{kits/adesivos/assets → materiais/adesivos}/sons/cola.mp3 +0 -0
  3139. /package/{kits/adesivos/assets → materiais/adesivos}/sons/confete.mp3 +0 -0
  3140. /package/{kits/adesivos/assets → materiais/adesivos}/sons/impacto.mp3 +0 -0
  3141. /package/{kits/adesivos/assets → materiais/adesivos}/sons/palavra.mp3 +0 -0
  3142. /package/{kits/adesivos/assets → materiais/adesivos}/sons/pop.mp3 +0 -0
  3143. /package/{kits/adesivos/assets → materiais/adesivos}/sons/swipe.mp3 +0 -0
  3144. /package/{kits/adesivos/assets → materiais/adesivos}/sons/whoosh.mp3 +0 -0
  3145. /package/{kits/adesivos/assets → materiais/adesivos}/trilha/pop-colorido-112bpm.mp3 +0 -0
  3146. /package/{kits/antes-depois/elementos → materiais/antes-depois/camera}/Camera.tsx +0 -0
  3147. /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/OFL-ArchivoBlack.txt +0 -0
  3148. /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/OFL-Manrope.txt +0 -0
  3149. /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/archivoblack.woff2 +0 -0
  3150. /package/{kits/antes-depois/assets → materiais/antes-depois}/fontes/manrope.woff2 +0 -0
  3151. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/assinatura.mp3 +0 -0
  3152. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/clique.mp3 +0 -0
  3153. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/impacto.mp3 +0 -0
  3154. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/pop-cartao.mp3 +0 -0
  3155. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/pop-palavra.mp3 +0 -0
  3156. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/subida.mp3 +0 -0
  3157. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/swoosh.mp3 +0 -0
  3158. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/tick.mp3 +0 -0
  3159. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/whoosh-entra.mp3 +0 -0
  3160. /package/{kits/antes-depois/assets → materiais/antes-depois}/sons/whoosh-sai.mp3 +0 -0
  3161. /package/{kits/antes-depois/assets → materiais/antes-depois}/trilha/corte-118bpm.mp3 +0 -0
  3162. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/fontes/OFL-Inter.txt +0 -0
  3163. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/fontes/inter-latin-500-800.woff2 +0 -0
  3164. /package/{kits/apple-tipografico/elementos → materiais/apple-tipografico/lib}/modelos.ts +0 -0
  3165. /package/{kits/apple-tipografico/elementos → materiais/apple-tipografico/lib}/raymarch.ts +0 -0
  3166. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/assinatura.mp3 +0 -0
  3167. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/clique.mp3 +0 -0
  3168. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/impacto.mp3 +0 -0
  3169. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/pop-cartao.mp3 +0 -0
  3170. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/pop-palavra.mp3 +0 -0
  3171. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/subida.mp3 +0 -0
  3172. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/swoosh.mp3 +0 -0
  3173. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/whoosh-entra.mp3 +0 -0
  3174. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/sons/whoosh-sai.mp3 +0 -0
  3175. /package/{kits/apple-tipografico/assets → materiais/apple-tipografico}/trilha/tech-claro-125bpm.mp3 +0 -0
  3176. /package/{kits/aquarela/elementos → materiais/aquarela/camera}/Camera.tsx +0 -0
  3177. /package/{kits/aquarela/assets → materiais/aquarela}/fontes/OFL-Caveat.txt +0 -0
  3178. /package/{kits/aquarela/assets → materiais/aquarela}/fontes/OFL-Fraunces.txt +0 -0
  3179. /package/{kits/aquarela/assets → materiais/aquarela}/fontes/caveat-latin.woff2 +0 -0
  3180. /package/{kits/aquarela/assets → materiais/aquarela}/fontes/fraunces-latin.woff2 +0 -0
  3181. /package/{kits/aquarela/assets → materiais/aquarela}/sons/assinatura.mp3 +0 -0
  3182. /package/{kits/aquarela/assets → materiais/aquarela}/sons/gota.mp3 +0 -0
  3183. /package/{kits/aquarela/assets → materiais/aquarela}/sons/impacto.mp3 +0 -0
  3184. /package/{kits/aquarela/assets → materiais/aquarela}/sons/palavra.mp3 +0 -0
  3185. /package/{kits/aquarela/assets → materiais/aquarela}/sons/papel-cai.mp3 +0 -0
  3186. /package/{kits/aquarela/assets → materiais/aquarela}/sons/pop-mancha.mp3 +0 -0
  3187. /package/{kits/aquarela/assets → materiais/aquarela}/sons/risco.mp3 +0 -0
  3188. /package/{kits/aquarela/assets → materiais/aquarela}/sons/whoosh-pincel.mp3 +0 -0
  3189. /package/{kits/aquarela/assets → materiais/aquarela}/trilha/calma-com-punch-108bpm.mp3 +0 -0
  3190. /package/{kits/aurora/elementos → materiais/aurora/camera}/Camera.tsx +0 -0
  3191. /package/{kits/aurora/assets → materiais/aurora}/fontes/OFL-InstrumentSerif.txt +0 -0
  3192. /package/{kits/aurora/assets → materiais/aurora}/fontes/OFL-Manrope.txt +0 -0
  3193. /package/{kits/aurora/assets → materiais/aurora}/fontes/instrument-latin.woff2 +0 -0
  3194. /package/{kits/aurora/assets → materiais/aurora}/fontes/manrope-latin.woff2 +0 -0
  3195. /package/{kits/aurora/assets → materiais/aurora}/sons/assinatura.mp3 +0 -0
  3196. /package/{kits/aurora/assets → materiais/aurora}/sons/brilho.mp3 +0 -0
  3197. /package/{kits/aurora/assets → materiais/aurora}/sons/meteoro.mp3 +0 -0
  3198. /package/{kits/aurora/assets → materiais/aurora}/sons/onda.mp3 +0 -0
  3199. /package/{kits/aurora/assets → materiais/aurora}/sons/sino.mp3 +0 -0
  3200. /package/{kits/aurora/assets → materiais/aurora}/sons/sopro.mp3 +0 -0
  3201. /package/{kits/aurora/assets → materiais/aurora}/sons/subida.mp3 +0 -0
  3202. /package/{kits/aurora/assets → materiais/aurora}/sons/toque.mp3 +0 -0
  3203. /package/{kits/aurora/assets → materiais/aurora}/trilha/suave-88bpm.mp3 +0 -0
  3204. /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/OFL-bebas-neue.txt +0 -0
  3205. /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/OFL-jost-900.txt +0 -0
  3206. /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/bebas-neue.woff2 +0 -0
  3207. /package/{kits/bauhaus/assets → materiais/bauhaus}/fontes/jost-900.woff2 +0 -0
  3208. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/assinatura.mp3 +0 -0
  3209. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/clique.mp3 +0 -0
  3210. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/impacto.mp3 +0 -0
  3211. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/pop-cartao.mp3 +0 -0
  3212. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/pop-palavra.mp3 +0 -0
  3213. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/subida.mp3 +0 -0
  3214. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/swoosh.mp3 +0 -0
  3215. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/tick.mp3 +0 -0
  3216. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/whoosh-entra.mp3 +0 -0
  3217. /package/{kits/bauhaus/assets → materiais/bauhaus}/sons/whoosh-sai.mp3 +0 -0
  3218. /package/{kits/bauhaus/assets → materiais/bauhaus}/trilha/trilha.mp3 +0 -0
  3219. /package/{kits/brutalista/elementos → materiais/brutalista/camera}/Camera.tsx +0 -0
  3220. /package/{kits/brutalista/assets → materiais/brutalista}/fontes/OFL-ArchivoBlack.txt +0 -0
  3221. /package/{kits/brutalista/assets → materiais/brutalista}/fontes/OFL-JetBrainsMono.txt +0 -0
  3222. /package/{kits/brutalista/assets → materiais/brutalista}/fontes/archivo-black.woff2 +0 -0
  3223. /package/{kits/brutalista/assets → materiais/brutalista}/fontes/jetbrains-mono.woff2 +0 -0
  3224. /package/{kits/brutalista/assets → materiais/brutalista}/sons/assinatura.mp3 +0 -0
  3225. /package/{kits/brutalista/assets → materiais/brutalista}/sons/clique.mp3 +0 -0
  3226. /package/{kits/brutalista/assets → materiais/brutalista}/sons/impacto.mp3 +0 -0
  3227. /package/{kits/brutalista/assets → materiais/brutalista}/sons/pop-cartao.mp3 +0 -0
  3228. /package/{kits/brutalista/assets → materiais/brutalista}/sons/pop-palavra.mp3 +0 -0
  3229. /package/{kits/brutalista/assets → materiais/brutalista}/sons/subida.mp3 +0 -0
  3230. /package/{kits/brutalista/assets → materiais/brutalista}/sons/swoosh.mp3 +0 -0
  3231. /package/{kits/brutalista/assets → materiais/brutalista}/sons/whoosh-entra.mp3 +0 -0
  3232. /package/{kits/brutalista/assets → materiais/brutalista}/sons/whoosh-sai.mp3 +0 -0
  3233. /package/{kits/brutalista/assets → materiais/brutalista}/trilha/bruta-108bpm.mp3 +0 -0
  3234. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-Archivo-Black.txt +0 -0
  3235. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-DM-Mono.txt +0 -0
  3236. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/OFL-Playfair-Italic.txt +0 -0
  3237. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/archivo-black.woff2 +0 -0
  3238. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/dm-mono.woff2 +0 -0
  3239. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/fontes/playfair-italic.woff2 +0 -0
  3240. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/assinatura.mp3 +0 -0
  3241. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/clique.mp3 +0 -0
  3242. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/impacto.mp3 +0 -0
  3243. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/pop-cartao.mp3 +0 -0
  3244. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/pop-palavra.mp3 +0 -0
  3245. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/subida.mp3 +0 -0
  3246. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/swoosh.mp3 +0 -0
  3247. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/whoosh-entra.mp3 +0 -0
  3248. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/sons/whoosh-sai.mp3 +0 -0
  3249. /package/{kits/campos-de-cor/assets → materiais/campos-de-cor}/trilha/trilha.mp3 +0 -0
  3250. /package/{kits/cartaz-cinetico/elementos → materiais/cartaz-cinetico/camera}/Camera.tsx +0 -0
  3251. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/OFL-Anton.txt +0 -0
  3252. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/OFL-Archivo.txt +0 -0
  3253. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/anton.woff2 +0 -0
  3254. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/fontes/archivo.woff2 +0 -0
  3255. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/assinatura.mp3 +0 -0
  3256. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/clique.mp3 +0 -0
  3257. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/impacto.mp3 +0 -0
  3258. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/pop-cartao.mp3 +0 -0
  3259. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/pop-palavra.mp3 +0 -0
  3260. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/subida.mp3 +0 -0
  3261. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/swoosh.mp3 +0 -0
  3262. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/whoosh-entra.mp3 +0 -0
  3263. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/sons/whoosh-sai.mp3 +0 -0
  3264. /package/{kits/cartaz-cinetico/assets → materiais/cartaz-cinetico}/trilha/cartaz-124bpm.mp3 +0 -0
  3265. /package/{kits/colagem/assets → materiais/colagem}/fontes/OFL-abril-fatface.txt +0 -0
  3266. /package/{kits/colagem/assets → materiais/colagem}/fontes/OFL-special-elite.txt +0 -0
  3267. /package/{kits/colagem/assets → materiais/colagem}/fontes/abril-fatface.woff2 +0 -0
  3268. /package/{kits/colagem/assets → materiais/colagem}/fontes/special-elite.woff2 +0 -0
  3269. /package/{kits/colagem/elementos → materiais/colagem/formas}/Overlay.tsx +0 -0
  3270. /package/{kits/colagem/assets → materiais/colagem}/sons/assinatura.mp3 +0 -0
  3271. /package/{kits/colagem/assets → materiais/colagem}/sons/clique.mp3 +0 -0
  3272. /package/{kits/colagem/assets → materiais/colagem}/sons/impacto.mp3 +0 -0
  3273. /package/{kits/colagem/assets → materiais/colagem}/sons/pop-cartao.mp3 +0 -0
  3274. /package/{kits/colagem/assets → materiais/colagem}/sons/pop-palavra.mp3 +0 -0
  3275. /package/{kits/colagem/assets → materiais/colagem}/sons/subida.mp3 +0 -0
  3276. /package/{kits/colagem/assets → materiais/colagem}/sons/swoosh.mp3 +0 -0
  3277. /package/{kits/colagem/assets → materiais/colagem}/sons/tick.mp3 +0 -0
  3278. /package/{kits/colagem/assets → materiais/colagem}/sons/whoosh-entra.mp3 +0 -0
  3279. /package/{kits/colagem/assets → materiais/colagem}/sons/whoosh-sai.mp3 +0 -0
  3280. /package/{kits/colagem/assets → materiais/colagem}/trilha/trilha.mp3 +0 -0
  3281. /package/{kits/contagem/elementos → materiais/contagem/camera}/Camera.tsx +0 -0
  3282. /package/{kits/contagem/assets → materiais/contagem}/fontes/OFL-BigShouldersDisplay.txt +0 -0
  3283. /package/{kits/contagem/assets → materiais/contagem}/fontes/OFL-SpaceMono.txt +0 -0
  3284. /package/{kits/contagem/assets → materiais/contagem}/fontes/bigshoulders.woff2 +0 -0
  3285. /package/{kits/contagem/assets → materiais/contagem}/fontes/spacemono.woff2 +0 -0
  3286. /package/{kits/contagem/assets → materiais/contagem}/sons/assinatura.mp3 +0 -0
  3287. /package/{kits/contagem/assets → materiais/contagem}/sons/clique.mp3 +0 -0
  3288. /package/{kits/contagem/assets → materiais/contagem}/sons/confete.mp3 +0 -0
  3289. /package/{kits/contagem/assets → materiais/contagem}/sons/impacto.mp3 +0 -0
  3290. /package/{kits/contagem/assets → materiais/contagem}/sons/pop-cartao.mp3 +0 -0
  3291. /package/{kits/contagem/assets → materiais/contagem}/sons/pop-palavra.mp3 +0 -0
  3292. /package/{kits/contagem/assets → materiais/contagem}/sons/subida.mp3 +0 -0
  3293. /package/{kits/contagem/assets → materiais/contagem}/sons/swoosh.mp3 +0 -0
  3294. /package/{kits/contagem/assets → materiais/contagem}/sons/tick.mp3 +0 -0
  3295. /package/{kits/contagem/assets → materiais/contagem}/sons/whoosh-entra.mp3 +0 -0
  3296. /package/{kits/contagem/assets → materiais/contagem}/sons/whoosh-sai.mp3 +0 -0
  3297. /package/{kits/contagem/assets → materiais/contagem}/trilha/pulso-128bpm.mp3 +0 -0
  3298. /package/{kits/convite-evento/elementos → materiais/convite-evento/camera}/Camera.tsx +0 -0
  3299. /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/OFL-InstrumentSerif.txt +0 -0
  3300. /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/OFL-Unbounded.txt +0 -0
  3301. /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/instrumentserif-i.woff2 +0 -0
  3302. /package/{kits/convite-evento/assets → materiais/convite-evento}/fontes/unbounded.woff2 +0 -0
  3303. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/assinatura.mp3 +0 -0
  3304. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/clique.mp3 +0 -0
  3305. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/confete.mp3 +0 -0
  3306. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/impacto.mp3 +0 -0
  3307. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/pop-cartao.mp3 +0 -0
  3308. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/pop-palavra.mp3 +0 -0
  3309. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/subida.mp3 +0 -0
  3310. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/swoosh.mp3 +0 -0
  3311. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/whoosh-entra.mp3 +0 -0
  3312. /package/{kits/convite-evento/assets → materiais/convite-evento}/sons/whoosh-sai.mp3 +0 -0
  3313. /package/{kits/convite-evento/assets → materiais/convite-evento}/trilha/festa-112bpm.mp3 +0 -0
  3314. /package/{kits/corte-podcast/elementos → materiais/corte-podcast/camera}/Camera.tsx +0 -0
  3315. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/OFL-Anton.txt +0 -0
  3316. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/OFL-IBMPlexMono.txt +0 -0
  3317. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/anton.woff2 +0 -0
  3318. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/fontes/plexmono.woff2 +0 -0
  3319. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/assinatura.mp3 +0 -0
  3320. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/clique.mp3 +0 -0
  3321. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/impacto.mp3 +0 -0
  3322. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/pop-cartao.mp3 +0 -0
  3323. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/pop-palavra.mp3 +0 -0
  3324. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/subida.mp3 +0 -0
  3325. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/swoosh.mp3 +0 -0
  3326. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/tick.mp3 +0 -0
  3327. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/whoosh-entra.mp3 +0 -0
  3328. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/sons/whoosh-sai.mp3 +0 -0
  3329. /package/{kits/corte-podcast/assets → materiais/corte-podcast}/trilha/lofi-pulso-100bpm.mp3 +0 -0
  3330. /package/{kits/cubos/elementos → materiais/cubos/camera}/Camera.tsx +0 -0
  3331. /package/{kits/cubos/assets → materiais/cubos}/fontes/OFL-ArchivoBlack.txt +0 -0
  3332. /package/{kits/cubos/assets → materiais/cubos}/fontes/OFL-DMSans.txt +0 -0
  3333. /package/{kits/cubos/assets → materiais/cubos}/fontes/archivoblack-latin.woff2 +0 -0
  3334. /package/{kits/cubos/assets → materiais/cubos}/fontes/dmsans-latin.woff2 +0 -0
  3335. /package/{kits/cubos/assets → materiais/cubos}/sons/assinatura.mp3 +0 -0
  3336. /package/{kits/cubos/assets → materiais/cubos}/sons/bloco.mp3 +0 -0
  3337. /package/{kits/cubos/assets → materiais/cubos}/sons/desmonta.mp3 +0 -0
  3338. /package/{kits/cubos/assets → materiais/cubos}/sons/encaixa.mp3 +0 -0
  3339. /package/{kits/cubos/assets → materiais/cubos}/sons/estala.mp3 +0 -0
  3340. /package/{kits/cubos/assets → materiais/cubos}/sons/gira.mp3 +0 -0
  3341. /package/{kits/cubos/assets → materiais/cubos}/sons/queda.mp3 +0 -0
  3342. /package/{kits/cubos/assets → materiais/cubos}/sons/whoosh.mp3 +0 -0
  3343. /package/{kits/cubos/assets → materiais/cubos}/trilha/calma-com-punch-108bpm.mp3 +0 -0
  3344. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/OFL-IBM-Plex-Mono.txt +0 -0
  3345. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/OFL-Montserrat.txt +0 -0
  3346. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/montserrat.woff2 +0 -0
  3347. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/fontes/plex-mono.woff2 +0 -0
  3348. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/assinatura.mp3 +0 -0
  3349. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/clique.mp3 +0 -0
  3350. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/impacto.mp3 +0 -0
  3351. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/pop-cartao.mp3 +0 -0
  3352. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/pop-palavra.mp3 +0 -0
  3353. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/subida.mp3 +0 -0
  3354. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/swoosh.mp3 +0 -0
  3355. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/whoosh-entra.mp3 +0 -0
  3356. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/sons/whoosh-sai.mp3 +0 -0
  3357. /package/{kits/dashboard-dados/assets → materiais/dashboard-dados}/trilha/trilha.mp3 +0 -0
  3358. /package/{kits/depoimento/elementos → materiais/depoimento/camera}/Camera.tsx +0 -0
  3359. /package/{kits/depoimento/assets → materiais/depoimento}/fontes/OFL-Newsreader.txt +0 -0
  3360. /package/{kits/depoimento/assets → materiais/depoimento}/fontes/OFL-SpaceGrotesk.txt +0 -0
  3361. /package/{kits/depoimento/assets → materiais/depoimento}/fontes/newsreader-i.woff2 +0 -0
  3362. /package/{kits/depoimento/assets → materiais/depoimento}/fontes/spacegrotesk.woff2 +0 -0
  3363. /package/{kits/depoimento/assets → materiais/depoimento}/sons/assinatura.mp3 +0 -0
  3364. /package/{kits/depoimento/assets → materiais/depoimento}/sons/clique.mp3 +0 -0
  3365. /package/{kits/depoimento/assets → materiais/depoimento}/sons/estrela.mp3 +0 -0
  3366. /package/{kits/depoimento/assets → materiais/depoimento}/sons/impacto.mp3 +0 -0
  3367. /package/{kits/depoimento/assets → materiais/depoimento}/sons/pop-cartao.mp3 +0 -0
  3368. /package/{kits/depoimento/assets → materiais/depoimento}/sons/pop-palavra.mp3 +0 -0
  3369. /package/{kits/depoimento/assets → materiais/depoimento}/sons/subida.mp3 +0 -0
  3370. /package/{kits/depoimento/assets → materiais/depoimento}/sons/swoosh.mp3 +0 -0
  3371. /package/{kits/depoimento/assets → materiais/depoimento}/sons/verificado.mp3 +0 -0
  3372. /package/{kits/depoimento/assets → materiais/depoimento}/sons/whoosh-entra.mp3 +0 -0
  3373. /package/{kits/depoimento/assets → materiais/depoimento}/sons/whoosh-sai.mp3 +0 -0
  3374. /package/{kits/depoimento/assets → materiais/depoimento}/trilha/calor-104bpm.mp3 +0 -0
  3375. /package/{kits/infografico/elementos → materiais/infografico/camera}/Camera.tsx +0 -0
  3376. /package/{kits/infografico/assets → materiais/infografico}/fontes/OFL-Caveat.txt +0 -0
  3377. /package/{kits/infografico/assets → materiais/infografico}/fontes/OFL-Outfit.txt +0 -0
  3378. /package/{kits/infografico/assets → materiais/infografico}/fontes/caveat.woff2 +0 -0
  3379. /package/{kits/infografico/assets → materiais/infografico}/fontes/outfit.woff2 +0 -0
  3380. /package/{kits/infografico/assets → materiais/infografico}/sons/assinatura.mp3 +0 -0
  3381. /package/{kits/infografico/assets → materiais/infografico}/sons/clique.mp3 +0 -0
  3382. /package/{kits/infografico/assets → materiais/infografico}/sons/impacto.mp3 +0 -0
  3383. /package/{kits/infografico/assets → materiais/infografico}/sons/pop-cartao.mp3 +0 -0
  3384. /package/{kits/infografico/assets → materiais/infografico}/sons/pop-palavra.mp3 +0 -0
  3385. /package/{kits/infografico/assets → materiais/infografico}/sons/subida.mp3 +0 -0
  3386. /package/{kits/infografico/assets → materiais/infografico}/sons/swoosh.mp3 +0 -0
  3387. /package/{kits/infografico/assets → materiais/infografico}/sons/traco.mp3 +0 -0
  3388. /package/{kits/infografico/assets → materiais/infografico}/sons/whoosh-entra.mp3 +0 -0
  3389. /package/{kits/infografico/assets → materiais/infografico}/sons/whoosh-sai.mp3 +0 -0
  3390. /package/{kits/infografico/assets → materiais/infografico}/trilha/explica-100bpm.mp3 +0 -0
  3391. /package/{kits/isometrico/assets → materiais/isometrico}/fontes/OFL-Archivo.txt +0 -0
  3392. /package/{kits/isometrico/assets → materiais/isometrico}/fontes/OFL-Jost.txt +0 -0
  3393. /package/{kits/isometrico/assets → materiais/isometrico}/fontes/archivo.woff2 +0 -0
  3394. /package/{kits/isometrico/assets → materiais/isometrico}/fontes/jost.woff2 +0 -0
  3395. /package/{kits/isometrico/elementos → materiais/isometrico/formas}/iso.tsx +0 -0
  3396. /package/{kits/isometrico/assets → materiais/isometrico}/sons/assinatura.mp3 +0 -0
  3397. /package/{kits/isometrico/assets → materiais/isometrico}/sons/clique.mp3 +0 -0
  3398. /package/{kits/isometrico/assets → materiais/isometrico}/sons/impacto.mp3 +0 -0
  3399. /package/{kits/isometrico/assets → materiais/isometrico}/sons/pop-cartao.mp3 +0 -0
  3400. /package/{kits/isometrico/assets → materiais/isometrico}/sons/pop-palavra.mp3 +0 -0
  3401. /package/{kits/isometrico/assets → materiais/isometrico}/sons/subida.mp3 +0 -0
  3402. /package/{kits/isometrico/assets → materiais/isometrico}/sons/swoosh.mp3 +0 -0
  3403. /package/{kits/isometrico/assets → materiais/isometrico}/sons/whoosh-entra.mp3 +0 -0
  3404. /package/{kits/isometrico/assets → materiais/isometrico}/sons/whoosh-sai.mp3 +0 -0
  3405. /package/{kits/isometrico/assets → materiais/isometrico}/trilha/trilha.mp3 +0 -0
  3406. /package/{kits/jornal/elementos → materiais/jornal/camera}/Camera.tsx +0 -0
  3407. /package/{kits/jornal/assets → materiais/jornal}/fontes/OFL-PlayfairDisplay.txt +0 -0
  3408. /package/{kits/jornal/assets → materiais/jornal}/fontes/OFL-UnifrakturMaguntia.txt +0 -0
  3409. /package/{kits/jornal/assets → materiais/jornal}/fontes/playfair-italic.woff2 +0 -0
  3410. /package/{kits/jornal/assets → materiais/jornal}/fontes/playfair.woff2 +0 -0
  3411. /package/{kits/jornal/assets → materiais/jornal}/fontes/unifraktur.woff2 +0 -0
  3412. /package/{kits/jornal/assets → materiais/jornal}/sons/assinatura.mp3 +0 -0
  3413. /package/{kits/jornal/assets → materiais/jornal}/sons/clique.mp3 +0 -0
  3414. /package/{kits/jornal/assets → materiais/jornal}/sons/impacto.mp3 +0 -0
  3415. /package/{kits/jornal/assets → materiais/jornal}/sons/pop-cartao.mp3 +0 -0
  3416. /package/{kits/jornal/assets → materiais/jornal}/sons/pop-palavra.mp3 +0 -0
  3417. /package/{kits/jornal/assets → materiais/jornal}/sons/subida.mp3 +0 -0
  3418. /package/{kits/jornal/assets → materiais/jornal}/sons/swoosh.mp3 +0 -0
  3419. /package/{kits/jornal/assets → materiais/jornal}/sons/whoosh-entra.mp3 +0 -0
  3420. /package/{kits/jornal/assets → materiais/jornal}/sons/whoosh-sai.mp3 +0 -0
  3421. /package/{kits/jornal/assets → materiais/jornal}/trilha/redacao-96bpm.mp3 +0 -0
  3422. /package/{kits/legenda-viva/elementos → materiais/legenda-viva/camera}/Camera.tsx +0 -0
  3423. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/OFL-Inter.txt +0 -0
  3424. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/OFL-Montserrat.txt +0 -0
  3425. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/inter.woff2 +0 -0
  3426. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/fontes/montserrat.woff2 +0 -0
  3427. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/assinatura.mp3 +0 -0
  3428. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/clique.mp3 +0 -0
  3429. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/impacto.mp3 +0 -0
  3430. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/pop-cartao.mp3 +0 -0
  3431. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/pop-palavra.mp3 +0 -0
  3432. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/subida.mp3 +0 -0
  3433. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/swoosh.mp3 +0 -0
  3434. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/whoosh-entra.mp3 +0 -0
  3435. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/sons/whoosh-sai.mp3 +0 -0
  3436. /package/{kits/legenda-viva/assets → materiais/legenda-viva}/trilha/voz-118bpm.mp3 +0 -0
  3437. /package/{kits/luxo/elementos → materiais/luxo/camera}/Camera.tsx +0 -0
  3438. /package/{kits/luxo/assets → materiais/luxo}/fontes/OFL-CormorantGaramond.txt +0 -0
  3439. /package/{kits/luxo/assets → materiais/luxo}/fontes/OFL-Jost.txt +0 -0
  3440. /package/{kits/luxo/assets → materiais/luxo}/fontes/cormorant-i.woff2 +0 -0
  3441. /package/{kits/luxo/assets → materiais/luxo}/fontes/cormorant.woff2 +0 -0
  3442. /package/{kits/luxo/assets → materiais/luxo}/fontes/jost.woff2 +0 -0
  3443. /package/{kits/luxo/assets → materiais/luxo}/sons/assinatura.mp3 +0 -0
  3444. /package/{kits/luxo/assets → materiais/luxo}/sons/clique.mp3 +0 -0
  3445. /package/{kits/luxo/assets → materiais/luxo}/sons/impacto.mp3 +0 -0
  3446. /package/{kits/luxo/assets → materiais/luxo}/sons/pop-cartao.mp3 +0 -0
  3447. /package/{kits/luxo/assets → materiais/luxo}/sons/pop-palavra.mp3 +0 -0
  3448. /package/{kits/luxo/assets → materiais/luxo}/sons/sino.mp3 +0 -0
  3449. /package/{kits/luxo/assets → materiais/luxo}/sons/subida.mp3 +0 -0
  3450. /package/{kits/luxo/assets → materiais/luxo}/sons/swoosh.mp3 +0 -0
  3451. /package/{kits/luxo/assets → materiais/luxo}/sons/whoosh-entra.mp3 +0 -0
  3452. /package/{kits/luxo/assets → materiais/luxo}/sons/whoosh-sai.mp3 +0 -0
  3453. /package/{kits/luxo/assets → materiais/luxo}/trilha/ambar-78bpm.mp3 +0 -0
  3454. /package/{kits/mapa/elementos → materiais/mapa/camera}/Camera.tsx +0 -0
  3455. /package/{kits/mapa/assets → materiais/mapa}/fontes/OFL-DMMono.txt +0 -0
  3456. /package/{kits/mapa/assets → materiais/mapa}/fontes/OFL-DMSans.txt +0 -0
  3457. /package/{kits/mapa/assets → materiais/mapa}/fontes/dmmono.woff2 +0 -0
  3458. /package/{kits/mapa/assets → materiais/mapa}/fontes/dmsans.woff2 +0 -0
  3459. /package/{kits/mapa/assets → materiais/mapa}/sons/assinatura.mp3 +0 -0
  3460. /package/{kits/mapa/assets → materiais/mapa}/sons/clique.mp3 +0 -0
  3461. /package/{kits/mapa/assets → materiais/mapa}/sons/impacto.mp3 +0 -0
  3462. /package/{kits/mapa/assets → materiais/mapa}/sons/pop-cartao.mp3 +0 -0
  3463. /package/{kits/mapa/assets → materiais/mapa}/sons/pop-palavra.mp3 +0 -0
  3464. /package/{kits/mapa/assets → materiais/mapa}/sons/quique.mp3 +0 -0
  3465. /package/{kits/mapa/assets → materiais/mapa}/sons/subida.mp3 +0 -0
  3466. /package/{kits/mapa/assets → materiais/mapa}/sons/swoosh.mp3 +0 -0
  3467. /package/{kits/mapa/assets → materiais/mapa}/sons/traco.mp3 +0 -0
  3468. /package/{kits/mapa/assets → materiais/mapa}/sons/whoosh-entra.mp3 +0 -0
  3469. /package/{kits/mapa/assets → materiais/mapa}/sons/whoosh-sai.mp3 +0 -0
  3470. /package/{kits/mapa/assets → materiais/mapa}/trilha/rota-100bpm.mp3 +0 -0
  3471. /package/{kits/massinha/assets → materiais/massinha}/fontes/OFL-chewy.txt +0 -0
  3472. /package/{kits/massinha/assets → materiais/massinha}/fontes/OFL-nunito-800.txt +0 -0
  3473. /package/{kits/massinha/assets → materiais/massinha}/fontes/chewy.woff2 +0 -0
  3474. /package/{kits/massinha/assets → materiais/massinha}/fontes/nunito-800.woff2 +0 -0
  3475. /package/{kits/massinha/elementos → materiais/massinha/lib}/argila.ts +0 -0
  3476. /package/{kits/massinha/assets → materiais/massinha}/sons/assinatura.mp3 +0 -0
  3477. /package/{kits/massinha/assets → materiais/massinha}/sons/clique.mp3 +0 -0
  3478. /package/{kits/massinha/assets → materiais/massinha}/sons/impacto.mp3 +0 -0
  3479. /package/{kits/massinha/assets → materiais/massinha}/sons/pop-cartao.mp3 +0 -0
  3480. /package/{kits/massinha/assets → materiais/massinha}/sons/pop-palavra.mp3 +0 -0
  3481. /package/{kits/massinha/assets → materiais/massinha}/sons/subida.mp3 +0 -0
  3482. /package/{kits/massinha/assets → materiais/massinha}/sons/swoosh.mp3 +0 -0
  3483. /package/{kits/massinha/assets → materiais/massinha}/sons/tick.mp3 +0 -0
  3484. /package/{kits/massinha/assets → materiais/massinha}/sons/whoosh-entra.mp3 +0 -0
  3485. /package/{kits/massinha/assets → materiais/massinha}/sons/whoosh-sai.mp3 +0 -0
  3486. /package/{kits/massinha/assets → materiais/massinha}/trilha/trilha.mp3 +0 -0
  3487. /package/{kits/memphis/assets → materiais/memphis}/fontes/OFL-bowlby-one.txt +0 -0
  3488. /package/{kits/memphis/assets → materiais/memphis}/fontes/OFL-dm-sans-800.txt +0 -0
  3489. /package/{kits/memphis/assets → materiais/memphis}/fontes/bowlby-one.woff2 +0 -0
  3490. /package/{kits/memphis/assets → materiais/memphis}/fontes/dm-sans-800.woff2 +0 -0
  3491. /package/{kits/memphis/assets → materiais/memphis}/sons/assinatura.mp3 +0 -0
  3492. /package/{kits/memphis/assets → materiais/memphis}/sons/clique.mp3 +0 -0
  3493. /package/{kits/memphis/assets → materiais/memphis}/sons/impacto.mp3 +0 -0
  3494. /package/{kits/memphis/assets → materiais/memphis}/sons/pop-cartao.mp3 +0 -0
  3495. /package/{kits/memphis/assets → materiais/memphis}/sons/pop-palavra.mp3 +0 -0
  3496. /package/{kits/memphis/assets → materiais/memphis}/sons/subida.mp3 +0 -0
  3497. /package/{kits/memphis/assets → materiais/memphis}/sons/swoosh.mp3 +0 -0
  3498. /package/{kits/memphis/assets → materiais/memphis}/sons/tick.mp3 +0 -0
  3499. /package/{kits/memphis/assets → materiais/memphis}/sons/whoosh-entra.mp3 +0 -0
  3500. /package/{kits/memphis/assets → materiais/memphis}/sons/whoosh-sai.mp3 +0 -0
  3501. /package/{kits/memphis/assets → materiais/memphis}/trilha/trilha.mp3 +0 -0
  3502. /package/{kits/metal-liquido/elementos → materiais/metal-liquido/camera}/Camera.tsx +0 -0
  3503. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/OFL-SpaceGrotesk.txt +0 -0
  3504. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/OFL-Unbounded.txt +0 -0
  3505. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/grotesk-latin.woff2 +0 -0
  3506. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/fontes/unbounded-latin.woff2 +0 -0
  3507. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/assinatura.mp3 +0 -0
  3508. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/clique.mp3 +0 -0
  3509. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/cromo.mp3 +0 -0
  3510. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/liquido.mp3 +0 -0
  3511. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/quique.mp3 +0 -0
  3512. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/subida.mp3 +0 -0
  3513. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/varre.mp3 +0 -0
  3514. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/sons/whoosh.mp3 +0 -0
  3515. /package/{kits/metal-liquido/assets → materiais/metal-liquido}/trilha/sombrio-114bpm.mp3 +0 -0
  3516. /package/{kits/minimal/elementos → materiais/minimal/camera}/Camera.tsx +0 -0
  3517. /package/{kits/minimal/assets → materiais/minimal}/fontes/OFL-HankenGrotesk.txt +0 -0
  3518. /package/{kits/minimal/assets → materiais/minimal}/fontes/OFL-SplineSansMono.txt +0 -0
  3519. /package/{kits/minimal/assets → materiais/minimal}/fontes/hanken.woff2 +0 -0
  3520. /package/{kits/minimal/assets → materiais/minimal}/fontes/splinemono.woff2 +0 -0
  3521. /package/{kits/minimal/assets → materiais/minimal}/sons/assinatura.mp3 +0 -0
  3522. /package/{kits/minimal/assets → materiais/minimal}/sons/clique.mp3 +0 -0
  3523. /package/{kits/minimal/assets → materiais/minimal}/sons/impacto.mp3 +0 -0
  3524. /package/{kits/minimal/assets → materiais/minimal}/sons/pop-cartao.mp3 +0 -0
  3525. /package/{kits/minimal/assets → materiais/minimal}/sons/pop-palavra.mp3 +0 -0
  3526. /package/{kits/minimal/assets → materiais/minimal}/sons/subida.mp3 +0 -0
  3527. /package/{kits/minimal/assets → materiais/minimal}/sons/swoosh.mp3 +0 -0
  3528. /package/{kits/minimal/assets → materiais/minimal}/sons/toque.mp3 +0 -0
  3529. /package/{kits/minimal/assets → materiais/minimal}/sons/whoosh-entra.mp3 +0 -0
  3530. /package/{kits/minimal/assets → materiais/minimal}/sons/whoosh-sai.mp3 +0 -0
  3531. /package/{kits/minimal/assets → materiais/minimal}/trilha/vazio-90bpm.mp3 +0 -0
  3532. /package/{kits/neon-cidade/elementos → materiais/neon-cidade/camera}/Camera.tsx +0 -0
  3533. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/OFL-BarlowCondensed.txt +0 -0
  3534. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/OFL-TiltNeon.txt +0 -0
  3535. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/barlow-latin.woff2 +0 -0
  3536. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/fontes/tiltneon-latin.woff2 +0 -0
  3537. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/assinatura.mp3 +0 -0
  3538. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/balanca.mp3 +0 -0
  3539. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/clique.mp3 +0 -0
  3540. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/impacto.mp3 +0 -0
  3541. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/liga.mp3 +0 -0
  3542. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/tick.mp3 +0 -0
  3543. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/whoosh.mp3 +0 -0
  3544. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/sons/zumbido.mp3 +0 -0
  3545. /package/{kits/neon-cidade/assets → materiais/neon-cidade}/trilha/noite-100bpm.mp3 +0 -0
  3546. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Cormorant-Italic.txt +0 -0
  3547. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Cormorant.txt +0 -0
  3548. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/OFL-Jost.txt +0 -0
  3549. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/cormorant-italic.woff2 +0 -0
  3550. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/cormorant.woff2 +0 -0
  3551. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/fontes/jost.woff2 +0 -0
  3552. /package/{kits/notion-editorial/elementos → materiais/notion-editorial/formas}/desenho.tsx +0 -0
  3553. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/assinatura.mp3 +0 -0
  3554. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/clique.mp3 +0 -0
  3555. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/impacto.mp3 +0 -0
  3556. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/pop-cartao.mp3 +0 -0
  3557. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/pop-palavra.mp3 +0 -0
  3558. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/subida.mp3 +0 -0
  3559. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/swoosh.mp3 +0 -0
  3560. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/whoosh-entra.mp3 +0 -0
  3561. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/sons/whoosh-sai.mp3 +0 -0
  3562. /package/{kits/notion-editorial/assets → materiais/notion-editorial}/trilha/trilha.mp3 +0 -0
  3563. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/OFL-fredoka-700.txt +0 -0
  3564. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/OFL-nunito-700.txt +0 -0
  3565. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/fredoka-700.woff2 +0 -0
  3566. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/fontes/nunito-700.woff2 +0 -0
  3567. /package/{kits/papel-recortado/elementos → materiais/papel-recortado/formas}/Filtros.tsx +0 -0
  3568. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/assinatura.mp3 +0 -0
  3569. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/clique.mp3 +0 -0
  3570. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/impacto.mp3 +0 -0
  3571. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/pop-cartao.mp3 +0 -0
  3572. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/pop-palavra.mp3 +0 -0
  3573. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/subida.mp3 +0 -0
  3574. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/swoosh.mp3 +0 -0
  3575. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/tick.mp3 +0 -0
  3576. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/whoosh-entra.mp3 +0 -0
  3577. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/sons/whoosh-sai.mp3 +0 -0
  3578. /package/{kits/papel-recortado/assets → materiais/papel-recortado}/trilha/trilha.mp3 +0 -0
  3579. /package/{kits/pixel/assets → materiais/pixel}/fontes/OFL-pressstart2p.txt +0 -0
  3580. /package/{kits/pixel/assets → materiais/pixel}/fontes/OFL-vt323.txt +0 -0
  3581. /package/{kits/pixel/assets → materiais/pixel}/fontes/pressstart2p.woff2 +0 -0
  3582. /package/{kits/pixel/assets → materiais/pixel}/fontes/vt323.woff2 +0 -0
  3583. /package/{kits/pixel/assets → materiais/pixel}/sons/assinatura.mp3 +0 -0
  3584. /package/{kits/pixel/assets → materiais/pixel}/sons/clique.mp3 +0 -0
  3585. /package/{kits/pixel/assets → materiais/pixel}/sons/impacto.mp3 +0 -0
  3586. /package/{kits/pixel/assets → materiais/pixel}/sons/pop-cartao.mp3 +0 -0
  3587. /package/{kits/pixel/assets → materiais/pixel}/sons/pop-palavra.mp3 +0 -0
  3588. /package/{kits/pixel/assets → materiais/pixel}/sons/subida.mp3 +0 -0
  3589. /package/{kits/pixel/assets → materiais/pixel}/sons/swoosh.mp3 +0 -0
  3590. /package/{kits/pixel/assets → materiais/pixel}/sons/tick.mp3 +0 -0
  3591. /package/{kits/pixel/assets → materiais/pixel}/sons/whoosh-entra.mp3 +0 -0
  3592. /package/{kits/pixel/assets → materiais/pixel}/sons/whoosh-sai.mp3 +0 -0
  3593. /package/{kits/pixel/assets → materiais/pixel}/trilha/trilha.mp3 +0 -0
  3594. /package/{kits/pontos-3d/elementos → materiais/pontos-3d/camera}/Camera.tsx +0 -0
  3595. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/OFL-JetBrainsMono.txt +0 -0
  3596. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/OFL-Sora.txt +0 -0
  3597. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/jetbrains-latin.woff2 +0 -0
  3598. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/fontes/sora-latin.woff2 +0 -0
  3599. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/assinatura.mp3 +0 -0
  3600. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/clique.mp3 +0 -0
  3601. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/impacto.mp3 +0 -0
  3602. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/pop.mp3 +0 -0
  3603. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/subida.mp3 +0 -0
  3604. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/tick.mp3 +0 -0
  3605. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/varre.mp3 +0 -0
  3606. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/sons/whoosh.mp3 +0 -0
  3607. /package/{kits/pontos-3d/assets → materiais/pontos-3d}/trilha/tech-120bpm.mp3 +0 -0
  3608. /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/OFL-IBMPlexMono.txt +0 -0
  3609. /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/OFL-Syncopate.txt +0 -0
  3610. /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/plex-mono.woff2 +0 -0
  3611. /package/{kits/produto-3d/assets → materiais/produto-3d}/fontes/syncopate-latin.woff2 +0 -0
  3612. /package/{kits/produto-3d/elementos → materiais/produto-3d/lib}/modelos.ts +0 -0
  3613. /package/{kits/produto-3d/elementos → materiais/produto-3d/lib}/raymarch.ts +0 -0
  3614. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/assinatura.mp3 +0 -0
  3615. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/clique.mp3 +0 -0
  3616. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/impacto.mp3 +0 -0
  3617. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/pop-cartao.mp3 +0 -0
  3618. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/pop-palavra.mp3 +0 -0
  3619. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/subida.mp3 +0 -0
  3620. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/swoosh.mp3 +0 -0
  3621. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/whoosh-entra.mp3 +0 -0
  3622. /package/{kits/produto-3d/assets → materiais/produto-3d}/sons/whoosh-sai.mp3 +0 -0
  3623. /package/{kits/produto-3d/assets → materiais/produto-3d}/trilha/trilha.mp3 +0 -0
  3624. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/OFL-patrick-hand.txt +0 -0
  3625. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/OFL-schoolbell.txt +0 -0
  3626. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/patrick-hand.woff2 +0 -0
  3627. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/fontes/schoolbell.woff2 +0 -0
  3628. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/assinatura.mp3 +0 -0
  3629. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/clique.mp3 +0 -0
  3630. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/impacto.mp3 +0 -0
  3631. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/pop-cartao.mp3 +0 -0
  3632. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/pop-palavra.mp3 +0 -0
  3633. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/subida.mp3 +0 -0
  3634. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/swoosh.mp3 +0 -0
  3635. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/tick.mp3 +0 -0
  3636. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/whoosh-entra.mp3 +0 -0
  3637. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/sons/whoosh-sai.mp3 +0 -0
  3638. /package/{kits/quadro-giz/assets → materiais/quadro-giz}/trilha/trilha.mp3 +0 -0
  3639. /package/{kits/rabisco/assets → materiais/rabisco}/fontes/OFL-caveat-700.txt +0 -0
  3640. /package/{kits/rabisco/assets → materiais/rabisco}/fontes/OFL-permanent-marker.txt +0 -0
  3641. /package/{kits/rabisco/assets → materiais/rabisco}/fontes/caveat-700.woff2 +0 -0
  3642. /package/{kits/rabisco/assets → materiais/rabisco}/fontes/permanent-marker.woff2 +0 -0
  3643. /package/{kits/rabisco/elementos → materiais/rabisco/formas}/Overlay.tsx +0 -0
  3644. /package/{kits/rabisco/assets → materiais/rabisco}/sons/assinatura.mp3 +0 -0
  3645. /package/{kits/rabisco/assets → materiais/rabisco}/sons/clique.mp3 +0 -0
  3646. /package/{kits/rabisco/assets → materiais/rabisco}/sons/impacto.mp3 +0 -0
  3647. /package/{kits/rabisco/assets → materiais/rabisco}/sons/pop-cartao.mp3 +0 -0
  3648. /package/{kits/rabisco/assets → materiais/rabisco}/sons/pop-palavra.mp3 +0 -0
  3649. /package/{kits/rabisco/assets → materiais/rabisco}/sons/subida.mp3 +0 -0
  3650. /package/{kits/rabisco/assets → materiais/rabisco}/sons/swoosh.mp3 +0 -0
  3651. /package/{kits/rabisco/assets → materiais/rabisco}/sons/tick.mp3 +0 -0
  3652. /package/{kits/rabisco/assets → materiais/rabisco}/sons/whoosh-entra.mp3 +0 -0
  3653. /package/{kits/rabisco/assets → materiais/rabisco}/sons/whoosh-sai.mp3 +0 -0
  3654. /package/{kits/rabisco/assets → materiais/rabisco}/trilha/trilha.mp3 +0 -0
  3655. /package/{kits/retro-70/elementos → materiais/retro-70/camera}/Camera.tsx +0 -0
  3656. /package/{kits/retro-70/assets → materiais/retro-70}/fontes/OFL-Fredoka.txt +0 -0
  3657. /package/{kits/retro-70/assets → materiais/retro-70}/fontes/OFL-Shrikhand.txt +0 -0
  3658. /package/{kits/retro-70/assets → materiais/retro-70}/fontes/fredoka.woff2 +0 -0
  3659. /package/{kits/retro-70/assets → materiais/retro-70}/fontes/shrikhand.woff2 +0 -0
  3660. /package/{kits/retro-70/assets → materiais/retro-70}/sons/assinatura.mp3 +0 -0
  3661. /package/{kits/retro-70/assets → materiais/retro-70}/sons/clique.mp3 +0 -0
  3662. /package/{kits/retro-70/assets → materiais/retro-70}/sons/impacto.mp3 +0 -0
  3663. /package/{kits/retro-70/assets → materiais/retro-70}/sons/pop-cartao.mp3 +0 -0
  3664. /package/{kits/retro-70/assets → materiais/retro-70}/sons/pop-palavra.mp3 +0 -0
  3665. /package/{kits/retro-70/assets → materiais/retro-70}/sons/subida.mp3 +0 -0
  3666. /package/{kits/retro-70/assets → materiais/retro-70}/sons/swoosh.mp3 +0 -0
  3667. /package/{kits/retro-70/assets → materiais/retro-70}/sons/whoosh-entra.mp3 +0 -0
  3668. /package/{kits/retro-70/assets → materiais/retro-70}/sons/whoosh-sai.mp3 +0 -0
  3669. /package/{kits/retro-70/assets → materiais/retro-70}/trilha/solar-104bpm.mp3 +0 -0
  3670. /package/{kits/revista/elementos → materiais/revista/camera}/Camera.tsx +0 -0
  3671. /package/{kits/revista/assets → materiais/revista}/fontes/OFL-CormorantGaramond.txt +0 -0
  3672. /package/{kits/revista/assets → materiais/revista}/fontes/OFL-Jost.txt +0 -0
  3673. /package/{kits/revista/assets → materiais/revista}/fontes/cormorant-italic.woff2 +0 -0
  3674. /package/{kits/revista/assets → materiais/revista}/fontes/cormorant.woff2 +0 -0
  3675. /package/{kits/revista/assets → materiais/revista}/fontes/jost.woff2 +0 -0
  3676. /package/{kits/revista/assets → materiais/revista}/sons/assinatura.mp3 +0 -0
  3677. /package/{kits/revista/assets → materiais/revista}/sons/clique.mp3 +0 -0
  3678. /package/{kits/revista/assets → materiais/revista}/sons/impacto.mp3 +0 -0
  3679. /package/{kits/revista/assets → materiais/revista}/sons/pop-cartao.mp3 +0 -0
  3680. /package/{kits/revista/assets → materiais/revista}/sons/pop-palavra.mp3 +0 -0
  3681. /package/{kits/revista/assets → materiais/revista}/sons/subida.mp3 +0 -0
  3682. /package/{kits/revista/assets → materiais/revista}/sons/swoosh.mp3 +0 -0
  3683. /package/{kits/revista/assets → materiais/revista}/sons/whoosh-entra.mp3 +0 -0
  3684. /package/{kits/revista/assets → materiais/revista}/sons/whoosh-sai.mp3 +0 -0
  3685. /package/{kits/revista/assets → materiais/revista}/trilha/editorial-100bpm.mp3 +0 -0
  3686. /package/{kits/risografia/assets → materiais/risografia}/fontes/OFL-bricolage-800.txt +0 -0
  3687. /package/{kits/risografia/assets → materiais/risografia}/fontes/OFL-space-mono-700.txt +0 -0
  3688. /package/{kits/risografia/assets → materiais/risografia}/fontes/bricolage-800.woff2 +0 -0
  3689. /package/{kits/risografia/assets → materiais/risografia}/fontes/space-mono-700.woff2 +0 -0
  3690. /package/{kits/risografia/assets → materiais/risografia}/sons/assinatura.mp3 +0 -0
  3691. /package/{kits/risografia/assets → materiais/risografia}/sons/clique.mp3 +0 -0
  3692. /package/{kits/risografia/assets → materiais/risografia}/sons/impacto.mp3 +0 -0
  3693. /package/{kits/risografia/assets → materiais/risografia}/sons/pop-cartao.mp3 +0 -0
  3694. /package/{kits/risografia/assets → materiais/risografia}/sons/pop-palavra.mp3 +0 -0
  3695. /package/{kits/risografia/assets → materiais/risografia}/sons/subida.mp3 +0 -0
  3696. /package/{kits/risografia/assets → materiais/risografia}/sons/swoosh.mp3 +0 -0
  3697. /package/{kits/risografia/assets → materiais/risografia}/sons/tick.mp3 +0 -0
  3698. /package/{kits/risografia/assets → materiais/risografia}/sons/whoosh-entra.mp3 +0 -0
  3699. /package/{kits/risografia/assets → materiais/risografia}/sons/whoosh-sai.mp3 +0 -0
  3700. /package/{kits/risografia/assets → materiais/risografia}/trilha/trilha.mp3 +0 -0
  3701. /package/materiais/saas-linear/{paleta.json → cores/paleta.json} +0 -0
  3702. /package/{kits/saas-linear/assets → materiais/saas-linear}/trilha/trilha.mp3 +0 -0
  3703. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/OFL-DM-Mono.txt +0 -0
  3704. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/OFL-Inter.txt +0 -0
  3705. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/dm-mono.woff2 +0 -0
  3706. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/fontes/inter.woff2 +0 -0
  3707. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/assinatura.mp3 +0 -0
  3708. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/clique.mp3 +0 -0
  3709. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/impacto.mp3 +0 -0
  3710. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/pop-cartao.mp3 +0 -0
  3711. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/pop-palavra.mp3 +0 -0
  3712. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/subida.mp3 +0 -0
  3713. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/swoosh.mp3 +0 -0
  3714. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/whoosh-entra.mp3 +0 -0
  3715. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/sons/whoosh-sai.mp3 +0 -0
  3716. /package/{kits/stripe-ondas/assets → materiais/stripe-ondas}/trilha/trilha.mp3 +0 -0
  3717. /package/{kits/suica/elementos → materiais/suica/camera}/Camera.tsx +0 -0
  3718. /package/{kits/suica/assets → materiais/suica}/fontes/OFL-IBMPlexMono.txt +0 -0
  3719. /package/{kits/suica/assets → materiais/suica}/fontes/OFL-InterTight.txt +0 -0
  3720. /package/{kits/suica/assets → materiais/suica}/fontes/inter-tight.woff2 +0 -0
  3721. /package/{kits/suica/assets → materiais/suica}/fontes/plex-mono.woff2 +0 -0
  3722. /package/{kits/saas-linear/assets → materiais/suica}/sons/assinatura.mp3 +0 -0
  3723. /package/{kits/saas-linear/assets → materiais/suica}/sons/clique.mp3 +0 -0
  3724. /package/{kits/saas-linear/assets → materiais/suica}/sons/impacto.mp3 +0 -0
  3725. /package/{kits/saas-linear/assets → materiais/suica}/sons/pop-cartao.mp3 +0 -0
  3726. /package/{kits/saas-linear/assets → materiais/suica}/sons/pop-palavra.mp3 +0 -0
  3727. /package/{kits/saas-linear/assets → materiais/suica}/sons/subida.mp3 +0 -0
  3728. /package/{kits/saas-linear/assets → materiais/suica}/sons/swoosh.mp3 +0 -0
  3729. /package/{kits/saas-linear/assets → materiais/suica}/sons/whoosh-entra.mp3 +0 -0
  3730. /package/{kits/saas-linear/assets → materiais/suica}/sons/whoosh-sai.mp3 +0 -0
  3731. /package/{kits/suica/assets → materiais/suica}/trilha/frio-120bpm.mp3 +0 -0
  3732. /package/{kits/synthwave/elementos → materiais/synthwave/camera}/Camera.tsx +0 -0
  3733. /package/{kits/synthwave/assets → materiais/synthwave}/fontes/OFL-Orbitron.txt +0 -0
  3734. /package/{kits/synthwave/assets → materiais/synthwave}/fontes/OFL-Rajdhani.txt +0 -0
  3735. /package/{kits/synthwave/assets → materiais/synthwave}/fontes/orbitron.woff2 +0 -0
  3736. /package/{kits/synthwave/assets → materiais/synthwave}/fontes/rajdhani.woff2 +0 -0
  3737. /package/{kits/suica/assets → materiais/synthwave}/sons/assinatura.mp3 +0 -0
  3738. /package/{kits/suica/assets → materiais/synthwave}/sons/clique.mp3 +0 -0
  3739. /package/{kits/suica/assets → materiais/synthwave}/sons/impacto.mp3 +0 -0
  3740. /package/{kits/suica/assets → materiais/synthwave}/sons/pop-cartao.mp3 +0 -0
  3741. /package/{kits/suica/assets → materiais/synthwave}/sons/pop-palavra.mp3 +0 -0
  3742. /package/{kits/suica/assets → materiais/synthwave}/sons/subida.mp3 +0 -0
  3743. /package/{kits/suica/assets → materiais/synthwave}/sons/swoosh.mp3 +0 -0
  3744. /package/{kits/suica/assets → materiais/synthwave}/sons/whoosh-entra.mp3 +0 -0
  3745. /package/{kits/suica/assets → materiais/synthwave}/sons/whoosh-sai.mp3 +0 -0
  3746. /package/{kits/synthwave/assets → materiais/synthwave}/trilha/noite-110bpm.mp3 +0 -0
  3747. /package/{kits/terminal/assets → materiais/terminal}/fontes/OFL-jetbrains-mono-700.txt +0 -0
  3748. /package/{kits/terminal/assets → materiais/terminal}/fontes/OFL-vt323.txt +0 -0
  3749. /package/{kits/terminal/assets → materiais/terminal}/fontes/jetbrains-mono-700.woff2 +0 -0
  3750. /package/{kits/terminal/assets → materiais/terminal}/fontes/vt323.woff2 +0 -0
  3751. /package/{kits/terminal/assets → materiais/terminal}/sons/assinatura.mp3 +0 -0
  3752. /package/{kits/terminal/assets → materiais/terminal}/sons/clique.mp3 +0 -0
  3753. /package/{kits/terminal/assets → materiais/terminal}/sons/digitar.mp3 +0 -0
  3754. /package/{kits/terminal/assets → materiais/terminal}/sons/impacto.mp3 +0 -0
  3755. /package/{kits/terminal/assets → materiais/terminal}/sons/liga-crt.mp3 +0 -0
  3756. /package/{kits/terminal/assets → materiais/terminal}/sons/pop-cartao.mp3 +0 -0
  3757. /package/{kits/terminal/assets → materiais/terminal}/sons/pop-palavra.mp3 +0 -0
  3758. /package/{kits/terminal/assets → materiais/terminal}/sons/subida.mp3 +0 -0
  3759. /package/{kits/terminal/assets → materiais/terminal}/sons/swoosh.mp3 +0 -0
  3760. /package/{kits/terminal/assets → materiais/terminal}/sons/tick.mp3 +0 -0
  3761. /package/{kits/terminal/assets → materiais/terminal}/sons/whoosh-entra.mp3 +0 -0
  3762. /package/{kits/terminal/assets → materiais/terminal}/sons/whoosh-sai.mp3 +0 -0
  3763. /package/{kits/terminal/assets → materiais/terminal}/trilha/trilha.mp3 +0 -0
  3764. /package/{kits/tiktok-energia/elementos → materiais/tiktok-energia/camera}/Camera.tsx +0 -0
  3765. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/OFL-Anton.txt +0 -0
  3766. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/OFL-Rubik.txt +0 -0
  3767. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/anton-latin.woff2 +0 -0
  3768. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/fontes/rubik-latin.woff2 +0 -0
  3769. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/assinatura.mp3 +0 -0
  3770. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/corte.mp3 +0 -0
  3771. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/palavra.mp3 +0 -0
  3772. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/pop.mp3 +0 -0
  3773. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/soco.mp3 +0 -0
  3774. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/subida.mp3 +0 -0
  3775. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/whoosh.mp3 +0 -0
  3776. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/sons/zap.mp3 +0 -0
  3777. /package/{kits/tiktok-energia/assets → materiais/tiktok-energia}/trilha/tech-128bpm.mp3 +0 -0
  3778. /package/{kits/tunel/elementos → materiais/tunel/camera}/Camera.tsx +0 -0
  3779. /package/{kits/tunel/assets → materiais/tunel}/fontes/OFL-ChakraPetch.txt +0 -0
  3780. /package/{kits/tunel/assets → materiais/tunel}/fontes/OFL-Syncopate.txt +0 -0
  3781. /package/{kits/tunel/assets → materiais/tunel}/fontes/chakra-latin.woff2 +0 -0
  3782. /package/{kits/tunel/assets → materiais/tunel}/fontes/syncopate-latin.woff2 +0 -0
  3783. /package/{kits/tunel/assets → materiais/tunel}/sons/assinatura.mp3 +0 -0
  3784. /package/{kits/tunel/assets → materiais/tunel}/sons/clique.mp3 +0 -0
  3785. /package/{kits/tunel/assets → materiais/tunel}/sons/impacto.mp3 +0 -0
  3786. /package/{kits/tunel/assets → materiais/tunel}/sons/passa.mp3 +0 -0
  3787. /package/{kits/tunel/assets → materiais/tunel}/sons/subida.mp3 +0 -0
  3788. /package/{kits/tunel/assets → materiais/tunel}/sons/tick.mp3 +0 -0
  3789. /package/{kits/tunel/assets → materiais/tunel}/sons/varre.mp3 +0 -0
  3790. /package/{kits/tunel/assets → materiais/tunel}/sons/whoosh.mp3 +0 -0
  3791. /package/{kits/tunel/assets → materiais/tunel}/trilha/tech-128bpm.mp3 +0 -0
  3792. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/OFL-JetBrainsMono.txt +0 -0
  3793. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/OFL-PlusJakartaSans.txt +0 -0
  3794. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/jakarta.woff2 +0 -0
  3795. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/fontes/jbmono.woff2 +0 -0
  3796. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/assinatura.mp3 +0 -0
  3797. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/clique.mp3 +0 -0
  3798. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/digitar.mp3 +0 -0
  3799. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/impacto.mp3 +0 -0
  3800. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/pop-cartao.mp3 +0 -0
  3801. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/pop-palavra.mp3 +0 -0
  3802. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/subida.mp3 +0 -0
  3803. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/sucesso.mp3 +0 -0
  3804. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/swoosh.mp3 +0 -0
  3805. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/whoosh-entra.mp3 +0 -0
  3806. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/sons/whoosh-sai.mp3 +0 -0
  3807. /package/{kits/tutorial-tela/assets → materiais/tutorial-tela}/trilha/passo-108bpm.mp3 +0 -0
  3808. /package/{kits/ugc-reels/elementos → materiais/ugc-reels/camera}/Camera.tsx +0 -0
  3809. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/OFL-Caveat.txt +0 -0
  3810. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/OFL-Montserrat.txt +0 -0
  3811. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/caveat-latin.woff2 +0 -0
  3812. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/fontes/montserrat-latin.woff2 +0 -0
  3813. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/assinatura.mp3 +0 -0
  3814. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/corte.mp3 +0 -0
  3815. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/impacto.mp3 +0 -0
  3816. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/notificacao.mp3 +0 -0
  3817. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/palavra.mp3 +0 -0
  3818. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/pop.mp3 +0 -0
  3819. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/toque.mp3 +0 -0
  3820. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/sons/whoosh.mp3 +0 -0
  3821. /package/{kits/ugc-reels/assets → materiais/ugc-reels}/trilha/pop-120bpm.mp3 +0 -0
  3822. /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/OFL-Inter.txt +0 -0
  3823. /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/OFL-JetBrains-Mono.txt +0 -0
  3824. /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/inter.woff2 +0 -0
  3825. /package/{kits/vercel-mono/assets → materiais/vercel-mono}/fontes/jetbrains-mono.woff2 +0 -0
  3826. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/assinatura.mp3 +0 -0
  3827. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/clique.mp3 +0 -0
  3828. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/impacto.mp3 +0 -0
  3829. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/pop-cartao.mp3 +0 -0
  3830. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/pop-palavra.mp3 +0 -0
  3831. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/subida.mp3 +0 -0
  3832. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/swoosh.mp3 +0 -0
  3833. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/whoosh-entra.mp3 +0 -0
  3834. /package/{kits/synthwave/assets → materiais/vercel-mono}/sons/whoosh-sai.mp3 +0 -0
  3835. /package/{kits/vercel-mono/assets → materiais/vercel-mono}/trilha/trilha.mp3 +0 -0
  3836. /package/{kits/vhs-90/elementos → materiais/vhs-90/camera}/Camera.tsx +0 -0
  3837. /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/OFL-BebasNeue.txt +0 -0
  3838. /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/OFL-VT323.txt +0 -0
  3839. /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/bebas.woff2 +0 -0
  3840. /package/{kits/vhs-90/assets → materiais/vhs-90}/fontes/vt323.woff2 +0 -0
  3841. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/assinatura.mp3 +0 -0
  3842. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/clique.mp3 +0 -0
  3843. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/impacto.mp3 +0 -0
  3844. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/pop-cartao.mp3 +0 -0
  3845. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/pop-palavra.mp3 +0 -0
  3846. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/subida.mp3 +0 -0
  3847. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/swoosh.mp3 +0 -0
  3848. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/whoosh-entra.mp3 +0 -0
  3849. /package/{kits/vhs-90/assets → materiais/vhs-90}/sons/whoosh-sai.mp3 +0 -0
  3850. /package/{kits/vhs-90/assets → materiais/vhs-90}/trilha/fita-88bpm.mp3 +0 -0
  3851. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/OFL-DM-Mono.txt +0 -0
  3852. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/OFL-Inter.txt +0 -0
  3853. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/dm-mono.woff2 +0 -0
  3854. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/fontes/inter.woff2 +0 -0
  3855. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/assinatura.mp3 +0 -0
  3856. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/clique.mp3 +0 -0
  3857. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/impacto.mp3 +0 -0
  3858. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/pop-cartao.mp3 +0 -0
  3859. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/pop-palavra.mp3 +0 -0
  3860. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/subida.mp3 +0 -0
  3861. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/swoosh.mp3 +0 -0
  3862. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/whoosh-entra.mp3 +0 -0
  3863. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/sons/whoosh-sai.mp3 +0 -0
  3864. /package/{kits/vidro-ios/assets → materiais/vidro-ios}/trilha/trilha.mp3 +0 -0
  3865. /package/{kits/y2k-cromado/elementos → materiais/y2k-cromado/camera}/Camera.tsx +0 -0
  3866. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/OFL-DMMono.txt +0 -0
  3867. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/OFL-Unbounded.txt +0 -0
  3868. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/dm-mono.woff2 +0 -0
  3869. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/fontes/unbounded.woff2 +0 -0
  3870. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/assinatura.mp3 +0 -0
  3871. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/clique.mp3 +0 -0
  3872. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/impacto.mp3 +0 -0
  3873. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/pop-cartao.mp3 +0 -0
  3874. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/pop-palavra.mp3 +0 -0
  3875. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/subida.mp3 +0 -0
  3876. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/swoosh.mp3 +0 -0
  3877. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/whoosh-entra.mp3 +0 -0
  3878. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/sons/whoosh-sai.mp3 +0 -0
  3879. /package/{kits/y2k-cromado/assets → materiais/y2k-cromado}/trilha/y2k-128bpm.mp3 +0 -0
@@ -0,0 +1,4179 @@
1
+ /**
2
+ * PrimoCode CLI
3
+ * Modos: primocode (agente completo, PADRÃO) · chat (conversa pura)
4
+ * Cada sessão trabalha dentro de uma pasta de projeto em ~/primocode/.
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const readline = require('readline');
10
+ const path = require('path');
11
+ const fs = require('fs');
12
+ const os = require('os');
13
+
14
+ const pkg = require('../../package.json');
15
+ const ui = require('../tui/ui');
16
+ const entrada = require('../tui/entrada');
17
+ const { c, welcomeBox, Spinner } = ui;
18
+ const { escolherModo } = require('../modo.js');
19
+ const api = require('../provider/api');
20
+ const tools = require('../tool/tools');
21
+ const cfg = require('../config/config');
22
+ const nomeProjeto = require('../nome-projeto');
23
+ const { nomeCurto } = require('../nome-curto');
24
+ const provedorLocal = require('../provider/local/provedor');
25
+ const { runAct, interromper, ehTetoDeToken, ehTransitorio, esperaDoErro, mandarDuranteATarefa, sobrasDaCaixa } = require('../session/runner/act');
26
+ const fala = require('../fala');
27
+ const boasVindas = require('./boas-vindas');
28
+ const pasta = require('../pasta');
29
+ const outraPasta = require('../outra-pasta');
30
+ const agentsMd = require('../agents-md');
31
+ const catalogo = require('../skill/catalogo');
32
+ const effort = require('../effort');
33
+ const memoria = require('../session/memoria-conversa');
34
+ const registro = require('../registro');
35
+ const permissao = require('../permission/permissao');
36
+ const perigo = require('../permission/perigo');
37
+ const skills = require('../skill/skills');
38
+ const checkpoint = require('../session/checkpoint');
39
+ const comandosLib = require('./comandos');
40
+ const nomes = require('../nomes');
41
+ const marketplace = require('../skill/marketplace');
42
+ const portaoSkill = require('../skill/portao-skill');
43
+ const vozModo = require('../plugin/voz');
44
+ const conta = require('../config/conta');
45
+ const planosTela = require('../planos.js');
46
+ const nuvem = require('../nuvem');
47
+ const retomar = require('../session/retomar');
48
+ const compat = require('../compatibilidade');
49
+ const mencoesLib = require('../mencoes');
50
+ const extra = require('./comandos-extra');
51
+ const offline = require('../offline');
52
+ const conferirLib = require('../conferir');
53
+
54
+ /* O /custo: toda conversa com o modelo passa pelo lib/provider/api.js, e o contador
55
+ embrulha as funções dele uma vez, aqui. Quem atende é o provedor do /api
56
+ quando há um, senão o servidor — é por eles que o /usage separa. */
57
+ const contadorDaSessao = extra.novoContador();
58
+ extra.instalarContador(api, contadorDaSessao, () => {
59
+ const p = provedorLocal.atual();
60
+ return p ? p.nome : 'Servidor PrimoCode';
61
+ });
62
+ const tempos = require('../tempos');
63
+
64
+ // Rede de segurança de último recurso: sem isto, uma exceção fora de um
65
+ // try/catch (ex.: dentro de um callback de socket, como o parser de SSE) não
66
+ // era pega por ninguém e derrubava o processo INTEIRO em silêncio — o usuário
67
+ // via a resposta parar no meio e cair de volta pro shell, sem mensagem
68
+ // nenhuma. Agora vira um erro visível, e o processo continua de pé.
69
+ process.on('uncaughtException', (e) => {
70
+ fala.problema(e);
71
+ });
72
+ /* O Node sai com 0 quando o laço de eventos esvazia — e uma promessa que
73
+ nunca resolve, sem timer nem socket vivo, faz exatamente isso: o pedido
74
+ "termina" calado no meio (visto no vídeo de escopo fechado, 01/10). Com
75
+ tarefa em andamento, sair assim é bug: diz, e sai com erro. */
76
+ process.on('beforeExit', () => {
77
+ if (global.__primocodeTarefa) {
78
+ process.stderr.write(`\n ⚠ o PrimoCode ia sair no meio da tarefa (${global.__primocodeTarefa}). Diga "continua" para retomar.\n`);
79
+ process.exitCode = 3;
80
+ global.__primocodeTarefa = null;
81
+ }
82
+ });
83
+ process.on('unhandledRejection', (e) => {
84
+ fala.problema(e instanceof Error ? e : new Error(String(e)));
85
+ });
86
+
87
+ // A pasta de onde o comando foi dado. Não é mais onde ele trabalha (o padrão é
88
+ // ~/primocode), mas continua servindo de ponto de partida para achar pasta que
89
+ // o usuário mencionar por nome relativo.
90
+ const CWD_INICIAL = process.cwd();
91
+
92
+ const VERSION = pkg.version;
93
+
94
+ const state = {
95
+ config: cfg.loadConfig(),
96
+ history: [],
97
+ passosProntos: null, // os passos que a pessoa aprovou no /plan: o próximo enviarPedido usa em vez de dividir
98
+ resumindo: null, // o resumo da última rodada, sendo feito em segundo plano
99
+ mode: null, // 'primocode' | 'chat' | 'auto' — vem da config em main()
100
+ modoEfetivo: null, // no auto, o modo que o último pedido usou de fato
101
+ attachedFiles: [],
102
+ // O resumo incremental da conversa — um /compact automático. O porquê
103
+ // está em lib/session/memoria-conversa.js.
104
+ memoria: memoria.nova(),
105
+ // O histórico que o app desktop e o celular enxergam. Cifrado antes de
106
+ // sair daqui; o porquê de cada peça está em lib/nuvem.js.
107
+ gravador: nuvem.gravador({
108
+ // título de 2 a 5 palavras escrito pelo modelo, depois da primeira resposta (lib/session/titulo-conversa.js)
109
+ batizar: (pedido, resposta) => require('../session/titulo-conversa.js').escolher({ pedido, resposta, perguntar: perguntarNome }),
110
+ }),
111
+ /* Começa LIBERADO e a abertura decide depois. Começar bloqueado deixaria
112
+ um instante em que a pessoa digita e leva "sem acesso" antes de o
113
+ plano ter sido conferido — e num pipe, onde a abertura nem roda, o
114
+ bloqueio ficaria para sempre. */
115
+ liberado: true,
116
+ motivoBloqueio: null,
117
+ lastResponse: '',
118
+ trabalhando: false, // o agente está no meio de um pedido (a barra muda)
119
+ /* A autorização para mexer no computador. Vale pela SESSÃO e morre com
120
+ ela: não há arquivo de "sempre permitir" de propósito — autorização
121
+ permanente é exatamente a que ninguém lembra de ter dado. */
122
+ controle: permissao.novo(),
123
+ currentProject: null,
124
+ workDir: null, // pasta onde o agente trabalha nesta sessão
125
+ workDirOrigem: null, // 'padrao' | '/dir' | 'detectada' | 'projeto' | 'terminal' (o -p) — para o /dir explicar
126
+ };
127
+
128
+ /* O /help: os comandos nos 9 grupos de lib/nomes.js, cada um com a descrição
129
+ que o menu já tem (SLASH_COMANDOS + os .md da pessoa e de fábrica). É função
130
+ porque SLASH_COMANDOS nasce depois deste ponto do arquivo. */
131
+ function linhasDosGrupos() {
132
+ const desc = new Map(comandosDoMenu().map(([n, d]) => [n.slice(1), d]));
133
+ const saida = [];
134
+ for (const g of nomes.agrupados()) {
135
+ saida.push(c.bold(g.titulo));
136
+ for (const n of g.comandos) {
137
+ const d = desc.get(n);
138
+ saida.push(d ? ` ${c.brand(ui.padRight('/' + n, 16))}${c.muted(d)}` : ` ${c.brand('/' + n)}`);
139
+ }
140
+ saida.push('');
141
+ }
142
+ return saida;
143
+ }
144
+
145
+ function montarHelp() {
146
+ return `
147
+ ${c.bold('Comandos')} ${c.dim('· os nomes em português continuam valendo (/desfazer = /undo)')}
148
+
149
+ ${linhasDosGrupos().join('\n')}
150
+ ${c.brand('-p')} "pedido" modo script: sem tela, aceita stdin e --output-format json
151
+
152
+ ${c.bold('Modos')}
153
+ ${c.warn('Primo Code')} ${c.muted('Agente completo — cria arquivos, roda comandos, abre o navegador')}
154
+ ${c.brandDim('Chat')} ${c.muted('Conversa pura — sem tools, só diálogo. Gasta bem menos token')}
155
+ ${c.brand('Auto')} ${c.muted('Escolhe por pedido: conversa vai pro chat, tarefa vai pro agente')}
156
+
157
+ ${c.bold('Onde ele trabalha')}
158
+ ${c.muted('Sempre em')} ${c.warn('~/primocode')}${c.muted(', não importa de onde você abriu o PrimoCode.')}
159
+ ${c.muted('Para outra pasta, dois caminhos:')}
160
+ ${c.muted(' ·')} ${c.brand('/dir <caminho>')} ${c.muted('aponta para qualquer pasta sua')}
161
+ ${c.muted(' ·')} ${c.muted('falar o nome dela no pedido — ele procura no seu computador')}
162
+ ${c.dim('Pasta de projeto nova só nasce quando ele vai mexer em arquivo.')}
163
+ `;
164
+ }
165
+
166
+ // ── Autopreenchimento dos comandos (estilo Claude Code) ────────────────
167
+ // Metade do comando já serve: Tab completa, e um prefixo único executa
168
+ // direto — "/eff" vira "/effort" sozinho. A lista é só a dos nomes
169
+ // canônicos; os apelidos (/cd, /stream…) continuam valendo por extenso.
170
+ const SLASH_COMANDOS = [
171
+ ['/help', 'todos os comandos · /help all: tudo que ele sabe fazer'],
172
+ ['/projects', 'seus projetos, do mais recente · /projects 2 entra · /projects <nome> cria'],
173
+ ['/new', 'projeto novo do zero: /new site da padaria · sem nada: 3 perguntas pra quem nunca programou'],
174
+ ['/dir', 'trabalhar numa pasta sua'],
175
+ ['/worktree', 'cria ../<repo>-<nome> numa branch nova e entra'],
176
+ ['/resume', 'retoma uma conversa salva (sem número, lista)'],
177
+ ['/sandbox', 'isola os comandos do agente: on | off | rede on | off | status'],
178
+ ['/mode', 'primocode | chat | auto'],
179
+ ['/effort', 'esforço: low → ultracode (←/→ para ajustar)'],
180
+ ['/perms', 'auto | perguntar | livre | plano — quando ele pede licença'],
181
+ ['/memory', 'o que ele lembra de você · esquecer <nome> · pasta'],
182
+ ['/taste', 'o seu gosto de motion e pra onde ele inclina (refazer, apagar, tirar N) · /taste referencias: ensina com vídeos que você curtiu'],
183
+ ['/compact', 'resume a conversa e devolve o contexto'],
184
+ ['/init', 'estuda o projeto e escreve o PRIMO.md (as instruções dele)'],
185
+ ['/attach', 'anexa um arquivo ou uma página (/attach <url>) · sem nada, lista · /detach tira'],
186
+ ['/detach', 'remove os anexos'],
187
+ ['/undo', 'desfaz o que o último pedido mudou nos arquivos (lista · N · out)'],
188
+ ['/redo', 'volta o que o último /undo desfez'],
189
+ ['/check', 'testa o projeto e diz se funcionou (/conferir e /testar ainda valem)'],
190
+ ['/restore', 'volta pro último ponto que o /check marcou como funcionando'],
191
+ ['/show', 'abre o app no celular de alguém no mesmo Wi-Fi, sem publicar'],
192
+ ['/howto', 'escreve no PRIMO.md como abrir e testar este projeto'],
193
+ ['/save', 'guarda o projeto no GitHub (privado) e mostra o link · também vale /guardar'],
194
+ ['/secrets', 'as chaves que o projeto usa (só os nomes) · /secrets add NOME guarda uma, escondida, no .env · também vale /segredos'],
195
+ ['/testar-app', 'sobe o app, abre, clica nos fluxos e conserta os erros (até 2 rodadas)'],
196
+ ['/pesquisar', 'relatório com fontes: /pesquisar <tema> grava em pesquisas/'],
197
+ ['/placar', 'qual modelo grátis acerta mais em cada tipo de tarefa, aprendido aqui · /placar zerar apaga'],
198
+ ['/schedule', 'um pedido que roda sozinho: /schedule "toda segunda às 9h" <pedido> · sem nada, lista · /schedule off 1 tira · também vale /agendar'],
199
+ ['/lock', 'arquivos que o agente só pode ler · /lock login.js trava · /lock off login.js solta · sem nada, lista'],
200
+ ['/rule', 'uma regra que o PrimoCode segue sempre, mesmo depois de resumir a conversa'],
201
+ ['/port', 'o app não abre? diz qual porta responde e o endereço certo'],
202
+ ['/map', 'o que tem no projeto, em português, e o que está faltando · /map tree: as pastas'],
203
+ ['/explain', 'o que o último pedido mudou, em até 5 linhas · /explain commit: uma palavra · /explain projeto: o projeto todo'],
204
+ ['/review', 'revisa o que mudou em duas passadas: acha e depois confere cada achado · /review rápido: uma passada só'],
205
+ ['/plan', 'mostra 3 a 5 passos e só começa quando você aperta Enter (ou muda um passo) · /plan <pedido>'],
206
+ ['/changes', 'o que mudou no projeto, em português (arquivos e linhas)'],
207
+ ['/timeline', 'abre a história do projeto numa página'],
208
+ ['/read', 'mostra um arquivo'],
209
+ ['/run', 'roda um comando'],
210
+ ['/open', 'abre o projeto (sem nada), um arquivo ou um site no navegador'],
211
+ ['/export', 'salva a conversa num .md, sem chave nem senha'],
212
+ ['/copy', 'copia a última resposta'],
213
+ ['/videos', 'seus vídeos prontos (abrir n · pasta n)'],
214
+ ['/history', 'procura nos seus pedidos antigos: /history login'],
215
+ ['/login', 'entra na sua conta (abre o navegador) · /login senha: e-mail e senha aqui'],
216
+ ['/account', 'sua conta e o seu plano · /account plans: os planos e o link para assinar'],
217
+ ['/chats', 'suas conversas salvas, as mesmas do app e do celular'],
218
+ ['/logout', 'desconecta este computador da conta'],
219
+ ['!comando', 'roda direto no shell, sem passar pelo agente (o campo fica âmbar)'],
220
+ ['/voice', 'liga o Primo: clique nele e fale; ele faz e responde em voz alta, com a tela dele (robô, agenda, clima, música)'],
221
+ ['/voice painel', 'só o painel do Primo (ESC esconde)'],
222
+ ['/voice nome <Nome>', 'dá outro nome ao assistente (só o nome; o modo voz abre no clique)'],
223
+ ['/voice parar', 'desliga o modo voz e fecha o microfone'],
224
+ ['/skills', 'o que ele sabe fazer bem · /skills store: a loja · /skills add <arquivo>: instala'],
225
+ ['/commands', 'seus comandos: um .md vira /nome · /commands novo <nome>'],
226
+ ['/styles', 'os estilos de motion (kits): a lista e a galeria · /styles <estilo>: o preview dele'],
227
+ ['/team', 'trabalhar junto com o claude, codex, gemini, agy ou opencode: /team <nome> liga · /team off'],
228
+ ['/api', 'usa a SUA chave (Gemini, ChatGPT, Claude…) direto daqui, sem o limite do servidor'],
229
+ ['/offline', 'roda o servidor aqui no seu computador, com as chaves do Render'],
230
+ ['/doctor', 'confere se está tudo certo e diz como consertar · /doctor status: só o servidor'],
231
+ ['/usage', 'quanto você gastou (agora e hoje) e quando zera · /usage limite 100000 ensina o limite do seu plano'],
232
+ ['/tasks', 'o que roda em segundo plano · rodar <cmd> · abrir · parar <id>'],
233
+ ['/keys', 'as teclas que ajudam'],
234
+ ['/connectors', 'quem está atendendo os seus pedidos'],
235
+ ['/name', 'como ele te chama · /name voz <Nome>: o nome do assistente de voz'],
236
+ ['/brand', 'kit de marca: cores, fontes e logo'],
237
+ ['/mascot', 'galeria dos mascotes · escolha por nome ou número'],
238
+ ['/config', 'suas preferências'],
239
+ ['/clear', 'limpa a conversa'],
240
+ ['/cls', 'limpa a tela'],
241
+ ['/uninstall', 'remove o PrimoCode'],
242
+ ['/version', 'versão'],
243
+ ['/exit', 'sair'],
244
+ ];
245
+ // A CLI nova (lib/cli-nova.js): /estudio /agentes /piloto /avisos /buscar entram no menu e no autopreenchimento.
246
+ SLASH_COMANDOS.splice(Math.max(0, SLASH_COMANDOS.findIndex(([n]) => n === '/marca')), 0, ...require('../cli-nova.js').SLASH_NOVOS);
247
+
248
+ /* /api: a chave da própria pessoa — lib/cli/comando-api.js. */
249
+ const comandoApi = require('./comando-api.js').criar({ rl: () => rl, ask: (...a) => ask(...a), askSecret: (...a) => askSecret(...a) });
250
+
251
+ // ── /effort: o slider de esforço (estilo Claude Code) ──────────────────
252
+ // Régua com os níveis, o marcador ▲ embaixo do escolhido, "Faster" à
253
+ // esquerda e "Smarter" à direita. ←/→ move, Enter confirma, Esc cancela.
254
+
255
+ // O layout sai em texto PLANO, com as marcas de onde pintar. Assim os dois
256
+ // pintores (o normal e o do ultracode animado) desenham exatamente a mesma
257
+ // régua — sem duas contas de posição para manter em sincronia.
258
+
259
+ // Desenha, escuta as setas, e devolve o nome escolhido (ou null se cancelou).
260
+ function sliderEffort(atual) {
261
+ return new Promise((resolve) => {
262
+ if (!process.stdin.isTTY) { // sem terminal (pipe, CI) não há slider
263
+ console.log(c.muted(` Esforço atual: ${effort.normalizar(atual)}. Use /effort <${effort.NOMES.join('|')}>.`));
264
+ return resolve(null);
265
+ }
266
+ let idx = effort.indiceDe(atual);
267
+ const ALTURA = 9; // linhas que o desenho ocupa — para redesenhar por cima
268
+ let fase = 0;
269
+ let anima = null;
270
+
271
+ const pintar = (primeira) => {
272
+ // Na tela cheia o slider desenha no painel dela, acima da caixa.
273
+ if (rl && rl.cheia) return rl.painel(effort.desenharEffort(idx, fase));
274
+ if (!primeira) process.stdout.write(`\x1b[${ALTURA}A\r`);
275
+ process.stdout.write(effort.desenharEffort(idx, fase).split('\n').map((l) => '\x1b[2K' + l).join('\n') + '\n');
276
+ };
277
+
278
+ // O fundo do ultracode ondula; sair dele apaga a animação na hora, para
279
+ // não redesenhar sozinho um painel que já está parado.
280
+ const cuidarDaAnimacao = () => {
281
+ const ultra = effort.NOMES[idx] === 'ultracode';
282
+ if (ultra && !anima) {
283
+ anima = setInterval(() => { fase += 0.32; pintar(false); }, 90);
284
+ anima.unref();
285
+ } else if (!ultra && anima) {
286
+ clearInterval(anima); anima = null;
287
+ }
288
+ };
289
+
290
+ pintar(true);
291
+ cuidarDaAnimacao();
292
+
293
+ const aoTeclar = (ch, key) => {
294
+ if (!key) return;
295
+ if (key.name === 'right' || key.name === 'l') { idx = Math.min(effort.NOMES.length - 1, idx + 1); cuidarDaAnimacao(); pintar(false); return; }
296
+ if (key.name === 'left' || key.name === 'h') { idx = Math.max(0, idx - 1); cuidarDaAnimacao(); pintar(false); return; }
297
+ if (key.name === 'return' || key.name === 'enter') { encerrar(effort.NOMES[idx]); return; }
298
+ if (key.name === 'escape' || (key.ctrl && key.name === 'c')) { encerrar(null); return; }
299
+ };
300
+ const encerrar = (valor) => {
301
+ if (anima) { clearInterval(anima); anima = null; }
302
+ process.stdin.removeListener('keypress', aoTeclar);
303
+ sliderAtivo = false;
304
+ if (rl && rl.retomar) rl.retomar();
305
+ resolve(valor);
306
+ };
307
+ sliderAtivo = true;
308
+ // A caixa sai da frente e larga o teclado: dois desenhos no mesmo
309
+ // lugar, e as setas moveriam os dois ao mesmo tempo.
310
+ if (rl && rl.suspender) rl.suspender();
311
+ process.stdin.on('keypress', aoTeclar);
312
+ });
313
+ }
314
+
315
+ function aplicarEffort(nome) {
316
+ const nivel = effort.nivelDe(nome);
317
+ state.config.effort = nivel.nome;
318
+ state.config.model = nivel.model;
319
+ cfg.saveConfig({ effort: nivel.nome, model: nivel.model });
320
+ console.log(c.ok(`Esforço: ${nivel.nome}`) + c.muted(` ${nivel.resumo}`));
321
+ if (nivel.pesquisa) console.log(c.dim(' Pesquisa de referência ligada: ele consulta docs e exemplos antes de escrever.'));
322
+ refreshPrompt();
323
+ }
324
+
325
+ // Enquanto o slider está no ar, o fantasma do autocompletar não desenha.
326
+ let sliderAtivo = false;
327
+
328
+ /* Os comandos da pessoa (lib/cli/comandos.js), com o do projeto atual por cima.
329
+ A caixa de digitar pede a lista a cada tecla para desenhar o fantasma; um
330
+ cache de dois segundos poupa ler três pastas por letra digitada, e ainda
331
+ pega na hora um arquivo que a pessoa acabou de salvar. */
332
+ let cacheComandos = { em: 0, dir: null, lista: [] };
333
+ function comandosDaPessoa() {
334
+ const agora = Date.now();
335
+ if (agora - cacheComandos.em > 2000 || cacheComandos.dir !== state.workDir) {
336
+ let lista = [];
337
+ try { lista = comandosLib.carregar({ projectDir: state.workDir }); } catch { /* disco estranho não trava a caixa */ }
338
+ cacheComandos = { em: agora, dir: state.workDir, lista };
339
+ }
340
+ return cacheComandos.lista;
341
+ }
342
+
343
+ /* O menu e o fantasma enxergam os dois tipos. O embutido vem primeiro e,
344
+ com o mesmo nome, o da pessoa nem aparece: quem ganha é sempre o embutido. */
345
+ function comandosDoMenu() {
346
+ const embutidos = new Set(SLASH_COMANDOS.map(([n]) => n));
347
+ const deles = comandosDaPessoa()
348
+ .filter((x) => !embutidos.has('/' + x.nome))
349
+ .map((x) => ['/' + x.nome, x.descricao || `seu comando (${x.origem})`]);
350
+ return SLASH_COMANDOS.concat(deles);
351
+ }
352
+
353
+ function mostrarMenuSlash() {
354
+ // "/" sozinho mostra as 9 intenções, não a lista seca; o /help tem tudo, com descrição.
355
+ console.log('');
356
+ for (const g of nomes.agrupados()) {
357
+ console.log(` ${c.bold(ui.padRight(g.titulo, 19))}${c.brand(g.comandos.map((n) => '/' + n).join(' '))}`);
358
+ }
359
+ const dela = comandosDaPessoa().filter((x) => !nomes.COMANDOS[x.nome]);
360
+ if (dela.length) console.log(` ${c.bold(ui.padRight('Os seus', 19))}${c.brand(dela.map((x) => '/' + x.nome).join(' '))}`);
361
+ console.log(c.dim('\n /help explica cada um · Tab completa · metade do comando já serve: /eff vira /effort'));
362
+ console.log(c.dim(' Os nomes em português continuam valendo: /undo chama o /undo.'));
363
+ }
364
+
365
+ let rl = null;
366
+
367
+ /* ── A BARRA DE STATUS ───────────────────────────────────────────────────
368
+ * As duas linhas embaixo da caixa de digitar. Elas existem para responder,
369
+ * sem a pessoa perguntar, as coisas que ela erra quando não sabe:
370
+ *
371
+ * · EM QUE PASTA ele está mexendo — de longe o que mais confunde, porque
372
+ * o PrimoCode NÃO trabalha na pasta de onde você o abriu;
373
+ * · em que ramo do git, quando a pasta é um repositório: um agente que
374
+ * escreve arquivo no `main` sem ninguém perceber é o pior tipo de
375
+ * surpresa;
376
+ * · quanto da conversa já foi gasto, para o /compact chegar antes do teto;
377
+ * · qual o modo e qual o esforço, que mudam o que ele pode fazer.
378
+ *
379
+ * A segunda linha é a dos atalhos. Ela repete o que existe porque atalho que
380
+ * a pessoa não vê é atalho que não existe.
381
+ */
382
+
383
+ // `git rev-parse` a cada quadro seria um processo por tecla digitada. O ramo
384
+ // muda devagar; cinco segundos de atraso não confundem ninguém.
385
+ const ramoCache = new Map();
386
+ function ramoDoGit(dir) {
387
+ if (!dir) return '';
388
+ const guardado = ramoCache.get(dir);
389
+ if (guardado && Date.now() - guardado.quando < 5000) return guardado.ramo;
390
+ let ramo = '';
391
+ try {
392
+ ramo = require('child_process').execSync('git rev-parse --abbrev-ref HEAD', {
393
+ cwd: dir, stdio: ['ignore', 'pipe', 'ignore'], timeout: 1500,
394
+ }).toString().trim();
395
+ } catch { ramo = ''; }
396
+ ramoCache.set(dir, { quando: Date.now(), ramo });
397
+ return ramo;
398
+ }
399
+
400
+ /* O que a caixa mostra além do texto, no desenho do OpenCode: DENTRO do
401
+ painel, o modo e o esforço ("Auto · alto" — o "Build · Nemotron" de lá);
402
+ FORA, uma linha só, com a pasta e o ramo à esquerda e o contexto e os
403
+ atalhos à direita. A cor da barra do painel é a do modo. */
404
+ const COR_MODO = { auto: '\x1b[38;5;75m', primocode: '\x1b[38;5;216m', chat: '\x1b[38;5;45m' };
405
+ const NOME_MODO = { auto: 'Auto', primocode: 'Primo Code', chat: 'Chat' };
406
+
407
+ function barraDeStatus() {
408
+ const partes = [];
409
+
410
+ // A PASTA, e o ramo do git colado nela ("~/primocode/loja:main"), como
411
+ // o rodapé do OpenCode. Quem apontou com /dir para fora do ~/primocode
412
+ // precisa ver onde está.
413
+ const dir = state.workDir || process.cwd();
414
+ partes.push(c.brandDim(shortPath(dir)));
415
+ const ramo = ramoDoGit(dir);
416
+ if (ramo) partes.push(c.dim('⎇ ' + ramo));
417
+
418
+ if (state.attachedFiles.length) {
419
+ partes.push(c.muted(`+${state.attachedFiles.length} anexo${state.attachedFiles.length > 1 ? 's' : ''}`));
420
+ }
421
+
422
+ /* Enquanto o controle do computador está liberado, isso fica escrito na
423
+ barra. Uma autorização que some da vista é uma autorização que a pessoa
424
+ esquece que deu — e ela vale até o PrimoCode fechar. */
425
+ if (state.controle && state.controle.liberado) partes.push(c.warn('controle do pc'));
426
+
427
+ /* O que o agente deixou de pé (run_background). Servidor esquecido segura
428
+ a porta e gasta bateria: tem que estar à vista enquanto roda. */
429
+ const vivos = require('../fundo.js').listar().filter((t) => t.rodando);
430
+ if (vivos.length) {
431
+ const porta = vivos.length === 1 && vivos[0].url && (vivos[0].url.match(/:(\d+)/) || [])[1];
432
+ partes.push(c.ok('●') + ' ' + c.muted(porta ? `de pé :${porta}` : `${vivos.length} de pé`));
433
+ }
434
+
435
+ /* O CONTEXTO. Só aparece depois que há conversa: um "ctx 0%" na abertura
436
+ é ruído, e ruído que aparece sempre é o que a pessoa aprende a não
437
+ enxergar — inclusive quando marcar 90%. Âmbar a partir de 70% e
438
+ vermelho a partir de 100%, que é quando `/compact` deixa de ser
439
+ conselho e vira o que fazer. */
440
+ const direita = [];
441
+ const uso = memoria.usoDoContexto(state.memoria, state.history);
442
+ // Modelo que respondeu · contexto · tokens de hoje (os mesmos do /usage) — lib/cli/statusline.js.
443
+ const SL = require('./statusline.js');
444
+ direita.push(...SL.partes({ modelo: SL.modelo(), ctxPct: uso.pct, tokensHoje: SL.tokensDeHoje(), c }));
445
+ const aprovar = require('../cli-nova.js').praAprovar();
446
+ if (aprovar) direita.push(c.warn(`${aprovar} pra aprovar`));
447
+ direita.push(state.trabalhando && rl && rl.ocupado
448
+ ? c.warn('trabalhando') + c.dim(' · ') + c.white('esc esc') + c.dim(' para')
449
+ : c.white('tab') + c.dim(' modos ') + c.white('ctrl+p') + c.dim(' comandos'));
450
+
451
+ /* O modo DENTRO do painel. No auto, depois do primeiro pedido, ele diz
452
+ qual modo acabou respondendo — senão você nunca sabe quem respondeu. */
453
+ const cor = COR_MODO[state.mode] || COR_MODO.auto;
454
+ let modo = `${cor}${NOME_MODO[state.mode] || 'Auto'}${c.reset}`;
455
+ if (state.mode === 'auto' && state.modoEfetivo) {
456
+ modo += c.dim(' → ') + c.muted(NOME_MODO[state.modoEfetivo] || state.modoEfetivo);
457
+ }
458
+ modo += c.dim(' · ') + c.white(effort.normalizar(state.config.effort)) + ' ' + c.dim('PrimoCode');
459
+
460
+ return { modo, cor, esquerda: partes.join(c.dim(' · ')), direita: direita.join(c.dim(' ')) };
461
+ }
462
+
463
+ /* A barra da direita da tela cheia, como a do OpenCode: o contexto (quantos
464
+ tokens a conversa já ocupa e quanto isso é do teto), o modo e o esforço, e
465
+ no pé a pasta com o ramo e a versão. */
466
+ function barraLateral() {
467
+ const uso = memoria.usoDoContexto(state.memoria, state.history);
468
+ const dir = state.workDir || process.cwd();
469
+ const ramo = ramoDoGit(dir);
470
+ const m = state.mode === 'auto' && state.modoEfetivo ? state.modoEfetivo : state.mode;
471
+ const secoes = [
472
+ { titulo: 'Contexto', linhas: [
473
+ c.muted(`${uso.tokens.toLocaleString('pt-BR')} tokens`),
474
+ (uso.pct >= 100 ? c.err : uso.pct >= 70 ? c.warn : c.muted)(`${uso.pct}% usado`),
475
+ ] },
476
+ { titulo: 'Modo', linhas: [
477
+ `${COR_MODO[m] || COR_MODO.auto}${NOME_MODO[m] || m}${c.reset}` + c.muted(` · esforço ${effort.normalizar(state.config.effort)}`),
478
+ ] },
479
+ ];
480
+ if (state.attachedFiles.length) {
481
+ secoes.push({ titulo: 'Anexos', linhas: state.attachedFiles.map((f) => c.muted(path.basename(f.path))) });
482
+ }
483
+ if (state.controle && state.controle.liberado) secoes.push({ titulo: 'Controle do PC', linhas: [c.warn('liberado até fechar')] });
484
+ return {
485
+ secoes,
486
+ rodape: [
487
+ c.muted(shortPath(dir)) + (ramo ? c.white(':' + ramo) : ''),
488
+ c.brand('●') + ' ' + c.bold(c.white('Primo')) + c.white('Code') + ' ' + c.dim(VERSION),
489
+ ],
490
+ };
491
+ }
492
+
493
+ /* O Tab com a caixa vazia gira o modo, como o "tab agents" do OpenCode:
494
+ auto → primo code → chat → auto. A escolha fica salva, como a do /mode. */
495
+ function trocarModo() {
496
+ const ordem = ['auto', 'primocode', 'chat'];
497
+ const m = ordem[(ordem.indexOf(state.mode) + 1) % ordem.length];
498
+ state.mode = m;
499
+ state.modoEfetivo = null;
500
+ cfg.saveConfig({ mode: m });
501
+ refreshPrompt();
502
+ }
503
+
504
+ // A barra se redesenha sozinha a cada quadro; isto só pede um quadro novo.
505
+ function refreshPrompt() { if (rl) rl.prompt(); }
506
+
507
+ // Enquanto uma pergunta está no ar, a próxima linha digitada é a RESPOSTA dela
508
+ // — não um novo comando. Sem isso o "s" de confirmação virava prompt para a IA.
509
+ let pendingAsk = null;
510
+
511
+ /* ── O QUE A PESSOA ADIANTA ──────────────────────────────────────────────
512
+ * Enquanto a abertura corre — e ela demora, porque confere o plano no
513
+ * servidor — o que for digitado não é comando nem resposta ainda: a pergunta
514
+ * ainda não apareceu. Fica aqui.
515
+ *
516
+ * Sem isto, esse texto caía como PEDIDO no agente. Medido no pacote
517
+ * publicado: o "2" da escolha da IA virou pergunta no chat e o modelo
518
+ * respondeu "Oi! Como posso ajudar?".
519
+ *
520
+ * E guardar não bastava: preso na fila de comandos, ele nunca chegava à
521
+ * pergunta que veio depois. Por isso o `ask` olha aqui ANTES de esperar uma
522
+ * linha nova — quem digitou 2 antes de ver o menu escolheu a 2, e a escolha
523
+ * dela vale.
524
+ */
525
+ let segurando = false;
526
+ const adiantadas = [];
527
+
528
+ function ask(question) {
529
+ return new Promise((resolve) => {
530
+ if (rl) {
531
+ process.stdout.write(question);
532
+ if (adiantadas.length) { const a = adiantadas.shift(); process.stdout.write(a + '\n'); return resolve(a); }
533
+ pendingAsk = resolve;
534
+ return;
535
+ }
536
+ const tmp = readline.createInterface({ input: process.stdin, output: process.stdout });
537
+ tmp.question(question, (a) => { tmp.close(); resolve(a); });
538
+ });
539
+ }
540
+
541
+ /**
542
+ * Pergunta sem mostrar o que se digita — para a senha do /login.
543
+ *
544
+ * Com a caixa de digitar no ar, ela mesma oculta a próxima linha (ver
545
+ * `ocultarProxima` em lib/tui/entrada.js). Sem a caixa, o readline ecoa cada
546
+ * tecla pelo `_writeToOutput`; enquanto a pergunta está aberta, só a quebra
547
+ * de linha passa. Nos dois casos a resposta fica fora do histórico: senão a
548
+ * seta para cima devolveria a senha na tela.
549
+ */
550
+ function askSecret(question) {
551
+ if (!process.stdin.isTTY) return ask(question);
552
+ if (rl && typeof rl.ocultarProxima === 'function') {
553
+ return new Promise((resolve) => {
554
+ process.stdout.write(question);
555
+ rl.ocultarProxima();
556
+ pendingAsk = resolve;
557
+ });
558
+ }
559
+ return new Promise((resolve) => {
560
+ const alvo = rl || readline.createInterface({ input: process.stdin, output: process.stdout });
561
+ const original = alvo._writeToOutput;
562
+ process.stdout.write(question);
563
+ alvo._writeToOutput = function (texto) {
564
+ if (/[\r\n]/.test(texto)) original.call(alvo, '\n');
565
+ };
566
+ const fim = (resposta) => {
567
+ alvo._writeToOutput = original;
568
+ if (Array.isArray(alvo.history) && alvo.history[0] === resposta) alvo.history.shift();
569
+ if (!rl) alvo.close();
570
+ resolve(resposta);
571
+ };
572
+ if (rl) pendingAsk = fim;
573
+ else alvo.question('', fim);
574
+ });
575
+ }
576
+
577
+ async function confirm(question) {
578
+ const raw = await ask(`${c.brand('?')} ${question} ${c.muted('(S/n)')} `);
579
+ if (!process.stdin.isTTY) process.stdout.write('\n'); // pipe não ecoa o Enter
580
+ const a = raw.trim().toLowerCase();
581
+ return a === '' || a === 's' || a === 'sim' || a === 'y' || a === 'yes';
582
+ }
583
+
584
+ // ── Projetos ───────────────────────────────────────────────────────────
585
+
586
+ /* ── O NOME DO PROJETO ───────────────────────────────────────────────────
587
+ * O nome saía das cinco primeiras palavras depois de "crie um": "agora deixa o
588
+ * carro mais rápido" virava a pasta `agora-deixa-o-carro-mais`, e "oi primo,
589
+ * faz um site" virava `oi-primo-faz-um-site`. Agora o começo da frase
590
+ * (saudação, o nome dele, verbo de pedido, artigo) é pulado, o assunto vai até
591
+ * a primeira palavra que emenda outra ideia ("com", "que", "usando"…), e
592
+ * sobram até quatro palavras que dizem O QUE é: "jogo de carro", "site
593
+ * padaria", "loja roupas". */
594
+ const ABERTURA = new Set([
595
+ 'oi', 'ola', 'ei', 'hey', 'e', 'ai', 'primo', 'bom', 'boa', 'dia', 'tarde', 'noite', 'ok', 'beleza',
596
+ 'entao', 'agora', 'tipo', 'por', 'favor', 'pfv', 'pf', 'voce', 'vc', 'pode', 'poderia', 'consegue',
597
+ 'crie', 'cria', 'criar', 'faca', 'faz', 'fazer', 'monte', 'monta', 'montar', 'desenvolva', 'desenvolver',
598
+ 'construa', 'construir', 'gere', 'gera', 'gerar', 'programe', 'programa', 'escreva', 'escreve',
599
+ 'quero', 'queria', 'gostaria', 'preciso', 'precisamos', 'vamos', 'bora', 'me', 'pra', 'para', 'mim',
600
+ 'um', 'uma', 'uns', 'umas', 'o', 'a', 'os', 'as', 'de', 'novo', 'nova', 'outro', 'outra', 'projeto',
601
+ 'simples', 'pequeno', 'pequena', 'rapido', 'bonito', 'bonita',
602
+ // os verbos de CONTINUAR: sem eles, "agora deixa o carro…" virava nome
603
+ 'deixa', 'deixe', 'continua', 'continue', 'edita', 'edite', 'muda', 'mude', 'melhora', 'melhore',
604
+ 'adiciona', 'adicione', 'coloca', 'coloque', 'poe', 'bota', 'corrige', 'corrija', 'arruma', 'arrume',
605
+ 'ajusta', 'ajuste', 'abre', 'abra', 'termina', 'termine',
606
+ ]);
607
+ const EMENDA = new Set(['com', 'que', 'usando', 'onde', 'mas', 'porque', 'igual', 'como', 'sobre',
608
+ 'em', 'no', 'na', 'nos', 'nas', 'e', 'tipo', 'estilo', 'feito', 'utilizando', 'mais', 'menos']);
609
+ // Palavras que não dizem o que a coisa É — saem de qualquer posição.
610
+ const DE_ENCHER = new Set(['minha', 'meu', 'minhas', 'meus', 'nossa', 'nosso', 'para', 'pra', 'uma', 'um',
611
+ 'simples', 'bonito', 'bonita', 'pequeno', 'pequena', 'legal', 'rapido', 'rapida', 'basico', 'basica',
612
+ 'completo', 'completa', 'novo', 'nova']);
613
+
614
+ function semAcento(x) { return String(x || '').normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase(); }
615
+
616
+ function deriveProjectName(text) {
617
+ const palavras = String(text || '').split(/\s+/)
618
+ .map((w) => w.replace(/[^\wáéíóúâêôãõçÁÉÍÓÚÂÊÔÃÕÇ-]/gi, ''))
619
+ .filter(Boolean);
620
+ let i = 0;
621
+ while (i < palavras.length && ABERTURA.has(semAcento(palavras[i]))) i++;
622
+ const assunto = [];
623
+ for (; i < palavras.length && assunto.length < 6; i++) {
624
+ const w = semAcento(palavras[i]);
625
+ if (assunto.length && EMENDA.has(w)) break;
626
+ if (DE_ENCHER.has(w)) continue;
627
+ assunto.push(palavras[i]);
628
+ }
629
+ while (assunto.length && /^(de|do|da|dos|das)$/i.test(semAcento(assunto[assunto.length - 1]))) assunto.pop();
630
+ const nome = assunto.slice(0, 4).join(' ').trim();
631
+ return nome || 'projeto';
632
+ }
633
+
634
+ /* ── "CRIE UM…" DENTRO DE UM PROJETO ────────────────────────────────────
635
+ * Depois de entrar num projeto, TUDO ia para ele — até "crie um site de
636
+ * receitas" no meio do jogo de carro. E fora dele, qualquer "continua" virava
637
+ * projeto novo. A regra agora: dentro de um projeto, só um pedido que CLARAMENTE
638
+ * abre outra coisa sai dele — verbo de criar + "um/uma/outro/novo", assunto
639
+ * que não tem nada a ver com o projeto atual, e nenhuma referência a ele
640
+ * ("isso", "esse", "nele"). Todo o resto ("continua", "muda a cor", "agora
641
+ * põe fases") fica. */
642
+ const RE_PROJETO_NOVO = /\b(novo projeto|projeto novo|outro projeto|do zero|come[cç]a(r)? (um|uma|outro|outra))\b/;
643
+ /* "crie UM site…" e também "crie O SITE da barbearia": o artigo definido com
644
+ o tipo da coisa é projeto novo com nome (medido em 29/09: "crie o site
645
+ bench-barbearia" nasceu DENTRO do projeto que estava aberto). Se for o
646
+ mesmo assunto do projeto atual, a comparação de assunto em pedeProjetoNovo
647
+ segura como continuação. */
648
+ const RE_CRIAR_UM = /\b(crie|cria|criar|fa[cç]a|faz|fazer|monte|monta|montar|gere|gera|desenvolva|construa|programe|quero|preciso de)\s+(um|uma|outro|outra|novo|nova|(o|a)\s+(site|app|aplicativo|jogo|projeto|landing|pagina|sistema|loja|dashboard|painel))\b/;
649
+ const RE_REFERE_ATUAL = /\b(isso|isto|esse|essa|este|esta|nele|nela|dele|dela|no projeto|nesse|nessa|neste|nesta|continua|continue|edita|edite|muda|mude|melhora|melhore|adiciona|adicione|coloca|coloque|p[oõ]e|corrige|corrija|arruma|arrume|ajusta|ajuste)\b/;
650
+
651
+ /* "crie uma nova seção", "cria um botão", "faz uma tela de login": é um
652
+ PEDAÇO do projeto em que se está, não outro projeto. */
653
+ const RE_PEDACO = /\b(um|uma|outro|outra|novo|nova)\s+(nov[ao]\s+)?(secao|secoes|parte|botao|botoes|tela|aba|menu|rodape|cabecalho|formulario|fase|funcao|funcionalidade|campo|imagem|animacao|efeito|cor|fonte|pagina interna|area|bloco|card|modal|link)\b/;
654
+
655
+ function pedeProjetoNovo(texto) {
656
+ const t = semAcento(texto);
657
+ if (RE_PROJETO_NOVO.test(t)) return true;
658
+ if (!RE_CRIAR_UM.test(t) || RE_REFERE_ATUAL.test(t) || RE_PEDACO.test(t)) return false;
659
+ // Mesmo assunto do projeto atual ("crie uma fase nova pro jogo de carro")
660
+ // é continuação, não projeto novo.
661
+ const atual = new Set(cfg.tokensDoAssunto(state.currentProject || ''));
662
+ const pedido = cfg.tokensDoAssunto(deriveProjectName(texto));
663
+ return !pedido.some((x) => atual.has(x));
664
+ }
665
+
666
+ /* Pedido de mexer no computador da pessoa (abrir app, clicar, digitar,
667
+ mostrar o cursor). Serve só para mandar a dica das ferramentas desktop_*. */
668
+ const RE_COMPUTADOR = /\b(abr[ae]|abrir|clica|clique|clicar|digita|digite|digitar|mouse|cursor|teclado|meu computador|no (meu )?mac|na (minha )?tela|aplicativo|spotify|safari|finder|whatsapp|mensagens|m[úu]sica|configura[çc][õo]es|ajustes)\b/i;
669
+ function querComputador(texto) { return RE_COMPUTADOR.test(String(texto || '')); }
670
+
671
+ /* Pedido de VER o navegador ("abre o youtube", "entra no site x", "testa no
672
+ Chrome"). Sem isto as ferramentas browser_* rodam escondidas: pesquisar e
673
+ conferir não precisam abrir aba na tela da pessoa (02/10). */
674
+ const RE_NAVEGADOR = /\b(navegador|chrome|browser|edge|brave|aba|abas|youtube|gmail|instagram|facebook|linkedin|login|loga|logar|(abr[ae]|abrir|entr[ae]|entrar|acess[ae]|acessar|mostr[ae]|testa|testar)\b[^.?!]{0,25}\b(site|p[áa]gina|link|url|google|navegador))\b/i;
675
+ function querNavegador(texto) { return RE_NAVEGADOR.test(String(texto || '')); }
676
+
677
+ /* Guarda onde se está, para a próxima sessão continuar aqui. */
678
+ function entrarNoProjeto(dir, origem = 'projeto') {
679
+ state.workDir = dir;
680
+ state.currentProject = path.basename(dir);
681
+ state.workDirOrigem = origem;
682
+ cfg.lembrarProjeto(dir, origem);
683
+ }
684
+
685
+ // Pasta em que é seguro deixar um agente criar e editar arquivo. A home e a raiz
686
+ // do disco não contam — ninguém quer um agente soltando arquivo no meio de
687
+ // C:\Users\você. O ~/primocode ERA recusado aqui, de quando a pasta atual do
688
+ // terminal era adotada; hoje ele é o padrão, então recusá-lo não faz sentido.
689
+ function pastaSegura(dir) {
690
+ const home = os.homedir();
691
+ const resolved = path.resolve(dir);
692
+ if (resolved === path.resolve(home)) return false;
693
+ if (resolved === path.parse(resolved).root) return false;
694
+ return true;
695
+ }
696
+
697
+ // Escolhe onde trabalhar SEM criar nada.
698
+ //
699
+ // Três casos, nesta ordem:
700
+ // 1. pasta escolhida a dedo (/dir, ou detectada no pedido) — manda, sempre.
701
+ // 2. projeto que JÁ existe e parece com o pedido — entra nele agora, senão a
702
+ // memory.md dele não carrega neste turno.
703
+ // 3. projeto novo — fica PENDENTE: age em ~/primocode e só cria a pasta se o
704
+ // agente for mexer em arquivo. Pedir para abrir o Chrome não cria projeto.
705
+ // Pedido que se resolve DENTRO do estúdio: vídeo, slides, arte, documento,
706
+ // planilha, diagrama. O que sai dali já é guardado pelo próprio estúdio, em
707
+ // ~/.primocode/studio/arquivos — não precisa (e não deve) virar pasta de
708
+ // código em ~/primocode, cheia de memory.md sobre um vídeo.
709
+ const PEDIDO_DE_ESTUDIO = /\b(v[íi]deo|reels?|anima[çc][ãa]o|slides?|apresenta[çc][ãa]o|deck|post|banner|capa|thumbnail|arte|cartaz|planilha|documento|relat[óo]rio|diagrama|fluxograma|narra[çc][ãa]o|est[úu]dio)\b/i;
710
+ // ...a menos que ele também peça código ou página: aí é projeto de verdade.
711
+ const PEDIDO_DE_CODIGO = /\b(html|css|javascript|js|react|next|python|api|site|p[áa]gina|app|aplicativo|script|reposit[óo]rio|c[óo]digo|programa|servidor|banco de dados)\b/i;
712
+
713
+ function ehSoEstudio(texto) {
714
+ const t = String(texto || '');
715
+ return PEDIDO_DE_ESTUDIO.test(t) && !PEDIDO_DE_CODIGO.test(t);
716
+ }
717
+
718
+ function planWorkDir(userText) {
719
+ // O /novo já criou a pasta e entrou nela: nenhuma heurística decide outra.
720
+ if (state.projetoFixo) return { dir: state.workDir, pending: false, name: state.currentProject };
721
+ const escolhida = ['/dir', 'detectada', 'projeto', 'terminal'].includes(state.workDirOrigem);
722
+ // Pasta escolhida a dedo (/dir, ou dita no pedido) manda sempre. Projeto
723
+ // em andamento manda também — a menos que o pedido abra outra coisa.
724
+ if (escolhida && !(state.workDirOrigem === 'projeto' && pedeProjetoNovo(userText))) {
725
+ return { dir: state.workDir, pending: false, name: state.currentProject };
726
+ }
727
+ // "Quando eu peço um vídeo, não é pra ficar com projeto. Só vai criar
728
+ // projeto quando tiver um HTML, quando tiver um código."
729
+ if (ehSoEstudio(userText)) {
730
+ return { dir: cfg.ROOT_DIR, pending: false, name: state.currentProject, estudio: true };
731
+ }
732
+ const proposto = deriveProjectName(userText);
733
+ const parecido = cfg.findSimilarProject(proposto);
734
+ if (parecido) return { dir: parecido.dir, pending: false, name: parecido.name, similar: true };
735
+ return { dir: cfg.ROOT_DIR, projeto: cfg.getProjectDir(proposto), pending: true, name: proposto };
736
+ }
737
+
738
+ /* O nome da pasta nova vem do modelo (lib/nome-projeto.js), pedido em
739
+ paralelo com o trabalho: a pasta só nasce na primeira escrita, e até lá a
740
+ resposta já chegou. Só pergunta quando o pedido é de CRIAR algo — pedir
741
+ para abrir o Chrome não gasta chamada com nome de pasta. */
742
+ async function perguntarNome(texto) {
743
+ let resposta = '';
744
+ await api.requestChat(state.config.server, {
745
+ prompt: texto, history: [], model: state.config.model, token: state.config.token,
746
+ }, (evt) => { if (evt.delta) resposta += evt.delta; });
747
+ return resposta;
748
+ }
749
+
750
+ /* O corpo do /novo, num lugar só: o /comecar também cria a pasta e roda o
751
+ pedido preso nela, e dois caminhos copiados divergiriam. */
752
+ async function criarProjetoNovo(rest) {
753
+ const nomes = cfg.listProjects();
754
+ const sp = new Spinner('escolhendo o nome da pasta').start();
755
+ const sugerido = await nomeProjeto.escolher({ pedido: rest, nomes, perguntar: perguntarNome }).catch(() => null);
756
+ sp.stop();
757
+ const nomeNovo = extra.nomeDoNovo({
758
+ descricao: rest, nomes, sugerido, derivar: deriveProjectName,
759
+ // A régua curta (lib/nome-curto.js) também no /novo.
760
+ slugify: (t) => nomeCurto(t) || cfg.slugify(t), semColisao: nomeProjeto.semColisao,
761
+ });
762
+ const dir = cfg.createProjectDir(nomeNovo);
763
+ entrarNoProjeto(dir, 'projeto');
764
+ // Conversa nova junto: o que se falou do projeto anterior puxaria o
765
+ // agente de volta para ele.
766
+ state.history = []; state.memoria = memoria.nova(); state.gravador.zerar();
767
+ console.log(c.ok(` Projeto novo: ${state.currentProject}`) + c.muted(` (${shortPath(dir)})`));
768
+ refreshPrompt();
769
+ const modoAntes = state.mode;
770
+ state.mode = 'primocode';
771
+ state.projetoFixo = true;
772
+ try { await sendPrompt(extra.pedidoDoNovo(rest, state.currentProject)); }
773
+ finally { state.mode = modoAntes; state.projetoFixo = false; }
774
+ }
775
+
776
+ function batizarDepois(plan, userText) {
777
+ if (!plan.pending || !(RE_CRIAR_UM.test(semAcento(userText)) || PEDIDO_DE_CODIGO.test(userText))) return;
778
+ plan.batizando = nomeProjeto.escolher({ pedido: userText, nomes: cfg.listProjects(), perguntar: perguntarNome })
779
+ .then((nome) => { if (nome) plan.nomeEscolhido = nome; });
780
+ }
781
+
782
+ function createPendingProject(plan) {
783
+ const dir = cfg.createProjectDir(plan.nomeEscolhido || plan.name);
784
+ entrarNoProjeto(dir, 'projeto');
785
+ const rotulo = plan.similar ? 'Continuando em' : 'Projeto novo:';
786
+ console.log(c.ok(` ${rotulo} ${state.currentProject}`) + c.muted(` (${dir})`));
787
+ refreshPrompt();
788
+ return dir;
789
+ }
790
+
791
+ function projectDir() {
792
+ return state.workDir || process.cwd();
793
+ }
794
+
795
+ // ── Envio ──────────────────────────────────────────────────────────────
796
+
797
+ /**
798
+ * Falou de OUTRA pasta? Ele LÊ lá sem pedir, e só TROCA com o seu sim.
799
+ *
800
+ * "Quando eu perguntar de algo de outra pasta, ela vai procurar lá; e se ela
801
+ * está aberta numa pasta e eu trabalho em outra, ela muda — com permissão."
802
+ * A pasta citada (caminho, "pasta X", ou o nome de um projeto/pasta recente)
803
+ * fica liberada para leitura (lib/tool/tools.js). A troca pergunta, Enter é NÃO.
804
+ *
805
+ * Devolve a nota para o modelo quando a pessoa ficou onde estava — é ela que
806
+ * diz ao agente que pode procurar lá. Com mais de uma pasta do mesmo nome,
807
+ * lista e espera o /dir: heurística não escolhe onde o agente escreve.
808
+ */
809
+ async function talvezTrocarDePasta(userText) {
810
+ const r = outraPasta.detectar(userText, {
811
+ conhecidas: outraPasta.conhecidas({ raiz: cfg.ROOT_DIR, recentes: cfg.pastasRecentes() }),
812
+ atual: projectDir(),
813
+ resolver: (cand) => pasta.resolverPasta(cand, { raiz: cfg.ROOT_DIR, cwd: CWD_INICIAL }),
814
+ });
815
+ if (r.ambiguo) {
816
+ console.log(c.warn(` Achei ${r.ambiguo.length} pastas chamadas "${r.candidato}":`));
817
+ r.ambiguo.forEach((a) => console.log(` ${c.dim('·')} ${c.white(shortPath(a.caminho))}`));
818
+ console.log(c.dim(' Escolha com /dir <caminho>.'));
819
+ return '';
820
+ }
821
+ const alvo = (r.pastas || []).find((p) => pastaSegura(p.caminho));
822
+ if (!alvo) return ''; // home ou raiz: só por /dir explícito
823
+
824
+ /* Ler lá só se libera DEPOIS do sim (a troca): recusa não destrava nada. */
825
+
826
+ /* No pedido único (`primocode "crie x na pasta loja"`) não há a quem
827
+ perguntar — e a pasta veio escrita no próprio comando, com marca
828
+ ("pasta", caminho). Aí vale o que ele sempre fez: troca. Nome solto
829
+ ("olha o landing-padaria") nunca troca sem pergunta. */
830
+ if (state.semTerminal) {
831
+ if (alvo.como !== 'caminho') return '';
832
+ entrarNoProjeto(alvo.caminho, 'detectada');
833
+ return '';
834
+ }
835
+ console.log(c.dim(` ⎿ você citou ${shortPath(alvo.caminho)}`));
836
+ if (!(await perguntarTroca(alvo.caminho))) return '';
837
+ trocarPara(alvo.caminho, 'detectada', `você falou "${alvo.nome}"`);
838
+ return '';
839
+ }
840
+
841
+ /* A pergunta da troca. Enter sozinho é NÃO: trocar muda onde os arquivos
842
+ nascem, e o padrão de quem apertou Enter sem ler não pode ser esse. */
843
+ async function perguntarTroca(caminho, motivo = '') {
844
+ if (motivo) console.log(' ' + c.muted(motivo));
845
+ const dito = String(await ask(`${c.brand('?')} Trabalhar em ${c.white(shortPath(caminho))} a partir de agora? ${c.muted('(s/N)')} `))
846
+ .trim().toLowerCase().replace(/[.!?,;:…]+/g, ' ').trim();
847
+ if (!process.stdin.isTTY) process.stdout.write('\n');
848
+ return /^(s|sim|y|yes|pode|ok|claro|muda|troca)\b/.test(dito);
849
+ }
850
+
851
+ /* Entra na pasta e avisa. A memória dela (AGENTS.md) entra no próximo
852
+ pedido pelo buildMemoryContext, porque ainda não está no resumo. */
853
+ function trocarPara(caminho, origem, porque) {
854
+ entrarNoProjeto(caminho, origem);
855
+ const tem = agentsMd.ler(caminho) ? ' · com memória das sessões anteriores' : '';
856
+ console.log(c.ok(` Trabalhando em ${shortPath(caminho)}`) + c.dim(` (${porque}${tem})`));
857
+ refreshPrompt();
858
+ }
859
+
860
+ /* Servidor MCP do .mcp.json do PROJETO: roda comando na máquina, então pergunta
861
+ mesmo no auto (lib/mcp/mcp.js lembra o sim por projeto + configuração). */
862
+ require('../mcp/mcp.js').usarPerguntador(async ({ nome, resumo }) => {
863
+ if (state.semTerminal) return false;
864
+ console.log('');
865
+ console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white(`O .mcp.json deste projeto quer rodar o servidor "${nome}".`)));
866
+ console.log(' ' + c.dim(resumo.slice(0, 200)));
867
+ const dito = String(await ask(`${c.brand('?')} Deixar rodar? ${c.muted('(s/N)')} `)).trim().toLowerCase();
868
+ if (!process.stdin.isTTY) process.stdout.write('\n');
869
+ return /^(s|sim|y|yes)\b/.test(dito);
870
+ });
871
+
872
+ /* O mudar_pasta do modelo chega aqui (lib/outra-pasta.js → pedirTroca). */
873
+ async function mudarPastaPeloAgente({ caminho, motivo }) {
874
+ if (state.semTerminal) return { ok: false, error: 'sem terminal para o usuário responder.' };
875
+ console.log('');
876
+ console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white('O Primo quer trabalhar em outra pasta.')));
877
+ if (!(await perguntarTroca(caminho, motivo ? `Motivo: ${motivo}` : ''))) {
878
+ console.log(' ' + c.muted('Fica onde está.'));
879
+ return { ok: false };
880
+ }
881
+ trocarPara(caminho, 'detectada', 'você autorizou');
882
+ return { ok: true, caminho, memoria: agentsMd.ler(caminho) || undefined };
883
+ }
884
+
885
+ /**
886
+ * Decide, de uma vez, onde este pedido vai trabalhar.
887
+ *
888
+ * ESTA É A ÚNICA função que decide pasta. Existiam duas cópias — uma no
889
+ * sendPrompt e outra no modo um-tiro — e a do um-tiro ficou sem a detecção: pedir
890
+ * `primocode "crie x na pasta loja"` ignorava a pasta e criava projeto novo.
891
+ * Duas cópias da mesma decisão significam que uma delas está errada.
892
+ */
893
+ async function prepararPasta(userText) {
894
+ // A pasta é decidida ANTES de o agente começar. Trocar no meio faria as
895
+ // primeiras tools agirem num lugar e as seguintes em outro.
896
+ const notaOutraPasta = await talvezTrocarDePasta(userText);
897
+
898
+ const plan = planWorkDir(userText);
899
+ batizarDepois(plan, userText);
900
+
901
+ // Projeto que já existe: entra nele AGORA. Se deixasse para depois, o
902
+ // buildMemoryContext deste turno leria a pasta errada e a memória do projeto
903
+ // não carregaria.
904
+ if (!plan.pending && path.resolve(plan.dir) !== path.resolve(projectDir())) {
905
+ entrarNoProjeto(plan.dir, 'projeto');
906
+ console.log(c.ok(` Continuando em ${state.currentProject}`) + c.muted(` (${shortPath(plan.dir)})`));
907
+ refreshPrompt();
908
+ }
909
+ plan.notaOutraPasta = notaOutraPasta;
910
+ return plan;
911
+ }
912
+
913
+ /* ── O PEDIDO PARA MEXER NO COMPUTADOR ───────────────────────────────────
914
+ * Três respostas: agora, a sessão inteira, não.
915
+ *
916
+ * A do meio existe porque uma tarefa de desktop são dez, vinte ações. Pedir a
917
+ * cada clique transforma a permissão num botão que se aperta sem ler — o
918
+ * mesmo que não pedir, com uma etapa a mais. Uma vez, com o que ele vai fazer
919
+ * escrito, é a pergunta que ainda é lida.
920
+ *
921
+ * Enter sozinho é NÃO. O padrão de quem apertou Enter sem ler não pode ser
922
+ * entregar o mouse e o teclado.
923
+ */
924
+ async function autorizarControle(oQueVaiFazer, { primeira, tipo } = {}) {
925
+ /* O mesmo portão serve ao /permissoes (lib/permission/perigo.js): a pergunta muda de
926
+ cabeçalho, as três respostas são as mesmas. */
927
+ if (tipo) {
928
+ console.log('');
929
+ console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white(tipo === 'perigo'
930
+ ? 'Isto não tem volta. O Primo quer:'
931
+ : 'O Primo quer (você escolheu /perms perguntar):')));
932
+ } else if (primeira) {
933
+ console.log('');
934
+ console.log(' ' + c.warn('▸▸') + ' ' + c.bold(c.white('O Primo quer usar o seu computador.')));
935
+ console.log(' ' + c.muted('Ele vai mexer no mouse e no teclado de verdade, no programa que'));
936
+ console.log(' ' + c.muted('estiver na frente. Você vê cada passo aqui enquanto acontece.'));
937
+ }
938
+ console.log('');
939
+ console.log(' ' + c.brand('●') + ' ' + c.white(oQueVaiFazer));
940
+ console.log(' ' + c.dim('1') + c.muted(' agora ')
941
+ + c.dim('2') + c.muted(' esta sessão inteira ')
942
+ + c.dim('Enter') + c.muted(' não'));
943
+
944
+ // Sem pontuação: a resposta pode vir FALADA (/voice), e o Whisper devolve
945
+ // "Sim." e "Pode, sim." — que também são sim.
946
+ const dito = String(await ask(' ' + c.brand('❯ ') + c.muted('1, 2 ou Enter '))).trim().toLowerCase()
947
+ .replace(/[.!?,;:…]+/g, ' ').replace(/\s+/g, ' ').trim();
948
+ if (/sess|sempre|tudo|todas/.test(dito) && dito !== '1') {
949
+ console.log(' ' + c.ok('✔ autorizado') + c.dim(' — esta sessão inteira. Fechar o PrimoCode esquece.'));
950
+ return 'sessao';
951
+ }
952
+ if (dito === '1' || /^(s|sim|ok|pode|agora|y|yes|claro|vai)\b/.test(dito)) {
953
+ console.log(' ' + c.ok('✔ autorizado') + c.dim(' — só esta ação'));
954
+ return 'agora';
955
+ }
956
+ if (dito === '2' || /sess|sempre|tudo|todas/.test(dito)) {
957
+ console.log(' ' + c.ok('✔ autorizado') + c.dim(' — esta sessão inteira. Fechar o PrimoCode esquece.'));
958
+ return 'sessao';
959
+ }
960
+ console.log(' ' + c.muted('Não autorizado.') + c.dim(' Ele vai resolver por outro caminho.'));
961
+ return 'nao';
962
+ }
963
+
964
+ /* ── A TELA DO MARKETPLACE ───────────────────────────────────────────────
965
+ * O desenho e as teclas vivem em lib/skill/marketplace.js, que é função pura. O que
966
+ * mora aqui é o que precisa do terminal: tirar a caixa de digitar da frente,
967
+ * escutar as setas, e fazer o que a tela pediu (ligar uma skill, abrir o
968
+ * diálogo de criar).
969
+ *
970
+ * A divisão é a mesma do /effort, e pelo mesmo motivo: dois desenhos no mesmo
971
+ * lugar brigam pelo teclado e pelo cursor.
972
+ */
973
+ function abrirMarketplace() {
974
+ return new Promise((resolve) => {
975
+ if (!process.stdin.isTTY) {
976
+ // Sem terminal não há seta para apertar. Cair no /skills é melhor
977
+ // que desenhar uma tela que ninguém pode usar.
978
+ return handleSlash('/skills').then(resolve);
979
+ }
980
+
981
+ let estado = marketplace.novo(skills.listar());
982
+ const altura = () => Math.max(6, Math.min(16, (process.stdout.rows || 24) - 10));
983
+ let alturaDesenhada = 0;
984
+
985
+ const pintar = (primeira) => {
986
+ const texto = marketplace.montar(estado, {
987
+ colunas: process.stdout.columns || 80, altura: altura(),
988
+ });
989
+ if (rl && rl.cheia) return rl.painel(texto);
990
+ const linhas = texto.split('\n');
991
+ // Redesenha POR CIMA do quadro anterior em vez de rolar a tela:
992
+ // sem isso, cada seta empurraria a tela inteira para cima e o
993
+ // terminal viraria um rolo de cópias do marketplace.
994
+ if (!primeira && alturaDesenhada) process.stdout.write(`\x1b[${alturaDesenhada}A\r`);
995
+ process.stdout.write(linhas.map((l) => '\x1b[2K' + l).join('\n') + '\n');
996
+ // O quadro novo pode ser mais curto que o anterior (a descrição
997
+ // que some ao mudar de item): o resto é apagado, senão sobra
998
+ // lixo da linha antiga embaixo.
999
+ if (alturaDesenhada > linhas.length) {
1000
+ const sobra = alturaDesenhada - linhas.length;
1001
+ process.stdout.write('\x1b[2K\n'.repeat(sobra) + `\x1b[${sobra}A`);
1002
+ }
1003
+ alturaDesenhada = Math.max(linhas.length, alturaDesenhada);
1004
+ };
1005
+
1006
+ const aoTeclar = (ch, key) => {
1007
+ if (!key) return;
1008
+ const { estado: novoEstado, acao } = marketplace.andar(estado, key, { altura: altura() });
1009
+ estado = novoEstado;
1010
+
1011
+ if (!acao) { pintar(false); return; }
1012
+
1013
+ if (acao.tipo === 'fechar') { encerrar(); resolve(); return; }
1014
+
1015
+ if (acao.tipo === 'alternar') {
1016
+ skills.ligar(acao.skill.nome, !acao.skill.ligada);
1017
+ // A lista é relida do disco: a skill muda de seção, e a tela
1018
+ // tem de mostrar isso na hora — senão parece que nada
1019
+ // aconteceu e a pessoa aperta Enter de novo.
1020
+ estado = { ...estado, skills: skills.listar() };
1021
+ pintar(false);
1022
+ return;
1023
+ }
1024
+
1025
+ if (acao.tipo === 'nova' || acao.tipo === 'instalar') {
1026
+ encerrar();
1027
+ (acao.tipo === 'nova' ? criarSkill() : instalarSkill())
1028
+ .then(() => abrirMarketplace())
1029
+ .then(resolve);
1030
+ }
1031
+ };
1032
+
1033
+ /* Largar o teclado e devolver a caixa. Chamado por TODAS as saídas —
1034
+ o Esc, o "New Skill" e o "Instalar" —, porque o diálogo que vem
1035
+ depois usa o `ask`, e o `ask` precisa da caixa de volta. */
1036
+ const encerrar = () => {
1037
+ process.stdin.removeListener('keypress', aoTeclar);
1038
+ process.stdin.removeListener('end', aoAcabar);
1039
+ process.stdin.removeListener('close', aoAcabar);
1040
+ sliderAtivo = false;
1041
+ if (rl && rl.retomar) rl.retomar();
1042
+ };
1043
+
1044
+ /* A entrada pode acabar com a tela aberta (pipe que terminou, Ctrl+D,
1045
+ terminal fechado). Sem isto o programa ficaria esperando para
1046
+ sempre uma tecla que não vem mais — pendurado e calado, que é o
1047
+ pior jeito de travar. */
1048
+ const aoAcabar = () => { encerrar(); resolve(); };
1049
+ process.stdin.once('end', aoAcabar);
1050
+ process.stdin.once('close', aoAcabar);
1051
+
1052
+ sliderAtivo = true;
1053
+ if (rl && rl.suspender) rl.suspender();
1054
+ pintar(true);
1055
+ process.stdin.on('keypress', aoTeclar);
1056
+ });
1057
+ }
1058
+
1059
+ /* ── New Skill: o nome, e depois o prompt ────────────────────────────────
1060
+ * Em sequência, como foi pedido. O conteúdo é multilinha e termina numa linha
1061
+ * com apenas `.` — não em Enter: o prompt de uma skill tem parágrafos, e
1062
+ * terminar no primeiro Enter tornaria impossível escrever uma skill de
1063
+ * verdade sem colar tudo numa linha só.
1064
+ */
1065
+ async function criarSkill() {
1066
+ console.log('');
1067
+ console.log(' ' + c.bold(c.brand('New Skill')));
1068
+ console.log(' ' + c.muted('Uma skill é conhecimento em texto: o que o Primo deve saber'));
1069
+ console.log(' ' + c.muted('e seguir quando o assunto aparecer.'));
1070
+ console.log('');
1071
+
1072
+ const nome = String(await ask(' ' + c.brand('❯ ') + c.white('Nome da skill: '))).trim();
1073
+ if (!nome) { console.log(c.muted(' Sem nome, sem skill.')); return; }
1074
+
1075
+ console.log('');
1076
+ console.log(' ' + c.muted('Agora o conteúdo — o prompt inteiro dela.'));
1077
+ console.log(' ' + c.dim('Escreva quantas linhas quiser. Termine com um ponto sozinho numa linha.'));
1078
+ console.log('');
1079
+
1080
+ const linhas = [];
1081
+ for (;;) {
1082
+ const l = await ask(' ' + c.dim('│ '));
1083
+ if (String(l).trim() === '.') break;
1084
+ linhas.push(l);
1085
+ // Sem teto, um Enter preso na tecla viraria um arquivo de milhões de
1086
+ // linhas. 400 é muito mais do que qualquer skill precisa.
1087
+ if (linhas.length >= 400) { console.log(c.muted(' (chegou ao limite de linhas)')); break; }
1088
+ }
1089
+ const corpo = linhas.join('\n').trim();
1090
+ if (!corpo) { console.log(c.muted(' Sem conteúdo, sem skill.')); return; }
1091
+
1092
+ console.log('');
1093
+ const quando = String(await ask(' ' + c.brand('❯ ') + c.white('Quando usar? ')
1094
+ + c.dim('(palavras separadas por vírgula) '))).trim();
1095
+ const descricao = String(await ask(' ' + c.brand('❯ ') + c.white('Uma linha do que ela faz: '))).trim();
1096
+
1097
+ const r = skills.criar(nome, corpo, { quando, descricao });
1098
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); return; }
1099
+ console.log('');
1100
+ console.log(c.ok(` Skill cadastrada: ${r.nome}`) + c.muted(` (${shortPath(r.caminho)})`));
1101
+ if (!quando) {
1102
+ // Sem gatilho ela nunca entra sozinha num pedido. Dizer isso agora
1103
+ // evita a conclusão de que "a skill não funciona".
1104
+ console.log(c.warn(' Sem palavras em "quando usar", ela não vai entrar sozinha nos pedidos.'));
1105
+ console.log(c.dim(' Edite o arquivo e preencha o campo `quando:` quando quiser.'));
1106
+ }
1107
+ }
1108
+
1109
+ async function instalarSkill() {
1110
+ console.log('');
1111
+ const caminho = String(await ask(' ' + c.brand('❯ ') + c.white('Caminho do SKILL.md: '))).trim();
1112
+ if (!caminho) return;
1113
+ const r = await instalarComPortao(caminho);
1114
+ console.log(r.ok ? c.ok(` Skill instalada: ${r.nome}`) : c.err(` ${r.error}`));
1115
+ }
1116
+
1117
+ /* Instala passando pelo portão (lib/skill/portao-skill.js). Achou algo: mostra cada
1118
+ achado com arquivo:linha e faz a mesma pergunta do que não tem volta
1119
+ (autorizarControle) — Enter sozinho é NÃO. */
1120
+ async function instalarComPortao(caminho) {
1121
+ const r = skills.instalarDe(caminho);
1122
+ if (!r.bloqueada) return r;
1123
+ console.log('');
1124
+ console.log(' ' + c.err(r.error));
1125
+ for (const linha of portaoSkill.descrever(r.achados).slice(0, 20)) console.log(' ' + c.warn(linha));
1126
+ if (r.achados.length > 20) console.log(c.dim(` … e mais ${r.achados.length - 20}`));
1127
+ console.log(' ' + c.dim('Leia cada linha: o portão acha padrão, não intenção.'));
1128
+ const resposta = await autorizarControle(`instalar a skill de ${caminho} mesmo assim`, { tipo: 'perigo' });
1129
+ if (resposta !== 'agora' && resposta !== 'sessao') return { ok: false, error: 'Skill não instalada.' };
1130
+ return skills.instalarDe(caminho, { forcar: true });
1131
+ }
1132
+
1133
+ async function sendPrompt(userText, { digitado = false } = {}) {
1134
+ /* O portão do plano. Sem ele o bloqueio da abertura seria só um texto na
1135
+ tela: a pessoa leria "você não tem acesso" e mandaria a primeira coisa
1136
+ do mesmo jeito, e funcionaria.
1137
+
1138
+ De cortesia, não de segurança — este arquivo vai publicado no npm com o
1139
+ código à vista, e a checagem é uma linha que qualquer um apaga. Quem
1140
+ segura de verdade é o primocode-server. O que ele faz aqui é dizer o
1141
+ que houve e como resolver, em vez de deixar a pessoa achando que o
1142
+ produto está quebrado. */
1143
+ if (state.liberado === false) {
1144
+ console.log(c.err(' O PrimoCode pede um plano (a partir de R$ 69,90/mês).'));
1145
+ console.log(c.muted(' Veja e assine com ') + c.brand('/account plans')
1146
+ + c.muted(' · já assinou? ') + c.brand('/account'));
1147
+ return;
1148
+ }
1149
+
1150
+ /* Pedido grande: uma linha dizendo quanto deve gastar do plano de hoje (lib/config/limite.js). Sem o limite do plano,
1151
+ diz isso com todas as letras (uma vez por conversa) em vez de inventar %. Só pra quem digitou, no terminal. */
1152
+ if (digitado && !state.semTerminal && process.stdin.isTTY) {
1153
+ try {
1154
+ const L = require('../config/limite.js');
1155
+ const anexos = state.attachedFiles.reduce((n, f) => n + String(f.content || '').length, 0);
1156
+ const limite = L.limiteConhecido();
1157
+ if (L.pedidoGrande(userText, anexos) && (limite || !state.avisouSemLimite)) {
1158
+ const { total } = extra.resumoCusto(contadorDaSessao);
1159
+ const media = total.pedidos ? Math.round((total.enviados + total.recebidos) / total.pedidos) : 0;
1160
+ console.log(c.muted(' ' + L.linhaDoPedido({ tokens: L.estimar({ texto: userText, anexosChars: anexos, mediaPorPedido: media }), limite, usadoHoje: L.usoDeHoje().tokens })));
1161
+ if (!limite) state.avisouSemLimite = true;
1162
+ }
1163
+ } catch { /* a estimativa nunca derruba o pedido */ }
1164
+ }
1165
+
1166
+ // PRIMOCODE_TEMPOS=1: uma linha no fim com o custo de cada fase.
1167
+ tempos.comecar();
1168
+ const inicio = Date.now();
1169
+ /* Pedido em lista, com 4 itens ou mais (lib/partes.js): PERGUNTA se faz um de cada vez. Só no terminal de
1170
+ verdade; no app e no -p, segue inteiro como sempre. */
1171
+ // só o que a PESSOA digitou: o pedido que o próprio PrimoCode monta (o conserto do /conferir leva a saída do teste,
1172
+ // e o mocha escreve "1) nome do teste") não pode virar "esse pedido tem 4 partes" (achado da revisão de 24/10)
1173
+ const divisao = digitado && !state.semTerminal && process.stdin.isTTY ? require('../partes.js').dividir(userText) : null;
1174
+ if (divisao && await confirm(`Esse pedido tem ${divisao.partes.length} partes. De uma vez só, pedido grande costuma travar no meio. Faço uma de cada vez, conferindo entre elas?`)) {
1175
+ const P = require('../partes.js');
1176
+ try {
1177
+ for (let i = 0; i < divisao.partes.length; i++) {
1178
+ console.log(c.brand(`\n ▸ parte ${i + 1} de ${divisao.partes.length}: `) + c.white(divisao.partes[i].slice(0, 80)));
1179
+ await enviarPedido(P.pedidoDaParte(divisao, i));
1180
+ if (require('../session/runner/act.js').interrompido()) break; // Esc Esc numa parte para as que faltam
1181
+ }
1182
+ } finally {
1183
+ const linha = tempos.relatorio();
1184
+ if (linha) console.log(c.dim(` ⏱ ${linha}`));
1185
+ }
1186
+ return;
1187
+ }
1188
+ try { await enviarPedido(userText); }
1189
+ finally {
1190
+ const linha = tempos.relatorio();
1191
+ if (linha) console.log(c.dim(` ⏱ ${linha}`));
1192
+ /* O fecho de cada resposta, como no OpenCode ("▣ Build · Nemotron ·
1193
+ 4.0s"): quem respondeu, com que esforço, e quanto levou. */
1194
+ const m = state.mode === 'auto' ? (state.modoEfetivo || 'auto') : state.mode;
1195
+ if (!state.semTerminal) {
1196
+ console.log('\n ' + `${COR_MODO[m] || COR_MODO.auto}▣${c.reset} ` + c.white(NOME_MODO[m] || m)
1197
+ + c.dim(` · ${effort.normalizar(state.config.effort)} · ${((Date.now() - inicio) / 1000).toFixed(1)}s`));
1198
+ const nAcoes = require('../cli-nova.js').zerar();
1199
+ if (nAcoes) console.log(require('../cli-nova.js').fecho({ segundos: (Date.now() - inicio) / 1000, acoes: nAcoes }, { c }));
1200
+ console.log('');
1201
+ // O que o agente deixou de pé (run_background), com o endereço pra abrir.
1202
+ const rodape = require('../fundo.js').linhasRodape(require('../fundo.js').listar(), c);
1203
+ if (rodape.length) console.log(rodape.join('\n') + '\n');
1204
+ }
1205
+ }
1206
+ }
1207
+
1208
+ /* Marca no arquivo de hoje o que ESTA conversa já gastou (lib/config/limite.js): é o que o /usage soma. */
1209
+ const IDENTIDADE_DA_SESSAO = `${process.pid}-${Date.now()}`;
1210
+ /* Tarefa em segundo plano que acabou sozinha: uma linha na tela (o modelo recebe o aviso na próxima volta). */
1211
+ require('../fundo.js').aoTerminar((a) => {
1212
+ if (state.semTerminal) return;
1213
+ process.stdout.write('\n ' + (a.ok ? c.ok('✔') : c.err('✘')) + ' ' + c.muted(`tarefa ${a.id} terminou (código ${a.codigo}): ${a.comando.slice(0, 60)}`) + '\n');
1214
+ });
1215
+ function guardarUsoDeHoje() {
1216
+ try {
1217
+ const { total } = extra.resumoCusto(contadorDaSessao);
1218
+ require('../config/limite.js').guardarSessao(IDENTIDADE_DA_SESSAO, total.enviados + total.recebidos);
1219
+ } catch { /* contar nunca derruba um pedido */ }
1220
+ }
1221
+
1222
+ async function enviarPedido(userText) {
1223
+ let prompt = userText;
1224
+ const custoAntes = extra.resumoCusto(contadorDaSessao); // pro "Este pedido: …" do fim
1225
+ // "@index.html" no pedido é um /attach só deste pedido: vai junto dos
1226
+ // anexos, mas não fica em state.attachedFiles para o próximo.
1227
+ const citados = mencoesDoPedido(userText);
1228
+ // "@https://…" no pedido é um /web só deste pedido (lib/web-pagina.js)
1229
+ const W = require('../web-pagina.js');
1230
+ for (const url of W.urlsDoPedido(userText)) {
1231
+ const r = await W.baixar(url);
1232
+ if (r.ok) {
1233
+ citados.push({ path: r.url, content: (r.titulo ? `# ${r.titulo}\n\n` : '') + r.texto });
1234
+ console.log(c.dim(` ⎿ anexado: ${r.titulo || r.url} (${r.palavras} palavras${r.cortado ? ', o começo da página' : ''})`));
1235
+ } else console.log(c.dim(` ⎿ não anexei ${url}: ${r.error}`));
1236
+ }
1237
+ const anexos = [...state.attachedFiles, ...citados];
1238
+ if (anexos.length) {
1239
+ const parts = anexos.map((f) => `Arquivo: ${f.path}\n\`\`\`\n${f.content}\n\`\`\``);
1240
+ prompt = parts.join('\n\n') + '\n\n' + userText;
1241
+ }
1242
+
1243
+ // O modo primocode manda o schema das 30 tools em todo pedido (~4.700
1244
+ // tokens). No auto, quem não vai usar ferramenta não paga por ela.
1245
+ let modo = state.mode;
1246
+ if (modo === 'auto') {
1247
+ // O modo do pedido ANTERIOR entra na decisão: no meio de uma tarefa,
1248
+ // "refaz" e "agora põe música" são continuação, não papo novo.
1249
+ const escolha = escolherModo(userText, { ultimoModo: state.modoEfetivo });
1250
+ modo = escolha.modo;
1251
+ state.modoEfetivo = modo;
1252
+ const rotulo = modo === 'primocode' ? c.warn('Primo Code') : c.brandDim('Chat');
1253
+ console.log(c.dim(` ⎿ ${ui.stripAnsi(rotulo)} · ${escolha.motivo}`));
1254
+ refreshPrompt();
1255
+ }
1256
+
1257
+ if (modo === 'primocode') {
1258
+ // "baixa o vídeo" / "exporta em mp4" não precisa de IA NENHUMA: é
1259
+ // abrir a última criação do Studio com #gravar — o navegador pede a
1260
+ // permissão de tela (a aprovação), grava a passada e baixa no fim.
1261
+ // Antes isso virava uma tarefa inteira de modelo (id inventado,
1262
+ // mídia inventada, limite estourado) para chegar no mesmo lugar.
1263
+ if (await baixarCriacaoDireto(userText)) { refreshPrompt(); return; }
1264
+
1265
+ const plan = await prepararPasta(userText);
1266
+
1267
+ // O Chrome só aparece na tela quando o pedido é de navegador (lib/browser.js, definirVisivel).
1268
+ require('../browser.js').definirVisivel(querNavegador(userText));
1269
+
1270
+ /* AS REFERÊNCIAS DO VÍDEO (lib/plugin/estudio/referencias.js) saem do próprio
1271
+ pedido. O padrão é SEM IMAGEM, e o menu 1/2/3 saiu: "por padrão, NÃO
1272
+ usar imagens; somente quando o usuário pedir explicitamente" (07/10). */
1273
+ const referencias = require('../plugin/estudio/referencias.js');
1274
+ referencias.limpar();
1275
+ const producao = require('../plugin/estudio/diretor.js').precisaDeProducao(userText);
1276
+ if (producao.producao && producao.formato === 'video') {
1277
+ const r = referencias.inferir(userText);
1278
+ referencias.definir(r.modo, r.escopo, r.explicito);
1279
+ console.log(c.dim(` ⎿ imagens: ${{ aberto: 'sim, da web', fechado: 'só de ' + r.escopo, sem: r.explicito ? 'nenhuma, só motion' : 'nenhuma (o padrão)' }[r.modo]}`)
1280
+ + (r.modo === 'sem' && !r.explicito ? c.dim(' · diga "adicione imagens de apoio" para usar') : ''));
1281
+ }
1282
+
1283
+ // O resumo da rodada anterior é feito em segundo plano logo depois
1284
+ // dela; aqui só se espera ele terminar, para não sair com memória velha.
1285
+ //
1286
+ // O pedido passa por uma cabeça antes de virar trabalho: conserta o
1287
+ // que está torto, diz qual é o entregável e o que conta como pronto.
1288
+ // UMA chamada faz as duas coisas: arruma o pedido torto e, se fizer
1289
+ // sentido, divide em passos. Eram duas idas ao modelo por pedido, e
1290
+ // num plano limitado por REQUISIÇÕES (o grátis da Groq são 30 por
1291
+ // minuto) cada chamada extra custa tanto quanto token.
1292
+ //
1293
+ // As duas esperas correm JUNTAS. Uma não lê o que a outra escreve: o
1294
+ // plano só olha o texto do pedido, e o resumo só a conversa de antes.
1295
+ // Em fila, o pedido de duas fases pagava o resumo e DEPOIS o plano —
1296
+ // duas idas ao modelo em série antes da primeira rodada.
1297
+ const [, passos] = await Promise.all([
1298
+ tempos.medir('espera do resumo', () => esperarResumo()),
1299
+ tempos.medir('plano', () => dividirTarefa(prompt)),
1300
+ ]);
1301
+
1302
+ let r = null;
1303
+ let jaFeito = '';
1304
+ /* O livro do PEDIDO, não do passo. Um plano de três passos são três
1305
+ chamadas de runAct, cada uma com o seu registro — e o balanço que
1306
+ interessa é o do pedido inteiro: quem pediu um vídeo não quer três
1307
+ balanços, quer saber o que existe no disco quando ele terminar. */
1308
+ const livro = registro.novo();
1309
+ // Um checkpoint por PEDIDO (não por passo): é o que o /desfazer volta.
1310
+ // Com a pasta: a foto do projeto inteiro sai AGORA, antes de qualquer
1311
+ // tool — é ela que dá volta ao `rm`/`mv` que o run_shell fizer.
1312
+ checkpoint.iniciar(userText, projectDir());
1313
+ for (let i = 0; i < passos.length; i++) {
1314
+ if (i > 0) console.log(c.dim(` ⎿ ${passos[i].titulo}`));
1315
+ // Só fato de passo CONCLUÍDO entra aqui. Num pedido real o passo de
1316
+ // pesquisa morreu e o texto "Parei sem concluir..." foi injetado
1317
+ // como "use estes fatos" — e o passo seguinte obedeceu: criou o
1318
+ // vídeo sem fato nenhum, proibido de pesquisar.
1319
+ const contexto = !jaFeito ? ''
1320
+ : `\n\nO QUE JÁ FOI FEITO ANTES (use estes fatos, não pesquise de novo):\n${jaFeito}`;
1321
+ const semFatos = i > 0 && !jaFeito
1322
+ ? '\n\nATENÇÃO: o passo anterior não trouxe fatos. Trabalhe só com o que está no pedido. '
1323
+ + 'É PROIBIDO inventar dado de empresa, data, preço ou pessoa — na dúvida, não afirme.'
1324
+ : '';
1325
+ // o pedido citou arquivo: o agente sabe antes, não só no aviso do fim (lib/escopo.js)
1326
+ const pedido = passos[i].pedido + contexto + semFatos + require('../escopo.js').nota(userText);
1327
+
1328
+ const rodarPasso = (texto = pedido) => runAct(texto, {
1329
+ server: state.config.server,
1330
+ model: state.config.model,
1331
+ effort: state.config.effort,
1332
+ token: state.config.token,
1333
+ // Só o primeiro passo enxerga a conversa: os seguintes recebem o
1334
+ // que interessa em `jaFeito`, e conversa a mais só ocupa o teto.
1335
+ history: i === 0 ? memoria.paraEnviar(state.memoria, state.history, contextoDoProjeto()) : [],
1336
+ projectDir: plan.dir,
1337
+ projectName: plan.name || state.currentProject,
1338
+ // Só chamado se o agente for mesmo MEXER EM ARQUIVO — abrir o Chrome
1339
+ // não é motivo para criar pasta de projeto.
1340
+ ensureWorkDir: plan.pending ? () => createPendingProject(plan) : null,
1341
+ // O portão do computador: quem pergunta é o terminal, quem
1342
+ // lembra da resposta é a sessão.
1343
+ // No pedido único (`primo "…"`) não há ninguém para responder:
1344
+ // sem `autorizar`, o que pede licença é recusado (lib/permission/perigo.js).
1345
+ autorizar: state.semTerminal ? undefined : autorizarControle,
1346
+ escolher: state.semTerminal ? undefined : (q, o, op) => {
1347
+ const PQ = require('../tool/perguntar');
1348
+ if (process.stdin.isTTY && process.stdout.isTTY) {
1349
+ return PQ.escolherComSetas({ stdin: process.stdin, stdout: process.stdout, suspender: () => rl && rl.suspender && rl.suspender(), retomar: () => rl && rl.retomar && rl.retomar() }, c, q, o, { ...op, ask });
1350
+ }
1351
+ return PQ.escolherNoTerminal(ask, c, q, o, op);
1352
+ },
1353
+ // A memória do AGENTS.md só vai se o resumo ainda não a carrega.
1354
+ memoriaDaPasta: !memoria.jaDobrou(state.memoria, plan.dir),
1355
+ mudarPasta: state.semTerminal ? null : mudarPastaPeloAgente,
1356
+ controle: state.controle,
1357
+ permissoes: state.config.permissoes,
1358
+ // Pedido de mexer no computador leva a dica que libera as
1359
+ // ferramentas desktop_* no servidor (ver DICA_COMPUTADOR).
1360
+ instrucao: [i === 0 && querComputador(userText) ? vozModo.DICA_COMPUTADOR : '',
1361
+ i === 0 ? require('../plugin/estudio/referencias.js').instrucao() : '',
1362
+ // As imagens do pedido (arrastadas ou coladas): guardadas para o Estúdio importar, e ditas ao agente.
1363
+ i === 0 ? (() => { const R = require('../plugin/estudio/referencias.js'); return R.instrucaoDasImagens(R.guardarImagens(R.imagensNoTexto(userText))); })() : '',
1364
+ i === 0 ? require('../cli-nova.js').instrucaoDeAgentes(userText).texto : '',
1365
+ i === 0 ? plan.notaOutraPasta || '' : ''].filter(Boolean).join('\n\n'),
1366
+ });
1367
+
1368
+ r = await rodarPasso();
1369
+ // O mudar_pasta trocou no meio: os passos seguintes seguem lá.
1370
+ if (r && r.pasta && path.resolve(r.pasta) !== path.resolve(plan.dir)) { plan.dir = r.pasta; plan.pending = false; }
1371
+ if (r && r.estudio) state.estudioAtivo = r.estudio;
1372
+ /* Passo que parou no meio NÃO devolve a tarefa para a pessoa
1373
+ dividir. Se ele já tinha feito alguma coisa (arquivo, comando),
1374
+ o próprio CLI pede a continuação — com a lista do que já existe
1375
+ no disco, para não refazer. Até CONTINUACOES vezes, e só
1376
+ enquanto cada volta produz algo: continuação que não mexe em
1377
+ nada é laço, e laço para.
1378
+ Num plano de vários passos, o passo que desistiu sem fazer nada
1379
+ ganha UMA segunda chance — costuma ser tropeço transitório do
1380
+ modelo grátis. Falhou de novo: o
1381
+ plano segue com o aviso de "sem fatos", nunca com o texto da
1382
+ falha fantasiado de resultado. */
1383
+ let continuacoes = 0;
1384
+ let tentouDeNovo = false;
1385
+ while (!r.parado && r.concluiu === false) {
1386
+ registro.juntar(livro, r.registro);
1387
+ // Sem registro é erro do provedor (cota, rede): retomar só bate
1388
+ // no mesmo muro.
1389
+ if (r.registro && !registro.vazio(r.registro) && continuacoes < CONTINUACOES) {
1390
+ continuacoes++;
1391
+ console.log(c.dim(' ⎿ continuando de onde parou'));
1392
+ r = await rodarPasso(pedidoDeContinuacao(passos[i].pedido, livro));
1393
+ continue;
1394
+ }
1395
+ if (!tentouDeNovo && passos.length > 1 && registro.vazio(r.registro) && continuacoes === 0) {
1396
+ tentouDeNovo = true;
1397
+ console.log(c.dim(' ⎿ o passo não concluiu — tentando de novo'));
1398
+ r = await rodarPasso();
1399
+ continue;
1400
+ }
1401
+ break;
1402
+ }
1403
+ if (r.concluiu !== false || r.parado) registro.juntar(livro, r.registro);
1404
+ jaFeito = (r.concluiu !== false)
1405
+ ? String((r.assistantMessage && r.assistantMessage.content) || '').slice(0, 1200)
1406
+ : '';
1407
+ if (r.parado) break; // Esc Esc no meio do plano para o plano inteiro
1408
+ }
1409
+ checkpoint.encerrar();
1410
+
1411
+ // O pedido nomeou arquivo e o agente mexeu em outros? Diz quais, e o /desfazer fora volta só esses (lib/escopo.js).
1412
+ try {
1413
+ const escopo = require('../escopo.js');
1414
+ const ultimo = checkpoint.lista(projectDir())[0];
1415
+ if (ultimo && ultimo.pedido === String(userText).replace(/\s+/g, ' ').trim()) {
1416
+ const fora = escopo.foraDoPedido(userText, ultimo.mudou, projectDir());
1417
+ if (fora.length) {
1418
+ escopo.texto(escopo.citados(userText), fora).forEach((l, i, ls) => console.log(i === 0 ? c.warn(' ' + l) : i === ls.length - 1 ? c.muted(' ' + l) : c.white(' ' + l)));
1419
+ }
1420
+ }
1421
+ } catch { /* o aviso nunca derruba o pedido */ }
1422
+ // "nunca mexa no logo" dito no pedido: oferece guardar como regra, não guarda sozinho (lib/regras.js)
1423
+ try {
1424
+ const regras = require('../regras.js');
1425
+ const sug = regras.sugerir(userText, regras.ler(projectDir()));
1426
+ if (sug) console.log(c.muted(' Isso vale sempre? ') + c.white(`/rule ${sug}`) + c.muted(' (fica no PRIMO.md e não some quando a conversa é resumida)'));
1427
+ } catch { /* a oferta nunca derruba o pedido */ }
1428
+
1429
+ /* O balanço, depois da resposta. Depois, e não antes, de propósito: o
1430
+ que a pessoa quer ler primeiro é o que ele TEM A DIZER; a lista de
1431
+ arquivos é a conferência, e conferência se lê por último. */
1432
+ const balanco = registro.resumo(livro, { colunas: process.stdout.columns || 80 });
1433
+ if (balanco) console.log(balanco);
1434
+ const custo = extra.custoDoPedido(custoAntes, extra.resumoCusto(contadorDaSessao));
1435
+ if (custo) console.log(c.dim(` ${custo}`));
1436
+ guardarUsoDeHoje();
1437
+ // O rostinho do mascote, por último e numa linha só. O humor sai do
1438
+ // que aconteceu, não de adivinhar pelo texto da resposta.
1439
+ if (state.config.reacoes !== false && r) {
1440
+ const humor = r.parado ? 'parado' : r.concluiu === false ? 'preocupado' : 'feliz';
1441
+ console.log(ui.reacao(state.config.mascot, humor));
1442
+ }
1443
+ state.history.push({ role: 'user', content: userText });
1444
+ // na memória da conversa vai também o que o pedido fez no disco (arquivos, último teste): o pedido seguinte sabe
1445
+ let feito = '';
1446
+ try { feito = require('../registro.js').paraMemoria(r.registro); } catch { /* sem registro */ }
1447
+ state.history.push({ role: 'assistant', content: r.assistantMessage.content + (feito ? `\n\n${feito}` : '') });
1448
+ resumirDepois();
1449
+ state.lastResponse = r.assistantMessage.content;
1450
+ cfg.appendHistory({ mode: 'primocode', project: state.currentProject, prompt: userText });
1451
+ // Sobe cifrado, atrás, sem segurar o prompt. Se não houver conta ou
1452
+ // rede, não acontece nada — a conversa segue aqui do mesmo jeito.
1453
+ state.gravador.turno(userText, r.assistantMessage.content,
1454
+ { modo: 'primocode', projeto: state.currentProject || null });
1455
+ // O parceiro do /team revisa o que mudou (lib/team.js). Depois do histórico: o conserto vem como pedido seguinte.
1456
+ await revisaoDoParceiro(userText, livro, r);
1457
+ } else {
1458
+ await tempos.medir('espera do resumo', () => esperarResumo());
1459
+ await tempos.medir('chat', () => runChat(prompt, userText));
1460
+ }
1461
+
1462
+ state.attachedFiles = [];
1463
+ refreshPrompt();
1464
+ }
1465
+
1466
+ /* "UM FAZ, O OUTRO REVISA" (/team). O PrimoCode fez; o parceiro lê a mudança
1467
+ (só lendo, na pasta do projeto, com prazo) e devolve a revisão. Achou
1468
+ problema, a pessoa diz se corrige; o conserto não é revisado de novo. */
1469
+ async function revisaoDoParceiro(userText, livro, r) {
1470
+ const nome = state.config.team;
1471
+ if (!nome || state.consertandoRevisao || !r || r.parado || !livro) return;
1472
+ const arquivos = [...(livro.criados || []), ...(livro.alterados || [])];
1473
+ if (!arquivos.length) return;
1474
+ const team = require('../team.js');
1475
+ const dele = team.instalados().find((x) => x.nome === nome);
1476
+ if (!dele) { console.log(c.warn(` O ${nome} não está mais instalado: sem revisão. /team mostra os que você tem.`)); return; }
1477
+ const dir = r.pasta || projectDir();
1478
+ const diff = team.diffDaVez(dir, arquivos);
1479
+ if (!diff) return;
1480
+ console.log(c.muted(` ${dele.titulo} revisando o que eu fiz (só lendo)…`));
1481
+ const rev = await team.rodar(nome, 'revisar', { prompt: team.pedidoDeRevisao({ pedido: userText, diff }), dir, caminho: dele.caminho,
1482
+ linha: (l) => console.log(c.dim(` ${nome} │ ${l}`)) });
1483
+ if (!rev.ok) { console.log(c.warn(` ${rev.erro}`)); return; }
1484
+ if (!rev.texto || team.semProblema(rev.texto)) { console.log(c.ok(` ✓ ${nome} revisou: nada a corrigir.`)); return; }
1485
+ console.log(c.white(` A revisão do ${nome}:`));
1486
+ for (const l of rev.texto.split('\n')) console.log(` ${l}`);
1487
+ if (state.semTerminal) return;
1488
+ if (!(await confirm('Corrijo o que a revisão achou?'))) return;
1489
+ state.consertandoRevisao = true;
1490
+ try { await sendPrompt(team.pedidoDeConserto(nome, rev.texto)); } finally { state.consertandoRevisao = false; }
1491
+ }
1492
+
1493
+ /* `/team <nome> faz <pedido>`: o parceiro faz numa cópia do projeto (git
1494
+ worktree, ou cópia da pasta), o PrimoCode mostra o que mudou, passa cada
1495
+ arquivo pelo portão (lib/permission/perigo.js) e só aplica com o sim. /undo volta. */
1496
+ async function parceiroFaz(nome, pedido) {
1497
+ const team = require('../team.js');
1498
+ const dele = team.instalados().find((x) => x.nome === nome);
1499
+ const dir = projectDir();
1500
+ if (!pastaSegura(dir) || path.resolve(dir) === path.resolve(cfg.ROOT_DIR)) {
1501
+ console.log(c.warn(' Entre num projeto antes (/projects ou /dir): o parceiro trabalha numa cópia dele.'));
1502
+ return;
1503
+ }
1504
+ let copia;
1505
+ try { copia = team.prepararCopia(dir); } catch (e) { console.log(c.warn(` Não consegui preparar a cópia do projeto: ${String(e.message || e).split('\n')[0]}`)); return; }
1506
+ try {
1507
+ console.log(c.muted(` ${dele.titulo} trabalhando numa cópia do projeto${copia.git ? ' (git worktree)' : ''}…`));
1508
+ const r = await team.rodar(nome, 'fazer', { prompt: team.pedidoDeFazer(pedido), dir: copia.pasta, caminho: dele.caminho,
1509
+ linha: (l) => console.log(c.dim(` ${nome} │ ${l}`)) });
1510
+ if (!r.ok) { console.log(c.warn(` ${r.erro}`)); return; }
1511
+ if (r.texto) { console.log(c.white(` O ${nome} disse:`)); for (const l of r.texto.split('\n')) console.log(` ${l}`); }
1512
+ const m = team.mudancasDaCopia(copia);
1513
+ if (!m.arquivos.length) { console.log(c.muted(' Ele não mudou nenhum arquivo. O projeto ficou como estava.')); return; }
1514
+ console.log(c.white(` O que ele mudou (${m.arquivos.length} arquivo${m.arquivos.length > 1 ? 's' : ''}):`));
1515
+ const linhas = m.patch.split('\n');
1516
+ for (const l of linhas.slice(0, 200)) console.log(' ' + (/^\+(?!\+\+)/.test(l) ? c.ok(l) : /^-(?!--)/.test(l) ? c.err(l) : c.dim(l)));
1517
+ if (linhas.length > 200) console.log(c.dim(` … e mais ${linhas.length - 200} linhas`));
1518
+ if (!state.controle.perigo) state.controle.perigo = perigo.novo();
1519
+ const recusas = await team.passarPeloPortao(m.arquivos, { projectDir: dir, aplicarEm: copia.aplicarEm, modo: state.config.permissoes,
1520
+ estado: state.controle.perigo, perguntar: state.semTerminal ? undefined : autorizarControle });
1521
+ if (recusas.length) { console.log(c.warn(` O portão do PrimoCode recusou: ${recusas.join('; ')}. Nada foi aplicado.`)); return; }
1522
+ if (state.semTerminal) { console.log(c.muted(' No modo script eu não aplico sozinho: rode no terminal do PrimoCode pra aplicar.')); return; }
1523
+ if (!(await confirm('Aplico essa mudança no projeto?'))) { console.log(c.muted(' Não apliquei. O projeto ficou como estava.')); return; }
1524
+ checkpoint.iniciar(`/team ${nome} faz ${pedido}`, dir);
1525
+ for (const a of m.arquivos) checkpoint.antesDeMudar(path.join(copia.aplicarEm, a.caminho), dir);
1526
+ const ap = team.aplicar(copia, m.patch);
1527
+ checkpoint.encerrar();
1528
+ console.log(ap.ok ? c.ok(` ✓ Apliquei. /undo volta.`) : c.warn(` ${ap.erro}`));
1529
+ } finally { copia.limpar(); }
1530
+ }
1531
+
1532
+ /**
1533
+ * Arruma o pedido e divide em passos — as duas coisas, ESCONDIDAS.
1534
+ *
1535
+ * ARRUMAR: gente pede curto e torto ("cria um vidro anunciando o founders
1536
+ * ai"). Sem isso o agente adivinha, e adivinha errado. É oculto porque
1537
+ * encanamento não é conversa: o usuário quer ver a coisa acontecendo, não um
1538
+ * relatório do que a máquina entendeu — e não há o que aprovar, já que o
1539
+ * refino não decide nada, só desambigua o que ele já disse.
1540
+ *
1541
+ * DIVIDIR: o motivo é aritmético. Com 6.000 tokens por minuto, "pesquise
1542
+ * sobre a X e crie um vídeo" não cabe numa conversa só — custo fixo ~3.700,
1543
+ * spec do formato ~1.400, fatos da pesquisa o resto, e sobram 512 para o
1544
+ * agente escrever. Em dois pedidos cada um cabe folgado, porque cada um leva
1545
+ * só as ferramentas e o prompt do seu passo.
1546
+ *
1547
+ * As duas numa chamada só: elas leem o mesmo texto, e num plano limitado por
1548
+ * requisições por minuto a segunda ida ao modelo custa tanto quanto token.
1549
+ *
1550
+ * Falhou? O pedido do usuário, inteiro, como ele escreveu.
1551
+ */
1552
+ // A ÚNICA divisão que compensa: DESCOBRIR uma coisa e CRIAR outra com ela.
1553
+ // O resto é pedido de uma fase só, e mandar para o planejador era pagar uma
1554
+ // chamada de API para ouvir "não divida" — quando o modelo não resolvia
1555
+ // inventar passos que ninguém pediu, que era o "faz coisas nada a ver".
1556
+ const RE_DESCOBRIR = /\b(pesquis|busca|procur|descubr|investig|analis|leia|estud|olh[ae] (o site|a p[áa]gina)|ver o que)\w*/i;
1557
+ const RE_CRIAR_DEPOIS = /\b(cri[ae]|faz|faça|mont[ae]|ger[ae]|escrev[ae]|produz|desenvolv)\w*/i;
1558
+
1559
+ /* A outra divisão que compensa: o pedido LONGO que emenda entregas diferentes
1560
+ ("cria o site, depois põe login e publica"). Estreita de propósito — o
1561
+ planejador dividindo pedido de uma fase só era o "faz coisas nada a ver" —
1562
+ e o servidor ainda devolve passo único na dúvida. */
1563
+ const RE_ACAO = /\b(cri[ae]r?|fa[zç]a?|fazer|mont[ae]r?|ger[ae]r?|escrev[ae]r?|adicion[ae]r?|coloc[ae]r?|p[oõ]e|implement[ae]r?|public[ae]r?|sob[ea]|instal[ae]r?|configur[ae]r?|test[ae]r?|corrig[ei]r?|arrum[ae]r?|mud[ae]r?|integr[ae]r?|conect[ae]r?)\b/gi;
1564
+ function pedidoDeVariasPartes(pedido) {
1565
+ const t = String(pedido || '');
1566
+ if (t.length < 200) return false;
1567
+ const acoes = new Set((t.match(RE_ACAO) || []).map((x) => x.toLowerCase().slice(0, 4)));
1568
+ return acoes.size >= 3 && /\b(depois|em seguida|e tamb[ée]m|al[ée]m disso|por fim|e ent[ãa]o)\b|\n\s*(\d+[.)]|[-*•])\s/i.test(t);
1569
+ }
1570
+
1571
+ /* "me manda o vídeo" resolvido na hora, sem gastar modelo.
1572
+ *
1573
+ * Antes isso abria a última criação do Studio no navegador com `#gravar`, e a
1574
+ * pessoa precisava aceitar uma permissão de tela para o navegador GRAVAR a
1575
+ * animação passando — era assim que o mp4 nascia.
1576
+ *
1577
+ * Isso acabou junto com o renderizador de navegador: o Remotion escreve o
1578
+ * arquivo direto, e todo render já deixa um .mp4 em `saida/`. Então "baixa o
1579
+ * vídeo" não é mais uma tarefa — é dizer onde ele está, que o CLI sabe sem
1580
+ * perguntar a modelo nenhum.
1581
+ */
1582
+ const RE_BAIXAR = /\b(baixa\w*|exporta\w*|download|salva\w*|me manda|manda(r)? (o|a|esse|essa)|gera(r)? o arquivo|em mp4|pra mandar|arquivo do|onde (est[áa]|ficou))\b/i;
1583
+ const RE_PECA_STUDIO = /\b(v[ií]deo|mp4|apresenta[çc][ãa]o|slides?|reels?|anima[çc][ãa]o|filme)\b/i;
1584
+
1585
+ async function baixarCriacaoDireto(texto) {
1586
+ if (!(RE_BAIXAR.test(texto) && RE_PECA_STUDIO.test(texto))) return false;
1587
+ try {
1588
+ const { projeto } = require('../plugin/estudio');
1589
+ // O mais recente que já foi renderizado: quem diz "me manda o vídeo"
1590
+ // fala do último, e um projeto sem render não tem o que mandar.
1591
+ const comArquivo = projeto.listar({ limite: 30 })
1592
+ .find((p) => (p.renders || []).some((r) => fs.existsSync(r.arquivo)));
1593
+ if (!comArquivo) return false;
1594
+ const ultimo = [...comArquivo.renders].reverse().find((r) => fs.existsSync(r.arquivo));
1595
+
1596
+ await tools.execute('open_in_browser', { target: ultimo.arquivo },
1597
+ { projectDir: state.workDir || os.homedir() });
1598
+ console.log(c.ok(` ⎿ abrindo "${comArquivo.titulo}"`));
1599
+ console.log(c.muted(' ') + c.white(ultimo.arquivo));
1600
+ console.log(c.dim(` ${(ultimo.bytes / 1048576).toFixed(1)} MB · o arquivo já estava pronto, é só copiar daí.`));
1601
+ return true;
1602
+ } catch {
1603
+ return false; // sem projeto renderizado: segue o caminho normal
1604
+ }
1605
+ }
1606
+
1607
+ /* Quantas vezes um passo que parou no meio é retomado sozinho. */
1608
+ const CONTINUACOES = 2;
1609
+
1610
+ /**
1611
+ * O pedido de retomada: o pedido original + o que já existe, para o agente
1612
+ * seguir em vez de recomeçar. A conversa do passo anterior não vai junto (é
1613
+ * ela que estourou) — vai o que aconteceu no disco, que é o que importa.
1614
+ */
1615
+ function pedidoDeContinuacao(original, livro) {
1616
+ const linhas = [];
1617
+ if (livro.criados.length) linhas.push(`Arquivos criados: ${livro.criados.slice(0, 20).join(', ')}`);
1618
+ if (livro.alterados.length) linhas.push(`Arquivos alterados: ${livro.alterados.slice(0, 20).join(', ')}`);
1619
+ const cmds = livro.comandos.slice(-8).map((x) => `${x.comando} (${x.ok ? 'ok' : 'falhou'})`);
1620
+ if (cmds.length) linhas.push(`Comandos rodados: ${cmds.join('; ')}`);
1621
+ const falhas = livro.falhas.slice(-3).map((f) => `${f.acao}: ${f.motivo}`);
1622
+ if (falhas.length) linhas.push(`Falhas: ${falhas.join('; ')}`);
1623
+ return `CONTINUAÇÃO — a tarefa abaixo já foi começada e parou no meio. NÃO recomece do zero: `
1624
+ + `leia o que já existe, veja o que falta, divida o que falta em passos pequenos (write_todos) e termine.\n\n`
1625
+ + `O QUE JÁ FOI FEITO:\n${linhas.join('\n') || '(nada registrado)'}\n\nA TAREFA:\n${original}`;
1626
+ }
1627
+
1628
+ async function dividirTarefa(pedido) {
1629
+ // O /plan já dividiu, e a pessoa aprovou: nada de chamar o servidor de novo.
1630
+ if (state.passosProntos) { const prontos = state.passosProntos; state.passosProntos = null; console.log(c.dim(` ⎿ ${prontos[0].titulo}`)); return prontos; }
1631
+ const inteiro = [{ titulo: 'tarefa', pedido }];
1632
+ if (!pedido || pedido.trim().length < 12) return inteiro;
1633
+ // Sem as duas fases no texto, nem chama o servidor: mais rápido, e sem
1634
+ // dar ao modelo a chance de dividir o que não devia.
1635
+ if (!(RE_DESCOBRIR.test(pedido) && RE_CRIAR_DEPOIS.test(pedido)) && !pedidoDeVariasPartes(pedido)) return inteiro;
1636
+ const sp = new Spinner('Primo Code pensando').start();
1637
+ try {
1638
+ const r = await api.requestPlano(state.config.server, {
1639
+ prompt: pedido, model: state.config.model, token: state.config.token,
1640
+ });
1641
+ sp.stop();
1642
+ const passos = (r && Array.isArray(r.passos) && r.passos.length) ? r.passos : inteiro;
1643
+ if (passos.length > 1) console.log(c.dim(` ⎿ ${passos[0].titulo}`));
1644
+ return passos;
1645
+ } catch {
1646
+ sp.stop(); // preparar o pedido é melhoria, não requisito
1647
+ return inteiro;
1648
+ }
1649
+ }
1650
+
1651
+ /**
1652
+ * Atualiza o resumo da conversa, se já compensar.
1653
+ *
1654
+ * Silencioso quando não há o que fazer: nas primeiras rodadas a conversa é
1655
+ * curta e o resumo não pagaria a chamada.
1656
+ */
1657
+ /* `forcado` é o `/compact`: a pessoa mandou resumir, e mandar resumir tem de
1658
+ resumir. Sem isso o comando responderia "nada a fazer" justamente quando
1659
+ ela está vendo a IA se perder — e "não fiz nada" é a pior resposta possível
1660
+ para quem acabou de pedir socorro. */
1661
+ async function comprimirConversa(forcado = false, { silencioso = false } = {}) {
1662
+ if (!forcado && !memoria.precisaResumir(state.memoria, state.history)) return;
1663
+ // Em segundo plano não há spinner: ele disputaria a tela com o prompt.
1664
+ const sp = silencioso ? { stop() {} } : new Spinner('resumindo a conversa').start();
1665
+ try {
1666
+ const conversa = state.history;
1667
+ const dir = projectDir();
1668
+ /* A memória que o AGENTS.md desta pasta já tinha entra no resumo
1669
+ (uma vez por pasta): sem isto a primeira resposta de uma sessão nova
1670
+ reescreveria o AGENTS.md só com ela, e o "de onde parei" de ontem
1671
+ sumia. */
1672
+ if (!memoria.jaDobrou(state.memoria, dir) && !(state.memoria.semente && state.memoria.semente.pasta === dir)) {
1673
+ state.memoria = memoria.semear(state.memoria, dir, agentsMd.ler(dir));
1674
+ }
1675
+ // O mesmo `resumir` da compactação automática do agente (lib/session/compactacao.js): resumo + arquivos mexidos + to-dos.
1676
+ const nova = await memoria.atualizar(state.memoria, conversa, ({ resumo, mensagens }) =>
1677
+ require('../session/compactacao.js').resumirComFatos({ resumo, mensagens },
1678
+ (p) => api.requestResumo(state.config.server, { ...p, token: state.config.token }).then((r) => r.resumo)));
1679
+ // /clear ou /chats trocaram a conversa enquanto o resumo era feito:
1680
+ // o resumo é da conversa velha e não pode voltar por cima da nova.
1681
+ if (state.history !== conversa) { sp.stop(); return; }
1682
+ state.memoria = nova;
1683
+ sp.stop();
1684
+ gravarMemoriaDaPasta(dir);
1685
+ const e = memoria.economia(state.memoria, state.history);
1686
+ if (!silencioso && e.poupado > 0) console.log(c.dim(` ⎿ conversa resumida · ${e.cheio} → ${e.enxuto} tokens por pedido`));
1687
+ } catch {
1688
+ sp.stop(); // resumo é economia, não requisito: falhou, segue a vida
1689
+ }
1690
+ }
1691
+
1692
+ /* ── O RESUMO DE CADA RODADA ─────────────────────────────────────────────
1693
+ * "Gere um resumo a cada mensagem, pra na próxima ela ler só esse resumo."
1694
+ * O resumo começa assim que a resposta termina, atrás, sem segurar o prompt —
1695
+ * a pessoa lê a resposta enquanto ele é feito. O pedido seguinte espera por
1696
+ * ele (com teto: rede lenta não pode travar a conversa), e aí leva só o
1697
+ * resumo, não a conversa inteira. Ver lib/session/memoria-conversa.js. */
1698
+ function resumirDepois() {
1699
+ const anterior = state.resumindo || Promise.resolve();
1700
+ const atual = anterior.then(() => comprimirConversa(false, { silencioso: true })).catch(() => {});
1701
+ state.resumindo = atual;
1702
+ atual.then(() => { if (state.resumindo === atual) state.resumindo = null; });
1703
+ }
1704
+
1705
+ /* ── O AGENTS.md DE CADA PASTA ───────────────────────────────────────────
1706
+ * "Eu preciso de um AGENTS.md com a memória da conversa em cada pasta."
1707
+ * O resumo da conversa vai para o AGENTS.md da pasta de trabalho (só o bloco
1708
+ * do PrimoCode; o resto do arquivo é da pessoa — lib/agents-md.js), e para a
1709
+ * pasta do projeto do Estúdio em que se mexeu, se houver. A raiz
1710
+ * ~/primocode fica de fora: é o corredor, não um projeto. */
1711
+ function gravarMemoriaDaPasta(dir = projectDir()) {
1712
+ const resumo = state.memoria && state.memoria.resumo;
1713
+ if (!resumo) return;
1714
+ try { agentsMd.gravar(dir, resumo, { raiz: cfg.ROOT_DIR }); } catch { /* memória é conveniência */ }
1715
+ if (state.estudioAtivo) {
1716
+ try {
1717
+ const p = require('../plugin/estudio/projeto.js').ler(state.estudioAtivo);
1718
+ if (p) agentsMd.gravar(p.pasta, resumo, { titulo: p.titulo });
1719
+ } catch { /* projeto sumiu */ }
1720
+ }
1721
+ }
1722
+
1723
+ async function esperarResumo(tetoMs = 6000) {
1724
+ if (!state.resumindo) return;
1725
+ await Promise.race([state.resumindo, new Promise((ok) => setTimeout(ok, tetoMs))]);
1726
+ }
1727
+
1728
+ /* A linha que vai junto do resumo: em que projeto se está. É o que faz
1729
+ "continua o jogo" e "muda a cor" caírem no mesmo projeto em vez de inventar
1730
+ outro. */
1731
+ function mencoesDoPedido(userText) {
1732
+ const { arquivos, ignorados } = mencoesLib.mencoes(userText, projectDir());
1733
+ const lidos = [];
1734
+ for (const a of arquivos) {
1735
+ try {
1736
+ lidos.push({ path: a.rel, content: fs.readFileSync(a.abs, 'utf-8') });
1737
+ console.log(c.dim(` ⎿ anexado: ${a.rel} (${tools.fmtBytes(a.bytes)})`));
1738
+ } catch { console.log(c.dim(` ⎿ não consegui ler: ${a.rel}`)); }
1739
+ }
1740
+ for (const i of ignorados) console.log(c.dim(` ⎿ não anexei ${i.rel}: ${i.motivo}`));
1741
+ return lidos;
1742
+ }
1743
+
1744
+ /* O pedido do /init. Passa pelo MESMO caminho de um pedido digitado
1745
+ (sendPrompt → runAct), então usa as ferramentas e o provedor de agora — um
1746
+ /init que falasse direto com o modelo não enxergaria os arquivos. */
1747
+ const PEDIDO_INIT = 'Estude este projeto (a pasta atual) e escreva um arquivo PRIMO.md na raiz dela. '
1748
+ + 'Primeiro olhe de verdade: liste os arquivos, leia o README, o package.json (ou o equivalente) e os arquivos principais. '
1749
+ + 'Depois escreva o PRIMO.md em português, curto (menos de 60 linhas), com estas seções: '
1750
+ + 'o que é o projeto (2 ou 3 frases); como rodar (os comandos exatos que você viu, de instalar, rodar e testar); '
1751
+ + 'a stack (linguagem, frameworks, banco); as convenções que o código segue (nomes, estilo, onde ficam os testes); '
1752
+ + 'e onde está cada coisa (as pastas e arquivos que importam, uma linha cada). '
1753
+ + 'Só escreva o que você conferiu nos arquivos — nada de inventar comando ou dependência. '
1754
+ + 'Esse arquivo vai ser lido no começo de todo pedido neste projeto, então cada linha precisa valer o espaço.';
1755
+
1756
+ function contextoDoProjeto() {
1757
+ if (!state.currentProject) return '';
1758
+ return `Projeto atual: ${state.currentProject} (pasta ${shortPath(projectDir())}). `
1759
+ + 'Pedidos como "continua", "edita", "muda", "melhora" ou "isso" são sobre ELE: '
1760
+ + 'trabalhe nos arquivos que já existem lá, não crie outro projeto.';
1761
+ }
1762
+
1763
+ /* O chat não passa pelo runAct, e é no runAct (buildMemoryContext) que as
1764
+ instruções do projeto entram. Sem isto o PRIMO.md valeria para o agente e
1765
+ seria ignorado quando o modo auto manda o pedido para a conversa. */
1766
+ function comInstrucoes(history) {
1767
+ const dir = state.currentProject || state.workDir ? projectDir() : null;
1768
+ let texto = mencoesLib.instrucoesDoProjeto(dir);
1769
+ // A memória do AGENTS.md também vale no chat, enquanto o resumo não a tem.
1770
+ const daPasta = dir && !memoria.jaDobrou(state.memoria, dir) ? agentsMd.ler(dir) : '';
1771
+ if (daPasta) texto = [texto, `[AGENTS.md — memória desta pasta: de onde a conversa parou]\n${daPasta}`].filter(Boolean).join('\n\n');
1772
+ return texto ? [{ role: 'system', content: texto }, ...history] : history;
1773
+ }
1774
+
1775
+ // O chat também precisa parar no Esc Esc. Sem isto o texto continuava saindo
1776
+ // na tela depois de o usuário ter mandado parar.
1777
+ let chatEmVoo = null;
1778
+
1779
+ /* O ouvinte de voz em segundo plano.
1780
+ Um por sessão: dois processos disputando o mesmo microfone dão um vazio
1781
+ intermitente que parece defeito de hardware e não é. */
1782
+ let vozPainel = null; // /voice painel: só o HUD
1783
+ let vozEmEspera = null; // a sessão do /voice: { processo, falar, calar }
1784
+ /* Por onde a fala entra no terminal. Nasce no main(), junto da fila — é lá
1785
+ que moram o `busy`, a fila e o `ask` pendente. */
1786
+ let entradaDeVoz = null;
1787
+
1788
+ async function runChat(promptForModel, userTextForMemory) {
1789
+ chatEmVoo = new AbortController();
1790
+ const sp = new Spinner(ui.PENSANDO).start();
1791
+ const saida = fala.fluxo();
1792
+ let text = '';
1793
+ // O chat não tinha a paciência do agente: o primeiro 429 ou teto do
1794
+ // minuto saía em vermelho na tela, na primeira recusa. Agora o que é
1795
+ // passageiro (minuto, 429, 5xx, rede) espera a janela e repete calado,
1796
+ // com o spinner de pensar girando — até seis vezes. O que NÃO é
1797
+ // passageiro (crédito, chave, cota do dia) continua saindo, como aviso.
1798
+ // Texto já na tela não se repete: se o erro veio no meio da resposta, ela
1799
+ // fica como está e o aviso vem embaixo.
1800
+ for (let tentativa = 0; ; tentativa++) {
1801
+ let erro = null;
1802
+ try {
1803
+ await api.requestChat(state.config.server, {
1804
+ prompt: promptForModel,
1805
+ history: comInstrucoes(memoria.paraEnviar(state.memoria, state.history, contextoDoProjeto())),
1806
+ model: state.config.model,
1807
+ token: state.config.token,
1808
+ sinal: chatEmVoo.signal,
1809
+ }, (evt) => {
1810
+ if (evt.erro) { erro = evt.erro; return; }
1811
+ if (evt.delta) {
1812
+ if (!saida.escreveu()) sp.stop();
1813
+ text += evt.delta;
1814
+ saida.escrever(evt.delta);
1815
+ }
1816
+ });
1817
+ } catch (e) { erro = e; }
1818
+ if (!erro) break;
1819
+ const passageiro = ehTetoDeToken(erro) || ehTransitorio(erro);
1820
+ if (passageiro && tentativa < 6 && !text && !chatEmVoo.signal.aborted) {
1821
+ await new Promise((r) => setTimeout(r, esperaDoErro(erro, tentativa + 1)));
1822
+ continue;
1823
+ }
1824
+ sp.stop();
1825
+ saida.fechar();
1826
+ if (!chatEmVoo.signal.aborted) fala.problema(erro);
1827
+ if (!text) return;
1828
+ break;
1829
+ }
1830
+ sp.stop();
1831
+ saida.fechar();
1832
+ if (text) {
1833
+ state.history.push({ role: 'user', content: userTextForMemory });
1834
+ state.history.push({ role: 'assistant', content: text });
1835
+ resumirDepois();
1836
+ state.lastResponse = text;
1837
+ cfg.appendHistory({ mode: 'chat', prompt: userTextForMemory });
1838
+ state.gravador.turno(userTextForMemory, text, { modo: 'chat' });
1839
+ }
1840
+ }
1841
+
1842
+ // ── Slash commands ─────────────────────────────────────────────────────
1843
+
1844
+ function isSlash(text) { return text.trim().startsWith('/'); }
1845
+
1846
+ /* ── "!comando" RODA NO SHELL ────────────────────────────────────────────
1847
+ *
1848
+ * "quando eu mande uma mensagem que comece com ! ele rode em bash"
1849
+ *
1850
+ * Por que não mandar ao agente e deixar ele chamar run_shell: porque são
1851
+ * coisas diferentes. Pedir ao agente é dizer o QUE se quer e deixá-lo
1852
+ * decidir; o "!" é dizer o COMANDO. Quem digita `!git status` não quer que
1853
+ * alguém interprete a intenção — quer a saída do git status, agora, sem
1854
+ * volta ao modelo, sem gastar cota e sem o risco de o agente achar que
1855
+ * entendeu melhor.
1856
+ *
1857
+ * A saída sai CRUA, como no terminal: ela não passa pelo desenhador de
1858
+ * Markdown. Saída de comando tem alinhamento próprio (colunas do `ls`,
1859
+ * tabela do `docker ps`), e reformatá-la seria estragá-la.
1860
+ */
1861
+ function ehBash(text) { return /^\s*!/.test(String(text || '')); }
1862
+
1863
+ async function rodarBash(text) {
1864
+ const comando = String(text).replace(/^\s*!/, '').trim();
1865
+ if (!comando) return;
1866
+
1867
+ const pasta = state.workDir || process.cwd();
1868
+ console.log('');
1869
+ console.log(' ' + c.warn('$ ') + c.white(comando));
1870
+
1871
+ const inicio = Date.now();
1872
+ const r = await tools.execute('run_shell', { command: comando, timeout: 600000 },
1873
+ { projectDir: pasta });
1874
+ const segundos = ((Date.now() - inicio) / 1000).toFixed(1);
1875
+
1876
+ /* Crua, e inteira. `run_shell` corta em 10 MB, que é o teto do buffer;
1877
+ cortar mais aqui esconderia justamente a linha do erro, que costuma
1878
+ estar no fim. */
1879
+ const saida = [r.stdout, r.stderr].filter((x) => String(x || '').trim()).join('\n');
1880
+ if (saida) console.log(saida.replace(/\n$/, ''));
1881
+
1882
+ if (r.ok) {
1883
+ console.log(' ' + c.dim(`ok · ${segundos}s`));
1884
+ } else if (r.killed) {
1885
+ console.log(' ' + c.warn(`interrompido depois de ${segundos}s`));
1886
+ } else {
1887
+ console.log(' ' + c.warn(`saiu com ${r.code} · ${segundos}s`));
1888
+ }
1889
+ console.log('');
1890
+
1891
+ /* O agente FICA SABENDO, e isto é o que torna o "!" útil dentro de uma
1892
+ conversa: rodar o teste e depois perguntar "por que falhou?" só
1893
+ funciona se ele tiver visto a saída. Sem isto seriam dois mundos
1894
+ separados na mesma tela. */
1895
+ state.history.push({ role: 'user', content: `Rodei no shell: ${comando}` });
1896
+ state.history.push({
1897
+ role: 'assistant',
1898
+ content: `Saída (código ${r.code ?? 0}):\n${saida.slice(0, 4000) || '(vazia)'}`,
1899
+ });
1900
+ resumirDepois();
1901
+ }
1902
+
1903
+ /* ── OS NOMES ANTIGOS ────────────────────────────────────────────────────
1904
+ * Os comandos são todos em inglês curto e o nome antigo NÃO some: ele responde
1905
+ * e ensina o novo. Sumir de vez faz quem tem o dedo viciado achar que a
1906
+ * atualização quebrou — e essa pessoa não procura no /help, desinstala.
1907
+ * A tabela (apelido → nome novo, e os 9 grupos) mora em lib/nomes.js. */
1908
+
1909
+ /* Abrir uma conversa salva e seguir dela. Uma função só, para o /chats n e o
1910
+ `primo -c` carregarem a conversa do MESMO jeito: dois caminhos divergiriam
1911
+ no primeiro detalhe (a memória, o gravador) e um deles gravaria errado. */
1912
+ async function abrirConversa(alvo) {
1913
+ const sp = new Spinner('abrindo').start();
1914
+ const conv = await nuvem.lerConversa(alvo.id);
1915
+ sp.stop();
1916
+ if (!conv.ok) return conv;
1917
+ // A memória entra ZERADA: o resumo antigo não veio junto, e um
1918
+ // resumo de outra conversa colado aqui faria o modelo responder
1919
+ // sobre coisa que não foi dita nesta.
1920
+ state.history = conv.mensagens.map((m) => ({
1921
+ role: m.papel, content: m.texto,
1922
+ }));
1923
+ state.memoria = memoria.nova();
1924
+ state.gravador.retomar(alvo.id, alvo.titulo, conv.mensagens.length);
1925
+ return conv;
1926
+ }
1927
+
1928
+ /* `primo --continue` / `primo -c`: volta na última conversa, sem passar pelo
1929
+ /chats. A lista do servidor já vem da mais recente para a mais antiga, então
1930
+ a última é a primeira. Sem conta ou sem conversa, começa do zero e diz. */
1931
+ async function continuarUltima() {
1932
+ if (!conta.atual()) {
1933
+ console.log(c.dim(' ⎿ sem conta conectada, não há conversa para continuar — começando do zero'));
1934
+ return false;
1935
+ }
1936
+ const l = await nuvem.listarConversas({ limite: 1 });
1937
+ const alvo = l.ok && l.conversas[0];
1938
+ if (!alvo) {
1939
+ console.log(c.dim(' ⎿ nenhuma conversa salva ainda — começando do zero'));
1940
+ return false;
1941
+ }
1942
+ const conv = await abrirConversa(alvo);
1943
+ if (!conv.ok) {
1944
+ console.log(c.dim(` ⎿ não consegui abrir a última conversa (${conv.error}) — começando do zero`));
1945
+ return false;
1946
+ }
1947
+ const quando = alvo.atualizada ? new Date(alvo.atualizada).toLocaleString('pt-BR') : 'data desconhecida';
1948
+ console.log(c.dim(` ⎿ continuando: ${alvo.titulo.slice(0, 60)} (${quando})`));
1949
+ return true;
1950
+ }
1951
+
1952
+ /* /resume e --resume: sem referência lista as conversas; com número ou id, retoma. */
1953
+ async function retomarConversa(ref, { listar = true } = {}) {
1954
+ if (!conta.atual()) { console.log(c.muted(' Não conectado. ') + c.brand('/login') + c.muted(' para retomar conversas.')); return false; }
1955
+ const l = await nuvem.listarConversas({ limite: 20 });
1956
+ if (!l.ok) { console.log(c.err(` ${l.error}`)); return false; }
1957
+ if (!l.conversas.length) { console.log(c.muted(' Nenhuma conversa salva ainda.')); return false; }
1958
+ if (!ref) {
1959
+ if (!listar) return false;
1960
+ console.log(c.white('\n Conversas recentes'));
1961
+ l.conversas.forEach((x, i) => console.log(' ' + c.dim(String(i + 1).padStart(2)) + ' ' + c.white(x.titulo.slice(0, 52).padEnd(52))
1962
+ + c.dim(`${String(x.mensagens).padStart(3)} msg ${x.atualizada ? new Date(x.atualizada).toLocaleDateString('pt-BR') : '—'}`)));
1963
+ console.log(c.dim('\n /resume <número ou id> retoma.'));
1964
+ return false;
1965
+ }
1966
+ const alvo = retomar.escolher(l.conversas, ref);
1967
+ if (!alvo) { console.log(c.err(` Não achei a conversa ${ref}.`)); return false; }
1968
+ const conv = await abrirConversa(alvo);
1969
+ if (!conv.ok) { console.log(c.err(` ${conv.error}`)); return false; }
1970
+ console.log(c.ok(` ${alvo.titulo}`) + c.muted(` · ${conv.mensagens.length} mensagens carregadas`));
1971
+ return true;
1972
+ }
1973
+
1974
+ /* `--resume` sem id: mostra a lista e pergunta o número (só em terminal). */
1975
+ async function escolherNaAbertura() {
1976
+ await retomarConversa(null);
1977
+ if (!process.stdin.isTTY) return false;
1978
+ const rl = require('readline').createInterface({ input: process.stdin, output: process.stdout });
1979
+ const resp = await new Promise((res) => rl.question(' Qual? (número, Enter cancela) ', res));
1980
+ rl.close();
1981
+ return resp.trim() ? retomarConversa(resp.trim()) : false;
1982
+ }
1983
+
1984
+ /* /worktree <nome>: cria e entra. */
1985
+ function entrarNoWorktree(nome) {
1986
+ const w = retomar.criarWorktree(nome, projectDir());
1987
+ if (!w.ok) { console.log(c.err(` ${w.error}`)); return false; }
1988
+ entrarNoProjeto(w.path, '/dir');
1989
+ console.log(c.ok(` worktree ${shortPath(w.path)}`) + c.muted(` · branch ${w.branch}`));
1990
+ return true;
1991
+ }
1992
+
1993
+ /* /new sem nada: as 3 perguntas (era o /new). */
1994
+ async function comecarPerguntas() {
1995
+ const comecar = require('./comecar');
1996
+ let oque = (await ask(' O que você quer criar? Conte do seu jeito. (Enter: ver ideias)\n > ')).trim();
1997
+ if (!oque) {
1998
+ // Sem ideia não é motivo pra desistir: mostra por onde começar.
1999
+ console.log(c.muted('\n Algumas ideias pra começar:'));
2000
+ comecar.IDEIAS.forEach((ideia, i) => console.log(` ${c.brand(String(i + 1))} ${ideia}`));
2001
+ oque = comecar.escolherIdeia(await ask('\n Escolha um número, ou escreva a sua ideia (Enter cancela)\n > ')) || '';
2002
+ }
2003
+ if (!oque) { console.log(c.muted(' Tudo bem, sem pressa. Quando quiser, é só digitar /new de novo.')); return; }
2004
+ console.log(c.muted(` → ${oque}`));
2005
+ const praQuem = (await ask(' Pra quem é? (Enter pula)\n > ')).trim();
2006
+ const onde = (await ask(' Abre onde: no navegador, no celular, ou tanto faz? (Enter pula)\n > ')).trim();
2007
+ await criarProjetoNovo(comecar.montarPedidoComecar({ oque, praQuem, onde }));
2008
+ // quem acabou de fazer o primeiro app não sabe que pode conferir nem voltar: é a hora de contar
2009
+ console.log(c.muted(`\n ${comecar.DEPOIS_DO_PRIMEIRO_APP}`));
2010
+ return;
2011
+ }
2012
+
2013
+ /* /attach <url>: a página vira texto e vai junto do próximo pedido (lib/web-pagina.js). */
2014
+ async function anexarPagina(rest) {
2015
+ const sp = new Spinner('lendo a página').start();
2016
+ const r = await require('../web-pagina.js').baixar(rest.trim());
2017
+ sp.stop();
2018
+ if (!r.ok) { console.log(c.err(` Não anexei: ${r.error}.`)); return; }
2019
+ state.attachedFiles.push({ path: r.url, content: (r.titulo ? `# ${r.titulo}\n\n` : '') + r.texto });
2020
+ console.log(c.ok(` Anexei: ${r.titulo || r.url}`) + c.muted(` · ${r.palavras} palavras${r.cortado ? ' (o começo da página)' : ''}`));
2021
+ console.log(c.muted(' Vai junto do próximo pedido. /attach mostra, /detach tira.'));
2022
+ refreshPrompt();
2023
+ return;
2024
+ }
2025
+
2026
+ /* /attach sem nada: o que está anexado. */
2027
+ function listarAnexos() {
2028
+ if (!state.attachedFiles.length) console.log(c.muted('Nenhum arquivo anexado.'));
2029
+ else state.attachedFiles.forEach((f) => console.log(` ${c.brand(f.path)} ${c.muted(tools.fmtBytes(f.content.length))}`));
2030
+ }
2031
+
2032
+ /* /help all: tudo que ele sabe fazer (lib/skill/catalogo.js). */
2033
+ function mostrarTudo() {
2034
+ const cols = Math.max(40, Math.min(process.stdout.columns || 90, 110));
2035
+ console.log('');
2036
+ for (const g of catalogo.GRUPOS) {
2037
+ console.log(' ' + c.bold(c.white(g.nome)) + ' ' + ui.truncate(c.dim('— ' + g.resumo), cols - 4 - ui.visibleWidth(g.nome)));
2038
+ for (const i of g.itens) {
2039
+ console.log(' ' + c.brand(ui.padRight(i.tool, 23)) + ui.truncate(c.muted(i.faz), cols - 28));
2040
+ }
2041
+ console.log('');
2042
+ }
2043
+ console.log(c.dim(` ${catalogo.TODAS.length} ferramentas. Você não precisa saber nenhum desses nomes — peça em português.`));
2044
+ return;
2045
+ }
2046
+
2047
+ /* /taste referencias: a tela pra soltar os motions que você curtiu. */
2048
+ async function abrirReferencias() {
2049
+ const G = require('../plugin/estudio/gosto.js');
2050
+ console.log(c.muted(process.env.PRIMOCODE_APP === '1' ? ' Abri a tela do gosto (até 10 min): solte os vídeos que você curtiu e salve.' : ' Abri uma tela no navegador (até 10 min): solte os vídeos que você curtiu e salve.'));
2051
+ const r = await G.abrirOndeDer({ inicio: 'referencias' });
2052
+ if (!r.ok) console.log(c.warn(r.motivo === 'pulou' ? ' Você pulou: nada foi salvo.' : r.motivo === 'tempo' ? ' Acabou o tempo: nada foi salvo.' : r.motivo === 'fechou' ? ' Você fechou a tela: nada foi salvo.' : ' Não consegui abrir a tela.'));
2053
+ const rs = G.resumo(G.ler());
2054
+ console.log(rs ? c.muted(' ') + rs : c.muted(' Ainda não tem gosto salvo. /taste referencias abre a tela.'));
2055
+ return;
2056
+ }
2057
+
2058
+ /* /doctor status: só o servidor, a versão e a conversa. */
2059
+ async function mostrarStatus() {
2060
+ const sp = new Spinner('verificando').start();
2061
+ try {
2062
+ const h = await api.getHealth(state.config.server, state.config.token);
2063
+ sp.stop();
2064
+ console.log(c.ok(`Servidor: ${h.status || 'ok'}`));
2065
+ if (h.version) console.log(c.muted(` Versão: ${h.version}`));
2066
+ if (h.model) console.log(c.muted(` Modelo: ${h.model}`) + (h.gratis ? c.dim(' · grátis') : ''));
2067
+ // A corrente inteira: é o que garante que um modelo no limite não
2068
+ // vira erro na sua tela.
2069
+ if (h.correntes && h.correntes[state.config.model || 'main']) {
2070
+ const fila = h.correntes[state.config.model] || h.correntes.main;
2071
+ console.log(c.dim(` Reservas: ${fila.length - 1}`));
2072
+ }
2073
+ } catch (e) { sp.stop(); console.log(c.err(`Indisponível: ${e.message}`)); }
2074
+ // A memória da conversa: quanto ela está poupando por pedido.
2075
+ if (state.history.length) {
2076
+ const e = memoria.economia(state.memoria, state.history);
2077
+ console.log(c.muted(` Conversa: ${state.history.length} mensagens`)
2078
+ + (state.memoria.resumo
2079
+ ? c.dim(` · resumida, ${e.enxuto} tokens por pedido em vez de ${e.cheio}`)
2080
+ : c.dim(` · ${e.enxuto} tokens por pedido`)));
2081
+ }
2082
+ return;
2083
+ }
2084
+
2085
+ /* /account plans: os planos e o link pra assinar. */
2086
+ async function mostrarPlanos() {
2087
+ const sp = new Spinner('buscando os planos').start();
2088
+ const r = await planosTela.buscarPlanos(state.config.server);
2089
+ sp.stop();
2090
+ const eu = conta.atual();
2091
+ for (const l of planosTela.desenhar(r, { cores: c, atual: eu && eu.pro ? eu.plano : null, site: conta.SITE })) console.log(l);
2092
+ return;
2093
+ }
2094
+
2095
+ async function handleSlash(text) {
2096
+ const [cmd] = text.trim().slice(1).split(/\s+/);
2097
+ const restoDigitado = text.trim().slice(1 + cmd.length).trim();
2098
+
2099
+ let nome = cmd.toLowerCase();
2100
+ const apelido = nomes.ehApelido(nome);
2101
+ // O comando da própria pessoa com o nome antigo (um ~/.primocode/comandos/revisar.md) ganha do apelido.
2102
+ const dela = apelido && comandosDaPessoa().find((x) => x.nome === nome && x.origem !== 'primocode');
2103
+ let rest = restoDigitado;
2104
+ if (apelido && !dela) {
2105
+ const junto = nomes.PREFIXO[nome];
2106
+ console.log(c.muted(' Agora é ') + c.brand('/' + apelido + (junto ? ' ' + junto : '')) + c.muted('.'));
2107
+ nome = apelido;
2108
+ if (junto) rest = `${junto} ${restoDigitado}`.trim(); // /account plans vira /account plans
2109
+ }
2110
+
2111
+ switch (nome) {
2112
+ case 'help': if (/^(all|tudo)$/i.test(rest)) mostrarTudo(); else console.log(montarHelp()); break;
2113
+
2114
+ case 'resume': await retomarConversa(rest); break;
2115
+ case 'worktree':
2116
+ if (!rest) console.log(c.muted(' Uso: /worktree <nome> (cria ../<repo>-<nome> numa branch nova e entra)'));
2117
+ else entrarNoWorktree(rest.split(/\s+/)[0]);
2118
+ break;
2119
+
2120
+ /* /projetos e /project sem nome são a MESMA lista: antes o /project só
2121
+ listava os nomes, em ordem alfabética, e quem procurava "o de ontem"
2122
+ tinha de abrir pasta por pasta. Agora vem do mais recente, com
2123
+ quando mexeu e o tamanho, e um número para entrar. */
2124
+ case 'estudio': case 'agentes': case 'piloto': case 'avisos': case 'buscar': {
2125
+ const r = require('../cli-nova.js').COMANDOS[nome](rest, { c, dir: process.env.PRIMOCODE_AGENTES });
2126
+ for (const l of r.linhas) console.log(l);
2127
+ if (r.pedido) await sendPrompt(`${r.instrucao}\n\nPEDIDO: ${r.pedido}`);
2128
+ break;
2129
+ }
2130
+
2131
+ case 'projects': {
2132
+ if (/^(criar|novo|editar|arquivar)\b/.test(rest)) {
2133
+ for (const l of require('../cli-nova.js').projetos(rest, { c }).linhas) console.log(l);
2134
+ break;
2135
+ }
2136
+ const lista = extra.listarProjetos(cfg.ROOT_DIR);
2137
+ const numero = /^\d+$/.test(rest) ? Number(rest) : 0;
2138
+ if (!rest || (numero && cmd.toLowerCase() === 'projetos') || (numero && numero <= lista.length)) {
2139
+ if (!lista.length) { console.log(c.muted(' Nenhum projeto ainda. Peça algo e eu crio o primeiro.')); break; }
2140
+ if (numero) {
2141
+ const alvo = lista[numero - 1];
2142
+ if (!alvo) { console.log(c.err(` Não há projeto ${numero}. São ${lista.length}.`)); break; }
2143
+ entrarNoProjeto(alvo.dir, 'projeto');
2144
+ console.log(c.ok(` Trabalhando em ${alvo.nome}`) + c.muted(` (${shortPath(alvo.dir)})`));
2145
+ refreshPrompt();
2146
+ break;
2147
+ }
2148
+ console.log('');
2149
+ const largura = Math.min(34, Math.max(...lista.map((x) => x.nome.length)));
2150
+ lista.forEach((x, i) => {
2151
+ const aqui = x.nome === state.currentProject;
2152
+ const nomeCol = ui.padRight(ui.truncate(aqui ? c.brand(x.nome) : c.white(x.nome), largura), largura);
2153
+ console.log(` ${aqui ? c.brand('●') : ' '} ${c.dim(String(i + 1).padStart(2))} ${nomeCol} `
2154
+ + c.muted(ui.padRight(extra.quandoFoi(x.modificado), 11))
2155
+ + c.dim(`${extra.fmtTamanho(x.bytes)}${x.cortado ? '+' : ''} · ${x.arquivos} arq.`));
2156
+ });
2157
+ console.log(c.dim(`\n ${shortPath(cfg.ROOT_DIR)} · /projects 1 entra no primeiro · /new <descrição> começa outro`));
2158
+ break;
2159
+ }
2160
+ const dir = cfg.createProjectDir(rest);
2161
+ entrarNoProjeto(dir, 'projeto');
2162
+ console.log(c.ok(`Projeto: ${state.currentProject}`) + c.muted(` (${dir})`));
2163
+ refreshPrompt();
2164
+ break;
2165
+ }
2166
+
2167
+ // Antes só existia /project, que SEMPRE cria em ~/primocode/<nome>. Se a
2168
+ // sua pasta já existe em outro lugar, não havia como apontar para ela.
2169
+ case 'dir': {
2170
+ if (!rest) {
2171
+ const de = {
2172
+ padrao: 'a pasta padrão do PrimoCode',
2173
+ '/dir': 'você escolheu com /dir',
2174
+ detectada: 'você falou dela no pedido',
2175
+ projeto: 'projeto do PrimoCode',
2176
+ };
2177
+ console.log(` ${c.white(shortPath(projectDir()))}`);
2178
+ console.log(c.muted(` ${de[state.workDirOrigem] || 'pasta atual do terminal'}`));
2179
+ console.log(c.dim(' /dir <caminho> muda · /project <nome> cria uma nova em ~/primocode'));
2180
+ break;
2181
+ }
2182
+
2183
+ // ~ e caminho relativo resolvem contra a pasta ativa, não contra o
2184
+ // cwd do processo: depois de um /dir, "src" é dentro dela.
2185
+ const bruto = rest.replace(/^~(?=$|[/\\])/, os.homedir());
2186
+ const alvo = path.resolve(projectDir(), bruto);
2187
+
2188
+ if (!fs.existsSync(alvo)) {
2189
+ if (!(await confirm(`A pasta ${shortPath(alvo)} não existe. Criar?`))) {
2190
+ console.log(c.muted(' Nada mudou.'));
2191
+ break;
2192
+ }
2193
+ try { fs.mkdirSync(alvo, { recursive: true }); }
2194
+ catch (e) { console.log(c.err(` Não consegui criar: ${e.message}`)); break; }
2195
+ } else if (!fs.statSync(alvo).isDirectory()) {
2196
+ console.log(c.err(` ${shortPath(alvo)} é um arquivo, não uma pasta.`));
2197
+ break;
2198
+ }
2199
+
2200
+ // A home e a raiz do disco são recusadas por padrão em qualquer
2201
+ // lugar do código — aqui o pedido é explícito, então pergunta em vez
2202
+ // de recusar, mas pergunta mesmo: é onde um write_file erra feio.
2203
+ if (!pastaSegura(alvo)) {
2204
+ console.log(c.warn(` ${shortPath(alvo)} é a sua home ou a raiz do disco.`));
2205
+ if (!(await confirm('O agente pode criar e editar arquivos aí. Confirma?'))) {
2206
+ console.log(c.muted(' Nada mudou.'));
2207
+ break;
2208
+ }
2209
+ }
2210
+
2211
+ entrarNoProjeto(alvo, '/dir');
2212
+ const quantos = (() => { try { return fs.readdirSync(alvo).length; } catch { return 0; } })();
2213
+ console.log(c.ok(` Trabalhando em ${shortPath(alvo)}`) + c.muted(` (${quantos} ${quantos === 1 ? 'item' : 'itens'})`));
2214
+ refreshPrompt();
2215
+ break;
2216
+ }
2217
+
2218
+ /* Quando ele pergunta antes de agir. Os três modos e o porquê de cada
2219
+ um estão em lib/permission/perigo.js. */
2220
+ /* Os motions que a pessoa curtiu: ela solta os vídeos na tela e o PrimoCode mede e soma no gosto (gosto-medir.js). */
2221
+
2222
+ /* O gosto de motion: a tela abre sozinha no primeiro estudio_motion; aqui dá pra ver, refazer ou apagar. */
2223
+ case 'taste': {
2224
+ const G = require('../plugin/estudio/gosto.js');
2225
+ const a = String(rest || '').trim().toLowerCase();
2226
+ if (/^(referencias|ref|refs)$/.test(a)) { await abrirReferencias(); break; }
2227
+ if (a === 'apagar') {
2228
+ try { fs.unlinkSync(G.arquivo()); console.log(c.ok(' Gosto de motion apagado. O próximo motion pergunta de novo.')); }
2229
+ catch { console.log(c.muted(' Não havia gosto salvo.')); }
2230
+ break;
2231
+ }
2232
+ if (a === 'refazer') {
2233
+ console.log(c.muted(' Abri uma tela no navegador (até 10 min). Feche ou pule pra voltar.'));
2234
+ const r = await G.abrirOndeDer();
2235
+ if (!r.ok) console.log(c.warn(r.motivo === 'pulou' ? ' Você pulou: sem gosto salvo.' : r.motivo === 'tempo' ? ' Acabou o tempo: nada foi salvo.' : ' Não consegui abrir a tela.'));
2236
+ } else if (/^provar\b/.test(a)) {
2237
+ const assunto = String(rest).trim().replace(/^provar\s*/i, '') || 'um vídeo de apresentação';
2238
+ const P = require('../plugin/estudio/gosto-prova.js');
2239
+ for (const l of P.texto(P.provar(G.pesos(G.ler()), { assunto }), assunto)) console.log(' ' + l);
2240
+ break;
2241
+ } else if (/^for[cç]a\s+\S/.test(a)) {
2242
+ const r = G.definirForca(a.replace(/^for[cç]a\s+/, ''));
2243
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
2244
+ console.log(c.ok(` Força das referências: ${{ pouco: 'pouco (só sugerem)', medio: 'médio', muito: 'muito (puxam forte)' }[r.forca]}.`));
2245
+ } else if (/^salvar\s+\S/.test(a)) {
2246
+ const r = G.salvarEstilo(String(rest).trim().replace(/^salvar\s+/i, ''));
2247
+ console.log(r.ok ? c.ok(` Estilo "${r.nome}" salvo. /taste usar ${r.nome} volta pra ele quando quiser.`) : c.err(` ${r.error}`));
2248
+ break;
2249
+ } else if (/^usar\s+\S/.test(a)) {
2250
+ const r = G.usarEstilo(String(rest).trim().replace(/^usar\s+/i, ''));
2251
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
2252
+ console.log(c.ok(` Agora o gosto em uso é o "${r.nome}".`));
2253
+ } else if (a === 'estilos') {
2254
+ const lista = G.estilos();
2255
+ console.log(lista.length ? ' Estilos salvos: ' + lista.join(', ') + c.muted(' · /taste usar <nome>') : c.muted(' Nenhum estilo salvo ainda. /taste salvar <nome> guarda o gosto de agora.'));
2256
+ break;
2257
+ } else if (/^tirar\s+\d+$/.test(a)) {
2258
+ const g = G.tirarReferencia(a.split(/\s+/)[1]);
2259
+ console.log(g ? c.ok(` Referência ${a.split(/\s+/)[1]} tirada.`) : c.err(' Não tem essa referência. /taste mostra os números.'));
2260
+ } else if (a && a !== 'ver') { console.log(c.err('Uso: /taste [refazer|apagar|tirar N|força pouco/médio/muito|provar [assunto]|salvar <nome>|usar <nome>|estilos]')); break; }
2261
+ const linhas = G.listar(G.ler());
2262
+ if (!linhas.length) { console.log(c.muted(' Ainda não tem gosto salvo. /taste refazer abre a tela, e /taste referencias recebe os vídeos que você curtiu.')); break; }
2263
+ for (const l of linhas) console.log(/^\s*"/.test(l) ? c.muted(' ' + l) : ' ' + l);
2264
+ if ((G.ler().referencias || []).length) console.log(c.muted(' /taste tirar N tira um vídeo · /taste referencias traz mais'));
2265
+ break;
2266
+ }
2267
+ /* A memória entre sessões (lib/memoria-usuario.js): ver, esquecer, achar a pasta. */
2268
+ case 'memory': {
2269
+ const M = require('../memoria-usuario.js');
2270
+ const [sub, ...resto] = String(rest || '').trim().split(/\s+/);
2271
+ const a = (sub || '').toLowerCase();
2272
+ if (a === 'pasta') { console.log(c.muted(' ') + M.pasta()); break; }
2273
+ if (a === 'esquecer') {
2274
+ const alvo = resto.join(' ');
2275
+ if (!alvo) { console.log(c.err('Uso: /memory esquecer <nome>')); break; }
2276
+ const r = M.apagar(alvo);
2277
+ console.log(r.ok ? c.ok(` Esqueci "${r.nome}".`) : c.err(' ' + r.error));
2278
+ break;
2279
+ }
2280
+ if (a) { console.log(c.err('Uso: /memory [esquecer <nome> | pasta]')); break; }
2281
+ const lista = M.listar();
2282
+ if (!lista.length) { console.log(c.muted(' Ainda não lembro de nada. Conforme você trabalha, eu vou anotando.')); break; }
2283
+ console.log('');
2284
+ for (const m of lista) console.log(' ' + c.brand(m.nome) + c.dim(` (${m.tipo})`) + c.muted(' — ' + m.descricao));
2285
+ console.log(c.dim(`\n ${lista.length} memórias · /memory esquecer <nome> · /memory pasta`));
2286
+ break;
2287
+ }
2288
+ case 'sandbox': {
2289
+ const sb = require('../permission/sandbox.js');
2290
+ const [a, b] = String(rest || '').toLowerCase().split(/\s+/);
2291
+ if (a === 'on' || a === 'off') sb.salvar({ ligado: a === 'on' });
2292
+ else if (a === 'rede' && (b === 'on' || b === 'off')) sb.salvar({ rede: b === 'on' });
2293
+ else if (a === 'ssh' && (b === 'on' || b === 'off')) sb.salvar({ ssh_agent: b === 'on' });
2294
+ else if (a && a !== 'status') { console.log(c.err('Uso: /sandbox [on|off|rede on|rede off|ssh on|ssh off|status]')); break; }
2295
+ const e = sb.estado();
2296
+ console.log(c.muted(' Sandbox: ') + (e.ativo ? c.ok('ligado') : c.warn(e.ligado ? 'ligado, mas sem mecanismo neste computador' : 'desligado'))
2297
+ + c.muted(` · mecanismo: ${e.mecanismo || 'nenhum'} · rede: ${e.rede ? 'aberta' : 'bloqueada'} · ssh-agent: ${e.ssh_agent ? 'liberado' : 'fora'} · modo: ${e.modo}`));
2298
+ console.log(c.dim(' Escreve só no projeto, /tmp e ~/.primocode/cache; não lê ~/.ssh, ~/.aws, ~/.npmrc, a sua conta do PrimoCode e outros arquivos de credencial, nem .env*.'));
2299
+ console.log(c.dim(` ${e.rede ? 'Com a rede aberta, o que o comando LÊ pode sair pela internet: a lista acima é o que fica protegido. ' : ''}Detalhes: docs/sandbox.md`));
2300
+ break;
2301
+ }
2302
+ case 'perms': {
2303
+ const DIZ = {
2304
+ auto: 'roda tudo, mas pergunta antes do que não tem volta (apagar fora do projeto, push --force, sudo…)',
2305
+ perguntar: 'pergunta antes de todo comando e de toda escrita de arquivo',
2306
+ livre: 'nunca pergunta — nem antes do que não tem volta',
2307
+ plano: 'só lê: recusa escrita e comando que muda coisa; investiga e entrega o plano',
2308
+ };
2309
+ const atual = perigo.normalizarModo(state.config.permissoes);
2310
+ if (!rest) {
2311
+ console.log(c.muted(' Agora: ') + c.brand(atual) + c.muted(' — ' + DIZ[atual]));
2312
+ for (const m of perigo.MODOS) console.log(` ${m === atual ? c.brand('● ' + m) : c.muted('○ ' + m)} ${c.dim(DIZ[m])}`);
2313
+ console.log(c.dim(' Use /perms auto|perguntar|livre|plano'));
2314
+ break;
2315
+ }
2316
+ const pedido = rest.toLowerCase();
2317
+ if (!perigo.MODOS.includes(perigo.normalizarModo(pedido)) || (perigo.normalizarModo(pedido) === 'auto' && pedido !== 'auto')) {
2318
+ console.log(c.err('Uso: /perms auto|perguntar|livre|plano'));
2319
+ break;
2320
+ }
2321
+ const m = perigo.normalizarModo(pedido);
2322
+ state.config.permissoes = m;
2323
+ cfg.saveConfig({ permissoes: m });
2324
+ console.log(c.ok(` Permissões: ${m}`) + c.muted(' — ' + DIZ[m]));
2325
+ if (m === 'livre') {
2326
+ console.log(' ' + c.warn('▸▸ Atenção: ele vai apagar, forçar push e usar sudo sem te perguntar.'));
2327
+ console.log(' ' + c.warn(' O que der errado pode não ter volta. /perms auto desfaz.'));
2328
+ }
2329
+ break;
2330
+ }
2331
+
2332
+ case 'mode': {
2333
+ const m = rest.toLowerCase();
2334
+ if (['primocode', 'chat', 'auto'].includes(m)) {
2335
+ state.mode = m;
2336
+ state.modoEfetivo = null;
2337
+ cfg.saveConfig({ mode: m });
2338
+ console.log(c.ok(`Modo: ${m}`) + (m === 'auto'
2339
+ ? c.muted(' — escolho por pedido: conversa vai pro chat, tarefa vai pro agente')
2340
+ : ''));
2341
+ refreshPrompt();
2342
+ } else console.log(c.err('Uso: /mode primocode|chat|auto'));
2343
+ break;
2344
+ }
2345
+
2346
+ // O /model virou /effort: você escolhe o ESFORÇO num slider (←/→,
2347
+ // Enter confirma, Esc cancela) e o modelo sai daí. Com argumento
2348
+ // ("/effort high") aplica direto, para quem já sabe o que quer.
2349
+ case 'effort': {
2350
+ const pedido = rest.toLowerCase().trim();
2351
+ if (pedido) {
2352
+ if (!effort.NOMES.includes(pedido)) {
2353
+ console.log(c.err(`Esforço inválido. Use: ${effort.NOMES.join(' | ')}`));
2354
+ break;
2355
+ }
2356
+ aplicarEffort(pedido);
2357
+ break;
2358
+ }
2359
+ const escolhido = await sliderEffort(state.config.effort);
2360
+ if (escolhido) aplicarEffort(escolhido);
2361
+ else console.log(c.muted(' Nada mudou.'));
2362
+ break;
2363
+ }
2364
+
2365
+ // Continua existindo para quem fixa um ID do OpenRouter na unha; o
2366
+ // caminho normal é o /effort.
2367
+ case 'model': {
2368
+ const m = rest.toLowerCase();
2369
+ if (m.includes('/')) {
2370
+ state.config.model = m;
2371
+ cfg.saveConfig({ model: m });
2372
+ console.log(c.ok(`Modelo fixo: ${m}`) + c.muted(' precisa aceitar tools no modo primocode'));
2373
+ console.log(c.dim(' Para voltar ao normal, use /effort.'));
2374
+ } else {
2375
+ console.log(c.muted(' O modelo agora vem do esforço. Use ') + c.brand('/effort') + c.muted('.'));
2376
+ console.log(c.dim(` Agora: ${state.config.effort} → modelo ${effort.modeloDe(state.config.effort)}`));
2377
+ }
2378
+ break;
2379
+ }
2380
+
2381
+ case 'attach': {
2382
+ if (!rest) { listarAnexos(); break; }
2383
+ if (/^https?:\/\//i.test(rest)) { await anexarPagina(rest); break; }
2384
+ try {
2385
+ // Relativo à pasta de trabalho (a do /dir), como o /read — não ao
2386
+ // terminal de onde o PrimoCode foi aberto.
2387
+ const content = fs.readFileSync(path.resolve(projectDir(), rest), 'utf-8');
2388
+ state.attachedFiles.push({ path: rest, content });
2389
+ console.log(c.ok(`Anexado: ${rest} (${tools.fmtBytes(content.length)})`));
2390
+ refreshPrompt();
2391
+ } catch { console.log(c.err(`Não consegui ler: ${rest}`)); }
2392
+ break;
2393
+ }
2394
+
2395
+ case 'init': {
2396
+ const alvo = path.join(projectDir(), 'PRIMO.md');
2397
+ if (fs.existsSync(alvo) && !(await confirm(`Já existe um PRIMO.md em ${shortPath(projectDir())}. Escrever outro por cima?`))) {
2398
+ console.log(c.muted(' Deixei o PRIMO.md como estava.'));
2399
+ break;
2400
+ }
2401
+ // Escrever arquivo pede o agente: no modo chat (ou num auto que
2402
+ // achasse que é conversa) o /init só responderia um texto.
2403
+ const modoAntes = state.mode;
2404
+ state.mode = 'primocode';
2405
+ // o /init reescreve o PRIMO.md inteiro: as regras do /regra voltam pro topo depois
2406
+ const regras = require('../regras.js');
2407
+ const guardadas = regras.ler(projectDir());
2408
+ try { await sendPrompt(PEDIDO_INIT); } finally {
2409
+ state.mode = modoAntes;
2410
+ if (regras.garantir(projectDir(), guardadas).length) console.log(c.muted(` As suas ${guardadas.length === 1 ? 'regra voltou' : guardadas.length + ' regras voltaram'} pro topo do PRIMO.md.`));
2411
+ }
2412
+ break;
2413
+ }
2414
+
2415
+ case 'detach': state.attachedFiles = []; console.log(c.ok('Anexos removidos.')); refreshPrompt(); break;
2416
+
2417
+
2418
+ // A lista vem de lib/skill/catalogo.js, e o test/catalogo.test.js cruza aquela
2419
+ // lista com as tools que o tools.execute realmente atende. Ou seja: esta
2420
+ // tela não consegue prometer coisa que o programa não faz.
2421
+
2422
+ /* ── /desfazer ────────────────────────────────────────────────
2423
+ * Quem não sabe git não tem como voltar uma edição ruim. Aqui volta:
2424
+ * cada pedido tirou uma foto do projeto (com git) ou guardou o
2425
+ * original dos arquivos que mexeu (sem git). */
2426
+ case 'undo': {
2427
+ const cps = checkpoint.lista(projectDir());
2428
+ const BK = require('../backup-banco.js');
2429
+ const hora = (iso) => new Date(iso).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
2430
+ if (!cps.length) {
2431
+ // sem foto do pedido (a pasta está fora do git, ou o banco é ignorado), a cópia do banco ainda volta
2432
+ const sobra = BK.pendentes(projectDir()).slice(-1)[0];
2433
+ if (!sobra) { console.log(c.muted(' Nada para desfazer nesta pasta.')); break; }
2434
+ console.log(c.muted(` Tem uma cópia do banco de ${hora(sobra.criado)}: ${sobra.arquivos.join(', ')}`));
2435
+ if (!(await confirm('Voltar o banco para essa cópia?'))) { console.log(c.muted('Cancelado.')); break; }
2436
+ for (const f of BK.restaurar(projectDir(), sobra)) console.log(f.acao === 'falhou' ? c.err(` falhou: ${f.erro} ${f.arquivo}`) : c.ok(' banco voltou ') + f.arquivo);
2437
+ break;
2438
+ }
2439
+ const quando = (cp) => new Date(cp.quando).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
2440
+ if (/^(lista|list|ls)$/i.test(rest)) {
2441
+ cps.forEach((cp, i) => console.log(` ${c.brand(String(i + 1).padStart(2))} ${c.dim(quando(cp))} `
2442
+ + `${c.white(cp.pedido.slice(0, 50) + (cp.pedido.length > 50 ? '…' : ''))} `
2443
+ + c.muted(`${cp.mudou.length} ${cp.mudou.length === 1 ? 'arquivo mudou' : 'arquivos mudaram'}`)
2444
+ + (cp.funcionava ? ` ${c.ok('✓ funcionava')}${cp.funcionava_como ? c.dim(' · ' + cp.funcionava_como) : ''}` : '')));
2445
+ console.log(c.muted('\n /undo N volta os N últimos pedidos.'));
2446
+ if (checkpoint.modo(projectDir()) === 'arquivo') {
2447
+ console.log(c.muted(' Sem git aqui: só volta o que o agente escreveu com as ferramentas de arquivo (não o que um comando apagou).'));
2448
+ }
2449
+ break;
2450
+ }
2451
+ // /desfazer fora: só o que o último pedido mudou sem você ter citado (lib/escopo.js)
2452
+ if (/^(fora|extras?)$/i.test(rest)) {
2453
+ // tirado do checkpoint (o pedido fica no manifest), não da memória: vale depois de fechar e abrir o PrimoCode
2454
+ const ultimo = cps[0];
2455
+ const fora = ultimo ? require('../escopo.js').foraDoPedido(ultimo.pedido, ultimo.mudou, projectDir()) : [];
2456
+ if (!fora.length) { console.log(c.muted(' O último pedido não mexeu em nada além do que você citou.')); break; }
2457
+ const feitos = checkpoint.desfazerArquivos(projectDir(), fora.map((f) => f.caminho));
2458
+ for (const f of feitos) console.log(f.acao === 'falhou' ? c.err(` ✗ ${shortPath(f.caminho)}: ${f.erro}`) : c.ok(` ↺ ${path.relative(projectDir(), f.caminho)}`) + c.dim(` (${f.acao})`));
2459
+ console.log(c.muted(' O que você pediu ficou. /undo volta o pedido inteiro.'));
2460
+ break;
2461
+ }
2462
+ const n = rest ? parseInt(rest, 10) : 1;
2463
+ if (!(n >= 1)) { console.log(c.err('Uso: /undo · /undo lista · /undo N · /undo fora')); break; }
2464
+ const alvo = cps.slice(0, n);
2465
+ console.log(c.muted(`\n Volta ${alvo.length === 1 ? 'o último pedido' : `os ${alvo.length} últimos pedidos`}:`));
2466
+ for (const cp of alvo) console.log(` ${c.dim(quando(cp))} ${c.white(cp.pedido.slice(0, 60))}`);
2467
+ const previa = checkpoint.previa(projectDir(), n);
2468
+ if (!previa.length) console.log(c.muted(' (o disco já está como estava antes)'));
2469
+ for (const a of previa.slice(0, 40)) console.log(c.muted(` ${a.acao} `) + shortPath(a.caminho));
2470
+ if (previa.length > 40) console.log(c.muted(` … e mais ${previa.length - 40}`));
2471
+ // a cópia do banco feita durante esses pedidos: a MAIS VELHA é o banco de antes de tudo
2472
+ const copiaDoBanco = BK.desde(projectDir(), alvo[alvo.length - 1].quando).slice(-1)[0];
2473
+ if (copiaDoBanco) console.log(c.muted(' banco ') + `volta pra cópia de ${hora(copiaDoBanco.criado)} (${copiaDoBanco.arquivos.join(', ')})`);
2474
+ if (!(await confirm('Desfazer?'))) { console.log(c.muted('Cancelado.')); break; }
2475
+ try { require('../placar.js').desfez(); } catch { /* placar é conveniência */ } // desfez logo depois do pedido: conta como perda do modelo
2476
+ for (const f of checkpoint.desfazer(projectDir(), n)) {
2477
+ const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
2478
+ console.log(rotulo + shortPath(f.caminho));
2479
+ }
2480
+ if (copiaDoBanco) for (const f of BK.restaurar(projectDir(), copiaDoBanco)) console.log(f.acao === 'falhou' ? c.err(` falhou: ${f.erro} ${f.arquivo}`) : c.ok(' banco voltou ') + f.arquivo);
2481
+ if (checkpoint.refazerDisponivel(projectDir())) console.log(c.muted('\n Mudou de ideia? ') + c.brand('/redo') + c.muted(' devolve.'));
2482
+ break;
2483
+ }
2484
+
2485
+ /* /refazer: o arrependimento do /desfazer. Só o último, e só enquanto
2486
+ nenhum pedido novo mexeu nos arquivos (lib/session/checkpoint.js). */
2487
+ case 'redo': {
2488
+ const volta = checkpoint.refazerDisponivel(projectDir());
2489
+ if (!volta) { console.log(c.muted(' Nada para refazer: o /redo só volta o último /undo, antes de um pedido novo mudar os arquivos.')); break; }
2490
+ console.log(c.muted(`\n Refaz ${volta.pedidos.length === 1 ? 'o pedido' : `os ${volta.pedidos.length} pedidos`}:`));
2491
+ for (const p of volta.pedidos) console.log(` ${c.white(String(p || '').slice(0, 60))}`);
2492
+ if (!(await confirm('Refazer?'))) { console.log(c.muted('Cancelado.')); break; }
2493
+ for (const f of checkpoint.refazer(projectDir())) {
2494
+ const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
2495
+ console.log(rotulo + shortPath(f.caminho));
2496
+ }
2497
+ break;
2498
+ }
2499
+
2500
+ /* /conferir: "funcionou / não funcionou" em português simples. Passou?
2501
+ O ponto fica marcado e o /restore sabe para onde ir. Falhou? Oferece
2502
+ a IA consertar com a saída do erro já na mão. */
2503
+ case 'check': {
2504
+ const achou = conferirLib.descobrir(projectDir());
2505
+ if (!achou && require('../pipeline.js').acharEntrada(projectDir())) {
2506
+ // sem script de teste, mas é uma página: abrir escondido e olhar é o teste que existe
2507
+ const spP = new Spinner('abrindo a página escondido pra conferir').start();
2508
+ let m = null;
2509
+ try { m = await require('../pipeline.js').medirNoNavegador(projectDir()); } catch (e) { m = { testou: false, relato: e.message }; }
2510
+ spP.stop();
2511
+ const exP = conferirLib.explicarPagina(m);
2512
+ if (exP.ok) {
2513
+ console.log(c.ok(` ✓ ${exP.titulo}`));
2514
+ if (checkpoint.marcarFuncionando(projectDir(), 'a página abriu sem erro')) console.log(c.muted(" Marquei este ponto como 'funcionava': /restore volta pra cá, e a /timeline mostra."));
2515
+ break;
2516
+ }
2517
+ console.log((exP.testou ? c.err : c.warn)(` ${exP.testou ? '✗' : '·'} ${exP.titulo}`));
2518
+ for (const l of exP.linhas) console.log(c.muted(` ${l}`));
2519
+ if (exP.testou && await confirm('Quero que a IA conserte?')) {
2520
+ await sendPrompt(`Abri a página escondido e ela tem problema:\n${m.relato}\nAche a causa, conserte e confira de novo.`);
2521
+ }
2522
+ break;
2523
+ }
2524
+ if (!achou) { console.log(c.muted(" Não achei como testar este projeto (sem script de test/build, e sem página pra abrir). Peça: 'cria testes pra isso'.")); break; }
2525
+ console.log(c.muted(` $ ${achou.comando}`));
2526
+ const sp = new Spinner(`rodando ${achou.rotulo}`).start();
2527
+ const r = await conferirLib.rodar(achou.comando, projectDir());
2528
+ sp.stop();
2529
+ if (r.semTeste) { console.log(c.muted(` O ${achou.comando} não achou teste pra rodar (ou o pytest não está instalado). Peça: 'cria testes pra isso'.`)); break; }
2530
+ const ex = conferirLib.explicar(r, achou);
2531
+ if (r.ok) {
2532
+ console.log(c.ok(` ✓ ${ex.titulo}`));
2533
+ if (checkpoint.marcarFuncionando(projectDir(), achou.comando)) {
2534
+ console.log(c.muted(" Marquei este ponto como 'funcionava': /restore volta pra cá, e a /timeline mostra."));
2535
+ } else {
2536
+ // sem pedido nenhum nesta pasta ainda, não há ponto pra marcar: dizer, em vez de calar
2537
+ console.log(c.muted(' Ainda não tem ponto pra marcar: o primeiro pedido que mexer nos arquivos cria um, e o próximo /check marca.'));
2538
+ }
2539
+ break;
2540
+ }
2541
+ console.log(c.err(` ✗ ${ex.titulo}`));
2542
+ for (const l of ex.linhas) console.log(c.muted(` ${l}`));
2543
+ if (await confirm('Quero que a IA conserte?')) {
2544
+ await sendPrompt(`Rodei \`${achou.comando}\` e falhou. A saída:\n${r.saida}\nAche a causa, conserte e rode \`${achou.comando}\` de novo até passar.`);
2545
+ }
2546
+ break;
2547
+ }
2548
+
2549
+ /* /voltar: o /desfazer com destino certo — o último ponto que o
2550
+ /check marcou como funcionando, em vez de "N pedidos" no chute. */
2551
+ case 'restore': {
2552
+ const ponto = checkpoint.ultimoQueFuncionava(projectDir());
2553
+ if (!ponto) { console.log(c.muted(' Nenhum ponto marcado ainda. Quando estiver funcionando, rode /check: ele marca.')); break; }
2554
+ if (ponto.indice === 0) { console.log(c.muted(' Você já está no último ponto que funcionava.')); break; }
2555
+ const quando = (cp) => new Date(cp.quando).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
2556
+ const alvo = checkpoint.lista(projectDir()).slice(0, ponto.indice);
2557
+ console.log(c.muted(`\n O último ponto que funcionava: ${quando(ponto.cp)}, "${String(ponto.cp.pedido || '').slice(0, 50)}"`)
2558
+ + (ponto.cp.funcionava_como ? c.dim(` (conferido: ${ponto.cp.funcionava_como})`) : ''));
2559
+ console.log(c.muted(`\n Volta ${alvo.length === 1 ? 'o pedido' : `os ${alvo.length} pedidos`} feito${alvo.length === 1 ? '' : 's'} depois do último ponto que funcionava:`));
2560
+ for (const cp of alvo) console.log(` ${c.dim(quando(cp))} ${c.white(cp.pedido.slice(0, 60))}`);
2561
+ const previa = checkpoint.previa(projectDir(), ponto.indice);
2562
+ if (!previa.length) console.log(c.muted(' (o disco já está como estava antes)'));
2563
+ for (const a of previa.slice(0, 40)) console.log(c.muted(` ${a.acao} `) + shortPath(a.caminho));
2564
+ if (previa.length > 40) console.log(c.muted(` … e mais ${previa.length - 40}`));
2565
+ if (!(await confirm('Voltar?'))) { console.log(c.muted('Cancelado.')); break; }
2566
+ for (const f of checkpoint.desfazer(projectDir(), ponto.indice)) {
2567
+ const rotulo = f.acao === 'falhou' ? c.err(` falhou: ${f.erro} `) : c.ok(` ${f.acao} `);
2568
+ console.log(rotulo + shortPath(f.caminho));
2569
+ }
2570
+ if (checkpoint.refazerDisponivel(projectDir())) console.log(c.muted('\n Mudou de ideia? ') + c.brand('/redo') + c.muted(' devolve.'));
2571
+ console.log(c.muted(' A história inteira do projeto, numa página: ') + c.brand('/timeline'));
2572
+ break;
2573
+ }
2574
+
2575
+ /* /linha-do-tempo: o /desfazer lista numa página que quem não sabe
2576
+ git consegue ler. Pedido explícito, então abre o navegador; se não
2577
+ abrir (app de voz), mostra onde o arquivo ficou. */
2578
+ /* /mostrar: o app no celular de alguém no mesmo Wi-Fi, com link de prazo, sem publicar (lib/mostrar.js). */
2579
+ case 'show': {
2580
+ const arg = String(rest || '').trim().toLowerCase();
2581
+ if (state.mostrando && (arg === 'parar' || arg === 'stop')) { await state.mostrando.fechar(); state.mostrando = null; console.log(c.ok(' Parei de mostrar. O link não abre mais.')); break; }
2582
+ if (arg === 'parar' || arg === 'stop') { console.log(c.muted(' Não estou mostrando nada agora.')); break; }
2583
+ const entradaMostrar = require('../pipeline.js').acharEntrada(projectDir());
2584
+ if (!entradaMostrar) { console.log(c.muted(' Não achei uma página pra mostrar (um index.html). Esse projeto roda como servidor? Peça "roda o projeto".')); break; }
2585
+ if (state.mostrando) await state.mostrando.fechar();
2586
+ const minutos = Math.max(5, Math.min(240, Number(arg) || 60));
2587
+ const r = await require('../mostrar.js').abrir(projectDir(), { minutos, entrada: entradaMostrar }); // lista.html sem index.html também abre
2588
+ if (!r.ok) { console.log(c.err(` Não consegui abrir: ${r.error}`)); break; }
2589
+ state.mostrando = r;
2590
+ console.log(c.ok(` Mostrando ${path.basename(projectDir())} por ${minutos} min, só pra quem está no mesmo Wi-Fi:`));
2591
+ console.log(' ' + c.white(r.url || r.urlLocal));
2592
+ console.log(c.muted(' Nada foi publicado: o link morre no prazo ou quando você fecha o PrimoCode. .env, .git e node_modules nunca saem. /show parar fecha agora.'));
2593
+ break;
2594
+ }
2595
+ /* /como-rodar: o bloco "Como rodar" do PRIMO.md, tirado do disco sem modelo (lib/como-rodar.js). */
2596
+ case 'howto': {
2597
+ const r = require('../como-rodar.js').gravar(projectDir());
2598
+ if (!r.passos.length) { console.log(c.muted(' Ainda não deu pra saber como este projeto roda (sem package.json, index.html nem main.py).')); break; }
2599
+ console.log(c.ok(` ${r.criou ? 'Criei o PRIMO.md' : 'Atualizei o PRIMO.md'} com o "Como rodar":`));
2600
+ r.passos.forEach((p, i) => console.log(` ${c.brand(String(i + 1))} ${p.texto}${p.comando ? c.muted(': ') + c.white(p.comando) : ''}`));
2601
+ console.log(c.muted(' O PrimoCode lê o PRIMO.md em todo pedido. Rodar de novo atualiza o bloco.'));
2602
+ break;
2603
+ }
2604
+ /* /porta: "o app não abre" por causa da porta, dito em português (lib/porta.js). */
2605
+ case 'port': {
2606
+ const r = await require('../porta.js').diagnostico(projectDir());
2607
+ r.linhas.forEach((l, i) => console.log(i === 0 ? ' ' + (r.url ? c.ok(l) : c.warn(l)) : /^Abra:|abra: http/.test(l) ? ' ' + c.white(l) : c.muted(' ' + l)));
2608
+ if (r.url) console.log(c.muted(` /open ${r.url} abre no navegador.`));
2609
+ break;
2610
+ }
2611
+ /* /regra: "nunca mexa em X" no topo do PRIMO.md, que entra em todo pedido e não vira resumo (lib/regras.js). */
2612
+ case 'rule': {
2613
+ const R = require('../regras.js');
2614
+ const mostrar = (lista) => lista.forEach((r, i) => console.log(` ${c.brand(String(i + 1))} ${r}`));
2615
+ const tira = rest.match(/^(?:tirar|tira|apagar|remover)\s+(\d+)$/i);
2616
+ if (tira) {
2617
+ const r = R.tirar(projectDir(), tira[1]);
2618
+ if (!r) { console.log(c.err(` Não tem regra ${tira[1]}. /rule mostra a lista.`)); break; }
2619
+ console.log(c.ok(` Tirei: ${r.tirada}`));
2620
+ if (r.regras.length) mostrar(r.regras); else console.log(c.muted(' Não sobrou nenhuma regra.'));
2621
+ break;
2622
+ }
2623
+ if (!rest.trim()) {
2624
+ const lista = R.ler(projectDir());
2625
+ if (!lista.length) { console.log(c.muted(' Nenhuma regra ainda. Exemplo: /rule nunca mexa no style.css')); break; }
2626
+ console.log(c.white(` As regras de ${path.basename(projectDir())} (o PrimoCode segue em todo pedido):`));
2627
+ mostrar(lista);
2628
+ console.log(c.muted(' /rule tirar N tira uma.'));
2629
+ break;
2630
+ }
2631
+ const r = R.adicionar(projectDir(), rest);
2632
+ console.log(r.ja_tinha ? c.muted(' Essa regra já estava lá.') : c.ok(' Guardei no topo do PRIMO.md. Vale em todo pedido, mesmo depois de resumir a conversa:'));
2633
+ mostrar(r.regras);
2634
+ break;
2635
+ }
2636
+ /* /mapa: o que tem no projeto, em português, e o arquivo que é pedido mas não existe (lib/mapa.js). */
2637
+ case 'map': {
2638
+ const arvore = rest.match(/^(?:tree|arvore|árvore)\b\s*(\d*)/i);
2639
+ if (arvore) { console.log(tools.treeDir(projectDir(), parseInt(arvore[1], 10) || 2)); break; }
2640
+ const M = require('../mapa.js');
2641
+ const m = M.montar(projectDir());
2642
+ for (const l of M.texto(m, path.basename(projectDir()))) console.log(/⚠/.test(l) ? c.warn(l) : /^\S/.test(l) ? ' ' + c.white(l) : c.muted(l));
2643
+ if (m.faltando.length) console.log(c.muted(' Peça: "cria o que está faltando", ou rode /check pra ver a página abrindo.'));
2644
+ break;
2645
+ }
2646
+ /* /mudou: o que mudou no projeto, em português simples (lib/mudou.js), e não um diff. */
2647
+ case 'changes': {
2648
+ const r = require('../mudou.js').medir(projectDir());
2649
+ console.log(' ' + c.white(r.frase));
2650
+ for (const a of r.arquivos.slice(0, 15)) {
2651
+ const rotulo = r.git ? (a.novo ? c.ok('novo ') : a.apagado ? c.warn('apagado ') : c.muted('editado ')) : c.muted((a.acao || 'mudou').padEnd(8));
2652
+ const conta = r.git && !a.novo && !a.apagado ? c.dim(` +${a.mais} −${a.menos}`) : '';
2653
+ console.log(` ${rotulo}${a.arquivo}${conta}`);
2654
+ }
2655
+ if (r.arquivos.length > 15) console.log(c.dim(` … e mais ${r.arquivos.length - 15}`));
2656
+ if (r.arquivos.length) console.log(c.muted(' Quebrou algo? /restore volta pro último ponto que funcionava.'));
2657
+ break;
2658
+ }
2659
+ /* /explain: sem nada, o último pedido em 5 linhas; com uma palavra, uma linha; "projeto" é o comando de fábrica. */
2660
+ /* /review: duas passadas (lib/review.js) — achar e depois conferir cada achado. /review rápido = o comando de fábrica de uma passada. */
2661
+ case 'review': {
2662
+ if (/^(r[aá]pido|simples)\b/i.test(rest)) {
2663
+ const fabrica = comandosDaPessoa().find((x) => x.nome === 'review');
2664
+ if (fabrica) { await sendPrompt(comandosLib.expandir(fabrica, rest.replace(/^\S+\s*/, ''))); break; }
2665
+ }
2666
+ const R = require('../review.js');
2667
+ const chamar = async (prompt) => {
2668
+ let resposta = '';
2669
+ await api.requestChat(state.config.server, { prompt, history: [], model: state.config.model, token: state.config.token },
2670
+ (evt) => { if (evt.delta) resposta += evt.delta; });
2671
+ return resposta;
2672
+ };
2673
+ const sp = new Spinner('revisando o que mudou (passada 1: achar)').start();
2674
+ let r;
2675
+ try { r = await R.revisar({ dir: projectDir(), foco: rest, chamar }); } catch (e) { r = { ok: false, erro: String((e && e.message) || e) }; }
2676
+ sp.stop();
2677
+ console.log('\n' + R.formatar(r).split('\n').map((l) => ' ' + l).join('\n') + '\n');
2678
+ break;
2679
+ }
2680
+ case 'explain': {
2681
+ const E = require('../explicar.js');
2682
+ const m = E.modo(rest);
2683
+ if (m.tipo === 'projeto') {
2684
+ const fabrica = comandosDaPessoa().find((x) => x.nome === 'explain');
2685
+ if (!fabrica) { console.log(c.err(' Não achei o comando de fábrica (comandos/explain.md).')); break; }
2686
+ console.log(c.dim(` ⎿ /explain projeto · ${fabrica.origem}`));
2687
+ await sendPrompt(comandosLib.expandir(fabrica, ''));
2688
+ break;
2689
+ }
2690
+ if (m.tipo === 'termo') { await sendPrompt(E.pedidoDoTermo(m.termo)); break; }
2691
+ const ultimo = E.doUltimoPedido(projectDir());
2692
+ if (!ultimo) { console.log(c.muted(' Ainda não mudou nada por aqui. /explain projeto explica o projeto; /explain <palavra> explica uma palavra.')); break; }
2693
+ await sendPrompt(E.pedidoDoUltimo(ultimo));
2694
+ break;
2695
+ }
2696
+ /* /plan: 1ª fase no modo plano (só lê) mostra 3 a 5 passos; Enter começa, um número muda o passo (lib/plano-previo.js). */
2697
+ case 'plan': {
2698
+ const P = require('../plano-previo.js');
2699
+ if (!rest) { console.log(c.muted(' Uso: /plan <pedido> — ele mostra os passos e só começa quando você aperta Enter.')); break; }
2700
+ const antes = state.config.permissoes, tamanho = state.history.length;
2701
+ state.config.permissoes = 'plano';
2702
+ try { await sendPrompt(P.pedidoDoPlano(rest)); } finally { state.config.permissoes = antes; }
2703
+ const ultima = state.history.length > tamanho ? state.history[state.history.length - 1] : null;
2704
+ const passos = ultima && ultima.role === 'assistant' ? P.extrairPassos(ultima.content) : [];
2705
+ if (passos.length < 2) { console.log(c.muted(' Não consegui montar uma lista de passos. Peça de novo, ou mande o pedido sem o /plan.')); break; }
2706
+ for (;;) {
2707
+ console.log(c.white('\n O plano:'));
2708
+ passos.forEach((p, i) => console.log(` ${c.brand(String(i + 1))} ${p}`));
2709
+ const r = P.resposta(await ask(`\n${c.brand('?')} ${c.muted('Enter começa · número muda o passo · n cancela')} `), passos);
2710
+ if (r.acao === 'cancelar') { console.log(c.muted(' Cancelado. Nada foi mexido.')); passos.length = 0; break; }
2711
+ if (r.acao === 'comecar') break;
2712
+ if (r.acao === 'editar') {
2713
+ const novo = (await ask(` ${c.muted(`Passo ${r.n}, com as suas palavras (vazio apaga):`)} `)).trim();
2714
+ if (novo) passos[r.n - 1] = novo; else if (passos.length > 1) passos.splice(r.n - 1, 1);
2715
+ } else console.log(c.muted(' Aperte Enter para começar, digite o número de um passo, ou n.'));
2716
+ }
2717
+ if (!passos.length) break;
2718
+ state.passosProntos = P.comoPassos(rest, passos);
2719
+ try { await sendPrompt(rest); } finally { state.passosProntos = null; }
2720
+ break;
2721
+ }
2722
+ /* /lock: arquivo que o agente só lê. A recusa mora no portão (lib/permission/perigo.js → lib/trava.js). */
2723
+ case 'lock': {
2724
+ const T = require('../trava.js');
2725
+ const palavras = (rest.match(/"[^"]+"|'[^']+'|\S+/g) || []).map((x) => x.replace(/^["']|["']$/g, ''));
2726
+ const lista = (ts) => ts.forEach((t, i) => console.log(` ${c.brand(String(i + 1))} ${t}`));
2727
+ if (/^(off|soltar|solta|destravar|unlock)$/i.test(palavras[0] || '')) {
2728
+ if (palavras.length < 2) { console.log(c.err(' Uso: /lock off <arquivo> (ou /lock off tudo)')); break; }
2729
+ const alvos = palavras.slice(1);
2730
+ for (const a of alvos) {
2731
+ const r = T.soltar(projectDir(), a);
2732
+ console.log(r.soltos.length ? c.ok(` Soltei ${r.soltos.join(', ')}. O agente volta a poder mexer.`) : c.muted(` ${a} não estava travado.`));
2733
+ }
2734
+ break;
2735
+ }
2736
+ if (!palavras.length) {
2737
+ const ts = T.ler(projectDir());
2738
+ if (!ts.length) { console.log(c.muted(' Nenhum arquivo travado. Exemplo: /lock login.js logo.png')); break; }
2739
+ console.log(c.white(` Travados em ${path.basename(projectDir())} (o agente só pode ler):`));
2740
+ lista(ts);
2741
+ console.log(c.muted(' /lock off <arquivo> solta um.'));
2742
+ break;
2743
+ }
2744
+ const r = T.travar(projectDir(), palavras);
2745
+ for (const f of r.fora) console.log(c.warn(` ${f} está fora da pasta do projeto: não travei.`));
2746
+ for (const n of r.novos) if (!fs.existsSync(path.join(projectDir(), n))) console.log(c.muted(` ${n} ainda não existe: travei mesmo assim.`));
2747
+ if (r.novos.length) console.log(c.ok(` Travei ${r.novos.join(', ')}. O agente só pode ler.`));
2748
+ else if (!r.fora.length) console.log(c.muted(' Esses já estavam travados.'));
2749
+ if (r.travados.length) { lista(r.travados); console.log(c.muted(' /lock off <arquivo> solta um.')); }
2750
+ break;
2751
+ }
2752
+ /* /save: guarda o projeto no GitHub, num repositório privado (lib/guardar.js). */
2753
+ case 'save': {
2754
+ const r = require('../guardar.js').salvar(projectDir(), { log: (l) => console.log(c.muted(' ' + l)) });
2755
+ console.log(r.ok ? c.ok(` Seu trabalho está guardado fora do computador: ${r.url}`) : c.warn(` ${r.erro}`));
2756
+ break;
2757
+ }
2758
+ /* /secrets: nomes das chaves, nunca os valores; `add` pede o valor escondido (lib/segredos.js). */
2759
+ case 'secrets': {
2760
+ const S = require('../segredos.js');
2761
+ const [sub, nomeDado] = rest.split(/\s+/).filter(Boolean);
2762
+ if (/^(add|adicionar|novo)$/i.test(sub || '')) {
2763
+ const n = S.nomeValido(nomeDado);
2764
+ if (!n) { console.log(c.warn(' Qual o nome? Exemplo: /secrets add OPENAI_API_KEY')); break; }
2765
+ console.log(c.warn(' Isto é uma chave, não mostre pra ninguém.') + c.muted(' O que você digitar não aparece na tela.'));
2766
+ const valor = (await askSecret(` Valor de ${n}: `)).trim();
2767
+ if (!valor) { console.log(c.muted(' Vazio: não guardei nada.')); break; }
2768
+ try {
2769
+ const r = S.gravar(projectDir(), n, valor);
2770
+ console.log(c.ok(` ${r.substituiu ? 'Troquei' : 'Guardei'} ${n} no .env${r.criou ? ' (criei o arquivo)' : ''}.`));
2771
+ if (r.gitignore) console.log(c.muted(' Pus .env no .gitignore: ele não vai pro GitHub.'));
2772
+ } catch (e) { console.log(c.warn(` ${e.message}`)); }
2773
+ break;
2774
+ }
2775
+ const lista = S.listar(projectDir());
2776
+ if (!lista.length) { console.log(c.muted(' Este projeto não usa nenhuma chave (ainda). Quando precisar: /secrets add NOME')); break; }
2777
+ console.log(c.white(' Chaves deste projeto (só os nomes, nunca o valor):'));
2778
+ for (const x of lista) {
2779
+ const estado = x.noEnv && !x.vazia ? c.ok('guardada') : x.noEnv ? c.warn('vazia no .env') : c.warn('falta guardar');
2780
+ console.log(` ${c.brand(ui.padRight(x.nome, 28))}${ui.padRight(estado, 16)}${c.dim(x.usadaEm.length ? 'usada em ' + x.usadaEm.join(', ') : '')}`);
2781
+ }
2782
+ console.log(c.muted(' /secrets add NOME guarda uma. Isto é uma chave, não mostre pra ninguém.'));
2783
+ break;
2784
+ }
2785
+ case 'testar-app': {
2786
+ const A = require('../plugin/autoteste.js');
2787
+ const r = await A.testar({ dir: projectDir(), log: (l) => console.log(c.muted(' ' + l)), consertar: (erros, prints) => sendPrompt(A.pedidoDeConserto(erros, prints)) });
2788
+ console.log(r.ok ? c.ok(' O app passou no teste.') : c.warn(' ' + r.erro));
2789
+ break;
2790
+ }
2791
+ /* /placar: qual modelo grátis acerta mais em cada tipo de tarefa, neste computador (lib/placar.js). */
2792
+ case 'placar': {
2793
+ const P = require('../placar.js');
2794
+ if (/^(zerar|limpar|reset)$/i.test(rest.trim())) { P.zerar(); console.log(c.ok(' Placar zerado. Ele começa a aprender de novo.')); break; }
2795
+ console.log(P.texto(P.ler()).split('\n').map((l) => ' ' + l.replace(/^ {2}/, '')).join('\n'));
2796
+ break;
2797
+ }
2798
+ case 'pesquisar': {
2799
+ if (!rest) { console.log(c.muted(' Uso: /pesquisar <tema>')); break; }
2800
+ const r = await require('../plugin/pesquisar.js').pesquisar({ tema: rest, dir: projectDir(), log: (l) => console.log(c.muted(' ' + l)) });
2801
+ console.log(r.ok ? c.ok(` Relatório: ${r.arquivo}`) : c.warn(' ' + r.erro));
2802
+ break;
2803
+ }
2804
+ /* /schedule: pedido que roda sozinho no Mac, pelo launchd (lib/agendar.js). */
2805
+ case 'schedule': {
2806
+ const A = require('../agendar.js');
2807
+ const off = rest.match(/^(?:off|tirar|remover|cancelar)\s+(\S+)/i);
2808
+ if (off) {
2809
+ const r = A.remover(projectDir(), off[1]);
2810
+ console.log(r.ok ? c.ok(` Tirei: ${r.item.quando} · ${r.item.pedido.slice(0, 60)}`) : c.warn(` ${r.erro}`));
2811
+ break;
2812
+ }
2813
+ if (!rest) {
2814
+ const lista = A.listar(projectDir());
2815
+ if (!lista.length) { console.log(c.muted(' Nada agendado. Exemplo: /schedule "toda segunda às 9h" resuma o que mudou na semana')); break; }
2816
+ console.log(c.white(' Agendados neste projeto:'));
2817
+ lista.forEach((x, i) => console.log(` ${c.brand(String(i + 1))} ${c.white(x.quando)} ${c.muted(x.pedido.slice(0, 60))}`));
2818
+ console.log(c.muted(' O resultado de cada dia fica em .primocode/agendados/<data>.md · /schedule off <número> tira um.'));
2819
+ break;
2820
+ }
2821
+ const { quando, pedido } = A.separar(rest);
2822
+ const r = A.criar(projectDir(), quando, pedido);
2823
+ if (!r.ok) { console.log(c.warn(` ${r.erro}`)); break; }
2824
+ console.log(c.ok(` Agendado: ${r.item.quando}. O resultado vai para .primocode/agendados/<data>.md`));
2825
+ console.log(c.muted(r.relogio ? ' Roda sozinho, mesmo com o PrimoCode fechado (o Mac precisa estar ligado). /schedule off ' + r.item.id + ' tira.'
2826
+ : ' Atenção: o relógio automático só existe no Mac. O pedido ficou salvo, mas não vai rodar sozinho neste computador.'));
2827
+ break;
2828
+ }
2829
+ /* /ship: site estático, Next e app Node simples vão pro ar de verdade (lib/publicar.js); o resto cai no guia
2830
+ de fábrica (comandos/ship.md), que também vale pro /ship.md que a pessoa escreveu. */
2831
+ case 'ship': {
2832
+ const guia = comandosDaPessoa().find((x) => x.nome === 'ship');
2833
+ if (guia && guia.origem !== 'primocode') { console.log(c.dim(` ⎿ /ship · ${guia.origem}`)); await sendPrompt(comandosLib.expandir(guia, rest)); break; }
2834
+ const r = await require('../publicar.js').publicar(projectDir(), { log: (l) => console.log(c.muted(' ' + l)), confirmar: (q) => confirm(q) });
2835
+ if (r.guiado) {
2836
+ if (!guia) { console.log(c.err(' Não achei o guia de fábrica (comandos/ship.md).')); break; }
2837
+ console.log(c.muted(' Este projeto eu não publico sozinho: vou te guiar passo a passo.'));
2838
+ await sendPrompt(comandosLib.expandir(guia, rest));
2839
+ break;
2840
+ }
2841
+ if (r.recusou) console.log(c.muted(' Tudo bem, não enviei nada.'));
2842
+ else console.log(r.ok ? c.ok(` Seu projeto está no ar: ${r.url}`) : c.warn(` ${r.erro}`));
2843
+ break;
2844
+ }
2845
+ case 'timeline': {
2846
+ const arquivo = require('../session/linha-do-tempo').gravar(projectDir());
2847
+ const r = await tools.openInBrowser(arquivo);
2848
+ if (r && r.ok === false) console.log(c.muted(' A página está em: ') + arquivo);
2849
+ else console.log(c.ok(' Abri a história do projeto no navegador.') + c.dim(' ' + shortPath(arquivo)));
2850
+ break;
2851
+ }
2852
+
2853
+
2854
+ case 'read': {
2855
+ if (!rest) { console.log(c.err('Uso: /read <arquivo>')); break; }
2856
+ try {
2857
+ const content = fs.readFileSync(path.resolve(projectDir(), rest), 'utf-8');
2858
+ console.log(c.muted(`\n--- ${rest} ---\n`));
2859
+ console.log(content.length > 2000 ? content.slice(0, 2000) + '\n…' : content);
2860
+ } catch { console.log(c.err(`Não consegui ler: ${rest}`)); }
2861
+ break;
2862
+ }
2863
+
2864
+ case 'run': {
2865
+ if (!rest) { console.log(c.err('Uso: /run <comando>')); break; }
2866
+ console.log(c.muted(`$ ${rest}`));
2867
+ const result = await tools.runShell(rest, 60000, projectDir());
2868
+ if (result.stdout) console.log(result.stdout);
2869
+ if (result.stderr) console.log(c.err(result.stderr));
2870
+ if (result.code !== 0) console.log(c.err(`exit ${result.code}`));
2871
+ break;
2872
+ }
2873
+
2874
+ /* /novo: projeto novo por ORDEM da pessoa. Sem ele, "crie um site de
2875
+ receitas" pode cair dentro de "site-receitas-velho" porque o nome
2876
+ parece (findSimilarProject) — e quem quer começar do zero não tem
2877
+ como dizer isso. Aqui a pasta nasce antes, com nome que não colide,
2878
+ e o pedido roda preso nela. */
2879
+ case 'new': {
2880
+ // sem nada: as 3 perguntas de quem nunca programou (era o /new)
2881
+ if (!rest) { await comecarPerguntas(); break; }
2882
+ await criarProjetoNovo(rest);
2883
+ break;
2884
+ }
2885
+
2886
+ /* /open sem nada (e /open) acha sozinho o que abrir: o servidor do
2887
+ projeto de pé, ou a index.html. Antes pedia o caminho, e quem não
2888
+ sabe que a página se chama index.html ficava parado aqui. */
2889
+ case 'open': {
2890
+ if (!rest) {
2891
+ const pastaAtual = projectDir();
2892
+ if (path.resolve(pastaAtual) === path.resolve(cfg.ROOT_DIR)) {
2893
+ console.log(c.muted(' Nenhum projeto aberto.') + c.dim(' /projects para escolher um'));
2894
+ break;
2895
+ }
2896
+ const alvo = await extra.acharAlvoAbrir(pastaAtual);
2897
+ if (!alvo) {
2898
+ console.log(c.muted(` Não achei página nem servidor em ${shortPath(pastaAtual)}.`));
2899
+ console.log(c.dim(' Peça "roda o projeto" ao Primo, ou /open <arquivo>. O app devia estar rodando? /port diz por que não abre.'));
2900
+ break;
2901
+ }
2902
+ const r = await tools.openInBrowser(alvo.url || alvo.caminho);
2903
+ if (r && r.ok === false) { console.log(c.err(` Não consegui abrir: ${r.error}`)); break; }
2904
+ console.log(c.ok(` Aberto: ${alvo.url || shortPath(alvo.caminho)}`) + c.dim(` (${alvo.porque})`));
2905
+ break;
2906
+ }
2907
+ const target = /^https?:\/\//i.test(rest) ? rest : path.resolve(projectDir(), rest);
2908
+ await tools.openInBrowser(target);
2909
+ console.log(c.ok(`Aberto: ${rest}`));
2910
+ break;
2911
+ }
2912
+
2913
+ case 'name': {
2914
+ // /name voz <Nome>: o nome do assistente de voz (o mesmo do /voice nome)
2915
+ const nomeVoz = rest.match(/^(?:voz|voice|assistente)\s+(.{2,20})$/i);
2916
+ if (nomeVoz) {
2917
+ const salvo = vozModo.definirNome(nomeVoz[1]);
2918
+ console.log(salvo ? c.ok(` Fechado: o assistente agora se chama ${salvo}. Vale na próxima vez que ligar o /voice.`) : c.err(' Nome inválido (1 ou 2 palavras, até 20 letras).'));
2919
+ break;
2920
+ }
2921
+ if (!rest) { console.log(c.muted(` Nome atual: ${state.config.userName || '(nenhum)'}`)); break; }
2922
+ state.config.userName = rest;
2923
+ cfg.saveConfig({ userName: rest });
2924
+ console.log(c.ok(`Feito! Vou te chamar de ${rest}.`));
2925
+ break;
2926
+ }
2927
+
2928
+ /* A galeria: todos lado a lado, número e nome em cima. Escolhe por
2929
+ nome ou número — na hora, se há teclado; senão pelo /mascot <n>.
2930
+ Num pipe não pergunta: a "resposta" seria o próximo comando. */
2931
+ // O kit de marca (lib/plugin/marca-kit.js): /marca criar|listar|usar <nome> [aqui]|mostrar|apagar <nome>
2932
+ case 'brand': {
2933
+ const kit = require('../plugin/marca-kit.js');
2934
+ const perguntar = async (t, p) => (String(await ask(`${c.brand('?')} ${t}${p ? c.muted(` [${p}]`) : ''}: `)).trim() || p || '');
2935
+ await kit.main((rest || 'mostrar').split(/\s+/), { perguntar, dizer: (t) => console.log(c.muted(t)), pasta: state.workDir || process.cwd() });
2936
+ break;
2937
+ }
2938
+
2939
+ case 'mascot': {
2940
+ const reac = rest.match(/^(reac(?:oes|ões)?|rea[cç][aã]o|reactions?)\s*(on|off|liga[r]?|desliga[r]?|sim|n[aã]o)?$/i);
2941
+ if (reac) {
2942
+ const quer = reac[2] ? /^(on|liga|ligar|sim)$/i.test(reac[2]) : state.config.reacoes === false;
2943
+ state.config.reacoes = quer;
2944
+ cfg.saveConfig({ reacoes: quer });
2945
+ console.log(c.ok(` Reações do mascote: ${quer ? 'ligadas' : 'desligadas'}`)
2946
+ + (quer ? ' ' + ui.reacao(state.config.mascot, 'feliz').trim() : ''));
2947
+ break;
2948
+ }
2949
+ let pedido = rest;
2950
+ if (!pedido) {
2951
+ console.log('');
2952
+ console.log(ui.galeriaMascotes(state.config.mascot || 'primo', process.stdout.columns || 80));
2953
+ if (!process.stdin.isTTY || state.semTerminal) {
2954
+ console.log(c.muted(' Escolha: /mascot <nome ou número>') + c.dim(' · /mascot reacoes off desliga o rostinho'));
2955
+ break;
2956
+ }
2957
+ pedido = String(await ask(` ${c.brand('?')} Nome ou número ${c.dim('(Enter mantém)')}: `)).trim();
2958
+ if (!pedido) { console.log(c.muted(' Nada mudou.')); break; }
2959
+ }
2960
+ const m = ui.resolverMascote(pedido);
2961
+ if (!m) { console.log(c.err(` Não conheço "${pedido}".`) + c.dim(` São: ${ui.MASCOTES.join(', ')}`)); break; }
2962
+ state.config.mascot = m;
2963
+ cfg.saveConfig({ mascot: m });
2964
+ const info = ui.mascoteInfo(m);
2965
+ console.log('');
2966
+ const arte = ui.mascot(m);
2967
+ arte.forEach((l, i) => console.log(' ' + l + (i === 0 ? ' ' + c.bold(c.white(info.nome))
2968
+ : i === 1 ? ' ' + c.dim(`"${info.frase}"`) : '')));
2969
+ console.log(c.ok(`\n Mascote: ${m}`));
2970
+ break;
2971
+ }
2972
+
2973
+ case 'config': {
2974
+ console.log('');
2975
+ console.log(` ${c.muted('nome')} ${c.white(state.config.userName || '(nenhum)')}`);
2976
+ console.log(` ${c.muted('mascote')} ${c.white(state.config.mascot || 'primo')}${c.dim(state.config.reacoes === false ? ' · sem reações' : ' · com reações')}`);
2977
+ console.log(` ${c.muted('esforço')} ${c.white(state.config.effort)}${c.dim(' · /effort muda')}`);
2978
+ console.log(` ${c.muted('modelo')} ${c.white(state.config.model)}${c.dim(' (vem do esforço)')}`);
2979
+ console.log(` ${c.muted('modo')} ${c.white(state.mode)}`);
2980
+ console.log(` ${c.muted('servidor')} ${c.dim(state.config.server)}`);
2981
+ console.log(c.muted(`\n ${cfg.CONFIG_FILE}`));
2982
+ break;
2983
+ }
2984
+
2985
+ // Limpar aqui não apaga o que já subiu: encerra ESTA conversa e a
2986
+ // próxima pergunta abre outra. Apagar do histórico é decisão da
2987
+ // pessoa, e ela toma no app — não de raspão num comando de limpar tela.
2988
+ /* Resume a conversa por ordem da pessoa. Diferente do /clear: aqui
2989
+ nada é esquecido — o que já passou vira resumo e o fim continua
2990
+ cru, então dá para seguir de onde parou. */
2991
+ case 'compact': {
2992
+ if (!state.history.length) {
2993
+ console.log(c.muted(' A conversa está vazia — não há o que resumir.'));
2994
+ break;
2995
+ }
2996
+ const antes = memoria.usoDoContexto(state.memoria, state.history);
2997
+ await comprimirConversa(true);
2998
+ const depois = memoria.usoDoContexto(state.memoria, state.history);
2999
+ if (depois.tokens >= antes.tokens) {
3000
+ // Pode não haver o que dobrar (conversa curta, ou o servidor
3001
+ // recusou). Dizer isso é melhor que fingir que encolheu.
3002
+ console.log(c.muted(' Não deu para encolher mais desta vez.'));
3003
+ } else {
3004
+ console.log(c.ok(' Conversa resumida.')
3005
+ + c.muted(` ctx ${antes.pct}% → ${depois.pct}%`));
3006
+ }
3007
+ refreshPrompt();
3008
+ break;
3009
+ }
3010
+
3011
+ case 'clear': state.history = []; state.memoria = memoria.nova();
3012
+ state.gravador.zerar(); console.log(c.ok('Conversa limpa.')); break;
3013
+ case 'cls': process.stdout.write('\x1Bc'); break;
3014
+
3015
+ /* O /status olha só o servidor. O /doctor olha tudo o que costuma
3016
+ ser o motivo de "não funciona" — e cada ✗ diz como consertar. */
3017
+ case 'doctor': {
3018
+ if (/^status$/i.test(rest)) { await mostrarStatus(); break; }
3019
+ const sp = new Spinner('conferindo').start();
3020
+ const linhas = await extra.diagnosticar({
3021
+ saude: () => api.getHealth(state.config.server, state.config.token),
3022
+ provedor: () => provedorLocal.atual(),
3023
+ conferirChave: (id, chave) => provedorLocal.conferir(id, chave),
3024
+ cliInstalado: (id) => require('../provider/local/motor-cli').instalado(id),
3025
+ acharChrome: () => require('../browser').findChrome(),
3026
+ raiz: cfg.ROOT_DIR,
3027
+ arquivoConfig: cfg.CONFIG_FILE,
3028
+ });
3029
+ sp.stop();
3030
+ console.log('');
3031
+ for (const l of linhas) {
3032
+ const marca = l.ok === true ? c.ok('✓') : l.ok === false ? c.err('✗') : c.dim('·');
3033
+ console.log(` ${marca} ${ui.padRight(c.white(l.item), 18)}${ui.truncate(c.muted(l.detalhe || ''), Math.max(20, (process.stdout.columns || 80) - 23))}`);
3034
+ if (l.conserto) console.log(` ${c.dim('→ ' + l.conserto)}`);
3035
+ }
3036
+ for (const l of require('../preparar.js').estudioLinhas()) linhas.push(l), console.log(` ${l.ok === true ? c.ok('✓') : l.ok === false ? c.err('✗') : c.dim('·')} ${ui.padRight(c.white(l.item), 18)}${c.muted(l.detalhe || '')}`), l.conserto && console.log(` ${c.dim('→ ' + l.conserto)}`);
3037
+ const ruins = linhas.filter((l) => l.ok === false).length;
3038
+ console.log(ruins ? c.warn(`\n ${ruins} ${ruins === 1 ? 'coisa para arrumar' : 'coisas para arrumar'}.`) : c.ok('\n Tudo certo.'));
3039
+ break;
3040
+ }
3041
+
3042
+ case 'usage': {
3043
+ const Lim = require('../config/limite.js');
3044
+ const querLimite = /^(limite|limit)\b/i.exec(rest) && rest.replace(/^\S+\s*/, '').replace(/[.\s]/g, '').replace(/mil$/i, '000');
3045
+ if (querLimite) { // /usage limite 100000 ensina o limite do plano; sem número, mostra o uso de hoje
3046
+ console.log(Lim.definirLimite(querLimite) ? c.ok(` Anotei: ${Number(querLimite).toLocaleString('pt-BR')} tokens por dia. Agora os pedidos grandes dizem quantos % gastam.`) : c.warn(' Não entendi o número. Exemplo: /usage limite 100000'));
3047
+ break;
3048
+ }
3049
+ guardarUsoDeHoje();
3050
+ const { linhas, total } = extra.resumoCusto(contadorDaSessao);
3051
+ const hojeL = Lim.resumoDeHoje({ tokens: Lim.usoDeHoje().tokens, limite: Lim.limiteConhecido() });
3052
+ if (!linhas.length) { console.log(c.muted(' Nenhum pedido ao modelo nesta sessão ainda.')); hojeL.forEach((l) => console.log(c.muted(' ' + l))); break; }
3053
+ const simples = extra.resumoSimples({ linhas, total });
3054
+ console.log('\n ' + c.white('Nesta conversa: ') + simples.frase);
3055
+ console.log(' ' + c.ok(simples.quemPaga));
3056
+ console.log(c.dim('\n Em tokens (a unidade que o modelo conta):'));
3057
+ for (const l of linhas) {
3058
+ console.log(` ${c.white(ui.padRight(l.provedor, 22))}${c.muted(ui.padRight(l.pedidos + (l.pedidos === 1 ? ' pedido' : ' pedidos'), 12))}`
3059
+ + `${c.dim('enviou ')}${c.white(extra.fmtNumero(l.enviados))}${c.dim(' · recebeu ')}${c.white(extra.fmtNumero(l.recebidos))}${c.dim(' tokens' + (l.exato ? '' : ' (estimado)'))}${l.emCache ? c.dim(' · ') + c.ok(extra.fmtNumero(l.emCache) + ' do cache') : ''}`);
3060
+ }
3061
+ if (linhas.length > 1) {
3062
+ console.log(` ${c.white(ui.padRight('Total', 22))}${c.muted(ui.padRight(total.pedidos + ' pedidos', 12))}`
3063
+ + `${c.dim('enviou ')}${c.white(extra.fmtNumero(total.enviados))}${c.dim(' · recebeu ')}${c.white(extra.fmtNumero(total.recebidos))}`);
3064
+ }
3065
+ if (linhas.some((l) => !l.exato)) console.log(c.dim('\n Estimado = caracteres ÷ 4. Conta cada pedido inteiro, com a conversa que vai junto.'));
3066
+ console.log(''); hojeL.forEach((l) => console.log(c.white(' ' + l)));
3067
+ break;
3068
+ }
3069
+
3070
+ /* O que o agente deixou de pé com run_background (lib/fundo.js). */
3071
+ case 'tasks': {
3072
+ const fundo = require('../fundo.js');
3073
+ const [sub, alvo] = rest.split(/\s+/).filter(Boolean);
3074
+ if (/^(rodar|run)$/i.test(sub || '')) {
3075
+ // A pessoa também deixa coisa de pé, sem pedir ao agente (como o /run, mas sem travar).
3076
+ const cmd = rest.replace(/^\S+\s*/, '');
3077
+ if (!cmd) { console.log(c.warn(' Qual comando? /tasks rodar npm run dev')); break; }
3078
+ const r = fundo.iniciar(cmd, { projectDir: projectDir(), env: tools.ambienteLimpo(process.env, tools.permitidasNoShell()) });
3079
+ console.log(r.ok ? c.ok(` ${r.id} rodando em segundo plano.`) + c.muted(' /tasks mostra a saída e o endereço.') : c.warn(` ${r.error}`));
3080
+ break;
3081
+ }
3082
+ if (/^(abrir|open)$/i.test(sub || '')) {
3083
+ // Sem id: a primeira que anunciou endereço — quase sempre é a única.
3084
+ const t = fundo.listar().find((x) => x.url && x.rodando && (!alvo || x.id === alvo));
3085
+ if (!t) { console.log(c.warn(alvo ? ` ${alvo} não anunciou endereço (ou já parou).` : ' Nada rodando com endereço pra abrir.')); break; }
3086
+ const r = await tools.openInBrowser(t.url);
3087
+ console.log(r && r.ok === false ? c.warn(` Não abriu: ${r.error}. Abra você: ${t.url}`) : c.ok(` Abri ${t.url}`));
3088
+ break;
3089
+ }
3090
+ if (/^(parar|stop|kill)$/i.test(sub || '')) {
3091
+ if (!alvo) { console.log(c.warn(' Qual? /tasks parar <id>')); break; }
3092
+ const r = fundo.parar(alvo);
3093
+ console.log(r.ok ? c.ok(` Parei ${alvo}.`) : c.warn(` ${r.error}`));
3094
+ break;
3095
+ }
3096
+ const lista = fundo.listar();
3097
+ if (!lista.length) { console.log(c.muted(' Nada rodando em segundo plano.')); break; }
3098
+ console.log('');
3099
+ for (const t of lista) {
3100
+ const estado = t.rodando ? c.ok('rodando') : c.muted(`terminou${t.codigo === null ? '' : ' (código ' + t.codigo + ')'}`);
3101
+ const tempo = t.segundos >= 60 ? `${Math.floor(t.segundos / 60)}min${String(t.segundos % 60).padStart(2, '0')}s` : `${t.segundos}s`;
3102
+ console.log(` ${c.white(ui.padRight(t.id, 12))}${ui.padRight(estado, 28)}${c.dim(ui.padRight(tempo, 9))}${ui.truncate(c.muted(t.comando), Math.max(20, (process.stdout.columns || 80) - 52))}`);
3103
+ if (t.url && t.rodando) console.log(` ${' '.repeat(12)}${c.brand(t.url)}`);
3104
+ }
3105
+ break;
3106
+ }
3107
+
3108
+ case 'videos': {
3109
+ console.log(require('../plugin/estudio/exportar.js').main(rest.split(/\s+/).filter(Boolean)).texto);
3110
+ break;
3111
+ }
3112
+
3113
+ /* /exportar: a conversa vira um .md local, com chave e senha escondidas (lib/session/exportar-conversa.js). */
3114
+ case 'export': {
3115
+ const conversa = state.history.filter((m) => m.role === 'user' || m.role === 'assistant');
3116
+ if (!conversa.length) { console.log(c.muted(' Ainda não tem conversa pra exportar: faça um pedido primeiro.')); break; }
3117
+ const arq = require('../session/exportar-conversa.js').gravar(conversa, { projeto: path.basename(projectDir()) });
3118
+ console.log(c.ok(` Conversa salva (${conversa.length} mensagens): `) + shortPath(arq));
3119
+ console.log(c.muted(' Chave e senha saem trocadas por [chave escondida]. É um arquivo seu, sem link público.'));
3120
+ break;
3121
+ }
3122
+ case 'copy': {
3123
+ const r = extra.copiar(state.lastResponse);
3124
+ if (r.ok) console.log(c.ok(' Copiado.') + c.dim(` ${state.lastResponse.length} caracteres · é só colar`));
3125
+ else console.log(c.muted(` Não copiei: ${r.error}.`));
3126
+ break;
3127
+ }
3128
+
3129
+ case 'history': {
3130
+ const achados = extra.buscarHistorico(cfg.HISTORY_FILE, rest, 20);
3131
+ if (!achados.length) {
3132
+ console.log(c.muted(rest ? ` Nada com "${rest}" nos seus pedidos.` : ' Nenhum pedido guardado ainda.'));
3133
+ console.log(c.dim(' /chats mostra as conversas inteiras da sua conta.'));
3134
+ break;
3135
+ }
3136
+ console.log('');
3137
+ const largura = Math.max(30, (process.stdout.columns || 80) - 34);
3138
+ for (const e of achados) {
3139
+ const quando = new Date(e.ts).toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
3140
+ console.log(` ${c.dim(quando)} ${c.muted(ui.padRight(ui.truncate(e.project || e.mode || '', 14), 14))} `
3141
+ + ui.truncate(c.white(String(e.prompt).replace(/\s+/g, ' ')), largura));
3142
+ }
3143
+ console.log(c.dim(`\n ${achados.length === 20 ? 'Os 20 mais recentes' : achados.length + ' pedido(s)'}${rest ? ` com "${rest}"` : ''} · /history <termo> filtra · /chats abre conversas`));
3144
+ break;
3145
+ }
3146
+
3147
+ case 'keys': {
3148
+ console.log('');
3149
+ for (const [tecla, faz] of extra.ATALHOS) console.log(` ${c.brand(ui.padRight(tecla, 20))}${c.muted(faz)}`);
3150
+ break;
3151
+ }
3152
+
3153
+
3154
+ /* ── AS SKILLS ───────────────────────────────────────────────────
3155
+ * `/skills` lista, `/install-skill` traz de um arquivo, e
3156
+ * `/marketplace` é a tela onde se navega e liga.
3157
+ *
3158
+ * Nenhum dos três pede confirmação para ligar ou desligar: skill é
3159
+ * TEXTO, e o pior que um texto ruim faz é dar um conselho ruim ao
3160
+ * modelo — que o usuário vê acontecendo, ação por ação, na tela.
3161
+ */
3162
+ case 'skills': {
3163
+ const sub = rest.match(/^(store|loja|add|instalar)\b\s*(.*)$/i);
3164
+ if (sub && /^(store|loja)$/i.test(sub[1])) { await abrirMarketplace(); break; }
3165
+ if (sub) {
3166
+ const alvo = sub[2].trim();
3167
+ if (!alvo) {
3168
+ console.log(c.muted(' Uso: ') + c.brand('/skills add <caminho do SKILL.md>'));
3169
+ console.log(c.dim(' Ou abra o ') + c.brand('/skills store') + c.dim(' e escolha "New Skill" para escrever uma.'));
3170
+ break;
3171
+ }
3172
+ const r = await instalarComPortao(alvo);
3173
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
3174
+ console.log(c.ok(` Skill instalada: ${r.nome}`) + c.muted(` (${shortPath(r.caminho)})`));
3175
+ console.log(c.dim(' Já está ligada. /skills mostra todas.'));
3176
+ break;
3177
+ }
3178
+ const lista = skills.listar();
3179
+ if (!lista.length) { console.log(c.muted(' Nenhuma skill instalada.')); break; }
3180
+ const ligadas = lista.filter((s) => s.ligada);
3181
+ console.log('');
3182
+ console.log(c.bold(c.white(' Skills')) + c.dim(` ${ligadas.length} de ${lista.length} ligadas`));
3183
+ console.log('');
3184
+ for (const s of lista) {
3185
+ const marca = s.ligada ? c.ok('●') : c.dim('○');
3186
+ console.log(` ${marca} ${c.white(ui.padRight(s.titulo, 28))}`
3187
+ + c.dim(ui.truncate(s.descricao, (process.stdout.columns || 80) - 36)));
3188
+ }
3189
+ console.log('');
3190
+ console.log(c.dim(' /skills store liga e desliga · o corpo da skill só entra no pedido'));
3191
+ console.log(c.dim(' quando o assunto bate, para não gastar o teto de tokens à toa.'));
3192
+ break;
3193
+ }
3194
+
3195
+
3196
+ /* ── /voice ──────────────────────────────────────────────────────
3197
+ * O ouvido e a boca são Python (voz/primo_voz); o cérebro é este
3198
+ * terminal. Ver entradaDeVoz no main() e lib/plugin/voz.js.
3199
+ */
3200
+ case 'voice': {
3201
+ /* ── O MODO VOZ É UMA FORMA DE DIGITAR ─────────────────────────
3202
+ Você fala; o que foi dito entra aqui como se tivesse sido
3203
+ digitado — a mesma fila, o mesmo recado no meio da tarefa, o
3204
+ mesmo roteador de conversa — e a resposta final sai em voz alta.
3205
+ O terminal continua seu: dá para falar e digitar ao mesmo tempo.
3206
+
3207
+ Desligar é o primeiro caso de propósito: quem quer fechar o
3208
+ microfone quer AGORA, sem esbarrar em checagem de dependência. */
3209
+ const argVoz = (rest || '').trim();
3210
+ // Só o painel (HUD em tela cheia no Mac; quadro no terminal fora dele).
3211
+ if (/^painel$/i.test(argVoz)) {
3212
+ const py = vozModo.python();
3213
+ if (!py) { console.log(c.err(' O painel precisa do Python 3.')); break; }
3214
+ if (vozPainel) { try { vozPainel.processo.kill(); } catch {} vozPainel = null; }
3215
+ vozPainel = vozModo.abrirPainel({ python: py });
3216
+ console.log(c.muted(vozPainel.tela ? ' Tela do Primo aberta — ESC esconde.' : ' Sem o painel gráfico aqui: rode `primocode voz painel` num terminal separado.'));
3217
+ break;
3218
+ }
3219
+ // /voice nome <Nome>: a pessoa dá o nome ao assistente (o nome não ativa nada: o modo voz só abre no clique).
3220
+ const mNome = argVoz.match(/^nome\s+(.{2,20})$/i);
3221
+ if (mNome) {
3222
+ const salvo = vozModo.definirNome(mNome[1]);
3223
+ console.log(salvo ? c.ok(` Fechado: o assistente agora se chama ${salvo}. Vale na próxima vez que ligar o /voice.`) : c.err(' Nome inválido (1 ou 2 palavras, até 20 letras).'));
3224
+ break;
3225
+ }
3226
+ if (/^(parar|stop|off|sair)$/i.test(argVoz)) {
3227
+ if (vozPainel) { try { vozPainel.processo.kill(); } catch {} vozPainel = null; }
3228
+ if (!vozEmEspera) { console.log(c.muted(vozPainel === null ? ' Modo voz e painel fechados.' : ' O modo voz não está ligado.')); break; }
3229
+ try { vozEmEspera.processo.kill(); } catch {}
3230
+ vozEmEspera = null;
3231
+ console.log(c.muted(' Modo voz desligado. O microfone fechou.'));
3232
+ break;
3233
+ }
3234
+ if (vozEmEspera) {
3235
+ console.log(c.muted(' O modo voz já está ouvindo — é só falar.') + c.dim(' /voice parar desliga.'));
3236
+ break;
3237
+ }
3238
+
3239
+ // "Instale tudo que precisa, rode tudo que precisa." Da segunda vez
3240
+ // em diante tudo já está lá, e isto leva um segundo.
3241
+ const sp = new Spinner('preparando o modo voz').start();
3242
+ const prep = await vozModo.preparar((msg) => { sp.text = msg; });
3243
+ sp.stop();
3244
+ if (!prep.ok) {
3245
+ console.log(c.err(` ${prep.error}`));
3246
+ if (prep.comoResolver) console.log(c.muted(` ${prep.comoResolver}`));
3247
+ for (const a of prep.avisos) console.log(c.dim(` ${a}`));
3248
+ break;
3249
+ }
3250
+ for (const a of prep.avisos) console.log(c.dim(` ${a}`));
3251
+ if (process.platform === 'darwin') { try { vozModo.instalarApp({ python: prep.python }); } catch { /* o app é bônus */ } }
3252
+
3253
+ const sessao = vozModo.abrir({
3254
+ python: prep.python,
3255
+ servidor: state.config.server,
3256
+ token: state.config.token,
3257
+ voz: state.config.voz || 'antonio',
3258
+ aoPronto: () => {
3259
+ console.log(' ' + c.bold(c.brand('🎙 Modo voz ligado')) + c.muted(' — é só falar. A resposta sai em voz alta.'));
3260
+ console.log(' ' + c.dim('Falar por cima corta a voz · digitar continua valendo · /voice parar desliga'));
3261
+ },
3262
+ aoParar: () => { try { require('../session/runner/act.js').interromper(); } catch { /* nada rodando */ } },
3263
+ aoOuvir: (texto) => { if (entradaDeVoz) entradaDeVoz(texto); },
3264
+ mostrar: (texto) => console.log(' ' + c.dim(texto)),
3265
+ });
3266
+ vozEmEspera = sessao;
3267
+ require('../plugin/voz-ponte').escutar((nome, args) => sessao.ferramenta(nome, args));
3268
+ sessao.pronto.then((r) => {
3269
+ if (vozEmEspera === sessao) vozEmEspera = null;
3270
+ if (r && !r.ok) console.log(c.err(` o modo voz fechou: ${r.error}`));
3271
+ });
3272
+ break;
3273
+ }
3274
+
3275
+
3276
+ /* ── /connectors ─────────────────────────────────────────────────
3277
+ * Só mostra. Não há o que configurar — os conectores vivem no
3278
+ * servidor, com as chaves dele, e é assim de propósito: a promessa do
3279
+ * produto é que a API já vem pronta.
3280
+ *
3281
+ * Então por que existe? Porque "a IA está lenta hoje" e "ele errou o
3282
+ * código" têm causas diferentes e invisíveis: qual conector atendeu.
3283
+ * Sem esta tela, a única resposta possível é dar de ombros. Com ela,
3284
+ * dá para ver que o preferido está fora e outro assumiu — e essa é a
3285
+ * primeira pergunta de todo suporte.
3286
+ */
3287
+ case 'connectors': {
3288
+ const sp = new Spinner('lendo os conectores').start();
3289
+ let dados = null;
3290
+ try {
3291
+ dados = await api.getConectores(state.config.server, state.config.token);
3292
+ } catch (e) { sp.stop(); console.log(c.err(` Não deu para ler: ${ui.friendlyError(e)}`)); break; }
3293
+ sp.stop();
3294
+
3295
+ const lista = (dados && dados.conectores) || [];
3296
+ if (!lista.length) { console.log(c.muted(' O servidor não listou conector nenhum.')); break; }
3297
+
3298
+ console.log('');
3299
+ console.log(c.bold(c.white(' Conectores')) + c.dim(' — quem atende os seus pedidos'));
3300
+ console.log('');
3301
+ for (const cx of lista) {
3302
+ const marca = cx.ligado ? c.ok('●') : c.dim('○');
3303
+ const selos = [
3304
+ cx.gratis ? c.dim('grátis') : c.warn('pago'),
3305
+ cx.faz && cx.faz.ferramentas ? c.dim('ferramentas') : c.dim('só conversa'),
3306
+ ].join(c.dim(' · '));
3307
+ console.log(` ${marca} ${c.white(ui.padRight(cx.nome, 24))}${selos}`);
3308
+ console.log(` ${c.dim(ui.truncate(cx.porque || '', (process.stdout.columns || 80) - 6))}`);
3309
+ }
3310
+ const dePe = lista.filter((x) => x.ligado).length;
3311
+ console.log('');
3312
+ console.log(c.muted(` ${dePe} de ${lista.length} de pé.`)
3313
+ + c.dim(' Quem está fora não some da fila: entra assim que o servidor tiver a chave.'));
3314
+ console.log(c.dim(' Não há nada para você configurar — a API vem com o PrimoCode.'));
3315
+ break;
3316
+ }
3317
+
3318
+ /* A janela (/rc, /ide, `primo --app`) saiu na 10.0: o PrimoCode é
3319
+ o terminal. O nome antigo ainda responde, uma linha, para o dedo
3320
+ viciado não achar que a atualização quebrou. */
3321
+ case 'rc':
3322
+ case 'ide':
3323
+ console.log(c.muted(' A janela saiu na 10.0 — o PrimoCode agora é só o terminal.'));
3324
+ break;
3325
+
3326
+ /* A conta do PrimoCode (lib/config/conta.js). Padrão: abre o navegador, onde
3327
+ se cria a conta, entra ou redefine a senha. `/login senha` é o
3328
+ caminho sem navegador (SSH, servidor). */
3329
+ case 'login': {
3330
+ const partes = String(rest || '').trim().split(/\s+/);
3331
+ const jaEsta = conta.atual();
3332
+ if (jaEsta && !partes.includes('trocar')) {
3333
+ console.log(c.muted(' Já conectado como ') + c.brand(jaEsta.email || (jaEsta.uid.slice(0, 12) + '…'))
3334
+ + c.muted(` · plano ${jaEsta.plano}`));
3335
+ console.log(c.dim(' Para entrar com outra conta: ') + c.brand('/login trocar'));
3336
+ break;
3337
+ }
3338
+ if (jaEsta || conta.doConectaAntigo()) conta.sair();
3339
+
3340
+ let r;
3341
+ if (partes.includes('senha')) {
3342
+ const email = String(await ask(c.brand(' E-mail: ')) || '').trim();
3343
+ if (!email) { console.log(c.muted(' Login cancelado.')); break; }
3344
+ const senha = await askSecret(c.brand(' Senha: '));
3345
+ if (!senha) { console.log(c.muted(' Login cancelado.')); break; }
3346
+ const sp = new Spinner('entrando').start();
3347
+ r = await conta.entrar({ email, senha });
3348
+ sp.stop();
3349
+ } else {
3350
+ const sp = new Spinner('esperando você entrar no navegador').start();
3351
+ r = await conta.entrarPeloNavegador({
3352
+ aviso: (url) => {
3353
+ sp.stop();
3354
+ console.log(c.muted(' Abri o navegador para você criar a conta ou entrar.'));
3355
+ console.log(c.dim(' Não abriu? Copie: ') + c.brand(url));
3356
+ console.log(c.dim(' Sem navegador aqui? ') + c.brand('/login senha'));
3357
+ sp.start();
3358
+ },
3359
+ });
3360
+ sp.stop();
3361
+ }
3362
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
3363
+ console.log(c.ok(' Conectado.')
3364
+ + c.muted(r.pro ? ` Plano ${r.plano}.` : ' Sua conta ainda não tem plano: ') + (r.pro ? '' : c.brand('/account plans')));
3365
+ return r;
3366
+ }
3367
+
3368
+ /* O histórico da conta — o MESMO que o app desktop e o celular
3369
+ mostram. Sem número, lista; com número, abre e continua dali. */
3370
+ case 'chats': {
3371
+ if (!conta.atual()) {
3372
+ console.log(c.muted(' Não conectado. ') + c.brand('/login')
3373
+ + c.muted(' para ver suas conversas aqui, no app e no celular.'));
3374
+ break;
3375
+ }
3376
+ const sp = new Spinner('lendo suas conversas').start();
3377
+ const l = await nuvem.listarConversas({ limite: 20 });
3378
+ sp.stop();
3379
+ if (!l.ok) { console.log(c.err(` ${l.error}`)); break; }
3380
+ if (!l.conversas.length) {
3381
+ console.log(c.muted(' Nenhuma conversa salva ainda. A próxima já fica.'));
3382
+ break;
3383
+ }
3384
+ if (!rest) {
3385
+ console.log(c.white('\n Suas conversas'));
3386
+ l.conversas.forEach((x, i) => {
3387
+ const quando = x.atualizada
3388
+ ? new Date(x.atualizada).toLocaleDateString('pt-BR') : '—';
3389
+ console.log(' ' + c.dim(String(i + 1).padStart(2))
3390
+ + ' ' + c.white(x.titulo.slice(0, 52).padEnd(52))
3391
+ + c.dim(`${String(x.mensagens).padStart(3)} msg ${quando}`));
3392
+ });
3393
+ console.log(c.dim('\n /chats 1 abre a primeira e continua dela.'));
3394
+ break;
3395
+ }
3396
+ const n = Number(rest);
3397
+ const alvo = l.conversas[n - 1];
3398
+ if (!alvo) { console.log(c.err(` Não achei a conversa ${rest}.`)); break; }
3399
+ const conv = await abrirConversa(alvo);
3400
+ if (!conv.ok) { console.log(c.err(` ${conv.error}`)); break; }
3401
+ console.log(c.ok(` ${alvo.titulo}`)
3402
+ + c.muted(` · ${conv.mensagens.length} mensagens carregadas`));
3403
+ console.log(c.dim(' Pode continuar daqui — o que você disser volta pro app e pro celular.'));
3404
+ break;
3405
+ }
3406
+
3407
+ case 'logout': {
3408
+ if (!conta.atual()) { console.log(c.muted(' Você não está conectado.')); break; }
3409
+ conta.sair();
3410
+ console.log(c.ok(' Desconectado deste computador.')
3411
+ + c.dim(' A conta continua intacta; entre de novo com /login.'));
3412
+ break;
3413
+ }
3414
+
3415
+ case 'account': {
3416
+ if (/^(plans?|planos?)$/i.test(rest)) { await mostrarPlanos(); break; }
3417
+ const eu = conta.atual();
3418
+ if (!eu) {
3419
+ console.log(c.muted(' Não conectado. ') + c.brand('/login') + c.muted(' para entrar.'));
3420
+ break;
3421
+ }
3422
+ const sp = new Spinner('conferindo').start();
3423
+ // O plano guardado é a foto do último login: quem sabe é o documento da conta.
3424
+ const s = await conta.sessao();
3425
+ sp.stop();
3426
+ console.log(c.white(' Conta ') + c.muted(eu.email || eu.uid));
3427
+ if (s.ok) {
3428
+ const ate = s.planoAte ? c.dim(` até ${new Date(s.planoAte).toLocaleDateString('pt-BR')}`) : '';
3429
+ console.log(c.white(' Plano ') + (s.pro ? c.brand(s.plano) + ate : c.muted('sem plano ') + c.brand('/account plans')));
3430
+ } else if (s.offline) {
3431
+ console.log(c.white(' Plano ') + c.muted(eu.plano) + c.dim(' (sem rede — último conhecido)'));
3432
+ } else {
3433
+ console.log(c.err(` ${s.error}`));
3434
+ }
3435
+ console.log(c.dim(' Senha: ') + c.brand(`${conta.SITE}/entrar#esqueci`));
3436
+ break;
3437
+ }
3438
+
3439
+
3440
+ case 'uninstall': {
3441
+ if (await confirm('Remover o PrimoCode? Seus projetos em ~/primocode NÃO serão apagados.')) {
3442
+ await tools.uninstall();
3443
+ } else console.log(c.muted('Cancelado.'));
3444
+ break;
3445
+ }
3446
+
3447
+ case 'version': console.log(c.brand(`PrimoCode v${VERSION}`)); break;
3448
+ // rl.close() em vez de process.exit(): sair na marra descarta o que
3449
+ // ainda estava no buffer de saída.
3450
+ case 'exit': if (rl) rl.close(); break;
3451
+ /* ── OS COMANDOS APOSENTADOS ──────────────────────────────────────
3452
+ * `/claude`, `/gpt`, `/codex` e `/key` existiam quando o PrimoCode
3453
+ * rodava em cima da assinatura da própria pessoa: ela instalava o
3454
+ * Claude Code ou o Codex, colava uma chave de API, e só então o
3455
+ * agente pensava.
3456
+ *
3457
+ * Isso acabou. A API vem configurada no produto: quem entra na conta
3458
+ * já tem motor, e não há provedor nenhum para escolher.
3459
+ *
3460
+ * Eles não somem calados. Quem tem o dedo viciado em `/claude` e
3461
+ * bate num "comando não existe" conclui que a atualização quebrou
3462
+ * alguma coisa — e não vai procurar no /help, vai desinstalar. */
3463
+ case 'api': {
3464
+ await comandoApi(rest);
3465
+ break;
3466
+ }
3467
+
3468
+ /* O servidor aqui, no computador da pessoa, até a sessão acabar
3469
+ (lib/offline.js). "Enquanto não tenho acesso ao Railway, eu testo
3470
+ com o projeto rodando localmente." (24/09/2026) */
3471
+ case 'offline': {
3472
+ if (/^(off|sair|desligar|parar)$/i.test(rest)) {
3473
+ if (!state.servidorAntes) { console.log(c.muted(' O /offline não está ligado.')); break; }
3474
+ offline.desligar();
3475
+ state.config.server = state.servidorAntes;
3476
+ state.servidorAntes = null;
3477
+ console.log(c.ok(' Voltei ao servidor de antes: ') + c.dim(state.config.server));
3478
+ break;
3479
+ }
3480
+ if (state.servidorAntes) { console.log(c.muted(' Já está no servidor local: ') + c.dim(state.config.server) + c.muted(' · /offline off volta')); break; }
3481
+ const chaves = offline.prepararEnv();
3482
+ if (chaves.criado || !chaves.temChave) {
3483
+ console.log(c.warn(` ${chaves.criado ? 'Criei' : 'Falta chave em'} ${chaves.arquivo}`));
3484
+ console.log(c.muted(' Cole nele as chaves do Render (primocode-server → Environment), uma por linha:'));
3485
+ console.log(c.dim(' GROQ_API_KEY=… OPENROUTER_API_KEY=… GEMINI_API_KEY=…'));
3486
+ console.log(c.muted(' Depois rode ') + c.brand('/offline') + c.muted(' de novo.'));
3487
+ break;
3488
+ }
3489
+ const dir = offline.acharServidor({ pedido: rest });
3490
+ const sp = new Spinner('subindo o servidor aqui').start();
3491
+ const r = await offline.ligar({ dir, env: chaves.env });
3492
+ sp.stop();
3493
+ if (!r.ok) {
3494
+ console.log(c.err(' ' + r.error));
3495
+ if (r.comoResolver) console.log(c.dim(' → ' + r.comoResolver));
3496
+ break;
3497
+ }
3498
+ state.servidorAntes = state.config.server;
3499
+ state.config.server = r.url;
3500
+ console.log(c.ok(` Servidor ${r.versao || ''} ${r.reaproveitado ? 'que já estava de pé' : 'rodando aqui'}: `) + c.dim(r.url));
3501
+ console.log(c.dim(` ${dir || ''}${dir ? ' · ' : ''}chaves: ${chaves.nomes.join(', ')}${r.reaproveitado ? '' : ' · log em ' + offline.ARQUIVO_LOG}`));
3502
+ if (provedorLocal.atual()) console.log(c.warn(' Atenção: o /api está ligado e fala direto com a IA. Para usar o servidor local, /api off.'));
3503
+ console.log(c.muted(' Vale até fechar o PrimoCode. ') + c.brand('/offline off') + c.muted(' volta antes.'));
3504
+ break;
3505
+ }
3506
+
3507
+ /* Os comandos da pessoa: lista, e explica como fazer o dela. */
3508
+ case 'styles': {
3509
+ // Os kits de estilo de motion (lib/plugin/kits.js): a lista no terminal e a galeria (capa + preview + nome).
3510
+ const K = require('../plugin/kits.js');
3511
+ const a = String(rest || '').trim();
3512
+ if (a && !/^(galeria|abrir|lista)$/i.test(a)) {
3513
+ const k = K.achar(a);
3514
+ if (!k) { console.log(c.warn(` Não achei o estilo "${a}". /styles mostra todos.`)); break; }
3515
+ console.log(` ${c.brand(k.nome)} ${c.muted(`(${k.slug} · ${k.familia})`)}`);
3516
+ console.log(` ${k.descricao}`);
3517
+ if (k.quando.length) console.log(c.muted(` Serve pra: ${k.quando.slice(0, 3).join('; ')}`));
3518
+ if (!K.previewPronto(k)) console.log(c.muted(' Renderizando o preview aqui (uma vez só)…'));
3519
+ const r = await K.main(['preview', k.slug], { aoFalar: (t) => process.stdout.write(c.muted(`\r ⎿ ${t}`.padEnd(60))) });
3520
+ process.stdout.write('\n');
3521
+ if (r.ok && r.video) { if (process.env.PRIMOCODE_APP !== '1') tools.openInBrowser(r.video); console.log(c.ok(` ${r.texto}`)); }
3522
+ else console.log(c.warn(` ${r.texto}`));
3523
+ console.log(c.muted(` Pra usar: peça o vídeo dizendo "estilo ${k.nome.split(' · ')[0].toLowerCase()}".`));
3524
+ break;
3525
+ }
3526
+ for (const l of K.listaParaPessoa()) console.log(/^\s/.test(l) ? c.muted(l) : ` ${c.brand(l)}`);
3527
+ if (a.toLowerCase() === 'lista') break;
3528
+ // a tela de estilos (os kits no carrossel da tela de gosto): no terminal abre no navegador, no app numa janela
3529
+ console.log(c.muted(` Abri a tela de estilos${process.env.PRIMOCODE_APP === '1' ? '' : ' no navegador'} (até 10 min). Escolha um estilo ou feche pra voltar.`));
3530
+ const r = await K.main(['galeria']);
3531
+ console.log((r.ok ? c.ok : c.muted)(` ${r.texto} · /styles <estilo> mostra o preview no terminal`));
3532
+ break;
3533
+ }
3534
+ case 'team': {
3535
+ const team = require('../team.js');
3536
+ const achados = team.instalados();
3537
+ const o = team.entender(rest, achados);
3538
+ if (o.erro) { console.log(c.warn(` ${o.erro}`)); break; }
3539
+ if (o.acao === 'status') {
3540
+ const ligado = achados.some((x) => x.nome === state.config.team) ? state.config.team : null;
3541
+ team.status(achados, ligado).forEach((l, i) => console.log(i === 0 ? c.white(` ${l}`) : c.muted(` ${l}`)));
3542
+ break;
3543
+ }
3544
+ if (o.acao === 'desligar') {
3545
+ state.config.team = null;
3546
+ cfg.saveConfig({ team: null });
3547
+ console.log(c.ok(' O PrimoCode volta a trabalhar sozinho.'));
3548
+ break;
3549
+ }
3550
+ if (o.acao === 'ligar') {
3551
+ state.config.team = o.nome;
3552
+ cfg.saveConfig({ team: o.nome });
3553
+ console.log(c.ok(` ${team.PARCEIROS[o.nome].titulo} ligado: o PrimoCode faz e ele revisa, só lendo.`));
3554
+ console.log(c.dim(` /team ${o.nome} faz <pedido> deixa ele fazer · /team off desliga`));
3555
+ break;
3556
+ }
3557
+ await parceiroFaz(o.nome, o.pedido);
3558
+ break;
3559
+ }
3560
+
3561
+ case 'commands': {
3562
+ const novo = rest.match(/^(novo|new|criar)\s+(\S+)$/i);
3563
+ if (novo) {
3564
+ const r = comandosLib.criar(novo[2]);
3565
+ if (!r.ok) { console.log(c.err(` ${r.error}`)); break; }
3566
+ cacheComandos.em = 0;
3567
+ console.log(c.ok(` Criado: /${path.basename(r.arquivo, '.md')}`) + c.muted(' abra e escreva o pedido:'));
3568
+ console.log(' ' + c.white(r.arquivo));
3569
+ break;
3570
+ }
3571
+ const lista = comandosDaPessoa();
3572
+ console.log(c.white('\n Seus comandos'));
3573
+ for (const x of lista) {
3574
+ console.log(` ${c.brand(ui.padRight('/' + x.nome, 14))}${c.dim(ui.padRight(x.origem, 11))}${c.muted(x.descricao)}`);
3575
+ }
3576
+ console.log(c.dim('\n Um arquivo .md vira um comando: review.md é /review.'));
3577
+ console.log(c.dim(' ~/.primocode/comandos/ vale em todo projeto · <projeto>/.primocode/comandos/ só naquele.'));
3578
+ console.log(c.dim(' $ARGUMENTOS no texto recebe o que você digitar depois: /review o login.'));
3579
+ console.log(c.dim(' /commands novo <nome> cria um para você editar.'));
3580
+ break;
3581
+ }
3582
+
3583
+ case 'claude': case 'gpt': case 'codex': case 'key': {
3584
+ console.log(c.muted(' Não existe mais provedor para configurar.'));
3585
+ console.log(c.muted(' A API já vem com o PrimoCode: entrou na conta, pode usar.'));
3586
+ console.log(c.dim(' /effort escolhe o esforço · /account mostra o seu plano'));
3587
+ break;
3588
+ }
3589
+
3590
+ default: {
3591
+ // "/" sozinho abre o menu; um prefixo único autopreenche e executa
3592
+ // ("/eff" → /effort); prefixo ambíguo mostra as opções.
3593
+ if (!cmd) { mostrarMenuSlash(); break; }
3594
+ // Chegou aqui, não é embutido: o switch já atendeu todos eles.
3595
+ // Por isso um /help.md da pessoa nunca troca o /help de verdade.
3596
+ const proprio = comandosDaPessoa().find((x) => x.nome === nome);
3597
+ if (proprio) {
3598
+ console.log(c.dim(` ⎿ /${proprio.nome} · ${proprio.origem}`));
3599
+ // O MESMO caminho de um pedido digitado: modo, pasta, plano,
3600
+ // tudo. Um atalho que pulasse o sendPrompt pularia junto o
3601
+ // portão do plano e a escolha da pasta.
3602
+ await sendPrompt(comandosLib.expandir(proprio, rest));
3603
+ break;
3604
+ }
3605
+ let casam = comandosDoMenu().map(([nome]) => nome.slice(1)).filter((n) => n.startsWith(cmd.toLowerCase()));
3606
+ // Meio apelido antigo também serve: "/desf" chega no /undo.
3607
+ if (!casam.length) casam = nomes.porPrefixo(cmd).filter((n) => comandosDoMenu().some(([m]) => m === '/' + n));
3608
+ if (casam.length === 1) {
3609
+ console.log(c.dim(` → /${casam[0]}`));
3610
+ await handleSlash('/' + casam[0] + (rest ? ' ' + rest : ''));
3611
+ break;
3612
+ }
3613
+ if (casam.length > 1) {
3614
+ console.log(c.muted(` /${cmd}… pode ser:`));
3615
+ for (const n of casam) {
3616
+ const [, desc] = comandosDoMenu().find(([nome]) => nome === '/' + n);
3617
+ console.log(` ${c.brand(ui.padRight('/' + n, 12))}${c.dim(desc)}`);
3618
+ }
3619
+ break;
3620
+ }
3621
+ console.log(c.err(`Comando desconhecido: /${cmd}. Digite / para ver o menu.`));
3622
+ }
3623
+ }
3624
+ }
3625
+
3626
+ // ── Main ───────────────────────────────────────────────────────────────
3627
+
3628
+ function shortPath(p) {
3629
+ // Normaliza as barras antes de comparar — no Windows o cwd vem com "\"
3630
+ // e a home pode vir com "/", e aí o prefixo nunca batia.
3631
+ const norm = (s) => path.resolve(s).replace(/\\/g, '/');
3632
+ const home = norm(os.homedir());
3633
+ const full = norm(p);
3634
+ return full.startsWith(home + '/') ? '~' + full.slice(home.length) : full;
3635
+ }
3636
+
3637
+ /* O CLIENTE NOVO E O SERVIDOR VELHO.
3638
+ *
3639
+ * Quem declara ao modelo quais ferramentas existem é o servidor. Quando a
3640
+ * lista dele fica para trás, o que a pessoa vê é "a ferramenta não está
3641
+ * disponível" e tarefas que param no meio — duas frases que não apontam para
3642
+ * a causa. Uma linha no começo da sessão troca isso por algo acionável.
3643
+ *
3644
+ * Sem prender nada: a busca corre em paralelo e, se o servidor estiver
3645
+ * dormindo ou a rede fora, não se diz nada. Acusar o servidor porque a rede
3646
+ * caiu manda consertar o que não quebrou. */
3647
+ let jaConferiu = false;
3648
+ function conferirServidor() {
3649
+ if (jaConferiu) return;
3650
+ jaConferiu = true;
3651
+ const minimo = (pkg.primocode && pkg.primocode.servidorMinimo) || '';
3652
+ if (!minimo) return;
3653
+ // Com a chave própria (/api), quem pensa não é o servidor: a versão dele
3654
+ // não muda nada no que a pessoa pede.
3655
+ if (provedorLocal.atual()) return;
3656
+ const servidor = state.config.server;
3657
+ Promise.resolve()
3658
+ .then(() => api.getHealth(servidor, state.config.token))
3659
+ .then((saude) => {
3660
+ const r = compat.avaliar({ saude, minimo, servidor });
3661
+ const texto = compat.aviso(r, c);
3662
+ if (texto) console.log('\n' + texto + '\n');
3663
+ })
3664
+ .catch(() => {});
3665
+ }
3666
+
3667
+ async function main() {
3668
+ /* `primocode autoteste|preview|review|pesquisar`: entradas sem sessão (lib/cli/subcomandos.js). */
3669
+ if (require('./subcomandos.js').NOMES.includes(process.argv[2])) {
3670
+ process.exit(await require('./subcomandos.js').main(process.argv[2], process.argv.slice(3)));
3671
+ }
3672
+ /* `primocode --tentativas N "pedido"`: best of N em worktrees separados (lib/cli/tentativas.js). */
3673
+ if (process.argv.slice(2).some((a) => a === '--tentativas' || a.startsWith('--tentativas='))) {
3674
+ process.exit(await require('./tentativas.js').main(process.argv.slice(2)));
3675
+ }
3676
+ /* `primocode video <op>`: o editor de vídeo por linha do tempo
3677
+ (lib/plugin/video/). Sai ANTES de tudo — sem sessão, sem pasta padrão —
3678
+ porque quem chama é o agente pelo run_shell, na pasta da gravação. */
3679
+ if (process.argv[2] === 'video') {
3680
+ process.exit(await require('../plugin/video/cli.js').main(process.argv.slice(3)));
3681
+ }
3682
+ /* `primocode editor <acao> --json '{...}'`: a edição completa de vídeo falado
3683
+ (lib/plugin/editor-pro.js, motor do EDIT IA PRO), pelo run_shell quando o servidor
3684
+ ainda não declara a ferramenta editor_pro. Uma linha de JSON no stdout. */
3685
+ if (process.argv[2] === 'editor') {
3686
+ process.exit(await require('../plugin/editor-pro.js').main(process.argv.slice(3)));
3687
+ }
3688
+ /* `primocode gosto medir <video> [mais videos] [--salvar]`: os números do vídeo que a pessoa curtiu (lib/plugin/estudio/gosto-medir.js).
3689
+ Com --salvar, cada um entra no gosto como referência. (O /taste de dentro da sessão é outra entrada.) */
3690
+ // `primocode gosto` fora da sessão: o mesmo que o /gosto mostra (o que você escolheu, as referências, pra onde inclina)
3691
+ // `primocode porta`: o /porta fora da sessão, na pasta atual — é o que o agente roda pelo run_shell (lib/porta.js)
3692
+ if (process.argv[2] === 'porta') {
3693
+ const r = await require('../porta.js').diagnostico(path.resolve(process.argv[3] || process.cwd()));
3694
+ for (const l of r.linhas) console.log(' ' + l);
3695
+ process.exit(0);
3696
+ }
3697
+ if (process.argv[2] === 'gosto' && process.argv[3] === 'provar') {
3698
+ const G = require('../plugin/estudio/gosto.js'), P = require('../plugin/estudio/gosto-prova.js');
3699
+ const assunto = process.argv.slice(4).join(' ').trim() || 'um vídeo de apresentação';
3700
+ for (const l of P.texto(P.provar(G.pesos(G.ler()), { assunto }), assunto)) console.log(' ' + l);
3701
+ process.exit(0);
3702
+ }
3703
+ if (process.argv[2] === 'gosto' && (!process.argv[3] || process.argv[3] === 'ver')) {
3704
+ const G = require('../plugin/estudio/gosto.js');
3705
+ const linhas = G.listar(G.ler());
3706
+ if (!linhas.length) console.log(' Ainda não tem gosto salvo. Dentro do PrimoCode: /taste referencias recebe os vídeos que você curtiu.\n Daqui: primocode gosto medir <vídeo ou pasta> --salvar');
3707
+ else for (const l of linhas) console.log(' ' + l);
3708
+ process.exit(0);
3709
+ }
3710
+ if (process.argv[2] === 'gosto' && process.argv[3] === 'medir') {
3711
+ const salvar = process.argv.includes('--salvar'), json = process.argv.includes('--json');
3712
+ const { medir, explicar, videosDe } = require('../plugin/estudio/gosto-medir.js');
3713
+ const pedidos = process.argv.slice(4).filter((x) => x !== '--salvar' && x !== '--json');
3714
+ const arquivos = videosDe(pedidos.map((x) => path.resolve(x)));
3715
+ if (!pedidos.length) { console.error('Uso: primocode gosto medir <vídeo ou pasta> [mais] [--salvar] [--json]'); process.exit(1); }
3716
+ if (!arquivos.length) { console.error('Não achei vídeo (mp4, mov, m4v ou webm) nessa pasta.'); process.exit(1); }
3717
+ if (salvar && arquivos.length > 5) console.log(' O gosto guarda até 5 vídeos: ficam os 5 últimos desta lista.\n');
3718
+ const G = require('../plugin/estudio/gosto.js');
3719
+ let falhou = false;
3720
+ for (const f of arquivos) {
3721
+ const m = await medir(f);
3722
+ if (m.ok && salvar) G.adicionarReferencia(m, { nome: path.basename(f) });
3723
+ if (!m.ok) falhou = true;
3724
+ if (json) console.log(JSON.stringify(m, null, 2));
3725
+ else console.log(explicar(m, { cor: !!process.stdout.isTTY }).join('\n') + '\n');
3726
+ }
3727
+ if (!json) console.log(salvar ? ' Guardado no seu gosto. O próximo motion leva isso em conta (/taste mostra).' : ' Pra guardar como referência do seu gosto: --salvar');
3728
+ process.exit(falhou ? 1 : 0);
3729
+ }
3730
+ // `primocode motioncraft …`: o motion com o MotionCraft + a voz do PrimoCode.
3731
+ if (process.argv[2] === 'motioncraft') {
3732
+ process.exit(require('../plugin/motioncraft.js').main(process.argv.slice(3)));
3733
+ }
3734
+ // `primocode mcp …`: os servidores MCP pelo run_shell (lib/mcp/mcp.js).
3735
+ if (process.argv[2] === 'videos') {
3736
+ const r = require('../plugin/estudio/exportar.js').main(process.argv.slice(3));
3737
+ console.log(r.texto); process.exit(r.ok ? 0 : 1);
3738
+ }
3739
+ if (process.argv[2] === 'conversas' || process.argv[2] === 'conversa') {
3740
+ process.exit(await require('../app-chat.js').main(process.argv[2], process.argv.slice(3)));
3741
+ }
3742
+ if (process.argv[2] === 'menu-comandos') { // a paleta de / do app: os mesmos do terminal, mais os da pessoa
3743
+ const embutidos = new Set(SLASH_COMANDOS.map(([n]) => n));
3744
+ console.log(JSON.stringify({ ok: true, comandos: comandosDoMenu().map(([nome, descricao]) => ({ nome, descricao: ui.stripAnsi ? ui.stripAnsi(String(descricao)) : String(descricao), embutido: embutidos.has(nome) })) }));
3745
+ process.exit(0);
3746
+ }
3747
+ // `primocode kit …`: os kits de estilo de motion (lib/plugin/kits.js). Pelo run_shell do agente ele roda dentro do processo (lib/tool/tools.js).
3748
+ if (process.argv[2] === 'kit' || process.argv[2] === 'kits') {
3749
+ const r = await require('../plugin/kits.js').main(process.argv.slice(3), { projectDir: process.cwd(), aoFalar: (t) => process.stderr.write(` ⎿ ${t}\n`) });
3750
+ console.log(r.texto);
3751
+ process.exit(r.ok ? 0 : 1);
3752
+ }
3753
+ if (process.argv[2] === 'skill' || process.argv[2] === 'skills') {
3754
+ process.exit(require('../skill/skills.js').main(process.argv.slice(3)));
3755
+ }
3756
+ // `primocode planos`: a tabela comparativa, sem abrir a sessão.
3757
+ // `primocode voz nome <Nome>` / `primocode voz painel`: o Primo sem abrir a sessão.
3758
+ if (process.argv[2] === 'voz') {
3759
+ const vz = require('../plugin/voz.js');
3760
+ const [sub, ...resto] = process.argv.slice(3);
3761
+ if (sub === 'nome') {
3762
+ const n = vz.definirNome(resto.join(' '));
3763
+ console.log(n ? `Fechado: o assistente agora se chama ${n}.` : 'Uso: primocode voz nome <Nome> (1 ou 2 palavras)');
3764
+ process.exit(n ? 0 : 1);
3765
+ }
3766
+ if (sub === 'painel') {
3767
+ const py = vz.python();
3768
+ if (!py) { console.log('O painel precisa do Python 3.'); process.exit(1); }
3769
+ const r = vz.abrirPainel({ python: py });
3770
+ r.processo.on('close', () => process.exit(0));
3771
+ return;
3772
+ }
3773
+ if (sub === 'instalar-app') {
3774
+ const py = vz.python();
3775
+ if (!py) { console.log('O app precisa do Python 3 (rode /voice uma vez para preparar o ambiente).'); process.exit(1); }
3776
+ const r = vz.instalarApp({ python: py, dock: resto.includes('--dock') });
3777
+ console.log(r.ok ? `Primo.app instalado em ${r.app}. Abra pelo Launchpad, Spotlight ou Finder.` : `Não deu: ${r.erro || 'veja o log'}`);
3778
+ process.exit(r.ok ? 0 : 1);
3779
+ }
3780
+ console.log('Uso: primocode voz nome <Nome> | primocode voz painel | primocode voz instalar-app [--dock] (o resto é /voice dentro da sessão)');
3781
+ process.exit(0);
3782
+ }
3783
+ if (['doutor', 'doctor', 'preparar'].includes(process.argv[2])) {
3784
+ process.exit(await require('../preparar.js').main(process.argv.slice(2)));
3785
+ }
3786
+ if (process.argv[2] === 'planos') {
3787
+ const { loadConfig } = require('../config/config');
3788
+ const r = await planosTela.buscarPlanos(loadConfig().server);
3789
+ const eu = conta.atual();
3790
+ for (const l of planosTela.desenhar(r, { cores: c, atual: eu && eu.pro ? eu.plano : null, site: conta.SITE })) console.log(l);
3791
+ process.exit(0);
3792
+ }
3793
+ if (process.argv[2] === 'marca') {
3794
+ process.exit(await require('../plugin/marca-kit.js').main(process.argv.slice(3)));
3795
+ }
3796
+ if (process.argv[2] === 'app') {
3797
+ const r = require('../cli-nova.js').app();
3798
+ console.log(r.texto); process.exit(r.ok ? 0 : 1);
3799
+ }
3800
+ /* `primocode server`: o app-server local (lib/app-server/). stdout é do JSON-RPC. */
3801
+ if (process.argv[2] === 'server') {
3802
+ process.exit(await require('../app-server/cli.js').main(process.argv.slice(3)));
3803
+ }
3804
+ if (process.argv[2] === 'mcp') {
3805
+ process.exit(await require('../mcp/mcp.js').main(process.argv.slice(3)));
3806
+ }
3807
+ cfg.ensureStructure();
3808
+ // O token da conta dura uma hora: renova agora e a cada minuto (lib/config/conta.js).
3809
+ await conta.manterVivo();
3810
+
3811
+ // Padrão fixo: ~/primocode, não importa de onde o comando foi dado. Antes ele
3812
+ // adotava a pasta atual do terminal, e o mesmo "crie um site" caía num lugar
3813
+ // diferente a cada vez — quem digitava não tinha como saber onde ia parar.
3814
+ state.workDir = cfg.ROOT_DIR;
3815
+ state.currentProject = null;
3816
+ state.workDirOrigem = 'padrao';
3817
+ // O projeto em que se estava na última sessão (até uma semana atrás): o
3818
+ // "continua o jogo" de amanhã cai nele, e não num projeto novo.
3819
+ // O app do Primo (voz) manda a pasta de cada pedido: PRIMOCODE_PASTA (+ ORIGEM) e nunca herda a última do terminal.
3820
+ const lembrado = process.env.PRIMOCODE_APP === '1'
3821
+ ? (process.env.PRIMOCODE_PASTA && fs.existsSync(process.env.PRIMOCODE_PASTA)
3822
+ ? { dir: process.env.PRIMOCODE_PASTA, origem: process.env.PRIMOCODE_PASTA_ORIGEM === '/dir' ? '/dir' : 'projeto' } : null)
3823
+ : cfg.projetoLembrado();
3824
+ if (lembrado && pastaSegura(lembrado.dir)) {
3825
+ state.workDir = lembrado.dir;
3826
+ state.currentProject = path.basename(lembrado.dir);
3827
+ state.workDirOrigem = lembrado.origem === '/dir' ? '/dir' : 'projeto';
3828
+ }
3829
+
3830
+ // Modo guardado entre sessões. O padrão é auto: sem ele, um "oi" gasta o
3831
+ // mesmo que uma refatoração.
3832
+ state.mode = ['primocode', 'chat', 'auto'].includes(process.env.PRIMOCODE_MODO || state.config.mode) ? (process.env.PRIMOCODE_MODO || state.config.mode) : 'auto';
3833
+
3834
+ // `-c` / `--continue` pode vir em qualquer posição e sai da lista: o
3835
+ // resto (one-shot, -f) segue sendo lido do jeito de sempre.
3836
+ const todos = process.argv.slice(2);
3837
+ const continuar = todos.some((a) => a === '-c' || a === '--continue');
3838
+ const fl = retomar.analisar(todos.filter((a) => a !== '-c' && a !== '--continue'));
3839
+ const args = fl.args;
3840
+ if (fl.erro) { console.error(fl.erro); process.exit(1); }
3841
+ if (fl.worktree) {
3842
+ // Antes de tudo: a sessão inteira nasce dentro do worktree.
3843
+ const w = retomar.criarWorktree(fl.worktree, process.cwd());
3844
+ if (!w.ok) { console.error(w.error); process.exit(1); }
3845
+ process.chdir(w.path);
3846
+ console.log(c.dim(` ⎿ worktree ${w.path} (branch ${w.branch})`));
3847
+ }
3848
+
3849
+ // Flags padrão de CLI — funcionam em qualquer máquina, úteis em scripts/CI.
3850
+ if (args[0] === '--version' || args[0] === '-v' || args[0] === '-V') {
3851
+ console.log(`PrimoCode v${VERSION}`);
3852
+ process.exit(0);
3853
+ }
3854
+ if (args[0] === '--help' || args[0] === '-h') {
3855
+ console.log(welcomeBox(VERSION, null, { mascot: state.config.mascot, userName: state.config.userName, modo: state.mode }));
3856
+ console.log(montarHelp());
3857
+ process.exit(0);
3858
+ }
3859
+
3860
+ /* `-p` / `--print`: o modo de script e CI (lib/cli/headless.js). Sem tela, o
3861
+ stdin entra no pedido, e --output-format json devolve um JSON só. */
3862
+ {
3863
+ const H = require('./headless.js');
3864
+ const h = H.analisar(args);
3865
+ if (h.ativo) {
3866
+ if (h.erro) { console.error(h.erro); process.exit(1); }
3867
+ if (h.permissao) {
3868
+ const perm = perigo.normalizarModo(h.permissao);
3869
+ state.config.permissoes = perm; // só nesta execução, não grava
3870
+ }
3871
+ const inicio = Date.now();
3872
+ const pedido = H.montarPedido(h.resto.filter((a) => a !== '-f'), await H.lerStdin());
3873
+ if (!pedido) { console.error('Uso: primocode -p "pedido" [--output-format json] [--permission-mode plan]'); process.exit(1); }
3874
+ if (typeof fl.resume === 'string') await retomarConversa(fl.resume);
3875
+ else if (continuar) await continuarUltima();
3876
+ // O script trabalha na pasta de onde rodou, não no último projeto (sem lembrar: é só nesta execução).
3877
+ const aqui = H.pastaDoScript({ cwd: process.cwd(), casa: os.homedir(), raiz: cfg.ROOT_DIR, app: process.env.PRIMOCODE_APP === '1' });
3878
+ if (aqui) { state.workDir = aqui; state.currentProject = path.basename(aqui); state.workDirOrigem = 'terminal'; }
3879
+ state.semTerminal = true;
3880
+ process.env.PRIMOCODE_SEM_TELA = '1'; // modo script: nenhuma tela de gosto abre no navegador (com PRIMOCODE_APP=1 o app abre pela linha `primocode:abrir-gosto`)
3881
+ if (process.env.PRIMOCODE_LOG_FERRAMENTAS === '1') { // o app do Primo registra cada ferramenta no log dele
3882
+ require('../plugin/voz-ponte').escutar((nome, a) => process.stderr.write(`ferramenta: ${nome} ${JSON.stringify(a || {}).slice(0, 220)}\n`));
3883
+ }
3884
+ let erro = null;
3885
+ const antes = state.history.length;
3886
+ const comando = isSlash(pedido); // `-p "/map tree"`: o comando roda como no terminal (o app usa isso)
3887
+ const texto = await H.capturar(async () => {
3888
+ try { if (comando) await handleSlash(pedido); else await sendPrompt(pedido); } catch (e) { erro = e.message || String(e); }
3889
+ }, { calar: h.formato === 'json' });
3890
+ await state.gravador.esperar(); // o último turno termina de subir, e o id da conversa existe
3891
+ if (h.formato === 'json') console.log(H.resultadoJson({ texto, erro, inicio, permissao: state.config.permissoes, conversa: state.gravador.id, markdown: H.ultimaResposta(state.history, antes) }));
3892
+ else if (erro) console.error(erro);
3893
+ process.exit(erro ? 1 : 0);
3894
+ }
3895
+ }
3896
+
3897
+ // Modo one-shot: primocode "crie um jogo de carro"
3898
+ if (args.length && !args[0].startsWith('-')) {
3899
+ const fileFlag = args.indexOf('-f');
3900
+ const words = fileFlag >= 0 ? args.slice(0, fileFlag) : args;
3901
+ const promptText = words.join(' ');
3902
+
3903
+ if (fileFlag >= 0 && args[fileFlag + 1]) {
3904
+ try {
3905
+ const fc = fs.readFileSync(path.resolve(args[fileFlag + 1]), 'utf-8');
3906
+ state.attachedFiles.push({ path: args[fileFlag + 1], content: fc });
3907
+ } catch { console.log(c.err(`Não consegui ler: ${args[fileFlag + 1]}`)); process.exit(1); }
3908
+ }
3909
+
3910
+ // Com -c, o pedido continua a última conversa em vez de chegar sozinho.
3911
+ if (typeof fl.resume === 'string') await retomarConversa(fl.resume);
3912
+ else if (continuar) await continuarUltima();
3913
+ /* O MESMO caminho do pedido digitado (sendPrompt). Este modo tinha um
3914
+ runAct próprio, e por isso ficava sem tudo o que vive lá: o plano em
3915
+ passos, a retomada automática, o @arquivo, o checkpoint do /desfazer. */
3916
+ state.semTerminal = true;
3917
+ global.__primocodeTarefa = promptText.slice(0, 60);
3918
+ await sendPrompt(promptText);
3919
+ global.__primocodeTarefa = null;
3920
+ process.exit(0);
3921
+ }
3922
+
3923
+ /* A TELA CHEIA do OpenCode (lib/tui/tela.js) é o padrão: a conversa rola em
3924
+ cima, a caixa fica presa no pé, a barra da direita mostra a sessão e o
3925
+ contexto, e sem conversa a home põe o logo e a caixa no meio da tela.
3926
+ PRIMOCODE_TELA=linha (ou "tela": "linha" no config) volta ao jeito
3927
+ antigo, que escreve em linha pelo terminal. */
3928
+ const telaCheia = process.stdout.isTTY && process.stdout.rows >= 16
3929
+ && (process.env.PRIMOCODE_TELA || state.config.tela || 'cheia') !== 'linha';
3930
+ if (!telaCheia) {
3931
+ if (process.stdout.isTTY && process.stdout.rows >= 20) {
3932
+ const rows = process.stdout.rows;
3933
+ const alto = 8 + 6; // o logo com a versão + a caixa
3934
+ process.stdout.write('\n'.repeat(rows) + '\x1b[H' + '\n'.repeat(Math.max(0, Math.floor((rows - alto) / 2) - 1)));
3935
+ }
3936
+ console.log(welcomeBox(VERSION, state.workDir ? shortPath(state.workDir) : null, {
3937
+ pastaPadrao: state.workDirOrigem === 'padrao',
3938
+ }));
3939
+ }
3940
+ rl = entrada.criar({
3941
+ status: barraDeStatus,
3942
+ comandos: comandosDoMenu,
3943
+ vazio: ui.convite(),
3944
+ telaCheia,
3945
+ lateral: barraLateral,
3946
+ logoAnimado: (quadro, trabalhando) => ui.logoAnimado(state.config.mascot, quadro, trabalhando),
3947
+ agora: () => (ui.agora.texto && Date.now() - ui.agora.desde < 10 * 60 * 1000 ? ui.agora.texto : ''),
3948
+ versao: VERSION,
3949
+ logo: ui.logoComMascote(state.config.mascot),
3950
+ pasta: () => {
3951
+ const dir = state.workDir || process.cwd();
3952
+ const ramo = ramoDoGit(dir);
3953
+ return shortPath(dir) + (ramo ? ':' + ramo : '');
3954
+ },
3955
+ });
3956
+ if (telaCheia && state.workDirOrigem === 'padrao') {
3957
+ console.log(c.warn(` pasta padrão: ${shortPath(state.workDir)}`) + c.dim(' · /dir <pasta> para trabalhar numa sua'));
3958
+ }
3959
+ /* A última conversa desta pasta, em uma linha (lib/passagem.js). Uma vez por abertura, só aqui (o -p já saiu
3960
+ antes) e só se a pessoa não abriu já retomando (-c / --resume). */
3961
+ if (!state.dicaRetomarMostrada && !continuar && !fl.resume && state.workDirOrigem !== 'padrao') {
3962
+ state.dicaRetomarMostrada = true;
3963
+ try {
3964
+ const linha = require('../passagem.js').linhaDeAbertura(fs.readFileSync(path.join(state.workDir || process.cwd(), 'memory.md'), 'utf8').slice(-20000));
3965
+ if (linha) console.log(c.muted(' ' + linha));
3966
+ } catch { /* a dica nunca derruba a abertura */ }
3967
+ }
3968
+ // O spinner desenha dentro da caixa (lib/tui/entrada.js mostrarSpinner).
3969
+ if (rl.tty) Spinner.caixa = rl;
3970
+ ui.titulo('PrimoCode');
3971
+
3972
+ rl.prompt();
3973
+
3974
+ // Fila: o readline continua emitindo 'line' enquanto um pedido está sendo
3975
+ // processado. Sem enfileirar, dois pedidos rodariam sobrepostos.
3976
+ const queue = [];
3977
+ let busy = false;
3978
+ let closed = false;
3979
+ let saidBye = false;
3980
+
3981
+ /* ── Esc Esc: parar o agente no meio do trabalho ──
3982
+ * Um Esc avisa; o segundo (em até 2s) manda parar. A caixa não sabe o
3983
+ * que é "parar o agente" — ela só avisa que o Esc aconteceu, e quem
3984
+ * decide o que fazer é aqui.
3985
+ *
3986
+ * A sugestão fantasma, que morava aqui, foi junto com o readline: hoje
3987
+ * ela é desenhada pela própria caixa (ver lib/tui/entrada.js). */
3988
+ let ultimoEsc = 0;
3989
+ rl.on('escape', () => {
3990
+ if (!busy) { ultimoEsc = 0; return; }
3991
+ const agora = Date.now();
3992
+ if (agora - ultimoEsc < 2000) {
3993
+ ultimoEsc = 0;
3994
+ interromper();
3995
+ if (chatEmVoo) { try { chatEmVoo.abort(); } catch {} }
3996
+ console.log(c.warn(' ⏹ parando o agente…'));
3997
+ } else {
3998
+ ultimoEsc = agora;
3999
+ console.log(c.dim(' Esc de novo para parar o agente'));
4000
+ }
4001
+ });
4002
+
4003
+ // Ctrl+C com a caixa vazia: sair é sair, mas sem deixar o último turno
4004
+ // pela metade — o sayBye espera a gravação subir.
4005
+ rl.on('sigint', () => rl.close());
4006
+ rl.on('trocar-modo', trocarModo);
4007
+
4008
+ function sayBye() {
4009
+ if (saidBye) return;
4010
+ saidBye = true;
4011
+
4012
+ /* O MICROFONE FECHA JUNTO.
4013
+ O ouvinte de voz é um processo filho, e filho no POSIX não morre
4014
+ porque o pai saiu: ficaria um Python segurando o microfone depois
4015
+ de o terminal fechar — sem janela, sem jeito de desligar a não ser
4016
+ pelo gerenciador de tarefas, e com a luzinha da câmera do lado
4017
+ acesa. Matar aqui é o que faz "fechei o terminal" significar
4018
+ "fechei tudo". */
4019
+ if (vozEmEspera) {
4020
+ try { vozEmEspera.processo.kill(); } catch { /* já morreu */ }
4021
+ vozEmEspera = null;
4022
+ }
4023
+ // O último turno pode ainda estar subindo — gravar é de propósito
4024
+ // solto, para não segurar o prompt. Fechar o terminal em cima dele
4025
+ // perderia justamente a resposta que a pessoa acabou de ler, e ela
4026
+ // não veria falta nenhuma até procurar no celular.
4027
+ // O que ficou de pé em segundo plano morre junto: o filho com a saída
4028
+ // ligada ao PrimoCode seguraria o processo vivo depois do "Até logo!".
4029
+ require('../fundo.js').pararTodas();
4030
+ const fim = () => console.log(c.muted('\nAté logo!'));
4031
+ Promise.race([
4032
+ state.gravador.esperar(),
4033
+ // Rede pendurada não vira terminal pendurado. `unref` porque o
4034
+ // temporizador sozinho seguraria o processo por 3s mesmo quando a
4035
+ // gravação já terminou — um "Até logo!" seguido de três segundos
4036
+ // de nada é o tipo de coisa que quem usa chama de travado.
4037
+ new Promise((r) => { const t = setTimeout(r, 3000); if (t.unref) t.unref(); }),
4038
+ ]).then(fim, fim);
4039
+ }
4040
+
4041
+ async function drain() {
4042
+ if (busy) return;
4043
+ busy = true;
4044
+ // A caixa esmaece enquanto ele trabalha, e a segunda linha da barra
4045
+ // troca os atalhos pelo que importa naquele momento: como parar.
4046
+ state.trabalhando = true;
4047
+ if (rl.trabalhando) rl.trabalhando(true);
4048
+ while (queue.length) {
4049
+ const text = queue.shift().trim();
4050
+ if (!text) continue;
4051
+ ui.titulo(`⠋ PrimoCode — ${text}`);
4052
+ // Comando (/effort, /help) não é trabalho do agente: a caixa e a
4053
+ // barra da direita só dizem "trabalhando" quando ele trabalha.
4054
+ if (rl.trabalhando) rl.trabalhando(!isSlash(text));
4055
+ try {
4056
+ if (ehBash(text)) await rodarBash(text);
4057
+ else if (isSlash(text)) await handleSlash(text);
4058
+ else {
4059
+ await sendPrompt(text, { digitado: true });
4060
+ }
4061
+ } catch (e) {
4062
+ fala.problema(e);
4063
+ if (vozEmEspera && vozEmEspera.estado) vozEmEspera.estado('erro');
4064
+ }
4065
+ // Pedido falado (ou tarefa que recebeu recado falado): a resposta
4066
+ // final sai em voz alta, resumida. O detalhe fica na tela.
4067
+ if (vozEmEspera && (deVoz.delete(text) || vozNaTarefa)) {
4068
+ vozNaTarefa = false;
4069
+ const ultima = state.history.slice().reverse().find((m) => m.role === 'assistant');
4070
+ if (ultima && ultima.content) vozEmEspera.falar(ultima.content);
4071
+ } else if (vozEmEspera && vozEmEspera.estado) vozEmEspera.estado('esperando');
4072
+ // Recado que chegou tarde demais para a tarefa (ela já tinha
4073
+ // acabado): vira o próximo pedido, na ordem. Nada se perde.
4074
+ queue.unshift(...sobrasDaCaixa());
4075
+ }
4076
+ busy = false;
4077
+ state.trabalhando = false;
4078
+ if (rl.trabalhando) rl.trabalhando(false);
4079
+ ui.titulo('PrimoCode');
4080
+ // Se o stdin já fechou (pipe, Ctrl+D), a despedida espera a fila terminar
4081
+ // — senão ela aparece antes do resultado do último pedido.
4082
+ if (closed) sayBye();
4083
+ else rl.prompt();
4084
+ }
4085
+
4086
+ rl.on('line', (line) => {
4087
+ if (pendingAsk) { const resolve = pendingAsk; pendingAsk = null; resolve(line); return; }
4088
+ // Abertura correndo: guarda em vez de mandar ao agente.
4089
+ if (segurando) { adiantadas.push(line); return; }
4090
+ /* Digitou com o agente no meio de uma tarefa: o recado entra NELA,
4091
+ depois do passo atual (ver a caixa em lib/session/runner/act.js), em vez de
4092
+ esperar a tarefa acabar para virar um pedido que não sabe de nada.
4093
+ Comando (/…) e shell (!…) continuam indo para a fila. */
4094
+ const t = line.trim();
4095
+ if (busy && t && !isSlash(t) && !ehBash(t) && mandarDuranteATarefa(t)) {
4096
+ console.log(c.dim(' ↳ recado guardado — entra na tarefa depois do passo atual'));
4097
+ return;
4098
+ }
4099
+ queue.push(line);
4100
+ drain();
4101
+ });
4102
+
4103
+ rl.on('close', () => { closed = true; if (!busy) sayBye(); });
4104
+
4105
+ /* A FALA ENTRA AQUI, pelo mesmo caminho da linha digitada: responde a
4106
+ pergunta pendente (a autorização, por exemplo — "pode" é resposta), vira
4107
+ recado se ele está no meio de uma tarefa, ou vira pedido na fila. O que
4108
+ veio falado é marcado para a resposta sair em voz alta. */
4109
+ const deVoz = new Set();
4110
+ let vozNaTarefa = false;
4111
+ entradaDeVoz = (texto) => {
4112
+ console.log(' ' + c.brand('🎙 ') + c.white(texto));
4113
+ if (pendingAsk) { const resolve = pendingAsk; pendingAsk = null; resolve(texto); return; }
4114
+ if (segurando) { adiantadas.push(texto); return; }
4115
+ if (busy && !isSlash(texto) && mandarDuranteATarefa(texto)) {
4116
+ vozNaTarefa = true;
4117
+ console.log(c.dim(' ↳ recado guardado — entra na tarefa depois do passo atual'));
4118
+ return;
4119
+ }
4120
+ deVoz.add(texto);
4121
+ queue.push(texto);
4122
+ drain();
4123
+ };
4124
+
4125
+ /* A ABERTURA — e ela roda AQUI, depois de `line` e `close` existirem.
4126
+ *
4127
+ * Estava antes deles. O `await` segurava o resto do main(), e tudo o que
4128
+ * chegasse pelo teclado nesse meio-tempo caía no vazio: não havia ouvinte
4129
+ * para pegar. Quem colasse dois comandos perdia o segundo, e quem
4130
+ * fechasse a entrada saía sem nem o "Até logo". Digitando devagar ninguém
4131
+ * via — os ouvintes ficam prontos milissegundos depois. */
4132
+ /* A FILA FICA SEGURA ENQUANTO A ABERTURA CORRE.
4133
+ *
4134
+ * `busy` já é o freio do `drain`, e é ele que se usa aqui. Sem isso, tudo
4135
+ * o que a pessoa digitar antes de a pergunta aparecer — e ela demora,
4136
+ * porque confere o plano no servidor — cai como PEDIDO no agente. Medido
4137
+ * no pacote publicado: o "2" da escolha da IA virou uma pergunta no chat,
4138
+ * e o modelo respondeu "Oi! Como posso ajudar?".
4139
+ *
4140
+ * O ouvinte de `line` continua atendendo o `ask` normalmente: ele olha o
4141
+ * `pendingAsk` antes da fila. O que fica retido é só o que não era
4142
+ * resposta a nada. */
4143
+ segurando = true;
4144
+ boasVindas.rodar({
4145
+ perguntar: ask,
4146
+ mostrar: (t) => console.log(t),
4147
+ cores: c,
4148
+ interativo: !!(process.stdin.isTTY && process.stdout.isTTY),
4149
+ conectado: () => conta.atual(),
4150
+ conectar: () => handleSlash('/login').then((r) => (r && r.ok === false ? r : conta.atual() || r)),
4151
+ sessao: () => conta.sessao(),
4152
+ }).then((r) => {
4153
+ // O bloqueio de quem não é Premium/Super. É de CORTESIA: este arquivo
4154
+ // vai publicado no npm com o código à vista. Quem segura de verdade é
4155
+ // o primocode-server, que tem a chave do provedor.
4156
+ state.liberado = !r || r.liberado !== false;
4157
+ state.motivoBloqueio = r && r.motivo;
4158
+ }).catch((e) => {
4159
+ // A abertura quebrou (rede, arquivo da conta). Não prende a pessoa, mas diz o que foi.
4160
+ state.liberado = true;
4161
+ console.log(c.muted(` (a abertura falhou: ${e && e.message ? e.message : e}. Se algo estranhar, rode /doctor)`));
4162
+ })
4163
+ // Depois da abertura, porque é nela que a pessoa entra na conta — e
4164
+ // sem conta não há conversa para achar.
4165
+ .then(() => (fl.resume === true ? escolherNaAbertura().catch(() => false)
4166
+ : fl.resume ? retomarConversa(fl.resume).catch(() => false)
4167
+ : continuar ? continuarUltima().catch(() => false) : null))
4168
+ .then(() => {
4169
+ // O que sobrou de adiantado não era resposta de nada: vira comando,
4170
+ // na ordem em que foi digitado. Nada se perde, só esperou a vez.
4171
+ segurando = false;
4172
+ while (adiantadas.length) queue.push(adiantadas.shift());
4173
+ if (queue.length) drain();
4174
+ else if (!closed) rl.prompt();
4175
+ conferirServidor();
4176
+ });
4177
+ }
4178
+
4179
+ main().catch((e) => { console.error(c.err(e.message || e)); process.exit(1); });