@semacode/cli 1.5.11 → 1.5.16

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 (177) hide show
  1. package/README.md +6 -1
  2. package/dist/index.js +446 -32
  3. package/package.json +23 -32
  4. package/semacode-cli-1.3.1.tgz +0 -0
  5. package/src/angular-consumer-standalone.ts +312 -0
  6. package/src/cpp-symbols.ts +82 -0
  7. package/src/docs.ts +535 -0
  8. package/src/dotnet-http.ts +355 -0
  9. package/src/drift.ts +4933 -0
  10. package/src/go-http.ts +118 -0
  11. package/src/importador.ts +3891 -0
  12. package/src/index.ts +5641 -0
  13. package/src/java-http.ts +247 -0
  14. package/src/lua-symbols.ts +114 -0
  15. package/src/php-symbols.ts +462 -0
  16. package/src/projeto.ts +862 -0
  17. package/src/python-http.ts +258 -0
  18. package/src/rust-http.ts +125 -0
  19. package/src/tipos.ts +24 -0
  20. package/src/typescript-http.ts +1076 -0
  21. package/tsconfig.json +20 -0
  22. package/AGENTS.md +0 -272
  23. package/LICENSE +0 -22
  24. package/SEMA_BRIEF.curto.txt +0 -9
  25. package/SEMA_BRIEF.md +0 -63
  26. package/SEMA_BRIEF.micro.txt +0 -7
  27. package/SEMA_INDEX.json +0 -799
  28. package/dist/angular-consumer-standalone.d.ts +0 -6
  29. package/dist/angular-consumer-standalone.js.map +0 -1
  30. package/dist/cpp-symbols.d.ts +0 -10
  31. package/dist/cpp-symbols.js.map +0 -1
  32. package/dist/docs.d.ts +0 -56
  33. package/dist/docs.js.map +0 -1
  34. package/dist/dotnet-http.d.ts +0 -23
  35. package/dist/dotnet-http.js.map +0 -1
  36. package/dist/drift.d.ts +0 -225
  37. package/dist/drift.js.map +0 -1
  38. package/dist/go-http.d.ts +0 -23
  39. package/dist/go-http.js.map +0 -1
  40. package/dist/importador.d.ts +0 -31
  41. package/dist/importador.js.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/java-http.d.ts +0 -23
  45. package/dist/java-http.js.map +0 -1
  46. package/dist/lua-symbols.d.ts +0 -10
  47. package/dist/lua-symbols.js.map +0 -1
  48. package/dist/php-symbols.d.ts +0 -24
  49. package/dist/php-symbols.js.map +0 -1
  50. package/dist/projeto.d.ts +0 -53
  51. package/dist/projeto.js.map +0 -1
  52. package/dist/python-http.d.ts +0 -23
  53. package/dist/python-http.js.map +0 -1
  54. package/dist/rust-http.d.ts +0 -23
  55. package/dist/rust-http.js.map +0 -1
  56. package/dist/tipos.d.ts +0 -3
  57. package/dist/tipos.js.map +0 -1
  58. package/dist/typescript-http.d.ts +0 -35
  59. package/dist/typescript-http.js.map +0 -1
  60. package/docs/AGENT_STARTER.md +0 -102
  61. package/docs/cli.md +0 -110
  62. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  63. package/docs/deploy.md +0 -70
  64. package/docs/documentacao.md +0 -63
  65. package/docs/env.md +0 -56
  66. package/docs/extensao-vscode.md +0 -45
  67. package/docs/fluxo-pratico-ia-sema.md +0 -177
  68. package/docs/instalacao-e-primeiro-uso.md +0 -112
  69. package/docs/integracao-com-ia.md +0 -101
  70. package/docs/mcp.md +0 -53
  71. package/docs/pagamento-ponta-a-ponta.md +0 -155
  72. package/docs/persistencia-vendor-first.md +0 -145
  73. package/docs/prompt-base-ia-sema.md +0 -104
  74. package/docs/rollback.md +0 -47
  75. package/docs/sintaxe.md +0 -244
  76. package/exemplos/agendamento.sema +0 -106
  77. package/exemplos/assinatura.sema +0 -136
  78. package/exemplos/auditoria.sema +0 -88
  79. package/exemplos/autenticacao.sema +0 -125
  80. package/exemplos/automacao.sema +0 -107
  81. package/exemplos/cadastro_usuario.sema +0 -54
  82. package/exemplos/calculadora.sema +0 -78
  83. package/exemplos/crud_simples.sema +0 -89
  84. package/exemplos/estoque.sema +0 -126
  85. package/exemplos/exportacao.sema +0 -94
  86. package/exemplos/fila.sema +0 -131
  87. package/exemplos/integracao_externa.sema +0 -94
  88. package/exemplos/multi_tenant.sema +0 -140
  89. package/exemplos/notificacao.sema +0 -98
  90. package/exemplos/operacao_estrategia.sema +0 -402
  91. package/exemplos/pagamento.sema +0 -222
  92. package/exemplos/pagamento_dominio.sema +0 -35
  93. package/exemplos/pedido.sema +0 -119
  94. package/exemplos/permissao.sema +0 -121
  95. package/exemplos/persistencia_vendor_first.sema +0 -86
  96. package/exemplos/relatorio.sema +0 -93
  97. package/exemplos/testes_embutidos.sema +0 -45
  98. package/exemplos/tratamento_erro.sema +0 -157
  99. package/exemplos/upload_arquivo.sema +0 -93
  100. package/exemplos/webhook.sema +0 -96
  101. package/llms-full.txt +0 -34
  102. package/llms.txt +0 -17
  103. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  104. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  105. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  106. package/node_modules/@sema/gerador-css/package.json +0 -7
  107. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  108. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  109. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  110. package/node_modules/@sema/gerador-dart/package.json +0 -7
  111. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  112. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  113. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  114. package/node_modules/@sema/gerador-html/package.json +0 -7
  115. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  116. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  117. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  118. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  119. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  120. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  121. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  122. package/node_modules/@sema/gerador-lua/package.json +0 -7
  123. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  124. package/node_modules/@sema/gerador-python/dist/index.js +0 -729
  125. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  126. package/node_modules/@sema/gerador-python/package.json +0 -7
  127. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  128. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
  129. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  130. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  131. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -123
  132. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  133. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  134. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  135. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  136. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  137. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  138. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -460
  139. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  140. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
  141. package/node_modules/@sema/nucleo/dist/index.js +0 -96
  142. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  143. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  144. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -883
  145. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  146. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -345
  147. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  148. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  149. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  150. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  151. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  152. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  153. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -61
  154. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  155. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  156. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -771
  157. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  158. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
  159. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
  160. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  161. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1617
  163. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  164. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  165. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  166. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  167. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  168. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  169. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  170. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  171. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  172. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  173. package/node_modules/@sema/nucleo/package.json +0 -7
  174. package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
  175. package/node_modules/@sema/padroes/dist/index.js +0 -316
  176. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  177. package/node_modules/@sema/padroes/package.json +0 -7
