@orkastery/cli 0.5.1 → 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.
Files changed (260) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/ork.md +9 -0
  5. package/adapters/claude-code/mods/autoridade.json +56 -0
  6. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  8. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  9. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  10. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  11. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  12. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  13. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  16. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  17. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  18. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  19. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  20. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  21. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  25. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  27. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  28. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  29. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  30. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  33. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  35. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  36. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  37. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  38. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  44. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  45. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  46. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  47. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  48. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  49. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  52. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  53. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  54. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  55. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  56. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  57. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  59. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  61. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  62. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  63. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  64. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  67. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  68. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  69. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  70. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  71. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  72. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  77. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  78. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  79. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  80. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  82. package/adapters/codex/skills/ork/SKILL.md +18 -3
  83. package/adapters/hermes/README.md +1 -0
  84. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  85. package/adapters/hermes/hermes.plugin.json +1 -0
  86. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  87. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
  88. package/adapters/openclaw/README.md +26 -5
  89. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  90. package/adapters/openclaw/dist/index.js +46 -11
  91. package/adapters/openclaw/openclaw.plugin.json +5 -1
  92. package/adapters/openclaw/package.json +2 -2
  93. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  94. package/adapters/openclaw/src/index.ts +49 -11
  95. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  96. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  97. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  98. package/assets/docs-en/produto/README.md +14 -0
  99. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  100. package/assets/docs-en/roadmap/README.md +14 -0
  101. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  102. package/assets/orkmind_bridge.py +117 -9
  103. package/dist/adapters/claude-bg.js +116 -18
  104. package/dist/adapters/codex.js +14 -4
  105. package/dist/agents-md.js +24 -14
  106. package/dist/auditrun.js +22 -3
  107. package/dist/board.js +20 -17
  108. package/dist/branch-de-estado.js +88 -10
  109. package/dist/busca-semantica.js +52 -12
  110. package/dist/canarios-rm057.js +149 -0
  111. package/dist/canarios.js +2 -0
  112. package/dist/catalogo.js +33 -0
  113. package/dist/ci.js +21 -8
  114. package/dist/claims-conferir.js +342 -0
  115. package/dist/claims.js +41 -1
  116. package/dist/company-brain-client.js +36 -1
  117. package/dist/company-brain-context.js +158 -22
  118. package/dist/company-brain-journal.js +2 -1
  119. package/dist/company-brain-migration.js +36 -1
  120. package/dist/conducao-sentinela.js +388 -0
  121. package/dist/conducao-texto.js +12 -18
  122. package/dist/conducao.js +122 -30
  123. package/dist/conhecimento.js +490 -0
  124. package/dist/docs.js +70 -17
  125. package/dist/doctor-pulse-cron.js +349 -0
  126. package/dist/doctor-rede.js +150 -0
  127. package/dist/doctor.js +195 -111
  128. package/dist/entrega-pr.js +42 -29
  129. package/dist/escopo-escrita.js +10 -1
  130. package/dist/esgotamentos.js +181 -0
  131. package/dist/estado-thread.js +23 -1
  132. package/dist/experiencia-instalacao.js +45 -25
  133. package/dist/experiencia.js +12 -2
  134. package/dist/fabrica-batida.js +310 -0
  135. package/dist/fabrica-estado.js +52 -14
  136. package/dist/fabrica-publicar.js +9 -1
  137. package/dist/fechamento.js +20 -66
  138. package/dist/fila-pesada.js +444 -0
  139. package/dist/fix.js +3 -2
  140. package/dist/forja.js +31 -7
  141. package/dist/gates.js +3 -24
  142. package/dist/handoff.js +10 -6
  143. package/dist/hitl-contract.js +59 -4
  144. package/dist/hitl-curto.js +11 -6
  145. package/dist/hitl-gates.js +5 -0
  146. package/dist/hitl-local-receipt.js +2 -0
  147. package/dist/hitl-lote.js +5 -2
  148. package/dist/hitl-resumo.js +38 -3
  149. package/dist/hitl-tempo-parado.js +201 -0
  150. package/dist/hitl-texto-livre.js +5 -5
  151. package/dist/hitl.js +29 -33
  152. package/dist/horario.js +41 -7
  153. package/dist/hosts.js +104 -11
  154. package/dist/impedimento.js +299 -0
  155. package/dist/index.js +961 -542
  156. package/dist/indice-vetorial.js +87 -10
  157. package/dist/indice.js +9 -1
  158. package/dist/init.js +56 -43
  159. package/dist/instabilidade.js +144 -0
  160. package/dist/integracoes-locais.js +4 -0
  161. package/dist/intelligence-graph-cli.js +170 -16
  162. package/dist/intelligence-graph-contexto.js +254 -0
  163. package/dist/intelligence-graph-contract.js +2 -1
  164. package/dist/intelligence-graph-extract-md.js +56 -4
  165. package/dist/intelligence-graph-extract-ts.js +71 -3
  166. package/dist/intelligence-graph-parsers.js +6 -4
  167. package/dist/intelligence-graph-query.js +66 -19
  168. package/dist/leases.js +664 -87
  169. package/dist/ledger-stats.js +15 -1
  170. package/dist/ledger.js +18 -1
  171. package/dist/licoes.js +1 -0
  172. package/dist/liveness.js +6 -3
  173. package/dist/locale-ajuda.js +761 -0
  174. package/dist/locale-gerados.js +160 -0
  175. package/dist/locale-master.js +99 -0
  176. package/dist/locale-onboarding.js +92 -0
  177. package/dist/locale-phase.js +151 -0
  178. package/dist/locale-pulse.js +211 -0
  179. package/dist/locale-retry.js +385 -0
  180. package/dist/locale-roadmap.js +102 -0
  181. package/dist/locale-ship.js +494 -0
  182. package/dist/locale-thread.js +277 -0
  183. package/dist/locale-verify.js +125 -0
  184. package/dist/locale.js +714 -0
  185. package/dist/maestro-runtime.js +4 -1
  186. package/dist/manifest.js +149 -4
  187. package/dist/maquina.js +23 -4
  188. package/dist/master-digest.js +6 -1
  189. package/dist/master-nota.js +18 -11
  190. package/dist/master.js +145 -31
  191. package/dist/mcp-artifacts.js +43 -3
  192. package/dist/mcp-git.js +42 -8
  193. package/dist/mcp-grafo-worker.js +5 -3
  194. package/dist/mcp-grafo.js +55 -6
  195. package/dist/mcp-server.js +22 -3
  196. package/dist/mcp-ship.js +3 -1
  197. package/dist/mcp-verify.js +6 -1
  198. package/dist/memoria.js +48 -6
  199. package/dist/modos.js +3 -6
  200. package/dist/network-roadmap.js +196 -18
  201. package/dist/noctum-arco.js +911 -0
  202. package/dist/noctum-capacidade.js +141 -0
  203. package/dist/noctum-envelope.js +810 -0
  204. package/dist/noctum-execucao.js +304 -0
  205. package/dist/noctum-fila.js +280 -0
  206. package/dist/ocupacao.js +40 -5
  207. package/dist/onboarding.js +40 -21
  208. package/dist/orkmind.js +99 -7
  209. package/dist/orquestracao.js +24 -21
  210. package/dist/parado-no-condutor.js +219 -38
  211. package/dist/phase.js +160 -52
  212. package/dist/policies.js +56 -5
  213. package/dist/portfolio.js +8 -3
  214. package/dist/postura-local.js +234 -0
  215. package/dist/preflight.js +11 -10
  216. package/dist/procedencia.js +225 -0
  217. package/dist/projeto-alvo.js +132 -5
  218. package/dist/prompts.js +40 -1
  219. package/dist/prova-ativacao.js +75 -6
  220. package/dist/pulse-delivery.js +47 -4
  221. package/dist/pulse.js +98 -19
  222. package/dist/ratelimit.js +24 -6
  223. package/dist/recall.js +3 -1
  224. package/dist/redacao-saida.js +63 -0
  225. package/dist/rede-adesao.js +399 -0
  226. package/dist/rede-forja.js +289 -0
  227. package/dist/rede-projetos.js +239 -0
  228. package/dist/rede-status.js +337 -0
  229. package/dist/rede.js +980 -0
  230. package/dist/retry.js +291 -140
  231. package/dist/roadmap-reservas.js +20 -3
  232. package/dist/roadmap-status.js +150 -34
  233. package/dist/runtime-context.js +181 -3
  234. package/dist/runtime-profiles.js +22 -1
  235. package/dist/runtimes.js +2 -1
  236. package/dist/saida-segura.js +58 -0
  237. package/dist/session-events.js +7 -3
  238. package/dist/session-watcher-claude.js +120 -24
  239. package/dist/session-watcher.js +185 -33
  240. package/dist/sessoes-contas.js +187 -0
  241. package/dist/sessoes-inventario.js +6 -18
  242. package/dist/sessoes.js +83 -2
  243. package/dist/ship-publicar.js +800 -0
  244. package/dist/ship.js +157 -88
  245. package/dist/steal.js +77 -0
  246. package/dist/thread-close.js +3 -2
  247. package/dist/thread.js +299 -49
  248. package/dist/util.js +8 -1
  249. package/dist/verify.js +141 -52
  250. package/dist/vida-da-thread.js +254 -0
  251. package/dist/worktree-local.js +165 -0
  252. package/dist/worktree.js +25 -2
  253. package/dist/yaml.js +27 -8
  254. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  255. package/package.json +7 -3
  256. package/references/definition-of-done.md +1 -1
  257. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  258. package/skills/README.md +1 -1
  259. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  260. package/skills/phases/master-metrics/SKILL.md +8 -3
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
- /** Diretorio onde a verificacao roda: a worktree da thread, ou a raiz do projeto. */
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 thread.worktree ?? raiz;
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: `comando "${(0, redacao_url_1.redigirCredenciaisUrl)(naoRodou.comando)}" nao foi executado: ${naoRodou.resumo}`,
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
- const estourou = falhou?.causa === 'timeout';
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
- ? `comando "${falhou.comando}" estourou o prazo de ${Math.round((falhou.prazoMs ?? 0) / 1000)} s sem terminar`
270
- : `comando "${(0, redacao_url_1.redigirCredenciaisUrl)(falhou.comando)}" saiu com codigo ${falhou.code}`
271
- : `${execucoes.length} comando(s) reexecutado(s) com sucesso`,
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.causa === 'timeout') {
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
- ? `estourou o prazo sem terminar: ${[...estouros.map((r) => r.nome),
409
- ...claims.filter((c) => c.motivo === 'verify.timeout').map((c) => c.claim.id)].join(', ')}`
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 `ESTOUROU O PRAZO (${s(c.prazoMs)}, rodou ${s(c.duracaoMs)})`;
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 `NAO EXECUTOU (comando nao encontrado, codigo ${c.code})`;
535
+ return m.naoExecutou(c.code);
449
536
  if (c.causa === 'sinal')
450
- return `MORTO POR SINAL (codigo ${c.code})`;
451
- return `FALHOU (codigo ${c.code})`;
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(`ork verify da thread ${r.thread}`);
457
- linhas.push(` HEAD real ${r.commit}`);
458
- linhas.push(` diretorio ${r.cwd}`);
459
- linhas.push(` baseline ${r.baseline ? `${(0, util_1.shaCurto)(r.baseline.commit)} de ${(0, horario_1.formatarDataHoraRotulada)(r.baseline.gravadaEm)}` : '(nao gravada: falha nao pode ser chamada de regressao)'}`);
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(` preparo ${p.resultado.ok ? 'ok' : situacaoDoComando(p.resultado)} em ` +
463
- `${Math.round((p.resultado.duracaoMs ?? 0) / 1000)} s, uma vez para a rodada; produto ` +
464
- `${p.produtoAlterado ? 'MUDOU no meio da rodada: nenhum veredito vale' : 'conferido do preparo ao fim'}`);
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('Claims reexecutadas no HEAD real:');
560
+ linhas.push(m.claimsReexecutadas);
468
561
  if (r.claims.length === 0) {
469
- linhas.push(' (nenhuma claim registrada nesta thread)');
562
+ linhas.push(m.nenhumaClaim);
470
563
  }
471
564
  for (const c of r.claims) {
472
- linhas.push(` ${c.claim.id} verificado: ${c.verificado ? 'sim' : 'NAO'} ${c.claim.alegacao}`);
473
- linhas.push(` arquivo: ${c.claim.arquivo}`);
474
- linhas.push(` ${c.claim.verificar.length > 0 ? `comando(s): ${c.claim.verificar.join(' && ')}` : 'sem comando de verificacao'}`);
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(` motivo tipado: ${c.motivo} (${c.detalhe})`);
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('Comandos de verify do manifesto:');
573
+ linhas.push(m.comandosDoManifesto);
481
574
  for (const c of r.comandos) {
482
- linhas.push(` ${c.nome.padEnd(10)} ${c.ok ? 'ok' : situacaoDoComando(c)} ${c.comando}`);
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(` teste(s) que caiu(ram): ${c.testeQueCaiu.join('; ')}`);
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(`Estouro de prazo (nao e reprovacao, a prova nao terminou): ${r.estouros.map((c) => c.nome).join(', ')}`);
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(`Classificacao: ${r.regressoes.length} regressao(oes), ` +
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(` regressao ${c.nome}: ${c.comando}`);
588
+ linhas.push(m.regressao(c.nome, c.comando));
498
589
  for (const c of r.preExistentes)
499
- linhas.push(` pre-existente ${c.nome}: ${c.comando}`);
590
+ linhas.push(m.preExistente(c.nome, c.comando));
500
591
  for (const c of r.falhasSemBaseline)
501
- linhas.push(` sem baseline ${c.nome}: ${c.comando}`);
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;