@semacode/cli 1.5.31 → 1.5.32

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 (157) hide show
  1. package/AGENTS.md +294 -0
  2. package/AGENT_CONTEXT_PACK.json +164 -0
  3. package/LICENSE +22 -0
  4. package/README.md +85 -144
  5. package/SEMA_BRIEF.curto.txt +11 -0
  6. package/SEMA_BRIEF.md +616 -0
  7. package/SEMA_BRIEF.micro.txt +9 -0
  8. package/SEMA_INDEX.json +9393 -0
  9. package/dist/billing/index.d.ts +46 -0
  10. package/dist/billing/index.js +143 -0
  11. package/dist/billing/index.js.map +1 -0
  12. package/dist/controleComercialSupabase.d.ts +7 -0
  13. package/dist/controleComercialSupabase.js +6 -0
  14. package/dist/controleComercialSupabase.js.map +1 -0
  15. package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
  16. package/dist/controleComercialSupabaseAdmin.js +138 -0
  17. package/dist/controleComercialSupabaseAdmin.js.map +1 -0
  18. package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
  19. package/dist/controleComercialSupabaseCadastro.js +85 -0
  20. package/dist/controleComercialSupabaseCadastro.js.map +1 -0
  21. package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
  22. package/dist/controleComercialSupabaseConstantes.js +44 -0
  23. package/dist/controleComercialSupabaseConstantes.js.map +1 -0
  24. package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
  25. package/dist/controleComercialSupabaseConsumo.js +77 -0
  26. package/dist/controleComercialSupabaseConsumo.js.map +1 -0
  27. package/dist/controleComercialSupabaseConta.d.ts +11 -0
  28. package/dist/controleComercialSupabaseConta.js +157 -0
  29. package/dist/controleComercialSupabaseConta.js.map +1 -0
  30. package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
  31. package/dist/controleComercialSupabaseProfiles.js +55 -0
  32. package/dist/controleComercialSupabaseProfiles.js.map +1 -0
  33. package/dist/controleComercialSupabaseTipos.d.ts +3 -0
  34. package/dist/controleComercialSupabaseTipos.js +2 -0
  35. package/dist/controleComercialSupabaseTipos.js.map +1 -0
  36. package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
  37. package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
  38. package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
  39. package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
  40. package/dist/controleComercialSupabaseTiposBase.js +2 -0
  41. package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
  42. package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
  43. package/dist/controleComercialSupabaseTiposConta.js +2 -0
  44. package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
  45. package/dist/index.js +222 -46
  46. package/dist/index.js.map +1 -1
  47. package/dist/runnerValidacaoRemota.d.ts +9 -0
  48. package/dist/runnerValidacaoRemota.js +9 -0
  49. package/dist/runnerValidacaoRemota.js.map +1 -0
  50. package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
  51. package/dist/runnerValidacaoRemotaBateria.js +115 -0
  52. package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
  53. package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
  54. package/dist/runnerValidacaoRemotaCli.js +86 -0
  55. package/dist/runnerValidacaoRemotaCli.js.map +1 -0
  56. package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
  57. package/dist/runnerValidacaoRemotaComandos.js +123 -0
  58. package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
  59. package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
  60. package/dist/runnerValidacaoRemotaEscopo.js +79 -0
  61. package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
  62. package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
  63. package/dist/runnerValidacaoRemotaExecucao.js +102 -0
  64. package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
  65. package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
  66. package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
  67. package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
  68. package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
  69. package/dist/runnerValidacaoRemotaServidor.js +157 -0
  70. package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
  71. package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
  72. package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
  73. package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
  74. package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
  75. package/dist/runnerValidacaoRemotaTipos.js +35 -0
  76. package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
  77. package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
  78. package/dist/runnerValidacaoRemotaUtil.js +18 -0
  79. package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
  80. package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
  81. package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
  82. package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
  83. package/docs/AGENT_STARTER.md +109 -0
  84. package/docs/api.md +82 -0
  85. package/docs/cli.md +93 -0
  86. package/docs/como-ensinar-a-sema-para-ia.md +30 -0
  87. package/docs/deploy.md +45 -0
  88. package/docs/documentacao.md +88 -0
  89. package/docs/env.md +115 -0
  90. package/docs/extensao-vscode.md +42 -0
  91. package/docs/fluxo-pratico-ia-sema.md +187 -0
  92. package/docs/instalacao-e-primeiro-uso.md +48 -0
  93. package/docs/integracao-com-ia.md +24 -0
  94. package/docs/mcp.md +48 -0
  95. package/docs/pagamento-ponta-a-ponta.md +171 -0
  96. package/docs/persistencia-vendor-first.md +151 -0
  97. package/docs/prompt-base-ia-sema.md +111 -0
  98. package/docs/repositories.md +69 -0
  99. package/docs/rollback.md +24 -0
  100. package/docs/seguranca.md +126 -0
  101. package/docs/sintaxe.md +218 -0
  102. package/exemplos/profile_conversas.sema +165 -0
  103. package/llms-full.txt +35 -0
  104. package/llms.txt +18 -0
  105. package/node_modules/@sema/gerador-css/package.json +7 -14
  106. package/node_modules/@sema/gerador-dart/package.json +7 -14
  107. package/node_modules/@sema/gerador-html/package.json +7 -14
  108. package/node_modules/@sema/gerador-javascript/package.json +7 -14
  109. package/node_modules/@sema/gerador-lua/package.json +7 -14
  110. package/node_modules/@sema/gerador-python/package.json +7 -14
  111. package/node_modules/@sema/gerador-typescript/package.json +7 -14
  112. package/node_modules/@sema/nucleo/package.json +7 -10
  113. package/node_modules/@sema/padroes/package.json +7 -10
  114. package/package.json +75 -74
  115. package/exemplos/.prepack-generated +0 -1
  116. package/node_modules/@sema/gerador-css/src/index.ts +0 -605
  117. package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
  118. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
  119. package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
  120. package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
  121. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
  122. package/node_modules/@sema/gerador-html/src/index.ts +0 -185
  123. package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
  124. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
  125. package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
  126. package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
  127. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
  128. package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
  129. package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
  130. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
  131. package/node_modules/@sema/gerador-python/src/index.ts +0 -850
  132. package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
  133. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
  134. package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
  135. package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
  136. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
  137. package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
  138. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
  139. package/node_modules/@sema/nucleo/src/diagnosticos/melhorador.ts +0 -130
  140. package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
  141. package/node_modules/@sema/nucleo/src/index.ts +0 -184
  142. package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
  143. package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
  144. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
  145. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
  146. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
  147. package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
  148. package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
  149. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
  150. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
  151. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
  152. package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
  153. package/node_modules/@sema/nucleo/tsconfig.json +0 -9
  154. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
  155. package/node_modules/@sema/padroes/src/index.ts +0 -382
  156. package/node_modules/@sema/padroes/tsconfig.json +0 -9
  157. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
package/dist/index.js CHANGED
@@ -19,6 +19,8 @@ import { importarProjetoLegado, resumoImportacao } from "./importador.js";
19
19
  import { analisarDriftLegado, assistirRenomeacaoSemantica, gerarMapaImpactoSemantico, } from "./drift.js";
20
20
  import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
21
21
  import { REGISTRO_COMANDOS } from "./comandos.js";
