@orkastery/cli 0.5.3 → 0.6.0

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 (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -33,10 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.BLOCO_WATCH_BYTES = exports.INTERVALO_WATCH_MS = exports.LIMITE_MORTE_MS = void 0;
36
+ exports.BLOCO_WATCH_BYTES = exports.MAX_FALHAS_WATCH = exports.MAX_ESPERA_ERRO_WATCH_MS = exports.INTERVALO_WATCH_MS = exports.LIMITE_MORTE_MS = void 0;
37
37
  exports.observarSessao = observarSessao;
38
+ exports.reconciliarSessaoSemWatcher = reconciliarSessaoSemWatcher;
39
+ exports.validarRegistroWatcher = validarRegistroWatcher;
38
40
  exports.validarFonteWatcher = validarFonteWatcher;
41
+ exports.prepararFonteWatcher = prepararFonteWatcher;
39
42
  exports.iniciarWatcher = iniciarWatcher;
43
+ exports.acompanharSessao = acompanharSessao;
40
44
  /** D6: observador restrito a uma sessão, cursor canônico e resultados idempotentes. */
41
45
  const fs = __importStar(require("node:fs"));
42
46
  const path = __importStar(require("node:path"));
@@ -54,6 +58,8 @@ const codex_controller_sensor_1 = require("./adapters/codex-controller-sensor");
54
58
  const retry_1 = require("./retry");
55
59
  const ratelimit_1 = require("./ratelimit");
56
60
  const session_watcher_claude_1 = require("./session-watcher-claude");
61
+ const conta_esgotada_1 = require("./conta-esgotada");
62
+ const trabalho_thread_1 = require("./trabalho-thread");
57
63
  /** Falhas operacionais e bloqueios sem retry automático não alegam conclusão do produto. */
58
64
  function bloqueioPreservado(terminal) {
59
65
  return terminal.classificacao === 'gate_blocked' && terminal.motivo !== null &&
@@ -110,6 +116,8 @@ function semProvaNativa(snapshot, terminal, fonteVencedora, fechamento, sessionI
110
116
  }
111
117
  exports.LIMITE_MORTE_MS = 600000;
112
118
  exports.INTERVALO_WATCH_MS = 1000;
119
+ exports.MAX_ESPERA_ERRO_WATCH_MS = 30000;
120
+ exports.MAX_FALHAS_WATCH = 12;
113
121
  exports.BLOCO_WATCH_BYTES = codex_events_1.LIMITE_LINHA_CODEX + 65536;
114
122
  function lerJson(file) {
115
123
  if (!fs.existsSync(file))
@@ -291,8 +299,195 @@ function desfazerNaThreadRemovida(pasta, criadas) {
291
299
  catch { /* já removida ou não vazia */ }
292
300
  }
293
301
  }
302
+ /** Diagnóstico fechado: mensagens de E/S e JSON podem conter caminhos e segredos. */
303
+ function diagnosticoWatcher(e) {
304
+ const erro = e;
305
+ const code = ['ENOENT', 'EAGAIN', 'EBUSY', 'EINTR', 'EACCES', 'EPERM', 'EIO', 'ENOSPC', 'SESSION_STATE_SPLIT']
306
+ .includes(erro?.code ?? '') ? erro.code : null;
307
+ const nome = e instanceof Error ? e.constructor.name : '';
308
+ const construtor = ['Error', 'SyntaxError', 'TypeError', 'RangeError', 'ReferenceError', 'URIError', 'EvalError', 'AggregateError']
309
+ .includes(nome) ? nome : 'desconhecido';
310
+ const base = { code, construtor };
311
+ const mensagem = erro?.message ?? '';
312
+ if (mensagem === 'prazo de observação esgotado')
313
+ return { ...base, categoria: 'observacao.prazo',
314
+ erro: 'nenhuma observação bem-sucedida dentro do orçamento de espera', transitorio: false };
315
+ // Só motivos literais do núcleo saem no diagnóstico: nenhum conteúdo de metadado.
316
+ const motivos = ['sessão do controller divergente', 'instância do controller divergente',
317
+ 'vínculo thread/fase/prompt do controller divergente', 'cwd do controller divergente',
318
+ 'identidade do controller divergente da registrada', 'identidade do runtime divergente da registrada',
319
+ 'rollout do controller ausente', 'rollout do controller divergente do registrado',
320
+ 'rollout do controller rotacionado sem vínculo provado com a fonte fixada',
321
+ 'descritor consumidor de rollout divergente da fonte fixada'];
322
+ const metadado = /^runtime\.unavailable: metadado (state\.json|launch\.json|process-launch\.json) de controller (inválido|ausente)$/.test(mensagem);
323
+ const categoria = metadado || motivos.some(m => mensagem === `runtime.unavailable: ${m}`) ? mensagem
324
+ : mensagem === 'controlador registrado divergente do despacho' ? 'controller.registro-divergente'
325
+ : mensagem === 'despacho do controller sem cwd registrado' ? 'controller.cwd-ausente'
326
+ : mensagem.startsWith('runtime.unavailable:') ? 'runtime.unavailable: motivo não categorizado'
327
+ : code ? `io.${code}` : construtor;
328
+ if (code === 'SESSION_STATE_SPLIT')
329
+ return { ...base, categoria: 'estado.dividido',
330
+ erro: 'estado canônico temporariamente sem vínculo; auditoria será repetida', transitorio: true };
331
+ if (['ENOENT', 'EAGAIN', 'EBUSY', 'EINTR'].includes(erro?.code ?? ''))
332
+ return { ...base, categoria, erro: `leitura temporariamente indisponível (${erro.code})`, transitorio: true };
333
+ if (mensagem === 'runtime.unavailable: rollout do controller ausente' ||
334
+ mensagem === 'runtime.unavailable: rollout do controller sem session_meta conferível')
335
+ return { ...base, categoria, erro: 'fonte do runtime ainda não está pronta', transitorio: true };
336
+ if (e instanceof SyntaxError || /^JSON invalido em /.test(erro?.message ?? '') ||
337
+ metadado)
338
+ return { ...base, categoria: metadado ? categoria : 'json.invalido', erro: 'metadado JSON indisponível ou incompleto', transitorio: true };
339
+ if (/^(ingestão ocupada|creation\.busy:)/.test(erro?.message ?? ''))
340
+ return { ...base, categoria: 'observacao.ocupada', erro: 'observação ocupada; nova tentativa agendada', transitorio: true };
341
+ return { ...base, categoria, erro: 'falha permanente na observação; confira vínculo e fonte do sensor', transitorio: false };
342
+ }
343
+ const errosRegistrados = new WeakSet();
344
+ function registrarErroWatcher(raiz, threadId, sessionId, e, serie) {
345
+ if (!serie && e && typeof e === 'object' && errosRegistrados.has(e))
346
+ return true;
347
+ const dados = diagnosticoWatcher(e);
348
+ if (dados.categoria === 'observacao.ocupada')
349
+ return true;
350
+ const registrado = (0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, threadId), threadId, 'session_watcher_error', {
351
+ sessionId, motivo: 'runtime.unavailable', ...dados, ...serie,
352
+ transitorio: dados.transitorio && (!serie?.encerramento || serie.encerramento === 'recuperado'), origem: 'sessions.watch',
353
+ });
354
+ if (registrado && e && typeof e === 'object')
355
+ errosRegistrados.add(e);
356
+ return registrado !== null;
357
+ }
358
+ /** Falhar ao diagnosticar não troca o erro observado nem interrompe o retry transitório. */
359
+ function tentarRegistrarErroWatcher(...args) {
360
+ try {
361
+ return registrarErroWatcher(...args);
362
+ }
363
+ catch {
364
+ return false;
365
+ }
366
+ }
367
+ function observarSemDiagnostico(carregado, sessionId, opcoes) {
368
+ return observarSessaoResolvida(carregado, sessionId, (0, session_events_1.resolverSessao)(carregado.raiz, sessionId, opcoes.threadId), opcoes);
369
+ }
294
370
  function observarSessao(carregado, sessionId, opcoes = {}) {
295
- const { thread, sessao: registrada } = (0, session_events_1.resolverSessao)(carregado.raiz, sessionId);
371
+ let threadId = opcoes.threadId;
372
+ try {
373
+ const resolvida = (0, session_events_1.resolverSessao)(carregado.raiz, sessionId, threadId);
374
+ // Recusa de entrada sem despacho não é falha de um watcher ancorado.
375
+ threadId = resolvida.sessao.origem !== 'adocao' && resolvida.sessao.despachadaEm
376
+ ? resolvida.thread.id : undefined;
377
+ return observarSessaoResolvida(carregado, sessionId, resolvida, opcoes);
378
+ }
379
+ catch (e) {
380
+ if (threadId)
381
+ tentarRegistrarErroWatcher(carregado.raiz, threadId, sessionId, e);
382
+ throw e;
383
+ }
384
+ }
385
+ /**
386
+ * RM-064 T9: a batida não depende do processo watcher ter nascido. Para a última sessão
387
+ * despachada e verificada, recompõe a fonte do próprio despacho, observa o runtime diretamente
388
+ * e, depois do mesmo limite do watcher, registra uma parada tipada que o retry consegue tratar.
389
+ */
390
+ function reconciliarSessaoSemWatcher(carregado, threadId, agoraMs = Date.now()) {
391
+ const thread = (0, thread_1.lerThread)(carregado.raiz, threadId);
392
+ const sessao = thread.sessoes.at(-1);
393
+ const ignorada = (detalhe) => ({ thread: threadId,
394
+ sessionId: sessao?.sessionId ?? null, estado: 'ignorada', detalhe });
395
+ if (thread.status === 'fechada' || !sessao || sessao.verificada !== true ||
396
+ !['codex', 'claude-bg'].includes(sessao.runtime) || typeof sessao.despachadaEm !== 'string')
397
+ return ignorada('sem sessão despachada e verificada que o watcher possa reconciliar');
398
+ const dir = (0, thread_1.dirThread)(carregado.raiz, threadId);
399
+ let eventos = (0, ledger_1.lerLedger)(dir);
400
+ if (eventos.some(e => e.tipo === 'phase_result' && e.sessionId === sessao.sessionId &&
401
+ (e.despachoEm === undefined || e.despachoEm === sessao.despachadaEm)))
402
+ return ignorada('sessão já possui phase_result');
403
+ const iniciado = eventos.filter(e => e.tipo === 'session_watcher_started' && e.sessionId === sessao.sessionId &&
404
+ e.despachoEm === sessao.despachadaEm).at(-1);
405
+ const identidade = iniciado?.identidade;
406
+ if (identidade && iniciado?.pid === identidade.pid && (0, codex_runner_1.estadoProcesso)(identidade) === 'vivo')
407
+ return ignorada('watcher verificado continua vivo');
408
+ try {
409
+ const registro = eventos.filter(e => e.tipo === 'session_sensor_registered' && e.sessionId === sessao.sessionId &&
410
+ e.despachoEm === sessao.despachadaEm).at(-1);
411
+ if (!registro && sessao.runtime === 'claude-bg') {
412
+ (0, session_watcher_claude_1.garantirFonteClaude)(carregado.raiz, thread, (0, session_events_1.exigirSessaoDespachada)(sessao, sessao.sessionId));
413
+ }
414
+ else if (!registro && sessao.runtime === 'codex') {
415
+ const despacho = eventos.filter(e => e.tipo === 'phase_dispatch' && e.sessionId === sessao.sessionId).at(-1);
416
+ const controlador = (despacho?.controlador ?? sessao.controlador);
417
+ const cwd = despacho?.cwd;
418
+ if (controlador && cwd) {
419
+ const fonte = { controlador, cwd };
420
+ validarRegistroWatcher(carregado.raiz, sessao.sessionId, fonte);
421
+ (0, session_events_1.comLockDeSessao)(dir, () => {
422
+ const atuais = (0, ledger_1.lerLedger)(dir);
423
+ if (!atuais.some(e => e.tipo === 'session_sensor_registered' && e.sessionId === sessao.sessionId &&
424
+ e.despachoEm === sessao.despachadaEm)) {
425
+ (0, ledger_1.registrar)(dir, threadId, 'session_sensor_registered', { fase: sessao.fase, sessionId: sessao.sessionId,
426
+ despachoEm: sessao.despachadaEm, ...fonte, origem: 'conducao.batida',
427
+ ...(despacho?.perfil ? { perfil: despacho.perfil } : {}) });
428
+ }
429
+ });
430
+ }
431
+ }
432
+ const observado = observarSessao(carregado, sessao.sessionId, { threadId, agoraMs });
433
+ if (!observado.ocupado) {
434
+ const observadoEm = new Date(agoraMs).toISOString();
435
+ (0, session_events_1.comLockDeSessao)(dir, () => {
436
+ const atuais = (0, ledger_1.lerLedger)(dir);
437
+ if (!atuais.some(e => e.tipo === 'session_watcher_observed' && e.sessionId === sessao.sessionId &&
438
+ e.despachoEm === sessao.despachadaEm && e.ts === observadoEm)) {
439
+ (0, ledger_1.registrar)(dir, threadId, 'session_watcher_observed', { ts: observadoEm, fase: sessao.fase,
440
+ sessionId: sessao.sessionId, despachoEm: sessao.despachadaEm, origem: 'conducao.batida' });
441
+ }
442
+ });
443
+ }
444
+ if (observado.concluido)
445
+ return { thread: threadId, sessionId: sessao.sessionId,
446
+ estado: 'concluida', detalhe: `runtime observado: ${observado.classificacao ?? 'terminal'}` };
447
+ return { thread: threadId, sessionId: sessao.sessionId, estado: 'acompanhada',
448
+ detalhe: observado.ocupado ? 'observação ocupada; nova batida repetirá' : 'runtime ainda sem terminal' };
449
+ }
450
+ catch (erro) {
451
+ // `observarSessao` diagnostica sua própria falha; a recomposição estrutural passa pelo mesmo
452
+ // recibo. Só depois do limite a batida transforma a ausência persistente em parada.
453
+ tentarRegistrarErroWatcher(carregado.raiz, threadId, sessao.sessionId, erro);
454
+ eventos = (0, ledger_1.lerLedger)(dir);
455
+ const doIntervalo = (0, session_watcher_claude_1.eventosDoIntervalo)(eventos, (0, session_events_1.exigirSessaoDespachada)(sessao, sessao.sessionId));
456
+ const uteis = doIntervalo.filter(e => ['runtime_heartbeat', 'runtime_event', 'runtime_stop', 'runtime_subagent_stop', 'commit',
457
+ 'mcp_git_committed', 'sessao_bloqueada', 'sessao_destravada'].includes(e.tipo));
458
+ const observacoesBoas = doIntervalo.filter(e => e.sessionId === sessao.sessionId &&
459
+ (e.tipo === 'session_watcher_observed' || e.tipo === 'session_watcher_error' && e.encerramento === 'recuperado'));
460
+ const ultimaObservacao = Math.max(Date.parse(sessao.despachadaEm), ...[...uteis, ...observacoesBoas].map(e => Date.parse(e.ts)).filter(Number.isFinite));
461
+ const errosDaSerie = doIntervalo.filter(e => e.tipo === 'session_watcher_error' && e.sessionId === sessao.sessionId &&
462
+ e.encerramento !== 'recuperado').map(e => Date.parse(e.ts)).filter(ts => Number.isFinite(ts) && ts >= ultimaObservacao);
463
+ const primeiroErro = errosDaSerie.length > 0 ? Math.min(...errosDaSerie) : Number.NEGATIVE_INFINITY;
464
+ const ultimoUtil = Math.max(ultimaObservacao, primeiroErro);
465
+ if (agoraMs - ultimoUtil < exports.LIMITE_MORTE_MS)
466
+ return { thread: threadId, sessionId: sessao.sessionId,
467
+ estado: 'acompanhada', detalhe: 'fonte ainda indisponível dentro do limite de estabilidade' };
468
+ const sessionId = sessao.sessionId;
469
+ const chave = (0, node_crypto_1.createHash)('sha256').update(sessionId + '|' + sessao.despachadaEm).digest('hex');
470
+ const sensorResultId = `codex:${chave}`;
471
+ (0, session_events_1.comLockDeSessao)(dir, () => {
472
+ const atuais = (0, ledger_1.lerLedger)(dir);
473
+ if (atuais.some(e => e.tipo === 'phase_result' && e.sessionId === sessao.sessionId &&
474
+ e.despachoEm === sessao.despachadaEm))
475
+ return;
476
+ const dados = { fase: sessao.fase, sessionId: sessao.sessionId, despachoEm: sessao.despachadaEm,
477
+ sensorResultId, classificacao: 'gate_blocked', motivo: 'runtime.unavailable', runtime: sessao.runtime,
478
+ fonte: 'conducao.batida: sessão verificada sem watcher e sem evento útil', fonteVencedora: null,
479
+ ok: false, conclusaoNativa: false, conclusaoNativaAusente: 'watcher ausente e fonte indisponível além do limite',
480
+ estado: 'bloqueada', observadoEm: new Date(agoraMs).toISOString(), gate: 'phase.dispatch',
481
+ origem: 'conducao.batida', morteLatenciaMs: agoraMs - ultimoUtil };
482
+ (0, ledger_1.registrar)(dir, threadId, 'sessao_morta', dados);
483
+ (0, ledger_1.registrar)(dir, threadId, 'gate_blocked', dados);
484
+ (0, ledger_1.registrar)(dir, threadId, 'phase_result', dados);
485
+ });
486
+ return { thread: threadId, sessionId: sessao.sessionId, estado: 'parada',
487
+ detalhe: 'sessão verificada sem watcher e sem evento útil além do limite' };
488
+ }
489
+ }
490
+ function observarSessaoResolvida(carregado, sessionId, { thread, sessao: registrada }, opcoes) {
296
491
  const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
297
492
  if (sessao.runtime !== 'codex' && sessao.runtime !== 'claude-bg')
298
493
  throw new Error('watch requer sessão Codex ou claude-bg registrada');
@@ -331,7 +526,8 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
331
526
  thread, sessao, dir, pasta, chave, agoraMs: now, limiteMs: exports.LIMITE_MORTE_MS, consulta: opcoes.consultaClaude, carregado })) ?? { ...base, ocupado: true };
