@semacode/cli 3.13.1 → 4.1.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 (76) hide show
  1. package/dist/cliGrammar.js +16 -5
  2. package/dist/cliHelpTexto.js +4 -3
  3. package/dist/contextPack.d.ts +75 -0
  4. package/dist/contextPack.js +133 -0
  5. package/dist/driftPack.d.ts +65 -0
  6. package/dist/driftPack.js +96 -0
  7. package/dist/entrypointPack.d.ts +47 -0
  8. package/dist/entrypointPack.js +79 -0
  9. package/dist/index.part05.js +7 -1
  10. package/dist/index.part06.js +48 -17
  11. package/dist/index.part07.d.ts +1 -1
  12. package/dist/index.part07.js +16 -2
  13. package/dist/index.part08.js +1 -1
  14. package/dist/indexPack.d.ts +54 -0
  15. package/dist/indexPack.js +146 -0
  16. package/dist/init/templates.part01.js +393 -393
  17. package/dist/init/templates.part02.js +189 -189
  18. package/dist/initTemplatesBackend.js +73 -73
  19. package/dist/initTemplatesFlutter.js +137 -137
  20. package/dist/initTemplatesRuntime.js +350 -350
  21. package/dist/initTemplatesWeb.js +309 -309
  22. package/dist/sync/index.js +35 -35
  23. package/docs/auth.md +26 -26
  24. package/docs/database.md +15 -15
  25. package/docs/env.md +16 -16
  26. package/docs/frontend.md +41 -41
  27. package/docs/i18n.md +15 -15
  28. package/exemplos/agendamento.sema +1 -1
  29. package/exemplos/assinatura.sema +1 -1
  30. package/exemplos/auditoria.sema +1 -1
  31. package/exemplos/autenticacao.sema +1 -1
  32. package/exemplos/author_obra_comum.sema +1 -1
  33. package/exemplos/author_tema_sensivel.sema +1 -1
  34. package/exemplos/automacao.sema +1 -1
  35. package/exemplos/cadastro_usuario.sema +1 -1
  36. package/exemplos/calculadora.sema +1 -1
  37. package/exemplos/crud_simples.sema +1 -1
  38. package/exemplos/estoque.sema +1 -1
  39. package/exemplos/exportacao.sema +1 -1
  40. package/exemplos/fila.sema +1 -1
  41. package/exemplos/integracao_externa.sema +1 -1
  42. package/exemplos/multi_tenant.sema +1 -1
  43. package/exemplos/notificacao.sema +1 -1
  44. package/exemplos/operacao_estrategia.sema +132 -132
  45. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  46. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  47. package/exemplos/operacao_estrategia_gates.sema +106 -106
  48. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  49. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  50. package/exemplos/pagamento.sema +1 -1
  51. package/exemplos/pagamento_dominio.sema +1 -1
  52. package/exemplos/pedido.sema +1 -1
  53. package/exemplos/permissao.sema +1 -1
  54. package/exemplos/persistencia_vendor_first.sema +1 -1
  55. package/exemplos/php_crud.sema +170 -170
  56. package/exemplos/profile_conversas.sema +165 -165
  57. package/exemplos/profile_game.sema +1 -1
  58. package/exemplos/profile_legal.sema +1 -1
  59. package/exemplos/profile_ops.sema +1 -1
  60. package/exemplos/profile_research.sema +1 -1
  61. package/exemplos/profile_software.sema +1 -1
  62. package/exemplos/profile_workflow_n8n.sema +1 -1
  63. package/exemplos/relatorio.sema +1 -1
  64. package/exemplos/replica_analitica_erp.sema +1 -1
  65. package/exemplos/testes_embutidos.sema +1 -1
  66. package/exemplos/tratamento_erro.sema +1 -1
  67. package/exemplos/upload_arquivo.sema +1 -1
  68. package/exemplos/webhook.sema +1 -1
  69. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  70. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  71. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  72. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  73. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  74. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  75. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  76. package/package.json +1 -1
