@semacode/cli 1.5.30 → 1.5.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +294 -0
- package/AGENT_CONTEXT_PACK.json +164 -0
- package/LICENSE +22 -0
- package/README.md +85 -144
- package/SEMA_BRIEF.curto.txt +11 -0
- package/SEMA_BRIEF.md +616 -0
- package/SEMA_BRIEF.micro.txt +9 -0
- package/SEMA_INDEX.json +9393 -0
- package/dist/billing/index.d.ts +46 -0
- package/dist/billing/index.js +143 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/comandos.js +33 -0
- package/dist/comandos.js.map +1 -1
- package/dist/controleComercialSupabase.d.ts +7 -0
- package/dist/controleComercialSupabase.js +6 -0
- package/dist/controleComercialSupabase.js.map +1 -0
- package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
- package/dist/controleComercialSupabaseAdmin.js +138 -0
- package/dist/controleComercialSupabaseAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
- package/dist/controleComercialSupabaseCadastro.js +85 -0
- package/dist/controleComercialSupabaseCadastro.js.map +1 -0
- package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
- package/dist/controleComercialSupabaseConstantes.js +44 -0
- package/dist/controleComercialSupabaseConstantes.js.map +1 -0
- package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
- package/dist/controleComercialSupabaseConsumo.js +77 -0
- package/dist/controleComercialSupabaseConsumo.js.map +1 -0
- package/dist/controleComercialSupabaseConta.d.ts +11 -0
- package/dist/controleComercialSupabaseConta.js +157 -0
- package/dist/controleComercialSupabaseConta.js.map +1 -0
- package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
- package/dist/controleComercialSupabaseProfiles.js +55 -0
- package/dist/controleComercialSupabaseProfiles.js.map +1 -0
- package/dist/controleComercialSupabaseTipos.d.ts +3 -0
- package/dist/controleComercialSupabaseTipos.js +2 -0
- package/dist/controleComercialSupabaseTipos.js.map +1 -0
- package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
- package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
- package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
- package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
- package/dist/controleComercialSupabaseTiposBase.js +2 -0
- package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
- package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
- package/dist/controleComercialSupabaseTiposConta.js +2 -0
- package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
- package/dist/dev/index.d.ts +18 -0
- package/dist/dev/index.js +143 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/index.js +222 -46
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +23 -0
- package/dist/init/index.js +112 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +11 -0
- package/dist/init/templates.js +660 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/runnerValidacaoRemota.d.ts +9 -0
- package/dist/runnerValidacaoRemota.js +9 -0
- package/dist/runnerValidacaoRemota.js.map +1 -0
- package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
- package/dist/runnerValidacaoRemotaBateria.js +115 -0
- package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
- package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
- package/dist/runnerValidacaoRemotaCli.js +86 -0
- package/dist/runnerValidacaoRemotaCli.js.map +1 -0
- package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
- package/dist/runnerValidacaoRemotaComandos.js +123 -0
- package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
- package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
- package/dist/runnerValidacaoRemotaEscopo.js +79 -0
- package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
- package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
- package/dist/runnerValidacaoRemotaExecucao.js +102 -0
- package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
- package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
- package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
- package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
- package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
- package/dist/runnerValidacaoRemotaServidor.js +157 -0
- package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
- package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
- package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
- package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
- package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
- package/dist/runnerValidacaoRemotaTipos.js +35 -0
- package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
- package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
- package/dist/runnerValidacaoRemotaUtil.js +18 -0
- package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
- package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
- package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
- package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +174 -0
- package/dist/sync/index.js.map +1 -0
- package/docs/AGENT_STARTER.md +109 -0
- package/docs/api.md +82 -0
- package/docs/cli.md +93 -0
- package/docs/como-ensinar-a-sema-para-ia.md +30 -0
- package/docs/deploy.md +45 -0
- package/docs/documentacao.md +88 -0
- package/docs/env.md +115 -0
- package/docs/extensao-vscode.md +42 -0
- package/docs/fluxo-pratico-ia-sema.md +187 -0
- package/docs/instalacao-e-primeiro-uso.md +48 -0
- package/docs/integracao-com-ia.md +24 -0
- package/docs/mcp.md +48 -0
- package/docs/pagamento-ponta-a-ponta.md +171 -0
- package/docs/persistencia-vendor-first.md +151 -0
- package/docs/prompt-base-ia-sema.md +111 -0
- package/docs/repositories.md +69 -0
- package/docs/rollback.md +24 -0
- package/docs/seguranca.md +126 -0
- package/docs/sintaxe.md +218 -0
- package/exemplos/profile_conversas.sema +165 -0
- package/llms-full.txt +35 -0
- package/llms.txt +18 -0
- package/node_modules/@sema/gerador-css/package.json +7 -14
- package/node_modules/@sema/gerador-dart/package.json +7 -14
- package/node_modules/@sema/gerador-html/package.json +7 -14
- package/node_modules/@sema/gerador-javascript/package.json +7 -14
- package/node_modules/@sema/gerador-lua/package.json +7 -14
- package/node_modules/@sema/gerador-python/package.json +7 -14
- package/node_modules/@sema/gerador-typescript/package.json +7 -14
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.d.ts +22 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +97 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/index.js +1 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +7 -10
- package/node_modules/@sema/padroes/package.json +7 -10
- package/package.json +75 -74
- package/exemplos/.prepack-generated +0 -1
- package/node_modules/@sema/gerador-css/src/index.ts +0 -605
- package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
- package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-html/src/index.ts +0 -185
- package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
- package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
- package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-python/src/index.ts +0 -850
- package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
- package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
- package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
- package/node_modules/@sema/nucleo/src/index.ts +0 -183
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
- package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
- package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
- package/node_modules/@sema/nucleo/tsconfig.json +0 -9
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
- package/node_modules/@sema/padroes/src/index.ts +0 -382
- package/node_modules/@sema/padroes/tsconfig.json +0 -9
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
|
@@ -1,665 +0,0 @@
|
|
|
1
|
-
import type { IsolamentoEfeitoSemantico, PrivilegioEfeitoSemantico } from "./seguranca.js";
|
|
2
|
-
|
|
3
|
-
export type TipoExpressaoSemantica = "existe" | "comparacao" | "predicado" | "pertencimento" | "composta" | "negacao";
|
|
4
|
-
export type CategoriaEfeitoSemantico =
|
|
5
|
-
| "persistencia"
|
|
6
|
-
| "consulta"
|
|
7
|
-
| "evento"
|
|
8
|
-
| "notificacao"
|
|
9
|
-
| "auditoria"
|
|
10
|
-
| "db.read"
|
|
11
|
-
| "db.write"
|
|
12
|
-
| "queue.publish"
|
|
13
|
-
| "queue.consume"
|
|
14
|
-
| "fs.read"
|
|
15
|
-
| "fs.write"
|
|
16
|
-
| "network.egress"
|
|
17
|
-
| "secret.read"
|
|
18
|
-
| "shell.exec";
|
|
19
|
-
export type CriticidadeEfeitoSemantico = "baixa" | "media" | "alta" | "critica";
|
|
20
|
-
|
|
21
|
-
export interface ExpressaoBaseSemantica {
|
|
22
|
-
tipo: TipoExpressaoSemantica;
|
|
23
|
-
textoOriginal: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface ExpressaoExisteSemantica extends ExpressaoBaseSemantica {
|
|
27
|
-
tipo: "existe";
|
|
28
|
-
alvo: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface ExpressaoComparacaoSemantica extends ExpressaoBaseSemantica {
|
|
32
|
-
tipo: "comparacao";
|
|
33
|
-
alvo: string;
|
|
34
|
-
operador: "==" | "!=" | ">" | ">=" | "<" | "<=";
|
|
35
|
-
valor: string;
|
|
36
|
-
valorLiteral?: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ExpressaoPredicadoSemantica extends ExpressaoBaseSemantica {
|
|
40
|
-
tipo: "predicado";
|
|
41
|
-
alvo: string;
|
|
42
|
-
predicado: string;
|
|
43
|
-
predicadoCanonico?: string;
|
|
44
|
-
argumentos?: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface ExpressaoPertencimentoSemantica extends ExpressaoBaseSemantica {
|
|
48
|
-
tipo: "pertencimento";
|
|
49
|
-
alvo: string;
|
|
50
|
-
valores: string[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface ExpressaoCompostaSemantica extends ExpressaoBaseSemantica {
|
|
54
|
-
tipo: "composta";
|
|
55
|
-
operadorLogico: "e" | "ou";
|
|
56
|
-
termos: ExpressaoSemantica[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface ExpressaoNegacaoSemantica extends ExpressaoBaseSemantica {
|
|
60
|
-
tipo: "negacao";
|
|
61
|
-
termo: ExpressaoSemantica;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export type ExpressaoSemantica =
|
|
65
|
-
| ExpressaoExisteSemantica
|
|
66
|
-
| ExpressaoComparacaoSemantica
|
|
67
|
-
| ExpressaoPredicadoSemantica
|
|
68
|
-
| ExpressaoPertencimentoSemantica
|
|
69
|
-
| ExpressaoCompostaSemantica
|
|
70
|
-
| ExpressaoNegacaoSemantica;
|
|
71
|
-
|
|
72
|
-
export interface EfeitoSemantico {
|
|
73
|
-
textoOriginal: string;
|
|
74
|
-
categoria: CategoriaEfeitoSemantico;
|
|
75
|
-
alvo: string;
|
|
76
|
-
detalhe?: string;
|
|
77
|
-
criticidade?: CriticidadeEfeitoSemantico;
|
|
78
|
-
criticidadeTexto?: string;
|
|
79
|
-
privilegio?: PrivilegioEfeitoSemantico;
|
|
80
|
-
privilegioTexto?: string;
|
|
81
|
-
isolamento?: IsolamentoEfeitoSemantico;
|
|
82
|
-
isolamentoTexto?: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface TransicaoEstadoSemantica {
|
|
86
|
-
textoOriginal: string;
|
|
87
|
-
origem: string;
|
|
88
|
-
destino: string;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export interface EtapaFlowSemantica {
|
|
92
|
-
textoOriginal: string;
|
|
93
|
-
nome: string;
|
|
94
|
-
task?: string;
|
|
95
|
-
condicao?: ExpressaoSemantica;
|
|
96
|
-
dependencias: string[];
|
|
97
|
-
mapeamentos: Array<{ campo: string; valor: string }>;
|
|
98
|
-
emSucesso?: string;
|
|
99
|
-
emErro?: string;
|
|
100
|
-
porErro: Array<{ tipo: string; destino: string }>;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export interface ContratoErroRouteSemantico {
|
|
104
|
-
nome: string;
|
|
105
|
-
codigo: string;
|
|
106
|
-
mensagem?: string;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export interface ContratoRouteSemantico {
|
|
110
|
-
metodo?: string;
|
|
111
|
-
caminho?: string;
|
|
112
|
-
task?: string;
|
|
113
|
-
inputPublico: Array<{ nome: string; tipo: string; modificadores: string[] }>;
|
|
114
|
-
outputPublico: Array<{ nome: string; tipo: string; modificadores: string[] }>;
|
|
115
|
-
errosPublicos: ContratoErroRouteSemantico[];
|
|
116
|
-
effectsPublicos: EfeitoSemantico[];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const CATEGORIAS_EFEITO = new Set<CategoriaEfeitoSemantico>([
|
|
120
|
-
"persistencia",
|
|
121
|
-
"consulta",
|
|
122
|
-
"evento",
|
|
123
|
-
"notificacao",
|
|
124
|
-
"auditoria",
|
|
125
|
-
"db.read",
|
|
126
|
-
"db.write",
|
|
127
|
-
"queue.publish",
|
|
128
|
-
"queue.consume",
|
|
129
|
-
"fs.read",
|
|
130
|
-
"fs.write",
|
|
131
|
-
"network.egress",
|
|
132
|
-
"secret.read",
|
|
133
|
-
"shell.exec",
|
|
134
|
-
]);
|
|
135
|
-
|
|
136
|
-
const CRITICIDADES_EFEITO = new Set<CriticidadeEfeitoSemantico>([
|
|
137
|
-
"baixa",
|
|
138
|
-
"media",
|
|
139
|
-
"alta",
|
|
140
|
-
"critica",
|
|
141
|
-
]);
|
|
142
|
-
|
|
143
|
-
const MAPEAMENTO_EFEITOS_LEGADOS: Record<string, CategoriaEfeitoSemantico> = {
|
|
144
|
-
grava: "persistencia",
|
|
145
|
-
atualiza: "persistencia",
|
|
146
|
-
persiste: "persistencia",
|
|
147
|
-
consulta: "consulta",
|
|
148
|
-
le: "consulta",
|
|
149
|
-
acessa: "consulta",
|
|
150
|
-
emite: "evento",
|
|
151
|
-
notifica: "notificacao",
|
|
152
|
-
envia: "notificacao",
|
|
153
|
-
registra: "auditoria",
|
|
154
|
-
audita: "auditoria",
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const PREDICADOS_CANONICOS: Record<string, string> = {
|
|
158
|
-
preenchida: "preenchido",
|
|
159
|
-
preenchido: "preenchido",
|
|
160
|
-
valido: "valido",
|
|
161
|
-
valida: "valido",
|
|
162
|
-
validos: "valido",
|
|
163
|
-
validas: "valido",
|
|
164
|
-
nao_vazia: "nao_vazio",
|
|
165
|
-
nao_vazio: "nao_vazio",
|
|
166
|
-
email_valida: "email_valido",
|
|
167
|
-
email_valido: "email_valido",
|
|
168
|
-
numero_valida: "numero_valido",
|
|
169
|
-
numero_valido: "numero_valido",
|
|
170
|
-
positiva: "positivo",
|
|
171
|
-
positivo: "positivo",
|
|
172
|
-
unico: "unico",
|
|
173
|
-
unica: "unico",
|
|
174
|
-
anterior_a: "anterior_a",
|
|
175
|
-
posterior_a: "posterior_a",
|
|
176
|
-
nao_expirada: "nao_expirado",
|
|
177
|
-
nao_expirado: "nao_expirado",
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
export function normalizarPredicadoSemantico(predicado: string): string {
|
|
181
|
-
const normalizado = predicado.trim().toLowerCase();
|
|
182
|
-
return PREDICADOS_CANONICOS[normalizado] ?? normalizado;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const PRIVILEGIOS_EFEITO = new Set<PrivilegioEfeitoSemantico>([
|
|
186
|
-
"leitura",
|
|
187
|
-
"escrita",
|
|
188
|
-
"publicacao",
|
|
189
|
-
"execucao",
|
|
190
|
-
"admin",
|
|
191
|
-
"egress",
|
|
192
|
-
]);
|
|
193
|
-
|
|
194
|
-
const ISOLAMENTOS_EFEITO = new Set<IsolamentoEfeitoSemantico>([
|
|
195
|
-
"tenant",
|
|
196
|
-
"processo",
|
|
197
|
-
"host",
|
|
198
|
-
"vps",
|
|
199
|
-
"global",
|
|
200
|
-
]);
|
|
201
|
-
|
|
202
|
-
const OPERADORES_COMPARACAO = new Set(["==", "!=", ">", ">=", "<", "<="]);
|
|
203
|
-
|
|
204
|
-
function removerParentesesExternos(texto: string): string {
|
|
205
|
-
let atual = texto.trim();
|
|
206
|
-
while (atual.startsWith("(") && atual.endsWith(")")) {
|
|
207
|
-
let profundidade = 0;
|
|
208
|
-
let removeu = true;
|
|
209
|
-
for (let indice = 0; indice < atual.length; indice += 1) {
|
|
210
|
-
const caractere = atual[indice]!;
|
|
211
|
-
if (caractere === "(") {
|
|
212
|
-
profundidade += 1;
|
|
213
|
-
} else if (caractere === ")") {
|
|
214
|
-
profundidade -= 1;
|
|
215
|
-
if (profundidade === 0 && indice < atual.length - 1) {
|
|
216
|
-
removeu = false;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (!removeu) {
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
atual = atual.slice(1, -1).trim();
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return atual;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function dividirNoNivelRaiz(texto: string, operador: " e " | " ou "): string[] {
|
|
232
|
-
const partes: string[] = [];
|
|
233
|
-
let profundidade = 0;
|
|
234
|
-
let inicio = 0;
|
|
235
|
-
|
|
236
|
-
for (let indice = 0; indice < texto.length; indice += 1) {
|
|
237
|
-
const caractere = texto[indice]!;
|
|
238
|
-
if (caractere === "(") {
|
|
239
|
-
profundidade += 1;
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
if (caractere === ")") {
|
|
243
|
-
profundidade -= 1;
|
|
244
|
-
continue;
|
|
245
|
-
}
|
|
246
|
-
if (profundidade === 0 && texto.slice(indice, indice + operador.length) === operador) {
|
|
247
|
-
partes.push(texto.slice(inicio, indice).trim());
|
|
248
|
-
inicio = indice + operador.length;
|
|
249
|
-
indice += operador.length - 1;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const ultimaParte = texto.slice(inicio).trim();
|
|
254
|
-
if (ultimaParte) {
|
|
255
|
-
partes.push(ultimaParte);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return partes;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
function criarComparacaoDerivada(
|
|
262
|
-
base: ExpressaoComparacaoSemantica,
|
|
263
|
-
valor: string,
|
|
264
|
-
): ExpressaoComparacaoSemantica | undefined {
|
|
265
|
-
const valorNormalizado = removerParentesesExternos(valor.trim());
|
|
266
|
-
if (!valorNormalizado) {
|
|
267
|
-
return undefined;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return {
|
|
271
|
-
tipo: "comparacao",
|
|
272
|
-
textoOriginal: `${base.alvo} ${base.operador} ${valorNormalizado}`,
|
|
273
|
-
alvo: base.alvo,
|
|
274
|
-
operador: base.operador,
|
|
275
|
-
valor: valorNormalizado,
|
|
276
|
-
valorLiteral: ehValorLiteralSemantico(valorNormalizado),
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
export function parsearExpressaoSemantica(texto: string): ExpressaoSemantica | undefined {
|
|
281
|
-
const normalizado = removerParentesesExternos(texto.trim());
|
|
282
|
-
if (!normalizado) {
|
|
283
|
-
return undefined;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const partesOu = dividirNoNivelRaiz(normalizado, " ou ");
|
|
287
|
-
if (partesOu.length > 1) {
|
|
288
|
-
const termos: ExpressaoSemantica[] = [];
|
|
289
|
-
let comparacaoBase: ExpressaoComparacaoSemantica | undefined;
|
|
290
|
-
let usouAtalhoComparacao = false;
|
|
291
|
-
|
|
292
|
-
for (const parte of partesOu) {
|
|
293
|
-
const termo = parsearExpressaoSemantica(parte);
|
|
294
|
-
if (termo) {
|
|
295
|
-
termos.push(termo);
|
|
296
|
-
if (termo.tipo === "comparacao" && (termo.operador === "==" || termo.operador === "!=")) {
|
|
297
|
-
comparacaoBase = termo;
|
|
298
|
-
}
|
|
299
|
-
continue;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
if (comparacaoBase) {
|
|
303
|
-
const derivada = criarComparacaoDerivada(comparacaoBase, parte);
|
|
304
|
-
if (derivada) {
|
|
305
|
-
comparacaoBase.valorLiteral = true;
|
|
306
|
-
usouAtalhoComparacao = true;
|
|
307
|
-
termos.push(derivada);
|
|
308
|
-
continue;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
return undefined;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (usouAtalhoComparacao) {
|
|
316
|
-
for (const termo of termos) {
|
|
317
|
-
if (termo.tipo === "comparacao" && termo.alvo === comparacaoBase?.alvo && termo.operador === comparacaoBase?.operador) {
|
|
318
|
-
termo.valorLiteral = true;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return { tipo: "composta", textoOriginal: normalizado, operadorLogico: "ou", termos };
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const partesE = dividirNoNivelRaiz(normalizado, " e ");
|
|
327
|
-
if (partesE.length > 1) {
|
|
328
|
-
const termos = partesE.map((parte) => parsearExpressaoSemantica(parte)).filter((parte): parte is ExpressaoSemantica => Boolean(parte));
|
|
329
|
-
return termos.length === partesE.length
|
|
330
|
-
? { tipo: "composta", textoOriginal: normalizado, operadorLogico: "e", termos }
|
|
331
|
-
: undefined;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (normalizado.startsWith("nao ")) {
|
|
335
|
-
const termo = parsearExpressaoSemantica(normalizado.slice("nao ".length).trim());
|
|
336
|
-
return termo
|
|
337
|
-
? { tipo: "negacao", textoOriginal: normalizado, termo }
|
|
338
|
-
: undefined;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
const correspondenciaMarcador = normalizado.match(/^(persistencia|estado|sucesso)\s+([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
342
|
-
if (correspondenciaMarcador) {
|
|
343
|
-
const predicado = correspondenciaMarcador[2]!;
|
|
344
|
-
return {
|
|
345
|
-
tipo: "predicado",
|
|
346
|
-
textoOriginal: normalizado,
|
|
347
|
-
alvo: correspondenciaMarcador[1]!,
|
|
348
|
-
predicado,
|
|
349
|
-
predicadoCanonico: normalizarPredicadoSemantico(predicado),
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
const correspondenciaExiste = normalizado.match(/^([A-Za-z_][A-Za-z0-9_.]*)\s+existe$/);
|
|
354
|
-
if (correspondenciaExiste) {
|
|
355
|
-
return {
|
|
356
|
-
tipo: "existe",
|
|
357
|
-
textoOriginal: normalizado,
|
|
358
|
-
alvo: correspondenciaExiste[1]!,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const correspondenciaPredicado = normalizado.match(/^([A-Za-z_][A-Za-z0-9_.]*)\s+deve_ser\s+([A-Za-z_][A-Za-z0-9_]*)(?:\s+(.+))?$/);
|
|
363
|
-
if (correspondenciaPredicado) {
|
|
364
|
-
const predicado = correspondenciaPredicado[2]!;
|
|
365
|
-
return {
|
|
366
|
-
tipo: "predicado",
|
|
367
|
-
textoOriginal: normalizado,
|
|
368
|
-
alvo: correspondenciaPredicado[1]!,
|
|
369
|
-
predicado,
|
|
370
|
-
predicadoCanonico: normalizarPredicadoSemantico(predicado),
|
|
371
|
-
argumentos: correspondenciaPredicado[3]?.trim(),
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const correspondenciaPertencimento = normalizado.match(/^([A-Za-z_][A-Za-z0-9_.]*)\s+em\s+\[(.+)\]$/);
|
|
376
|
-
if (correspondenciaPertencimento) {
|
|
377
|
-
const valores = correspondenciaPertencimento[2]!
|
|
378
|
-
.split(",")
|
|
379
|
-
.map((valor) => valor.trim())
|
|
380
|
-
.filter(Boolean);
|
|
381
|
-
if (valores.length === 0) {
|
|
382
|
-
return undefined;
|
|
383
|
-
}
|
|
384
|
-
return {
|
|
385
|
-
tipo: "pertencimento",
|
|
386
|
-
textoOriginal: normalizado,
|
|
387
|
-
alvo: correspondenciaPertencimento[1]!,
|
|
388
|
-
valores,
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
const partes = normalizado.split(/\s+/).filter(Boolean);
|
|
393
|
-
if (partes.length >= 3 && OPERADORES_COMPARACAO.has(partes[1]!)) {
|
|
394
|
-
const valorComparacao = partes.slice(2).join(" ");
|
|
395
|
-
return {
|
|
396
|
-
tipo: "comparacao",
|
|
397
|
-
textoOriginal: normalizado,
|
|
398
|
-
alvo: partes[0]!,
|
|
399
|
-
operador: partes[1] as ExpressaoComparacaoSemantica["operador"],
|
|
400
|
-
valor: valorComparacao,
|
|
401
|
-
valorLiteral: ehValorLiteralSemantico(valorComparacao),
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
return undefined;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
export function parsearEfeitoSemantico(texto: string): EfeitoSemantico | undefined {
|
|
409
|
-
const normalizado = texto.trim();
|
|
410
|
-
if (!normalizado) {
|
|
411
|
-
return undefined;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
const partes = normalizado.split(/\s+/).filter(Boolean);
|
|
415
|
-
if (partes.length < 2) {
|
|
416
|
-
return undefined;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
const partesSemCriticidade = [...partes];
|
|
420
|
-
let criticidadeTexto: string | undefined;
|
|
421
|
-
let privilegioTexto: string | undefined;
|
|
422
|
-
let isolamentoTexto: string | undefined;
|
|
423
|
-
|
|
424
|
-
const extrairQualificador = (nome: string): string | undefined => {
|
|
425
|
-
const indiceInline = partesSemCriticidade.findIndex((parte) => parte.startsWith(`${nome}=`));
|
|
426
|
-
if (indiceInline !== -1) {
|
|
427
|
-
const valor = partesSemCriticidade[indiceInline]!.slice(`${nome}=`.length).trim();
|
|
428
|
-
partesSemCriticidade.splice(indiceInline, 1);
|
|
429
|
-
return valor;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
const indiceSeparado = partesSemCriticidade.findIndex((parte) => parte === nome);
|
|
433
|
-
if (
|
|
434
|
-
indiceSeparado !== -1
|
|
435
|
-
&& partesSemCriticidade[indiceSeparado + 1] === "="
|
|
436
|
-
&& partesSemCriticidade[indiceSeparado + 2]
|
|
437
|
-
) {
|
|
438
|
-
const valor = partesSemCriticidade[indiceSeparado + 2]!.trim();
|
|
439
|
-
partesSemCriticidade.splice(indiceSeparado, 3);
|
|
440
|
-
return valor;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
return undefined;
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
criticidadeTexto = extrairQualificador("criticidade");
|
|
447
|
-
privilegioTexto = extrairQualificador("privilegio");
|
|
448
|
-
isolamentoTexto = extrairQualificador("isolamento");
|
|
449
|
-
|
|
450
|
-
if (partesSemCriticidade.length < 2) {
|
|
451
|
-
return undefined;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
const categoriaNormalizada = partesSemCriticidade[0] as CategoriaEfeitoSemantico;
|
|
455
|
-
const criticidade = criticidadeTexto && CRITICIDADES_EFEITO.has(criticidadeTexto as CriticidadeEfeitoSemantico)
|
|
456
|
-
? criticidadeTexto as CriticidadeEfeitoSemantico
|
|
457
|
-
: undefined;
|
|
458
|
-
const privilegio = privilegioTexto && PRIVILEGIOS_EFEITO.has(privilegioTexto as PrivilegioEfeitoSemantico)
|
|
459
|
-
? privilegioTexto as PrivilegioEfeitoSemantico
|
|
460
|
-
: undefined;
|
|
461
|
-
const isolamento = isolamentoTexto && ISOLAMENTOS_EFEITO.has(isolamentoTexto as IsolamentoEfeitoSemantico)
|
|
462
|
-
? isolamentoTexto as IsolamentoEfeitoSemantico
|
|
463
|
-
: undefined;
|
|
464
|
-
if (CATEGORIAS_EFEITO.has(categoriaNormalizada)) {
|
|
465
|
-
return {
|
|
466
|
-
textoOriginal: normalizado,
|
|
467
|
-
categoria: categoriaNormalizada,
|
|
468
|
-
alvo: partesSemCriticidade[1]!,
|
|
469
|
-
detalhe: partesSemCriticidade.slice(2).join(" ").trim() || undefined,
|
|
470
|
-
criticidade,
|
|
471
|
-
criticidadeTexto,
|
|
472
|
-
privilegio,
|
|
473
|
-
privilegioTexto,
|
|
474
|
-
isolamento,
|
|
475
|
-
isolamentoTexto,
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
const categoriaLegada = MAPEAMENTO_EFEITOS_LEGADOS[partesSemCriticidade[0]!.toLowerCase()];
|
|
480
|
-
if (categoriaLegada) {
|
|
481
|
-
return {
|
|
482
|
-
textoOriginal: normalizado,
|
|
483
|
-
categoria: categoriaLegada,
|
|
484
|
-
alvo: partesSemCriticidade[1]!,
|
|
485
|
-
detalhe: partesSemCriticidade.slice(2).join(" ").trim() || undefined,
|
|
486
|
-
criticidade,
|
|
487
|
-
criticidadeTexto,
|
|
488
|
-
privilegio,
|
|
489
|
-
privilegioTexto,
|
|
490
|
-
isolamento,
|
|
491
|
-
isolamentoTexto,
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return {
|
|
496
|
-
textoOriginal: normalizado,
|
|
497
|
-
categoria: partesSemCriticidade[0]! as CategoriaEfeitoSemantico,
|
|
498
|
-
alvo: partesSemCriticidade[1]!,
|
|
499
|
-
detalhe: partesSemCriticidade.slice(2).join(" ").trim() || undefined,
|
|
500
|
-
criticidade,
|
|
501
|
-
criticidadeTexto,
|
|
502
|
-
privilegio,
|
|
503
|
-
privilegioTexto,
|
|
504
|
-
isolamento,
|
|
505
|
-
isolamentoTexto,
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
export function parsearTransicaoEstado(texto: string): TransicaoEstadoSemantica | undefined {
|
|
510
|
-
const normalizado = texto.trim();
|
|
511
|
-
if (!normalizado) {
|
|
512
|
-
return undefined;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
const correspondencia = normalizado.match(/^([A-Za-z_][A-Za-z0-9_.]*)\s*->\s*([A-Za-z_][A-Za-z0-9_.]*)$/);
|
|
516
|
-
if (!correspondencia) {
|
|
517
|
-
return undefined;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
return {
|
|
521
|
-
textoOriginal: normalizado,
|
|
522
|
-
origem: correspondencia[1]!,
|
|
523
|
-
destino: correspondencia[2]!,
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
export function parsearEtapaFlow(texto: string): EtapaFlowSemantica | undefined {
|
|
528
|
-
const normalizado = texto.trim();
|
|
529
|
-
if (!normalizado.startsWith("etapa ")) {
|
|
530
|
-
return undefined;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
const semPrefixo = normalizado.slice("etapa ".length).trim();
|
|
534
|
-
const nome = semPrefixo.split(/\s+/)[0];
|
|
535
|
-
if (!nome) {
|
|
536
|
-
return undefined;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
const resto = semPrefixo.slice(nome.length).trim();
|
|
540
|
-
const task = resto.match(/\busa\s+([A-Za-z_][A-Za-z0-9_.]*)/)?.[1];
|
|
541
|
-
const comTexto = resto.match(/\bcom\s+(.+?)(?=\s+(quando|depende_de|em_sucesso|em_erro|por_erro)\b|$)/)?.[1];
|
|
542
|
-
const dependenciasTexto = resto.match(/\bdepende_de\s+(.+?)(?=\s+(quando|com|em_sucesso|em_erro|por_erro)\b|$)/)?.[1];
|
|
543
|
-
const dependencias = dependenciasTexto
|
|
544
|
-
? dependenciasTexto.split(",").map((parte) => parte.trim()).filter(Boolean)
|
|
545
|
-
: [];
|
|
546
|
-
const emSucesso = resto.match(/\bem_sucesso\s+([A-Za-z_][A-Za-z0-9_]*)/)?.[1];
|
|
547
|
-
const emErro = resto.match(/\bem_erro\s+([A-Za-z_][A-Za-z0-9_]*)/)?.[1];
|
|
548
|
-
const porErroTexto = resto.match(/\bpor_erro\s+(.+?)(?=\s+(quando|depende_de|em_sucesso|em_erro)\b|$)/)?.[1];
|
|
549
|
-
const mapeamentos = (comTexto
|
|
550
|
-
? comTexto.split(",").map((parte) => parte.trim()).filter(Boolean)
|
|
551
|
-
: [])
|
|
552
|
-
.map((parte) => {
|
|
553
|
-
const [campo, ...restoValor] = parte.split("=");
|
|
554
|
-
return {
|
|
555
|
-
campo: campo?.trim() ?? "",
|
|
556
|
-
valor: restoValor.join("=").trim(),
|
|
557
|
-
};
|
|
558
|
-
})
|
|
559
|
-
.filter((item) => item.campo && item.valor);
|
|
560
|
-
const porErro = (porErroTexto
|
|
561
|
-
? porErroTexto.split(",").map((parte) => parte.trim()).filter(Boolean)
|
|
562
|
-
: [])
|
|
563
|
-
.map((parte) => {
|
|
564
|
-
const [tipo, ...restoDestino] = parte.split("=");
|
|
565
|
-
return {
|
|
566
|
-
tipo: tipo?.trim() ?? "",
|
|
567
|
-
destino: restoDestino.join("=").trim(),
|
|
568
|
-
};
|
|
569
|
-
})
|
|
570
|
-
.filter((item) => item.tipo && item.destino);
|
|
571
|
-
|
|
572
|
-
const indiceQuando = resto.indexOf(" quando ");
|
|
573
|
-
const indicesTerminoCondicao = [
|
|
574
|
-
resto.indexOf(" depende_de "),
|
|
575
|
-
resto.indexOf(" em_sucesso "),
|
|
576
|
-
resto.indexOf(" em_erro "),
|
|
577
|
-
resto.indexOf(" por_erro "),
|
|
578
|
-
].filter((indice) => indice !== -1 && indice > indiceQuando);
|
|
579
|
-
let condicao: ExpressaoSemantica | undefined;
|
|
580
|
-
if (indiceQuando !== -1) {
|
|
581
|
-
const fimCondicao = indicesTerminoCondicao.length > 0 ? Math.min(...indicesTerminoCondicao) : resto.length;
|
|
582
|
-
const textoCondicao = resto.slice(indiceQuando + " quando ".length, fimCondicao).trim();
|
|
583
|
-
condicao = parsearExpressaoSemantica(textoCondicao);
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
return {
|
|
587
|
-
textoOriginal: normalizado,
|
|
588
|
-
nome,
|
|
589
|
-
task,
|
|
590
|
-
condicao,
|
|
591
|
-
dependencias,
|
|
592
|
-
mapeamentos,
|
|
593
|
-
emSucesso,
|
|
594
|
-
emErro,
|
|
595
|
-
porErro,
|
|
596
|
-
};
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
export function extrairReferenciasDaExpressao(expressao: ExpressaoSemantica): string[] {
|
|
600
|
-
if (expressao.tipo === "composta") {
|
|
601
|
-
return expressao.termos.flatMap(extrairReferenciasDaExpressao);
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
if (expressao.tipo === "negacao") {
|
|
605
|
-
return extrairReferenciasDaExpressao(expressao.termo);
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
const referencias = [expressao.alvo];
|
|
609
|
-
|
|
610
|
-
if (
|
|
611
|
-
expressao.tipo === "comparacao"
|
|
612
|
-
&& expressao.valor
|
|
613
|
-
&& !expressao.valorLiteral
|
|
614
|
-
&& pareceReferenciaSemantica(expressao.valor)
|
|
615
|
-
) {
|
|
616
|
-
referencias.push(expressao.valor);
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
return referencias;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
export function pareceReferenciaSemantica(valor: string): boolean {
|
|
623
|
-
const normalizado = valor.trim();
|
|
624
|
-
if (!normalizado) {
|
|
625
|
-
return false;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
if (ehValorLiteralSemantico(normalizado)) {
|
|
629
|
-
return false;
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
return /^[A-Za-z_][A-Za-z0-9_.]*$/.test(normalizado);
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
function ehValorLiteralSemantico(valor: string): boolean {
|
|
636
|
-
const normalizado = valor.trim();
|
|
637
|
-
if (!normalizado) {
|
|
638
|
-
return false;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
if (
|
|
642
|
-
(normalizado.startsWith("\"") && normalizado.endsWith("\""))
|
|
643
|
-
|| (normalizado.startsWith("'") && normalizado.endsWith("'"))
|
|
644
|
-
) {
|
|
645
|
-
return true;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
if (/^-?\d+(?:\.\d+)?$/.test(normalizado)) {
|
|
649
|
-
return true;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
if (["verdadeiro", "falso", "nulo"].includes(normalizado)) {
|
|
653
|
-
return true;
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
return /^[A-Z][A-Z0-9_]*$/.test(normalizado);
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
export function ehCategoriaEfeitoSemantico(valor: string): valor is CategoriaEfeitoSemantico {
|
|
660
|
-
return CATEGORIAS_EFEITO.has(valor as CategoriaEfeitoSemantico);
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
export function ehCriticidadeEfeitoSemantico(valor: string): valor is CriticidadeEfeitoSemantico {
|
|
664
|
-
return CRITICIDADES_EFEITO.has(valor as CriticidadeEfeitoSemantico);
|
|
665
|
-
}
|