@orkastery/cli 0.5.3 → 0.5.6
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/adapters/claude-code/README.md +158 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +1 -1
- package/adapters/openclaw/README.md +2 -1
- package/adapters/openclaw/openclaw.plugin.json +1 -1
- package/adapters/openclaw/package.json +1 -1
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/dist/adapters/claude-bg.js +77 -13
- package/dist/adapters/codex.js +10 -1
- package/dist/agents-md.js +24 -15
- package/dist/auditrun.js +17 -2
- package/dist/board.js +4 -3
- package/dist/branch-de-estado.js +23 -1
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +13 -7
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +3 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +36 -1
- package/dist/conducao-sentinela.js +388 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +122 -30
- package/dist/conhecimento.js +490 -0
- package/dist/docs.js +22 -8
- package/dist/doctor-pulse-cron.js +182 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +115 -111
- package/dist/entrega-pr.js +22 -21
- package/dist/escopo-escrita.js +10 -1
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +38 -8
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +1 -1
- package/dist/gates.js +3 -28
- package/dist/handoff.js +10 -6
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-resumo.js +29 -3
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl.js +29 -33
- package/dist/horario.js +14 -7
- package/dist/hosts.js +52 -1
- package/dist/impedimento.js +108 -14
- package/dist/index.js +623 -521
- package/dist/indice.js +7 -1
- package/dist/init.js +43 -47
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +2 -0
- package/dist/intelligence-graph-cli.js +92 -21
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/ledger.js +15 -1
- package/dist/liveness.js +6 -3
- package/dist/locale-ajuda.js +761 -0
- package/dist/locale-gerados.js +160 -0
- package/dist/locale-master.js +99 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-pulse.js +211 -0
- package/dist/locale-retry.js +385 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-ship.js +494 -0
- package/dist/locale-thread.js +277 -0
- package/dist/locale-verify.js +125 -0
- package/dist/locale.js +714 -0
- package/dist/manifest.js +129 -3
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +4 -6
- package/dist/master.js +21 -24
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-server.js +8 -2
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +5 -2
- package/dist/noctum-arco.js +911 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-envelope.js +810 -0
- package/dist/noctum-execucao.js +304 -0
- package/dist/noctum-fila.js +280 -0
- package/dist/ocupacao.js +29 -2
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +9 -2
- package/dist/orquestracao.js +13 -12
- package/dist/parado-no-condutor.js +34 -9
- package/dist/phase.js +94 -39
- package/dist/policies.js +4 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +127 -4
- package/dist/prompts.js +6 -2
- package/dist/pulse-delivery.js +13 -2
- package/dist/pulse.js +52 -19
- package/dist/ratelimit.js +4 -2
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-status.js +3 -2
- package/dist/retry.js +232 -148
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-context.js +181 -3
- package/dist/runtimes.js +2 -1
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +7 -1
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +1 -1
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +84 -81
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +153 -82
- package/dist/util.js +8 -1
- package/dist/verify.js +141 -52
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +165 -0
- package/dist/worktree.js +20 -0
- package/dist/yaml.js +27 -8
- package/package.json +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
package/dist/retry.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.POLITICA_DE_RETRY = exports.ESCADA_DE_ESFORCO = void 0;
|
|
36
|
+
exports.TETO_DO_PROMPT_GRAVADO = exports.POLITICA_DE_RETRY = exports.ESCADA_DE_ESFORCO = void 0;
|
|
37
37
|
exports.proximoEsforco = proximoEsforco;
|
|
38
38
|
exports.politicaDoMotivo = politicaDoMotivo;
|
|
39
39
|
exports.podeReexecutar = podeReexecutar;
|
|
@@ -45,6 +45,8 @@ exports.estadoTerminalDeRetry = estadoTerminalDeRetry;
|
|
|
45
45
|
exports.planejarRetry = planejarRetry;
|
|
46
46
|
exports.escalarEsforco = escalarEsforco;
|
|
47
47
|
exports.redespachar = redespachar;
|
|
48
|
+
exports.localizarPromptGravado = localizarPromptGravado;
|
|
49
|
+
exports.despachoParaRedespachar = despachoParaRedespachar;
|
|
48
50
|
exports.playbookDaRetomada = playbookDaRetomada;
|
|
49
51
|
exports.retomarPedido = retomarPedido;
|
|
50
52
|
exports.retomarFila = retomarFila;
|
|
@@ -86,6 +88,8 @@ const runtimes_1 = require("./runtimes");
|
|
|
86
88
|
const setup_1 = require("./setup");
|
|
87
89
|
const gates_1 = require("./gates");
|
|
88
90
|
const ledger_1 = require("./ledger");
|
|
91
|
+
const estado_thread_1 = require("./estado-thread");
|
|
92
|
+
const vida_da_thread_1 = require("./vida-da-thread");
|
|
89
93
|
const phase_1 = require("./phase");
|
|
90
94
|
const runtime_context_1 = require("./runtime-context");
|
|
91
95
|
const slug_1 = require("./slug");
|
|
@@ -104,6 +108,12 @@ const gates_2 = require("./gates");
|
|
|
104
108
|
const horario_1 = require("./horario");
|
|
105
109
|
const conducao_1 = require("./conducao");
|
|
106
110
|
const conducao_texto_1 = require("./conducao-texto");
|
|
111
|
+
const procedencia_1 = require("./procedencia");
|
|
112
|
+
const postura_local_1 = require("./postura-local");
|
|
113
|
+
const locale_1 = require("./locale");
|
|
114
|
+
const locale_retry_1 = require("./locale-retry");
|
|
115
|
+
/** RM-061 (F2b, D3): `porque` e `correcao` de cada motivo tem a fonte no catalogo pt-BR; o `--json` nao muda. */
|
|
116
|
+
const TEXTOS_DA_POLITICA = locale_retry_1.RETRY_PT_BR.politica;
|
|
107
117
|
/**
|
|
108
118
|
* Escada de esforco da 2a tentativa em diante.
|
|
109
119
|
*
|
|
@@ -129,29 +139,25 @@ exports.POLITICA_DE_RETRY = {
|
|
|
129
139
|
motivo: 'artifact.missing',
|
|
130
140
|
acao: 'corrigir-dirigido',
|
|
131
141
|
automatica: true,
|
|
132
|
-
|
|
133
|
-
correcao: 'ork fix open <thread> abre a rodada com a spec exata',
|
|
142
|
+
...TEXTOS_DA_POLITICA['artifact.missing'],
|
|
134
143
|
},
|
|
135
144
|
'claims.failed': {
|
|
136
145
|
motivo: 'claims.failed',
|
|
137
146
|
acao: 'corrigir-dirigido',
|
|
138
147
|
automatica: true,
|
|
139
|
-
|
|
140
|
-
correcao: 'ork fix open <thread> e depois ork fix reverify <thread>',
|
|
148
|
+
...TEXTOS_DA_POLITICA['claims.failed'],
|
|
141
149
|
},
|
|
142
150
|
'claims.unverifiable': {
|
|
143
151
|
motivo: 'claims.unverifiable',
|
|
144
152
|
acao: 'corrigir-dirigido',
|
|
145
153
|
automatica: true,
|
|
146
|
-
|
|
147
|
-
correcao: 'ork claims verificar <thread> <claim> --comando "<comando>"',
|
|
154
|
+
...TEXTOS_DA_POLITICA['claims.unverifiable'],
|
|
148
155
|
},
|
|
149
156
|
'policy.violation': {
|
|
150
157
|
motivo: 'policy.violation',
|
|
151
158
|
acao: 'escalar-humano',
|
|
152
159
|
automatica: false,
|
|
153
|
-
|
|
154
|
-
correcao: 'corrija a violacao no pedido/manifesto; policy block nao se resolve por repeticao',
|
|
160
|
+
...TEXTOS_DA_POLITICA['policy.violation'],
|
|
155
161
|
},
|
|
156
162
|
'runtime.autoconferencia': {
|
|
157
163
|
motivo: 'runtime.autoconferencia',
|
|
@@ -161,77 +167,66 @@ exports.POLITICA_DE_RETRY = {
|
|
|
161
167
|
// decide em que runtime o CHECK roda e quem conduz a thread.
|
|
162
168
|
acao: 'escalar-humano',
|
|
163
169
|
automatica: false,
|
|
164
|
-
|
|
165
|
-
correcao: 'despache o CHECK em outro runtime (`ork phase run <thread> CHECK --runtime <outro>`), ou tire a exigencia de validacao cruzada da thread se ela nao se justifica',
|
|
170
|
+
...TEXTOS_DA_POLITICA['runtime.autoconferencia'],
|
|
166
171
|
},
|
|
167
172
|
// RM-056 (D1): o perfil pedido nao existe ou e de outro runtime. Quem corrige e quem pediu.
|
|
168
173
|
'runtime.profile-invalid': {
|
|
169
174
|
motivo: 'runtime.profile-invalid',
|
|
170
175
|
acao: 'escalar-humano',
|
|
171
176
|
automatica: false,
|
|
172
|
-
|
|
173
|
-
correcao: 'ork accounts list mostra os perfis de cada runtime; repita o despacho com um perfil do runtime certo ou sem --perfil',
|
|
177
|
+
...TEXTOS_DA_POLITICA['runtime.profile-invalid'],
|
|
174
178
|
},
|
|
175
179
|
'cost.violation': {
|
|
176
180
|
motivo: 'cost.violation',
|
|
177
181
|
acao: 'sem-retry',
|
|
178
182
|
automatica: false,
|
|
179
|
-
|
|
180
|
-
correcao: 'tire do ambiente a variavel que redireciona o despacho e rode a fase de novo a mao, com o gasto sob os olhos de um humano',
|
|
183
|
+
...TEXTOS_DA_POLITICA['cost.violation'],
|
|
181
184
|
},
|
|
182
185
|
'verify.regression': {
|
|
183
186
|
motivo: 'verify.regression',
|
|
184
187
|
acao: 'corrigir-dirigido',
|
|
185
188
|
automatica: true,
|
|
186
|
-
|
|
187
|
-
correcao: 'ork fix open <thread> (a reexecucao seguinte e completa)',
|
|
189
|
+
...TEXTOS_DA_POLITICA['verify.regression'],
|
|
188
190
|
},
|
|
189
191
|
'verify.failed': {
|
|
190
192
|
motivo: 'verify.failed',
|
|
191
193
|
acao: 'corrigir-dirigido',
|
|
192
194
|
automatica: true,
|
|
193
|
-
|
|
194
|
-
correcao: 'ork fix open <thread>, ou ork verify <thread> --baseline antes do proximo GO',
|
|
195
|
+
...TEXTOS_DA_POLITICA['verify.failed'],
|
|
195
196
|
},
|
|
196
197
|
'verify.timeout': {
|
|
197
198
|
motivo: 'verify.timeout',
|
|
198
199
|
acao: 'reexecutar',
|
|
199
200
|
automatica: true,
|
|
200
|
-
|
|
201
|
-
correcao: 'ork verify <thread> de novo; se estourar sempre, suba verify.timeout_ms no manifesto ou divida o comando',
|
|
201
|
+
...TEXTOS_DA_POLITICA['verify.timeout'],
|
|
202
202
|
},
|
|
203
203
|
'verify.sem-veredito': {
|
|
204
204
|
motivo: 'verify.sem-veredito',
|
|
205
205
|
acao: 'reexecutar',
|
|
206
206
|
automatica: true,
|
|
207
|
-
|
|
208
|
-
correcao: 'ork verify <thread> de novo, sem editar a worktree durante a rodada',
|
|
207
|
+
...TEXTOS_DA_POLITICA['verify.sem-veredito'],
|
|
209
208
|
},
|
|
210
209
|
'ci.failed': {
|
|
211
210
|
motivo: 'ci.failed',
|
|
212
211
|
acao: 'escalar-humano',
|
|
213
212
|
automatica: false,
|
|
214
|
-
|
|
215
|
-
correcao: 'publique a candidata, aguarde o check obrigatório e repita o SHIP; se reprovou, corrija a causa registrada no runner',
|
|
213
|
+
...TEXTOS_DA_POLITICA['ci.failed'],
|
|
216
214
|
},
|
|
217
215
|
'runtime.unavailable': {
|
|
218
216
|
motivo: 'runtime.unavailable',
|
|
219
217
|
acao: 'reexecutar',
|
|
220
218
|
automatica: true,
|
|
221
|
-
|
|
222
|
-
correcao: 'ork retry run <thread> redespacha o prompt ja gravado em disco',
|
|
219
|
+
...TEXTOS_DA_POLITICA['runtime.unavailable'],
|
|
223
220
|
},
|
|
224
221
|
'runtime.silencio': {
|
|
225
222
|
motivo: 'runtime.silencio', acao: 'reexecutar', automatica: true,
|
|
226
|
-
|
|
227
|
-
correcao: 'ork retry run <thread> --motivo runtime.silencio',
|
|
223
|
+
...TEXTOS_DA_POLITICA['runtime.silencio'],
|
|
228
224
|
},
|
|
229
225
|
'runtime.rate-limited': {
|
|
230
226
|
motivo: 'runtime.rate-limited',
|
|
231
227
|
acao: 'esperar-janela',
|
|
232
228
|
automatica: true,
|
|
233
|
-
|
|
234
|
-
correcao: 'ork retry list mostra a fila; ork retry resume retoma o que ja liberou',
|
|
229
|
+
...TEXTOS_DA_POLITICA['runtime.rate-limited'],
|
|
235
230
|
},
|
|
236
231
|
// I-33 (D5, D11): a falha e da CONTA. O perfil sai do rodizio e o MESMO prompt vai ao proximo
|
|
237
232
|
// perfil ativo, depois ao runtime de fallback do bloco, e so por ultimo a fila duravel. A
|
|
@@ -241,15 +236,13 @@ exports.POLITICA_DE_RETRY = {
|
|
|
241
236
|
motivo: 'runtime.quota-exhausted',
|
|
242
237
|
acao: 'reexecutar',
|
|
243
238
|
automatica: true,
|
|
244
|
-
|
|
245
|
-
correcao: 'ork accounts list mostra o perfil esgotado; ork retry run <thread> rotaciona o prompt ja gravado',
|
|
239
|
+
...TEXTOS_DA_POLITICA['runtime.quota-exhausted'],
|
|
246
240
|
},
|
|
247
241
|
'runtime.auth-missing': {
|
|
248
242
|
motivo: 'runtime.auth-missing',
|
|
249
243
|
acao: 'reexecutar',
|
|
250
244
|
automatica: true,
|
|
251
|
-
|
|
252
|
-
correcao: 'ork accounts check confere o login de cada perfil; ork retry run <thread> rotaciona o prompt ja gravado',
|
|
245
|
+
...TEXTOS_DA_POLITICA['runtime.auth-missing'],
|
|
253
246
|
},
|
|
254
247
|
// RM-037 (defeitosdeco D-6): o modelo e que falta, nao a conta. Repetir o mesmo modelo na mesma conta
|
|
255
248
|
// so repete a recusa; o perfil continua no rodizio para os outros modelos.
|
|
@@ -257,8 +250,7 @@ exports.POLITICA_DE_RETRY = {
|
|
|
257
250
|
motivo: 'runtime.model-unavailable',
|
|
258
251
|
acao: 'reexecutar',
|
|
259
252
|
automatica: true,
|
|
260
|
-
|
|
261
|
-
correcao: 'ork retry run <thread> troca o destino; sem destino, ork setup <modo> --bloco N --model <modelo acessivel> ou --fallback runtime:modelo',
|
|
253
|
+
...TEXTOS_DA_POLITICA['runtime.model-unavailable'],
|
|
262
254
|
},
|
|
263
255
|
// RM-055: so o dono destrava, no terminal. O retry nao repete o despacho as cegas: confere antes se o
|
|
264
256
|
// impedimento saiu (a confianca do diretorio tem prova local) e, sem prova, deixa o runtime decidir.
|
|
@@ -266,36 +258,31 @@ exports.POLITICA_DE_RETRY = {
|
|
|
266
258
|
motivo: 'runtime.workspace-untrusted',
|
|
267
259
|
acao: 'reexecutar',
|
|
268
260
|
automatica: true,
|
|
269
|
-
|
|
270
|
-
correcao: 'o dono roda o comando da pausa (cd <worktree> && claude, aceita a confianca); ork retry run <thread> re-despacha o prompt ja gravado',
|
|
261
|
+
...TEXTOS_DA_POLITICA['runtime.workspace-untrusted'],
|
|
271
262
|
},
|
|
272
263
|
'runtime.consent-pending': {
|
|
273
264
|
motivo: 'runtime.consent-pending',
|
|
274
265
|
acao: 'reexecutar',
|
|
275
266
|
automatica: true,
|
|
276
|
-
|
|
277
|
-
correcao: 'o dono abre o CLI do runtime e aceita os termos; ork retry run <thread> re-despacha o prompt ja gravado',
|
|
267
|
+
...TEXTOS_DA_POLITICA['runtime.consent-pending'],
|
|
278
268
|
},
|
|
279
269
|
'tree.blocked': {
|
|
280
270
|
motivo: 'tree.blocked',
|
|
281
271
|
acao: 'sincronizar-worktree',
|
|
282
272
|
automatica: true,
|
|
283
|
-
|
|
284
|
-
correcao: 'ork worktree sync <thread> e so entao repetir o passo',
|
|
273
|
+
...TEXTOS_DA_POLITICA['tree.blocked'],
|
|
285
274
|
},
|
|
286
275
|
'lease.resume-unavailable': {
|
|
287
276
|
motivo: 'lease.resume-unavailable',
|
|
288
277
|
acao: 'escalar-humano',
|
|
289
278
|
automatica: false,
|
|
290
|
-
|
|
291
|
-
correcao: 'ork lease release <nome> --forcar; depois repita a aquisicao',
|
|
279
|
+
...TEXTOS_DA_POLITICA['lease.resume-unavailable'],
|
|
292
280
|
},
|
|
293
281
|
'lease.busy': {
|
|
294
282
|
motivo: 'lease.busy',
|
|
295
283
|
acao: 'reexecutar',
|
|
296
284
|
automatica: true,
|
|
297
|
-
|
|
298
|
-
correcao: 'ork lease list mostra a fila; a vez chega sem ninguem forcar',
|
|
285
|
+
...TEXTOS_DA_POLITICA['lease.busy'],
|
|
299
286
|
},
|
|
300
287
|
// I-36 (T6): a vez chega quando a conducao atual terminar. Redespachar agora so recebe a mesma recusa,
|
|
301
288
|
// e passar na frente de quem conduz e exatamente o incidente de 19/09/2026.
|
|
@@ -303,8 +290,7 @@ exports.POLITICA_DE_RETRY = {
|
|
|
303
290
|
motivo: 'conducao.em-andamento',
|
|
304
291
|
acao: 'esperar-janela',
|
|
305
292
|
automatica: true,
|
|
306
|
-
|
|
307
|
-
correcao: 'ork conducao status <thread> mostra quem conduz; repita o pedido com --esperar <min> para seguir sozinho quando liberar',
|
|
293
|
+
...TEXTOS_DA_POLITICA['conducao.em-andamento'],
|
|
308
294
|
},
|
|
309
295
|
// I-41 (D10): formato e defeito de quem escreveu o pedido, e a spec dirigida conserta.
|
|
310
296
|
// Escalar isto para o dono seria pedir que ele revise a sintaxe do robo.
|
|
@@ -312,15 +298,13 @@ exports.POLITICA_DE_RETRY = {
|
|
|
312
298
|
motivo: 'hitl.formato',
|
|
313
299
|
acao: 'corrigir-dirigido',
|
|
314
300
|
automatica: true,
|
|
315
|
-
|
|
316
|
-
correcao: 'ork fix open <thread> abre a rodada com a spec exata do formato',
|
|
301
|
+
...TEXTOS_DA_POLITICA['hitl.formato'],
|
|
317
302
|
},
|
|
318
303
|
'human.pending': {
|
|
319
304
|
motivo: 'human.pending',
|
|
320
305
|
acao: 'escalar-humano',
|
|
321
306
|
automatica: false,
|
|
322
|
-
|
|
323
|
-
correcao: 'ork gate request <thread>',
|
|
307
|
+
...TEXTOS_DA_POLITICA['human.pending'],
|
|
324
308
|
},
|
|
325
309
|
};
|
|
326
310
|
/** A politica de um motivo tipado. */
|
|
@@ -369,7 +353,8 @@ function ultimaReprovacao(raiz, threadId) {
|
|
|
369
353
|
* planejou: planejar nao gasta janela nem toca no repositorio.
|
|
370
354
|
*/
|
|
371
355
|
function tentativasFeitas(raiz, threadId, fase, motivo) {
|
|
372
|
-
|
|
356
|
+
// RM-055 (continuacao, D2): a recusa pelo impedimento do dono fica no ledger com `conta: false` e nao conta.
|
|
357
|
+
return (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId)).filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.retryTentado && e.fase === fase && e.motivo === motivo && e.conta !== false).length;
|
|
373
358
|
}
|
|
374
359
|
/** O bloco de loop desta fase pausa para o humano neste modo? */
|
|
375
360
|
function blocoPausa(thread, fase) {
|
|
@@ -397,7 +382,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
397
382
|
modo: thread.modo,
|
|
398
383
|
fase: opcoes.fase ?? thread.faseAtual,
|
|
399
384
|
motivo: null,
|
|
400
|
-
detalhe:
|
|
385
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.semReprovacao),
|
|
401
386
|
politica: null,
|
|
402
387
|
acao: 'sem-retry',
|
|
403
388
|
tentativas: 0,
|
|
@@ -406,7 +391,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
406
391
|
effortAnterior: effortBase,
|
|
407
392
|
automatica: false,
|
|
408
393
|
bloqueio: 'gate.sem-reprovacao',
|
|
409
|
-
razao:
|
|
394
|
+
razao: (0, locale_1.textoDoCatalogo)((m) => m.retry.nadaARepetir),
|
|
410
395
|
};
|
|
411
396
|
}
|
|
412
397
|
const fase = opcoes.fase ?? (evento ? faseDoEvento(evento, thread) : thread.faseAtual);
|
|
@@ -429,7 +414,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
429
414
|
effortAnterior: effortBase,
|
|
430
415
|
automatica: false,
|
|
431
416
|
bloqueio: 'politica.nao-automatica',
|
|
432
|
-
razao: politica.porque,
|
|
417
|
+
razao: (0, locale_1.textoDoCatalogo)((m) => m.retry.politica[motivo].porque),
|
|
433
418
|
};
|
|
434
419
|
}
|
|
435
420
|
// Limite de escalacao: pausa QUALQUER modo, inclusive #Auto.
|
|
@@ -448,8 +433,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
448
433
|
effortAnterior: effortBase,
|
|
449
434
|
automatica: false,
|
|
450
435
|
bloqueio: 'escalacao.limite',
|
|
451
|
-
razao:
|
|
452
|
-
'do manifesto: escalacao tipada pausa qualquer modo, inclusive #Auto',
|
|
436
|
+
razao: (0, locale_1.textoDoCatalogo)((m) => m.retry.limiteDeEscalacao(tentativas, motivo, fase, limite)),
|
|
453
437
|
};
|
|
454
438
|
}
|
|
455
439
|
// Da 2a tentativa em diante o esforco sobe um degrau, quando o manifesto permite.
|
|
@@ -465,9 +449,10 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
465
449
|
const autorizado = delegacao.permitida || (0, gates_2.aprovacoesHumanas)(raiz, threadId).some(e => e.fase === fase && e.autorizadoPor === opcoes.autorizadoPor);
|
|
466
450
|
let bloqueio = null;
|
|
467
451
|
let automatica = politica.automatica;
|
|
468
|
-
let razao = politica.porque;
|
|
469
|
-
if (delegacao.permitida && politica.automatica)
|
|
470
|
-
razao
|
|
452
|
+
let razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.politica[motivo].porque);
|
|
453
|
+
if (delegacao.permitida && politica.automatica) {
|
|
454
|
+
razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.comDelegacao(m.retry.politica[motivo].porque, delegacao.razao, String(delegacao.delegado), String(delegacao.evidencia)));
|
|
455
|
+
}
|
|
471
456
|
if (!politica.automatica) {
|
|
472
457
|
automatica = false;
|
|
473
458
|
bloqueio = 'politica.nao-automatica';
|
|
@@ -477,10 +462,8 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
477
462
|
// a acao fica planejada e nao executada. `#Maestro` e `#Auto` nao caem neste ramo.
|
|
478
463
|
automatica = false;
|
|
479
464
|
bloqueio = 'modo.bloco-pausa';
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
`(${(0, thread_1.blocoDaThread)(thread, fase).pausaSobre}): a acao ${acao} espera autorizacao humana. ` +
|
|
483
|
-
'O modo afrouxa a pausa, nunca a verificacao.';
|
|
465
|
+
const bloco = (0, thread_1.blocoDaThread)(thread, fase);
|
|
466
|
+
razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.blocoPausa(bloco.fases.join('-'), m.thread.pausaSobre(bloco.pausaSobre), acao));
|
|
484
467
|
}
|
|
485
468
|
if (motivo === 'runtime.silencio') {
|
|
486
469
|
const despacho = ultimoDespachoFalho(raiz, threadId, fase, true);
|
|
@@ -488,7 +471,7 @@ function planejarRetry(carregado, threadId, opcoes = {}) {
|
|
|
488
471
|
if (!prova || prova.sessionId !== despacho?.sessionId || !estadoTerminalDeRetry(prova.estado)) {
|
|
489
472
|
automatica = false;
|
|
490
473
|
bloqueio = 'politica.nao-automatica';
|
|
491
|
-
razao =
|
|
474
|
+
razao = (0, locale_1.textoDoCatalogo)((m) => m.retry.silencioSemProva);
|
|
492
475
|
}
|
|
493
476
|
}
|
|
494
477
|
return {
|
|
@@ -534,24 +517,92 @@ function redespachar(carregado, thread, fase, promptRelativo, sha, opcoes = {})
|
|
|
534
517
|
retida.devolver();
|
|
535
518
|
}
|
|
536
519
|
}
|
|
520
|
+
/**
|
|
521
|
+
* RM-063 (F3): onde esta o prompt gravado. O ledger guarda o caminho relativo a raiz de codigo de quem despachou:
|
|
522
|
+
* da worktree, ele sai `../../../.orkastery/threads/...` (a K7 de 12/10/2026), e lido do checkout principal aponta
|
|
523
|
+
* para fora do projeto. O arquivo certo e o que tem o MESMO sha256: absoluto, relativo a raiz de codigo, a raiz do
|
|
524
|
+
* estado ou a pasta de prompts da thread. Sem nenhum com o sha, vale o primeiro que existe (a recusa diz que o prompt
|
|
525
|
+
* mudou); sem nenhum arquivo comum dentro do projeto, `null` (a recusa diz que sumiu).
|
|
526
|
+
*/
|
|
527
|
+
function localizarPromptGravado(raiz, threadId, promptPath, sha) {
|
|
528
|
+
const candidatos = path.isAbsolute(promptPath) ? [promptPath] : [path.join(raiz, promptPath)];
|
|
529
|
+
try {
|
|
530
|
+
candidatos.push(path.join((0, estado_thread_1.raizDoEstado)(raiz), promptPath));
|
|
531
|
+
}
|
|
532
|
+
catch { /* raiz sem estado legivel */ }
|
|
533
|
+
candidatos.push(path.join((0, thread_1.dirThread)(raiz, threadId), 'prompts', path.basename(promptPath)));
|
|
534
|
+
let thread = null;
|
|
535
|
+
try {
|
|
536
|
+
const t = (0, thread_1.lerThread)(raiz, threadId);
|
|
537
|
+
thread = { id: t.id, worktree: t.worktree };
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
thread = null;
|
|
541
|
+
}
|
|
542
|
+
// O ponteiro vem do estado: so arquivo comum, de tamanho de prompt, dentro do projeto ou da worktree da thread (RM-047).
|
|
543
|
+
const legivel = (c) => {
|
|
544
|
+
try {
|
|
545
|
+
const st = fs.lstatSync(c);
|
|
546
|
+
return st.isFile() && st.size <= exports.TETO_DO_PROMPT_GRAVADO && (0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, c) !== null;
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
const existentes = [...new Set(candidatos.map((c) => path.resolve(c)))].filter(legivel);
|
|
553
|
+
for (const c of existentes) {
|
|
554
|
+
try {
|
|
555
|
+
if ((0, phase_1.hashDoPrompt)(fs.readFileSync(c, 'utf8')) === sha)
|
|
556
|
+
return c;
|
|
557
|
+
}
|
|
558
|
+
catch { /* ilegivel: tenta o proximo */ }
|
|
559
|
+
}
|
|
560
|
+
return existentes[0] ?? null;
|
|
561
|
+
}
|
|
562
|
+
/** Um prompt de fase tem dezenas de KB; acima disto o ponteiro do estado nao e um prompt gravado pelo ork. */
|
|
563
|
+
exports.TETO_DO_PROMPT_GRAVADO = 4 * 1024 * 1024;
|
|
564
|
+
/**
|
|
565
|
+
* RM-063 (F3): o despacho cujo prompt o `reexecutar` devolve ao runtime. Primeiro o despacho da sessao do gate (a
|
|
566
|
+
* sessao que morreu depois de despachada, como a K7 de 12/10/2026, nao deixa `phase_dispatch_failed`), depois o
|
|
567
|
+
* proprio gate quando ele carrega o prompt, e por fim a tentativa mais recente da fase com prompt gravado:
|
|
568
|
+
* `phase_dispatch_failed` ou `phase_prompt_recorded` (e o `phase_dispatch`, no silencio do runtime).
|
|
569
|
+
*/
|
|
570
|
+
function despachoParaRedespachar(eventos, fase, gate, silencio = false) {
|
|
571
|
+
const comPrompt = (e) => !!e && typeof e.promptPath === 'string' && typeof e.promptSha256 === 'string';
|
|
572
|
+
if (gate && typeof gate.sessionId === 'string') {
|
|
573
|
+
const daSessao = eventos.filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada && e.sessionId === gate.sessionId).at(-1);
|
|
574
|
+
if (comPrompt(daSessao))
|
|
575
|
+
return daSessao;
|
|
576
|
+
}
|
|
577
|
+
if (comPrompt(gate))
|
|
578
|
+
return gate;
|
|
579
|
+
for (let i = eventos.length - 1; i >= 0; i--) {
|
|
580
|
+
const e = eventos[i];
|
|
581
|
+
if (e.fase !== fase || !comPrompt(e))
|
|
582
|
+
continue;
|
|
583
|
+
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.despachoFalhou || e.tipo === ledger_1.TIPOS_DE_EVENTO.promptGravado ||
|
|
584
|
+
(silencio && e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada))
|
|
585
|
+
return e;
|
|
586
|
+
}
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
537
589
|
function redespacharSobLock(carregado, thread, fase, promptRelativo, sha, opcoes = {},
|
|
538
590
|
/** A tomada que a primeira passada reteve para a baseline; com ela, esta e a repeticao. */
|
|
539
591
|
tomadaPrevia) {
|
|
540
592
|
const { raiz, manifesto } = carregado;
|
|
541
|
-
const
|
|
542
|
-
|
|
543
|
-
: path.join(raiz, promptRelativo);
|
|
593
|
+
const achado = localizarPromptGravado(raiz, thread.id, promptRelativo, sha);
|
|
594
|
+
const absoluto = achado ?? '';
|
|
544
595
|
const slug = opcoes.slug ?? (0, phase_1.slugDaSessao)(thread, fase);
|
|
545
596
|
const vazio = { slug, sessionId: null, verificada: false, sinal: null, comando: [] };
|
|
546
597
|
const erroDeEstado = (0, phase_1.estadoParaDespacho)(raiz, thread, opcoes.dryRun);
|
|
547
598
|
if (erroDeEstado)
|
|
548
599
|
return { ...vazio, ok: false, motivo: 'tree.blocked', detalhe: erroDeEstado, dryRun: opcoes.dryRun === true };
|
|
549
|
-
if (!
|
|
600
|
+
if (!achado) {
|
|
550
601
|
return {
|
|
551
602
|
...vazio,
|
|
552
603
|
ok: false,
|
|
553
604
|
motivo: 'artifact.missing',
|
|
554
|
-
detalhe:
|
|
605
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.promptSumiu(promptRelativo)),
|
|
555
606
|
dryRun: opcoes.dryRun === true,
|
|
556
607
|
};
|
|
557
608
|
}
|
|
@@ -562,8 +613,7 @@ tomadaPrevia) {
|
|
|
562
613
|
...vazio,
|
|
563
614
|
ok: false,
|
|
564
615
|
motivo: 'artifact.missing',
|
|
565
|
-
detalhe:
|
|
566
|
-
`(sha256 ${shaAtual.slice(0, 12)} != ${sha.slice(0, 12)}): retomada e redespachar o MESMO texto`,
|
|
616
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.promptMudou(promptRelativo, shaAtual.slice(0, 12), sha.slice(0, 12))),
|
|
567
617
|
dryRun: opcoes.dryRun === true,
|
|
568
618
|
};
|
|
569
619
|
}
|
|
@@ -611,8 +661,9 @@ tomadaPrevia) {
|
|
|
611
661
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, ledger_1.TIPOS_DE_EVENTO.despachoIdempotente, { fase, promptSha256: sha, canal,
|
|
612
662
|
sessionId: tomada.atual.sessao, origem: opcoes.origem ?? 'retry',
|
|
613
663
|
razao: 'mesma fase e mesmo prompt de quem ja conduz: a sessao em andamento atende a retomada, sem sessao nova' });
|
|
664
|
+
const sessao = String(tomada.atual.sessao).slice(0, 8);
|
|
614
665
|
return { ...vazio, ok: true, sessionId: tomada.atual.sessao, motivo: null, dryRun: false,
|
|
615
|
-
detalhe:
|
|
666
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.jaConduz(sessao, fase)) };
|
|
616
667
|
}
|
|
617
668
|
const recusa = (0, conducao_1.recusaDeConducao)(thread.id, tomada.atual, pedidoDeConducao);
|
|
618
669
|
(0, conducao_1.registrarRecusa)(raiz, recusa);
|
|
@@ -621,7 +672,14 @@ tomadaPrevia) {
|
|
|
621
672
|
conducao = tomada;
|
|
622
673
|
}
|
|
623
674
|
try {
|
|
624
|
-
|
|
675
|
+
// RM-047 (P2): o cwd do pedido da fila ou da worktree da thread so vale como worktree registrada no git.
|
|
676
|
+
let cwd;
|
|
677
|
+
try {
|
|
678
|
+
cwd = opcoes.cwd !== undefined ? (0, procedencia_1.exigirCwdLocal)(raiz, thread.id, opcoes.cwd, 'fila') : (0, procedencia_1.diretorioDaThread)(raiz, thread);
|
|
679
|
+
}
|
|
680
|
+
catch (e) {
|
|
681
|
+
return { ...vazio, ok: false, motivo: 'tree.blocked', detalhe: e.message, dryRun: opcoes.dryRun === true };
|
|
682
|
+
}
|
|
625
683
|
// Mesma resolucao do `ork phase run`: a retomada carimba no ledger o trio que ela de
|
|
626
684
|
// fato despachou, inclusive quando o pedido da fila trazia um modelo proprio. O setup
|
|
627
685
|
// do bloco (feature #setup) vale aqui tambem: a fase retomada abre no MESMO runtime
|
|
@@ -633,11 +691,20 @@ tomadaPrevia) {
|
|
|
633
691
|
effort: opcoes.effort ?? undefined,
|
|
634
692
|
}, doBloco);
|
|
635
693
|
const rt = (0, runtimes_1.resolverRuntime)(runtime);
|
|
694
|
+
// RM-047 (P1): a retomada recusa o sandbox afrouxado sem a confirmacao local, como o `ork phase run`.
|
|
695
|
+
const erroDePostura = (0, postura_local_1.recusaDePostura)(raiz, manifesto, runtime);
|
|
696
|
+
if (erroDePostura) {
|
|
697
|
+
if (!opcoes.dryRun)
|
|
698
|
+
(0, gates_1.registrarGateBloqueado)((0, thread_1.dirThread)(raiz, thread.id), thread.id, { gate: 'phase.dispatch',
|
|
699
|
+
motivo: 'policy.violation', modo: thread.modo, detalhe: erroDePostura,
|
|
700
|
+
correcao: (0, postura_local_1.comandoDeConfirmacao)((0, postura_local_1.posturaAfrouxada)(manifesto) ?? ''), fase, slug, origem: opcoes.origem ?? 'retry' });
|
|
701
|
+
return { ...vazio, ok: false, motivo: 'policy.violation', detalhe: erroDePostura, dryRun: opcoes.dryRun === true };
|
|
702
|
+
}
|
|
636
703
|
if (!opcoes.dryRun && (0, phase_1.baselineDoDespachoNecessaria)(carregado, thread.id, { fase, prompt: '', runtime, model, effort })) {
|
|
637
704
|
// Na primeira passada a tomada fica retida para a baseline (o `finally` nao a solta); na repeticao, o
|
|
638
705
|
// `finally` devolve o que a tomada consumiu (A-1 do CHECK 3).
|
|
639
706
|
const pendente = { ...vazio, ok: false, motivo: 'runtime.unavailable', dryRun: false,
|
|
640
|
-
detalhe:
|
|
707
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.baselinePendente(runtime)) };
|
|
641
708
|
if (!tomadaPrevia && conducao) {
|
|
642
709
|
pendente.retida = conducao;
|
|
643
710
|
conducao = null;
|
|
@@ -653,8 +720,9 @@ tomadaPrevia) {
|
|
|
653
720
|
contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
|
|
654
721
|
}
|
|
655
722
|
catch (e) {
|
|
723
|
+
const erro = e.message;
|
|
656
724
|
return { ...vazio, ok: false, motivo: 'runtime.unavailable',
|
|
657
|
-
detalhe:
|
|
725
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeIndisponivel(erro)), dryRun: opcoes.dryRun === true };
|
|
658
726
|
}
|
|
659
727
|
if (contextoRuntime)
|
|
660
728
|
contextoRuntime.identidade = identidade;
|
|
@@ -700,7 +768,7 @@ tomadaPrevia) {
|
|
|
700
768
|
sessionId: null,
|
|
701
769
|
verificada: false,
|
|
702
770
|
motivo: null,
|
|
703
|
-
detalhe:
|
|
771
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.ensaioDoRedespacho),
|
|
704
772
|
sinal: null,
|
|
705
773
|
comando: resultado.comando,
|
|
706
774
|
dryRun: true,
|
|
@@ -736,7 +804,7 @@ tomadaPrevia) {
|
|
|
736
804
|
verificada: false,
|
|
737
805
|
// I-33 (D11b): falha de conta reconhecida na saida e o motivo mais especifico.
|
|
738
806
|
motivo: resultado.falhaDeConta?.motivo ?? (sinal ? 'runtime.rate-limited' : 'runtime.unavailable'),
|
|
739
|
-
detalhe: resultado.erro ??
|
|
807
|
+
detalhe: resultado.erro ?? (0, locale_1.textoDoCatalogo)((m) => m.retry.semSessionId),
|
|
740
808
|
sinal,
|
|
741
809
|
falhaDeConta: resultado.falhaDeConta ?? null,
|
|
742
810
|
perfil: perfil ?? null,
|
|
@@ -771,8 +839,7 @@ tomadaPrevia) {
|
|
|
771
839
|
sessionId: resultado.sessionId,
|
|
772
840
|
verificada: resultado.verificada,
|
|
773
841
|
motivo: null,
|
|
774
|
-
detalhe:
|
|
775
|
-
(perfil ? ` no perfil ${perfil.id} (${runtime})` : ''),
|
|
842
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.redespachada(String(resultado.sessionId), sha.slice(0, 12), perfil ? perfil.id : null, runtime)),
|
|
776
843
|
sinal: null,
|
|
777
844
|
perfil: perfil ?? null,
|
|
778
845
|
comando: resultado.comando,
|
|
@@ -1119,7 +1186,11 @@ function producaoNoIntervalo(raiz, thread, sessao, eventos) {
|
|
|
1119
1186
|
// pelo shell nao passa pelo ledger, entao so o HEAD o revela.
|
|
1120
1187
|
const registro = eventos.filter(e => e.tipo === 'session_sensor_registered' && e.sessionId === sessao.sessionId &&
|
|
1121
1188
|
e.despachoEm === sessao.despachadaEm).at(-1);
|
|
1122
|
-
const
|
|
1189
|
+
const doLedger = typeof registro?.cwd === 'string' ? registro.cwd : typeof despacho?.cwd === 'string' ? despacho.cwd : null;
|
|
1190
|
+
// RM-047 (P2): git so roda em worktree registrada; cwd que nao vale e duvida, e duvida conta como producao.
|
|
1191
|
+
const cwd = doLedger !== null ? (0, procedencia_1.cwdLocalOuNulo)(raiz, thread.id, doLedger, 'ledger') : (0, procedencia_1.cwdLocalOuNulo)(raiz, thread.id, thread.worktree ?? raiz, 'thread');
|
|
1192
|
+
if (cwd === null)
|
|
1193
|
+
return { produziu: true, evidencia: 'cwd do despacho fora das worktrees registradas; producao nao descartada' };
|
|
1123
1194
|
const head = registro?.head;
|
|
1124
1195
|
if (typeof head !== 'string' || !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(head))
|
|
1125
1196
|
return { produziu: true, evidencia: 'HEAD da worktree no despacho desconhecido; producao nao descartada' };
|
|
@@ -1263,7 +1334,7 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1263
1334
|
return vazio;
|
|
1264
1335
|
}
|
|
1265
1336
|
const acaoBase = plano.politica?.acao ?? plano.acao;
|
|
1266
|
-
const registrarTentativa = (ok, detalhe) => {
|
|
1337
|
+
const registrarTentativa = (ok, detalhe, extra = {}) => {
|
|
1267
1338
|
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.retryTentado, {
|
|
1268
1339
|
fase: plano.fase,
|
|
1269
1340
|
motivo: plano.motivo,
|
|
@@ -1281,32 +1352,27 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1281
1352
|
: `politica de retry do bloco B3 (bloco sem pausa no modo ${thread.modo})`,
|
|
1282
1353
|
ok,
|
|
1283
1354
|
detalhe,
|
|
1355
|
+
...extra,
|
|
1284
1356
|
});
|
|
1285
1357
|
};
|
|
1286
1358
|
// I-36 (T6): conducao em andamento nao e fila de rate limit. Nada e redespachado; o registro diz
|
|
1287
1359
|
// quem conduz, e a vez chega quando essa conducao terminar.
|
|
1288
1360
|
if (plano.motivo === 'conducao.em-andamento') {
|
|
1289
1361
|
const atual = (0, conducao_1.conducaoDaThread)(raiz, threadId);
|
|
1290
|
-
const detalhe = atual
|
|
1291
|
-
? `${(0, conducao_texto_1.linhaDeConducao)(atual)}; nada foi redespachado, a vez chega quando essa conducao terminar`
|
|
1292
|
-
: 'ninguem conduz a thread agora: o proximo pedido segue normalmente';
|
|
1362
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => atual ? m.retry.conduzidaAgora((0, conducao_texto_1.linhaDeConducao)(atual)) : m.retry.ninguemConduz);
|
|
1293
1363
|
registrarTentativa(!atual, detalhe);
|
|
1294
1364
|
return { ...vazio, executada: false, detalhe };
|
|
1295
1365
|
}
|
|
1296
1366
|
// `esperar-janela`: quem retoma e a fila, e ela ja esta gravada em disco.
|
|
1297
1367
|
if (acaoBase === 'esperar-janela') {
|
|
1298
1368
|
const fila = (0, ratelimit_1.lerFilaDeRetomada)(raiz).filter((p) => p.thread === threadId && p.estado === 'aguardando');
|
|
1299
|
-
const detalhe = fila.length > 0
|
|
1300
|
-
? `${fila.length} pedido(s) na fila duravel; o proximo libera em ${fila[0].liberaEm}`
|
|
1301
|
-
: 'nenhum pedido aguardando na fila para esta thread';
|
|
1369
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => fila.length > 0 ? m.retry.naFila(fila.length, fila[0].liberaEm) : m.retry.filaVazia);
|
|
1302
1370
|
registrarTentativa(fila.length > 0, detalhe);
|
|
1303
1371
|
return { ...vazio, executada: fila.length > 0, fila, detalhe };
|
|
1304
1372
|
}
|
|
1305
1373
|
if (acaoBase === 'sincronizar-worktree') {
|
|
1306
1374
|
const sync = (0, worktree_1.sincronizarWorktree)(carregado, threadId, { dryRun: opcoes.dryRun });
|
|
1307
|
-
const detalhe = sync.ok
|
|
1308
|
-
? `worktree sincronizada com a base (${sync.passos.join('; ')})`
|
|
1309
|
-
: `sincronizacao nao concluiu: ${sync.detalhe}`;
|
|
1375
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => sync.ok ? m.retry.sincronizada(sync.passos.join('; ')) : m.retry.sincronizacaoFalhou(sync.detalhe));
|
|
1310
1376
|
registrarTentativa(sync.ok, detalhe);
|
|
1311
1377
|
return { ...vazio, executada: sync.ok, sync, detalhe };
|
|
1312
1378
|
}
|
|
@@ -1315,10 +1381,8 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1315
1381
|
const reverify = opcoes.reverify && rodada.correcoes.length > 0
|
|
1316
1382
|
? (0, fix_1.reverificar)(carregado, threadId, { rodada: rodada.rodada })
|
|
1317
1383
|
: null;
|
|
1318
|
-
const detalhe = rodada.correcoes.length === 0
|
|
1319
|
-
|
|
1320
|
-
: `${rodada.correcoes.length} correcao(oes) na rodada ${rodada.rodada}` +
|
|
1321
|
-
(reverify ? `; CHECK-REVERIFY: ${reverify.veredito}` : '');
|
|
1384
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => rodada.correcoes.length === 0 ? m.retry.checkPassou
|
|
1385
|
+
: m.retry.correcoesNaRodada(rodada.correcoes.length, rodada.rodada, reverify ? m.retry.vereditos[reverify.veredito] ?? reverify.veredito : null));
|
|
1322
1386
|
registrarTentativa(rodada.correcoes.length > 0, detalhe);
|
|
1323
1387
|
return { ...vazio, executada: rodada.correcoes.length > 0, rodada, reverify, detalhe };
|
|
1324
1388
|
}
|
|
@@ -1328,11 +1392,14 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1328
1392
|
if (plano.motivo === 'runtime.model-unavailable') {
|
|
1329
1393
|
return trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registrarTentativa);
|
|
1330
1394
|
}
|
|
1331
|
-
// `reexecutar` e `escalar-esforco`: o MESMO prompt volta ao runtime.
|
|
1332
|
-
|
|
1395
|
+
// `reexecutar` e `escalar-esforco`: o MESMO prompt volta ao runtime. RM-063 (F3): o gate que o plano leu diz de que
|
|
1396
|
+
// despacho e o prompt; sem ele, a tentativa mais recente da fase com prompt gravado.
|
|
1397
|
+
const reprovacao = ultimaReprovacao(raiz, threadId);
|
|
1398
|
+
const gateDoPlano = reprovacao && reprovacao.motivo === plano.motivo && faseDoEvento(reprovacao, thread) === plano.fase
|
|
1399
|
+
? reprovacao : null;
|
|
1400
|
+
const falho = despachoParaRedespachar((0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId)), plano.fase, gateDoPlano, plano.motivo === 'runtime.silencio');
|
|
1333
1401
|
if (!falho || typeof falho.promptPath !== 'string' || typeof falho.promptSha256 !== 'string') {
|
|
1334
|
-
const detalhe =
|
|
1335
|
-
`rode a fase de novo com \`ork phase run ${threadId} ${plano.fase} --prompt "..."\``;
|
|
1402
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.semDespachoFalho(plano.fase, threadId));
|
|
1336
1403
|
registrarTentativa(false, detalhe);
|
|
1337
1404
|
return { ...vazio, detalhe };
|
|
1338
1405
|
}
|
|
@@ -1343,11 +1410,23 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1343
1410
|
const resolvido = (0, impedimento_1.impedimentoResolvido)(plano.motivo, { cwd: falho.cwd,
|
|
1344
1411
|
runtime: typeof falho.runtime === 'string' ? falho.runtime : '', configDir: perfilFalho?.configDir ?? null });
|
|
1345
1412
|
if (resolvido === false) {
|
|
1346
|
-
const
|
|
1347
|
-
|
|
1413
|
+
const motivo = plano.motivo, cwd = falho.cwd;
|
|
1414
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.semConfianca(motivo, cwd, threadId));
|
|
1348
1415
|
return { ...vazio, detalhe };
|
|
1349
1416
|
}
|
|
1350
1417
|
}
|
|
1418
|
+
// RM-063 (F3, GO-FIX): antes de devolver o prompt ao runtime, a prova de que nenhuma sessao viva trabalha na thread. O
|
|
1419
|
+
// despacho que falhou depois de abrir a sessao (o `claude --bg` lento) e o adaptador que lanca deixariam duas sessoes
|
|
1420
|
+
// na mesma worktree. Sem a prova, nada e redespachado, e a tentativa nao conta.
|
|
1421
|
+
const ids = [falho.sessionId, gateDoPlano?.sessionId].filter((x) => typeof x === 'string' && !!x);
|
|
1422
|
+
const viva = (0, vida_da_thread_1.sessaoVivaNaThread)(raiz, thread, ids);
|
|
1423
|
+
if (!viva.respondeu || viva.sessionId) {
|
|
1424
|
+
const { sessionId: sessao, detalhe: falhaDaConsulta } = viva;
|
|
1425
|
+
const detalhe = sessao ? (0, locale_1.textoDoCatalogo)((m) => m.retry.sessaoAindaViva(sessao.slice(0, 8), threadId))
|
|
1426
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeSemProva(falhaDaConsulta ?? '', threadId));
|
|
1427
|
+
registrarTentativa(false, detalhe, { conta: false });
|
|
1428
|
+
return { ...vazio, detalhe };
|
|
1429
|
+
}
|
|
1351
1430
|
const redespacho = redespachar(carregado, thread, plano.fase, falho.promptPath, falho.promptSha256, {
|
|
1352
1431
|
effort: plano.effort,
|
|
1353
1432
|
runtime: typeof falho.runtime === 'string' ? falho.runtime : null,
|
|
@@ -1355,7 +1434,11 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1355
1434
|
origem: 'retry.run',
|
|
1356
1435
|
dryRun: opcoes.dryRun,
|
|
1357
1436
|
});
|
|
1358
|
-
|
|
1437
|
+
// RM-055 (continuacao, D2): o runtime recusou o redespacho por um motivo que so o dono resolve. Nada rodou
|
|
1438
|
+
// e a espera do dono voltou com o mesmo comando: a recusa fica no ledger, mas nao gasta tentativa nem sobe
|
|
1439
|
+
// esforco. Contada, a quarta chamada escalava e o retry nunca mais re-despachava, nem depois do aceite.
|
|
1440
|
+
const recusaDoDono = !redespacho.ok && (0, impedimento_1.ehImpedimentoDoDono)(redespacho.motivo);
|
|
1441
|
+
registrarTentativa(redespacho.ok, redespacho.detalhe, recusaDoDono ? { conta: false } : {});
|
|
1359
1442
|
return {
|
|
1360
1443
|
...vazio,
|
|
1361
1444
|
executada: redespacho.ok,
|
|
@@ -1388,7 +1471,7 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
|
|
|
1388
1471
|
return { ...vazio, detalhe: diagnostico };
|
|
1389
1472
|
};
|
|
1390
1473
|
if (!despacho || typeof despacho.promptPath !== 'string' || typeof despacho.promptSha256 !== 'string') {
|
|
1391
|
-
const detalhe =
|
|
1474
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.semDespachoComPrompt(motivo, fase));
|
|
1392
1475
|
registrarTentativa(false, detalhe);
|
|
1393
1476
|
return { ...vazio, detalhe };
|
|
1394
1477
|
}
|
|
@@ -1400,14 +1483,14 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
|
|
|
1400
1483
|
: perfilDoEvento(despacho);
|
|
1401
1484
|
}
|
|
1402
1485
|
catch (e) {
|
|
1403
|
-
|
|
1486
|
+
const erro = e.message;
|
|
1487
|
+
return escalar('perfil registrado invalido', (0, locale_1.textoDoCatalogo)((m) => m.retry.rotacaoRecusada(erro)));
|
|
1404
1488
|
}
|
|
1405
1489
|
// D11 (c): sessao que morreu por cota depois de produzir nao e redespachada.
|
|
1406
1490
|
if (typeof gate?.sessionId === 'string' && typeof gate.despachoEm === 'string') {
|
|
1407
1491
|
const producao = producaoNoIntervalo(raiz, thread, { sessionId: gate.sessionId, fase, despachadaEm: gate.despachoEm }, eventos);
|
|
1408
1492
|
if (producao.produziu) {
|
|
1409
|
-
return escalar('producao parcial sob falha da conta',
|
|
1410
|
-
'a sessao nao e redespachada sobre a worktree alterada e a fase nao conclui sem o humano');
|
|
1493
|
+
return escalar('producao parcial sob falha da conta', (0, locale_1.textoDoCatalogo)((m) => m.retry.producaoParcialConta(motivo === 'runtime.quota-exhausted', String(producao.evidencia))));
|
|
1411
1494
|
}
|
|
1412
1495
|
}
|
|
1413
1496
|
const doBloco = (0, setup_1.configDoBloco)((0, setup_1.lerSetup)(raiz), thread.modo, fase);
|
|
@@ -1465,8 +1548,8 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
|
|
|
1465
1548
|
if (ultimo.falhaDeConta?.motivo !== 'runtime.model-unavailable')
|
|
1466
1549
|
falhaAtual = ultimo.falhaDeConta ?? falhaAtual;
|
|
1467
1550
|
if (tentativas >= plano.limite) {
|
|
1468
|
-
|
|
1469
|
-
|
|
1551
|
+
const feitas = tentativas;
|
|
1552
|
+
return escalar('limite de tentativas na rotacao', (0, locale_1.textoDoCatalogo)((m) => m.retry.limiteDaRotacao(feitas, motivo, fase, plano.limite)));
|
|
1470
1553
|
}
|
|
1471
1554
|
}
|
|
1472
1555
|
// Sem destino: a fila so faz sentido quando algum perfil tem prazo para voltar. Sem perfil (ambiente do
|
|
@@ -1476,13 +1559,12 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
|
|
|
1476
1559
|
const prazo = (0, runtime_profiles_1.prazoDaFila)((0, runtime_profiles_1.lerPerfisComContas)(raiz), runtimes, politica) ?? dito;
|
|
1477
1560
|
if (!prazo && falhaAtual.motivo === 'runtime.auth-missing') {
|
|
1478
1561
|
emitir(null, 'nenhum perfil com login em nenhum runtime da ordem de fallback');
|
|
1479
|
-
return escalar('auth ausente sem alternativa',
|
|
1480
|
-
'refaca o login com ork accounts add ou ork accounts check antes de retomar');
|
|
1562
|
+
return escalar('auth ausente sem alternativa', (0, locale_1.textoDoCatalogo)((m) => m.retry.semLogin));
|
|
1481
1563
|
}
|
|
1482
1564
|
const liberaEm = prazo ?? new Date(Date.now() + (0, ratelimit_1.janelaPadraoMs)(manifesto)).toISOString();
|
|
1483
1565
|
emitir(null, `nenhum perfil ativo em ${runtimes.join(', ')}: fila duravel ate ${liberaEm}`);
|
|
1484
1566
|
if (opcoes.dryRun)
|
|
1485
|
-
return { ...vazio, detalhe:
|
|
1567
|
+
return { ...vazio, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.entrariaNaFila(liberaEm)) };
|
|
1486
1568
|
const pedido = (0, ratelimit_1.enfileirar)(carregado, { thread: thread.id, fase, slug: typeof despacho.slug === 'string' ? despacho.slug : (0, phase_1.slugDaSessao)(thread, fase),
|
|
1487
1569
|
promptPath: despacho.promptPath, promptSha256: despacho.promptSha256,
|
|
1488
1570
|
cwd: typeof despacho.cwd === 'string' ? despacho.cwd : thread.worktree ?? raiz,
|
|
@@ -1493,7 +1575,7 @@ function rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTenta
|
|
|
1493
1575
|
janelaEstimada: pedido.janelaEstimada, motivo: falhaAtual.motivo, promptSha256: despacho.promptSha256,
|
|
1494
1576
|
correcao: `ork retry resume (ou aguarde ate ${pedido.liberaEm})` });
|
|
1495
1577
|
registrarTentativa(true, `fila duravel: pedido ${pedido.id} libera em ${pedido.liberaEm}`);
|
|
1496
|
-
return { ...vazio, executada: true, fila: [pedido], redespacho: ultimo, detalhe:
|
|
1578
|
+
return { ...vazio, executada: true, fila: [pedido], redespacho: ultimo, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.pedidoAte(pedido.id, pedido.liberaEm)) };
|
|
1497
1579
|
}
|
|
1498
1580
|
/** RM-037 (defeitosdeco D-6): chave de um destino (runtime, perfil, modelo) que recusou o modelo. */
|
|
1499
1581
|
function chaveDoModelo(runtime, perfil, model) {
|
|
@@ -1561,10 +1643,10 @@ function proximoDestinoDoModelo(raiz, runtime, model, fallback, recusados) {
|
|
|
1561
1643
|
return null;
|
|
1562
1644
|
}
|
|
1563
1645
|
/** D-6: a correcao exata quando nenhum destino tem o modelo: o bloco do setup que conduz a fase. */
|
|
1564
|
-
function correcaoDoModelo(thread, fase) {
|
|
1646
|
+
function correcaoDoModelo(thread, fase, m = (0, locale_1.msg)()) {
|
|
1565
1647
|
const indice = modos_1.MODOS[thread.modo]?.blocos.findIndex(b => b.fases.includes(fase)) ?? -1;
|
|
1566
1648
|
const bloco = indice >= 0 ? String(indice + 1) : 'N';
|
|
1567
|
-
return
|
|
1649
|
+
return m.retry.correcaoDoModelo(thread.modo, bloco);
|
|
1568
1650
|
}
|
|
1569
1651
|
/**
|
|
1570
1652
|
* RM-037 (defeitosdeco D-6): troca de destino depois de `runtime.model-unavailable`. O modelo pedido nao
|
|
@@ -1591,13 +1673,12 @@ function trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registra
|
|
|
1591
1673
|
return { ...vazio, detalhe: diagnostico };
|
|
1592
1674
|
};
|
|
1593
1675
|
if (!despacho || typeof despacho.promptPath !== 'string' || typeof despacho.promptSha256 !== 'string') {
|
|
1594
|
-
const detalhe =
|
|
1676
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.semDespachoComPrompt(motivo, fase));
|
|
1595
1677
|
registrarTentativa(false, detalhe);
|
|
1596
1678
|
return { ...vazio, detalhe };
|
|
1597
1679
|
}
|
|
1598
1680
|
const runtime = typeof despacho.runtime === 'string' ? despacho.runtime : manifesto.runtime.adapter;
|
|
1599
1681
|
const model = typeof despacho.model === 'string' ? despacho.model : null;
|
|
1600
|
-
const rotulo = model ?? '(padrao do runtime)';
|
|
1601
1682
|
let perfil;
|
|
1602
1683
|
try {
|
|
1603
1684
|
perfil = typeof gate?.sessionId === 'string'
|
|
@@ -1605,13 +1686,13 @@ function trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registra
|
|
|
1605
1686
|
: perfilDoEvento(despacho);
|
|
1606
1687
|
}
|
|
1607
1688
|
catch (e) {
|
|
1608
|
-
|
|
1689
|
+
const erro = e.message;
|
|
1690
|
+
return escalar('perfil registrado invalido', (0, locale_1.textoDoCatalogo)((m) => m.retry.trocaRecusada(erro)));
|
|
1609
1691
|
}
|
|
1610
1692
|
if (typeof gate?.sessionId === 'string' && typeof gate.despachoEm === 'string') {
|
|
1611
1693
|
const producao = producaoNoIntervalo(raiz, thread, { sessionId: gate.sessionId, fase, despachadaEm: gate.despachoEm }, eventos);
|
|
1612
1694
|
if (producao.produziu) {
|
|
1613
|
-
return escalar('producao parcial com modelo inacessivel',
|
|
1614
|
-
'a sessao nao e redespachada sobre a worktree alterada e a fase nao conclui sem o humano');
|
|
1695
|
+
return escalar('producao parcial com modelo inacessivel', (0, locale_1.textoDoCatalogo)((m) => m.retry.producaoParcialModelo(model ?? m.retry.padraoDoRuntime, String(producao.evidencia))));
|
|
1615
1696
|
}
|
|
1616
1697
|
}
|
|
1617
1698
|
const recusados = new Set([...destinosQueRecusaramOModelo(eventos, fase), chaveDoModelo(runtime, perfil?.id ?? null, model)]);
|
|
@@ -1637,8 +1718,7 @@ function trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registra
|
|
|
1637
1718
|
origem: 'retry.modelo', dryRun: opcoes.dryRun,
|
|
1638
1719
|
});
|
|
1639
1720
|
if (opcoes.dryRun)
|
|
1640
|
-
return { ...vazio, redespacho: r, detalhe:
|
|
1641
|
-
`${alvo.perfil ? ` (perfil ${alvo.perfil.id})` : ''} com o modelo ${alvo.model ?? '(padrao do runtime)'}; ${r.detalhe}` };
|
|
1721
|
+
return { ...vazio, redespacho: r, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.ensaioDoModelo(alvo.runtime, alvo.perfil ? alvo.perfil.id : null, alvo.model ?? m.retry.padraoDoRuntime, (0, locale_1.remontar)(r.detalhe))) };
|
|
1642
1722
|
registrarTentativa(r.ok, r.detalhe);
|
|
1643
1723
|
tentativas += 1;
|
|
1644
1724
|
if (r.ok)
|
|
@@ -1649,58 +1729,62 @@ function trocarDestinoDoModelo(carregado, thread, plano, opcoes, vazio, registra
|
|
|
1649
1729
|
recusados.add(chaveDoModelo(alvo.runtime, alvo.perfil?.id ?? null, alvo.model));
|
|
1650
1730
|
atual = { runtime: alvo.runtime, perfil: alvo.perfil, model: alvo.model };
|
|
1651
1731
|
if (tentativas >= plano.limite) {
|
|
1652
|
-
|
|
1653
|
-
|
|
1732
|
+
const feitas = tentativas;
|
|
1733
|
+
return escalar('limite de tentativas na troca de modelo', (0, locale_1.textoDoCatalogo)((m) => m.retry.limiteDaTroca(feitas, motivo, fase, plano.limite)));
|
|
1654
1734
|
}
|
|
1655
1735
|
}
|
|
1656
1736
|
const tentados = [...recusados].map(k => { const [rt, p, m] = k.split('|'); return `${rt}${p ? `/${p}` : ''}:${m || '(padrao)'}`; });
|
|
1657
|
-
return escalar('modelo inacessivel sem outro destino',
|
|
1658
|
-
`nao tem outro destino: ${correcaoDoModelo(thread, fase)}`);
|
|
1737
|
+
return escalar('modelo inacessivel sem outro destino', (0, locale_1.textoDoCatalogo)((m) => m.retry.modeloSemDestino(model ?? m.retry.padraoDoRuntime, tentados.join(', '), correcaoDoModelo(thread, fase, m))));
|
|
1659
1738
|
}
|
|
1660
1739
|
/** Texto de `ork retry plan`. */
|
|
1661
1740
|
function textoDoPlano(p) {
|
|
1741
|
+
// RM-061 (F2b, G2): a razao e o detalhe que este processo montou saem remontados no locale; o detalhe lido
|
|
1742
|
+
// do ledger (gravado por outro processo) e a politica pelo motivo saem como o catalogo os traz.
|
|
1743
|
+
const m = (0, locale_1.msg)().retry;
|
|
1662
1744
|
const linhas = [];
|
|
1663
|
-
linhas.push(
|
|
1664
|
-
linhas.push(
|
|
1665
|
-
linhas.push(
|
|
1666
|
-
linhas.push(
|
|
1745
|
+
linhas.push(m.titulo(p.thread));
|
|
1746
|
+
linhas.push(m.modo(p.modo));
|
|
1747
|
+
linhas.push(m.fase(p.fase));
|
|
1748
|
+
linhas.push(m.motivo(p.motivo));
|
|
1749
|
+
const detalhe = (0, locale_1.remontar)(p.detalhe);
|
|
1667
1750
|
if (p.detalhe)
|
|
1668
|
-
linhas.push(
|
|
1669
|
-
linhas.push(
|
|
1670
|
-
linhas.push(
|
|
1671
|
-
linhas.push(
|
|
1672
|
-
linhas.push(
|
|
1751
|
+
linhas.push(m.detalhe((0, horario_1.localizarTexto)(detalhe)));
|
|
1752
|
+
linhas.push(m.acao(p.acao));
|
|
1753
|
+
linhas.push(m.tentativas(p.tentativas, p.limite));
|
|
1754
|
+
linhas.push(m.esforco(p.effort, p.effort !== p.effortAnterior ? p.effortAnterior : null));
|
|
1755
|
+
linhas.push(m.automatica(p.automatica));
|
|
1673
1756
|
if (p.bloqueio)
|
|
1674
|
-
linhas.push(
|
|
1675
|
-
linhas.push(
|
|
1757
|
+
linhas.push(m.bloqueio(p.bloqueio));
|
|
1758
|
+
linhas.push(m.razao((0, locale_1.remontar)(p.razao)));
|
|
1676
1759
|
if (p.politica && !p.automatica)
|
|
1677
|
-
linhas.push(
|
|
1678
|
-
if (p.detalhe && (0, horario_1.localizarTexto)(
|
|
1760
|
+
linhas.push(m.correcao(p.motivo ? m.politica[p.motivo].correcao : p.politica.correcao));
|
|
1761
|
+
if (p.detalhe && (0, horario_1.localizarTexto)(detalhe) !== detalhe)
|
|
1679
1762
|
linhas.push((0, horario_1.legendaDoFuso)());
|
|
1680
1763
|
return linhas.join('\n');
|
|
1681
1764
|
}
|
|
1682
1765
|
/** Texto de `ork retry run`. */
|
|
1683
1766
|
function textoDoRetry(r) {
|
|
1767
|
+
const m = (0, locale_1.msg)().retry;
|
|
1684
1768
|
const plano = textoDoPlano(r.plano);
|
|
1685
1769
|
const linhas = [plano, ''];
|
|
1686
|
-
|
|
1687
|
-
linhas.push(
|
|
1770
|
+
const detalhe = (0, locale_1.remontar)(r.detalhe);
|
|
1771
|
+
linhas.push(m.execucao(r.executada));
|
|
1772
|
+
linhas.push(m.linhaDoDetalhe((0, horario_1.localizarTexto)(detalhe)));
|
|
1688
1773
|
if (r.rodada && r.rodada.correcoes.length > 0) {
|
|
1689
1774
|
linhas.push('');
|
|
1690
|
-
linhas.push(
|
|
1691
|
-
r.rodada.correcoes.map((c) => `${c.id} (tipo ${c.tipo}, ${c.origem})`).join(', '));
|
|
1775
|
+
linhas.push(m.rodada(r.rodada.rodada, r.rodada.correcoes.map((c) => m.correcaoDaRodada(c.id, c.tipo, c.origem)).join(', ')));
|
|
1692
1776
|
}
|
|
1693
1777
|
if (r.reverify) {
|
|
1694
|
-
linhas.push(
|
|
1778
|
+
linhas.push(m.reverify(m.vereditos[r.reverify.veredito] ?? r.reverify.veredito, m.coberturas[r.reverify.cobertura] ?? r.reverify.cobertura));
|
|
1695
1779
|
}
|
|
1696
1780
|
if (r.fila.length > 0) {
|
|
1697
1781
|
linhas.push('');
|
|
1698
|
-
linhas.push(
|
|
1782
|
+
linhas.push(m.fila);
|
|
1699
1783
|
for (const p of r.fila) {
|
|
1700
|
-
linhas.push(
|
|
1784
|
+
linhas.push(m.pedidoNaFila(p.id, p.fase, (0, horario_1.formatarDataHora)(p.liberaEm), p.janelaEstimada));
|
|
1701
1785
|
}
|
|
1702
1786
|
}
|
|
1703
|
-
if ((r.fila.length > 0 || (0, horario_1.localizarTexto)(
|
|
1787
|
+
if ((r.fila.length > 0 || (0, horario_1.localizarTexto)(detalhe) !== detalhe) && !plano.includes((0, horario_1.legendaDoFuso)())) {
|
|
1704
1788
|
linhas.push((0, horario_1.legendaDoFuso)());
|
|
1705
1789
|
}
|
|
1706
1790
|
return linhas.join('\n');
|