332
527
  return (0, ledger_1.threadPresente)(dir) ? r : desfazer();
333
528
  }
334
- return comLockWatcher(pasta, () => {
529
+ let contaParaReconciliar = null;
530
+ const observado = comLockWatcher(pasta, () => {
335
531
  const eventos = (0, ledger_1.lerLedger)(dir), resultadoId = `codex:${chave}`;
336
532
  const pronto = eventos.find(e => e.tipo === 'phase_result' && e.sensorResultId === resultadoId);
337
533
  if (pronto)
@@ -398,6 +594,27 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
398
594
  cursor.progressoEm = Math.max(cursor.progressoEm, leitura.quando);
399
595
  }
400
596
  }
597
+ // Commit MCP é produção do núcleo, mesmo quando app-server não avança o rollout.
598
+ // Só renova inatividade com ambos os processos vivos, dentro deste despacho e
599
+ // sem terminal/erro nativo. Não substitui terminal, close ou prova de conclusão.
600
+ let progressoMcpEventId;
601
+ if (snapshot?.estadoController === 'vivo' && snapshot.estadoRuntime === 'vivo' &&
602
+ ['working', 'running'].includes(snapshot.estado) && !snapshot.fechamento &&
603
+ !snapshot.terminalNativo && !snapshot.erro && !snapshot.limitacao) {
604
+ for (const e of (0, session_watcher_claude_1.eventosDoIntervalo)(eventos, sessao)) {
605
+ const quando = Date.parse(e.ts);
606
+ if (e.tipo !== 'mcp_git_committed' || e.thread !== thread.id || e.origem !== 'mcp.git' ||
607
+ e.estadoAuditado !== true || typeof e.commit !== 'string' || !/^[a-f0-9]{40}$/.test(e.commit) ||
608
+ (e.sessionId !== undefined && e.sessionId !== sessionId) ||
609
+ (e.despachoEm !== undefined && e.despachoEm !== sessao.despachadaEm) ||
610
+ quando > now || quando <= cursor.progressoEm)
611
+ continue;
612
+ cresceu = true;
613
+ cursor.crescimentoEm = Math.max(cursor.crescimentoEm, quando);
614
+ cursor.progressoEm = quando;
615
+ progressoMcpEventId = e.eventId;
616
+ }
617
+ }
401
618
  // Erro de metadados posterior não obriga a reler o mesmo backlog no restart.
402
619
  (0, codex_runner_1.gravarAtomico)(file, cursor);
403
620
  const processo = registro?.processoPath ? lerJson(registro.processoPath) : null;
@@ -482,7 +699,8 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
482
699
  if (!atuais.some(e => e.sensorEventId === heartbeatId))
483
700
  (0, ledger_1.registrar)(dir, thread.id, 'runtime_heartbeat', {
484
701
  ts: new Date(cursor.crescimentoEm).toISOString(), fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm,
485
- sensorEventId: heartbeatId, fonte: 'progresso reconhecido do stream/rollout', bytesLidos,
702
+ sensorEventId: heartbeatId, fonte: progressoMcpEventId ? 'mcp_git_committed do despacho' : 'progresso reconhecido do stream/rollout',
703
+ ...(progressoMcpEventId ? { mcpEventId: progressoMcpEventId } : {}), bytesLidos,
486
704
  });
487
705
  cursor.heartbeatEm = cursor.crescimentoEm;
488
706
  (0, codex_runner_1.gravarAtomico)(file, cursor);
@@ -506,10 +724,12 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
506
724
  terminal = { ...terminal, classificacao: 'gate_blocked', motivo: 'runtime.unavailable' };
507
725
  }
508
726
  // I-33 (D12): o turno terminou pela CONTA (cota, credito ou login), dito pelo proprio runtime.
509
- // E bloqueio, nunca conclusao; a D11c decide no retry se houve producao antes da morte.
727
+ // É bloqueio, nunca conclusão; o retry deriva checkpoint quando já houve produção.
510
728
  if (conta)
511
729
  terminal = { ...terminal, classificacao: 'gate_blocked', motivo: conta.falha.motivo, falhaDeConta: conta.falha,
512
730
  fonte: `${conta.fonte}: ${conta.falha.motivo} (${conta.falha.trecho})` };
731
+ const respostaFinal = terminal.respostaFinal
732
+ ? (0, trabalho_thread_1.gravarRespostaFinalDaSessao)(carregado.raiz, thread.id, sessionId, terminal.respostaFinal) : null;
513
733
  const dados = { fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm, sensorResultId: resultadoId,
514
734
  classificacao: terminal.classificacao, motivo: terminal.motivo, runtime: 'codex', fonte: terminal.fonte,
515
735
  fonteVencedora: incompleto || invalido || aberto || descorrelacionado ? null : terminais[0]?.nome ?? null,
@@ -523,13 +743,18 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
523
743
  estado: terminal.classificacao === 'fase_concluida' ? 'concluida' : 'bloqueada',
524
744
  observadoEm: terminal.timestamp, gate: 'phase.dispatch', origem: 'sessions.watch',
525
745
  morteLatenciaMs: morte ? now - cursor.progressoEm : null, ...(perfil ? { perfil } : {}),
746
+ ...(respostaFinal ? { respostaFinal: { arquivo: (0, trabalho_thread_1.caminhoDoTrabalho)(thread.id) + respostaFinal.arquivo,
747
+ sha256: respostaFinal.sha256, bytes: respostaFinal.bytes, truncada: respostaFinal.truncada } } : {}),
526
748
  ...(conta ? { falhaDeConta: { motivo: conta.falha.motivo, resetEm: conta.falha.resetEm, fonte: conta.falha.fonte,
527
749
  trecho: conta.falha.trecho } } : {}) };
528
750
  const tipo = semTerminal && morte && !incompleto && !conta ? 'sessao_morta' : terminal.classificacao;
529
751
  // I-33 (D12): o perfil sai do rodizio na primeira gravacao do resultado, onde a evidencia esta.
530
752
  if (conta && perfil && !atuais.some(e => e.tipo === 'phase_result' && e.sensorResultId === resultadoId)) {
531
753
  try {
532
- (0, ratelimit_1.marcarContaDaFalha)(carregado, perfil, conta.falha, now);
754
+ const marcado = (0, ratelimit_1.marcarContaDaFalha)(carregado, perfil, conta.falha, now);
755
+ if (marcado?.esgotadoAte)
756
+ contaParaReconciliar = { perfil, falha: conta.falha,
757
+ esgotadoAte: marcado.esgotadoAte, erroEm: terminal.timestamp };
533
758
  }
534
759
  catch { /* store ocupado ou invalido: o retry marca de novo pelo gate tipado */ }
535
760
  }
@@ -542,24 +767,21 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
542
767
  (0, ledger_1.registrar)(dir, thread.id, 'phase_result', dados);
543
768
  return { ...base, bytesLidos, concluido: true, classificacao: terminal.classificacao };
544
769
  });