22
+ import { ajudaRunnerValidacaoRemota, comandoRunnerValidacaoRemota, } from "./runnerValidacaoRemotaCli.js";
23
+ import { comandoServidorRunnerValidacaoRemota } from "./runnerValidacaoRemotaServidor.js";
22
24
  const STARTER_IA = `Voce esta trabalhando com Sema, um contrato semantico IA-first para agentes operarem software vivo em backend e front consumer.
23
25
 
24
26
  Importante:
@@ -494,6 +496,7 @@ function ajuda() {
494
496
  "sema profile validar workflow contratos/sema/workflow_ops.sema --maturidade production --preset webhook --artefato-arquivo workflow.md --json",
495
497
  "sema profile validar ops contratos/sema/workflow_ops.sema --maturidade critical --preset deploy --artefato-arquivo runbook.md --json",
496
498
  "sema profile validar game contratos/sema/game.sema --maturidade prototype --preset playtest --artefato-arquivo playtest.md --json",
499
+ "sema profile validar conversas contratos/sema/conversas.sema --maturidade production --preset vendas --artefato-arquivo conversa.md --json",
497
500
  "sema profile capabilities --json",
498
501
  "sema rule-packs --profile legal --json",
499
502
  "",
@@ -523,9 +526,9 @@ function ajuda() {
523
526
  "verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
524
527
  "formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
525
528
  "author: sema author <iniciar|validar|briefing|revisar-cliches|validar-narrativa|validar-proibicoes> [arquivo] [--tema-sensivel] [--preset conto|romance|roteiro|lore|campanha] [--saida <arquivo>] [--texto <texto>] [--json]",
526
- "profile: sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
529
+ "profile: sema profile validar <software|workflow|ops|game|legal|research|conversas> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
527
530
  "capabilities: sema profile capabilities [--json]",
528
- "rule packs: sema rule-packs [--profile <author|software|workflow|ops|game|legal|research>] [--json]",
531
+ "rule packs: sema rule-packs [--profile <author|software|workflow|ops|game|legal|research|conversas>] [--json]",
529
532
  ]),
530
533
  "",
531
534
  renderizarSecaoAscii("Ajuda IA-first", [
@@ -4335,6 +4338,13 @@ const REQUISITOS_PROFILE = {
4335
4338
  { id: "incerteza_e_limite", descricao: "declara incerteza, lacunas e limites da conclusao", termos: [/incerteza|lacuna|limite/i, /conclusao|afirmacao/i], obrigatorio: true },
4336
4339
  { id: "reprodutibilidade", descricao: "preserva protocolo, dados e reproducibilidade", termos: [/protocolo|dataset|dados/i, /reprodut|replic/i], obrigatorio: false },
4337
4340
  ],
4341
+ conversas: [
4342
+ { id: "tom_e_persona", descricao: "declara tom, formalidade, persona e intensidade persuasiva", termos: [/tom|persona|voz/i, /formalidade|persuasiv|comercial|serio/i], obrigatorio: true },
4343
+ { id: "estado_cliente", descricao: "modela etapa, intencao, sentimento, objecoes e memoria curta", termos: [/etapa|estado|intencao/i, /sentimento|objec|historico|memoria/i], obrigatorio: true },
4344
+ { id: "limites_comerciais", descricao: "bloqueia promessas, preco, prazo, garantia e insistencia sem base", termos: [/promessa|preco|prazo|garantia|desconto/i, /forbidden|proibid|bloque|sem_base|nao autorizado/i], obrigatorio: true },
4345
+ { id: "escalacao_humana", descricao: "declara quando transferir para humano", termos: [/escalar_humano|escalacao|humano|atendente/i, /irritado|juridico|cancelamento|reclamacao/i], obrigatorio: true },
4346
+ { id: "resposta_validada", descricao: "valida resposta, proxima acao e aderencia ao tom antes de enviar", termos: [/validar_resposta|validar resposta|resposta/i, /proxima_acao|proxima acao|cta|aderente_ao_tom/i], obrigatorio: true },
4347
+ ],
4338
4348
  };
4339
4349
  const REQUISITOS_PROFILE_COMUNS = [
4340
4350
  {
@@ -4365,6 +4375,13 @@ const ALIASES_PROFILE = {
4365
4375
  juridico: "legal",
4366
4376
  research: "research",
4367
4377
  pesquisa: "research",
4378
+ conversas: "conversas",
4379
+ conversa: "conversas",
4380
+ atendimento: "conversas",
4381
+ atendimento_conversacional: "conversas",
4382
+ bot: "conversas",
4383
+ chatbot: "conversas",
4384
+ chat: "conversas",
4368
4385
  };
4369
4386
  function normalizarProfileSemantico(valor) {
4370
4387
  if (!valor) {
@@ -4390,6 +4407,7 @@ const PRESETS_PROFILE = {
4390
4407
  legal: ["lgpd", "contrato", "dpa", "termos_uso", "privacidade", "due_diligence", "compliance"],
4391
4408
  research: ["rapida", "tecnica", "decisoria", "critica"],
4392
4409
  game: ["casual", "arcade", "rpg", "economia", "playtest"],
4410
+ conversas: ["atendimento", "vendas", "suporte", "qualificacao", "retencao", "cobranca"],
4393
4411
  };
4394
4412
  const CAPABILITY_MATRIX_GOVERNANCA = {
4395
4413
  author: {
@@ -4497,6 +4515,21 @@ const CAPABILITY_MATRIX_GOVERNANCA = {
4497
4515
  ],
4498
4516
  rulePacksSugeridos: ["playtest", "economy-balance", "progression"],
4499
4517
  },
4518
+ conversas: {
4519
+ profile: "conversas",
4520
+ detectaLiteral: true,
4521
+ detectaSemantico: "parcial",
4522
+ detectaOrdemExecucao: "parcial",
4523
+ detectaDriftReal: "parcial",
4524
+ validaArtefatoReal: true,
4525
+ interpretaNegacao: true,
4526
+ confianca: "media",
4527
+ limites: [
4528
+ "validacao de resposta depende do historico e politicas comerciais enviados",
4529
+ "handoff humano precisa de integracao do runtime de atendimento para ser executado",
4530
+ ],
4531
+ rulePacksSugeridos: ["conversation-safety", "sales-conversation", "support-handoff"],
4532
+ },
4500
4533
  };
4501
4534
  const RULE_PACKS_SEMA = [
4502
4535
  {
@@ -4609,6 +4642,36 @@ const RULE_PACKS_SEMA = [
4609
4642
  monetizacao: "cloud",
4610
4643
  status: "planejado",
4611
4644
  },
4645
+ {
4646
+ id: "conversation-safety",
4647
+ nome: "Customer Conversation Safety",
4648
+ categoria: "oss",
4649
+ profiles: ["conversas"],
4650
+ maturidadeMinima: "prototype",
4651
+ controles: ["forbidden_claims", "tone_policy", "customer_state", "human_handoff", "audit_trace"],
4652
+ monetizacao: "aberto",
4653
+ status: "base",
4654
+ },
4655
+ {
4656
+ id: "sales-conversation",
4657
+ nome: "Sales Conversation Guardrails",
4658
+ categoria: "premium",
4659
+ profiles: ["conversas"],
4660
+ maturidadeMinima: "production",
4661
+ controles: ["objection_handling", "authorized_offer", "honest_cta", "no_fake_discount", "promise_limits"],
4662
+ monetizacao: "cloud",
4663
+ status: "planejado",
4664
+ },
4665
+ {
4666
+ id: "support-handoff",
4667
+ nome: "Support Handoff",
4668
+ categoria: "premium",
4669
+ profiles: ["conversas", "ops"],
4670
+ maturidadeMinima: "production",
4671
+ controles: ["escalation_trigger", "ticket_context", "angry_customer", "legal_risk", "handoff_reason"],
4672
+ monetizacao: "cloud",
4673
+ status: "planejado",
4674
+ },
4612
4675
  {
4613
4676
  id: "event-driven",
4614
4677
  nome: "Event Driven Workflow",
@@ -4746,38 +4809,56 @@ const REQUISITOS_PRESET_PROFILE = {
4746
4809
  { id: "rollback_criterio_recuperacao", descricao: "rollback declara criterio objetivo de recuperacao", termos: [/rollback/i, /criterio|gatilho/i, /recuper/i], obrigatorio: true, severidade: "blocking" },
4747
4810
  ],
4748
4811
  lgpd: [
4749
- { id: "lgpd_matriz_dados", descricao: "LGPD declara dado, finalidade, base legal e retencao", termos: [/dado|titular/i, /finalidade/i, /base legal/i, /retencao|retenção/i], obrigatorio: true, severidade: "critical" },
4812
+ { id: "lgpd_matriz_dados", descricao: "LGPD declara dado, finalidade, base legal e retencao", termos: [/dado|titular/i, /finalidade/i, /base legal/i, /retencao|retenção/i], obrigatorio: true, severidade: "critical" },
4750
4813
  ],
4751
4814
  contrato: [
4752
- { id: "contrato_clausulas_nucleo", descricao: "contrato declara partes, objeto, obrigacoes e rescisao", termos: [/partes/i, /objeto/i, /obrigac|obrigaç/i, /rescis/i], obrigatorio: true, severidade: "blocking" },
4815
+ { id: "contrato_clausulas_nucleo", descricao: "contrato declara partes, objeto, obrigacoes e rescisao", termos: [/partes/i, /objeto/i, /obrigac|obrigaç/i, /rescis/i], obrigatorio: true, severidade: "blocking" },
4753
4816
  ],
4754
4817
  dpa: [
4755
4818
  { id: "dpa_operador_controlador", descricao: "DPA declara controlador, operador, dados e subprocessadores", termos: [/controlador/i, /operador/i, /subprocess/i, /dados/i], obrigatorio: true, severidade: "critical" },
4756
4819
  ],
4757
4820
  termos_uso: [
4758
- { id: "termos_uso_limites", descricao: "termos de uso declaram uso permitido, proibicoes e limitacao", termos: [/uso permitido/i, /proibid|vedad/i, /limitacao|limitação/i], obrigatorio: true, severidade: "blocking" },
4821
+ { id: "termos_uso_limites", descricao: "termos de uso declaram uso permitido, proibicoes e limitacao", termos: [/uso permitido/i, /proibid|vedad/i, /limitacao|limitação/i], obrigatorio: true, severidade: "blocking" },
4759
4822
  ],
4760
4823
  privacidade: [
4761
4824
  { id: "privacidade_dados_direitos", descricao: "privacidade declara dados, finalidade, direitos e contato", termos: [/dados/i, /finalidade/i, /direitos/i, /contato/i], obrigatorio: true, severidade: "blocking" },
4762
4825
  ],
4763
4826
  due_diligence: [
4764
- { id: "due_diligence_risco_evidencia", descricao: "due diligence declara risco, evidencia e pendencias", termos: [/risco/i, /evidencia|evidência/i, /pendenc|pendênc/i], obrigatorio: true, severidade: "blocking" },
4827
+ { id: "due_diligence_risco_evidencia", descricao: "due diligence declara risco, evidencia e pendencias", termos: [/risco/i, /evidencia|evidência/i, /pendenc|pendênc/i], obrigatorio: true, severidade: "blocking" },
4765
4828
  ],
4766
4829
  compliance: [
4767
- { id: "compliance_controle_auditoria", descricao: "compliance declara controles, auditoria e responsavel", termos: [/controle/i, /auditoria/i, /responsavel|responsável/i], obrigatorio: true, severidade: "blocking" },
4830
+ { id: "compliance_controle_auditoria", descricao: "compliance declara controles, auditoria e responsavel", termos: [/controle/i, /auditoria/i, /responsavel|responsável/i], obrigatorio: true, severidade: "blocking" },
4768
4831
  ],
4769
4832
  decisoria: [
4770
- { id: "research_matriz_decisao", descricao: "pesquisa decisoria declara criterio, peso e alternativa", termos: [/criterio|critério/i, /peso/i, /alternativa/i], obrigatorio: true, severidade: "blocking" },
4833
+ { id: "research_matriz_decisao", descricao: "pesquisa decisoria declara criterio, peso e alternativa", termos: [/criterio|critério/i, /peso/i, /alternativa/i], obrigatorio: true, severidade: "blocking" },
4771
4834
  ],
4772
4835
  critica: [
4773
- { id: "research_contraditorio", descricao: "pesquisa critica tenta derrubar a propria conclusao", termos: [/contradit|contra.?evidencia|contra.?evidência/i, /hipotese|hipótese|conclusao|conclusão/i], obrigatorio: true, severidade: "blocking" },
4836
+ { id: "research_contraditorio", descricao: "pesquisa critica tenta derrubar a propria conclusao", termos: [/contradit|contra.?evidencia|contra.?evidência/i, /hipotese|hipótese|conclusao|conclusão/i], obrigatorio: true, severidade: "blocking" },
4774
4837
  ],
4775
4838
  playtest: [
4776
- { id: "game_playtest_temporal", descricao: "playtest declara primeiros segundos, primeiro minuto e tensao", termos: [/primeiros? 10 segundos|10s/i, /1 minuto|um minuto/i, /tensao|tensão/i], obrigatorio: true, severidade: "blocking" },
4839
+ { id: "game_playtest_temporal", descricao: "playtest declara primeiros segundos, primeiro minuto e tensao", termos: [/primeiros? 10 segundos|10s/i, /1 minuto|um minuto/i, /tensao|tensão/i], obrigatorio: true, severidade: "blocking" },
4777
4840
  ],
4778
4841
  economia: [
4779
4842
  { id: "game_economia_balanceada", descricao: "economia declara moeda, fonte, gasto e exploit", termos: [/moeda|economia/i, /fonte/i, /gasto|sink/i, /exploit/i], obrigatorio: true, severidade: "blocking" },
4780
4843
  ],
4844
+ atendimento: [
4845
+ { id: "conversas_atendimento_estado", descricao: "atendimento declara estado do cliente e proxima acao", termos: [/estado|etapa|sentimento/i, /proxima_acao|proxima acao|encaminhar|resolver/i], obrigatorio: true, severidade: "blocking" },
4846
+ ],
4847
+ vendas: [
4848
+ { id: "conversas_vendas_objecao_cta", descricao: "vendas trata objecao e CTA sem promessa falsa", termos: [/objec|duvida|interesse|dor/i, /cta|proxima_acao|proxima acao|agendar|diagnostico|proposta/i], obrigatorio: true, severidade: "blocking" },
4849
+ ],
4850
+ suporte: [
4851
+ { id: "conversas_suporte_escalacao", descricao: "suporte declara problema, solucao e escalacao humana", termos: [/problema|erro|suporte|chamado/i, /escalar|humano|atendente|ticket/i], obrigatorio: true, severidade: "blocking" },
4852
+ ],
4853
+ qualificacao: [
4854
+ { id: "conversas_qualificacao_criterios", descricao: "qualificacao declara criterios e dados minimos do lead", termos: [/qualifica|lead|perfil/i, /criterio|orcamento|prazo|necessidade/i], obrigatorio: true, severidade: "blocking" },
4855
+ ],
4856
+ retencao: [
4857
+ { id: "conversas_retencao_limites", descricao: "retencao declara motivo, proposta autorizada e limites", termos: [/retencao|cancelamento|motivo/i, /autorizad|limite|oferta|proposta/i], obrigatorio: true, severidade: "blocking" },
4858
+ ],
4859
+ cobranca: [
4860
+ { id: "conversas_cobranca_cuidado", descricao: "cobranca declara valor, vencimento, tom e escalacao", termos: [/cobranca|valor|vencimento/i, /tom|respeitoso|humano|escalar/i], obrigatorio: true, severidade: "critical" },
4861
+ ],
4781
4862
  };
4782
4863
  function normalizarPresetProfile(profile, valor) {
4783
4864
  if (!valor)
@@ -4799,6 +4880,16 @@ function normalizarPresetProfile(profile, valor) {
4799
4880
  modulo_codigo: "modulo",
4800
4881
  seguranca: "security",
4801
4882
  seguranca_codigo: "security",
4883
+ atendimento_cliente: "atendimento",
4884
+ conversa_atendimento: "atendimento",
4885
+ comercial: "vendas",
4886
+ venda: "vendas",
4887
+ conversa_vendas: "vendas",
4888
+ suporte_cliente: "suporte",
4889
+ qualificar: "qualificacao",
4890
+ qualificacao_lead: "qualificacao",
4891
+ retencao_cliente: "retencao",
4892
+ cobrar: "cobranca",
4802
4893
  };
4803
4894
  const preset = alias[chave] ?? chave;
4804
4895
  return PRESETS_PROFILE[profile].includes(preset) ? preset : null;
@@ -4808,6 +4899,9 @@ function moduloCombinaComProfile(modulo, caminho, profile) {
4808
4899
  if (profile === "workflow") {
4809
4900
  return /workflow|n8n|orquestracao/.test(alvo);
4810
4901
  }
4902
+ if (profile === "conversas") {
4903
+ return /conversas|conversa|atendimento|chatbot|bot/.test(alvo);
4904
+ }
4811
4905
  return alvo.includes(profile);
4812
4906
  }
4813
4907
  function severidadeRequisitoProfile(requisito, profile, maturidade) {
@@ -4941,8 +5035,8 @@ function selecionarRulePacksProfile(profile) {
4941
5035
  function contratoProibeTermoProfile(contrato, termo) {
4942
5036
  const escaped = termo.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4943
5037
  const padroes = [
4944
- new RegExp(`(forbidden|proibid|vedad|nao usar|não usar|sem)\\s+[^\\n]{0,80}${escaped}`, "i"),
4945
- new RegExp(`${escaped}[^\\n]{0,80}(forbidden|proibid|vedad|nao permitido|não permitido|nao usar|não usar)`, "i"),
5038
+ new RegExp(`(forbidden|proibid|vedad|nao usar|não usar|sem)\\s+[^\\n]{0,80}${escaped}`, "i"),
5039
+ new RegExp(`${escaped}[^\\n]{0,80}(forbidden|proibid|vedad|nao permitido|não permitido|nao usar|não usar)`, "i"),
4946
5040
  ];
4947
5041
  return padroes.some((padrao) => padrao.test(contrato));
4948
5042
  }
@@ -5009,8 +5103,8 @@ function localizarRegexProfile(texto, regex) {
5009
5103
  function termoNegadoNoArtefato(texto, indice, tamanho) {
5010
5104
  const antes = texto.slice(Math.max(0, indice - 90), indice);
5011
5105
  const depois = texto.slice(indice + tamanho, Math.min(texto.length, indice + tamanho + 90));
5012
- const negacaoAntes = /\b(?:sem|ausente|ausencia|ausência|faltando|falta|faltam|inexistente|indefinid[ao]s?|pendente|nao\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida)|não\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida))\b[\s\S]{0,80}$/i;
5013
- const negacaoDepois = /^[\s\S]{0,80}\b(?:ausente|ausentes|ausencia|ausência|inexistente|indefinid[ao]s?|faltando|pendente|nao\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao])|não\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao]))\b/i;
5106
+ const negacaoAntes = /\b(?:sem|ausente|ausencia|ausência|faltando|falta|faltam|inexistente|indefinid[ao]s?|pendente|nao\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida)|não\s+(?:ha|há|define|declara|especifica|possui|tem|existe|inclui|contem|contém|configura|implementa|mapeia|separa|informa|descreve|testa|valida))\b[\s\S]{0,80}$/i;
5107
+ const negacaoDepois = /^[\s\S]{0,80}\b(?:ausente|ausentes|ausencia|ausência|inexistente|indefinid[ao]s?|faltando|pendente|nao\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao])|não\s+(?:definid[ao]|declarad[ao]|especificad[ao]|testad[ao]|valid[ao]|implementad[ao]|configurad[ao]|mapead[ao]))\b/i;
5014
5108
  return negacaoAntes.test(antes) || negacaoDepois.test(depois);
5015
5109
  }
5016
5110
  function avaliarPresencaPositivaArtefato(texto, regex) {
@@ -5236,39 +5330,39 @@ function avaliarArtefatoOpsProfile(artefato, preset) {
5236
5330
  const checks = [
5237
5331
  { id: "ops_runbook_artefato", descricao: "plano operacional contem runbook", regex: /runbook|passo a passo|procedimento/i, sugestao: "adicione runbook executavel com passos, dono e criterio de parada." },
5238
5332
  { id: "ops_rollback_artefato", descricao: "plano operacional contem rollback", regex: /rollback|reverter|revers/i, sugestao: "adicione comando/criterio de rollback." },
5239
- { id: "ops_healthcheck_artefato", descricao: "plano operacional contem healthcheck", regex: /healthcheck|healthz|smoke|verificacao live|verificação live/i, sugestao: "declare endpoint, comando ou metrica que prova recuperacao." },
5240
- { id: "ops_responsavel_artefato", descricao: "plano operacional declara responsavel/oncall", regex: /responsavel|responsável|owner|oncall|dono/i, sugestao: "declare responsavel operacional, oncall ou dono da mudanca." },
5333
+ { id: "ops_healthcheck_artefato", descricao: "plano operacional contem healthcheck", regex: /healthcheck|healthz|smoke|verificacao live|verificação live/i, sugestao: "declare endpoint, comando ou metrica que prova recuperacao." },
5334
+ { id: "ops_responsavel_artefato", descricao: "plano operacional declara responsavel/oncall", regex: /responsavel|responsável|owner|oncall|dono/i, sugestao: "declare responsavel operacional, oncall ou dono da mudanca." },
5241
5335
  { id: "ops_comunicacao_artefato", descricao: "plano operacional contem comunicacao", regex: /comunic|avisar|status page|cliente/i, severidade: "warning", sugestao: "adicione quando e quem comunicar." },
5242
5336
  ];
5243
5337
  const achados = validarTermosObrigatoriosArtefato(artefato, checks);
5244
5338
  if ((preset === "migration" || preset === "critical") && !avaliarPresencaPositivaArtefato(artefato, /backup|snapshot|revers/i).atendido) {
5245
5339
  achados.push(criarAchadoArtefatoProfile("ops_migration_sem_reversibilidade", "migration/critical exige reversibilidade comprovada", false, "critical", undefined, "declare backup, snapshot, down migration ou estrategia manual testada."));
5246
5340
  }
5247
- if (preset === "rollback" && !avaliarPresencaPositivaArtefato(artefato, /criterio|critério|gatilho|recuper/i).atendido) {
5341
+ if (preset === "rollback" && !avaliarPresencaPositivaArtefato(artefato, /criterio|critério|gatilho|recuper/i).atendido) {
5248
5342
  achados.push(criarAchadoArtefatoProfile("ops_rollback_sem_criterio_recuperacao", "rollback exige criterio objetivo de recuperacao", false, "blocking", undefined, "declare gatilho de rollback e criterio verificavel de recuperacao."));
5249
5343
  }
5250
5344
  return achados;
5251
5345
  }
5252
5346
  function avaliarArtefatoLegalProfile(artefato, preset) {
5253
5347
  const achados = [];
5254
- const pareceFinal = /parecer final|opiniao definitiva|opinião definitiva|conclusao juridica definitiva|conclusão jurídica definitiva/i.test(artefato);
5255
- const temRevisaoHumana = avaliarPresencaPositivaArtefato(artefato, /revisao humana|revisão humana|advogado|minuta|rascunho|preliminar/i).atendido;
5256
- const temAvisoNaoParecer = /nao e parecer|não é parecer/i.test(artefato);
5348
+ const pareceFinal = /parecer final|opiniao definitiva|opinião definitiva|conclusao juridica definitiva|conclusão jurídica definitiva/i.test(artefato);
5349
+ const temRevisaoHumana = avaliarPresencaPositivaArtefato(artefato, /revisao humana|revisão humana|advogado|minuta|rascunho|preliminar/i).atendido;
5350
+ const temAvisoNaoParecer = /nao e parecer|não é parecer/i.test(artefato);
5257
5351
  const temFreioHumano = temRevisaoHumana || temAvisoNaoParecer;
5258
5352
  if (pareceFinal && !temFreioHumano) {
5259
- achados.push(criarAchadoArtefatoProfile("legal_parecer_final_sem_revisao", "documento legal parece parecer final sem revisao humana obrigatoria", false, "critical", trechoRegexProfile(artefato, /parecer final|opiniao definitiva|opinião definitiva/i), "marque como minuta/preliminar e exija revisao humana por profissional habilitado."));
5353
+ achados.push(criarAchadoArtefatoProfile("legal_parecer_final_sem_revisao", "documento legal parece parecer final sem revisao humana obrigatoria", false, "critical", trechoRegexProfile(artefato, /parecer final|opiniao definitiva|opinião definitiva/i), "marque como minuta/preliminar e exija revisao humana por profissional habilitado."));
5260
5354
  }
5261
5355
  if (preset === "lgpd") {
5262
5356
  achados.push(...validarTermosObrigatoriosArtefato(artefato, [
5263
5357
  { id: "legal_lgpd_base_finalidade", descricao: "artefato LGPD declara base legal e finalidade", regex: /base legal[\s\S]{0,160}finalidade|finalidade[\s\S]{0,160}base legal/i, severidade: "critical", sugestao: "inclua matriz dado -> finalidade -> base legal." },
5264
- { id: "legal_lgpd_retencao_direitos", descricao: "artefato LGPD declara retencao e direitos do titular", regex: /retencao|retenção/i, severidade: "blocking", sugestao: "inclua retencao, descarte e direitos do titular." },
5358
+ { id: "legal_lgpd_retencao_direitos", descricao: "artefato LGPD declara retencao e direitos do titular", regex: /retencao|retenção/i, severidade: "blocking", sugestao: "inclua retencao, descarte e direitos do titular." },
5265
5359
  ]));
5266
5360
  }
5267
5361
  if (preset === "privacidade") {
5268
5362
  achados.push(...validarTermosObrigatoriosArtefato(artefato, [
5269
5363
  { id: "legal_privacidade_dados_finalidade", descricao: "politica de privacidade declara dados tratados e finalidade", regex: /dados?[\s\S]{0,120}finalidade|finalidade[\s\S]{0,120}dados?/i, severidade: "critical", sugestao: "inclua dados coletados/tratados e finalidade de cada uso." },
5270
- { id: "legal_privacidade_base_legal", descricao: "politica de privacidade declara base legal", regex: /base legal|consentimento|legitimo interesse|legítimo interesse|execucao de contrato|execução de contrato/i, severidade: "critical", sugestao: "declare base legal por finalidade." },
5271
- { id: "legal_privacidade_retencao", descricao: "politica de privacidade declara retencao/descarte", regex: /retencao|retenção|descarte|prazo de guarda/i, severidade: "blocking", sugestao: "declare prazo de retencao e descarte." },
5364
+ { id: "legal_privacidade_base_legal", descricao: "politica de privacidade declara base legal", regex: /base legal|consentimento|legitimo interesse|legítimo interesse|execucao de contrato|execução de contrato/i, severidade: "critical", sugestao: "declare base legal por finalidade." },
5365
+ { id: "legal_privacidade_retencao", descricao: "politica de privacidade declara retencao/descarte", regex: /retencao|retenção|descarte|prazo de guarda/i, severidade: "blocking", sugestao: "declare prazo de retencao e descarte." },
5272
5366
  { id: "legal_privacidade_direitos_contato", descricao: "politica de privacidade declara direitos do titular e contato/DPO", regex: /direitos? do titular[\s\S]{0,160}(contato|dpo|encarregado)|(?:contato|dpo|encarregado)[\s\S]{0,160}direitos? do titular/i, severidade: "blocking", sugestao: "declare direitos do titular e canal de contato/encarregado." },
5273
5367
  ]));
5274
5368
  }
@@ -5276,11 +5370,11 @@ function avaliarArtefatoLegalProfile(artefato, preset) {
5276
5370
  }
5277
5371
  function avaliarArtefatoResearchProfile(artefato, preset) {
5278
5372
  const achados = validarTermosObrigatoriosArtefato(artefato, [
5279
- { id: "research_fontes_artefato", descricao: "resposta final cita fontes ou referencias", regex: /https?:\/\/|\[[0-9]+\]|fonte|referencia|referência/i, sugestao: "inclua fontes citaveis e separe evidencia de opiniao." },
5280
- { id: "research_incerteza_artefato", descricao: "resposta final declara incerteza ou limite", regex: /incerteza|limite|baixa confianca|baixa confiança|lacuna/i, sugestao: "declare limites, incertezas e o que nao foi verificado." },
5281
- { id: "research_fato_inferencia_artefato", descricao: "resposta separa fato de inferencia", regex: /fato|inferencia|inferência/i, sugestao: "rotule conclusoes como fato, inferencia ou recomendacao." },
5373
+ { id: "research_fontes_artefato", descricao: "resposta final cita fontes ou referencias", regex: /https?:\/\/|\[[0-9]+\]|fonte|referencia|referência/i, sugestao: "inclua fontes citaveis e separe evidencia de opiniao." },
5374
+ { id: "research_incerteza_artefato", descricao: "resposta final declara incerteza ou limite", regex: /incerteza|limite|baixa confianca|baixa confiança|lacuna/i, sugestao: "declare limites, incertezas e o que nao foi verificado." },
5375
+ { id: "research_fato_inferencia_artefato", descricao: "resposta separa fato de inferencia", regex: /fato|inferencia|inferência/i, sugestao: "rotule conclusoes como fato, inferencia ou recomendacao." },
5282
5376
  ]);
5283
- if (preset === "critica" && !avaliarPresencaPositivaArtefato(artefato, /contra.?evidencia|contra.?evidência|evidencia contra|evidência contra|refut/i).atendido) {
5377
+ if (preset === "critica" && !avaliarPresencaPositivaArtefato(artefato, /contra.?evidencia|contra.?evidência|evidencia contra|evidência contra|refut/i).atendido) {
5284
5378
  achados.push(criarAchadoArtefatoProfile("research_sem_contraditorio", "pesquisa critica nao tentou derrubar a conclusao", false, "blocking", undefined, "adicione secao de evidencias contra a recomendacao principal."));
5285
5379
  }
5286
5380
  return achados;
@@ -5288,14 +5382,79 @@ function avaliarArtefatoResearchProfile(artefato, preset) {
5288
5382
  function avaliarArtefatoGameProfile(artefato, preset) {
5289
5383
  const achados = validarTermosObrigatoriosArtefato(artefato, [
5290
5384
  { id: "game_loop_artefato", descricao: "artefato de jogo declara core loop", regex: /core loop|loop|ciclo/i, sugestao: "declare acao principal, feedback, recompensa e reinicio." },
5291
- { id: "game_estado_artefato", descricao: "artefato de jogo declara estado e transicoes", regex: /estado|state|playing|game_over|transic|transiç/i, sugestao: "declare estados e transicoes permitidas." },
5292
- { id: "game_pacing_artefato", descricao: "artefato de jogo declara pacing/curva", regex: /pacing|curva|dificuldade|sessao|sessão/i, severidade: "warning", sugestao: "adicione ritmo esperado e variacao de dificuldade." },
5385
+ { id: "game_estado_artefato", descricao: "artefato de jogo declara estado e transicoes", regex: /estado|state|playing|game_over|transic|transiç/i, sugestao: "declare estados e transicoes permitidas." },
5386
+ { id: "game_pacing_artefato", descricao: "artefato de jogo declara pacing/curva", regex: /pacing|curva|dificuldade|sessao|sessão/i, severidade: "warning", sugestao: "adicione ritmo esperado e variacao de dificuldade." },
5293
5387
  ]);
5294
5388
  if (preset === "playtest" && !avaliarPresencaPositivaArtefato(artefato, /10 segundos|1 minuto|um minuto|primeiro minuto/i).atendido) {
5295
5389
  achados.push(criarAchadoArtefatoProfile("game_playtest_sem_tempo", "playtest nao descreve primeiros segundos e primeiro minuto", false, "blocking", undefined, "adicione simulacao dos primeiros 10s e do primeiro minuto."));
5296
5390
  }
5297
5391
  return achados;
5298
5392
  }
5393
+ function avaliarArtefatoConversasProfile(artefato, preset) {
5394
+ const achados = validarTermosObrigatoriosArtefato(artefato, [
5395
+ { id: "conversas_tom_artefato", descricao: "artefato declara tom/persona da conversa", regex: /tom|persona|voz|formalidade|comercial|persuasiv|serio|consultiv/i, sugestao: "declare o tom, persona e nivel de formalidade usados na resposta." },
5396
+ { id: "conversas_estado_cliente_artefato", descricao: "artefato declara estado, intencao ou objecao do cliente", regex: /estado|etapa|intencao|sentimento|objec|lead|cliente/i, sugestao: "registre etapa, intencao detectada, sentimento e objecoes antes da resposta." },
5397
+ { id: "conversas_proxima_acao_artefato", descricao: "artefato declara proxima acao ou CTA honesto", regex: /proxima_acao|proxima acao|cta|agendar|encaminhar|diagnostico|abrir chamado|escalar/i, sugestao: "adicione proxima acao clara sem promessa indevida." },
5398
+ { id: "conversas_estado_visivel_artefato", descricao: "artefato declara ultima mensagem e ultima resposta visivel", regex: /ultima mensagem|ultima resposta visivel|mensagem_cliente_visivel|resposta_anterior_visivel|historico visivel|conversa visivel/i, sugestao: "baseie o turno na conversa visivel ao cliente, nao em pensamento interno ou resposta bruta." },
5399
+ { id: "conversas_saida_cliente_artefato", descricao: "artefato separa saida interna da resposta enviada", regex: /customer_reply|resposta final ao cliente|unica saida visivel|apenas resposta_cliente|somente resposta_cliente/i, sugestao: "declare que apenas customer_reply/resposta_cliente pode sair para o canal." },
5400
+ { id: "conversas_dedupe_artefato", descricao: "artefato declara deduplicacao por evento", regex: /dedupe|deduplic|evento_id|message_id|inbound|uma entrada[\s\S]{0,40}uma saida|uma mensagem[\s\S]{0,40}uma resposta/i, sugestao: "declare chave de deduplicacao por evento/mensagem recebida." },
5401
+ ]);
5402
+ const promessaSemBase = /garanto|garantia total|100%|sem risco|resultado garantido|vender mais em \d+\s*dias|prometo/i.test(artefato);
5403
+ if (promessaSemBase) {
5404
+ achados.push(criarAchadoArtefatoProfile("conversas_promessa_sem_base", "resposta de bot parece prometer resultado, prazo ou garantia sem base", false, "critical", trechoRegexProfile(artefato, /garanto|garantia total|100%|sem risco|resultado garantido|vender mais em \d+\s*dias|prometo/i), "troque promessa absoluta por condicao verificavel, limite claro ou proposta de diagnostico.", undefined, { risco: "promessa_comercial_indevida" }));
5405
+ }
5406
+ const temContextoAnterior = /ultima resposta visivel|resposta_anterior_visivel|pergunta anterior|escopo faz sentido|proposta faz sentido|etapa atual|etapa escopo/i.test(artefato);
5407
+ const confirmacaoCurta = /\b(sim claro|sim|fechado|pode ser|beleza|ok|certo|manda|bora|ta bom|isso mesmo|gostei)\b/i.test(artefato);
5408
+ const reiniciouAtendimento = /sou [A-Za-z]|me chamo|como posso ajudar|em que posso ajudar|quer organizar|apresentacao|apresenta[cç][aã]o|inicio de conversa/i.test(artefato);
5409
+ if (temContextoAnterior && confirmacaoCurta && reiniciouAtendimento) {
5410
+ achados.push(criarAchadoArtefatoProfile("conversas_confirmacao_reiniciada", "confirmacao curta foi tratada como novo inicio em vez de avancar a etapa anterior", false, "critical", trechoRegexProfile(artefato, /(?:sim claro|sim|fechado|pode ser|beleza|ok|certo|manda|bora)[\s\S]{0,220}(?:sou [A-Za-z]|me chamo|como posso ajudar|quer organizar|apresenta[cç][aã]o)|(?:escopo faz sentido|proposta faz sentido|pergunta anterior)[\s\S]{0,220}(?:sou [A-Za-z]|me chamo|como posso ajudar|quer organizar|apresenta[cç][aã]o)/i), "interprete confirmacoes contra a ultima pergunta visivel e avance a conversa sem repetir saudacao.", undefined, { risco: "estado_conversa_perdido" }));
5411
+ }
5412
+ const vazouInterno = /(?:enviar|mandar|resposta visivel|customer_reply|resposta ao cliente)[\s\S]{0,120}(?:intent|stage|facts|missing_critical_info|internal_trace|raciocinio|pensamento interno|analise interna|JSON interno)|(?:raciocinio|pensamento interno|analise interna|JSON interno)[\s\S]{0,120}(?:cliente|canal|enviado|visivel)/i.test(artefato);
5413
+ if (vazouInterno) {
5414
+ achados.push(criarAchadoArtefatoProfile("conversas_vazamento_interno", "resposta parece expor raciocinio, JSON ou campos internos ao cliente", false, "critical", trechoRegexProfile(artefato, /(?:intent|stage|facts|missing_critical_info|internal_trace|raciocinio|pensamento interno|analise interna|JSON interno)[\s\S]{0,160}(?:cliente|canal|enviado|visivel)|(?:enviar|mandar|resposta visivel)[\s\S]{0,160}(?:intent|stage|facts|missing_critical_info|internal_trace|JSON interno)/i), "mande ao canal apenas customer_reply/resposta_cliente, mantendo interpretacao e auditoria fora da mensagem visivel.", undefined, { risco: "vazamento_de_estado_interno" }));
5415
+ }
5416
+ const whatsapp = /canal\s*:?\s*whatsapp|\bWHATSAPP\b/i.test(artefato);
5417
+ const canalAlternativo = /\b(email|e-mail|inbox|caixa de entrada)\b/i.test(artefato);
5418
+ const clientePediuCanal = /cliente pediu|cliente solicitou|pedido do cliente|solicitou email|pediu email/i.test(artefato);
5419
+ if (whatsapp && canalAlternativo && !clientePediuCanal) {
5420
+ achados.push(criarAchadoArtefatoProfile("conversas_canal_inventado", "conversa em WhatsApp tenta deslocar para email ou inbox sem pedido do cliente", false, "blocking", trechoRegexProfile(artefato, /WHATSAPP[\s\S]{0,180}(?:email|e-mail|inbox|caixa de entrada)|(?:email|e-mail|inbox|caixa de entrada)[\s\S]{0,180}WHATSAPP/i), "resolva no canal atual, a menos que o cliente tenha pedido outro canal.", undefined, { risco: "friccao_de_canal" }));
5421
+ }
5422
+ const respostaDuplicada = /duas respostas|duas mensagens visiveis|respondeu duas vezes|duplicou resposta|mesmo inbound|mesmo evento/i.test(artefato);
5423
+ const temDedupe = /dedupe|deduplic|evento_id|message_id|inbound_id|uma entrada[\s\S]{0,40}uma saida/i.test(artefato);
5424
+ if (respostaDuplicada && !temDedupe) {
5425
+ achados.push(criarAchadoArtefatoProfile("conversas_sem_dedupe_evento", "artefato indica risco de resposta duplicada sem deduplicacao por evento", false, "blocking", trechoRegexProfile(artefato, /duas respostas|duas mensagens visiveis|respondeu duas vezes|duplicou resposta|mesmo inbound|mesmo evento/i), "registre evento_id/message_id e envie no maximo uma resposta visivel por inbound.", undefined, { risco: "resposta_duplicada" }));
5426
+ }
5427
+ const precisaEscalar = /irritad|reclamac|juridic|cancelamento|processo|procon|advogado|ameaca/i.test(artefato);
5428
+ const escalou = avaliarPresencaPositivaArtefato(artefato, /escalar|humano|atendente|supervisor|ticket|chamado/i);
5429
+ if (precisaEscalar && !escalou.atendido) {
5430
+ achados.push(criarAchadoArtefatoProfile("conversas_sem_escalacao_humana", "conversa sensivel exige escalacao humana explicita", false, "critical", escalou.trecho ?? trechoRegexProfile(artefato, /irritad|reclamac|juridic|cancelamento|processo|procon|advogado/i), "declare handoff para humano com motivo e prioridade antes de continuar no bot.", escalou.motivo, {
5431
+ linha: escalou.linha,
5432
+ coluna: escalou.coluna,
5433
+ inicio: escalou.inicio,
5434
+ fim: escalou.fim,
5435
+ risco: "handoff_humano_ausente",
5436
+ }));
5437
+ }
5438
+ if (preset === "vendas") {
5439
+ achados.push(...validarTermosObrigatoriosArtefato(artefato, [
5440
+ { id: "conversas_vendas_objecao_artefato", descricao: "conversa de vendas trata objecao ou dor do cliente", regex: /objec|duvida|dor|interesse|comparando|orcamento/i, sugestao: "trate a objecao antes do CTA." },
5441
+ { id: "conversas_vendas_cta_artefato", descricao: "conversa de vendas contem CTA honesto", regex: /agendar|diagnostico|proposta|proxima acao|cta|posso te enviar/i, sugestao: "inclua convite claro e nao agressivo para a proxima etapa." },
5442
+ ]));
5443
+ }
5444
+ if (preset === "suporte") {
5445
+ achados.push(...validarTermosObrigatoriosArtefato(artefato, [
5446
+ { id: "conversas_suporte_problema_artefato", descricao: "suporte identifica problema ou chamado", regex: /problema|erro|chamado|ticket|suporte/i, sugestao: "identifique problema, contexto e o que sera feito." },
5447
+ { id: "conversas_suporte_handoff_artefato", descricao: "suporte declara escalacao quando necessario", regex: /escalar|humano|atendente|ticket|chamado/i, sugestao: "declare quando o atendimento sai do bot." },
5448
+ ]));
5449
+ }
5450
+ if (preset === "cobranca") {
5451
+ achados.push(...validarTermosObrigatoriosArtefato(artefato, [
5452
+ { id: "conversas_cobranca_tom_artefato", descricao: "cobranca usa tom respeitoso e objetivo", regex: /respeitoso|cordial|tom|sem constrangimento|regularizar/i, severidade: "critical", sugestao: "declare tom respeitoso e evite constrangimento ou ameaca." },
5453
+ { id: "conversas_cobranca_dado_artefato", descricao: "cobranca menciona valor, vencimento ou referencia autorizada", regex: /valor|vencimento|fatura|boleto|referencia autorizada/i, severidade: "blocking", sugestao: "referencie apenas dados autorizados da cobranca." },
5454
+ ]));
5455
+ }
5456
+ return achados;
5457
+ }
5299
5458
  function avaliarArtefatoProfile(profile, contrato, artefato, maturidade, preset) {
5300
5459
  if (!artefato || !artefato.trim())
5301
5460
  return [];
@@ -5312,6 +5471,8 @@ function avaliarArtefatoProfile(profile, contrato, artefato, maturidade, preset)
5312
5471
  return avaliarArtefatoResearchProfile(artefato, preset);
5313
5472
  case "game":
5314
5473
  return avaliarArtefatoGameProfile(artefato, preset);
5474
+ case "conversas":
5475
+ return avaliarArtefatoConversasProfile(artefato, preset);
5315
5476
  }
5316
5477
  }
5317
5478
  async function carregarArtefatoProfile(args) {
@@ -5325,7 +5486,7 @@ async function carregarArtefatoProfile(args) {
5325
5486
  }
5326
5487
  async function validarProfileSemantico(entrada, profile, opcoes) {
5327
5488
  if (!entrada) {
5328
- throw new Error("Uso: sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]");
5489
+ throw new Error("Uso: sema profile validar <software|workflow|ops|game|legal|research|conversas> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]");
5329
5490
  }
5330
5491
  const modulos = await carregarModulos(entrada);
5331
5492
  const escolhido = modulos.find((item) => moduloCombinaComProfile(item.resultado.modulo?.nome, item.caminho, profile)) ?? modulos[0];
@@ -5505,9 +5666,9 @@ async function comandoProfile(posicionais, args, emJson) {
5505
5666
  "Uso: sema profile <validar|capabilities|rule-packs>",
5506
5667
  "",
5507
5668
  "Comandos:",
5508
- " sema profile validar <software|workflow|ops|game|legal|research> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
5669
+ " sema profile validar <software|workflow|ops|game|legal|research|conversas> <arquivo-ou-pasta> [--maturidade draft|prototype|production|critical] [--preset <preset>] [--artefato <texto>|--artefato-arquivo <arquivo>] [--json]",
5509
5670
  " sema profile capabilities [--json]",
5510
- " sema profile rule-packs [--profile <author|software|workflow|ops|game|legal|research>] [--json]",
5671
+ " sema profile rule-packs [--profile <author|software|workflow|ops|game|legal|research|conversas>] [--json]",
5511
5672
  "",
5512
5673
  "O profile e um gate semantico: se requisito obrigatorio faltar, a saida bloqueia.",
5513
5674
  ].join("\n"));
@@ -5531,7 +5692,7 @@ async function comandoProfile(posicionais, args, emJson) {
5531
5692
  const profile = normalizarProfileSemantico(posicionais[1] ?? obterOpcao(args, "--profile"));
5532
5693
  const entrada = posicionais[2] ?? obterOpcao(args, "--arquivo");
5533
5694
  if (!profile) {
5534
- console.error("Profile invalido. Use software, workflow, ops, game, legal ou research.");
5695
+ console.error("Profile invalido. Use software, workflow, ops, game, legal, research ou conversas.");
5535
5696
  return 1;
5536
5697
  }
5537
5698
  const preset = normalizarPresetProfile(profile, obterOpcao(args, "--preset"));
@@ -5892,19 +6053,19 @@ function avaliarPresetAuthor(preset, textoFonte) {
5892
6053
  const checks = {
5893
6054
  conto: [
5894
6055
  { id: "author_conto_sem_conflito", regex: /conflito|quer|precisa|perde|arrisca|custo/i, sugestao: "conto precisa de desejo, custo e conflito visiveis." },
5895
- { id: "author_conto_sem_fechamento", regex: /fim|final|consequencia|consequência|mudou|perdeu|ganhou/i, sugestao: "feche o conto com mudanca ou consequencia, nao so atmosfera." },
6056
+ { id: "author_conto_sem_fechamento", regex: /fim|final|consequencia|consequência|mudou|perdeu|ganhou/i, sugestao: "feche o conto com mudanca ou consequencia, nao so atmosfera." },
5896
6057
  ],
5897
6058
  romance: [
5898
- { id: "author_romance_sem_arco", regex: /arco|capitulo|capítulo|continuidade|promessa|personagem/i, sugestao: "romance precisa preservar arco, promessa e continuidade entre capitulos." },
6059
+ { id: "author_romance_sem_arco", regex: /arco|capitulo|capítulo|continuidade|promessa|personagem/i, sugestao: "romance precisa preservar arco, promessa e continuidade entre capitulos." },
5899
6060
  ],
5900
6061
  roteiro: [
5901
- { id: "author_roteiro_sem_cena", regex: /cena|ato|dialogo|diálogo|acao visual|ação visual|int\.|ext\./i, sugestao: "roteiro precisa de cena, acao visual e/ou dialogo estruturado." },
6062
+ { id: "author_roteiro_sem_cena", regex: /cena|ato|dialogo|diálogo|acao visual|ação visual|int\.|ext\./i, sugestao: "roteiro precisa de cena, acao visual e/ou dialogo estruturado." },
5902
6063
  ],
5903
6064
  lore: [
5904
- { id: "author_lore_sem_canon", regex: /canon|linha do tempo|mundo|facção|faccao|regra do mundo|continuidade/i, sugestao: "lore precisa de canon, mundo e restricoes de continuidade." },
6065
+ { id: "author_lore_sem_canon", regex: /canon|linha do tempo|mundo|facção|faccao|regra do mundo|continuidade/i, sugestao: "lore precisa de canon, mundo e restricoes de continuidade." },
5905
6066
  ],
5906
6067
  campanha: [
5907
- { id: "author_campanha_sem_estado", regex: /estado|memoria|memória|sessao|sessão|evento irreversivel|evento irreversível|personagem/i, sugestao: "campanha precisa guardar estado, memoria e eventos irreversiveis." },
6068
+ { id: "author_campanha_sem_estado", regex: /estado|memoria|memória|sessao|sessão|evento irreversivel|evento irreversível|personagem/i, sugestao: "campanha precisa guardar estado, memoria e eventos irreversiveis." },
5908
6069
  ],
5909
6070
  };
5910
6071
  return checks[preset].flatMap((check) => {
@@ -6238,7 +6399,7 @@ async function comandoDrift(entrada, args, emJson, cwd = process.cwd()) {
6238
6399
  async function comandoImpacto(entrada, args, emJson, cwd = process.cwd()) {
6239
6400
  const alvoSemantico = obterOpcao(args, "--alvo");
6240
6401
  if (!alvoSemantico) {
6241
- console.error("Uso: sema impacto <arquivo-ou-pasta> --alvo <token-semântico> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]");
6402
+ console.error("Uso: sema impacto <arquivo-ou-pasta> --alvo <token-semântico> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]");
6242
6403
  return 1;
6243
6404
  }
6244
6405
  const contextoProjeto = await carregarProjeto(entrada, cwd);
@@ -6770,15 +6931,15 @@ async function comandoPromptCurto(entrada, args, emJson) {
6770
6931
  : "SEMA_BRIEF.md";
6771
6932
  const contextoProjeto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
6772
6933
  const capacidade = tamanho === "micro" ? "pequena" : tamanho === "curto" ? "media" : "grande";
6773
- const prompt = `⚠️ REGRA OBRIGATÓRIA DE GOVERNANÇA:
6934
+ const prompt = `⚠️ REGRA OBRIGATÓRIA DE GOVERNANÇA:
6774
6935
 
6775
- ANTES DE QUALQUER AÇÃO (editar, criar, deletar, executar, consultar, modificar):
6776
- 1. Chame sema_docs_impacto com sua intenção declarada
6777
- 2. Aguarde a resposta com as docs obrigatórias
6936
+ ANTES DE QUALQUER AÇÃO (editar, criar, deletar, executar, consultar, modificar):
6937
+ 1. Chame sema_docs_impacto com sua intenção declarada
6938
+ 2. Aguarde a resposta com as docs obrigatórias
6778
6939
  3. Leia as docs antes de agir
6779
6940
  4. Use sema_finalizar_mudanca para comprovar que leu as docs
6780
6941
 
6781
- Você está operando Sema em modo IA-first.
6942
+ Você está operando Sema em modo IA-first.
6782
6943
 
6783
6944
  Isto e contexto comprimido para IA operar contrato semantico antes de tocar codigo vivo.
6784
6945
 
@@ -6786,7 +6947,7 @@ Capacidade alvo: ${capacidade}
6786
6947
  Modo da tarefa: ${modo}
6787
6948
 
6788
6949
  Regras:
6789
- - ANTES DE TUDO: chame sema_docs_impacto com sua intenção declarada
6950
+ - ANTES DE TUDO: chame sema_docs_impacto com sua intenção declarada
6790
6951
  - comece pelo resumo compacto abaixo
6791
6952
  - se a tarefa pedir mais contexto, abra \`AGENT_CONTEXT_PACK.json\` e depois \`SEMA_INDEX.json\`
6792
6953
  - nao tente ler o repo inteiro se o resumo ja disser onde tocar
@@ -7047,6 +7208,21 @@ async function principal() {
7047
7208
  codigoSaida = 0;
7048
7209
  }
7049
7210
  break;
7211
+ case "runner":
7212
+ {
7213
+ const subcomando = posicionais[0];
7214
+ if (subcomando === "validar-remoto") {
7215
+ codigoSaida = await comandoRunnerValidacaoRemota(resto, cwd);
7216
+ }
7217
+ else if (subcomando === "servidor") {
7218
+ codigoSaida = await comandoServidorRunnerValidacaoRemota(resto, cwd);
7219
+ }
7220
+ else {
7221
+ console.log(ajudaRunnerValidacaoRemota());
7222
+ codigoSaida = subcomando ? 1 : 0;
7223
+ }
7224
+ }
7225
+ break;
7050
7226
  case "validar":
7051
7227
  codigoSaida = possuiFlag(resto, "--json")
7052
7228
  ? await comandoValidarJson(posicionais[0])