@semacode/cli 2.3.1 → 3.5.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 (281) hide show
  1. package/README.md +265 -217
  2. package/dist/agentContextPack.js +14 -10
  3. package/dist/agentEntryPoints.d.ts +5 -0
  4. package/dist/agentEntryPoints.js +592 -568
  5. package/dist/angular-consumer-standalone.js +1 -1
  6. package/dist/bin.d.ts +6 -0
  7. package/dist/bin.js +130 -0
  8. package/dist/cliArgs.js +4 -4
  9. package/dist/cliControlError.d.ts +12 -0
  10. package/dist/cliControlError.js +47 -0
  11. package/dist/cliGrammar.d.ts +11 -0
  12. package/dist/cliGrammar.js +551 -0
  13. package/dist/cliHelp.d.ts +13 -0
  14. package/dist/cliHelp.js +19 -0
  15. package/dist/cliHelpTexto.d.ts +3 -0
  16. package/dist/cliHelpTexto.js +168 -0
  17. package/dist/cliRuntime.d.ts +2 -0
  18. package/dist/cliRuntime.js +31 -0
  19. package/dist/comandos.js +9 -22
  20. package/dist/contexto.js +5 -5
  21. package/dist/dev/index.d.ts +1 -0
  22. package/dist/dev/index.js +51 -9
  23. package/dist/discovery/catalog.js +3 -3
  24. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  25. package/dist/distribuicao/filesystemGlobal.js +701 -0
  26. package/dist/distribuicao/index.d.ts +7 -0
  27. package/dist/distribuicao/index.js +227 -0
  28. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  29. package/dist/distribuicao/launcherGlobal.js +643 -0
  30. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  31. package/dist/distribuicao/launcherWindows.js +326 -0
  32. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  33. package/dist/distribuicao/lockContextGlobal.js +17 -0
  34. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  35. package/dist/distribuicao/lockGlobal.js +520 -0
  36. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  37. package/dist/distribuicao/skillGlobal.js +652 -0
  38. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  39. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  40. package/dist/distribuicao/tipos.d.ts +50 -0
  41. package/dist/distribuicao/tipos.js +10 -0
  42. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  43. package/dist/distribuicao/versaoSemantica.js +62 -0
  44. package/dist/docs.part01.d.ts +4 -1
  45. package/dist/docs.part01.js +8 -0
  46. package/dist/docs.part02.js +9 -1
  47. package/dist/drift.part01.d.ts +33 -25
  48. package/dist/drift.part01.js +2 -1
  49. package/dist/drift.part04.d.ts +26 -5
  50. package/dist/drift.part04.js +123 -19
  51. package/dist/drift.part05.d.ts +2 -2
  52. package/dist/drift.part05.js +8 -6
  53. package/dist/drift.part06.d.ts +2 -2
  54. package/dist/drift.part06.js +113 -26
  55. package/dist/drift.part07.d.ts +11 -11
  56. package/dist/drift.part07.js +261 -265
  57. package/dist/drift.part08.d.ts +2 -2
  58. package/dist/drift.part08.js +35 -26
  59. package/dist/drift.part09.d.ts +2 -2
  60. package/dist/drift.part09.js +10 -3
  61. package/dist/drift.part11.js +261 -58
  62. package/dist/drift.part12.d.ts +1 -1
  63. package/dist/drift.part12.js +193 -21
  64. package/dist/drift.part13.d.ts +20 -39
  65. package/dist/drift.part13.js +601 -647
  66. package/dist/drift.part14.js +23 -7
  67. package/dist/driftCacheCas.d.ts +43 -0
  68. package/dist/driftCacheCas.js +351 -0
  69. package/dist/driftCacheFilesystem.d.ts +64 -0
  70. package/dist/driftCacheFilesystem.js +313 -0
  71. package/dist/driftCacheModes.d.ts +38 -0
  72. package/dist/driftCacheModes.js +147 -0
  73. package/dist/driftCacheStore.d.ts +80 -0
  74. package/dist/driftCacheStore.js +603 -0
  75. package/dist/driftCatalogo.d.ts +2 -28
  76. package/dist/driftCatalogo.js +143 -284
  77. package/dist/driftEscopo.d.ts +1 -3
  78. package/dist/driftEscopo.js +235 -151
  79. package/dist/driftEscopoReferencias.d.ts +5 -1
  80. package/dist/driftEscopoReferencias.js +375 -28
  81. package/dist/driftOrcamento.d.ts +0 -6
  82. package/dist/driftOrcamento.js +2 -1
  83. package/dist/execucoesExternas.js +19 -5
  84. package/dist/exemplosOficiais.d.ts +2 -1
  85. package/dist/exemplosOficiais.js +9 -3
  86. package/dist/geracaoCore.d.ts +1 -0
  87. package/dist/geracaoCore.js +6 -6
  88. package/dist/iaPrompts.d.ts +3 -3
  89. package/dist/iaPrompts.js +312 -313
  90. package/dist/importador.part01.d.ts +1 -1
  91. package/dist/importador.part06.d.ts +2 -0
  92. package/dist/importador.part06.js +87 -1
  93. package/dist/importador.part09.js +7 -1
  94. package/dist/index.d.ts +4 -1
  95. package/dist/index.js +6 -25
  96. package/dist/index.part01.d.ts +20 -28
  97. package/dist/index.part01.js +16 -237
  98. package/dist/index.part02.js +36 -22
  99. package/dist/index.part03.d.ts +24 -2
  100. package/dist/index.part03.js +83 -19
  101. package/dist/index.part04.d.ts +10 -2
  102. package/dist/index.part04.js +152 -123
  103. package/dist/index.part05.js +80 -78
  104. package/dist/index.part06.js +34 -17
  105. package/dist/index.part07.d.ts +8 -2
  106. package/dist/index.part07.js +153 -7
  107. package/dist/index.part08.d.ts +1 -1
  108. package/dist/index.part08.js +25 -30
  109. package/dist/initCommand.d.ts +1 -0
  110. package/dist/initCommand.js +20 -4
  111. package/dist/initTemplatesBase.js +6 -4
  112. package/dist/pipelineConteudo/command.d.ts +1 -0
  113. package/dist/pipelineConteudo/command.js +9 -2
  114. package/dist/pipelineConteudo/help.d.ts +2 -0
  115. package/dist/pipelineConteudo/help.js +33 -0
  116. package/dist/profileAuthorCommand.js +3 -7
  117. package/dist/profileCommand.js +3 -7
  118. package/dist/projetoCarregar.js +35 -17
  119. package/dist/projetoCatalogo.d.ts +1 -0
  120. package/dist/projetoCatalogo.js +64 -25
  121. package/dist/projetoConfig.js +2 -0
  122. package/dist/projetoLegado.js +18 -0
  123. package/dist/projetoOrigens.d.ts +2 -0
  124. package/dist/projetoOrigens.js +65 -9
  125. package/dist/projetoTipos.d.ts +1 -0
  126. package/dist/resultadoCli.d.ts +20 -0
  127. package/dist/resultadoCli.js +57 -0
  128. package/dist/saidaCli.d.ts +35 -0
  129. package/dist/saidaCli.js +118 -0
  130. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  131. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  132. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  133. package/dist/sistemasInterativos/engineObservation.js +438 -0
  134. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  135. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  136. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  137. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  138. package/dist/sistemasInterativos/operations.d.ts +4 -39
  139. package/dist/sistemasInterativos/operations.js +5 -1164
  140. package/dist/skillCommand.d.ts +5 -0
  141. package/dist/skillCommand.js +88 -0
  142. package/dist/tipos.d.ts +1 -1
  143. package/dist/typescript-http-modelos.d.ts +1 -1
  144. package/dist/typescript-http-rotas.d.ts +1 -0
  145. package/dist/typescript-http-rotas.js +93 -0
  146. package/dist/typescript-http.d.ts +1 -1
  147. package/dist/typescript-http.js +1 -1
  148. package/dist/verificacaoCache.d.ts +25 -0
  149. package/dist/verificacaoCache.js +80 -0
  150. package/docs/README.md +34 -30
  151. package/docs/ai-integration.md +25 -12
  152. package/docs/ai-onboarding.md +37 -18
  153. package/docs/ai-workflow.md +9 -7
  154. package/docs/cli.md +125 -7
  155. package/docs/commands.md +41 -20
  156. package/docs/deploy.md +21 -8
  157. package/docs/descoberta-capacidades.md +106 -106
  158. package/docs/documentation.md +49 -39
  159. package/docs/drift-cache.md +108 -0
  160. package/docs/getting-started.md +43 -18
  161. package/docs/pipeline-conteudo.md +246 -246
  162. package/docs/profiles.md +54 -54
  163. package/docs/repositories.md +19 -2
  164. package/docs/rollback.md +15 -8
  165. package/docs/security.md +25 -3
  166. package/docs/sistemas-interativos.md +379 -374
  167. package/docs/syntax.md +14 -0
  168. package/docs/testing.md +139 -40
  169. package/exemplos/express_crud.sema +139 -0
  170. package/exemplos/fastify_crud.sema +146 -0
  171. package/exemplos/pipeline-conteudo/README.md +44 -44
  172. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  173. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  174. package/exemplos/profile_simulation.sema +211 -211
  175. package/exemplos/sistemas-interativos/README.md +100 -100
  176. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
  177. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
  178. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
  179. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
  180. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
  181. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
  182. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
  183. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
  184. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
  185. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
  186. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
  187. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
  188. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
  189. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
  190. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
  191. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
  192. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
  193. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
  194. package/exemplos/sistemas-interativos/game-2d.json +83 -83
  195. package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
  196. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
  197. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
  198. package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
  199. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
  200. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
  201. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
  202. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
  203. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
  204. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
  205. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
  206. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
  207. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  208. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  209. package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
  210. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  211. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +37 -38
  212. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +1 -0
  213. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  214. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  215. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +7 -0
  216. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +33 -10
  217. package/package.json +9 -4
  218. package/scripts/postinstall.mjs +148 -0
  219. package/skills/sema/SKILL.md +199 -0
  220. package/skills/sema/agents/openai.yaml +4 -0
  221. package/dist/driftCache.d.ts +0 -49
  222. package/dist/driftCache.js +0 -311
  223. package/dist/driftCacheIncremental.d.ts +0 -98
  224. package/dist/driftCacheIncremental.js +0 -596
  225. package/dist/driftCatalogoPersistente.d.ts +0 -8
  226. package/dist/driftCatalogoPersistente.js +0 -77
  227. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  228. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  229. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  230. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  231. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  232. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  233. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  234. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  235. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  236. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  237. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  238. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  239. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  240. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  241. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  242. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  243. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  267. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  268. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  269. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  270. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  271. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  272. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  273. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  274. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  275. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  276. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  277. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  278. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  279. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  280. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  281. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -1,311 +0,0 @@
