pgbus 0.19.4 → 0.20.1

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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +97 -7
  4. data/Rakefile +6 -1
  5. data/app/controllers/pgbus/dashboard_controller.rb +2 -0
  6. data/app/controllers/pgbus/workflow_definitions_controller.rb +28 -0
  7. data/app/controllers/pgbus/workflows_controller.rb +197 -0
  8. data/app/frontend/pgbus/modules/charts.js +148 -4
  9. data/app/frontend/pgbus/modules/charts.min.js +1 -1
  10. data/app/frontend/pgbus/modules/charts.min.js.map +1 -1
  11. data/app/frontend/pgbus/style.css +1 -1
  12. data/app/helpers/pgbus/button_helper.rb +4 -2
  13. data/app/helpers/pgbus/workflow_insights_helper.rb +129 -0
  14. data/app/helpers/pgbus/workflows_helper.rb +165 -0
  15. data/app/models/pgbus/blocked_execution.rb +12 -0
  16. data/app/models/pgbus/uniqueness_key.rb +88 -3
  17. data/app/models/pgbus/workflow_entry.rb +172 -0
  18. data/app/models/pgbus/workflow_event.rb +43 -0
  19. data/app/models/pgbus/workflow_signal.rb +77 -0
  20. data/app/models/pgbus/workflow_step.rb +149 -0
  21. data/app/views/layouts/pgbus/application.html.erb +2 -0
  22. data/app/views/pgbus/dashboard/_stats_cards.html.erb +17 -0
  23. data/app/views/pgbus/workflows/_actions.html.erb +59 -0
  24. data/app/views/pgbus/workflows/_events_table.html.erb +24 -0
  25. data/app/views/pgbus/workflows/_filters.html.erb +29 -0
  26. data/app/views/pgbus/workflows/_signal_form.html.erb +31 -0
  27. data/app/views/pgbus/workflows/_signals_table.html.erb +40 -0
  28. data/app/views/pgbus/workflows/_status_filter.html.erb +12 -0
  29. data/app/views/pgbus/workflows/_steps_table.html.erb +79 -0
  30. data/app/views/pgbus/workflows/_timeline.html.erb +49 -0
  31. data/app/views/pgbus/workflows/_workflows_table.html.erb +59 -0
  32. data/app/views/pgbus/workflows/attention.html.erb +88 -0
  33. data/app/views/pgbus/workflows/definitions/_by_revision.html.erb +52 -0
  34. data/app/views/pgbus/workflows/definitions/_duration_table.html.erb +18 -0
  35. data/app/views/pgbus/workflows/definitions/_funnel.html.erb +49 -0
  36. data/app/views/pgbus/workflows/definitions/_pipeline.html.erb +16 -0
  37. data/app/views/pgbus/workflows/definitions/_step_card.html.erb +31 -0
  38. data/app/views/pgbus/workflows/definitions/_throughput_table.html.erb +32 -0
  39. data/app/views/pgbus/workflows/definitions/_window.html.erb +17 -0
  40. data/app/views/pgbus/workflows/definitions/index.html.erb +71 -0
  41. data/app/views/pgbus/workflows/definitions/not_found.html.erb +5 -0
  42. data/app/views/pgbus/workflows/definitions/show.html.erb +80 -0
  43. data/app/views/pgbus/workflows/index.html.erb +15 -0
  44. data/app/views/pgbus/workflows/not_found.html.erb +5 -0
  45. data/app/views/pgbus/workflows/show.html.erb +93 -0
  46. data/config/i18n-tasks.yml +6 -0
  47. data/config/locales/da.yml +445 -0
  48. data/config/locales/de.yml +445 -0
  49. data/config/locales/en.yml +445 -0
  50. data/config/locales/es.yml +445 -0
  51. data/config/locales/fi.yml +445 -0
  52. data/config/locales/fr.yml +445 -0
  53. data/config/locales/it.yml +445 -0
  54. data/config/locales/ja.yml +445 -0
  55. data/config/locales/nb.yml +445 -0
  56. data/config/locales/nl.yml +445 -0
  57. data/config/locales/pt.yml +445 -0
  58. data/config/locales/sv.yml +445 -0
  59. data/config/routes.rb +26 -0
  60. data/lib/generators/pgbus/add_workflow_signals_generator.rb +56 -0
  61. data/lib/generators/pgbus/add_workflows_generator.rb +54 -0
  62. data/lib/generators/pgbus/templates/add_workflow_signals.rb.erb +51 -0
  63. data/lib/generators/pgbus/templates/add_workflows.rb.erb +150 -0
  64. data/lib/generators/pgbus/templates/migration.rb.erb +127 -0
  65. data/lib/pgbus/active_job/adapter.rb +81 -3
  66. data/lib/pgbus/active_job/delivery.rb +63 -0
  67. data/lib/pgbus/active_job/executor.rb +20 -8
  68. data/lib/pgbus/concurrency/blocked_execution.rb +14 -6
  69. data/lib/pgbus/configuration/workflow_settings.rb +99 -0
  70. data/lib/pgbus/configuration.rb +64 -4
  71. data/lib/pgbus/dead_letter_header.rb +9 -1
  72. data/lib/pgbus/generators/migration_detector.rb +40 -0
  73. data/lib/pgbus/instrumentation.rb +33 -0
  74. data/lib/pgbus/integrations/appsignal/dashboard.json +157 -1
  75. data/lib/pgbus/integrations/appsignal/subscriber.rb +16 -1
  76. data/lib/pgbus/mcp/rack_app.rb +7 -2
  77. data/lib/pgbus/mcp/runner.rb +2 -1
  78. data/lib/pgbus/mcp/serialization.rb +25 -0
  79. data/lib/pgbus/mcp/server.rb +53 -10
  80. data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +1 -10
  81. data/lib/pgbus/mcp/tools/workflow_cancel_tool.rb +23 -0
  82. data/lib/pgbus/mcp/tools/workflow_definitions_tool.rb +36 -0
  83. data/lib/pgbus/mcp/tools/workflow_detail_tool.rb +38 -0
  84. data/lib/pgbus/mcp/tools/workflow_resume_at_tool.rb +32 -0
  85. data/lib/pgbus/mcp/tools/workflow_resume_tool.rb +24 -0
  86. data/lib/pgbus/mcp/tools/workflow_run_now_tool.rb +23 -0
  87. data/lib/pgbus/mcp/tools/workflow_signal_tool.rb +77 -0
  88. data/lib/pgbus/mcp/tools/workflow_skip_step_tool.rb +23 -0
  89. data/lib/pgbus/mcp/tools/workflow_stats_tool.rb +42 -0
  90. data/lib/pgbus/mcp/tools/workflows_attention_tool.rb +42 -0
  91. data/lib/pgbus/mcp/tools/workflows_tool.rb +60 -0
  92. data/lib/pgbus/mcp/workflow_insights_payload.rb +15 -0
  93. data/lib/pgbus/mcp/workflow_payloads.rb +53 -0
  94. data/lib/pgbus/mcp/write_tool.rb +134 -0
  95. data/lib/pgbus/mcp.rb +15 -0
  96. data/lib/pgbus/metrics/backends/statsd.rb +6 -0
  97. data/lib/pgbus/metrics/subscriber.rb +14 -1
  98. data/lib/pgbus/metrics/workflow_metrics.rb +75 -0
  99. data/lib/pgbus/process/consumer.rb +2 -1
  100. data/lib/pgbus/process/dispatcher.rb +39 -3
  101. data/lib/pgbus/process/worker.rb +10 -1
  102. data/lib/pgbus/recurring/schedule.rb +1 -1
  103. data/lib/pgbus/streams/presence.rb +65 -36
  104. data/lib/pgbus/uniqueness.rb +23 -6
  105. data/lib/pgbus/version.rb +1 -1
  106. data/lib/pgbus/web/data_source/workflow_actions.rb +109 -0
  107. data/lib/pgbus/web/data_source/workflow_insights.rb +99 -0
  108. data/lib/pgbus/web/data_source/workflow_list.rb +291 -0
  109. data/lib/pgbus/web/data_source.rb +126 -15
  110. data/lib/pgbus/web/workflow_action_plan.rb +62 -0
  111. data/lib/pgbus/web/workflow_insights_queries.rb +250 -0
  112. data/lib/pgbus/web/workflow_insights_report.rb +171 -0
  113. data/lib/pgbus/web/workflow_payload.rb +36 -0
  114. data/lib/pgbus/web/workflow_query.rb +82 -0
  115. data/lib/pgbus/web/workflow_state.rb +89 -0
  116. data/lib/pgbus/web/workflow_timeline.rb +130 -0
  117. data/lib/pgbus/web/workflow_window.rb +51 -0
  118. data/lib/pgbus/workflow/batch_finished_job.rb +21 -0
  119. data/lib/pgbus/workflow/dsl.rb +105 -0
  120. data/lib/pgbus/workflow/error_capture.rb +63 -0
  121. data/lib/pgbus/workflow/exception_policy.rb +170 -0
  122. data/lib/pgbus/workflow/fan_out.rb +157 -0
  123. data/lib/pgbus/workflow/fan_out_definition.rb +41 -0
  124. data/lib/pgbus/workflow/flow_control.rb +94 -0
  125. data/lib/pgbus/workflow/instance.rb +183 -0
  126. data/lib/pgbus/workflow/outside_verbs.rb +138 -0
  127. data/lib/pgbus/workflow/payload.rb +53 -0
  128. data/lib/pgbus/workflow/registry.rb +53 -0
  129. data/lib/pgbus/workflow/removed_step.rb +14 -0
  130. data/lib/pgbus/workflow/runner.rb +218 -0
  131. data/lib/pgbus/workflow/signal_matcher.rb +53 -0
  132. data/lib/pgbus/workflow/signals.rb +132 -0
  133. data/lib/pgbus/workflow/states.rb +119 -0
  134. data/lib/pgbus/workflow/step_context.rb +58 -0
  135. data/lib/pgbus/workflow/step_definition.rb +133 -0
  136. data/lib/pgbus/workflow/step_execution.rb +242 -0
  137. data/lib/pgbus/workflow/step_job.rb +28 -0
  138. data/lib/pgbus/workflow/step_outcome.rb +151 -0
  139. data/lib/pgbus/workflow/steps.rb +103 -0
  140. data/lib/pgbus/workflow/sweep.rb +156 -0
  141. data/lib/pgbus/workflow/test_helpers.rb +152 -0
  142. data/lib/pgbus/workflow/wait_timeout.rb +94 -0
  143. data/lib/pgbus/workflow/waiting.rb +82 -0
  144. data/lib/pgbus/workflow.rb +183 -0
  145. data/sig/pgbus/configuration.rbs +23 -0
  146. metadata +92 -1