@@ -1,131 +0,0 @@
1
- module exemplos.fila {
2
- docs {
3
- resumo: "Processamento de jobs em fila com retentativa e dead letter."
4
- }
5
-
6
- entity Job {
7
- fields {
8
- id: Id
9
- tipo: Texto
10
- payload: Objeto
11
- status: Texto
12
- tentativas: Inteiro
13
- max_tentativas: Inteiro
14
- agendado_para: Timestamp
15
- processado_em: Timestamp
16
- erro: Texto
17
- }
18
- }
19
-
20
- task enfileirar_job {
21
- input {
22
- tipo: Texto required
23
- payload: Objeto required
24
- agendado_para: Timestamp
25
- max_tentativas: Inteiro
26
- }
27
- output {
28
- job_id: Id
29
- }
30
- rules {
31
- tipo deve_ser preenchido
32
- max_tentativas <= 10
33
- }
34
- effects {
35
- persistencia Job
36
- evento job_enfileirado criticidade = baixa
37
- auditoria enfileiramento_job
38
- }
39
- state ciclo_job {
40
- transitions {
41
- CRIADO -> PENDENTE
42
- }
43
- }
44
- guarantees {
45
- job_id existe
46
- }
47
- error {
48
- tipo_invalido: "Tipo de job nao registrado."
49
- fila_cheia: "Fila atingiu capacidade maxima."
50
- }
51
- tests {
52
- caso "enfileira job valido" {
53
- given { tipo: "envio_email" payload: {destinatario: "a@b.com"} }
54
- expect { sucesso: verdadeiro }
55
- }
56
- }
57
- }
58
-
59
- task processar_job {
60
- input {
61
- job_id: Id required
62
- }
63
- output {
64
- resultado: Objeto
65
- }
66
- rules {
67
- job_id deve_ser valido
68
- job.status == PENDENTE
69
- }
70
- effects {
71
- persistencia Job
72
- evento job_processado criticidade = baixa
73
- auditoria processamento_job
74
- }
75
- state ciclo_job {
76
- transitions {
77
- PENDENTE -> EM_EXECUCAO
78
- EM_EXECUCAO -> CONCLUIDO
79
- EM_EXECUCAO -> FALHOU
80
- }
81
- }
82
- guarantees {
83
- resultado existe
84
- }
85
- error {
86
- job_nao_encontrado: "Job nao localizado na fila."
87
- job_ja_processado: "Este job ja foi executado."
88
- execucao_falhou: "Falha durante a execucao do job."
89
- }
90
- tests {
91
- caso "processa job pendente" {
92
- given { job_id: "job_1" }
93
- expect { sucesso: verdadeiro }
94
- }
95
- }
96
- }
97
-
98
- task mover_para_dead_letter {
99
- input {
100
- job_id: Id required
101
- motivo: Texto required
102
- }
103
- output {
104
- protocolo: Id
105
- }
106
- rules {
107
- job_id deve_ser valido
108
- job.tentativas >= job.max_tentativas
109
- }
110
- effects {
111
- persistencia Job
112
- evento job_dead_letter criticidade = alta
113
- notificacao operacao falha_critica_job criticidade = alta
114
- auditoria dead_letter criticidade = alta
115
- }
116
- state ciclo_job {
117
- transitions {
118
- FALHOU -> DEAD_LETTER
119
- }
120
- }
121
- guarantees {
122
- protocolo existe
123
- }
124
- tests {
125
- caso "move job esgotado" {
126
- given { job_id: "job_esgotado" motivo: "Timeout repetido" }
127
- expect { sucesso: verdadeiro }
128
- }
129
- }
130
- }
131
- }
@@ -1,94 +0,0 @@
1
- module exemplos.integracao.externa {
2
- docs {
3
- resumo: "Integracao com API externa com circuit breaker e fallback."
4
- }
5
-
6
- entity ChamadaExterna {
7
- fields {
8
- id: Id
9
- servico: Texto
10
- endpoint: Texto
11
- metodo: Texto
12
- status_http: Inteiro
13
- duracao_ms: Inteiro
14
- sucesso: Booleano
15
- realizada_em: Timestamp
16
- }
17
- }
18
-
19
- task consultar_cep {
20
- input {
21
- cep: Texto required
22
- }
23
- output {
24
- logradouro: Texto
25
- bairro: Texto
26
- cidade: Texto
27
- estado: Texto
28
- }
29
- rules {
30
- cep deve_ser formato_cep_valido
31
- }
32
- effects {
33
- consulta api_cep criticidade = media
34
- persistencia ChamadaExterna
35
- auditoria consulta_cep
36
- }
37
- guarantees {
38
- logradouro existe
39
- cidade existe
40
- estado existe
41
- }
42
- error {
43
- cep_nao_encontrado: "CEP nao localizado."
44
- servico_indisponivel: "API de CEP temporariamente indisponivel."
45
- formato_invalido: "CEP deve ter 8 digitos numericos."
46
- }
47
- tests {
48
- caso "consulta cep valido" {
49
- given { cep: "01310100" }
50
- expect { sucesso: verdadeiro }
51
- }
52
- caso "rejeita cep invalido" {
53
- given { cep: "00000000" }
54
- expect { sucesso: falso }
55
- error { tipo: "cep_nao_encontrado" }
56
- }
57
- }
58
- }
59
-
60
- task consultar_cnpj {
61
- input {
62
- cnpj: Texto required
63
- }
64
- output {
65
- razao_social: Texto
66
- situacao: Texto
67
- atividade_principal: Texto
68
- }
69
- rules {
70
- cnpj deve_ser formato_cnpj_valido
71
- cnpj deve_ser digitos_validos
72
- }
73
- effects {
74
- consulta api_receita criticidade = media
75
- persistencia ChamadaExterna
76
- auditoria consulta_cnpj
77
- }
78
- guarantees {
79
- razao_social existe
80
- situacao existe
81
- }
82
- error {
83
- cnpj_nao_encontrado: "CNPJ nao localizado na Receita Federal."
84
- servico_indisponivel: "Servico da Receita Federal indisponivel."
85
- formato_invalido: "CNPJ invalido."
86
- }
87
- tests {
88
- caso "consulta cnpj valido" {
89
- given { cnpj: "11222333000181" }
90
- expect { sucesso: verdadeiro }
91
- }
92
- }
93
- }
94
- }
@@ -1,140 +0,0 @@
1
- module exemplos.multi.tenant {
2
- docs {
3
- resumo: "Isolamento de dados por tenant com provisionamento e controle de limites."
4
- }
5
-
6
- entity Tenant {
7
- fields {
8
- id: Id
9
- nome: Texto
10
- slug: Texto
11
- plano: Texto
12
- ativo: Booleano
13
- criado_em: Timestamp
14
- }
15
- }
16
-
17
- entity LimiteTenant {
18
- fields {
19
- tenant_id: Id
20
- recurso: Texto
21
- limite: Inteiro
22
- utilizado: Inteiro
23
- }
24
- }
25
-
26
- task provisionar_tenant {
27
- input {
28
- nome: Texto required
29
- slug: Texto required
30
- plano: Texto required
31
- email_admin: Email required
32
- }
33
- output {
34
- tenant: Tenant
35
- }
36
- rules {
37
- slug deve_ser unico em Tenant.slug
38
- slug deve_ser formato_slug_valido
39
- plano em [FREE, PRO, ENTERPRISE]
40
- email_admin deve_ser email_valido
41
- }
42
- effects {
43
- persistencia Tenant
44
- persistencia LimiteTenant
45
- persistencia Usuario
46
- evento tenant_provisionado criticidade = alta
47
- notificacao admin boas_vindas criticidade = media
48
- auditoria provisionamento_tenant criticidade = alta
49
- }
50
- guarantees {
51
- tenant existe
52
- tenant.ativo == verdadeiro
53
- }
54
- error {
55
- slug_duplicado: "Este slug ja esta em uso."
56
- plano_invalido: "Plano selecionado nao existe."
57
- email_invalido: "Email do administrador invalido."
58
- }
59
- tests {
60
- caso "provisiona tenant pro" {
61
- given { nome: "Empresa X" slug: "empresa-x" plano: "PRO" email_admin: "admin@x.com" }
62
- expect { sucesso: verdadeiro }
63
- }
64
- }
65
- }
66
-
67
- task verificar_limite {
68
- input {
69
- tenant_id: Id required
70
- recurso: Texto required
71
- quantidade: Inteiro required
72
- }
73
- output {
74
- permitido: Booleano
75
- utilizado: Inteiro
76
- limite: Inteiro
77
- }
78
- rules {
79
- tenant_id deve_ser valido
80
- recurso deve_ser preenchido
81
- quantidade > 0
82
- }
83
- effects {
84
- consulta LimiteTenant por tenant_id e recurso
85
- auditoria verificacao_limite
86
- }
87
- guarantees {
88
- permitido existe
89
- }
90
- error {
91
- tenant_nao_encontrado: "Tenant nao localizado."
92
- recurso_desconhecido: "Recurso nao rastreado para este tenant."
93
- }
94
- tests {
95
- caso "dentro do limite" {
96
- given { tenant_id: "ten_1" recurso: "usuarios" quantidade: 5 }
97
- expect { sucesso: verdadeiro }
98
- }
99
- }
100
- }
101
-
102
- task suspender_tenant {
103
- input {
104
- tenant_id: Id required
105
- motivo: Texto required
106
- }
107
- output {
108
- protocolo: Id
109
- }
110
- rules {
111
- tenant_id deve_ser valido
112
- motivo deve_ser preenchido
113
- tenant.ativo == verdadeiro
114
- }
115
- effects {
116
- persistencia Tenant
117
- evento tenant_suspenso criticidade = alta
118
- notificacao admin suspensao_tenant criticidade = alta
119
- auditoria suspensao_tenant criticidade = alta
120
- }
121
- state ciclo_tenant {
122
- transitions {
123
- ATIVO -> SUSPENSO
124
- }
125
- }
126
- guarantees {
127
- protocolo existe
128
- tenant.ativo == falso
129
- }
130
- error {
131
- tenant_ja_suspenso: "Tenant ja esta suspenso."
132
- }
133
- tests {
134
- caso "suspende tenant ativo" {
135
- given { tenant_id: "ten_1" motivo: "Inadimplencia" }
136
- expect { sucesso: verdadeiro }
137
- }
138
- }
139
- }
140
- }
@@ -1,98 +0,0 @@
1
- module exemplos.notificacao {
2
- docs {
3
- resumo: "Envio de notificacoes por email, SMS e push com rastreamento."
4
- }
5
-
6
- entity Notificacao {
7
- fields {
8
- id: Id
9
- destinatario_id: Id
10
- canal: Texto
11
- titulo: Texto
12
- corpo: Texto
13
- status: Texto
14
- enviada_em: Timestamp
15
- }
16
- }
17
-
18
- task enviar_email {
19
- input {
20
- destinatario: Email required
21
- titulo: Texto required
22
- corpo: Texto required
23
- template: Texto
24
- }
25
- output {
26
- notificacao_id: Id
27
- }
28
- rules {
29
- destinatario deve_ser email_valido
30
- titulo deve_ser preenchido
31
- corpo deve_ser preenchido
32
- }
33
- effects {
34
- consulta provedor_email criticidade = alta
35
- persistencia Notificacao
36
- auditoria email_enviado
37
- }
38
- guarantees {
39
- notificacao_id existe
40
- }
41
- error {
42
- destinatario_invalido: "Endereco de email invalido."
43
- provedor_indisponivel: "Servico de email temporariamente indisponivel."
44
- limite_excedido: "Limite de envios por hora atingido."
45
- }
46
- tests {
47
- caso "envia email valido" {
48
- given { destinatario: "user@app.com" titulo: "Bem vindo" corpo: "Ola!" }
49
- expect { sucesso: verdadeiro }
50
- }
51
- }
52
- }
53
-
54
- task enviar_push {
55
- input {
56
- device_token: Texto required
57
- titulo: Texto required
58
- corpo: Texto required
59
- dados: Objeto
60
- }
61
- output {
62
- notificacao_id: Id
63
- }
64
- rules {
65
- device_token deve_ser preenchido
66
- titulo deve_ser preenchido
67
- }
68
- effects {
69
- consulta provedor_push criticidade = media
70
- persistencia Notificacao
71
- auditoria push_enviado
72
- }
73
- guarantees {
74
- notificacao_id existe
75
- }
76
- error {
77
- token_invalido: "Token de dispositivo invalido ou expirado."
78
- provedor_indisponivel: "Servico push indisponivel."
79
- }
80
- tests {
81
- caso "envia push valido" {
82
- given { device_token: "tok_123" titulo: "Alerta" corpo: "Nova mensagem" }
83
- expect { sucesso: verdadeiro }
84
- }
85
- }
86
- }
87
-
88
- flow notificar_multicanal {
89
- destinatario_id: Id
90
- titulo: Texto
91
- corpo: Texto
92
- etapa email usa enviar_email com destinatario = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_email
93
- etapa push usa enviar_push com device_token = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_push
94
- etapa registrar_falha_email usa registrar_falha_notificacao com canal = "email" depende_de email
95
- etapa registrar_falha_push usa registrar_falha_notificacao com canal = "push" depende_de push
96
- etapa concluir usa confirmar_notificacao com destinatario_id = destinatario_id depende_de email
97
- }
98
- }