@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
@@ -0,0 +1,603 @@
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift.cache.store
2
+ // Descrição: armazena objetos de cache de drift fora do workspace, com identidade opaca e validação integral.
3
+ import { constants } from "node:fs";
4
+ import { lstat, open, realpath, stat, } from "node:fs/promises";
5
+ import { createHash, randomUUID } from "node:crypto";
6
+ import path from "node:path";
7
+ import { adquirirLockPublicacao, capturarEstadoEntradaGuardado, confirmarLockPublicacao, FalhaCasCacheDrift, liberarLockPublicacao, limparTemporariosOrfaos, publicarObjetoExclusivo, removerArquivoGuardadoSeMesmo, } from "./driftCacheCas.js";
8
+ import { aplicarPermissaoArquivo, caminhoContido, caminhosSobrepostos, capturarGuardaCadeia, confirmarGuardaCadeia, erroEhAusencia, estadoEntrada, FalhaFilesystemCacheDrift, garantirSubdiretorioSeguro, identidadeArquivoValida, identidadeDe, lerHandleLimitado, lstatOuNull, mesmaIdentidade, mesmoEstadoEntrada, prepararRaizCache, resolverRaizCacheSema, validarComponentesExistentesSemLink, } from "./driftCacheFilesystem.js";
9
+ export { resolverRaizCacheSema };
10
+ export const SCHEMA_OBJETO_CACHE_DRIFT = "sema.drift-cache-object/v3";
11
+ export const LIMITE_BYTES_OBJETO_CACHE_DRIFT = 64 * 1024 * 1024;
12
+ const PADRAO_DIGEST = /^sha256:[a-f0-9]{64}$/u;
13
+ const PADRAO_HEAD_GIT = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u;
14
+ class FalhaStoreCacheDrift extends Error {
15
+ codigo;
16
+ constructor(codigo) {
17
+ super(codigo);
18
+ this.codigo = codigo;
19
+ this.name = "FalhaStoreCacheDrift";
20
+ }
21
+ }
22
+ function emitirEvento(observador, evento) {
23
+ try {
24
+ observador?.(evento);
25
+ }
26
+ catch {
27
+ // Observabilidade nao altera o comportamento do cache.
28
+ }
29
+ }
30
+ function falharJsonCanonico(motivo) {
31
+ throw new TypeError(`json_cache_drift_invalido:${motivo}`);
32
+ }
33
+ function serializarCanonico(valor, visitados) {
34
+ if (valor === null)
35
+ return "null";
36
+ if (typeof valor === "string" || typeof valor === "boolean")
37
+ return JSON.stringify(valor);
38
+ if (typeof valor === "number") {
39
+ if (!Number.isFinite(valor))
40
+ return falharJsonCanonico("numero_nao_finito");
41
+ return Object.is(valor, -0) ? "0" : JSON.stringify(valor);
42
+ }
43
+ if (typeof valor !== "object")
44
+ return falharJsonCanonico(`tipo_${typeof valor}`);
45
+ if (visitados.has(valor))
46
+ return falharJsonCanonico("referencia_ciclica");
47
+ visitados.add(valor);
48
+ try {
49
+ if (Array.isArray(valor)) {
50
+ const itens = [];
51
+ for (let indice = 0; indice < valor.length; indice += 1) {
52
+ if (!Object.hasOwn(valor, indice))
53
+ return falharJsonCanonico("array_esparso");
54
+ itens.push(serializarCanonico(valor[indice], visitados));
55
+ }
56
+ return `[${itens.join(",")}]`;
57
+ }
58
+ const prototipo = Object.getPrototypeOf(valor);
59
+ if (prototipo !== Object.prototype && prototipo !== null) {
60
+ return falharJsonCanonico("objeto_nao_plano");
61
+ }
62
+ const objeto = valor;
63
+ const campos = Object.keys(objeto)
64
+ .sort()
65
+ .map((chave) => `${JSON.stringify(chave)}:${serializarCanonico(objeto[chave], visitados)}`);
66
+ return `{${campos.join(",")}}`;
67
+ }
68
+ finally {
69
+ visitados.delete(valor);
70
+ }
71
+ }
72
+ export function serializarJsonCanonicoCacheDrift(valor) {
73
+ return serializarCanonico(valor, new Set());
74
+ }
75
+ export function digestJsonCanonicoCacheDrift(valor) {
76
+ return `sha256:${createHash("sha256")
77
+ .update(serializarJsonCanonicoCacheDrift(valor))
78
+ .digest("hex")}`;
79
+ }
80
+ function codigoErro(erro) {
81
+ if (erro instanceof FalhaStoreCacheDrift
82
+ || erro instanceof FalhaFilesystemCacheDrift
83
+ || erro instanceof FalhaCasCacheDrift) {
84
+ return erro.codigo;
85
+ }
86
+ return "cache_io_indisponivel";
87
+ }
88
+ async function lerArquivoGitNormal(caminho, limite = 1024 * 1024) {
89
+ const infoAntes = await lstatOuNull(caminho);
90
+ if (!infoAntes?.isFile()
91
+ || infoAntes.isSymbolicLink()
92
+ || infoAntes.nlink !== 1n
93
+ || infoAntes.size > BigInt(limite))
94
+ return null;
95
+ const handle = await open(caminho, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
96
+ try {
97
+ const infoHandle = await handle.stat({ bigint: true });
98
+ if (!identidadeArquivoValida(caminho, infoAntes, infoHandle))
99
+ return null;
100
+ const bytes = await lerHandleLimitado(handle, limite);
101
+ const [infoHandleFinal, infoFinal] = await Promise.all([
102
+ handle.stat({ bigint: true }),
103
+ lstat(caminho, { bigint: true }),
104
+ ]);
105
+ if (bytes.byteLength > limite
106
+ || !identidadeArquivoValida(caminho, infoFinal, infoHandleFinal)
107
+ || !mesmaIdentidade(identidadeDe(infoAntes), identidadeDe(infoFinal)))
108
+ return null;
109
+ return bytes.toString("utf8");
110
+ }
111
+ finally {
112
+ await handle.close().catch(() => undefined);
113
+ }
114
+ }
115
+ function refGitSegura(ref) {
116
+ return ref.startsWith("refs/")
117
+ && !ref.includes("\\")
118
+ && !ref.includes("\0")
119
+ && ref.split("/").every((segmento) => segmento.length > 0 && segmento !== "." && segmento !== "..");
120
+ }
121
+ async function lerGitHeadSeguro(baseProjetoReal) {
122
+ try {
123
+ const pastaGit = path.join(baseProjetoReal, ".git");
124
+ const infoGit = await lstatOuNull(pastaGit);
125
+ if (!infoGit?.isDirectory() || infoGit.isSymbolicLink())
126
+ return null;
127
+ const gitReal = await realpath(pastaGit);
128
+ if (!caminhoContido(baseProjetoReal, gitReal))
129
+ return null;
130
+ const head = (await lerArquivoGitNormal(path.join(gitReal, "HEAD"), 4096))?.trim();
131
+ if (!head)
132
+ return null;
133
+ if (PADRAO_HEAD_GIT.test(head.toLowerCase()))
134
+ return head.toLowerCase();
135
+ if (!head.startsWith("ref: "))
136
+ return null;
137
+ const ref = head.slice("ref: ".length).trim();
138
+ if (!refGitSegura(ref))
139
+ return null;
140
+ const caminhoRef = path.resolve(gitReal, ...ref.split("/"));
141
+ if (!caminhoContido(gitReal, caminhoRef))
142
+ return null;
143
+ await validarComponentesExistentesSemLink(path.dirname(caminhoRef));
144
+ const valorRef = (await lerArquivoGitNormal(caminhoRef, 4096))?.trim().toLowerCase();
145
+ if (valorRef && PADRAO_HEAD_GIT.test(valorRef))
146
+ return valorRef;
147
+ const packed = await lerArquivoGitNormal(path.join(gitReal, "packed-refs"));
148
+ if (!packed)
149
+ return null;
150
+ for (const linha of packed.split(/\r?\n/u)) {
151
+ if (!linha || linha.startsWith("#") || linha.startsWith("^"))
152
+ continue;
153
+ const [digest, nomeRef, ...resto] = linha.trim().split(/\s+/u);
154
+ if (resto.length === 0 && nomeRef === ref && digest && PADRAO_HEAD_GIT.test(digest.toLowerCase())) {
155
+ return digest.toLowerCase();
156
+ }
157
+ }
158
+ return null;
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ function metricasVazias() {
165
+ return {
166
+ leituras: 0,
167
+ hits: 0,
168
+ misses: 0,
169
+ corruptos: 0,
170
+ publicacoes: 0,
171
+ reutilizacoes: 0,
172
+ corridasValidadas: 0,
173
+ erros: 0,
174
+ };
175
+ }
176
+ function validarChave(chave) {
177
+ return PADRAO_DIGEST.test(chave);
178
+ }
179
+ function registroObjeto(valor) {
180
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
181
+ }
182
+ function validarPayloadSeguro(validar, valor) {
183
+ if (!validar)
184
+ return true;
185
+ try {
186
+ return validar(valor);
187
+ }
188
+ catch {
189
+ return false;
190
+ }
191
+ }
192
+ class StoreCacheDriftIndisponivel {
193
+ disponivel = false;
194
+ workspaceId;
195
+ gitHead;
196
+ erroDisponibilidade;
197
+ metricasAtuais = metricasVazias();
198
+ observador;
199
+ constructor(codigo, observador, workspaceId = null, gitHead = null) {
200
+ this.erroDisponibilidade = codigo;
201
+ this.observador = observador;
202
+ this.workspaceId = workspaceId;
203
+ this.gitHead = gitHead;
204
+ emitirEvento(this.observador, {
205
+ tipo: "cache.store.unavailable",
206
+ ...(workspaceId ? { workspaceId } : {}),
207
+ codigo,
208
+ });
209
+ }
210
+ async ler(chave) {
211
+ this.metricasAtuais.erros += 1;
212
+ return { estado: "indisponivel", chave, codigo: this.erroDisponibilidade };
213
+ }
214
+ async publicar(chave, _payload, _validarExistente) {
215
+ this.metricasAtuais.erros += 1;
216
+ return { estado: "indisponivel", chave, codigo: this.erroDisponibilidade };
217
+ }
218
+ metricas() {
219
+ return { ...this.metricasAtuais };
220
+ }
221
+ }
222
+ class StoreCacheDriftDisponivel {
223
+ workspaceId;
224
+ gitHead;
225
+ raiz;
226
+ identidadeRaiz;
227
+ pastaWorkspace;
228
+ limiteBytes;
229
+ observador;
230
+ disponivel = true;
231
+ erroDisponibilidade = null;
232
+ metricasAtuais = metricasVazias();
233
+ constructor(workspaceId, gitHead, raiz, identidadeRaiz, pastaWorkspace, limiteBytes, observador) {
234
+ this.workspaceId = workspaceId;
235
+ this.gitHead = gitHead;
236
+ this.raiz = raiz;
237
+ this.identidadeRaiz = identidadeRaiz;
238
+ this.pastaWorkspace = pastaWorkspace;
239
+ this.limiteBytes = limiteBytes;
240
+ this.observador = observador;
241
+ emitirEvento(this.observador, {
242
+ tipo: "cache.store.ready",
243
+ workspaceId: this.workspaceId,
244
+ });
245
+ }
246
+ metricas() {
247
+ return { ...this.metricasAtuais };
248
+ }
249
+ async ler(chave, validar) {
250
+ return this.lerInterno(chave, validar, true);
251
+ }
252
+ async publicar(chave, payload, validarExistente) {
253
+ if (!validarChave(chave))
254
+ return this.erroPublicacao(chave, "cache_chave_invalida");
255
+ if (!validarPayloadSeguro(validarExistente, payload)) {
256
+ return this.erroPublicacao(chave, "cache_objeto_corrupto");
257
+ }
258
+ const caminhoVirtual = this.caminhoVirtual(chave);
259
+ let payloadDigest;
260
+ let conteudo;
261
+ try {
262
+ payloadDigest = digestJsonCanonicoCacheDrift(payload);
263
+ const envelope = {
264
+ schema: SCHEMA_OBJETO_CACHE_DRIFT,
265
+ key: chave,
266
+ workspaceId: this.workspaceId,
267
+ gitHead: this.gitHead,
268
+ payload,
269
+ payloadDigest,
270
+ };
271
+ conteudo = serializarJsonCanonicoCacheDrift(envelope);
272
+ if (Buffer.byteLength(conteudo, "utf8") > this.limiteBytes) {
273
+ return this.erroPublicacao(chave, "cache_objeto_grande");
274
+ }
275
+ }
276
+ catch {
277
+ return this.erroPublicacao(chave, "cache_objeto_corrupto");
278
+ }
279
+ const destino = this.caminhoObjeto(chave);
280
+ const pasta = path.dirname(destino);
281
+ const temporario = path.join(pasta, `.${chave.slice(7)}.${randomUUID()}.tmp`);
282
+ let handle;
283
+ let identidadeTemporario;
284
+ let guarda;
285
+ let lock;
286
+ try {
287
+ guarda = await garantirSubdiretorioSeguro(this.raiz, this.identidadeRaiz, pasta);
288
+ lock = await adquirirLockPublicacao({
289
+ chave,
290
+ pasta,
291
+ guardaInicial: guarda,
292
+ raiz: this.raiz,
293
+ identidadeRaiz: this.identidadeRaiz,
294
+ });
295
+ await confirmarLockPublicacao(lock);
296
+ await limparTemporariosOrfaos(chave, pasta, guarda);
297
+ await confirmarLockPublicacao(lock);
298
+ const estadoAntes = await capturarEstadoEntradaGuardado(destino, guarda);
299
+ const existente = await this.lerInterno(chave, validarExistente, false);
300
+ const estadoDepois = await capturarEstadoEntradaGuardado(destino, guarda);
301
+ if (!mesmoEstadoEntrada(estadoAntes, estadoDepois)) {
302
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
303
+ }
304
+ if (existente.estado === "hit") {
305
+ if (existente.payloadDigest !== payloadDigest) {
306
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
307
+ }
308
+ return this.resultadoObjetoExistente(chave, payloadDigest, caminhoVirtual, lock.contendido);
309
+ }
310
+ await confirmarGuardaCadeia(guarda);
311
+ handle = await open(temporario, "wx", 0o600);
312
+ await confirmarGuardaCadeia(guarda);
313
+ await aplicarPermissaoArquivo(handle);
314
+ const infoInicial = await handle.stat({ bigint: true });
315
+ const infoInicialCaminho = await lstat(temporario, { bigint: true });
316
+ if (!identidadeArquivoValida(temporario, infoInicialCaminho, infoInicial)) {
317
+ throw new FalhaStoreCacheDrift("cache_objeto_hardlink");
318
+ }
319
+ identidadeTemporario = identidadeDe(infoInicial);
320
+ await confirmarGuardaCadeia(guarda);
321
+ await handle.writeFile(conteudo, "utf8");
322
+ await handle.sync();
323
+ const infoFinal = await handle.stat({ bigint: true });
324
+ const infoFinalCaminho = await lstat(temporario, { bigint: true });
325
+ if (!identidadeArquivoValida(temporario, infoFinalCaminho, infoFinal)
326
+ || !mesmaIdentidade(identidadeTemporario, identidadeDe(infoFinal))) {
327
+ throw new FalhaStoreCacheDrift("cache_objeto_corrupto");
328
+ }
329
+ await confirmarGuardaCadeia(guarda);
330
+ await handle.close();
331
+ handle = undefined;
332
+ const estadoImediato = await capturarEstadoEntradaGuardado(destino, guarda);
333
+ if (!mesmoEstadoEntrada(estadoDepois, estadoImediato)) {
334
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
335
+ }
336
+ await confirmarLockPublicacao(lock);
337
+ const resultadoCas = await publicarObjetoExclusivo({
338
+ temporario,
339
+ destino,
340
+ guarda,
341
+ identidadeTemporario,
342
+ estadoDestinoSubstituivel: existente.estado === "corrupto" ? estadoDepois : null,
343
+ });
344
+ if (resultadoCas.estado === "conflito") {
345
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
346
+ }
347
+ if (resultadoCas.estado === "existente") {
348
+ const vencedor = await this.lerInterno(chave, validarExistente, false);
349
+ if (vencedor.estado === "hit" && vencedor.payloadDigest === payloadDigest) {
350
+ return this.resultadoObjetoExistente(chave, payloadDigest, caminhoVirtual, true);
351
+ }
352
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
353
+ }
354
+ identidadeTemporario = undefined;
355
+ await confirmarLockPublicacao(lock);
356
+ const publicado = await this.lerInterno(chave, validarExistente, false);
357
+ if (publicado.estado !== "hit" || publicado.payloadDigest !== payloadDigest) {
358
+ throw new FalhaStoreCacheDrift("cache_objeto_conflitante");
359
+ }
360
+ this.metricasAtuais.publicacoes += 1;
361
+ emitirEvento(this.observador, {
362
+ tipo: "cache.write.published",
363
+ workspaceId: this.workspaceId,
364
+ chave,
365
+ caminhoVirtual,
366
+ });
367
+ return { estado: "publicado", chave, payloadDigest, caminhoVirtual };
368
+ }
369
+ catch (erro) {
370
+ await handle?.close().catch(() => undefined);
371
+ const codigo = codigoErro(erro);
372
+ if (codigo === "cache_io_indisponivel") {
373
+ const vencedor = await this.lerInterno(chave, validarExistente, false);
374
+ if (vencedor.estado === "hit") {
375
+ if (vencedor.payloadDigest === payloadDigest) {
376
+ return this.resultadoObjetoExistente(chave, payloadDigest, caminhoVirtual, true);
377
+ }
378
+ return this.erroPublicacao(chave, "cache_objeto_conflitante");
379
+ }
380
+ }
381
+ return this.erroPublicacao(chave, codigo);
382
+ }
383
+ finally {
384
+ if (identidadeTemporario && guarda) {
385
+ await removerArquivoGuardadoSeMesmo(temporario, identidadeTemporario, guarda);
386
+ }
387
+ if (lock)
388
+ await liberarLockPublicacao(lock);
389
+ }
390
+ }
391
+ resultadoObjetoExistente(chave, payloadDigest, caminhoVirtual, corrida) {
392
+ this.metricasAtuais.reutilizacoes += 1;
393
+ if (corrida)
394
+ this.metricasAtuais.corridasValidadas += 1;
395
+ emitirEvento(this.observador, {
396
+ tipo: "cache.write.reused",
397
+ workspaceId: this.workspaceId,
398
+ chave,
399
+ caminhoVirtual,
400
+ });
401
+ return { estado: "existente", chave, payloadDigest, caminhoVirtual };
402
+ }
403
+ async lerInterno(chave, validar, contabilizar) {
404
+ if (contabilizar)
405
+ this.metricasAtuais.leituras += 1;
406
+ if (!validarChave(chave))
407
+ return this.resultadoCorrupto(chave, "cache_chave_invalida", contabilizar);
408
+ const caminhoVirtual = this.caminhoVirtual(chave);
409
+ const caminho = this.caminhoObjeto(chave);
410
+ try {
411
+ const infoAntes = await lstatOuNull(caminho);
412
+ if (!infoAntes) {
413
+ if (contabilizar) {
414
+ this.metricasAtuais.misses += 1;
415
+ emitirEvento(this.observador, {
416
+ tipo: "cache.read.miss",
417
+ workspaceId: this.workspaceId,
418
+ chave,
419
+ caminhoVirtual,
420
+ codigo: "cache_objeto_ausente",
421
+ });
422
+ }
423
+ return { estado: "miss", chave, codigo: "cache_objeto_ausente", caminhoVirtual };
424
+ }
425
+ const guarda = await capturarGuardaCadeia(this.raiz, this.identidadeRaiz, path.dirname(caminho));
426
+ const infoGuardado = await lstat(caminho, { bigint: true });
427
+ if (!mesmoEstadoEntrada(estadoEntrada(infoAntes), estadoEntrada(infoGuardado))) {
428
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
429
+ }
430
+ if (!infoAntes.isFile() || infoAntes.isSymbolicLink()) {
431
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
432
+ }
433
+ if (infoAntes.nlink !== 1n) {
434
+ return this.resultadoCorrupto(chave, "cache_objeto_hardlink", contabilizar);
435
+ }
436
+ if (infoAntes.size > BigInt(this.limiteBytes)) {
437
+ return this.resultadoCorrupto(chave, "cache_objeto_grande", contabilizar);
438
+ }
439
+ const flags = constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0);
440
+ await confirmarGuardaCadeia(guarda);
441
+ const handle = await open(caminho, flags);
442
+ let bytes;
443
+ try {
444
+ await confirmarGuardaCadeia(guarda);
445
+ const infoHandleAntes = await handle.stat({ bigint: true });
446
+ if (!identidadeArquivoValida(caminho, infoAntes, infoHandleAntes)) {
447
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
448
+ }
449
+ bytes = await lerHandleLimitado(handle, this.limiteBytes);
450
+ if (bytes.byteLength > this.limiteBytes) {
451
+ return this.resultadoCorrupto(chave, "cache_objeto_grande", contabilizar);
452
+ }
453
+ const [infoHandleDepois, infoDepois] = await Promise.all([
454
+ handle.stat({ bigint: true }),
455
+ lstat(caminho, { bigint: true }),
456
+ ]);
457
+ await confirmarGuardaCadeia(guarda);
458
+ if (!identidadeArquivoValida(caminho, infoDepois, infoHandleDepois)
459
+ || !mesmaIdentidade(identidadeDe(infoAntes), identidadeDe(infoDepois))) {
460
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
461
+ }
462
+ }
463
+ finally {
464
+ await handle.close().catch(() => undefined);
465
+ }
466
+ let bruto;
467
+ try {
468
+ bruto = JSON.parse(bytes.toString("utf8"));
469
+ }
470
+ catch {
471
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
472
+ }
473
+ if (!registroObjeto(bruto)
474
+ || bruto.schema !== SCHEMA_OBJETO_CACHE_DRIFT
475
+ || bruto.key !== chave
476
+ || bruto.workspaceId !== this.workspaceId
477
+ || bruto.gitHead !== this.gitHead
478
+ || typeof bruto.payloadDigest !== "string"
479
+ || !PADRAO_DIGEST.test(bruto.payloadDigest)) {
480
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
481
+ }
482
+ const campos = Object.keys(bruto).sort();
483
+ if (campos.join("\0") !== ["gitHead", "key", "payload", "payloadDigest", "schema", "workspaceId"].join("\0")) {
484
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
485
+ }
486
+ let digest;
487
+ try {
488
+ digest = digestJsonCanonicoCacheDrift(bruto.payload);
489
+ }
490
+ catch {
491
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
492
+ }
493
+ if (digest !== bruto.payloadDigest || !validarPayloadSeguro(validar, bruto.payload)) {
494
+ return this.resultadoCorrupto(chave, "cache_objeto_corrupto", contabilizar);
495
+ }
496
+ if (contabilizar) {
497
+ this.metricasAtuais.hits += 1;
498
+ emitirEvento(this.observador, {
499
+ tipo: "cache.read.hit",
500
+ workspaceId: this.workspaceId,
501
+ chave,
502
+ caminhoVirtual,
503
+ });
504
+ }
505
+ return {
506
+ estado: "hit",
507
+ chave,
508
+ valor: bruto.payload,
509
+ payloadDigest: digest,
510
+ caminhoVirtual,
511
+ };
512
+ }
513
+ catch (erro) {
514
+ if (erroEhAusencia(erro)) {
515
+ if (contabilizar)
516
+ this.metricasAtuais.misses += 1;
517
+ return { estado: "miss", chave, codigo: "cache_objeto_ausente", caminhoVirtual };
518
+ }
519
+ return this.resultadoCorrupto(chave, codigoErro(erro), contabilizar);
520
+ }
521
+ }
522
+ resultadoCorrupto(chave, codigo, contabilizar) {
523
+ const caminhoVirtual = validarChave(chave) ? this.caminhoVirtual(chave) : "$SEMA_CACHE/invalid";
524
+ if (contabilizar) {
525
+ this.metricasAtuais.corruptos += 1;
526
+ emitirEvento(this.observador, {
527
+ tipo: "cache.read.corrupt",
528
+ workspaceId: this.workspaceId,
529
+ ...(validarChave(chave) ? { chave } : {}),
530
+ caminhoVirtual,
531
+ codigo,
532
+ });
533
+ }
534
+ return { estado: "corrupto", chave, codigo, caminhoVirtual };
535
+ }
536
+ erroPublicacao(chave, codigo) {
537
+ this.metricasAtuais.erros += 1;
538
+ emitirEvento(this.observador, {
539
+ tipo: "cache.write.error",
540
+ workspaceId: this.workspaceId,
541
+ ...(validarChave(chave) ? { chave, caminhoVirtual: this.caminhoVirtual(chave) } : {}),
542
+ codigo,
543
+ });
544
+ return { estado: "erro", chave, codigo };
545
+ }
546
+ caminhoObjeto(chave) {
547
+ const digest = chave.slice("sha256:".length);
548
+ return path.join(this.pastaWorkspace, "objects", "sha256", digest.slice(0, 2), `${digest}.json`);
549
+ }
550
+ caminhoVirtual(chave) {
551
+ const digest = chave.slice("sha256:".length);
552
+ return `$SEMA_CACHE/drift/v3/workspaces/${this.workspaceId.slice(7)}/objects/sha256/${digest.slice(0, 2)}/${digest}.json`;
553
+ }
554
+ }
555
+ function normalizarLimiteBytes(valor) {
556
+ return Number.isSafeInteger(valor) && valor > 0
557
+ ? valor
558
+ : LIMITE_BYTES_OBJETO_CACHE_DRIFT;
559
+ }
560
+ export async function criarStoreCacheDrift(opcoes) {
561
+ const resolucao = resolverRaizCacheSema({
562
+ plataforma: process.platform,
563
+ ambiente: opcoes.ambiente,
564
+ diretorioUsuario: opcoes.diretorioUsuario,
565
+ raizCache: opcoes.raizCache,
566
+ });
567
+ if (!resolucao.disponivel) {
568
+ return new StoreCacheDriftIndisponivel(resolucao.codigo, opcoes.observador);
569
+ }
570
+ let workspaceId = null;
571
+ let gitHead = null;
572
+ try {
573
+ const baseProjetoReal = await realpath(path.resolve(opcoes.baseProjeto));
574
+ const infoProjeto = await stat(baseProjetoReal, { bigint: true });
575
+ if (!infoProjeto.isDirectory())
576
+ throw new FalhaStoreCacheDrift("cache_workspace_invalido");
577
+ const raizLogica = path.resolve(resolucao.raiz);
578
+ if (caminhosSobrepostos(baseProjetoReal, raizLogica)) {
579
+ throw new FalhaStoreCacheDrift("cache_root_sobrepoe_workspace");
580
+ }
581
+ const raizPreparada = await prepararRaizCache(raizLogica);
582
+ if (caminhosSobrepostos(baseProjetoReal, raizPreparada.real)) {
583
+ throw new FalhaStoreCacheDrift("cache_root_sobrepoe_workspace");
584
+ }
585
+ const caminhoCanonico = process.platform === "win32"
586
+ ? baseProjetoReal.toLocaleLowerCase("en-US")
587
+ : baseProjetoReal;
588
+ workspaceId = digestJsonCanonicoCacheDrift({
589
+ schema: "sema.workspace-cache-identity/v1",
590
+ realpath: caminhoCanonico,
591
+ dev: infoProjeto.dev.toString(),
592
+ ino: infoProjeto.ino.toString(),
593
+ });
594
+ gitHead = await lerGitHeadSeguro(baseProjetoReal);
595
+ const pastaWorkspace = path.join(raizPreparada.real, "drift", "v3", "workspaces", workspaceId.slice("sha256:".length));
596
+ await garantirSubdiretorioSeguro(raizPreparada.real, raizPreparada.identidade, pastaWorkspace);
597
+ return new StoreCacheDriftDisponivel(workspaceId, gitHead, raizPreparada.real, raizPreparada.identidade, pastaWorkspace, normalizarLimiteBytes(opcoes.limiteBytes), opcoes.observador);
598
+ }
599
+ catch (erro) {
600
+ return new StoreCacheDriftIndisponivel(codigoErro(erro), opcoes.observador, workspaceId, gitHead);
601
+ }
602
+ }
603
+ //# sourceMappingURL=driftCacheStore.js.map
@@ -1,5 +1,4 @@
1
- export declare const SCHEMA_SNAPSHOT_CATALOGO_DRIFT: "sema.drift-catalog/v1";
2
- export type TipoEventoOperacaoDrift = "catalog.visit" | "content.open" | "content.read" | "ast.create" | "extractor.run" | "cache.hit" | "cache.miss" | "cache.corrupt";
1
+ export type TipoEventoOperacaoDrift = "catalog.visit" | "content.open" | "content.read" | "ast.create" | "extractor.run" | "cache.hit" | "cache.miss" | "cache.corrupt" | "cache.write" | "cache.unavailable";
3
2
  export interface EventoOperacaoDrift {
4
3
  tipo: TipoEventoOperacaoDrift;
5
4
  caminho?: string;
@@ -30,28 +29,7 @@ export interface MetricasCatalogoDrift {
30
29
  leiturasConteudo: number;
31
30
  bytesLidos: number;
32
31
  acertosMemoriaConteudo: number;
33
- origem: "plano_explicito" | "caminhada" | "snapshot";
34
- diretoriosValidadosCache: number;
35
- }
36
- export interface AssinaturaDiretorioCatalogoDrift {
37
- mtimeNs: string;
38
- ctimeNs: string;
39
- dev: string;
40
- ino: string;
41
- }
42
- export interface SnapshotCatalogoDrift {
43
- schema: typeof SCHEMA_SNAPSHOT_CATALOGO_DRIFT;
44
- raizes: string[];
45
- extensoes: string[] | null;
46
- diretoriosIgnorados: string[];
47
- diretorios: Array<{
48
- caminho: string;
49
- assinatura: AssinaturaDiretorioCatalogoDrift;
50
- }>;
51
- arquivos: Array<{
52
- caminho: string;
53
- explicito: boolean;
54
- }>;
32
+ origem: "plano_explicito" | "caminhada";
55
33
  }
56
34
  export interface FiltroCatalogoDrift {
57
35
  extensoes?: readonly string[];
@@ -65,7 +43,6 @@ export interface OpcoesCatalogoDrift {
65
43
  diretoriosIgnorados?: ReadonlySet<string> | readonly string[];
66
44
  concorrencia?: number;
67
45
  observador?: ObservadorOperacaoDrift;
68
- snapshot?: SnapshotCatalogoDrift;
69
46
  }
70
47
  export interface CatalogoDrift {
71
48
  readonly baseDiretorio: string;
@@ -81,11 +58,8 @@ export interface CatalogoDrift {
81
58
  ler(caminho: string): Promise<ConteudoArquivoDrift>;
82
59
  lerTexto(caminho: string): Promise<string>;
83
60
  digest(caminho: string): Promise<string>;
84
- fingerprint(caminhos?: readonly string[]): Promise<string>;
85
- obterFingerprint(caminhos?: readonly string[]): Promise<string>;
86
61
  emitir(tipo: TipoEventoOperacaoDrift, arquivo?: string): void;
87
62
  metricas(): MetricasCatalogoDrift;
88
- snapshot(): SnapshotCatalogoDrift;
89
63
  }
90
64
  export type CatalogoArquivosDrift = CatalogoDrift;
91
65
  export declare function criarCatalogoDrift(opcoes: OpcoesCatalogoDrift): Promise<CatalogoDrift>;