@@ -140,6 +140,11 @@ pt:
140
140
  throughput: Taxa de transferência
141
141
  throughput_detail: jobs/min nos últimos %{minutes} min
142
142
  throughput_unavailable: requer estatísticas de jobs (rails g pgbus:add_job_stats)
143
+ workflows: Workflows
144
+ workflows_attention:
145
+ one: "%{count} requer atenção"
146
+ other: "%{count} requerem atenção"
147
+ workflows_detail: em andamento (%{paused} em pausa)
143
148
  verdict:
144
149
  links:
145
150
  dlq: Mensagens mortas
@@ -723,6 +728,7 @@ pt:
723
728
  processes: Processos
724
729
  queues: Filas
725
730
  recurring: Recorrente
731
+ workflows: Workflows
726
732
  return_to_app: Voltar ao aplicativo
727
733
  title: Painel Pgbus
728
734
  toggle_dark_mode: Alternar modo escuro
@@ -1023,3 +1029,442 @@ pt:
1023
1029
  disabled: Tarefa desativada
1024
1030
  enabled: Tarefa ativada
1025
1031
  failed: Falha ao alternar tarefa
1032
+ workflow_insights:
1033
+ back_to_classes: Todas as classes de workflow
1034
+ back_to_runs: Todas as execuções de workflow
1035
+ bad_request: 'Requisição inválida: %{reason}'
1036
+ capped: 'Limitado a workflow_retention (%{retention}): execuções terminadas e canceladas mais antigas são apagadas.'
1037
+ few_samples:
1038
+ one: n=%{count}, poucas amostras
1039
+ other: n=%{count}, poucas amostras
1040
+ index:
1041
+ description: 'Como correu cada classe de workflow em %{window}: as execuções em curso, as que terminaram e quanto tempo uma execução leva do início ao fim.'
1042
+ empty_hint: 'Defina uma subclasse de Pgbus::Workflow e inicie uma execução: YourWorkflow.start!(subject, **arguments).'
1043
+ empty_title: Nenhuma classe de workflow foi executada ainda.
1044
+ headers:
1045
+ attention: Precisam de atenção
1046
+ cancelled: Canceladas
1047
+ duration_p50: Duração p50
1048
+ duration_p95: Duração p95
1049
+ finished: Terminadas
1050
+ ongoing: Em curso
1051
+ paused: Em pausa
1052
+ workflow_class: Classe de workflow
1053
+ title: Análise de workflows
1054
+ links:
1055
+ at_step: "%{status} execuções em %{step}"
1056
+ attention: execuções de %{workflow} que precisam de atenção
1057
+ cancelled: execuções de %{workflow} canceladas na janela
1058
+ cancelled_bucket: execuções canceladas neste período
1059
+ finished: execuções de %{workflow} terminadas na janela
1060
+ finished_bucket: execuções terminadas neste período
1061
+ ongoing: execuções em curso de %{workflow}
1062
+ paused: execuções em pausa de %{workflow}
1063
+ started: execuções de %{workflow} iniciadas na janela
1064
+ started_bucket: execuções iniciadas neste período
1065
+ not_found:
1066
+ hint: Nenhuma subclasse de Pgbus::Workflow nem nenhuma execução se chama %{workflow} (ou a leitura falhou, veja o registo).
1067
+ title: Classe de workflow desconhecida
1068
+ not_loaded: Definição não carregada
1069
+ not_loaded_hint: 'Esta classe já não carrega na aplicação: os passos vêm das linhas das suas execuções, na ordem em que as execuções os alcançaram.'
1070
+ percentile: "%{name} %{value}"
1071
+ removed_in_flight:
1072
+ one: "%{count} execução no passo removido %{step}"
1073
+ other: "%{count} execuções no passo removido %{step}"
1074
+ show:
1075
+ by_revision:
1076
+ all_steps: Todos os passos
1077
+ caption: 'Os mesmos números para as últimas cinco revisões da aplicação que terminaram uma tentativa na janela, a mais recente primeiro: uma regressão após um deploy aparece como uma linha.'
1078
+ empty: Nenhuma tentativa nesta janela registou uma revisão da aplicação (config.app_revision).
1079
+ headers:
1080
+ attempts: Tentativas
1081
+ failed: Falhadas
1082
+ reattempted: Repetidas
1083
+ revision: Revisão
1084
+ run_time: Tempo de execução
1085
+ skipped: Ignoradas
1086
+ step: Passo
1087
+ seen_html: vista de %{from} a %{to}
1088
+ title: Por revisão da aplicação
1089
+ worse: subiu de %{rate} em %{revision}
1090
+ charts:
1091
+ durations:
1092
+ between: "%{from}–%{to}"
1093
+ caption:
1094
+ one: Quanto tempo levou a %{count} execução terminada na janela, do início ao fim.
1095
+ other: Quanto tempo levaram as %{count} execuções terminadas na janela, do início ao fim.
1096
+ headers:
1097
+ range: Duração
1098
+ runs: Execuções
1099
+ over: "%{from} ou mais"
1100
+ title: Duração do início ao fim
1101
+ under: menos de %{to}
1102
+ series:
1103
+ cancelled: Canceladas
1104
+ finished: Terminadas
1105
+ runs: Execuções
1106
+ started: Iniciadas
1107
+ throughput:
1108
+ caption: 'Execuções iniciadas, terminadas e canceladas por %{bucket} em %{window}: %{started} iniciadas, %{finished} terminadas, %{cancelled} canceladas.'
1109
+ headers:
1110
+ cancelled: Canceladas
1111
+ finished: Terminadas
1112
+ from: Desde
1113
+ started: Iniciadas
1114
+ title: Execuções por %{bucket}
1115
+ description: 'Em %{window}: onde estão as execuções agora, como cada passo se comporta e onde as execuções param.'
1116
+ funnel:
1117
+ caption:
1118
+ one: 'Da %{count} execução iniciada na janela: quantas alcançaram cada passo e onde está agora.'
1119
+ other: 'Das %{count} execuções iniciadas na janela: quantas alcançaram cada passo e onde está cada uma agora.'
1120
+ empty: Nenhuma execução foi iniciada nesta janela.
1121
+ headers:
1122
+ now_here: Agora neste passo
1123
+ reached: Alcançado
1124
+ share: Das iniciadas
1125
+ step: Passo
1126
+ here:
1127
+ cancelled:
1128
+ one: "%{count} cancelada"
1129
+ other: "%{count} canceladas"
1130
+ finished:
1131
+ one: "%{count} terminada"
1132
+ other: "%{count} terminadas"
1133
+ paused:
1134
+ one: "%{count} em pausa"
1135
+ other: "%{count} em pausa"
1136
+ performing:
1137
+ one: "%{count} em execução"
1138
+ other: "%{count} em execução"
1139
+ ready:
1140
+ one: "%{count} agendada"
1141
+ other: "%{count} agendadas"
1142
+ waiting:
1143
+ one: "%{count} aguardando"
1144
+ other: "%{count} aguardando"
1145
+ title: Funil
1146
+ pipeline:
1147
+ attempts:
1148
+ one: "%{count} tentativa"
1149
+ other: "%{count} tentativas"
1150
+ caption: 'Cada passo por ordem: as execuções que estão nele agora e como correram as suas tentativas terminadas na janela.'
1151
+ empty: 'Ainda sem passos: nenhuma execução desta classe tem um passo na janela e nenhuma está em curso.'
1152
+ failed: Falhadas
1153
+ kinds:
1154
+ fan_out: Fan-out
1155
+ removed: Removido
1156
+ signal: Aguarda um sinal
1157
+ undeclared: Fora da definição
1158
+ live:
1159
+ paused: Em pausa
1160
+ performing: Em execução
1161
+ ready: Agendadas
1162
+ waiting: Aguardando
1163
+ now_label: Execuções neste passo agora
1164
+ pickup: Recolha
1165
+ reattempted: Repetidas
1166
+ run_time: Tempo de execução
1167
+ skipped: Ignoradas
1168
+ step_link: Execuções em curso em %{step}
1169
+ title: Pipeline
1170
+ window_label: Tentativas terminadas na janela
1171
+ summary:
1172
+ attention: Precisam de atenção
1173
+ cancelled: Canceladas
1174
+ duration: Duração p50
1175
+ finished: Terminadas
1176
+ ongoing: Em curso
1177
+ started: Iniciadas
1178
+ window_label: Janela de tempo
1179
+ windows:
1180
+ 1h: a última hora
1181
+ 24h: as últimas 24 horas
1182
+ 30d: os últimos 30 dias
1183
+ 7d: os últimos 7 dias
1184
+ workflows:
1185
+ actions:
1186
+ bulk_cancel: Cancelar todos
1187
+ bulk_resume: Retomar todos
1188
+ cancel: Cancelar
1189
+ rerun: Reexecutar
1190
+ resume: Retomar
1191
+ resume_at: Retomar na etapa
1192
+ run_now: Executar agora
1193
+ signal: Enviar sinal
1194
+ skip_step: Ignorar etapa
1195
+ attempt: tentativa %{attempt}
1196
+ attention:
1197
+ at_step_html: em %{step}
1198
+ back: "← Workflows"
1199
+ cancel_all:
1200
+ one: Cancelar %{count}
1201
+ other: Cancelar todas (%{count})
1202
+ confirm:
1203
+ cancel:
1204
+ one: Cancelar a execução presa em %{step}?
1205
+ other: Cancelar as %{count} execuções presas em %{step}?
1206
+ cancel_error:
1207
+ one: Cancelar a execução presa em %{step} por %{error}?
1208
+ other: Cancelar as %{count} execuções presas em %{step} por %{error}?
1209
+ resume:
1210
+ one: Retomar a execução em pausa em %{step}?
1211
+ other: Retomar as %{count} execuções em pausa em %{step}?
1212
+ resume_error:
1213
+ one: Retomar a execução em pausa em %{step} por %{error}?
1214
+ other: Retomar as %{count} execuções em pausa em %{step} por %{error}?
1215
+ description: Execuções em andamento que aguardam uma pessoa, agrupadas pelo que as parou. Depois de corrigida a causa, aja no grupo inteiro.
1216
+ empty_hint: Nenhuma execução em andamento está em pausa, travada, atrasada ou aguardando além de workflow_waiting_visibility_threshold.
1217
+ empty_title: Nada requer atenção.
1218
+ first_seen_html: primeira vez %{time}
1219
+ headers:
1220
+ actions: Ações
1221
+ reason: Motivo
1222
+ runs: Execuções
1223
+ seen: Visto
1224
+ workflow: Workflow
1225
+ last_seen_html: última vez %{time}
1226
+ only_class_html: Apenas %{workflow}.
1227
+ reasons:
1228
+ overdue: 'Atrasada: vencida, mas não pega'
1229
+ paused_error: Em pausa por um erro
1230
+ paused_manual: Pausada manualmente
1231
+ stalled: 'Travada: o worker parou de responder'
1232
+ waiting_overdue: Espera longa demais
1233
+ resume_all:
1234
+ one: Retomar %{count}
1235
+ other: Retomar todas (%{count})
1236
+ show_all: Mostrar todas as classes
1237
+ show_runs: Mostrar execuções
1238
+ title: Requerem atenção
1239
+ audit:
1240
+ by: "%{event} por %{actor}"
1241
+ empty: Nenhum evento registrado.
1242
+ headers:
1243
+ what: O que aconteceu
1244
+ when: Quando
1245
+ title: Trilha de auditoria
1246
+ with_reason: "%{sentence}: %{reason}"
1247
+ with_step: "%{sentence} (%{step} #%{attempt})"
1248
+ bad_request: 'Requisição inválida: %{reason}'
1249
+ confirm:
1250
+ cancel: Cancelar este workflow? Suas etapas abertas são canceladas e ele não executa mais.
1251
+ rerun: Iniciar este workflow de novo como uma nova execução, com o mesmo sujeito e os mesmos argumentos?
1252
+ resume: Retomar este workflow?
1253
+ resume_at: Retomar este workflow na etapa escolhida? Suas etapas abertas são canceladas antes.
1254
+ run_now: Executar agora a etapa agendada em vez de esperar?
1255
+ signal: Enviar este sinal ao workflow?
1256
+ skip_step: Ignorar a etapa que este workflow aguarda e passar para a próxima?
1257
+ events:
1258
+ cancelled: Cancelado
1259
+ fan_out_finished: Fan-out concluído
1260
+ fan_out_opened: Fan-out aberto
1261
+ finished: Concluído
1262
+ late_completion_ignored: Conclusão tardia ignorada
1263
+ paused: Pausado
1264
+ rerun: Reexecutado
1265
+ rescheduled: Reagendado
1266
+ resumed: Retomado
1267
+ run_now: Executar agora
1268
+ signal_claimed: Sinal reivindicado
1269
+ signal_received: Sinal recebido
1270
+ stall_detected: Travamento detectado
1271
+ started: Iniciado
1272
+ step_completed: Etapa concluída
1273
+ step_failed: Etapa com falha
1274
+ step_reattempted: Etapa tentada novamente
1275
+ step_scheduled: Etapa agendada
1276
+ step_skipped: Etapa ignorada
1277
+ step_started: Etapa iniciada
1278
+ step_waiting: Etapa aguardando
1279
+ wait_timed_out: Espera expirada
1280
+ filters:
1281
+ apply: Aplicar filtros
1282
+ clear: Limpar
1283
+ created_from: Criado a partir de
1284
+ created_to: Criado até
1285
+ ended_from: Terminado desde
1286
+ ended_to: Terminado até
1287
+ error_class: Classe de erro
1288
+ step: Etapa atual
1289
+ subject_id: ID do sujeito
1290
+ subject_type: Tipo de sujeito
1291
+ workflow_class: Classe do workflow
1292
+ workflow_id: ID do workflow
1293
+ flash:
1294
+ bad_group: Esse grupo não é válido.
1295
+ bulk_cancel:
1296
+ one: "%{count} cancelado."
1297
+ other: "%{count} cancelados."
1298
+ bulk_cancel_skipped: "%{count} cancelados; %{skipped} já tinham avançado."
1299
+ bulk_failed: "%{count} não puderam ser alterados: %{reason}"
1300
+ bulk_more: 'Pode haver mais execuções aguardando: pressione de novo para as próximas %{cap}.'
1301
+ bulk_resume:
1302
+ one: "%{count} retomado."
1303
+ other: "%{count} retomados."
1304
+ bulk_resume_skipped: "%{count} retomados; %{skipped} já tinham avançado."
1305
+ cancel: Workflow cancelado.
1306
+ choose_step: Escolha uma etapa para retomar.
1307
+ failed:
1308
+ not_allowed: 'Não realizado: a execução agora está %{status}.'
1309
+ not_found: Esse workflow não existe mais.
1310
+ other: "%{action} falhou: %{reason}"
1311
+ payload_not_object: 'Não enviado: o payload não é um objeto JSON.'
1312
+ payload_too_large: 'Não enviado: o payload excede %{limit} bytes.'
1313
+ rerun: Nova execução iniciada.
1314
+ resume: Workflow retomado.
1315
+ resume_at: Workflow retomado em %{step}.
1316
+ run_now: A etapa agendada está executando agora.
1317
+ signal: Sinal %{name} enviado.
1318
+ signal_duplicate: O sinal %{name} já foi entregue com esta chave; nada de novo foi enviado.
1319
+ signal_name_missing: 'Não enviado: o sinal precisa de um nome.'
1320
+ skip_step: Etapa ignorada.
1321
+ headers:
1322
+ current_step: Etapa atual
1323
+ last_activity: Última atividade
1324
+ started: Iniciado
1325
+ status: Status
1326
+ subject: Sujeito
1327
+ workflow: Workflow
1328
+ index:
1329
+ attention_link:
1330
+ one: Requer atenção (%{count})
1331
+ other: Requerem atenção (%{count})
1332
+ description: 'Execuções duráveis de várias etapas: o que cada uma está fazendo e o que acontece a seguir.'
1333
+ empty_hint: Escolha outro status ou limpe os filtros. Uma execução começa com YourWorkflow.start!(subject, **arguments).
1334
+ empty_title: Nenhum workflow corresponde.
1335
+ insights_link: Análise por classe
1336
+ status_label: Filtrar por status
1337
+ title: Workflows
1338
+ next:
1339
+ cancelled_html: Cancelado %{ago}.
1340
+ due_html: 'Pronto: %{step} deveria ter rodado %{ago} e aguarda um worker.'
1341
+ finished_html: Concluído %{ago}.
1342
+ overdue_html: 'Atrasado: %{step} deveria ter rodado %{ago}; a varredura o envia de novo.'
1343
+ paused_error_html: 'Em pausa em %{step}: %{error} — retome ou cancele.'
1344
+ paused_manual_html: Em pausa em %{step} — retome ou cancele.
1345
+ performing_attempt_html: Executando %{step} (tentativa %{attempt}).
1346
+ performing_html: Executando %{step}.
1347
+ ready_html: 'Pronto: %{step} executa em seguida.'
1348
+ scheduled_html: 'Agendado: %{step} executa %{time}.'
1349
+ unknown_html: 'Status: %{status}.'
1350
+ waiting_batch_html: Aguardando o lote %{batch} (%{done} de %{total} trabalhos concluídos).
1351
+ waiting_signal_html: Aguardando o sinal %{signal} desde %{ago}.
1352
+ waiting_signal_late_html: Aguardando o sinal %{signal} desde %{ago} (atrasado desde %{late}). O próximo aviso de atraso sai %{time}.
1353
+ waiting_signal_notify_html: Aguardando o sinal %{signal} desde %{ago}. Um aviso de atraso sai %{time} e a espera continua.
1354
+ waiting_signal_timeout_html: Aguardando o sinal %{signal} desde %{ago}. A espera expira %{time}.
1355
+ waiting_step_html: Aguardando %{step}.
1356
+ not_found:
1357
+ hint: Pode ter terminado e sido removido após workflow_retention, ou a base de dados não pôde ser lida (veja o log).
1358
+ title: Workflow não encontrado
1359
+ outcomes:
1360
+ cancelled: cancelado
1361
+ completed: concluído
1362
+ finished_early: encerrou a execução antes do fim
1363
+ paused: pausou a execução
1364
+ reattempted: tentado novamente
1365
+ skipped: ignorado
1366
+ resume:
1367
+ carry_on: 'Retomar: prosseguir com %{step}'
1368
+ continue: 'Retomar: continuar com %{step}'
1369
+ finish: 'Retomar: concluir a execução'
1370
+ resend: 'Retomar: enviar %{step} novamente'
1371
+ retry: 'Retomar: tentar %{step} novamente'
1372
+ rewait: 'Retomar: aguardar %{step} novamente'
1373
+ show:
1374
+ actions: Ações
1375
+ arguments: Argumentos
1376
+ back: "← Workflows"
1377
+ cancelled_at: Cancelado
1378
+ class_missing: "%{workflow_class} não está carregado neste processo: a execução ainda pode ser cancelada, mas não retomada."
1379
+ definition_outdated: 'Esta execução começou com uma definição antiga de %{workflow_class}: suas etapas mudaram desde então.'
1380
+ details: Detalhes
1381
+ finished_at: Concluído
1382
+ no_arguments: Esta execução não tem argumentos.
1383
+ paused_at: Pausado
1384
+ reason_hint: Registrado na trilha de auditoria, junto de quem fez.
1385
+ reason_label: Motivo (opcional)
1386
+ rerun_of: Reexecução de
1387
+ reruns: Reexecutado como
1388
+ resume_at_label: Etapa para retomar
1389
+ signal:
1390
+ hint: Uma etapa que o aguarda acorda na hora; caso contrário, ele fica pendente até que uma etapa o pegue.
1391
+ name: Nome do sinal
1392
+ payload: Payload (JSON)
1393
+ send: Enviar sinal
1394
+ title: Enviar um sinal
1395
+ signal_statuses:
1396
+ claimed: Reivindicado
1397
+ consumed: Consumido
1398
+ pending: Pendente
1399
+ signals:
1400
+ empty: Nenhum sinal entregue a esta execução.
1401
+ headers:
1402
+ claimed: Reivindicado
1403
+ consumed: Consumido
1404
+ idempotency_key: Chave de idempotência
1405
+ name: Sinal
1406
+ received: Recebido
1407
+ status: Status
1408
+ payload: Payload
1409
+ title: Sinais
1410
+ statuses:
1411
+ cancelled: Cancelado
1412
+ finished: Concluído
1413
+ gone: removido
1414
+ paused: Em pausa
1415
+ performing: Executando
1416
+ ready: Pronto
1417
+ scheduled: Agendado
1418
+ waiting: Aguardando
1419
+ step_statuses:
1420
+ cancelled: Cancelada
1421
+ completed: Concluída
1422
+ failed: Com falha
1423
+ in_progress: Em execução
1424
+ scheduled: Agendada
1425
+ skipped: Ignorada
1426
+ waiting: Aguardando
1427
+ steps:
1428
+ batch: lote %{batch}
1429
+ caused_by: Causado por %{error}
1430
+ empty: Ainda não há tentativas.
1431
+ headers:
1432
+ finished: Concluída
1433
+ queued: Na fila
1434
+ ran: Execução
1435
+ scheduled: Agendada
1436
+ started: Iniciada
1437
+ status: Status
1438
+ step: Etapa
1439
+ waited: Espera
1440
+ worker: Worker
1441
+ revision: revisão %{revision}
1442
+ show_backtrace: Mostrar backtrace
1443
+ title: Tentativas
1444
+ waiting_for: depois aguardando %{duration}
1445
+ waits_for_html: aguarda %{signal}
1446
+ tabs:
1447
+ all: Todos
1448
+ cancelled: Cancelados
1449
+ finished: Concluídos
1450
+ ongoing: Em andamento
1451
+ paused: Em pausa
1452
+ performing: Executando
1453
+ ready: Prontos
1454
+ waiting: Aguardando
1455
+ timeline:
1456
+ caption: 'Cada tentativa, a mais antiga no topo: esperou (sua espera), na fila (vencida, ainda não pega), executou (colorida conforme terminou) e aguardando (um sinal ou seu lote), com as pausas em linha própria. A tabela de tentativas abaixo lista as mesmas durações. Uma linha tracejada marca cada vez que uma espera passou do prazo.'
1457
+ empty: Ainda não há tentativas.
1458
+ paused_period_html: Em pausa desde %{from} durante %{duration}
1459
+ paused_row: Em pausa
1460
+ series:
1461
+ paused: Em pausa
1462
+ queued: Na fila
1463
+ ran_cancelled: Executou, cancelada
1464
+ ran_failed: Executou, falhou
1465
+ ran_ok: Executou
1466
+ ran_open: Em execução
1467
+ waited: Esperou
1468
+ waiting: Aguardando
1469
+ title: Linha do tempo
1470
+ wait_timeout_html: 'A espera de %{step} passou do prazo em %{time} (on_timeout: %{action}).'