545
- }) ?? { ...base, ocupado: true };
770
+ });
771
+ const episodio = contaParaReconciliar;
772
+ if (episodio)
773
+ (0, conta_esgotada_1.reconciliarContaEsgotada)({ raiz: carregado.raiz, agoraMs: now, ...episodio });
774
+ return observado ?? { ...base, ocupado: true };
546
775
  }
547
776
  catch (e) {
548
777
  // Thread apagada no meio da observação: encerra sem erro, sem recriar a pasta e sem resíduo.
549
778
  if (!(0, ledger_1.threadPresente)(dir))
550
779
  return desfazer();
551
- if (!/ocupad/.test(e.message) && !(0, ledger_1.registrarSeExiste)(dir, thread.id, 'session_watcher_error', {
552
- fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm, motivo: 'runtime.unavailable',
553
- // Não copiar conteúdo de metadados/logs em mensagens de JSON.parse.
554
- erro: e instanceof SyntaxError ? 'metadado JSON inválido' : e.message,
555
- origem: 'sessions.watch',
556
- }))
557
- return removida;
558
780
  throw e;
559
781
  }
560
782
  }
561
- /** Valida a fonte antes de registro, stderr ou spawn; tambem usada na recuperacao. */
562
- function validarFonteWatcher(raiz, sessionId, fonte) {
783
+ /** Valida vínculo, variante e perfil sem exigir que o runtime já tenha publicado seus metadados. */
784
+ function validarRegistroWatcher(raiz, sessionId, fonte) {
563
785
  const { thread, sessao: registrada } = (0, session_events_1.resolverSessao)(raiz, sessionId);
564
786
  const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
565
787
  const dir = (0, thread_1.dirThread)(raiz, thread.id);
@@ -572,9 +794,16 @@ function validarFonteWatcher(raiz, sessionId, fonte) {
572
794
  // I-33 (D4): perfil invalido ou divergente do despacho reprova antes de observar pela conta errada.
573
795
  (0, runtime_profiles_1.perfilDoRegistro)([...eventos, ...(fonte ? [{ tipo: 'session_sensor_registered', sessionId,
574
796
  despachoEm: sessao.despachadaEm, ...fonte }] : [])], sessao);
797
+ if (registro.nativo !== undefined && sessao.runtime !== 'claude-bg')
798
+ throw new Error('fonte nativa claude-agents em sessão de outro runtime');
799
+ if (registro.controlador && sessao.runtime !== 'codex')
800
+ throw new Error('fonte do controller Codex em sessão de outro runtime');
801
+ return { thread, sessao, dir, eventos, registro };
802
+ }
803
+ /** Validação profunda feita pelo laço: prontidão eventual nunca impede o registro do vínculo. */
804
+ function validarFonteWatcher(raiz, sessionId, fonte) {
805
+ const { thread, sessao, dir, eventos, registro } = validarRegistroWatcher(raiz, sessionId, fonte);
575
806
  if (registro.nativo !== undefined) {
576
- if (sessao.runtime !== 'claude-bg')
577
- throw new Error('fonte nativa claude-agents em sessão de outro runtime');
578
807
  (0, session_watcher_claude_1.validarFonteClaude)(eventos, sessionId, registro);
579
808
  return;
580
809
  }
@@ -593,6 +822,20 @@ function validarFonteWatcher(raiz, sessionId, fonte) {
593
822
  (0, codex_controller_sensor_1.lerSnapshotController)(fixada);
594
823
  }
595
824
  }
825
+ /**
826
+ * No despacho, fixa a fonte que já está pronta e recusa corrupção permanente antes de
827
+ * registrar ou iniciar o watcher. A publicação ainda incompleta do controller é deixada
828
+ * para o laço do watcher, que repete a mesma validação profunda com prazo e diagnóstico.
829
+ */
830
+ function prepararFonteWatcher(raiz, sessionId, fonte) {
831
+ try {
832
+ validarFonteWatcher(raiz, sessionId, fonte);
833
+ }
834
+ catch (e) {
835
+ if (!diagnosticoWatcher(e).transitorio)
836
+ throw e;
837
+ }
838
+ }
596
839
  function iniciarWatcher(raiz, sessionId) {
597
840
  const { thread, sessao: registrada } = (0, session_events_1.resolverSessao)(raiz, sessionId);
598
841
  const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
@@ -600,7 +843,7 @@ function iniciarWatcher(raiz, sessionId) {
600
843
  // I-34: sessão claude-bg despachada antes do registro nativo ganha a fonte derivada do despacho.
601
844
  if (sessao.runtime === 'claude-bg')
602
845
  (0, session_watcher_claude_1.garantirFonteClaude)(raiz, thread, sessao);
603
- validarFonteWatcher(raiz, sessionId);
846
+ validarRegistroWatcher(raiz, sessionId);
604
847
  const anterior = (0, ledger_1.lerLedger)(dir).filter(e => e.tipo === 'session_watcher_started' &&
605
848
  e.sessionId === sessionId && e.despachoEm === sessao.despachadaEm).at(-1);
606
849
  const identidadeAnterior = anterior?.identidade;
@@ -612,7 +855,7 @@ function iniciarWatcher(raiz, sessionId) {
612
855
  const err = fs.openSync(path.join(dir, `watcher-${sessionId}.stderr`), 'a', 0o600);
613
856
  let child;
614
857
  try {
615
- child = (0, node_child_process_1.spawn)(process.execPath, [__filename, '--run', raiz, sessionId, readyPath, token], {
858
+ child = (0, node_child_process_1.spawn)(process.execPath, [__filename, '--run', raiz, sessionId, readyPath, token, thread.id], {
616
859
  cwd: raiz, detached: true, stdio: ['ignore', 'ignore', err],
617
860
  });
618
861
  }
@@ -661,47 +904,102 @@ function iniciarWatcher(raiz, sessionId) {
661
904
  }
662
905
  async function acompanhar() {
663
906
  const carregado = (0, manifest_1.exigirManifesto)(process.argv[3]), sessionId = process.argv[4];
664
- const { thread } = (0, session_events_1.resolverSessao)(carregado.raiz, sessionId);
665
- const readyPath = process.argv[5], token = process.argv[6];
666
- if (readyPath && token) {
667
- validarFonteWatcher(carregado.raiz, sessionId);
668
- const sessao = (0, session_events_1.exigirSessaoDespachada)((0, session_events_1.resolverSessao)(carregado.raiz, sessionId).sessao, sessionId);
669
- const identidade = (0, codex_runner_1.identidadeProcesso)(process.pid);
670
- if (!identidade)
671
- throw new Error('watcher sem identidade propria');
672
- (0, codex_runner_1.gravarAtomico)(readyPath, { token, sessionId, despachoEm: sessao.despachadaEm, identidade });
673
- const deadline = Date.now() + 5000;
674
- while (lerJson(readyPath + '.ack')?.token !== token) {
675
- if (Date.now() >= deadline)
676
- throw new Error('watcher sem confirmacao do pai');
677
- await new Promise(r => setTimeout(r, 10));
907
+ const threadId = process.argv[7] ?? (0, session_events_1.resolverSessao)(carregado.raiz, sessionId).thread.id;
908
+ try {
909
+ const readyPath = process.argv[5], token = process.argv[6];
910
+ if (readyPath && token) {
911
+ validarRegistroWatcher(carregado.raiz, sessionId);
912
+ const sessao = (0, session_events_1.exigirSessaoDespachada)((0, session_events_1.resolverSessao)(carregado.raiz, sessionId, threadId).sessao, sessionId);
913
+ const identidade = (0, codex_runner_1.identidadeProcesso)(process.pid);
914
+ if (!identidade)
915
+ throw new Error('watcher sem identidade propria');
916
+ (0, codex_runner_1.gravarAtomico)(readyPath, { token, sessionId, despachoEm: sessao.despachadaEm, identidade });
917
+ const deadline = Date.now() + 5000;
918
+ while (lerJson(readyPath + '.ack')?.token !== token) {
919
+ if (Date.now() >= deadline)
920
+ throw new Error('watcher sem confirmacao do pai');
921
+ await new Promise(r => setTimeout(r, 10));
922
+ }
678
923
  }
924
+ await acompanharSessao(carregado, sessionId, { threadId });
679
925
  }
680
- const dir = (0, thread_1.dirThread)(carregado.raiz, thread.id);
926
+ catch (e) {
927
+ tentarRegistrarErroWatcher(carregado.raiz, threadId, sessionId, e);
928
+ throw e;
929
+ }
930
+ }
931
+ /** Mesmo laço do processo destacado, com relógio e espera injetáveis para regressões. */
932
+ async function acompanharSessao(carregado, sessionId, opcoes) {
933
+ const dir = (0, thread_1.dirThread)(carregado.raiz, opcoes.threadId);
934
+ const esperar = opcoes.esperar ?? ((ms) => new Promise(r => setTimeout(r, ms)));
935
+ const agora = opcoes.agora ?? Date.now;
936
+ let falhas = 0, tentativas = 0, esperas = 0, ultimaObservacao = agora(), ultimoErro;
681
937
  for (;;) {
682
938
  // Projeto ou thread apagados encerram o laço em silêncio: nada a observar nem a recriar.
683
939
  if (!(0, ledger_1.threadPresente)(dir))
684
940
  return;
685
941
  let atual;
686
942
  try {
687
- atual = (0, thread_1.lerThread)(carregado.raiz, thread.id);
943
+ atual = (0, thread_1.lerThread)(carregado.raiz, opcoes.threadId);
688
944
  if (atual.status !== 'aberta' || atual.sessoes.at(-1)?.sessionId !== sessionId)
689
945
  return;
690
- const r = observarSessao(carregado, sessionId);
946
+ // O laço agrega sua série de erros; a API de observação avulsa diagnostica separadamente.
947
+ const r = observarSemDiagnostico(carregado, sessionId, { threadId: opcoes.threadId, agoraMs: opcoes.agora?.() });
948
+ if (r.ocupado)
949
+ throw new Error('ingestão ocupada; tente novamente');
950
+ if (!r.ocupado) {
951
+ if (falhas)
952
+ tentarRegistrarErroWatcher(carregado.raiz, opcoes.threadId, sessionId, ultimoErro, { falhasConsecutivas: falhas, etapa: 'final', encerramento: 'recuperado' });
953
+ falhas = 0;
954
+ tentativas = 0;
955
+ esperas = 0;
956
+ ultimaObservacao = agora();
957
+ }
691
958
  if (r.concluido || r.encerrado)
692
959
  return;
693
960
  }
694
961
  catch (e) {
695
962
  if (!(0, ledger_1.threadPresente)(dir))
696
963
  return;
697
- if (!/ocupad/.test(e.message))
698
- throw e;
964
+ esperas++;
965
+ const dados = diagnosticoWatcher(e), ocupado = dados.categoria === 'observacao.ocupada';
966
+ const expirou = agora() - ultimaObservacao >= exports.LIMITE_MORTE_MS;
967
+ // Contenção não é erro. Estado dividido exige nova auditoria; ambos consomem
968
+ // só tempo, sem antecipar os 600 s pelo teto das outras falhas.
969
+ if (!ocupado || expirou) {
970
+ if (ocupado)
971
+ e = new Error('prazo de observação esgotado');
972
+ falhas++;
973
+ if (!ocupado && dados.categoria !== 'estado.dividido')
974
+ tentativas++;
975
+ ultimoErro = e;
976
+ const encerramento = ocupado ? 'prazo' : !dados.transitorio ? 'permanente'
977
+ : expirou ? 'prazo' : tentativas >= exports.MAX_FALHAS_WATCH ? 'tentativas' : undefined;
978
+ if (falhas === 1 || encerramento)
979
+ tentarRegistrarErroWatcher(carregado.raiz, opcoes.threadId, sessionId, e, { falhasConsecutivas: falhas, etapa: encerramento ? 'final' : 'inicial', ...(encerramento ? { encerramento } : {}) });
980
+ if (encerramento)
981
+ throw e;
982
+ }
699
983
  }
700
- await new Promise(r => setTimeout(r, atual?.sessoes.at(-1)?.runtime === 'claude-bg' ? session_watcher_claude_1.INTERVALO_WATCH_CLAUDE_MS : exports.INTERVALO_WATCH_MS));
984
+ await esperar(esperas ? Math.min(exports.MAX_ESPERA_ERRO_WATCH_MS, exports.INTERVALO_WATCH_MS * 2 ** Math.min(esperas - 1, 5), Math.max(1, exports.LIMITE_MORTE_MS - (agora() - ultimaObservacao)))
985
+ : atual?.sessoes.at(-1)?.runtime === 'claude-bg' ? session_watcher_claude_1.INTERVALO_WATCH_CLAUDE_MS : exports.INTERVALO_WATCH_MS);
701
986
  }
702
987
  }
703
988
  if (require.main === module && process.argv[2] === '--run')
704
- acompanhar().catch(() => {
705
- process.stderr.write('ork watcher: observação interrompida; confira session_watcher_error e estado canônico.\n');
989
+ acompanhar().catch(e => {
990
+ // O dispatcher fornece o vínculo antes do spawn: até falha ao carregar o manifesto
991
+ // precisa de diagnóstico. Sem ledger acessível, o stderr não promete um recibo inexistente.
992
+ let registroIndisponivel = !process.argv[7];
993
+ if (process.argv[7]) {
994
+ try {
995
+ registroIndisponivel = !registrarErroWatcher(process.argv[3], process.argv[7], process.argv[4], e);
996
+ }
997
+ catch {
998
+ registroIndisponivel = true;
999
+ }
1000
+ }
1001
+ process.stderr.write(registroIndisponivel
1002
+ ? 'ork watcher: observação interrompida; não foi possível registrar session_watcher_error.\n'
1003
+ : 'ork watcher: observação interrompida; confira session_watcher_error e estado canônico.\n');
706
1004
  process.exitCode = 1;
707
1005
  });
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.pidVivo = pidVivo;
37
37
  exports.ehFantasma = ehFantasma;
38
+ exports.encerradaNaLista = encerradaNaLista;
38
39
  exports.contasDeSessoes = contasDeSessoes;
39
40
  exports.consultarContas = consultarContas;
40
41
  exports.estadosNasContas = estadosNasContas;
@@ -75,6 +76,14 @@ function pidVivo(pid) {
75
76
  function ehFantasma(runtime, s, vivo = pidVivo) {
76
77
  return runtime === 'claude-bg' && !TERMINAIS.includes(estadoDe(s)) && !vivo(s.pid);
77
78
  }
79
+ /**
80
+ * RM-037 (ork-rm037esperas, D7): o runtime mostra a sessao encerrada: estado terminal (`done`, `completed`, `exited`,
81
+ * `stopped`, `failed`) ou fantasma, registro sem processo que trabalhe por ele. Domicilio unico dessa leitura: o portao
82
+ * de vaga do `ork phase run` (`vagaDoDespacho`) e a capacidade do #Noctum a usam.
83
+ */
84
+ function encerradaNaLista(s) {
85
+ return s.fantasma || TERMINAIS.includes(estadoDe(s));
86
+ }
78
87
  const real = (dir) => { try {
79
88
  return fs.realpathSync(dir);
80
89
  }
@@ -132,7 +141,7 @@ function consultarContas(raiz, opcoes = {}) {
132
141
  fontes.push({ origem: `claude agents (${rotulo(conta)})`, ok: false, detalhe: e.message });
133
142
  continue;
134
143
  }
135
- const r = (0, claude_bg_1.consultarSessoes)(undefined, opcoes.todas, ambiente);
144
+ const r = (0, claude_bg_1.consultarSessoes)(undefined, opcoes.todas, ambiente, opcoes.prazoMs);
136
145
  const origem = `claude agents --json${opcoes.todas ? ' --all' : ''} (${rotulo(conta)})`;
137
146
  // Fatia 2 do ensaio da 0.5.0 (P1): só o ENOENT antes da consulta prova a fonte ausente; qualquer
138
147
  // outra falha do `claude` continua deixando o inventário incompleto.
@@ -71,7 +71,7 @@ function raizesDeRegistros(cwds) {
71
71
  function inventariarSessoes(raiz, opcoes = {}) {
72
72
  const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
73
73
  // RM-056 (D4): a conta do processo e cada perfil do store, sem repetir diretorio.
74
- const contas = (0, sessoes_contas_1.consultarContas)(canonica, { todas: opcoes.todas });
74
+ const contas = (0, sessoes_contas_1.consultarContas)(canonica, { todas: opcoes.todas, ...(opcoes.prazoMs ? { prazoMs: opcoes.prazoMs } : {}) });
75
75
  const fontes = contas.fontes;
76
76
  const todas = contas.sessoes.map(s => ({ ...s, vinculos: [] }));
77
77
  // O cruzamento usa o universo global mesmo quando a apresentação é local.