1
- // SEMA-GOVERNED: sema.produto.governanca_ia.drift
2
- // Descrição: persiste resultados agregados de indexação com chave por conteúdo e validação contra corrupção.
3
- import { createHash } from "node:crypto";
4
- import { lstat, readFile } from "node:fs/promises";
5
- import path from "node:path";
6
- import { escreverArquivoWorkspaceSeguro, validarDestinosEscritaWorkspace, } from "./workspaceWrite.js";
7
- export const SCHEMA_CACHE_DRIFT = "sema.drift-index-cache/v1";
8
- export const DIRETORIO_CACHE_DRIFT = path.join(".tmp", "sema-cache", "drift-index", "v1");
9
- const LIMITE_BYTES_PADRAO = 32 * 1024 * 1024;
10
- const PADRAO_DIGEST = /^sha256:[a-f0-9]{64}$/u;
11
- function emitirEvento(observador, evento) {
12
- try {
13
- observador?.(evento);
14
- }
15
- catch {
16
- // Observabilidade nunca altera o resultado funcional do drift.
17
- }
18
- }
19
- function normalizarPolitica(valor) {
20
- return valor === "refresh" || valor === "off" ? valor : "auto";
21
- }
22
- function normalizarLimiteBytes(valor) {
23
- if (!Number.isSafeInteger(valor) || valor <= 0) {
24
- return LIMITE_BYTES_PADRAO;
25
- }
26
- return valor;
27
- }
28
- function falharJsonCanonico(motivo, caminho) {
29
- throw new TypeError(`json_cache_drift_invalido:${motivo}:${caminho}`);
30
- }
31
- function serializarCanonico(valor, caminho, visitados) {
32
- if (valor === null) {
33
- return "null";
34
- }
35
- if (typeof valor === "string" || typeof valor === "boolean") {
36
- return JSON.stringify(valor);
37
- }
38
- if (typeof valor === "number") {
39
- if (!Number.isFinite(valor)) {
40
- return falharJsonCanonico("numero_nao_finito", caminho);
41
- }
42
- return Object.is(valor, -0) ? "0" : JSON.stringify(valor);
43
- }
44
- if (typeof valor !== "object") {
45
- return falharJsonCanonico(`tipo_${typeof valor}_nao_suportado`, caminho);
46
- }
47
- if (visitados.has(valor)) {
48
- return falharJsonCanonico("referencia_ciclica", caminho);
49
- }
50
- visitados.add(valor);
51
- try {
52
- if (Array.isArray(valor)) {
53
- const itens = [];
54
- for (let indice = 0; indice < valor.length; indice += 1) {
55
- if (!Object.hasOwn(valor, indice)) {
56
- falharJsonCanonico("array_esparso", `${caminho}[${indice}]`);
57
- }
58
- itens.push(serializarCanonico(valor[indice], `${caminho}[${indice}]`, visitados));
59
- }
60
- return `[${itens.join(",")}]`;
61
- }
62
- const prototipo = Object.getPrototypeOf(valor);
63
- if (prototipo !== Object.prototype && prototipo !== null) {
64
- return falharJsonCanonico("objeto_nao_plano", caminho);
65
- }
66
- const objeto = valor;
67
- const campos = Object.keys(objeto)
68
- .sort()
69
- .map((chave) => (`${JSON.stringify(chave)}:${serializarCanonico(objeto[chave], `${caminho}.${chave}`, visitados)}`));
70
- return `{${campos.join(",")}}`;
71
- }
72
- finally {
73
- visitados.delete(valor);
74
- }
75
- }
76
- export function serializarJsonCanonicoCacheDrift(valor) {
77
- return serializarCanonico(valor, "$", new Set());
78
- }
79
- export function digestJsonCanonicoCacheDrift(valor) {
80
- return `sha256:${createHash("sha256")
81
- .update(serializarJsonCanonicoCacheDrift(valor))
82
- .digest("hex")}`;
83
- }
84
- export function criarChaveCacheDrift(entrada) {
85
- if (!entrada.fingerprintConteudo.trim()) {
86
- throw new TypeError("fingerprint_conteudo_cache_drift_vazio");
87
- }
88
- return digestJsonCanonicoCacheDrift({
89
- schema: SCHEMA_CACHE_DRIFT,
90
- fingerprintConteudo: entrada.fingerprintConteudo,
91
- identidade: entrada.identidade,
92
- });
93
- }
94
- function nomeArquivoDaChave(chave) {
95
- if (!PADRAO_DIGEST.test(chave)) {
96
- throw new TypeError(`chave_cache_drift_invalida:${chave}`);
97
- }
98
- return `${chave.slice("sha256:".length)}.json`;
99
- }
100
- function registroObjeto(valor) {
101
- return typeof valor === "object" && valor !== null && !Array.isArray(valor);
102
- }
103
- function erroEhAusencia(erro) {
104
- return ["ENOENT", "ENOTDIR"].includes(erro.code ?? "");
105
- }
106
- class CacheDriftImplementacao {
107
- baseProjeto;
108
- politica;
109
- limiteBytes;
110
- observador;
111
- emVoo = new Map();
112
- contadores = {
113
- hits: 0,
114
- misses: 0,
115
- corruptos: 0,
116
- gravacoes: 0,
117
- errosGravacao: 0,
118
- calculosCompartilhados: 0,
119
- };
120
- constructor(opcoes) {
121
- this.baseProjeto = path.resolve(opcoes.baseProjeto);
122
- this.politica = normalizarPolitica(opcoes.politica);
123
- this.limiteBytes = normalizarLimiteBytes(opcoes.limiteBytes);
124
- this.observador = opcoes.observador;
125
- }
126
- chave(entrada) {
127
- return criarChaveCacheDrift(entrada);
128
- }
129
- caminhoRelativo(chave) {
130
- return path.join(DIRETORIO_CACHE_DRIFT, nomeArquivoDaChave(chave));
131
- }
132
- obterOuCalcular(entrada, calcular) {
133
- const chave = this.chave(entrada);
134
- const existente = this.emVoo.get(chave);
135
- if (existente) {
136
- this.contadores.calculosCompartilhados += 1;
137
- return existente;
138
- }
139
- const execucao = this.executar(chave, calcular);
140
- this.emVoo.set(chave, execucao);
141
- const limpar = () => {
142
- if (this.emVoo.get(chave) === execucao) {
143
- this.emVoo.delete(chave);
144
- }
145
- };
146
- void execucao.then(limpar, limpar);
147
- return execucao;
148
- }
149
- metricas() {
150
- return { ...this.contadores };
151
- }
152
- async executar(chave, calcular) {
153
- const caminhoRelativo = this.caminhoRelativo(chave);
154
- if (this.politica === "off") {
155
- this.registrarMiss(chave, caminhoRelativo, "politica_off");
156
- return {
157
- chave,
158
- valor: await calcular(),
159
- origem: "calculado",
160
- politica: this.politica,
161
- };
162
- }
163
- if (this.politica === "auto") {
164
- const leitura = await this.lerCache(chave, caminhoRelativo, true);
165
- if (leitura.estado === "hit") {
166
- return {
167
- chave,
168
- valor: leitura.payload,
169
- origem: "cache",
170
- politica: this.politica,
171
- };
172
- }
173
- }
174
- else {
175
- this.registrarMiss(chave, caminhoRelativo, "politica_refresh");
176
- }
177
- const valor = await calcular();
178
- await this.gravarCache(chave, caminhoRelativo, valor);
179
- return {
180
- chave,
181
- valor,
182
- origem: "calculado",
183
- politica: this.politica,
184
- };
185
- }
186
- async lerCache(chave, caminhoRelativo, registrarEventos) {
187
- let caminhoAbsoluto = path.resolve(this.baseProjeto, caminhoRelativo);
188
- try {
189
- const [destino] = await validarDestinosEscritaWorkspace(this.baseProjeto, [caminhoRelativo]);
190
- caminhoAbsoluto = destino.caminhoAbsoluto;
191
- if (!destino.existe) {
192
- if (registrarEventos) {
193
- this.registrarMiss(chave, caminhoRelativo, "arquivo_ausente");
194
- }
195
- return { estado: "miss" };
196
- }
197
- const informacao = await lstat(caminhoAbsoluto);
198
- if (!informacao.isFile() || informacao.isSymbolicLink()) {
199
- return this.registrarCorrupto(chave, caminhoRelativo, "nao_eh_arquivo_regular", registrarEventos);
200
- }
201
- if (informacao.size > this.limiteBytes) {
202
- return this.registrarCorrupto(chave, caminhoRelativo, "limite_bytes_excedido", registrarEventos);
203
- }
204
- const bytes = await readFile(caminhoAbsoluto);
205
- if (bytes.byteLength > this.limiteBytes) {
206
- return this.registrarCorrupto(chave, caminhoRelativo, "limite_bytes_excedido_apos_leitura", registrarEventos);
207
- }
208
- let bruto;
209
- try {
210
- bruto = JSON.parse(bytes.toString("utf8"));
211
- }
212
- catch {
213
- return this.registrarCorrupto(chave, caminhoRelativo, "json_invalido", registrarEventos);
214
- }
215
- if (!registroObjeto(bruto)) {
216
- return this.registrarCorrupto(chave, caminhoRelativo, "envelope_invalido", registrarEventos);
217
- }
218
- if (bruto.schema !== SCHEMA_CACHE_DRIFT || bruto.key !== chave) {
219
- return this.registrarCorrupto(chave, caminhoRelativo, "schema_ou_chave_divergente", registrarEventos);
220
- }
221
- if (typeof bruto.payloadDigest !== "string" || !PADRAO_DIGEST.test(bruto.payloadDigest)) {
222
- return this.registrarCorrupto(chave, caminhoRelativo, "payload_digest_invalido", registrarEventos);
223
- }
224
- let digestCalculado;
225
- try {
226
- digestCalculado = digestJsonCanonicoCacheDrift(bruto.payload);
227
- }
228
- catch {
229
- return this.registrarCorrupto(chave, caminhoRelativo, "payload_nao_canonico", registrarEventos);
230
- }
231
- if (digestCalculado !== bruto.payloadDigest) {
232
- return this.registrarCorrupto(chave, caminhoRelativo, "payload_digest_divergente", registrarEventos);
233
- }
234
- if (registrarEventos) {
235
- this.contadores.hits += 1;
236
- emitirEvento(this.observador, {
237
- tipo: "cache.hit",
238
- chave,
239
- caminho: caminhoAbsoluto,
240
- });
241
- }
242
- return { estado: "hit", payload: bruto.payload };
243
- }
244
- catch (erro) {
245
- if (registrarEventos) {
246
- this.registrarMiss(chave, caminhoRelativo, erroEhAusencia(erro) ? "arquivo_ausente" : "cache_indisponivel");
247
- }
248
- return { estado: "miss" };
249
- }
250
- }
251
- registrarCorrupto(chave, caminhoRelativo, motivo, registrarEventos) {
252
- if (registrarEventos) {
253
- this.contadores.misses += 1;
254
- this.contadores.corruptos += 1;
255
- emitirEvento(this.observador, {
256
- tipo: "cache.corrupt",
257
- chave,
258
- caminho: path.resolve(this.baseProjeto, caminhoRelativo),
259
- motivo,
260
- });
261
- }
262
- return { estado: "corrupt" };
263
- }
264
- registrarMiss(chave, caminhoRelativo, motivo) {
265
- this.contadores.misses += 1;
266
- emitirEvento(this.observador, {
267
- tipo: "cache.miss",
268
- chave,
269
- caminho: path.resolve(this.baseProjeto, caminhoRelativo),
270
- motivo,
271
- });
272
- }
273
- async gravarCache(chave, caminhoRelativo, payload) {
274
- let envelope;
275
- let conteudo;
276
- try {
277
- envelope = {
278
- schema: SCHEMA_CACHE_DRIFT,
279
- key: chave,
280
- payload,
281
- payloadDigest: digestJsonCanonicoCacheDrift(payload),
282
- };
283
- conteudo = JSON.stringify(envelope);
284
- if (Buffer.byteLength(conteudo, "utf8") > this.limiteBytes) {
285
- this.contadores.errosGravacao += 1;
286
- return;
287
- }
288
- }
289
- catch {
290
- // Resultado não serializável continua válido; apenas não é cacheado.
291
- this.contadores.errosGravacao += 1;
292
- return;
293
- }
294
- try {
295
- await escreverArquivoWorkspaceSeguro(this.baseProjeto, caminhoRelativo, conteudo, { sobrescrever: true });
296
- this.contadores.gravacoes += 1;
297
- }
298
- catch {
299
- // Outra execução pode ter publicado a mesma chave. Um vencedor válido
300
- // encerra a corrida; qualquer outra falha permanece apenas perda de cache.
301
- const vencedor = await this.lerCache(chave, caminhoRelativo, false);
302
- if (vencedor.estado !== "hit") {
303
- this.contadores.errosGravacao += 1;
304
- }
305
- }
306
- }
307
- }
308
- export function criarCacheDrift(opcoes) {
309
- return new CacheDriftImplementacao(opcoes);
310
- }
311
- //# sourceMappingURL=driftCache.js.map
@@ -1,98 +0,0 @@
1
- import type { ConteudoArquivoDrift, ObservadorOperacaoDrift } from "./driftCatalogo.js";
2
- import { type PoliticaCacheDrift, type ValorJson } from "./driftCache.js";
3
- export declare const FILE_INDEX_SCHEMA: 2;
4
- export declare const SCHEMA_MANIFESTO_ARQUIVOS_DRIFT: "sema.drift-file-cache/v2";
5
- export declare const SCHEMA_GRUPO_INDICE_DRIFT: "sema.drift-index-group-cache/v2";
6
- export declare const DIRETORIO_CACHE_INCREMENTAL_DRIFT: string;
7
- export declare const DIRETORIO_IDENTIDADES_CACHE_INCREMENTAL_DRIFT: string;
8
- export declare function caminhoManifestoArquivosDrift(identidadeDigest: string): string;
9
- export declare function caminhoManifestoGruposDrift(identidadeDigest: string): string;
10
- export interface AssinaturaArquivoDrift {
11
- size: string;
12
- mtimeNs: string;
13
- ctimeNs: string;
14
- dev: string;
15
- ino: string;
16
- }
17
- export interface EstadoArquivoCacheDrift<T> {
18
- caminho: string;
19
- contentHash: string;
20
- valor: T;
21
- origem: "metadata_hit" | "content_hit" | "calculado";
22
- }
23
- export interface EstadoGrupoCacheDrift<T> {
24
- chave: string;
25
- valor: T;
26
- origem: "cache" | "calculado";
27
- }
28
- export interface MetricasCacheIncrementalDrift {
29
- metadataHits: number;
30
- contentHits: number;
31
- fileMisses: number;
32
- groupHits: number;
33
- groupMisses: number;
34
- corruptos: number;
35
- extracoesArquivo: number;
36
- extracoesGrupo: number;
37
- gravacoes: number;
38
- errosGravacao: number;
39
- }
40
- export interface OpcoesCacheIncrementalDrift {
41
- baseProjeto: string;
42
- politica: PoliticaCacheDrift;
43
- identidade: ValorJson;
44
- observador?: ObservadorOperacaoDrift;
45
- }
46
- export interface ResolverArquivoCacheDrift<T> {
47
- arquivo: string;
48
- analise: string;
49
- assinar?: () => Promise<AssinaturaArquivoDrift>;
50
- ler: () => Promise<ConteudoArquivoDrift>;
51
- extrair: (conteudo: ConteudoArquivoDrift) => Promise<T> | T;
52
- validar: (valor: unknown) => valor is T;
53
- }
54
- export interface ResolverGrupoCacheDrift<T> {
55
- membros: Array<{
56
- caminho: string;
57
- contentHash: string;
58
- }>;
59
- calcular: () => Promise<T>;
60
- validar: (valor: unknown) => valor is T;
61
- }
62
- export declare function obterAssinaturaArquivoDrift(arquivo: string): Promise<AssinaturaArquivoDrift>;
63
- export declare class CacheIncrementalDrift {
64
- readonly identidadeDigest: string;
65
- readonly politica: PoliticaCacheDrift;
66
- private readonly baseProjeto;
67
- private readonly baseProjetoReal;
68
- private readonly observador?;
69
- private readonly caminhoManifestoArquivos;
70
- private readonly caminhoManifestoGrupos;
71
- private manifesto?;
72
- private manifestoEmVoo?;
73
- private manifestoSujo;
74
- private readonly arquivosSujos;
75
- private manifestoGrupos?;
76
- private manifestoGruposEmVoo?;
77
- private manifestoGruposSujo;
78
- private readonly gruposSujos;
79
- private readonly arquivosEmVoo;
80
- private readonly metricasAtuais;
81
- constructor(opcoes: OpcoesCacheIncrementalDrift);
82
- metricas(): MetricasCacheIncrementalDrift;
83
- resolverArquivo<T>(opcoes: ResolverArquivoCacheDrift<T>): Promise<EstadoArquivoCacheDrift<T>>;
84
- private resolverArquivoInterno;
85
- resolverGrupo<T>(opcoes: ResolverGrupoCacheDrift<T>): Promise<EstadoGrupoCacheDrift<T>>;
86
- finalizar(): Promise<void>;
87
- private chaveEnvelope;
88
- private lerManifestoArquivosAtual;
89
- private lerManifestoGruposAtual;
90
- private gravarManifestoArquivosComMerge;
91
- private gravarManifestoGruposComMerge;
92
- private obterManifesto;
93
- private carregarManifesto;
94
- private obterManifestoGrupos;
95
- private carregarManifestoGrupos;
96
- private registrarCorrupto;
97
- private validarArquivoNoWorkspace;
98
- }