@semacode/cli 2.3.0 → 3.0.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 (267) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +112 -41
  3. package/dist/agentContextPack.js +14 -10
  4. package/dist/agentEntryPoints.d.ts +5 -0
  5. package/dist/agentEntryPoints.js +102 -91
  6. package/dist/angular-consumer-standalone.d.ts +3 -1
  7. package/dist/angular-consumer-standalone.js +12 -8
  8. package/dist/bin.d.ts +6 -0
  9. package/dist/bin.js +130 -0
  10. package/dist/cliArgs.js +4 -4
  11. package/dist/cliControlError.d.ts +12 -0
  12. package/dist/cliControlError.js +47 -0
  13. package/dist/cliGrammar.d.ts +11 -0
  14. package/dist/cliGrammar.js +551 -0
  15. package/dist/cliHelp.d.ts +13 -0
  16. package/dist/cliHelp.js +19 -0
  17. package/dist/cliHelpTexto.d.ts +3 -0
  18. package/dist/cliHelpTexto.js +168 -0
  19. package/dist/cliRuntime.d.ts +2 -0
  20. package/dist/cliRuntime.js +31 -0
  21. package/dist/comandos.js +9 -22
  22. package/dist/contexto.js +5 -5
  23. package/dist/dev/index.d.ts +1 -0
  24. package/dist/dev/index.js +51 -9
  25. package/dist/discovery/catalog.js +3 -3
  26. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  27. package/dist/distribuicao/filesystemGlobal.js +701 -0
  28. package/dist/distribuicao/index.d.ts +7 -0
  29. package/dist/distribuicao/index.js +227 -0
  30. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  31. package/dist/distribuicao/launcherGlobal.js +643 -0
  32. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  33. package/dist/distribuicao/launcherWindows.js +326 -0
  34. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  35. package/dist/distribuicao/lockContextGlobal.js +17 -0
  36. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  37. package/dist/distribuicao/lockGlobal.js +520 -0
  38. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  39. package/dist/distribuicao/skillGlobal.js +652 -0
  40. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  41. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  42. package/dist/distribuicao/tipos.d.ts +50 -0
  43. package/dist/distribuicao/tipos.js +10 -0
  44. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  45. package/dist/distribuicao/versaoSemantica.js +62 -0
  46. package/dist/drift.part01.d.ts +34 -2
  47. package/dist/drift.part01.js +3 -0
  48. package/dist/drift.part04.d.ts +12 -2
  49. package/dist/drift.part04.js +89 -15
  50. package/dist/drift.part05.d.ts +2 -1
  51. package/dist/drift.part05.js +9 -6
  52. package/dist/drift.part06.d.ts +2 -1
  53. package/dist/drift.part06.js +115 -24
  54. package/dist/drift.part07.d.ts +11 -10
  55. package/dist/drift.part07.js +261 -255
  56. package/dist/drift.part08.d.ts +2 -1
  57. package/dist/drift.part08.js +35 -25
  58. package/dist/drift.part11.js +279 -32
  59. package/dist/drift.part12.d.ts +1 -1
  60. package/dist/drift.part12.js +196 -11
  61. package/dist/drift.part13.d.ts +18 -2
  62. package/dist/drift.part13.js +654 -76
  63. package/dist/drift.part14.js +21 -7
  64. package/dist/driftCacheCas.d.ts +43 -0
  65. package/dist/driftCacheCas.js +351 -0
  66. package/dist/driftCacheFilesystem.d.ts +64 -0
  67. package/dist/driftCacheFilesystem.js +313 -0
  68. package/dist/driftCacheModes.d.ts +38 -0
  69. package/dist/driftCacheModes.js +147 -0
  70. package/dist/driftCacheStore.d.ts +80 -0
  71. package/dist/driftCacheStore.js +603 -0
  72. package/dist/driftCatalogo.d.ts +65 -0
  73. package/dist/driftCatalogo.js +516 -0
  74. package/dist/driftEscopo.d.ts +21 -0
  75. package/dist/driftEscopo.js +647 -0
  76. package/dist/driftEscopoReferencias.d.ts +8 -0
  77. package/dist/driftEscopoReferencias.js +612 -0
  78. package/dist/driftOrcamento.d.ts +6 -0
  79. package/dist/driftOrcamento.js +20 -3
  80. package/dist/geracaoCore.js +4 -6
  81. package/dist/iaPrompts.d.ts +3 -3
  82. package/dist/iaPrompts.js +13 -14
  83. package/dist/index.d.ts +4 -1
  84. package/dist/index.js +6 -25
  85. package/dist/index.part01.d.ts +21 -14
  86. package/dist/index.part01.js +20 -165
  87. package/dist/index.part02.js +57 -43
  88. package/dist/index.part03.d.ts +23 -1
  89. package/dist/index.part03.js +83 -8
  90. package/dist/index.part04.d.ts +10 -2
  91. package/dist/index.part04.js +48 -14
  92. package/dist/index.part05.d.ts +1 -1
  93. package/dist/index.part05.js +109 -30
  94. package/dist/index.part06.js +34 -16
  95. package/dist/index.part07.js +31 -27
  96. package/dist/index.part08.d.ts +1 -1
  97. package/dist/index.part08.js +23 -28
  98. package/dist/init/templates.part01.js +393 -393
  99. package/dist/init/templates.part02.js +189 -189
  100. package/dist/initCommand.js +5 -1
  101. package/dist/initTemplatesBackend.js +73 -73
  102. package/dist/initTemplatesBase.js +7 -5
  103. package/dist/initTemplatesFlutter.js +137 -137
  104. package/dist/initTemplatesRuntime.js +350 -350
  105. package/dist/initTemplatesWeb.js +309 -309
  106. package/dist/pipelineConteudo/command.d.ts +1 -0
  107. package/dist/pipelineConteudo/command.js +4 -32
  108. package/dist/pipelineConteudo/help.d.ts +2 -0
  109. package/dist/pipelineConteudo/help.js +33 -0
  110. package/dist/profileAuthorCommand.js +3 -7
  111. package/dist/profileCommand.js +3 -7
  112. package/dist/projeto.d.ts +1 -1
  113. package/dist/projetoCarregar.d.ts +2 -2
  114. package/dist/projetoCarregar.js +69 -28
  115. package/dist/projetoCatalogo.d.ts +8 -0
  116. package/dist/projetoCatalogo.js +164 -0
  117. package/dist/projetoOrigens.d.ts +2 -0
  118. package/dist/projetoOrigens.js +65 -9
  119. package/dist/projetoTipos.d.ts +15 -5
  120. package/dist/resultadoCli.d.ts +20 -0
  121. package/dist/resultadoCli.js +57 -0
  122. package/dist/saidaCli.d.ts +35 -0
  123. package/dist/saidaCli.js +118 -0
  124. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  125. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  126. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  127. package/dist/sistemasInterativos/engineObservation.js +438 -0
  128. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  129. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  130. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  131. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  132. package/dist/sistemasInterativos/operations.d.ts +4 -39
  133. package/dist/sistemasInterativos/operations.js +5 -1164
  134. package/dist/skillCommand.d.ts +5 -0
  135. package/dist/skillCommand.js +88 -0
  136. package/dist/sync/index.js +35 -35
  137. package/docs/README.md +11 -7
  138. package/docs/ai-integration.md +18 -11
  139. package/docs/ai-onboarding.md +81 -62
  140. package/docs/ai-workflow.md +10 -4
  141. package/docs/auth.md +26 -26
  142. package/docs/cli.md +197 -79
  143. package/docs/commands.md +30 -6
  144. package/docs/database.md +15 -15
  145. package/docs/deploy.md +54 -41
  146. package/docs/documentation.md +11 -10
  147. package/docs/drift-cache.md +108 -0
  148. package/docs/env.md +16 -16
  149. package/docs/frontend.md +41 -41
  150. package/docs/getting-started.md +82 -57
  151. package/docs/i18n.md +15 -15
  152. package/docs/repositories.md +60 -43
  153. package/docs/rollback.md +38 -31
  154. package/docs/security.md +54 -32
  155. package/docs/sistemas-interativos.md +27 -27
  156. package/docs/support.md +8 -8
  157. package/docs/testing.md +123 -17
  158. package/docs/vocabulary.md +29 -29
  159. package/exemplos/agendamento.sema +1 -1
  160. package/exemplos/assinatura.sema +1 -1
  161. package/exemplos/auditoria.sema +1 -1
  162. package/exemplos/autenticacao.sema +1 -1
  163. package/exemplos/author_obra_comum.sema +1 -1
  164. package/exemplos/author_tema_sensivel.sema +1 -1
  165. package/exemplos/automacao.sema +1 -1
  166. package/exemplos/cadastro_usuario.sema +1 -1
  167. package/exemplos/calculadora.sema +1 -1
  168. package/exemplos/crud_simples.sema +1 -1
  169. package/exemplos/estoque.sema +1 -1
  170. package/exemplos/exportacao.sema +1 -1
  171. package/exemplos/fila.sema +1 -1
  172. package/exemplos/integracao_externa.sema +1 -1
  173. package/exemplos/multi_tenant.sema +1 -1
  174. package/exemplos/notificacao.sema +1 -1
  175. package/exemplos/operacao_estrategia.sema +132 -132
  176. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  177. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  178. package/exemplos/operacao_estrategia_gates.sema +106 -106
  179. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  180. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  181. package/exemplos/pagamento.sema +1 -1
  182. package/exemplos/pagamento_dominio.sema +1 -1
  183. package/exemplos/pedido.sema +1 -1
  184. package/exemplos/permissao.sema +1 -1
  185. package/exemplos/persistencia_vendor_first.sema +1 -1
  186. package/exemplos/profile_conversas.sema +165 -165
  187. package/exemplos/profile_game.sema +1 -1
  188. package/exemplos/profile_legal.sema +1 -1
  189. package/exemplos/profile_ops.sema +1 -1
  190. package/exemplos/profile_research.sema +1 -1
  191. package/exemplos/profile_software.sema +1 -1
  192. package/exemplos/profile_workflow_n8n.sema +1 -1
  193. package/exemplos/relatorio.sema +1 -1
  194. package/exemplos/replica_analitica_erp.sema +1 -1
  195. package/exemplos/testes_embutidos.sema +1 -1
  196. package/exemplos/tratamento_erro.sema +1 -1
  197. package/exemplos/upload_arquivo.sema +1 -1
  198. package/exemplos/webhook.sema +1 -1
  199. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  200. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  201. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  202. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  203. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  204. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  205. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  206. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  207. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  208. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  209. package/package.json +7 -2
  210. package/scripts/postinstall.mjs +148 -0
  211. package/skills/sema/SKILL.md +199 -0
  212. package/skills/sema/agents/openai.yaml +4 -0
  213. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  214. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  215. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  216. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  217. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  218. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  219. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  220. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  221. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  222. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  223. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  224. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  225. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  226. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  227. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  228. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  229. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  267. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -0,0 +1,313 @@
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift.cache.store
2
+ // Descrição: confina a árvore externa de cache por identidade física e realpath antes e depois de cada I/O.
3
+ import { constants } from "node:fs";
4
+ import { lstat, mkdir, open, realpath, } from "node:fs/promises";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ export class FalhaFilesystemCacheDrift extends Error {
8
+ codigo;
9
+ constructor(codigo) {
10
+ super(codigo);
11
+ this.codigo = codigo;
12
+ this.name = "FalhaFilesystemCacheDrift";
13
+ }
14
+ }
15
+ function apiPath(plataforma) {
16
+ return plataforma === "win32" ? path.win32 : path.posix;
17
+ }
18
+ export function resolverRaizCacheSema(opcoes = {}) {
19
+ const plataforma = opcoes.plataforma ?? process.platform;
20
+ const caminhos = apiPath(plataforma);
21
+ const ambiente = opcoes.ambiente ?? process.env;
22
+ const diretorioUsuario = opcoes.diretorioUsuario ?? os.homedir();
23
+ if (opcoes.raizCache !== undefined) {
24
+ if (!caminhos.isAbsolute(opcoes.raizCache)) {
25
+ return { disponivel: false, codigo: "cache_root_relativa" };
26
+ }
27
+ return {
28
+ disponivel: true,
29
+ raiz: caminhos.normalize(opcoes.raizCache),
30
+ origem: "explicita",
31
+ };
32
+ }
33
+ if (!caminhos.isAbsolute(diretorioUsuario)) {
34
+ return { disponivel: false, codigo: "cache_home_invalido" };
35
+ }
36
+ if (plataforma === "win32") {
37
+ const localAppData = ambiente.LOCALAPPDATA;
38
+ if (localAppData && caminhos.isAbsolute(localAppData)) {
39
+ return {
40
+ disponivel: true,
41
+ raiz: caminhos.join(localAppData, "Sema", "Cache"),
42
+ origem: "localappdata",
43
+ };
44
+ }
45
+ return {
46
+ disponivel: true,
47
+ raiz: caminhos.join(diretorioUsuario, "AppData", "Local", "Sema", "Cache"),
48
+ origem: "windows_fallback",
49
+ };
50
+ }
51
+ if (plataforma === "darwin") {
52
+ return {
53
+ disponivel: true,
54
+ raiz: caminhos.join(diretorioUsuario, "Library", "Caches", "Sema"),
55
+ origem: "macos_cache",
56
+ };
57
+ }
58
+ const xdg = ambiente.XDG_CACHE_HOME;
59
+ if (xdg && caminhos.isAbsolute(xdg)) {
60
+ return {
61
+ disponivel: true,
62
+ raiz: caminhos.join(xdg, "sema"),
63
+ origem: "xdg_cache",
64
+ };
65
+ }
66
+ return {
67
+ disponivel: true,
68
+ raiz: caminhos.join(diretorioUsuario, ".cache", "sema"),
69
+ origem: "unix_fallback",
70
+ };
71
+ }
72
+ export function caminhoContido(base, alvo) {
73
+ const relativo = path.relative(base, alvo);
74
+ return relativo === "" || (relativo !== ".."
75
+ && !relativo.startsWith(`..${path.sep}`)
76
+ && !path.isAbsolute(relativo));
77
+ }
78
+ export function caminhosSobrepostos(a, b) {
79
+ return caminhoContido(a, b) || caminhoContido(b, a);
80
+ }
81
+ export function identidadeDe(info) {
82
+ return { dev: info.dev, ino: info.ino };
83
+ }
84
+ export function mesmaIdentidade(a, b) {
85
+ return a.dev === b.dev && a.ino === b.ino;
86
+ }
87
+ export function erroEhAusencia(erro) {
88
+ return ["ENOENT", "ENOTDIR"].includes(erro.code ?? "");
89
+ }
90
+ export async function lstatOuNull(caminho) {
91
+ try {
92
+ return await lstat(caminho, { bigint: true });
93
+ }
94
+ catch (erro) {
95
+ if (erroEhAusencia(erro))
96
+ return null;
97
+ throw erro;
98
+ }
99
+ }
100
+ function caminhoComparavel(caminho) {
101
+ const normalizado = path.normalize(path.resolve(caminho));
102
+ return process.platform === "win32" ? normalizado.toLocaleLowerCase("en-US") : normalizado;
103
+ }
104
+ function caminhosIguais(a, b) {
105
+ return caminhoComparavel(a) === caminhoComparavel(b);
106
+ }
107
+ function tipoEntrada(info) {
108
+ if (info.isSymbolicLink())
109
+ return "link";
110
+ if (info.isFile())
111
+ return "arquivo";
112
+ if (info.isDirectory())
113
+ return "diretorio";
114
+ return "outro";
115
+ }
116
+ export function estadoEntrada(info) {
117
+ return {
118
+ dev: info.dev,
119
+ ino: info.ino,
120
+ size: info.size,
121
+ mtimeNs: info.mtimeNs,
122
+ ctimeNs: info.ctimeNs,
123
+ nlink: info.nlink,
124
+ tipo: tipoEntrada(info),
125
+ };
126
+ }
127
+ export function mesmoEstadoEntrada(a, b) {
128
+ if (!a || !b)
129
+ return a === b;
130
+ return a.dev === b.dev
131
+ && a.ino === b.ino
132
+ && a.size === b.size
133
+ && a.mtimeNs === b.mtimeNs
134
+ && a.ctimeNs === b.ctimeNs
135
+ && a.nlink === b.nlink
136
+ && a.tipo === b.tipo;
137
+ }
138
+ async function validarComponenteDiretorio(caminho, identidadeEsperada) {
139
+ const info = await lstat(caminho, { bigint: true });
140
+ if (info.isSymbolicLink())
141
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
142
+ if (!info.isDirectory()) {
143
+ if (info.nlink > 1n)
144
+ throw new FalhaFilesystemCacheDrift("cache_root_hardlink");
145
+ throw new FalhaFilesystemCacheDrift("cache_root_nao_diretorio");
146
+ }
147
+ const identidade = identidadeDe(info);
148
+ if (identidadeEsperada && !mesmaIdentidade(identidadeEsperada, identidade)) {
149
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
150
+ }
151
+ const caminhoReal = await realpath(caminho);
152
+ if (!caminhosIguais(caminhoReal, caminho)) {
153
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
154
+ }
155
+ return { caminho: path.resolve(caminho), identidade };
156
+ }
157
+ export async function capturarGuardaCadeia(raiz, identidadeRaiz, destino) {
158
+ const raizAbsoluta = path.resolve(raiz);
159
+ const destinoAbsoluto = path.resolve(destino);
160
+ if (!caminhoContido(raizAbsoluta, destinoAbsoluto)) {
161
+ throw new FalhaFilesystemCacheDrift("cache_root_indisponivel");
162
+ }
163
+ const segmentos = path.relative(raizAbsoluta, destinoAbsoluto).split(path.sep).filter(Boolean);
164
+ const caminhos = [
165
+ raizAbsoluta,
166
+ ...segmentos.map((_, indice) => path.join(raizAbsoluta, ...segmentos.slice(0, indice + 1))),
167
+ ];
168
+ const componentes = [];
169
+ for (let indice = 0; indice < caminhos.length; indice += 1) {
170
+ componentes.push(await validarComponenteDiretorio(caminhos[indice], indice === 0 ? identidadeRaiz : undefined));
171
+ }
172
+ return { raiz: raizAbsoluta, destino: destinoAbsoluto, componentes };
173
+ }
174
+ export async function confirmarGuardaCadeia(guarda) {
175
+ for (const componente of guarda.componentes) {
176
+ await validarComponenteDiretorio(componente.caminho, componente.identidade);
177
+ }
178
+ }
179
+ async function aplicarPermissaoDiretorio(caminho) {
180
+ if (process.platform === "win32")
181
+ return;
182
+ const infoAntes = await lstat(caminho, { bigint: true });
183
+ if (!infoAntes.isDirectory() || infoAntes.isSymbolicLink()) {
184
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
185
+ }
186
+ const flags = constants.O_RDONLY
187
+ | (constants.O_DIRECTORY ?? 0)
188
+ | (constants.O_NOFOLLOW ?? 0);
189
+ const handle = await open(caminho, flags);
190
+ try {
191
+ const infoHandle = await handle.stat({ bigint: true });
192
+ if (!infoHandle.isDirectory()
193
+ || !mesmaIdentidade(identidadeDe(infoAntes), identidadeDe(infoHandle))) {
194
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
195
+ }
196
+ await handle.chmod(0o700);
197
+ const infoDepois = await lstat(caminho, { bigint: true });
198
+ if (!infoDepois.isDirectory()
199
+ || infoDepois.isSymbolicLink()
200
+ || !mesmaIdentidade(identidadeDe(infoHandle), identidadeDe(infoDepois))) {
201
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
202
+ }
203
+ }
204
+ finally {
205
+ await handle.close().catch(() => undefined);
206
+ }
207
+ }
208
+ export async function aplicarPermissaoArquivo(handle) {
209
+ if (process.platform !== "win32")
210
+ await handle.chmod(0o600);
211
+ }
212
+ export async function lerHandleLimitado(handle, limiteBytes) {
213
+ if (!Number.isSafeInteger(limiteBytes) || limiteBytes < 0) {
214
+ throw new RangeError("limite_cache_invalido");
215
+ }
216
+ const capacidade = limiteBytes + 1;
217
+ const buffer = Buffer.allocUnsafe(capacidade);
218
+ let total = 0;
219
+ while (total < capacidade) {
220
+ const { bytesRead } = await handle.read(buffer, total, capacidade - total, null);
221
+ if (bytesRead === 0)
222
+ break;
223
+ total += bytesRead;
224
+ }
225
+ return buffer.subarray(0, total);
226
+ }
227
+ async function garantirCadeiaDiretoriosSegura(raiz, identidadeRaiz, destino, permissaoPrivada) {
228
+ const raizAbsoluta = path.resolve(raiz);
229
+ const destinoAbsoluto = path.resolve(destino);
230
+ if (!caminhoContido(raizAbsoluta, destinoAbsoluto)) {
231
+ throw new FalhaFilesystemCacheDrift("cache_root_indisponivel");
232
+ }
233
+ let guarda = await capturarGuardaCadeia(raizAbsoluta, identidadeRaiz, raizAbsoluta);
234
+ const segmentos = path.relative(raizAbsoluta, destinoAbsoluto).split(path.sep).filter(Boolean);
235
+ let atual = raizAbsoluta;
236
+ for (const segmento of segmentos) {
237
+ atual = path.join(atual, segmento);
238
+ await confirmarGuardaCadeia(guarda);
239
+ if (!await lstatOuNull(atual)) {
240
+ await confirmarGuardaCadeia(guarda);
241
+ try {
242
+ await mkdir(atual, { mode: 0o700 });
243
+ }
244
+ catch (erro) {
245
+ if (erro.code !== "EEXIST")
246
+ throw erro;
247
+ }
248
+ await confirmarGuardaCadeia(guarda);
249
+ }
250
+ const componente = await validarComponenteDiretorio(atual);
251
+ guarda = {
252
+ raiz: raizAbsoluta,
253
+ destino: path.resolve(atual),
254
+ componentes: [...guarda.componentes, componente],
255
+ };
256
+ await confirmarGuardaCadeia(guarda);
257
+ if (permissaoPrivada) {
258
+ await aplicarPermissaoDiretorio(atual);
259
+ await confirmarGuardaCadeia(guarda);
260
+ }
261
+ }
262
+ return guarda;
263
+ }
264
+ export async function validarComponentesExistentesSemLink(alvo) {
265
+ const absoluto = path.resolve(alvo);
266
+ const raiz = path.parse(absoluto).root;
267
+ const raizGuardada = await validarComponenteDiretorio(raiz);
268
+ let guarda = { raiz, destino: raiz, componentes: [raizGuardada] };
269
+ let atual = raiz;
270
+ for (const segmento of path.relative(raiz, absoluto).split(path.sep).filter(Boolean)) {
271
+ atual = path.join(atual, segmento);
272
+ if (!await lstatOuNull(atual))
273
+ return;
274
+ const componente = await validarComponenteDiretorio(atual);
275
+ guarda = { raiz, destino: atual, componentes: [...guarda.componentes, componente] };
276
+ await confirmarGuardaCadeia(guarda);
277
+ }
278
+ }
279
+ export async function prepararRaizCache(caminho) {
280
+ const absoluto = path.resolve(caminho);
281
+ const raizSistema = path.parse(absoluto).root;
282
+ if (caminhosIguais(absoluto, raizSistema)) {
283
+ throw new FalhaFilesystemCacheDrift("cache_root_indisponivel");
284
+ }
285
+ const componenteRaiz = await validarComponenteDiretorio(raizSistema);
286
+ const guarda = await garantirCadeiaDiretoriosSegura(raizSistema, componenteRaiz.identidade, absoluto, false);
287
+ await confirmarGuardaCadeia(guarda);
288
+ await aplicarPermissaoDiretorio(absoluto);
289
+ await confirmarGuardaCadeia(guarda);
290
+ const info = await lstat(absoluto, { bigint: true });
291
+ const real = await realpath(absoluto);
292
+ const componenteFinal = guarda.componentes.at(-1);
293
+ if (!componenteFinal
294
+ || !mesmaIdentidade(componenteFinal.identidade, identidadeDe(info))
295
+ || !caminhosIguais(real, absoluto)) {
296
+ throw new FalhaFilesystemCacheDrift("cache_root_link");
297
+ }
298
+ await confirmarGuardaCadeia(guarda);
299
+ return { real, identidade: identidadeDe(info) };
300
+ }
301
+ export async function garantirSubdiretorioSeguro(raiz, identidadeRaiz, destino) {
302
+ return garantirCadeiaDiretoriosSegura(raiz, identidadeRaiz, destino, true);
303
+ }
304
+ export function identidadeArquivoValida(caminho, infoCaminho, infoHandle) {
305
+ return infoCaminho.isFile()
306
+ && !infoCaminho.isSymbolicLink()
307
+ && infoHandle.isFile()
308
+ && infoCaminho.nlink === 1n
309
+ && infoHandle.nlink === 1n
310
+ && mesmaIdentidade(identidadeDe(infoCaminho), identidadeDe(infoHandle))
311
+ && caminho.length > 0;
312
+ }
313
+ //# sourceMappingURL=driftCacheFilesystem.js.map
@@ -0,0 +1,38 @@
1
+ export type ModoCacheDrift = "none" | "cache" | "fresh";
2
+ export type FlagModoCacheDrift = "--cache" | "--drift";
3
+ export type AliasLegadoModoCacheDrift = "off" | "auto" | "refresh";
4
+ export type CodigoErroModoCacheDrift = "flag_duplicada" | "flags_conflitantes" | "valor_ausente" | "valor_invalido" | "flag_nao_permitida_no_comando" | "com_drift_duplicado" | "com_drift_conflitante" | "com_drift_nao_permitido" | "consulta_nao_suportada";
5
+ export type ComandoConsultaDrift = "resumo" | "inspecionar";
6
+ export interface AvisoModoCacheDrift {
7
+ codigo: "alias_modo_cache_drift_depreciado";
8
+ flag: FlagModoCacheDrift;
9
+ valorRecebido: AliasLegadoModoCacheDrift;
10
+ valorNormalizado: ModoCacheDrift;
11
+ vigencia: "uma_versao";
12
+ mensagem: string;
13
+ }
14
+ export interface ResultadoParseModoCacheDrift {
15
+ modo: ModoCacheDrift | null;
16
+ flag: FlagModoCacheDrift | null;
17
+ avisos: readonly AvisoModoCacheDrift[];
18
+ }
19
+ export interface ResolucaoModoCacheDrift {
20
+ modo: ModoCacheDrift;
21
+ executar: boolean;
22
+ avisos: readonly AvisoModoCacheDrift[];
23
+ }
24
+ interface DetalhesErroModoCacheDrift {
25
+ flag?: FlagModoCacheDrift | "--com-drift";
26
+ valor?: string;
27
+ }
28
+ export declare class ErroModoCacheDrift extends Error {
29
+ readonly codigo: CodigoErroModoCacheDrift;
30
+ readonly name = "ErroModoCacheDrift";
31
+ readonly flag?: FlagModoCacheDrift | "--com-drift";
32
+ readonly valor?: string;
33
+ constructor(codigo: CodigoErroModoCacheDrift, mensagem: string, detalhes?: DetalhesErroModoCacheDrift);
34
+ }
35
+ export declare function parsearModoCacheDrift(args: readonly string[]): ResultadoParseModoCacheDrift;
36
+ export declare function resolverModoCacheComandoDrift(args: readonly string[]): ResolucaoModoCacheDrift;
37
+ export declare function resolverModoCacheConsultaDrift(args: readonly string[], comando: ComandoConsultaDrift): ResolucaoModoCacheDrift;
38
+ export {};
@@ -0,0 +1,147 @@
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.drift.cache.modos
2
+ // Descrição: normaliza os modos públicos de cache do drift sem efeitos colaterais.
3
+ export class ErroModoCacheDrift extends Error {
4
+ codigo;
5
+ name = "ErroModoCacheDrift";
6
+ flag;
7
+ valor;
8
+ constructor(codigo, mensagem, detalhes = {}) {
9
+ super(mensagem);
10
+ this.codigo = codigo;
11
+ this.flag = detalhes.flag;
12
+ this.valor = detalhes.valor;
13
+ }
14
+ }
15
+ const FLAGS_MODO_CACHE_DRIFT = ["--cache", "--drift"];
16
+ const MODOS_CACHE_DRIFT = new Set(["none", "cache", "fresh"]);
17
+ const ALIASES_LEGADOS = {
18
+ off: "none",
19
+ auto: "cache",
20
+ refresh: "fresh",
21
+ };
22
+ const COMANDOS_CONSULTA_DRIFT = new Set(["resumo", "inspecionar"]);
23
+ function ehFlagModoCacheDrift(valor) {
24
+ return FLAGS_MODO_CACHE_DRIFT.includes(valor);
25
+ }
26
+ function ehModoCacheDrift(valor) {
27
+ return MODOS_CACHE_DRIFT.has(valor);
28
+ }
29
+ function ehAliasLegado(valor) {
30
+ return Object.prototype.hasOwnProperty.call(ALIASES_LEGADOS, valor);
31
+ }
32
+ function lerOcorrencias(args) {
33
+ const ocorrencias = [];
34
+ for (let indice = 0; indice < args.length; indice += 1) {
35
+ const argumento = args[indice] ?? "";
36
+ const separador = argumento.indexOf("=");
37
+ const flagInline = separador >= 0 ? argumento.slice(0, separador) : "";
38
+ if (ehFlagModoCacheDrift(flagInline)) {
39
+ const valor = argumento.slice(separador + 1);
40
+ if (valor.length === 0) {
41
+ throw new ErroModoCacheDrift("valor_ausente", `A flag ${flagInline} exige um modo: none, cache ou fresh.`, { flag: flagInline });
42
+ }
43
+ ocorrencias.push({ flag: flagInline, valor });
44
+ continue;
45
+ }
46
+ if (!ehFlagModoCacheDrift(argumento)) {
47
+ continue;
48
+ }
49
+ const valor = args[indice + 1];
50
+ if (valor === undefined || valor.length === 0 || valor.startsWith("-")) {
51
+ throw new ErroModoCacheDrift("valor_ausente", `A flag ${argumento} exige um modo: none, cache ou fresh.`, { flag: argumento });
52
+ }
53
+ ocorrencias.push({ flag: argumento, valor });
54
+ indice += 1;
55
+ }
56
+ return ocorrencias;
57
+ }
58
+ function validarOcorrenciaUnica(ocorrencias) {
59
+ if (ocorrencias.length === 0) {
60
+ return null;
61
+ }
62
+ if (ocorrencias.length === 1) {
63
+ return ocorrencias[0] ?? null;
64
+ }
65
+ const flags = new Set(ocorrencias.map((ocorrencia) => ocorrencia.flag));
66
+ if (flags.size > 1) {
67
+ throw new ErroModoCacheDrift("flags_conflitantes", "Use somente uma das flags --cache ou --drift.");
68
+ }
69
+ const flag = ocorrencias[0]?.flag;
70
+ throw new ErroModoCacheDrift("flag_duplicada", `A flag ${flag ?? "de modo de drift"} foi informada mais de uma vez.`, flag === undefined ? {} : { flag });
71
+ }
72
+ function normalizarOcorrencia(ocorrencia) {
73
+ if (ehModoCacheDrift(ocorrencia.valor)) {
74
+ return {
75
+ modo: ocorrencia.valor,
76
+ flag: ocorrencia.flag,
77
+ avisos: [],
78
+ };
79
+ }
80
+ if (ehAliasLegado(ocorrencia.valor)) {
81
+ const valorNormalizado = ALIASES_LEGADOS[ocorrencia.valor];
82
+ return {
83
+ modo: valorNormalizado,
84
+ flag: ocorrencia.flag,
85
+ avisos: [{
86
+ codigo: "alias_modo_cache_drift_depreciado",
87
+ flag: ocorrencia.flag,
88
+ valorRecebido: ocorrencia.valor,
89
+ valorNormalizado,
90
+ vigencia: "uma_versao",
91
+ mensagem: `${ocorrencia.valor} é um alias temporário; use ${valorNormalizado}.`,
92
+ }],
93
+ };
94
+ }
95
+ throw new ErroModoCacheDrift("valor_invalido", `Modo inválido para ${ocorrencia.flag}: ${ocorrencia.valor}. Use none, cache ou fresh.`, { flag: ocorrencia.flag, valor: ocorrencia.valor });
96
+ }
97
+ function contarComDrift(args) {
98
+ return args.reduce((total, argumento) => total + (argumento === "--com-drift" ? 1 : 0), 0);
99
+ }
100
+ function validarComDriftUnico(args) {
101
+ const ocorrencias = contarComDrift(args);
102
+ if (ocorrencias > 1) {
103
+ throw new ErroModoCacheDrift("com_drift_duplicado", "A flag --com-drift foi informada mais de uma vez.", { flag: "--com-drift" });
104
+ }
105
+ return ocorrencias === 1;
106
+ }
107
+ export function parsearModoCacheDrift(args) {
108
+ const ocorrencia = validarOcorrenciaUnica(lerOcorrencias(args));
109
+ if (ocorrencia === null) {
110
+ return { modo: null, flag: null, avisos: [] };
111
+ }
112
+ return normalizarOcorrencia(ocorrencia);
113
+ }
114
+ export function resolverModoCacheComandoDrift(args) {
115
+ if (validarComDriftUnico(args)) {
116
+ throw new ErroModoCacheDrift("com_drift_nao_permitido", "--com-drift só pode ser usada nas consultas resumo e inspecionar.", { flag: "--com-drift" });
117
+ }
118
+ const resultado = parsearModoCacheDrift(args);
119
+ if (resultado.flag === "--drift") {
120
+ throw new ErroModoCacheDrift("flag_nao_permitida_no_comando", "O comando sema drift usa --cache; --drift pertence às consultas resumo e inspecionar.", { flag: resultado.flag });
121
+ }
122
+ return {
123
+ modo: resultado.modo ?? "fresh",
124
+ executar: true,
125
+ avisos: resultado.avisos,
126
+ };
127
+ }
128
+ export function resolverModoCacheConsultaDrift(args, comando) {
129
+ if (!COMANDOS_CONSULTA_DRIFT.has(comando)) {
130
+ throw new ErroModoCacheDrift("consulta_nao_suportada", "O modo de análise de drift em consulta só é válido para resumo e inspecionar.");
131
+ }
132
+ const comDrift = validarComDriftUnico(args);
133
+ const resultado = parsearModoCacheDrift(args);
134
+ if (resultado.flag === "--cache") {
135
+ throw new ErroModoCacheDrift("flag_nao_permitida_no_comando", `${comando} usa --drift; --cache pertence ao comando sema drift.`, { flag: resultado.flag });
136
+ }
137
+ if (comDrift && resultado.flag !== null) {
138
+ throw new ErroModoCacheDrift("com_drift_conflitante", `Não combine --com-drift com ${resultado.flag}.`, { flag: resultado.flag });
139
+ }
140
+ const modo = comDrift ? "fresh" : (resultado.modo ?? "none");
141
+ return {
142
+ modo,
143
+ executar: modo !== "none",
144
+ avisos: resultado.avisos,
145
+ };
146
+ }
147
+ //# sourceMappingURL=driftCacheModes.js.map
@@ -0,0 +1,80 @@
1
+ import { type CodigoErroCasCacheDrift } from "./driftCacheCas.js";
2
+ import { resolverRaizCacheSema, type CodigoErroFilesystemCacheDrift, type OpcoesResolverRaizCacheSema, type OrigemRaizCacheSema, type ResolucaoRaizCacheSema } from "./driftCacheFilesystem.js";
3
+ export { resolverRaizCacheSema };
4
+ export type { OpcoesResolverRaizCacheSema, OrigemRaizCacheSema, ResolucaoRaizCacheSema, };
5
+ export declare const SCHEMA_OBJETO_CACHE_DRIFT: "sema.drift-cache-object/v3";
6
+ export declare const LIMITE_BYTES_OBJETO_CACHE_DRIFT: number;
7
+ export type ValorJsonCacheDrift = null | boolean | number | string | readonly ValorJsonCacheDrift[] | {
8
+ readonly [chave: string]: ValorJsonCacheDrift;
9
+ };
10
+ export type ValidadorPayloadCacheDrift<T extends ValorJsonCacheDrift> = (valor: unknown) => valor is T;
11
+ export type CodigoErroStoreCacheDrift = CodigoErroFilesystemCacheDrift | CodigoErroCasCacheDrift | "cache_home_invalido" | "cache_root_relativa" | "cache_workspace_invalido" | "cache_chave_invalida" | "cache_objeto_ausente" | "cache_objeto_corrupto" | "cache_objeto_grande" | "cache_objeto_hardlink" | "cache_objeto_conflitante" | "cache_io_indisponivel";
12
+ export type TipoEventoStoreCacheDrift = "cache.store.ready" | "cache.store.unavailable" | "cache.read.hit" | "cache.read.miss" | "cache.read.corrupt" | "cache.write.published" | "cache.write.reused" | "cache.write.error";
13
+ export interface EventoStoreCacheDrift {
14
+ tipo: TipoEventoStoreCacheDrift;
15
+ workspaceId?: string;
16
+ chave?: string;
17
+ caminhoVirtual?: string;
18
+ codigo?: CodigoErroStoreCacheDrift;
19
+ }
20
+ export interface MetricasStoreCacheDrift {
21
+ leituras: number;
22
+ hits: number;
23
+ misses: number;
24
+ corruptos: number;
25
+ publicacoes: number;
26
+ reutilizacoes: number;
27
+ corridasValidadas: number;
28
+ erros: number;
29
+ }
30
+ export interface OpcoesCriarStoreCacheDrift {
31
+ baseProjeto: string;
32
+ raizCache?: string;
33
+ limiteBytes?: number;
34
+ observador?: (evento: EventoStoreCacheDrift) => void;
35
+ ambiente?: Readonly<Record<string, string | undefined>>;
36
+ diretorioUsuario?: string;
37
+ }
38
+ export type ResultadoLeituraStoreCacheDrift<T> = {
39
+ estado: "hit";
40
+ chave: string;
41
+ valor: T;
42
+ payloadDigest: string;
43
+ caminhoVirtual: string;
44
+ } | {
45
+ estado: "miss";
46
+ chave: string;
47
+ codigo: "cache_objeto_ausente";
48
+ caminhoVirtual: string;
49
+ } | {
50
+ estado: "corrupto";
51
+ chave: string;
52
+ codigo: CodigoErroStoreCacheDrift;
53
+ caminhoVirtual: string;
54
+ } | {
55
+ estado: "indisponivel";
56
+ chave: string;
57
+ codigo: CodigoErroStoreCacheDrift;
58
+ };
59
+ export type ResultadoPublicacaoStoreCacheDrift = {
60
+ estado: "publicado" | "existente";
61
+ chave: string;
62
+ payloadDigest: string;
63
+ caminhoVirtual: string;
64
+ } | {
65
+ estado: "indisponivel" | "erro";
66
+ chave: string;
67
+ codigo: CodigoErroStoreCacheDrift;
68
+ };
69
+ export interface StoreCacheDrift {
70
+ readonly disponivel: boolean;
71
+ readonly workspaceId: string | null;
72
+ readonly gitHead: string | null;
73
+ readonly erroDisponibilidade: CodigoErroStoreCacheDrift | null;
74
+ ler<T extends ValorJsonCacheDrift>(chave: string, validar?: ValidadorPayloadCacheDrift<T>): Promise<ResultadoLeituraStoreCacheDrift<T>>;
75
+ publicar<T extends ValorJsonCacheDrift>(chave: string, payload: T, validarExistente?: ValidadorPayloadCacheDrift<T>): Promise<ResultadoPublicacaoStoreCacheDrift>;
76
+ metricas(): MetricasStoreCacheDrift;
77
+ }
78
+ export declare function serializarJsonCanonicoCacheDrift(valor: unknown): string;
79
+ export declare function digestJsonCanonicoCacheDrift(valor: unknown): string;
80
+ export declare function criarStoreCacheDrift(opcoes: OpcoesCriarStoreCacheDrift): Promise<StoreCacheDrift>;