@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/verify.js
CHANGED
|
@@ -13,10 +13,12 @@
|
|
|
13
13
|
* declarada como `verify.failed`, e nao como regressao que nao da para provar.
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.PREFIXO_BLOQUEADO_NO_VERIFY = exports.TIMEOUT_VERIFY_MS = void 0;
|
|
16
|
+
exports.ESPERA_PADRAO_DA_FILA_PESADA_MS = exports.ESPERA_DA_FILA_PESADA_MS = exports.PREFIXO_BLOQUEADO_NO_VERIFY = exports.TIMEOUT_VERIFY_MS = void 0;
|
|
17
17
|
exports.ambienteDoVerify = ambienteDoVerify;
|
|
18
18
|
exports.prazoDoComando = prazoDoComando;
|
|
19
19
|
exports.executar = executar;
|
|
20
|
+
exports.semVereditoPorTempo = semVereditoPorTempo;
|
|
21
|
+
exports.executorComSteal = executorComSteal;
|
|
20
22
|
exports.identidadeDoProduto = identidadeDoProduto;
|
|
21
23
|
exports.causaDoEncerramento = causaDoEncerramento;
|
|
22
24
|
exports.comandoNoLedger = comandoNoLedger;
|
|
@@ -36,9 +38,14 @@ const node_path_1 = require("node:path");
|
|
|
36
38
|
const node_crypto_1 = require("node:crypto");
|
|
37
39
|
const util_1 = require("./util");
|
|
38
40
|
const horario_1 = require("./horario");
|
|
41
|
+
const locale_1 = require("./locale");
|
|
39
42
|
const redacao_saida_1 = require("./redacao-saida");
|
|
43
|
+
const steal_1 = require("./steal");
|
|
44
|
+
const instabilidade_1 = require("./instabilidade");
|
|
45
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
40
46
|
const redacao_url_1 = require("./redacao-url");
|
|
41
47
|
const conducao_1 = require("./conducao");
|
|
48
|
+
const procedencia_1 = require("./procedencia");
|
|
42
49
|
/** Teto de tempo de um comando de verificacao (build e suite completa cabem). */
|
|
43
50
|
exports.TIMEOUT_VERIFY_MS = 10 * 60 * 1000;
|
|
44
51
|
/** Ultimas linhas da saida real, o suficiente para servir de evidencia no ledger. */
|
|
@@ -103,10 +110,39 @@ function executar(nome, comando, cwd, tetoMs = exports.TIMEOUT_VERIFY_MS) {
|
|
|
103
110
|
const testes = (0, redacao_saida_1.testesQueCairam)(saida);
|
|
104
111
|
if (testes.length > 0)
|
|
105
112
|
resultado.testeQueCaiu = testes;
|
|
113
|
+
const falhas = (0, redacao_saida_1.falhasDeTeste)(saida);
|
|
114
|
+
if (falhas.length > 0)
|
|
115
|
+
resultado.falhasDeTeste = falhas;
|
|
106
116
|
resultado.trecho = (0, redacao_saida_1.redigirSaida)(saida);
|
|
107
117
|
}
|
|
108
118
|
return resultado;
|
|
109
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* RM-037 (fatia 6): o comando nao tem veredito. Estouro de prazo, ou reprovacao so de teste com relogio
|
|
122
|
+
* sob steal acima de 40%: a maquina, e nao o codigo, decidiu o resultado.
|
|
123
|
+
*/
|
|
124
|
+
function semVereditoPorTempo(c) {
|
|
125
|
+
return c.causa === 'timeout' || (c.relogioSobSteal?.length ?? 0) > 0;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* RM-037 (fatia 6): mede o steal na janela de cada comando e marca a reprovacao que foi so de teste com
|
|
129
|
+
* relogio sob steal alto. Os testes de relogio sao os da assinatura de prazo do runner e os do registro
|
|
130
|
+
* de instabilidade vigente. Comando que passou, estourou ou nem rodou so ganha a medida.
|
|
131
|
+
*/
|
|
132
|
+
function executorComSteal(base, leitor = steal_1.lerProcStat, registro = new Set()) {
|
|
133
|
+
return (nome, comando, cwd) => {
|
|
134
|
+
const janela = (0, steal_1.abrirJanela)(leitor);
|
|
135
|
+
const r = base(nome, comando, cwd);
|
|
136
|
+
const stealPct = janela.fechar();
|
|
137
|
+
const resultado = { ...r, stealPct };
|
|
138
|
+
if (!r.ok && r.causa !== 'timeout' && r.executado !== false && (0, steal_1.stealAlto)(stealPct)) {
|
|
139
|
+
const testes = (0, steal_1.reprovacaoSoDeRelogio)(r.falhasDeTeste, registro);
|
|
140
|
+
if (testes)
|
|
141
|
+
resultado.relogioSobSteal = testes;
|
|
142
|
+
}
|
|
143
|
+
return resultado;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
110
146
|
/** I-54 (D11): erros de spawn em que o processo nem chegou a existir. */
|
|
111
147
|
const NAO_LANCADO = new Set(['ENOENT', 'EACCES', 'EAGAIN', 'ENOMEM', 'EPERM', 'EMFILE']);
|
|
112
148
|
/**
|
|
@@ -164,6 +200,8 @@ function comandoNoLedger(c) {
|
|
|
164
200
|
...(c.duracaoMs !== undefined ? { duracaoMs: c.duracaoMs } : {}),
|
|
165
201
|
...(c.testeQueCaiu?.length ? { testeQueCaiu: c.testeQueCaiu } : {}),
|
|
166
202
|
...(c.trecho !== undefined ? { trecho: c.trecho } : {}),
|
|
203
|
+
...(c.stealPct !== undefined ? { stealPct: c.stealPct } : {}),
|
|
204
|
+
...(c.relogioSobSteal?.length ? { relogioSobSteal: c.relogioSobSteal } : {}),
|
|
167
205
|
};
|
|
168
206
|
}
|
|
169
207
|
/** Comandos declarados em `verify:` no manifesto, na ordem canonica. */
|
|
@@ -176,15 +214,35 @@ function comandosDoManifesto(manifesto) {
|
|
|
176
214
|
}
|
|
177
215
|
return lista;
|
|
178
216
|
}
|
|
179
|
-
/**
|
|
217
|
+
/**
|
|
218
|
+
* Diretorio onde a verificacao roda: a worktree da thread, ou a raiz do projeto. RM-047 (P2): a worktree
|
|
219
|
+
* do `thread.json` so vale registrada no `git worktree list` e com o estado local (`estado.rastreado`,
|
|
220
|
+
* `estado.worktree-nao-registrada`).
|
|
221
|
+
*/
|
|
180
222
|
function cwdDaThread(raiz, thread) {
|
|
181
|
-
return
|
|
223
|
+
return (0, procedencia_1.diretorioDaThread)(raiz, thread);
|
|
182
224
|
}
|
|
183
225
|
/** HEAD real do diretorio de trabalho, carimbado em toda verificacao. */
|
|
184
226
|
function commitReal(cwd) {
|
|
185
227
|
const r = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], cwd);
|
|
186
228
|
return r.ok ? r.stdout.trim() : util_1.COMMIT_DESCONHECIDO;
|
|
187
229
|
}
|
|
230
|
+
/** RM-058 N2 (D10): quanto o `ork verify` do CLI espera a vez na fila pesada sem `--esperar`. */
|
|
231
|
+
exports.ESPERA_DA_FILA_PESADA_MS = 60 * 60 * 1000;
|
|
232
|
+
/** RM-058 N2 (GO-FIX 1, B1 e A9 do CHECK): a espera de quem verifica por dentro de outro comando e nao disse prazo. */
|
|
233
|
+
exports.ESPERA_PADRAO_DA_FILA_PESADA_MS = 30_000;
|
|
234
|
+
/**
|
|
235
|
+
* RM-058 N2 (D9 e D10 da ork-rm058n2): a rodada inteira na fila de recursos pesados, depois da conducao. O
|
|
236
|
+
* artefato e o diretorio de trabalho da thread; as vagas sao `concurrency.max_parallel_heavy` (0 desliga). Sem a
|
|
237
|
+
* vez no prazo, `ErroDaFilaPesada` sai antes de qualquer comando rodar e de qualquer evento ir ao ledger.
|
|
238
|
+
*/
|
|
239
|
+
function naFilaPesada(carregado, threadId, operacao, conducao, executar) {
|
|
240
|
+
const cwd = cwdDaThread(carregado.raiz, (0, thread_1.lerThread)(carregado.raiz, threadId));
|
|
241
|
+
const espera = conducao.filaPesada?.esperarMs ?? conducao.esperarMs ?? exports.ESPERA_PADRAO_DA_FILA_PESADA_MS;
|
|
242
|
+
return (0, fila_pesada_1.comRecursoPesado)(carregado.raiz, { artefato: cwd, operacao, thread: threadId,
|
|
243
|
+
slots: carregado.manifesto.concurrency.max_parallel_heavy, esperarMs: espera, aoEsperar: conducao.filaPesada?.aoEsperar,
|
|
244
|
+
comandoDeEsperar: conducao.filaPesada?.comandoDeEsperar }, executar);
|
|
245
|
+
}
|
|
188
246
|
/** O pedido de conducao de uma verificacao, com o prazo derivado dos comandos que ela vai rodar (D3). */
|
|
189
247
|
function pedidoDoVerify(carregado, threadId, operacao, comandos, conducao) {
|
|
190
248
|
return {
|
|
@@ -206,7 +264,7 @@ function executorSobConducao(base, manifesto, conducao) {
|
|
|
206
264
|
/** `ork verify --baseline`: grava o estado do mundo ANTES do GO. */
|
|
207
265
|
function gravarBaseline(carregado, threadId, executor = executar, conducao = {}, origem = 'cli') {
|
|
208
266
|
const pedido = pedidoDoVerify(carregado, threadId, 'baseline', comandosDoManifesto(carregado.manifesto).length, conducao);
|
|
209
|
-
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => gravarBaselineSobConducao(carregado, threadId, executorSobConducao(executor, carregado.manifesto, tomada), origem));
|
|
267
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'baseline', conducao, () => gravarBaselineSobConducao(carregado, threadId, executorSobConducao(executor, carregado.manifesto, tomada), origem)));
|
|
210
268
|
}
|
|
211
269
|
function gravarBaselineSobConducao(carregado, threadId, executor, origem) {
|
|
212
270
|
const { raiz, manifesto } = carregado;
|
|
@@ -239,9 +297,7 @@ function verificarClaim(claim, cwd, executor = executar) {
|
|
|
239
297
|
verificado: false,
|
|
240
298
|
// Alegacao negativa sem comando e reprovacao (caso EvoJ6); positiva e aviso.
|
|
241
299
|
motivo: negativa ? 'claims.failed' : 'claims.unverifiable',
|
|
242
|
-
detalhe: negativa
|
|
243
|
-
? 'alegacao negativa/absoluta sem comando de verificacao: nao ha como comprova-la'
|
|
244
|
-
: 'sem comando de verificacao declarado',
|
|
300
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => negativa ? m.verify.claimNegativaSemComando : m.verify.claimSemComando),
|
|
245
301
|
execucoes: [],
|
|
246
302
|
};
|
|
247
303
|
}
|
|
@@ -253,22 +309,25 @@ function verificarClaim(claim, cwd, executor = executar) {
|
|
|
253
309
|
claim,
|
|
254
310
|
verificado: false,
|
|
255
311
|
motivo: 'verify.sem-veredito',
|
|
256
|
-
detalhe:
|
|
312
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.verify.claimNaoExecutada((0, redacao_url_1.redigirCredenciaisUrl)(naoRodou.comando), naoRodou.resumo)),
|
|
257
313
|
execucoes,
|
|
258
314
|
};
|
|
259
315
|
}
|
|
260
316
|
const falhou = execucoes.find((e) => !e.ok);
|
|
261
|
-
// I-37 (D1): estouro de prazo nao desmente a alegacao; a prova so nao chegou ao fim.
|
|
262
|
-
|
|
317
|
+
// I-37 (D1): estouro de prazo nao desmente a alegacao; a prova so nao chegou ao fim. RM-037 (fatia 6):
|
|
318
|
+
// nem a reprovacao so de teste com relogio sob steal acima de 40%.
|
|
319
|
+
const estourou = !!falhou && semVereditoPorTempo(falhou);
|
|
263
320
|
return {
|
|
264
321
|
claim,
|
|
265
322
|
verificado: !falhou,
|
|
266
323
|
motivo: falhou ? (estourou ? 'verify.timeout' : 'claims.failed') : null,
|
|
267
|
-
detalhe: falhou
|
|
324
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => falhou
|
|
268
325
|
? estourou
|
|
269
|
-
?
|
|
270
|
-
|
|
271
|
-
|
|
326
|
+
? falhou.causa === 'timeout'
|
|
327
|
+
? m.verify.claimEstourou(falhou.comando, Math.round((falhou.prazoMs ?? 0) / 1000))
|
|
328
|
+
: m.verify.claimRelogio((0, redacao_url_1.redigirCredenciaisUrl)(falhou.comando), falhou.stealPct, steal_1.LIMIAR_STEAL_PCT, falhou.relogioSobSteal.join(', '))
|
|
329
|
+
: m.verify.claimSaiu((0, redacao_url_1.redigirCredenciaisUrl)(falhou.comando), falhou.code)
|
|
330
|
+
: m.verify.claimOk(execucoes.length)),
|
|
272
331
|
execucoes,
|
|
273
332
|
};
|
|
274
333
|
}
|
|
@@ -281,9 +340,9 @@ function verificar(carregado, threadId, opcoes = {}) {
|
|
|
281
340
|
const planejados = (0, claims_1.lerClaims)(carregado.raiz, threadId).filter((c) => c.estado !== 'retirada')
|
|
282
341
|
.reduce((n, c) => n + c.verificar.length, 0) + (opcoes.soClaims ? 0 : comandosDoManifesto(carregado.manifesto).length) + 1;
|
|
283
342
|
const pedido = pedidoDoVerify(carregado, threadId, opcoes.operacao ?? 'verify', planejados, opcoes.conducao ?? {});
|
|
284
|
-
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => verificarSobConducao(carregado, threadId, opcoes, tomada, pedido.canal));
|
|
343
|
+
return (0, conducao_1.comConducao)(carregado.raiz, threadId, pedido, (tomada) => naFilaPesada(carregado, threadId, 'verify', opcoes.conducao ?? {}, (uso) => verificarSobConducao(carregado, threadId, opcoes, tomada, pedido.canal, uso)));
|
|
285
344
|
}
|
|
286
|
-
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
345
|
+
function verificarSobConducao(carregado, threadId, opcoes, conducao, canal, filaPesada) {
|
|
287
346
|
const { raiz, manifesto } = carregado;
|
|
288
347
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
289
348
|
const cwd = cwdDaThread(raiz, thread);
|
|
@@ -294,10 +353,14 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
294
353
|
// `ork verify` roda em toda fase, e uma claim por criterio por rodada viraria
|
|
295
354
|
// acumulador em vez de verificacao.
|
|
296
355
|
(0, claims_1.registrarCriteriosDePronto)(raiz, threadId);
|
|
356
|
+
// RM-037 (fatia 6): o registro de instabilidade da arvore verificada e a janela de steal da rodada.
|
|
357
|
+
const instabilidade = (0, instabilidade_1.lerRegistroDeInstabilidade)(cwd, opcoes.agoraMs);
|
|
358
|
+
const leitor = opcoes.lerProcStat ?? steal_1.lerProcStat;
|
|
359
|
+
const janelaDaRodada = (0, steal_1.abrirJanela)(leitor);
|
|
297
360
|
// I-37 (D2, D3): o prazo de cada comando sai do manifesto carregado no inicio da rodada;
|
|
298
361
|
// editar o manifesto no meio dela nao muda o teto de quem ainda vai rodar.
|
|
299
|
-
const executor = executorSobConducao(opcoes.executor
|
|
300
|
-
?? ((nome, comando, dirDeTrabalho) => executar(nome, comando, dirDeTrabalho, prazoDoComando(manifesto, nome))), manifesto, conducao);
|
|
362
|
+
const executor = executorSobConducao(executorComSteal(opcoes.executor
|
|
363
|
+
?? ((nome, comando, dirDeTrabalho) => executar(nome, comando, dirDeTrabalho, prazoDoComando(manifesto, nome))), leitor, (0, instabilidade_1.testesDeRelogioVigentes)(instabilidade)), manifesto, conducao);
|
|
301
364
|
// I-54 (D10): o preparo roda UMA vez, antes das claims. Ele nunca e condicao para uma claim
|
|
302
365
|
// passar (cada uma roda o proprio comando inteiro); ele so deixa pronta a compilacao. A
|
|
303
366
|
// identidade do produto e tomada logo depois dele e conferida no fim da rodada.
|
|
@@ -332,7 +395,7 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
332
395
|
for (const atual of comandos) {
|
|
333
396
|
if (atual.ok)
|
|
334
397
|
continue;
|
|
335
|
-
if (atual
|
|
398
|
+
if (semVereditoPorTempo(atual)) {
|
|
336
399
|
estouros.push(atual);
|
|
337
400
|
continue;
|
|
338
401
|
}
|
|
@@ -348,6 +411,16 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
348
411
|
const identidadeFinal = preparo ? identidadeDoProduto(cwd) : null;
|
|
349
412
|
const produtoAlterado = !!preparo && identidadeFinal !== preparo.identidade;
|
|
350
413
|
const naoExecutados = comandos.filter((c) => c.executado === false);
|
|
414
|
+
const rodadaPct = janelaDaRodada.fechar();
|
|
415
|
+
const todos = [...(preparo ? [preparo.resultado] : []), ...claims.flatMap((c) => c.execucoes), ...comandos];
|
|
416
|
+
const steal = {
|
|
417
|
+
fonte: steal_1.FONTE_STEAL,
|
|
418
|
+
medido: rodadaPct !== null,
|
|
419
|
+
rodadaPct,
|
|
420
|
+
limiarPct: steal_1.LIMIAR_STEAL_PCT,
|
|
421
|
+
porComando: Object.fromEntries(todos.map((c) => [c.nome, c.stealPct ?? null])),
|
|
422
|
+
relogioSobSteal: todos.filter((c) => c.relogioSobSteal?.length).map((c) => c.nome),
|
|
423
|
+
};
|
|
351
424
|
const motivos = [];
|
|
352
425
|
if (claims.some((c) => c.motivo === 'claims.failed'))
|
|
353
426
|
motivos.push('claims.failed');
|
|
@@ -384,6 +457,10 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
384
457
|
falhasSemBaseline: falhasSemBaseline.map((r) => r.nome),
|
|
385
458
|
estouros: estouros.map((r) => r.nome),
|
|
386
459
|
prazoMs: manifesto.verify.timeout_ms ?? exports.TIMEOUT_VERIFY_MS,
|
|
460
|
+
steal,
|
|
461
|
+
...(instabilidade.presente ? { instabilidade: { contrato: 'ork.instabilidade/v1', arquivo: instabilidade.arquivo,
|
|
462
|
+
vigentes: instabilidade.vigentes.map((e) => e.teste), vencidas: instabilidade.vencidas.map((e) => e.teste),
|
|
463
|
+
erros: instabilidade.erros } } : {}),
|
|
387
464
|
...(preparo ? { preparo: { ...comandoNoLedger(preparo.resultado), duracaoMs: preparo.resultado.duracaoMs,
|
|
388
465
|
identidade: preparo.identidade.slice(0, 16), identidadeFinal: identidadeFinal.slice(0, 16), produtoAlterado } } : {}),
|
|
389
466
|
motivos,
|
|
@@ -391,6 +468,8 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
391
468
|
// I-36: por qual canal a verificacao chegou; a reentrada da sessao que conduz aparece aqui.
|
|
392
469
|
canal,
|
|
393
470
|
conducao: { identidade: conducao.identidade, reentrada: conducao.reentrada },
|
|
471
|
+
// RM-058 N2: se a rodada esperou a vez na fila pesada, e quanto.
|
|
472
|
+
filaPesada,
|
|
394
473
|
});
|
|
395
474
|
for (const motivo of bloqueantes) {
|
|
396
475
|
(0, gates_1.registrarGateBloqueado)(dir, threadId, {
|
|
@@ -405,8 +484,10 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
405
484
|
: motivo === 'verify.regression'
|
|
406
485
|
? `regressao em: ${regressoes.map((r) => r.nome).join(', ')}`
|
|
407
486
|
: motivo === 'verify.timeout'
|
|
408
|
-
? `
|
|
409
|
-
...
|
|
487
|
+
? `sem veredito por tempo (prazo estourado, ou teste com relogio sob steal acima de ${steal_1.LIMIAR_STEAL_PCT}%): ${[
|
|
488
|
+
...estouros.map((r) => r.nome),
|
|
489
|
+
...claims.filter((c) => c.motivo === 'verify.timeout').map((c) => c.claim.id)
|
|
490
|
+
].join(', ')}`
|
|
410
491
|
: motivo === 'verify.sem-veredito'
|
|
411
492
|
? [produtoAlterado ? 'o produto mudou entre o preparo e o fim da rodada' : '',
|
|
412
493
|
...naoExecutados.map((c) => `${c.nome} nao foi executado`),
|
|
@@ -435,74 +516,82 @@ function verificarSobConducao(carregado, threadId, opcoes, conducao, canal) {
|
|
|
435
516
|
falhasSemBaseline,
|
|
436
517
|
estouros,
|
|
437
518
|
preparo: preparo ? { ...preparo, identidadeFinal: identidadeFinal, produtoAlterado } : null,
|
|
519
|
+
steal,
|
|
520
|
+
instabilidade,
|
|
521
|
+
filaPesada,
|
|
438
522
|
motivos,
|
|
439
523
|
ok,
|
|
440
524
|
};
|
|
441
525
|
}
|
|
442
526
|
/** `FALHOU (codigo 1)`, ou `ESTOUROU O PRAZO (600 s, rodou 612 s)`: a causa e dita pelo nome. */
|
|
443
527
|
function situacaoDoComando(c) {
|
|
528
|
+
const m = (0, locale_1.msg)().verify;
|
|
444
529
|
const s = (ms) => `${Math.round((ms ?? 0) / 1000)} s`;
|
|
445
530
|
if (c.causa === 'timeout')
|
|
446
|
-
return
|
|
531
|
+
return m.estourou(s(c.prazoMs), s(c.duracaoMs));
|
|
532
|
+
if (c.relogioSobSteal?.length)
|
|
533
|
+
return m.relogioSobSteal(c.stealPct, steal_1.LIMIAR_STEAL_PCT);
|
|
447
534
|
if (c.causa === 'nao-encontrado')
|
|
448
|
-
return
|
|
535
|
+
return m.naoExecutou(c.code);
|
|
449
536
|
if (c.causa === 'sinal')
|
|
450
|
-
return
|
|
451
|
-
return
|
|
537
|
+
return m.mortoPorSinal(c.code);
|
|
538
|
+
return m.falhou(c.code);
|
|
452
539
|
}
|
|
453
|
-
/** Texto de `ork verify`. */
|
|
540
|
+
/** Texto de `ork verify`. O detalhe da claim veio do catalogo em pt-BR e sai remontado no locale ativo. */
|
|
454
541
|
function textoDoVerify(r) {
|
|
542
|
+
const m = (0, locale_1.msg)().verify;
|
|
455
543
|
const linhas = [];
|
|
456
|
-
linhas.push(
|
|
457
|
-
linhas.push(
|
|
458
|
-
linhas.push(
|
|
459
|
-
linhas.push(
|
|
544
|
+
linhas.push(m.titulo(r.thread));
|
|
545
|
+
linhas.push(m.head(r.commit));
|
|
546
|
+
linhas.push(m.diretorio(r.cwd));
|
|
547
|
+
linhas.push(r.baseline ? m.baseline((0, util_1.shaCurto)(r.baseline.commit), (0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)) : m.semBaseline);
|
|
460
548
|
if (r.preparo) {
|
|
461
549
|
const p = r.preparo;
|
|
462
|
-
linhas.push(
|
|
463
|
-
|
|
464
|
-
|
|
550
|
+
linhas.push(m.preparo(p.resultado.ok ? m.comandoOk : situacaoDoComando(p.resultado), Math.round((p.resultado.duracaoMs ?? 0) / 1000), p.produtoAlterado));
|
|
551
|
+
}
|
|
552
|
+
linhas.push(r.steal.medido ? m.stealMedido(r.steal.rodadaPct, r.steal.fonte, r.steal.limiarPct) : m.stealNaoMedido(r.steal.fonte));
|
|
553
|
+
if (r.instabilidade.erros.length > 0) {
|
|
554
|
+
linhas.push(m.instabilidadeForaDoContrato(r.instabilidade.arquivo, r.instabilidade.erros.join('; ')));
|
|
555
|
+
}
|
|
556
|
+
else if (r.instabilidade.vencidas.length > 0) {
|
|
557
|
+
linhas.push(m.instabilidadeVencidas(r.instabilidade.vencidas.length, r.instabilidade.vencidas.map((e) => e.teste).join(', ')));
|
|
465
558
|
}
|
|
466
559
|
linhas.push('');
|
|
467
|
-
linhas.push(
|
|
560
|
+
linhas.push(m.claimsReexecutadas);
|
|
468
561
|
if (r.claims.length === 0) {
|
|
469
|
-
linhas.push(
|
|
562
|
+
linhas.push(m.nenhumaClaim);
|
|
470
563
|
}
|
|
471
564
|
for (const c of r.claims) {
|
|
472
|
-
linhas.push(
|
|
473
|
-
linhas.push(
|
|
474
|
-
linhas.push(
|
|
565
|
+
linhas.push(m.claim(c.claim.id, c.verificado, c.claim.alegacao));
|
|
566
|
+
linhas.push(m.arquivo(c.claim.arquivo));
|
|
567
|
+
linhas.push(c.claim.verificar.length > 0 ? m.comandos(c.claim.verificar.join(' && ')) : m.semComando);
|
|
475
568
|
if (!c.verificado)
|
|
476
|
-
linhas.push(
|
|
569
|
+
linhas.push(m.motivoTipado(String(c.motivo), (0, locale_1.remontar)(c.detalhe)));
|
|
477
570
|
}
|
|
478
571
|
if (r.comandos.length > 0) {
|
|
479
572
|
linhas.push('');
|
|
480
|
-
linhas.push(
|
|
573
|
+
linhas.push(m.comandosDoManifesto);
|
|
481
574
|
for (const c of r.comandos) {
|
|
482
|
-
linhas.push(
|
|
575
|
+
linhas.push(m.comando(c.nome, c.ok ? m.comandoOk : situacaoDoComando(c), c.comando));
|
|
483
576
|
if (!c.ok && c.testeQueCaiu?.length)
|
|
484
|
-
linhas.push(
|
|
577
|
+
linhas.push(m.testesQueCairam(c.testeQueCaiu.join('; ')));
|
|
485
578
|
}
|
|
486
579
|
}
|
|
487
580
|
if (r.estouros.length > 0) {
|
|
488
581
|
linhas.push('');
|
|
489
|
-
linhas.push(
|
|
582
|
+
linhas.push(m.semVeredito(r.estouros.map((c) => c.nome).join(', ')));
|
|
490
583
|
}
|
|
491
584
|
if (r.regressoes.length > 0 || r.preExistentes.length > 0 || r.falhasSemBaseline.length > 0) {
|
|
492
585
|
linhas.push('');
|
|
493
|
-
linhas.push(
|
|
494
|
-
`${r.preExistentes.length} pre-existente(s), ` +
|
|
495
|
-
`${r.falhasSemBaseline.length} falha(s) sem baseline`);
|
|
586
|
+
linhas.push(m.classificacao(r.regressoes.length, r.preExistentes.length, r.falhasSemBaseline.length));
|
|
496
587
|
for (const c of r.regressoes)
|
|
497
|
-
linhas.push(
|
|
588
|
+
linhas.push(m.regressao(c.nome, c.comando));
|
|
498
589
|
for (const c of r.preExistentes)
|
|
499
|
-
linhas.push(
|
|
590
|
+
linhas.push(m.preExistente(c.nome, c.comando));
|
|
500
591
|
for (const c of r.falhasSemBaseline)
|
|
501
|
-
linhas.push(
|
|
592
|
+
linhas.push(m.falhaSemBaseline(c.nome, c.comando));
|
|
502
593
|
}
|
|
503
594
|
linhas.push('');
|
|
504
|
-
linhas.push(r.ok
|
|
505
|
-
? 'Veredito: VERDADE SUSTENTADA (nenhum motivo bloqueante).'
|
|
506
|
-
: `Veredito: REPROVADO. Motivos tipados: ${r.motivos.join(', ')}`);
|
|
595
|
+
linhas.push(r.ok ? m.verdade : m.reprovado(r.motivos.join(', ')));
|
|
507
596
|
return linhas.join('\n');
|
|
508
597
|
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.VALIDADE_DA_VIDA_NO_RETRATO_MS = exports.VIDA_NAO_VERIFICADA = exports.chaveDaConta = exports.PRAZO_DA_LEITURA_MS = void 0;
|
|
37
|
+
exports.motivoDaCausa = motivoDaCausa;
|
|
38
|
+
exports.lerRuntime = lerRuntime;
|
|
39
|
+
exports.vidaDaThread = vidaDaThread;
|
|
40
|
+
exports.paradaDesde = paradaDesde;
|
|
41
|
+
exports.textoDaParada = textoDaParada;
|
|
42
|
+
exports.sessaoVivaNaThread = sessaoVivaNaThread;
|
|
43
|
+
exports.vidaDoRetrato = vidaDoRetrato;
|
|
44
|
+
/**
|
|
45
|
+
* RM-063 (F2): a sessao de cada thread, verificada no runtime, para as superficies que dizem "sigo".
|
|
46
|
+
*
|
|
47
|
+
* Incidente de 12/10/2026 (P2 da pagina da RM-063): com o despacho do GO da K7 morto e o daemon do
|
|
48
|
+
* claude-bg fora do ar, o `ork roadmap status` disse "sigo ork-rm026k7conhe na fase GO". O "sigo" saia de
|
|
49
|
+
* toda thread aberta com fase, ou do lease de conducao, que sobrevive a sessao morta ate a prova do fim.
|
|
50
|
+
*
|
|
51
|
+
* Agora so diz "sigo" quem tem sessao viva verificada no runtime: o `claude agents --json --all` de cada
|
|
52
|
+
* conta e os rollouts do codex, pela mesma consulta do inventario da RM-056 (fantasma e a sessao sem
|
|
53
|
+
* processo). Sessao fantasma, despacho falho ou nenhuma sessao viram "<thread> parada desde HH:MM:
|
|
54
|
+
* <motivo>", com o ultimo sinal de vida que o ledger guarda.
|
|
55
|
+
*/
|
|
56
|
+
const fs = __importStar(require("node:fs"));
|
|
57
|
+
const path = __importStar(require("node:path"));
|
|
58
|
+
const sessoes_contas_1 = require("./sessoes-contas");
|
|
59
|
+
const estado_thread_1 = require("./estado-thread");
|
|
60
|
+
const ledger_1 = require("./ledger");
|
|
61
|
+
const horario_1 = require("./horario");
|
|
62
|
+
const locale_roadmap_1 = require("./locale-roadmap");
|
|
63
|
+
/** O prazo do `claude agents` na leitura da vida: o status nao espera um daemon travado por minutos. */
|
|
64
|
+
exports.PRAZO_DA_LEITURA_MS = 20_000;
|
|
65
|
+
/** A chave de uma conta que respondeu: o runtime, e o perfil quando a conta e de um perfil do store. */
|
|
66
|
+
const chaveDaConta = (runtime, perfil) => `${runtime}:${perfil ?? ''}`;
|
|
67
|
+
exports.chaveDaConta = chaveDaConta;
|
|
68
|
+
/** O motivo de uma causa, no catalogo pedido (pt-BR por padrao: e o que vai ao `--json` e ao retrato). */
|
|
69
|
+
function motivoDaCausa(c, m = locale_roadmap_1.ROADMAP_PT_BR.motivoDaParada) {
|
|
70
|
+
switch (c.tipo) {
|
|
71
|
+
case 'nenhumaSessao': return m.nenhumaSessao(c.fase);
|
|
72
|
+
case 'despachoFalhou': return m.despachoFalhou(c.fase, c.detalhe);
|
|
73
|
+
case 'sessaoCaiu': return m.sessaoCaiu(c.sessao, c.motivo);
|
|
74
|
+
case 'runtimeSemResposta': return m.runtimeSemResposta(c.runtime, c.detalhe, c.sessao);
|
|
75
|
+
case 'naoAparece': return m.naoAparece(c.sessao);
|
|
76
|
+
case 'fantasma': return m.fantasma(c.sessao);
|
|
77
|
+
case 'encerrada': return m.encerrada(c.sessao, c.estado);
|
|
78
|
+
case 'naoLida': return m.naoLida(c.detalhe);
|
|
79
|
+
case 'semAtividade': return m.semAtividade(c.sessao, c.minutos);
|
|
80
|
+
case 'retratoVelho': return m.retratoVelho(c.minutos);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const curto = (texto, teto = 100) => {
|
|
84
|
+
const limpo = String(texto ?? '').replace(/[\p{Cc}\s]+/gu, ' ').trim();
|
|
85
|
+
return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* `claude agents` e os rollouts do codex de cada conta desta maquina (a do processo e cada perfil do store), conta a
|
|
89
|
+
* conta: o que uma conta nao respondeu nao vira "a sessao nao aparece". Falha vira falha, nunca "sem sessao".
|
|
90
|
+
*/
|
|
91
|
+
function lerRuntime(raiz, prazoMs = exports.PRAZO_DA_LEITURA_MS) {
|
|
92
|
+
const responderam = new Set(), falhas = [], sessoes = [];
|
|
93
|
+
try {
|
|
94
|
+
const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
95
|
+
const { contas, fontes } = (0, sessoes_contas_1.contasDeSessoes)(canonica);
|
|
96
|
+
for (const f of fontes)
|
|
97
|
+
if (!f.ok)
|
|
98
|
+
falhas.push(curto(f.detalhe, 120));
|
|
99
|
+
for (const conta of contas) {
|
|
100
|
+
const r = (0, sessoes_contas_1.consultarContas)(canonica, { todas: true, contas: [conta], prazoMs });
|
|
101
|
+
if (r.fontes.some((f) => f.ok)) {
|
|
102
|
+
responderam.add(conta.runtime);
|
|
103
|
+
responderam.add((0, exports.chaveDaConta)(conta.runtime, conta.perfil?.id ?? null));
|
|
104
|
+
}
|
|
105
|
+
else
|
|
106
|
+
falhas.push(...r.fontes.filter((f) => !f.ok).map((f) => `${f.origem}: ${curto(f.detalhe, 120)}`));
|
|
107
|
+
for (const s of r.sessoes) {
|
|
108
|
+
sessoes.push({ sessionId: s.sessionId, runtime: s.runtime, viva: s.viva, fantasma: s.fantasma,
|
|
109
|
+
estado: String(s.state ?? s.status ?? '').trim().toLowerCase(), perfil: s.perfil,
|
|
110
|
+
atividadeEm: typeof s.atividadeEm === 'number' ? s.atividadeEm : null });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
falhas.push(curto(e.message, 160));
|
|
116
|
+
}
|
|
117
|
+
return { responderam: [...responderam], falhas, sessoes };
|
|
118
|
+
}
|
|
119
|
+
/** O motivo tipado com o detalhe, sem repetir o motivo quando o detalhe ja comeca por ele. */
|
|
120
|
+
function motivoComDetalhe(e) {
|
|
121
|
+
const motivo = typeof e.motivo === 'string' ? e.motivo : '';
|
|
122
|
+
const detalhe = typeof e.detalhe === 'string' ? e.detalhe : typeof e.erro === 'string' ? e.erro : '';
|
|
123
|
+
return !detalhe ? motivo || 'sem detalhe' : !motivo || detalhe.startsWith(motivo) ? detalhe : `${motivo}: ${detalhe}`;
|
|
124
|
+
}
|
|
125
|
+
function causaDaFalha(e, sessionId) {
|
|
126
|
+
if (sessionId && e.sessionId === sessionId)
|
|
127
|
+
return { tipo: 'sessaoCaiu', sessao: sessionId.slice(0, 8), motivo: curto(e.motivo, 40) };
|
|
128
|
+
return { tipo: 'despachoFalhou', fase: typeof e.fase === 'string' && e.fase ? e.fase : null, detalhe: curto(motivoComDetalhe(e), 90) };
|
|
129
|
+
}
|
|
130
|
+
/** Eventos que o proprio `ork` grava sobre a sessao: nao sao sinal de vida dela. */
|
|
131
|
+
const SO_DO_ORK = /^(conducao_|retry_|despacho_idempotente$)/;
|
|
132
|
+
/**
|
|
133
|
+
* A vida da thread: a sessao do despacho mais recente, de qualquer fase (o despacho de GO que falha deixa a thread
|
|
134
|
+
* em GOAL), e a falha do runtime depois dele. `leitura` so e chamada quando ha sessao a conferir: thread sem
|
|
135
|
+
* despacho nao custa consulta ao runtime.
|
|
136
|
+
*/
|
|
137
|
+
function vidaDaThread(t, eventos, leitura, agoraMs = Date.now()) {
|
|
138
|
+
const fase = t.faseAtual;
|
|
139
|
+
const parada = (desdeEm, causa, sessionId = null) => ({ viva: false, sessionId, desdeEm: desdeEm ?? null, motivo: motivoDaCausa(causa), causa });
|
|
140
|
+
const ultimoSinal = eventos.at(-1)?.ts ?? t.atualizadaEm ?? t.criadaEm ?? null;
|
|
141
|
+
let iDespacho = -1;
|
|
142
|
+
for (let i = eventos.length - 1; i >= 0; i--) {
|
|
143
|
+
const e = eventos[i];
|
|
144
|
+
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada && typeof e.sessionId === 'string' && e.sessionId) {
|
|
145
|
+
iDespacho = i;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const despacho = iDespacho >= 0 ? eventos[iDespacho] : null;
|
|
150
|
+
const registrada = (t.sessoes ?? []).at(-1) ?? null;
|
|
151
|
+
const sessionId = despacho ? String(despacho.sessionId) : registrada?.sessionId ?? null;
|
|
152
|
+
const runtime = (typeof despacho?.runtime === 'string' && despacho.runtime) || registrada?.runtime || 'claude-bg';
|
|
153
|
+
const perfilDoDespacho = despacho?.perfil?.id ??
|
|
154
|
+
registrada?.perfil?.id;
|
|
155
|
+
const perfil = typeof perfilDoDespacho === 'string' && perfilDoDespacho ? perfilDoDespacho : null;
|
|
156
|
+
// A falha que vale e a de depois do despacho corrente (a de antes ja foi superada por ele), e que nada superou depois:
|
|
157
|
+
// o gate liberado do mesmo motivo ou da mesma sessao, ou a fase que terminou bem.
|
|
158
|
+
const depois = eventos.slice(iDespacho + 1);
|
|
159
|
+
const falha = [...depois.entries()].reverse().find(([k, e]) => (e.tipo === ledger_1.TIPOS_DE_EVENTO.despachoFalhou ||
|
|
160
|
+
(e.tipo === ledger_1.TIPOS_DE_EVENTO.gateBloqueado && typeof e.motivo === 'string' && e.motivo.startsWith('runtime.'))) &&
|
|
161
|
+
!depois.slice(k + 1).some((p) => (p.tipo === ledger_1.TIPOS_DE_EVENTO.gateLiberado && (p.motivo === e.motivo ||
|
|
162
|
+
(!!e.sessionId && p.sessionId === e.sessionId))) || (p.tipo === 'phase_result' && p.ok === true)))?.[1] ?? null;
|
|
163
|
+
if (!sessionId) {
|
|
164
|
+
return falha ? parada(falha.ts, causaDaFalha(falha, null)) : parada(ultimoSinal, { tipo: 'nenhumaSessao', fase });
|
|
165
|
+
}
|
|
166
|
+
const l = leitura();
|
|
167
|
+
const s = l.sessoes.find((x) => x.runtime === runtime && (x.sessionId === sessionId || x.sessionId.startsWith(sessionId)));
|
|
168
|
+
if (s?.viva)
|
|
169
|
+
return { viva: true, sessionId, desdeEm: null, motivo: null };
|
|
170
|
+
if (falha)
|
|
171
|
+
return parada(falha.ts, causaDaFalha(falha, sessionId), sessionId);
|
|
172
|
+
const id = sessionId.slice(0, 8);
|
|
173
|
+
const daSessao = [...eventos].reverse().find((e) => e.sessionId === sessionId && !SO_DO_ORK.test(e.tipo))?.ts ?? despacho?.ts ?? ultimoSinal;
|
|
174
|
+
// A conta do despacho precisa ter respondido: a do perfil, ou qualquer uma do runtime quando o despacho nao teve perfil.
|
|
175
|
+
if (!l.responderam.includes(perfil ? (0, exports.chaveDaConta)(runtime, perfil) : runtime)) {
|
|
176
|
+
return parada(daSessao, { tipo: 'runtimeSemResposta', runtime, detalhe: l.falhas.length ? curto(l.falhas[0], 80) : null, sessao: id }, sessionId);
|
|
177
|
+
}
|
|
178
|
+
if (!s)
|
|
179
|
+
return parada(daSessao, { tipo: 'naoAparece', sessao: id }, sessionId);
|
|
180
|
+
if (s.fantasma)
|
|
181
|
+
return parada(daSessao, { tipo: 'fantasma', sessao: id }, sessionId);
|
|
182
|
+
// O codex so conta como vivo com atividade recente no rollout: sem ela e sem estado final, e silencio, nao fim.
|
|
183
|
+
if (s.runtime === 'codex' && s.estado !== 'completed' && typeof s.atividadeEm === 'number') {
|
|
184
|
+
return parada(new Date(s.atividadeEm).toISOString(), { tipo: 'semAtividade', sessao: id, minutos: Math.max(0, Math.floor((agoraMs - s.atividadeEm) / 60000)) }, sessionId);
|
|
185
|
+
}
|
|
186
|
+
return parada(daSessao, { tipo: 'encerrada', sessao: id, estado: s.estado || 'sem estado' }, sessionId);
|
|
187
|
+
}
|
|
188
|
+
/** "parada desde HH:MM: <motivo>", no fuso do dono; sem o instante, so o motivo. */
|
|
189
|
+
function paradaDesde(v, opcoes = {}) {
|
|
190
|
+
const desde = v.desdeEm && Number.isFinite(Date.parse(v.desdeEm)) ? ` desde ${(0, horario_1.formatarHora)(v.desdeEm, opcoes)}` : '';
|
|
191
|
+
return `parada${desde}: ${v.motivo ?? 'sem sessão viva verificada no runtime'}`;
|
|
192
|
+
}
|
|
193
|
+
/** "<thread> parada desde HH:MM: <motivo>": a linha que substitui o "sigo" quando a sessao nao esta viva. */
|
|
194
|
+
function textoDaParada(thread, v, opcoes = {}) {
|
|
195
|
+
return `${thread} ${paradaDesde(v, opcoes)}`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* RM-063 (F3, GO-FIX): ha sessao viva trabalhando na thread? Pelo sessionId conhecido ou pela worktree dela (o
|
|
199
|
+
* adaptador que falha ou lanca depois de abrir a sessao nao devolve o id). E a prova que o `ork retry run` pede antes
|
|
200
|
+
* de redespachar: sem ela, a fase pode ganhar uma segunda sessao na mesma worktree. `respondeu: false` quando o
|
|
201
|
+
* runtime nao respondeu: sem prova, nada e redespachado.
|
|
202
|
+
*/
|
|
203
|
+
function sessaoVivaNaThread(raiz, thread, ids, consultar = () => (0, sessoes_contas_1.consultarContas)((0, estado_thread_1.raizDoEstado)(raiz), { todas: false, prazoMs: exports.PRAZO_DA_LEITURA_MS })) {
|
|
204
|
+
let r;
|
|
205
|
+
try {
|
|
206
|
+
r = consultar();
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
return { respondeu: false, sessionId: null, detalhe: curto(e.message, 120) };
|
|
210
|
+
}
|
|
211
|
+
const falha = r.fontes.find((f) => f.origem.startsWith('claude agents') && !f.ok);
|
|
212
|
+
if (falha)
|
|
213
|
+
return { respondeu: false, sessionId: null, detalhe: curto(`${f(falha.origem)}: ${falha.detalhe}`, 160) };
|
|
214
|
+
const real = (p) => { try {
|
|
215
|
+
return fs.realpathSync(p);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return path.resolve(p);
|
|
219
|
+
} };
|
|
220
|
+
const worktree = thread.worktree ? real(thread.worktree) : null;
|
|
221
|
+
const naWorktree = (cwd) => typeof cwd === 'string' && !!worktree &&
|
|
222
|
+
(real(cwd) === worktree || real(cwd).startsWith(worktree + path.sep));
|
|
223
|
+
const viva = r.sessoes.find((s) => s.viva && (ids.some((id) => id && (s.sessionId === id || s.sessionId.startsWith(id))) || naWorktree(s.cwd)));
|
|
224
|
+
return { respondeu: true, sessionId: viva?.sessionId ?? null, detalhe: null };
|
|
225
|
+
}
|
|
226
|
+
const f = (origem) => origem.replace(/\s+/g, ' ');
|
|
227
|
+
/** A vida de quem nao foi verificado: o retrato de outra maquina que nao publica a sessao. */
|
|
228
|
+
exports.VIDA_NAO_VERIFICADA = Object.freeze({ viva: false, sessionId: null, desdeEm: null, motivo: null });
|
|
229
|
+
/**
|
|
230
|
+
* A vida que vem no retrato de outra maquina (`ork/fabrica-estado`): so vale com os tipos certos. Retrato
|
|
231
|
+
* antigo, sem o campo, ou com o campo fora do formato, vira "nao verificada", e a linha nao diz "sigo".
|
|
232
|
+
*/
|
|
233
|
+
function vidaDoRetrato(bruto, publicadoEm, quando) {
|
|
234
|
+
if (!bruto || typeof bruto !== 'object')
|
|
235
|
+
return exports.VIDA_NAO_VERIFICADA;
|
|
236
|
+
const v = bruto;
|
|
237
|
+
const textoOuNulo = (x) => x === null || typeof x === 'string';
|
|
238
|
+
if (typeof v.viva !== 'boolean' || !textoOuNulo(v.desdeEm) || !textoOuNulo(v.motivo))
|
|
239
|
+
return exports.VIDA_NAO_VERIFICADA;
|
|
240
|
+
// A sessao viva de um retrato velho nao e "sigo": a maquina que morreu depois de publicar seguiria "viva" para sempre.
|
|
241
|
+
const idadeMs = publicadoEm && quando ? Date.parse(quando) - Date.parse(publicadoEm) : NaN;
|
|
242
|
+
if (v.viva && Number.isFinite(idadeMs) && idadeMs > exports.VALIDADE_DA_VIDA_NO_RETRATO_MS) {
|
|
243
|
+
const causa = { tipo: 'retratoVelho', minutos: Math.floor(idadeMs / 60000) };
|
|
244
|
+
return { viva: false, sessionId: null, desdeEm: publicadoEm ?? null, motivo: motivoDaCausa(causa), causa };
|
|
245
|
+
}
|
|
246
|
+
// Parada sem motivo publicado nao vira "nao verificada": a outra maquina disse que a sessao nao esta viva.
|
|
247
|
+
const motivo = v.motivo === null ? (v.viva ? null : 'sem sessão viva') : curto(v.motivo, 120);
|
|
248
|
+
return { viva: v.viva, sessionId: null, desdeEm: v.desdeEm, motivo };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Ate quando a sessao viva de um retrato publicado vale: o retrato igual so volta ao remoto de hora em hora
|
|
252
|
+
* (`PULSACAO_MS` da fabrica), mais uma batida do pulse de folga.
|
|
253
|
+
*/
|
|
254
|
+
exports.VALIDADE_DA_VIDA_NO_RETRATO_MS = 75 * 60 * 1000;
|