@@ -17,6 +17,8 @@ import { descobrirDocsIa, normalizarModoResumo, normalizarTamanhoResumo, renderi
17
17
  import { gerarResumoProjetoIa } from "./index.part04.js";
18
18
  import { carregarContextoModuloIa, gerarArquivosResumoModuloIa } from "./index.part03.js";
19
19
  import { coletarResumoSemanticoModulo, renderizarResumoModuloMarkdown, renderizarResumoModuloTexto } from "./index.part02.js";
20
+ import { criarContextPackAPartirDoResumo } from "./contextPack.js";
21
+ import { selecionarIndiceContexto } from "./indexPack.js";
20
22
  export async function comandoCompilar(entrada, alvo, saida, estrutura, framework, cwd = process.cwd()) {
21
23
  const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
22
24
  if (incompatibilidade) {
@@ -200,8 +202,8 @@ export async function comandoAjudaIa() {
200
202
  ]));
201
203
  console.log("");
202
204
  console.log(renderizarSecaoAscii("Capacidade de IA", [
203
- "fraca: `sema resumo <arquivo> --micro --drift none --json` usa stdout compacto sem inventar evidência de implementação",
204
- "média: `sema resumo <arquivo> --curto --drift none --json` + `sema drift <arquivo> --cache fresh --json`",
205
+ "fraca: `sema resumo <arquivo> --micro --drift none --json` já devolve o context-pack compacto sem inventar evidência de implementação",
206
+ "média: `sema resumo <arquivo> --curto --drift none --json` já compacta o resumo; use `sema drift <arquivo> --cache fresh --json` quando precisar de evidência do código",
205
207
  "forte: `sema contexto-ia <arquivo.sema> --saida <diretorio> --json` materializa o pacote completo",
206
208
  ]));
207
209
  console.log("");
@@ -212,7 +214,7 @@ export async function comandoAjudaIa() {
212
214
  "Use `sema interativo pipelines --json` para jogos, simulações e híbridos 3D, 2D, retro, texto, XR ou headless.",
213
215
  "Use `sema sync-codex` para regenerar o contexto governado do Codex na raiz.",
214
216
  "Use `sema instalar-exemplos` para materializar `exemplos/` oficiais sem sobrescrever arquivos locais.",
215
- "Use `sema resumo <arquivo> --micro --para onboarding --drift none --json` para IA fraca; o resumo contratual vem no stdout e campos derivados ficam não avaliados.",
217
+ "Use `sema resumo <arquivo> --micro --para onboarding --drift none --json` para IA fraca; o context-pack é automático e campos derivados ficam não avaliados.",
216
218
  "Se `sema resumo` ou outro gate estourar timeout local, aumente o timeout e tente de novo; timeout do agente nao e falha do Sema.",
217
219
  "Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
218
220
  "Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
@@ -287,6 +289,9 @@ export async function comandoExemplosPromptIa() {
287
289
  export async function comandoResumo(entrada, args, emJson) {
288
290
  const tamanho = normalizarTamanhoResumo(args);
289
291
  const modo = normalizarModoResumo(obterOpcao(args, "--para"));
292
+ const pedido = obterOpcao(args, "--pedido");
293
+ const somentePacote = possuiFlag(args, "--somente-pacote");
294
+ const pedidoExplícito = obterOpcao(args, "--pedido")?.trim();
290
295
  const pastaSaida = obterOpcao(args, "--saida");
291
296
  const escreverNaRaiz = possuiFlag(args, "--raiz");
292
297
  const alvo = entrada ? path.resolve(process.cwd(), entrada) : process.cwd();
@@ -299,6 +304,20 @@ export async function comandoResumo(entrada, args, emJson) {
299
304
  const texto = tamanho === "medio"
300
305
  ? renderizarResumoModuloMarkdown(resumoSemantico, modo, guiaPorCapacidade)
301
306
  : renderizarResumoModuloTexto(resumoSemantico, tamanho, modo);
307
+ const contextPack = criarContextPackAPartirDoResumo({
308
+ resumo: resumoSemantico,
309
+ pedido: pedidoExplícito,
310
+ modo,
311
+ tamanho,
312
+ analiseDrift: {
313
+ modo: contexto.drift.modo,
314
+ executada: contexto.drift.executada,
315
+ sucesso: contexto.drift.sucesso,
316
+ aviso: contexto.drift.aviso,
317
+ },
318
+ guiaPorCapacidade,
319
+ texto,
320
+ });
302
321
  let pastaResumo;
303
322
  let artefatosCompactos = [];
304
323
  if (pastaSaida) {
@@ -308,6 +327,14 @@ export async function comandoResumo(entrada, args, emJson) {
308
327
  artefatosCompactos = gerado.artefatosCompactos;
309
328
  }
310
329
  if (emJson) {
330
+ if (somentePacote && contextPack) {
331
+ console.log(JSON.stringify(contextPack, null, 2));
332
+ return contexto.drift.sucesso === false ? 1 : 0;
333
+ }
334
+ if (somentePacote) {
335
+ console.log(JSON.stringify(contextPack, null, 2));
336
+ return contexto.drift.sucesso === false ? 1 : 0;
337
+ }
311
338
  console.log(JSON.stringify({
312
339
  comando: "resumo",
313
340
  modo,
@@ -325,9 +352,7 @@ export async function comandoResumo(entrada, args, emJson) {
325
352
  avisos: analiseDrift.avisos,
326
353
  cache: contexto.drift.drift?.escopo_aplicado.cache ?? null,
327
354
  },
328
- guiaPorCapacidade,
329
- resumo: resumoSemantico,
330
- texto,
355
+ contextPack,
331
356
  }, null, 2));
332
357
  return contexto.drift.sucesso === false ? 1 : 0;
333
358
  }
@@ -335,17 +360,25 @@ export async function comandoResumo(entrada, args, emJson) {
335
360
  console.log(`Resumo IA-first gerado em ${pastaResumo}`);
336
361
  console.log("");
337
362
  }
338
- console.log(texto);
363
+ console.log(JSON.stringify(contextPack, null, 2));
339
364
  return contexto.drift.sucesso === false ? 1 : 0;
340
365
  }
341
366
  const resumoProjeto = await gerarResumoProjetoIa(alvo, pastaSaida, escreverNaRaiz, analiseDrift);
342
- const arquivoResumo = tamanho === "micro"
343
- ? "SEMA_BRIEF.micro.txt"
344
- : tamanho === "curto"
345
- ? "SEMA_BRIEF.curto.txt"
346
- : "SEMA_BRIEF.md";
347
- const texto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
367
+ const indexTexto = await readFile(path.join(resumoProjeto.pastaSaida, "SEMA_INDEX.json"), "utf8").catch(() => "");
368
+ const indexPack = selecionarIndiceContexto({
369
+ modulos: resumoProjeto.modulos,
370
+ request: pedidoExplícito ?? `resumo:${tamanho}`,
371
+ baseProject: resumoProjeto.baseProjeto,
372
+ generatedAt: resumoProjeto.geradoEm,
373
+ mode: modo,
374
+ drift: resumoProjeto.analiseDrift.modo,
375
+ sourceIndexChars: indexTexto.length,
376
+ });
348
377
  if (emJson) {
378
+ if (somentePacote) {
379
+ console.log(JSON.stringify(indexPack, null, 2));
380
+ return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
381
+ }
349
382
  console.log(JSON.stringify({
350
383
  comando: "resumo",
351
384
  modo,
@@ -358,15 +391,13 @@ export async function comandoResumo(entrada, args, emJson) {
358
391
  ...resumoProjeto.analiseDrift,
359
392
  avisos: analiseDrift.avisos,
360
393
  },
361
- guiaPorCapacidade: resumoProjeto.guiaPorCapacidade,
362
- modulos: resumoProjeto.modulos,
363
- texto,
394
+ indexPack,
364
395
  }, null, 2));
365
396
  return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
366
397
  }
367
398
  console.log(`Resumo IA-first do projeto gerado em ${resumoProjeto.pastaSaida}`);
368
399
  console.log("");
369
- console.log(texto);
400
+ console.log(JSON.stringify(indexPack, null, 2));
370
401
  return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
371
402
  }
372
403
  //# sourceMappingURL=index.part06.js.map
@@ -8,7 +8,7 @@ export declare function alvosSuportadosPelaStack(fontesLegado: string[] | undefi
8
8
  export declare function avisoEscopoStackVerificacao(fontesLegado: string[] | undefined, alvosEfetivos: AlvoGeracao[]): string | undefined;
9
9
  import { type ResumoModuloVerificacao } from './geracaoCore.js';
10
10
  export declare function comandoPromptCurto(entrada: string | undefined, args: string[], emJson: boolean): Promise<number>;
11
- export declare function comandoContextoIa(arquivo: string, pastaSaida: string | undefined, emJson: boolean): Promise<number>;
11
+ export declare function comandoContextoIa(arquivo: string, pastaSaida: string | undefined, emJson: boolean, args?: string[]): Promise<number>;
12
12
  export declare function comandoTestar(arquivo: string, alvo: AlvoGeracao, saida: string, estrutura: EstruturaSaida, framework: FrameworkGeracao): Promise<number>;
13
13
  export declare function imprimirResumoVerificacao(resumos: ResumoModuloVerificacao[]): void;
14
14
  export declare function comandoVerificar(entrada: string | undefined, baseSaida: string, cwd?: string, opcoes?: OpcoesVerificar): Promise<number>;
@@ -51,8 +51,10 @@ export function avisoEscopoStackVerificacao(fontesLegado, alvosEfetivos) {
51
51
  }
52
52
  return `Alvos fora da stack detectada (${(fontesLegado ?? []).join(", ")}): ${foraDaStack.join(", ")}. Considere reduzir "alvos" no sema.config.json, remover "fontesLegado" auto-declaradas ou usar --alvo unico.`;
53
53
  }
54
+ import { criarAgentContextPack } from './agentContextPack.js';
55
+ import { criarEntrypointPack } from './entrypointPack.js';
54
56
  import { escreverArquivos, formatarAvisoArtefatosGeradosAcimaDoLimite, } from './fsGovernado.js';
55
- import { obterOpcao } from './cliArgs.js';
57
+ import { obterOpcao, possuiFlag } from './cliArgs.js';
56
58
  import { avaliarDependenciasVerificacao, imprimirFalhaDependenciasVerificacao } from './doctorCommand.js';
57
59
  import { aplicarEstruturaSaida, executarTestesGerados, executarTestesParaVerificacao, gerarArquivosPorAlvo, garantirIr, nomeSubpastaModulo, resolverConfiguracaoVerificacaoPorAlvo, validarCompatibilidadeFramework, } from './geracaoCore.js';
58
60
  import { normalizarModoResumo, normalizarTamanhoResumo } from "./index.part01.js";
@@ -137,8 +139,20 @@ ${contextoProjeto.trim()}
137
139
  console.log(prompt);
138
140
  return 0;
139
141
  }
140
- export async function comandoContextoIa(arquivo, pastaSaida, emJson) {
142
+ export async function comandoContextoIa(arquivo, pastaSaida, emJson, args = []) {
141
143
  const resultado = await gerarContextoIa(arquivo, pastaSaida);
144
+ const capacidadeValor = obterOpcao(args, "--capacidade") ?? "media";
145
+ const capacidade = capacidadeValor === "fraca" || capacidadeValor === "forte" ? capacidadeValor : "media";
146
+ if (possuiFlag(args, "--pacote")) {
147
+ const agentContextPack = criarAgentContextPack(resultado.guiaPorCapacidade);
148
+ const pacote = criarEntrypointPack({
149
+ agentContextPack,
150
+ capacity: capacidade,
151
+ rawAgentContextChars: JSON.stringify(agentContextPack).length,
152
+ });
153
+ console.log(JSON.stringify(pacote, null, 2));
154
+ return resultado.sucesso ? 0 : 1;
155
+ }
142
156
  if (emJson) {
143
157
  console.log(JSON.stringify(resultado, null, 2));
144
158
  return 0;
@@ -175,7 +175,7 @@ export async function principal() {
175
175
  codigoSaida = await comandoExemplosPromptIa();
176
176
  break;
177
177
  case "contexto-ia":
178
- codigoSaida = await comandoContextoIa(posicionais[0] ?? "", obterOpcao(resto, "--saida"), possuiFlag(resto, "--json"));
178
+ codigoSaida = await comandoContextoIa(posicionais[0] ?? "", obterOpcao(resto, "--saida"), possuiFlag(resto, "--json"), resto);
179
179
  break;
180
180
  default:
181
181
  throw erroComandoDesconhecido();
@@ -0,0 +1,54 @@
1
+ import type { ResumoSemanticoModuloIa } from "./index.part01.js";
2
+ type EntradaIndice = Pick<ResumoSemanticoModuloIa, "arquivo" | "modulo" | "faz" | "tarefasPrincipais" | "regrasCriticas" | "efeitos" | "riscosPrincipais" | "lacunas" | "arquivosProvaveis" | "checksSugeridos" | "testesMinimos" | "arquivosProvaveisEditar">;
3
+ export type IndexPack = {
4
+ schema: "sema.ai.index-pack/v1";
5
+ selection: "deterministic_weighted_match" | "deterministic_summary_projection";
6
+ request: string;
7
+ source: {
8
+ command: "resumo-projeto";
9
+ baseProject: string;
10
+ generatedAt: string | null;
11
+ totalModules: number;
12
+ mode: string;
13
+ drift: string;
14
+ };
15
+ matches: Array<{
16
+ module: string;
17
+ contract: string;
18
+ relevanceScore: number;
19
+ purpose: string;
20
+ relevantTasks: string[];
21
+ criticalRules: string[];
22
+ effects: string[];
23
+ risks: string[];
24
+ knownGaps: string[];
25
+ likelyFiles: string[];
26
+ filesToEdit: string[];
27
+ requiredChecks: string[];
28
+ minimumTests: string[];
29
+ }>;
30
+ authority: {
31
+ semaRemainsAuthority: true;
32
+ rawIndexForwarded: false;
33
+ executionRequiresFreshValidation: true;
34
+ omitted: string[];
35
+ };
36
+ telemetry: {
37
+ packChars: number;
38
+ packEstimatedTokens: number;
39
+ estimateMethod: "chars_div_4";
40
+ sourceIndexEstimatedTokens: number;
41
+ reductionPercent: number;
42
+ selectedFields: string[];
43
+ };
44
+ };
45
+ export declare function selecionarIndiceContexto(input: {
46
+ modulos: readonly EntradaIndice[];
47
+ request: string;
48
+ baseProject: string;
49
+ generatedAt?: string | null;
50
+ mode?: string;
51
+ drift?: string;
52
+ sourceIndexChars?: number;
53
+ }): IndexPack;
54
+ export {};
@@ -0,0 +1,146 @@
1
+ function texto(value) {
2
+ return typeof value === "string" ? value : "";
3
+ }
4
+ function lista(value) {
5
+ return Array.isArray(value)
6
+ ? value.filter((item) => typeof item === "string" && item.length > 0)
7
+ : [];
8
+ }
9
+ function tokens(value) {
10
+ return value
11
+ .toLocaleLowerCase("pt-BR")
12
+ .normalize("NFD")
13
+ .replace(/[\u0300-\u036f]/g, "")
14
+ .split(/[^a-z0-9_]+/)
15
+ .filter((item) => item.length >= 3);
16
+ }
17
+ function correspondeToken(campo, pedido) {
18
+ return tokens(campo).some((token) => [...pedido].some((alvo) => token.startsWith(alvo) || alvo.startsWith(token)));
19
+ }
20
+ function selecionarValores(values, requestTokens, maximo, projetarResumoInteiro) {
21
+ if (projetarResumoInteiro)
22
+ return values.slice(0, maximo);
23
+ return values
24
+ .map((value, index) => ({
25
+ value,
26
+ index,
27
+ score: correspondeToken(value, requestTokens) ? 1 : 0,
28
+ }))
29
+ .sort((a, b) => b.score - a.score || a.index - b.index)
30
+ .filter((item) => item.score > 0)
31
+ .slice(0, maximo)
32
+ .map((item) => item.value);
33
+ }
34
+ function estimarTokens(chars) {
35
+ return Math.ceil(chars / 4);
36
+ }
37
+ function compactarModulo(modulo, requestTokens, projetarResumoInteiro) {
38
+ const tarefas = lista(modulo.tarefasPrincipais);
39
+ const regras = lista(modulo.regrasCriticas);
40
+ const efeitos = lista(modulo.efeitos);
41
+ const riscos = lista(modulo.riscosPrincipais);
42
+ const lacunas = lista(modulo.lacunas);
43
+ const arquivos = lista(modulo.arquivosProvaveis);
44
+ const arquivosEditar = lista(modulo.arquivosProvaveisEditar);
45
+ const checks = lista(modulo.checksSugeridos);
46
+ const testes = lista(modulo.testesMinimos);
47
+ const camposComPeso = [
48
+ [texto(modulo.modulo), [texto(modulo.modulo)], 5],
49
+ [texto(modulo.faz), [texto(modulo.faz)], 3],
50
+ ["tarefas", tarefas, 4],
51
+ ["regras", regras, 2],
52
+ ["efeitos", efeitos, 1],
53
+ ["riscos", riscos, 2],
54
+ ["lacunas", lacunas, 1],
55
+ ["arquivos", [...arquivos, ...arquivosEditar], 1],
56
+ ];
57
+ const relevanceScore = projetarResumoInteiro ? 1 : camposComPeso.reduce((total, [, values, weight]) => total + values.reduce((subtotal, value) => subtotal + (correspondeToken(value, requestTokens) ? weight : 0), 0), 0);
58
+ if (!projetarResumoInteiro && relevanceScore === 0)
59
+ return null;
60
+ return {
61
+ module: texto(modulo.modulo),
62
+ contract: texto(modulo.arquivo),
63
+ relevanceScore,
64
+ purpose: texto(modulo.faz),
65
+ relevantTasks: selecionarValores(tarefas, requestTokens, 8, projetarResumoInteiro),
66
+ criticalRules: selecionarValores(regras, requestTokens, 8, projetarResumoInteiro),
67
+ effects: selecionarValores(efeitos, requestTokens, 6, projetarResumoInteiro),
68
+ risks: selecionarValores(riscos, requestTokens, 6, projetarResumoInteiro),
69
+ knownGaps: selecionarValores(lacunas, requestTokens, 6, projetarResumoInteiro),
70
+ likelyFiles: selecionarValores(arquivos, requestTokens, 8, projetarResumoInteiro),
71
+ filesToEdit: selecionarValores(arquivosEditar, requestTokens, 8, projetarResumoInteiro),
72
+ requiredChecks: selecionarValores(checks, requestTokens, 6, projetarResumoInteiro),
73
+ minimumTests: selecionarValores(testes, requestTokens, 6, projetarResumoInteiro),
74
+ };
75
+ }
76
+ export function selecionarIndiceContexto(input) {
77
+ const request = input.request.trim();
78
+ const requestTokens = new Set(tokens(request));
79
+ const projetarResumoInteiro = request.length === 0 || request.startsWith("resumo:");
80
+ const selection = projetarResumoInteiro
81
+ ? "deterministic_summary_projection"
82
+ : "deterministic_weighted_match";
83
+ const matches = input.modulos
84
+ .map((modulo) => compactarModulo(modulo, requestTokens, projetarResumoInteiro))
85
+ .filter((item) => item !== null)
86
+ .sort((a, b) => b.relevanceScore - a.relevanceScore || a.module.localeCompare(b.module, "pt-BR"))
87
+ .slice(0, projetarResumoInteiro ? input.modulos.length : 8);
88
+ const base = {
89
+ schema: "sema.ai.index-pack/v1",
90
+ selection,
91
+ request,
92
+ source: {
93
+ command: "resumo-projeto",
94
+ baseProject: input.baseProject,
95
+ generatedAt: input.generatedAt ?? null,
96
+ totalModules: input.modulos.length,
97
+ mode: input.mode ?? "mudanca",
98
+ drift: input.drift ?? "none",
99
+ },
100
+ matches,
101
+ authority: {
102
+ semaRemainsAuthority: true,
103
+ rawIndexForwarded: false,
104
+ executionRequiresFreshValidation: true,
105
+ omitted: [
106
+ "SEMA_INDEX.json completo",
107
+ "agentContextPack duplicado",
108
+ "módulos e campos fora do orçamento da projeção compacta",
109
+ "catálogo e arquivos não relacionados ao pedido",
110
+ ],
111
+ },
112
+ };
113
+ const packChars = JSON.stringify(base).length;
114
+ const sourceIndexChars = input.sourceIndexChars ?? 0;
115
+ const sourceTokens = estimarTokens(sourceIndexChars);
116
+ return {
117
+ ...base,
118
+ telemetry: {
119
+ packChars,
120
+ packEstimatedTokens: estimarTokens(packChars),
121
+ estimateMethod: "chars_div_4",
122
+ sourceIndexEstimatedTokens: sourceTokens,
123
+ reductionPercent: sourceIndexChars === 0 ? 0 : Math.round((1 - packChars / sourceIndexChars) * 10000) / 100,
124
+ selectedFields: [
125
+ "request",
126
+ "source.baseProject",
127
+ "source.generatedAt",
128
+ "matches.module",
129
+ "matches.contract",
130
+ "matches.relevanceScore",
131
+ "matches.purpose",
132
+ "matches.relevantTasks",
133
+ "matches.criticalRules",
134
+ "matches.effects",
135
+ "matches.risks",
136
+ "matches.knownGaps",
137
+ "matches.likelyFiles",
138
+ "matches.filesToEdit",
139
+ "matches.requiredChecks",
140
+ "matches.minimumTests",
141
+ "authority",
142
+ ],
143
+ },
144
+ };
145
+ }
146
+ //# sourceMappingURL=indexPack.js.map