@orkastery/cli 0.5.6 → 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 (385) 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 +37 -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/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -0,0 +1,507 @@
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.IDADE_MINIMA_DA_FANTASMA_MIN = exports.MOTIVOS_DO_BLOQUEIO = exports.ACOES_DA_VARREDURA = void 0;
37
+ exports.trabalhoNaWorktree = trabalhoNaWorktree;
38
+ exports.lerSessoes = lerSessoes;
39
+ exports.acoesPendentes = acoesPendentes;
40
+ exports.buscarBase = buscarBase;
41
+ exports.agirNaVarredura = agirNaVarredura;
42
+ exports.acoesFeitasDesde = acoesFeitasDesde;
43
+ /**
44
+ * RM-063 (F5): a varredura que age.
45
+ *
46
+ * Incidente de 03 a 12/10/2026 (P4 e P5 da pagina da RM-063): o PR #112 (`ork-rm043sobrasd`) foi mesclado e ficou dois
47
+ * dias sem `ork ship registrar-pr`, e as sessoes fantasmas de threads ja fechadas ficaram registradas, porque ninguem
48
+ * roda esses comandos sem um condutor. Aqui moram as tres acoes de arrumacao que a batida (`pulse-delivery`) faz:
49
+ *
50
+ * - `limpar`: a sessao fantasma (sem pid e sem processo, RM-056) ainda presa a uma thread deste projeto, sem sinal de
51
+ * vida ha pelo menos 30 min, sai do ork pelo `ork sessions limpar-fantasmas`, que grava `sessao_morta` e nunca toca o
52
+ * runtime;
53
+ * - `registrar`: o merge `ship(<thread>)` da branch `ork/*` da thread na base remota, sem `ship_done`, vira entrega
54
+ * pelo `ork ship registrar-pr`, com a mesma prova de sempre (merge dentro da ponta remota e CI verde);
55
+ * - `master`: a thread entregue, sem nota do dono e quieta (nada despachado depois da entrega, 30 min depois do
56
+ * `ship_done`) fecha pelo MASTER por omissao, so ela (`ork master <thread> --aceitar-omissao`).
57
+ *
58
+ * `registrar` e `master` nunca agem sozinhos por cima de trabalho na thread: alguem conduzindo, sessao viva na worktree
59
+ * (ou o runtime que nao respondeu, sem a prova), worktree com alteracao nao commitada, commit na branch depois do head do
60
+ * PR mesclado, ou despacho depois dele. Nesses casos a acao fica com o dono, com o motivo tipado (`motivoDoBloqueio`).
61
+ *
62
+ * A deteccao (`acoesPendentes`) e leitura pura e alimenta a fila do pulse. A execucao (`agirNaVarredura`) so faz o que
63
+ * a autorizacao duravel do dono permite (`autorizacao-duravel.ts`), e cada acao feita ou recusada vai ao ledger da
64
+ * thread como `varredura_acao`, com a autorizacao que a permitiu; a mesma recusa seguida nao vira linha nova. Sem
65
+ * autorizacao, nada e feito: cada acao vira um item da fila do pulse com o comando pronto.
66
+ */
67
+ const fs = __importStar(require("node:fs"));
68
+ const path = __importStar(require("node:path"));
69
+ const autorizacao_duravel_1 = require("./autorizacao-duravel");
70
+ const conducao_1 = require("./conducao");
71
+ const entrega_pr_1 = require("./entrega-pr");
72
+ const estado_thread_1 = require("./estado-thread");
73
+ const ledger_1 = require("./ledger");
74
+ const locale_1 = require("./locale");
75
+ const master_1 = require("./master");
76
+ const noctum_guarda_1 = require("./noctum-guarda");
77
+ const parado_no_condutor_1 = require("./parado-no-condutor");
78
+ const sessoes_1 = require("./sessoes");
79
+ const sessoes_inventario_1 = require("./sessoes-inventario");
80
+ const thread_1 = require("./thread");
81
+ const util_1 = require("./util");
82
+ const vida_da_thread_1 = require("./vida-da-thread");
83
+ const worktree_1 = require("./worktree");
84
+ /**
85
+ * As acoes da varredura. `limpar`, `registrar` e `master` sao da F5 (este modulo); `merge` e `despachar` sao da batida da
86
+ * conducao (F7, `conducao-batida.ts`), que grava o mesmo `varredura_acao` e entra no mesmo "feitas" do pulse.
87
+ */
88
+ exports.ACOES_DA_VARREDURA = ['limpar', 'registrar', 'master', 'merge', 'despachar'];
89
+ /**
90
+ * Por que nem a autorizacao faz a acao sozinha agora. Os sete primeiros sao o trabalho na thread (F5); os seguintes sao
91
+ * do merge e do despacho da batida da conducao (F7): o PR que ainda nao esta pronto, o conflito em codigo e a fase sem o
92
+ * prompt gravado.
93
+ */
94
+ exports.MOTIVOS_DO_BLOQUEIO = ['conduzida', 'sessao-viva', 'sessoes-sem-leitura', 'worktree-suja', 'branch-com-commits',
95
+ 'trabalho-novo', 'git-sem-resposta', 'pr-rascunho', 'checks-vermelhos', 'sem-checks-obrigatorios', 'pr-bloqueado',
96
+ 'pr-instavel', 'conflito-em-codigo', 'branch-nao-publicada', 'sem-prompt-gravado', 'check-pendente', 'pendencia-do-dono',
97
+ 'espera-longa', 'thread-do-arco'];
98
+ /** A sessao so e tratada como fantasma depois de duas batidas sem sinal: a recem-despachada pode nao ter pid ainda. */
99
+ exports.IDADE_MINIMA_DA_FANTASMA_MIN = 30;
100
+ const SHA = /^[0-9a-f]{40}$/;
101
+ /** Os eventos de trabalho novo numa fase: o pedido de despacho e o despacho. */
102
+ const TRABALHO_NOVO = [ledger_1.TIPOS_DE_EVENTO.promptGravado, ledger_1.TIPOS_DE_EVENTO.faseDespachada];
103
+ /** Os eventos que nao sao sinal de vida da sessao: a contabilidade do proprio ork. */
104
+ const SO_DO_ORK = /^(conducao_|retry_|despacho_idempotente$|varredura_acao$)/;
105
+ function lerThreads(raiz) {
106
+ const saida = [];
107
+ for (const id of (0, thread_1.listarIds)(raiz)) {
108
+ try {
109
+ saida.push((0, thread_1.lerThread)(raiz, id));
110
+ }
111
+ catch { /* thread ilegivel fica de fora */ }
112
+ }
113
+ return saida;
114
+ }
115
+ function ledgerDe(raiz, id) {
116
+ try {
117
+ return (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id));
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ /** A ultima tentativa recusada desta acao na thread, depois de `desde`. */
124
+ function recusaDe(eventos, acao, sessionId, desde) {
125
+ const e = [...eventos].reverse().find((x) => x.tipo === ledger_1.TIPOS_DE_EVENTO.acaoDaVarredura && x.acao === acao &&
126
+ (sessionId === null || x.sessionId === sessionId));
127
+ if (!e || e.resultado !== 'recusada' || (desde && e.ts < desde))
128
+ return null;
129
+ return { em: e.ts, detalhe: typeof e.detalhe === 'string' ? e.detalhe : '' };
130
+ }
131
+ const conduzida = (raiz, id, quando) => {
132
+ try {
133
+ return (0, conducao_1.conducaoDaThread)(raiz, id, { agora: new Date(quando) }) !== null;
134
+ }
135
+ catch {
136
+ return true;
137
+ }
138
+ };
139
+ const real = (p) => { try {
140
+ return fs.realpathSync(p);
141
+ }
142
+ catch {
143
+ return path.resolve(p);
144
+ } };
145
+ /** O instante do commit pela copia local; `null` quando o git nao responde. */
146
+ function dataDoCommit(raiz, sha) {
147
+ const r = (0, util_1.exec)('git', ['log', '-1', '--format=%cI', sha, '--'], raiz, 30000);
148
+ const ms = r.ok ? Date.parse(r.stdout.trim()) : NaN;
149
+ return Number.isFinite(ms) ? new Date(ms).toISOString() : null;
150
+ }
151
+ const comMotivo = (motivo) => ({ motivo, texto: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.bloqueios[motivo]) });
152
+ /**
153
+ * O trabalho em curso na worktree da thread, que nenhuma acao automatica atropela: alguem conduzindo, sessao viva nela
154
+ * (ou o runtime que nao respondeu, sem a prova), ou alteracao nao commitada.
155
+ */
156
+ function trabalhoNaWorktree(raiz, t, quando, vivas) {
157
+ if (conduzida(raiz, t.id, quando))
158
+ return comMotivo('conduzida');
159
+ if (vivas === null)
160
+ return comMotivo('sessoes-sem-leitura');
161
+ const wt = t.worktree ? real(t.worktree) : null;
162
+ if (!wt || !fs.existsSync(wt))
163
+ return null;
164
+ if (vivas.some((v) => { const c = real(v.cwd); return c === wt || c.startsWith(wt + path.sep); }))
165
+ return comMotivo('sessao-viva');
166
+ const st = (0, util_1.exec)('git', ['status', '--porcelain', '--', '.', ':(exclude).orkastery'], wt, 30000);
167
+ if (!st.ok)
168
+ return comMotivo('git-sem-resposta');
169
+ return st.stdout.trim() ? comMotivo('worktree-suja') : null;
170
+ }
171
+ /** Commits na branch da thread depois de `sha` (o head do PR mesclado); `null` quando o git nao responde. */
172
+ function commitsDepois(raiz, t, sha) {
173
+ const branch = (0, worktree_1.branchDaWorktree)(t);
174
+ if (!(0, util_1.exec)('git', ['rev-parse', '--verify', '-q', `refs/heads/${branch}`], raiz, 30000).ok)
175
+ return 0;
176
+ const r = (0, util_1.exec)('git', ['rev-list', '--count', `${sha}..refs/heads/${branch}`], raiz, 30000);
177
+ return r.ok ? Number(r.stdout.trim()) : null;
178
+ }
179
+ /**
180
+ * Os merges `ship(<thread>)` da base remota (a copia local dela) numa leitura so, do mais novo ao mais velho: fica o mais
181
+ * novo de cada thread, com o head do PR (o segundo pai) e o instante do commit. E a mesma busca do `ork ship
182
+ * registrar-pr` (`mergeDaEntrega`).
183
+ */
184
+ function mergesDaBase(raiz, remoto, base) {
185
+ const mapa = new Map();
186
+ const r = (0, util_1.exec)('git', ['log', `refs/remotes/${remoto}/${base}`, '--first-parent', '--format=%H%x09%P%x09%cI%x09%s', '--grep=^ship(',
187
+ '--'], raiz, 60000);
188
+ if (!r.ok)
189
+ return mapa;
190
+ for (const linha of r.stdout.split('\n')) {
191
+ const [sha, pais, em, assunto] = linha.split('\t');
192
+ const m = /^ship\(([A-Za-z0-9._-]+)\)/.exec(assunto ?? '');
193
+ if (!m || !sha || !SHA.test(sha) || mapa.has(m[1]))
194
+ continue;
195
+ const segundo = (pais ?? '').split(' ')[1] ?? null;
196
+ const ms = Date.parse(em ?? '');
197
+ mapa.set(m[1], { mergeSha: sha, headSha: segundo && SHA.test(segundo) ? segundo : null,
198
+ em: Number.isFinite(ms) ? new Date(ms).toISOString() : null });
199
+ }
200
+ return mapa;
201
+ }
202
+ /** As sessoes fantasmas presas a threads deste projeto, sem sinal de vida ha 30 min, uma acao por sessao. */
203
+ function pendentesDeLimpar(raiz, threads, fantasmas, quando) {
204
+ const saida = [];
205
+ for (const f of fantasmas ?? []) {
206
+ const t = f.thread ? threads.get(f.thread) : undefined;
207
+ if (f.acao !== 'solto' || !t)
208
+ continue;
209
+ const eventos = ledgerDe(raiz, t.id);
210
+ // O ultimo sinal da sessao, sem a contabilidade do ork: a recusa da propria varredura nao rejuvenesce a fantasma.
211
+ const ultimo = [...eventos].reverse().find((e) => e.sessionId === f.sessionId && !SO_DO_ORK.test(e.tipo))?.ts ??
212
+ (t.sessoes ?? []).find((s) => s.sessionId === f.sessionId)?.despachadaEm ?? null;
213
+ if (!ultimo || Date.parse(quando) - Date.parse(ultimo) < exports.IDADE_MINIMA_DA_FANTASMA_MIN * 60000)
214
+ continue;
215
+ const id = f.sessionId.slice(0, 8);
216
+ saida.push({ acao: 'limpar', thread: t.id, fase: f.fase, sessionId: f.sessionId, desdeEm: ultimo,
217
+ comando: 'ork sessions limpar-fantasmas', oQue: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.oQue.limpar(id)),
218
+ evidencia: `claude agents lista a sessão ${id} sem pid ou com pid sem processo${f.perfil ? ` (perfil ${f.perfil})` : ''}`,
219
+ bloqueio: null, motivoDoBloqueio: null, recusa: recusaDe(eventos, 'limpar', f.sessionId, ultimo) });
220
+ }
221
+ return saida;
222
+ }
223
+ /**
224
+ * O merge `ship(<thread>)` da branch `ork/*` da thread na base remota (a copia local dela) sem `ship_done` que o cubra.
225
+ * O `ship_done` antigo sem o sha, ou o que gravou a ponta da base que contem o merge, cobre (a mesma regra do pulse).
226
+ */
227
+ function pendentesDeRegistrar(carregado, threads, quando, vivas) {
228
+ const { raiz, manifesto } = carregado;
229
+ const remoto = manifesto.fabrica.remoto, base = manifesto.worktree.base_branch;
230
+ const saida = [];
231
+ const abertas = threads.filter((t) => t.status !== 'fechada' && (0, worktree_1.branchDaWorktree)(t).startsWith('ork/'));
232
+ const merges = abertas.length ? mergesDaBase(raiz, remoto, base)
233
+ : new Map();
234
+ for (const t of abertas) {
235
+ const merge = merges.get(t.id);
236
+ if (!merge)
237
+ continue;
238
+ const eventos = ledgerDe(raiz, t.id);
239
+ const ships = eventos.filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido);
240
+ const coberto = ships.some((e) => typeof e.mergeSha !== 'string' || !SHA.test(e.mergeSha) || e.mergeSha === merge.mergeSha ||
241
+ (0, util_1.exec)('git', ['merge-base', '--is-ancestor', merge.mergeSha, e.mergeSha], raiz, 30000).code === 0);
242
+ if (coberto)
243
+ continue;
244
+ // O registro avanca a fase da thread para SHIP: ele nao vai por cima do trabalho que veio depois do PR. Conta a partir
245
+ // do head do PR (o merge pode chegar horas depois): commit novo na branch, ou despacho depois dele.
246
+ const desde = (merge.headSha ? dataDoCommit(raiz, merge.headSha) : null) ?? merge.em;
247
+ const depois = merge.headSha ? commitsDepois(raiz, t, merge.headSha) : 0;
248
+ const motivo = trabalhoNaWorktree(raiz, t, quando, vivas)
249
+ ?? (depois === null ? comMotivo('git-sem-resposta') : depois > 0 ? comMotivo('branch-com-commits') : null)
250
+ ?? (desde && eventos.some((e) => TRABALHO_NOVO.includes(e.tipo) && e.ts > desde) ? comMotivo('trabalho-novo') : null);
251
+ const curto = merge.mergeSha.slice(0, 7);
252
+ saida.push({ acao: 'registrar', thread: t.id, fase: t.faseAtual, sessionId: null, desdeEm: merge.em,
253
+ comando: `ork ship registrar-pr ${t.id}`,
254
+ oQue: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.oQue.registrar(curto, (0, worktree_1.branchDaWorktree)(t), `${remoto}/${base}`)),
255
+ evidencia: `git log ${remoto}/${base}: merge ship(${t.id}) ${curto}, sem ship_done no ledger`,
256
+ bloqueio: motivo?.texto ?? null, motivoDoBloqueio: motivo?.motivo ?? null, recusa: recusaDe(eventos, 'registrar', null, merge.em) });
257
+ }
258
+ return saida;
259
+ }
260
+ /** A branch da thread tem commit fora da base? `null` quando o git nao responde (na duvida, nada fecha). */
261
+ function produtoNovo(carregado, t) {
262
+ const { raiz, manifesto } = carregado;
263
+ const remoto = manifesto.fabrica.remoto, base = manifesto.worktree.base_branch, branch = (0, worktree_1.branchDaWorktree)(t);
264
+ const ref = (r) => (0, util_1.exec)('git', ['rev-parse', '--verify', '-q', r], raiz, 30000).ok;
265
+ if (!ref(`refs/heads/${branch}`))
266
+ return false;
267
+ const daBase = ref(`refs/remotes/${remoto}/${base}`) ? `refs/remotes/${remoto}/${base}` : `refs/heads/${base}`;
268
+ const r = (0, util_1.exec)('git', ['rev-list', '--count', `${daBase}..refs/heads/${branch}`], raiz, 30000);
269
+ return r.ok ? Number(r.stdout.trim()) > 0 : null;
270
+ }
271
+ /** A thread entregue e quieta, sem nota do dono: fecha pelo MASTER por omissao. */
272
+ function pendentesDeMaster(carregado, threads, quando, vivas) {
273
+ const { raiz } = carregado;
274
+ const saida = [];
275
+ for (const t of threads) {
276
+ if (t.status === 'fechada')
277
+ continue;
278
+ let fora;
279
+ try {
280
+ fora = (0, master_1.motivoForaDaOmissao)(raiz, t.id);
281
+ }
282
+ catch {
283
+ continue;
284
+ }
285
+ if (fora)
286
+ continue;
287
+ const eventos = ledgerDe(raiz, t.id);
288
+ const ship = eventos.filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido).at(-1);
289
+ if (!ship)
290
+ continue;
291
+ // Quieta: nada pedido ou despachado depois da entrega, e o condutor teve 30 min para o MASTER dele.
292
+ if (eventos.some((e) => TRABALHO_NOVO.includes(e.tipo) && e.ts > ship.ts))
293
+ continue;
294
+ if (Date.parse(quando) - Date.parse(ship.ts) < parado_no_condutor_1.LIMIAR_PARADO_NO_CONDUTOR_MIN * 60000)
295
+ continue;
296
+ // A entrega conta do head que ela levou (o registro pode vir horas depois do PR): despacho depois dele e trabalho novo.
297
+ const desdeOHead = typeof ship.shaDe === 'string' && SHA.test(ship.shaDe) ? dataDoCommit(raiz, ship.shaDe) : null;
298
+ const novo = produtoNovo(carregado, t);
299
+ const motivo = trabalhoNaWorktree(raiz, t, quando, vivas)
300
+ ?? (novo === true ? comMotivo('branch-com-commits') : novo === null ? comMotivo('git-sem-resposta') : null)
301
+ ?? (desdeOHead && eventos.some((e) => TRABALHO_NOVO.includes(e.tipo) && e.ts > desdeOHead) ? comMotivo('trabalho-novo') : null);
302
+ saida.push({ acao: 'master', thread: t.id, fase: t.faseAtual, sessionId: null, desdeEm: ship.ts,
303
+ comando: `ork master ${t.id} --aceitar-omissao`, oQue: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.oQue.master),
304
+ evidencia: 'ledger: ship_done sem despacho nem MASTER depois dele',
305
+ bloqueio: motivo?.texto ?? null, motivoDoBloqueio: motivo?.motivo ?? null, recusa: recusaDe(eventos, 'master', null, ship.ts) });
306
+ }
307
+ return saida;
308
+ }
309
+ /**
310
+ * As fantasmas e as sessoes vivas numa leitura so do inventario de todas as contas, com o prazo curto da leitura da vida
311
+ * (20 s por conta): o pulse e o status nao esperam um daemon travado. Conta que nao respondeu deixa as vivas sem prova.
312
+ */
313
+ function lerSessoes(raiz, opcoes) {
314
+ if (opcoes.fantasmas || opcoes.vivas) {
315
+ let fantasmas = null, vivas = null;
316
+ try {
317
+ fantasmas = opcoes.fantasmas ? opcoes.fantasmas() : null;
318
+ }
319
+ catch {
320
+ fantasmas = null;
321
+ }
322
+ try {
323
+ vivas = opcoes.vivas ? opcoes.vivas() : null;
324
+ }
325
+ catch {
326
+ vivas = null;
327
+ }
328
+ return { fantasmas, vivas };
329
+ }
330
+ try {
331
+ const inventario = (0, sessoes_inventario_1.inventariarSessoes)(raiz, { global: true, prazoMs: vida_da_thread_1.PRAZO_DA_LEITURA_MS });
332
+ const fantasmas = (0, sessoes_1.limparFantasmas)(raiz, { dryRun: true, inventario }).itens;
333
+ const claude = inventario.fontes.filter((f) => f.origem.startsWith('claude agents'));
334
+ const vivas = claude.every((f) => f.ok)
335
+ ? inventario.sessoes.filter((s) => s.viva && typeof s.cwd === 'string').map((s) => ({ sessionId: s.sessionId, cwd: s.cwd }))
336
+ : null;
337
+ return { fantasmas, vivas };
338
+ }
339
+ catch {
340
+ return { fantasmas: null, vivas: null };
341
+ }
342
+ }
343
+ /**
344
+ * As acoes que a varredura faria agora, sem fazer nenhuma. Leitura pura (o git da copia local, o ledger, o runtime pelo
345
+ * inventario), na ordem em que a execucao as faz: `limpar`, `registrar`, `master`.
346
+ *
347
+ * RM-058, integracao (T1.2, D3): a thread que um arco #Noctum segura nao tem acao de fora. Por padrao (o pulse) ela some da
348
+ * lista, porque quem diz dela ao dono e o relatorio do arco; com `comArco` (a varredura que age), ela fica com o bloqueio
349
+ * `thread-do-arco`, para o retrato da batida dizer o pulo. A retencao depois do arco nao segura estas tres acoes (D4).
350
+ */
351
+ function acoesPendentes(carregado, opcoes = {}) {
352
+ const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz);
353
+ const quando = opcoes.quando ?? new Date().toISOString();
354
+ const doProjeto = { ...carregado, raiz };
355
+ const threads = lerThreads(raiz);
356
+ const { fantasmas, vivas } = lerSessoes(raiz, opcoes);
357
+ const todas = [
358
+ ...pendentesDeLimpar(raiz, new Map(threads.map((t) => [t.id, t])), fantasmas, quando),
359
+ ...pendentesDeRegistrar(doProjeto, threads, quando, vivas),
360
+ ...pendentesDeMaster(doProjeto, threads, quando, vivas),
361
+ ];
362
+ const arcos = (0, noctum_guarda_1.lerArcosDaRaiz)(raiz, quando);
363
+ if (!arcos.lidos.size && !arcos.ilegiveis.size)
364
+ return todas;
365
+ const porThread = new Map();
366
+ const saida = [];
367
+ for (const a of todas) {
368
+ if (!porThread.has(a.thread))
369
+ porThread.set(a.thread, (0, noctum_guarda_1.arcoDoPasso)(raiz, arcos, a.thread, ledgerDe(raiz, a.thread)));
370
+ const arco = porThread.get(a.thread);
371
+ if (arco?.efeito !== 'guarda') {
372
+ saida.push(a);
373
+ continue;
374
+ }
375
+ // A6 do CHECK: o arco que nao se le nao tem relatorio que diga da thread ao dono; a acao fica no pulse, bloqueada.
376
+ if (opcoes.comArco || arco.motivo === noctum_guarda_1.MOTIVO_DO_ARCO_ILEGIVEL)
377
+ saida.push({ ...a, bloqueio: arco.detalhe, motivoDoBloqueio: 'thread-do-arco' });
378
+ }
379
+ return saida;
380
+ }
381
+ /** `git fetch` da base, sem pergunta no terminal e com prazo: e o que faz o merge do GitHub aparecer na batida. */
382
+ function buscarBase(carregado) {
383
+ const { raiz, manifesto } = carregado;
384
+ const remoto = manifesto.fabrica.remoto, base = manifesto.worktree.base_branch;
385
+ if (!(0, util_1.exec)('git', ['remote', 'get-url', '--', remoto], raiz, 30000).ok)
386
+ return { ok: false, detalhe: `sem o remoto ${remoto}` };
387
+ const env = { ...process.env, GIT_TERMINAL_PROMPT: '0', GIT_SSH_COMMAND: process.env.GIT_SSH_COMMAND ?? 'ssh -o BatchMode=yes' };
388
+ const r = (0, util_1.exec)('git', ['fetch', '-q', '--no-tags', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], raiz, 60000, env);
389
+ return r.ok ? { ok: true, detalhe: `${remoto}/${base} trazida` }
390
+ : { ok: false, detalhe: `git fetch ${remoto} ${base} saiu ${r.error ?? r.code}: ${r.stderr.trim().split('\n')[0]?.slice(0, 160) ?? ''}` };
391
+ }
392
+ /**
393
+ * A batida que age: traz a base, detecta as acoes e faz as que a autorizacao duravel permite, na ordem. Cada acao feita
394
+ * ou recusada vai ao ledger da thread (`varredura_acao`), com quem autorizou e ate quando; a mesma recusa da vez anterior
395
+ * nao vira linha nova. Sem autorizacao valida, nada e feito e tudo fica pendente para a fila do pulse.
396
+ */
397
+ function agirNaVarredura(carregado, opcoes = {}) {
398
+ const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz);
399
+ const quando = opcoes.quando ?? new Date().toISOString();
400
+ const leitura = opcoes.autorizacao ?? (0, autorizacao_duravel_1.lerAutorizacao)(raiz, { projeto: carregado.manifesto.project.name, agora: new Date(quando) });
401
+ const busca = opcoes.buscar === false ? null : buscarBase(carregado);
402
+ const sessoes = lerSessoes(raiz, opcoes);
403
+ const pendentes = acoesPendentes(carregado, { quando, fantasmas: () => sessoes.fantasmas, vivas: () => sessoes.vivas, comArco: true });
404
+ const feitas = [];
405
+ const ficam = [];
406
+ const referencia = (0, autorizacao_duravel_1.referenciaDaAutorizacao)(leitura);
407
+ const gravar = (p, resultado, detalhe) => {
408
+ const curto = detalhe.slice(0, 400);
409
+ // A mesma recusa da vez anterior (mesma acao, sessao e motivo) nao vira linha nova a cada batida.
410
+ const anterior = [...ledgerDe(raiz, p.thread)].reverse().find((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.acaoDaVarredura &&
411
+ e.acao === p.acao && (p.sessionId === null || e.sessionId === p.sessionId));
412
+ if (!(resultado === 'recusada' && anterior?.resultado === 'recusada' && anterior.detalhe === curto)) {
413
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, p.thread), p.thread, ledger_1.TIPOS_DE_EVENTO.acaoDaVarredura, {
414
+ fase: p.fase, acao: p.acao, resultado, detalhe: curto, comando: p.comando,
415
+ ...(p.sessionId ? { sessionId: p.sessionId } : {}), origem: 'varredura', autorizacao: referencia,
416
+ quemDecidiu: referencia ? `varredura do ork, pela autorização durável de ${String(referencia.por)}` : null,
417
+ evidencia: p.evidencia,
418
+ });
419
+ }
420
+ feitas.push({ acao: p.acao, thread: p.thread, sessionId: p.sessionId, resultado, detalhe });
421
+ };
422
+ // `limpar` e uma chamada so para as fantasmas que a deteccao ja viu velhas: e o mesmo `ork sessions limpar-fantasmas`.
423
+ const aLimpar = pendentes.filter((p) => p.acao === 'limpar' && !p.bloqueio && (0, autorizacao_duravel_1.autorizada)(leitura, 'limpar'));
424
+ let soltas = null;
425
+ if (aLimpar.length) {
426
+ try {
427
+ const r = (0, sessoes_1.limparFantasmas)(raiz, { origem: 'varredura', sessoes: aLimpar.map((p) => p.sessionId) });
428
+ soltas = new Map(r.itens.filter((i) => i.thread).map((i) => [`${i.thread}|${i.sessionId}`, i]));
429
+ }
430
+ catch (e) {
431
+ soltas = null;
432
+ for (const p of aLimpar) {
433
+ gravar(p, 'recusada', `limpar-fantasmas falhou: ${e.message}`);
434
+ ficam.push(p);
435
+ }
436
+ }
437
+ }
438
+ for (const p of pendentes) {
439
+ if (p.bloqueio || !(0, autorizacao_duravel_1.autorizada)(leitura, p.acao)) {
440
+ ficam.push(p);
441
+ continue;
442
+ }
443
+ if (p.acao === 'limpar') {
444
+ if (!soltas)
445
+ continue;
446
+ const i = soltas.get(`${p.thread}|${p.sessionId}`);
447
+ if (i?.acao === 'solto' || i?.acao === 'ja-solto')
448
+ gravar(p, 'feita', `sessão ${String(p.sessionId).slice(0, 8)} solta: sessao_morta no ledger`);
449
+ else {
450
+ gravar(p, 'recusada', i ? `limpar-fantasmas respondeu ${i.acao}` : 'a sessão não apareceu como fantasma na execução');
451
+ ficam.push(p);
452
+ }
453
+ continue;
454
+ }
455
+ if (p.acao === 'registrar') {
456
+ let r;
457
+ try {
458
+ r = (0, entrega_pr_1.registrarEntregaPorPr)({ ...carregado, raiz }, p.thread, { buscar: false, remoto: carregado.manifesto.fabrica.remoto });
459
+ }
460
+ catch (e) {
461
+ gravar(p, 'recusada', e.message);
462
+ ficam.push(p);
463
+ continue;
464
+ }
465
+ if (r.acao === 'registrou' || r.acao === 'ja-registrada')
466
+ gravar(p, 'feita', `${r.acao}: ${r.motivo}`);
467
+ else {
468
+ gravar(p, 'recusada', `${r.acao}: ${r.motivo}`);
469
+ ficam.push({ ...p, recusa: { em: quando, detalhe: `${r.acao}: ${r.motivo}` } });
470
+ }
471
+ continue;
472
+ }
473
+ // RM-061 (F2b, G2): o MASTER log, o POSTMORTEM e o registro da omissao nascem em pt-BR, como no CLI.
474
+ let aceitas = [];
475
+ try {
476
+ aceitas = (0, locale_1.comLocale)('pt-BR', () => (0, master_1.aceitarPendentesPorOmissao)(raiz, { thread: p.thread }));
477
+ }
478
+ catch (e) {
479
+ gravar(p, 'recusada', e.message);
480
+ ficam.push(p);
481
+ continue;
482
+ }
483
+ if (aceitas.length === 1)
484
+ gravar(p, 'feita', `fechada pelo MASTER por omissão, índice ${aceitas[0].indice.valor}/${aceitas[0].indice.base}`);
485
+ else {
486
+ gravar(p, 'recusada', 'nenhuma entrega desta thread esperava o aceite');
487
+ ficam.push(p);
488
+ }
489
+ }
490
+ return { autorizacao: leitura, busca, feitas, pendentes: ficam };
491
+ }
492
+ /** As acoes feitas pela varredura desde `desde`, de todas as threads (a fechada pelo MASTER inclusive). */
493
+ function acoesFeitasDesde(raiz, desde) {
494
+ const saida = [];
495
+ const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
496
+ for (const id of (0, thread_1.listarIds)(canonica)) {
497
+ for (const e of ledgerDe(canonica, id)) {
498
+ if (e.tipo !== ledger_1.TIPOS_DE_EVENTO.acaoDaVarredura || e.resultado !== 'feita' || e.ts < desde)
499
+ continue;
500
+ if (!exports.ACOES_DA_VARREDURA.includes(String(e.acao)))
501
+ continue;
502
+ saida.push({ acao: e.acao, thread: id, sessionId: typeof e.sessionId === 'string' ? e.sessionId : null,
503
+ resultado: 'feita', detalhe: typeof e.detalhe === 'string' ? e.detalhe : '', em: e.ts, eventId: String(e.eventId ?? [id, e.ts].join('|')) });
504
+ }
505
+ }
506
+ return saida.sort((a, b) => a.em.localeCompare(b.em));
507
+ }