@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
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SEM_PERGUNTA_NO_RESUMO = exports.TETO_DE_DECISOES_DETALHADAS = exports.TETO_DE_ESPERAS_POR_MAQUINA = exports.TETO_DE_PARADOS_NO_CONDUTOR = exports.TETO_DE_THREADS_NOMEADAS = exports.PERGUNTA_DO_RESUMO = exports.CONTRATO_RESUMO = void 0;
3
+ exports.SEM_PERGUNTA_COM_IMPEDIMENTO = exports.SEM_PERGUNTA_NO_RESUMO = exports.TETO_DE_DECISOES_DETALHADAS = exports.TETO_DE_ESPERAS_POR_MAQUINA = exports.TETO_DE_IMPEDIMENTOS = exports.TETO_DE_PARADOS_NO_CONDUTOR = exports.TETO_DA_VARREDURA = exports.TETO_DE_THREADS_NOMEADAS = exports.PERGUNTA_DO_RESUMO = exports.CONTRATO_RESUMO = void 0;
4
4
  exports.resumirHitl = resumirHitl;
5
+ exports.linhasDaOciosidade = linhasDaOciosidade;
6
+ exports.linhasDaVarredura = linhasDaVarredura;
5
7
  exports.linhaDoParadoNoCondutor = linhaDoParadoNoCondutor;
6
8
  exports.linhasDoCondutor = linhasDoCondutor;
9
+ exports.linhasDosImpedimentos = linhasDosImpedimentos;
7
10
  exports.linhaDosTecnicos = linhaDosTecnicos;
8
11
  exports.linhasDasOutrasMaquinas = linhasDasOutrasMaquinas;
9
12
  exports.linhasDasDecisoes = linhasDasDecisoes;
@@ -29,6 +32,7 @@ exports.textoDoResumo = textoDoResumo;
29
32
  * mensagem do canal. Quem entrega chama a segunda.
30
33
  */
31
34
  const horario_1 = require("./horario");
35
+ const locale_1 = require("./locale");
32
36
  const hitl_tempo_parado_1 = require("./hitl-tempo-parado");
33
37
  const decisao_autonoma_1 = require("./decisao-autonoma");
34
38
  const hitl_classificacao_1 = require("./hitl-classificacao");
@@ -60,9 +64,48 @@ function resumirHitl(itens, opcoes) {
60
64
  threadsTecnicas: [...new Set(tecnicos.map(i => i.thread).filter((t) => !!t))].sort(),
61
65
  ...(opcoes.paradosNoCondutor?.length ? { paradosNoCondutor: opcoes.paradosNoCondutor.map(p => ({ thread: p.thread, caso: p.caso,
62
66
  desdeEm: p.desdeEm, proximoPasso: p.proximoPasso })) } : {}),
67
+ ...(opcoes.impedimentosDoDono?.length ? { impedimentosDoDono: opcoes.impedimentosDoDono.map(i => ({ thread: i.thread,
68
+ fase: i.fase, comando: i.comando, retry: i.retry })) } : {}),
69
+ ...(opcoes.acoesDaVarredura?.length ? { acoesDaVarredura: opcoes.acoesDaVarredura.map(a => ({ ...a })) } : {}),
70
+ ...(opcoes.feitasPelaVarredura?.length ? { feitasPelaVarredura: opcoes.feitasPelaVarredura.map(a => ({ ...a })) } : {}),
71
+ ...(opcoes.maquinaOciosa ? { maquinaOciosa: { ...opcoes.maquinaOciosa, sugeridas: opcoes.maquinaOciosa.sugeridas.map(x => ({ ...x })) } } : {}),
63
72
  ...(opcoes.hitlDeConducao?.acimaDaMeta ? { hitlDeConducao: opcoes.hitlDeConducao } : {}),
64
73
  };
65
74
  }
75
+ /**
76
+ * RM-063 (F6): a maquina ociosa no resumo, igual nos dois canais: as vagas livres, o trabalho reservado parado e as
77
+ * proximas threads sugeridas, cada uma com o comando.
78
+ */
79
+ function linhasDaOciosidade(r, marcador, recuo) {
80
+ const o = r.maquinaOciosa;
81
+ if (!o)
82
+ return [];
83
+ return [`${marcador}Máquina ociosa: ${semQuebra(o.maquina)}, com ${o.livres} de ${o.limite} vagas livres e ${o.reservados} ` +
84
+ `${o.reservados === 1 ? 'item reservado parado' : 'itens reservados parados'}. Próximas sugeridas:`,
85
+ ...o.sugeridas.map(x => `${recuo}• ${semQuebra(x.item)}${x.thread ? ` (${semQuebra(x.thread)})` : ''}: ${uma(x.passo, 120)} ` +
86
+ `(\`${semQuebra(x.comando)}\`)`)];
87
+ }
88
+ /** Quantas acoes da varredura o resumo detalha antes de contar o resto. */
89
+ exports.TETO_DA_VARREDURA = 5;
90
+ /**
91
+ * RM-063 (F5): as acoes da varredura no resumo, iguais nos dois canais: as que esperam o dono, com o comando (o
92
+ * incidente do PR #112, mesclado e dois dias sem registro sem nenhum canal avisar), e as que ela fez sozinha.
93
+ */
94
+ function linhasDaVarredura(r, marcadores, recuo) {
95
+ const linhas = [];
96
+ const bloco = (lista, titulo) => {
97
+ if (!lista.length)
98
+ return;
99
+ const mostradas = lista.slice(0, exports.TETO_DA_VARREDURA), sobra = lista.length - mostradas.length;
100
+ if (linhas.length)
101
+ linhas.push('');
102
+ linhas.push(titulo, ...mostradas.map(a => `${recuo}• ${semQuebra(a.thread)}: ${uma(a.texto, 140)}` +
103
+ (a.comando ? ` (\`${semQuebra(a.comando)}\`)` : '')), ...(sobra > 0 ? [`${recuo}e mais ${sobra}: ork pulse`] : []));
104
+ };
105
+ bloco(r.acoesDaVarredura ?? [], `${marcadores.dono}Arrumação que a varredura faria com a sua autorização: ${(r.acoesDaVarredura ?? []).length}`);
106
+ bloco(r.feitasPelaVarredura ?? [], `${marcadores.feitas}A varredura fez sozinha, pela sua autorização: ${(r.feitasPelaVarredura ?? []).length}`);
107
+ return linhas;
108
+ }
66
109
  /** Quantas linhas do condutor o resumo mostra antes de contar o resto. */
67
110
  exports.TETO_DE_PARADOS_NO_CONDUTOR = 5;
68
111
  /**
@@ -71,7 +114,7 @@ exports.TETO_DE_PARADOS_NO_CONDUTOR = 5;
71
114
  */
72
115
  function linhaDoParadoNoCondutor(p, opcoes) {
73
116
  const { desdeEm: desde } = p;
74
- return `${p.thread} parado no condutor desde ${(0, horario_1.formatarHora)(desde, opcoes)}: ${p.proximoPasso}`;
117
+ return (0, locale_1.msg)().pulse.linhaDoCondutor(p.thread, (0, horario_1.formatarHora)(desde, opcoes), p.proximoPasso);
75
118
  }
76
119
  /** As linhas do condutor no resumo, uma por thread, com o resto contado. */
77
120
  function linhasDoCondutor(r, marcador, recuo) {
@@ -80,6 +123,24 @@ function linhasDoCondutor(r, marcador, recuo) {
80
123
  return [...mostradas.map(p => `${marcador}${linhaDoParadoNoCondutor(p, { agora: r.consultadoEm })}`),
81
124
  ...(sobra > 0 ? [`${recuo}e mais ${sobra}: ork pulse`] : [])];
82
125
  }
126
+ /** Quantos impedimentos do dono o resumo detalha antes de contar o resto. */
127
+ exports.TETO_DE_IMPEDIMENTOS = 5;
128
+ /** Uma linha so, sem caractere de controle e sem corte: o comando precisa chegar inteiro para ser copiado. */
129
+ const semQuebra = (texto) => String(texto).replace(/\p{Cc}/gu, ' ').replace(/\s+/g, ' ').trim();
130
+ /**
131
+ * RM-055 (continuacao, D3): o titulo e uma linha por impedimento do dono, iguais nos dois canais (so o
132
+ * marcador e o recuo mudam). Cada linha diz a thread, a fase, o comando exato e o retry que vem depois.
133
+ */
134
+ function linhasDosImpedimentos(r, marcador, recuo) {
135
+ const impedimentos = r.impedimentosDoDono ?? [];
136
+ if (!impedimentos.length)
137
+ return [];
138
+ const mostrados = impedimentos.slice(0, exports.TETO_DE_IMPEDIMENTOS), sobra = impedimentos.length - mostrados.length;
139
+ return [`${marcador}Só você destrava, no terminal: ${impedimentos.length}`,
140
+ ...mostrados.map(i => `${recuo}• ${semQuebra(i.thread)}${i.fase ? ` ${semQuebra(i.fase)}` : ''}: ` +
141
+ `rode \`${semQuebra(i.comando)}\`; depois \`${semQuebra(i.retry)}\``),
142
+ ...(sobra > 0 ? [`${recuo}e mais ${sobra}: ork pulse`] : [])];
143
+ }
83
144
  /** RM-057 (fatia 3): a linha do tempo parado por HITL de conducao, a mesma nos dois canais. */
84
145
  function linhaDoHitlParado(r) {
85
146
  const linha = (0, hitl_tempo_parado_1.linhaDoHitlAcimaDaMeta)(r.hitlDeConducao, { agora: r.consultadoEm });
@@ -143,6 +204,8 @@ function linhasDasDecisoes(r, marcador, recuo) {
143
204
  }
144
205
  /** Quando nao ha pergunta, o resumo diz isso em vez de pedir licenca para mandar nada. */
145
206
  exports.SEM_PERGUNTA_NO_RESUMO = 'Nada aqui pede resposta sua por este canal agora.';
207
+ /** RM-055 (continuacao, D3): sem pergunta, mas com impedimento do dono: o que fazer esta no bloco acima. */
208
+ exports.SEM_PERGUNTA_COM_IMPEDIMENTO = 'Nada aqui pede resposta sua por este canal agora; o que só você destrava está acima, no terminal.';
146
209
  /** A linha das perguntas prontas, uma so para os dois canais, pelo mesmo motivo da de baixo. */
147
210
  function linhaDasPerguntas(n) {
148
211
  return `Perguntas para você: ${n}`;
@@ -192,7 +255,7 @@ function abertura(r, codigo, marca, resposta) {
192
255
  return r.pergunta ? [`${marca}${r.pergunta}`, ...linhaDeResposta(codigo).map(l => `${resposta}${l}`), ''] : [];
193
256
  }
194
257
  function fecho(r) {
195
- return r.pergunta ? [] : ['', exports.SEM_PERGUNTA_NO_RESUMO];
258
+ return r.pergunta ? [] : ['', r.impedimentosDoDono?.length ? exports.SEM_PERGUNTA_COM_IMPEDIMENTO : exports.SEM_PERGUNTA_NO_RESUMO];
196
259
  }
197
260
  function textoTelegram(r, codigo) {
198
261
  const quando = (0, horario_1.formatarDataHoraRotulada)(r.consultadoEm, { agora: r.consultadoEm });
@@ -209,6 +272,9 @@ function textoTelegram(r, codigo) {
209
272
  ...(r.tecnicos ? [`🔧 ${linhaDosTecnicos(r)}`] : []),
210
273
  ...(r.consertos ? [`🔧 ${linhaDosConsertos(r.consertos)}`] : []),
211
274
  ...linhaDoHitlParado(r).map(l => `⏳ ${l}`),
275
+ ...(r.maquinaOciosa ? ['', ...linhasDaOciosidade(r, '💤 ', ' ')] : []),
276
+ ...(r.impedimentosDoDono?.length ? ['', ...linhasDosImpedimentos(r, '🔑 ', ' ')] : []),
277
+ ...(r.acoesDaVarredura?.length || r.feitasPelaVarredura?.length ? ['', ...linhasDaVarredura(r, { dono: '🧹 ', feitas: '🤖 ' }, ' ')] : []),
212
278
  ...(r.paradosNoCondutor?.length ? ['', ...linhasDoCondutor(r, '🚧 ', ' ')] : []),
213
279
  ...(r.acumuladas ? ['', `📥 ${linhaDoLoteGuardado(r.acumuladas)}`] : []),
214
280
  ...(r.decisoes.length || r.acimaDoLimiar.length ? ['', ...linhasDasDecisoes(r, '🧭 ', ' ')] : []),
@@ -241,6 +307,9 @@ function textoTerminal(r, codigo) {
241
307
  ...(r.tecnicos ? ['', ` ${linhaDosTecnicos(r)}`] : []),
242
308
  ...(r.consertos ? ['', ` ${linhaDosConsertos(r.consertos)}`] : []),
243
309
  ...linhaDoHitlParado(r).flatMap(l => ['', ` ${l}`]),
310
+ ...(r.maquinaOciosa ? ['', ...linhasDaOciosidade(r, ' ', ' ')] : []),
311
+ ...(r.impedimentosDoDono?.length ? ['', ...linhasDosImpedimentos(r, ' ', ' ')] : []),
312
+ ...(r.acoesDaVarredura?.length || r.feitasPelaVarredura?.length ? ['', ...linhasDaVarredura(r, { dono: ' ', feitas: ' ' }, ' ')] : []),
244
313
  ...(r.paradosNoCondutor?.length ? ['', ...linhasDoCondutor(r, ' ', ' ')] : []),
245
314
  ...(r.acumuladas ? ['', ` ${linhaDoLoteGuardado(r.acumuladas)}`] : []),
246
315
  ...(r.decisoes.length || r.acimaDoLimiar.length ? ['', ...linhasDasDecisoes(r, '', ' ').map(l => l.startsWith(' ') ? l : ` ${l}`)] : []),
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.impedimentoDaEntrega = impedimentoDaEntrega;
36
37
  exports.abrirPedidoSessao = abrirPedidoSessao;
37
38
  exports.responderSessao = responderSessao;
38
39
  exports.responderSessaoLocal = responderSessaoLocal;
@@ -56,15 +57,37 @@ const hitl_ingress_receipt_1 = require("./hitl-ingress-receipt");
56
57
  const hitl_1 = require("./hitl");
57
58
  const hitl_canais_1 = require("./hitl-canais");
58
59
  const codex_question_1 = require("./adapters/codex-question");
60
+ const entrega_por_mod_1 = require("./entrega-por-mod");
59
61
  const uuidCompleto = (s) => /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(s);
60
62
  const reciboDaProva = (r) => (0, node_crypto_1.createHash)('sha256').update(r.prova).digest('hex');
61
63
  const mesmaInstancia = (a, b) => a.sessionId === b.sessionId && a.runtime === b.runtime && a.cwd === b.cwd && a.instancia === b.instancia;
62
- function controleDeResposta(raiz, id, sessionId, runtime, controle) {
63
- const ctl = controle ?? controleNativo(runtime, raiz, id, sessionId);
64
+ /**
65
+ * O controle que responde a sessao. RM-059 (F9, D2): para `claude-bg`, o controle por mod do Mensageiro de Sessoes,
66
+ * com a caixa de saida do servidor do dono quando a resposta entrou por ele; o `controleNativo` dos outros
67
+ * chamadores (conducao, superacao, maestro), que so consultam e param, segue igual.
68
+ */
69
+ function controleDeResposta(raiz, id, sessionId, runtime, controle, caixa) {
70
+ const ctl = controle ?? (runtime === 'claude-bg' ? (0, entrega_por_mod_1.controleClaudeBgPorMod)(raiz, id, sessionId, caixa)
71
+ : controleNativo(runtime, raiz, id, sessionId));
64
72
  if (!ctl.enviar || !ctl.confirmar)
65
73
  throw new Error('runtime.unavailable: adapter não comprova entrada e recibo na mesma sessão; attach/resume não são fallback');
66
74
  return ctl;
67
75
  }
76
+ /**
77
+ * RM-059 (F9, D4): o que impede de levar agora a resposta de um pedido de sessao `claude-bg` (sem caixa de saida no
78
+ * processo, ou sem Mensageiro vivo nela), conferido antes do dialogo e antes de gravar o ingresso. `null` para os
79
+ * outros alvos e runtimes, que seguem o caminho de antes.
80
+ */
81
+ function impedimentoDaEntrega(raiz, id, pedido, controle, caixa) {
82
+ if (pedido.alvo.tipo !== 'session' || pedido.alvo.runtime !== 'claude-bg')
83
+ return null;
84
+ try {
85
+ return controleDeResposta(raiz, id, pedido.alvo.sessionId, pedido.alvo.runtime, controle, caixa).impedimentoDoEnvio?.() ?? null;
86
+ }
87
+ catch (e) {
88
+ return e.message;
89
+ }
90
+ }
68
91
  function observarBloqueio(ctl, sessionId, runtime, cwd) {
69
92
  const consulta = ctl.consultar();
70
93
  if (!consulta.ok)
@@ -73,7 +96,8 @@ function observarBloqueio(ctl, sessionId, runtime, cwd) {
73
96
  const s = matches[0];
74
97
  if (matches.length !== 1 || !s || s.runtime !== runtime || s.cwd !== cwd || s.estado !== 'blocked' ||
75
98
  !s.instancia || !s.bloqueio)
76
- throw new Error('runtime.unavailable: identidade, cwd e prompt bloqueado exatos não comprovados');
99
+ throw new Error('runtime.unavailable: identidade, cwd e prompt bloqueado exatos não comprovados' +
100
+ (matches.length === 1 && s?.limitacao ? ` (${s.limitacao.codigo})` : ''));
77
101
  return { sessionId: s.sessionId, runtime: s.runtime, cwd: s.cwd, estado: s.estado, instancia: s.instancia, bloqueio: s.bloqueio, perguntaNativa: s.perguntaNativa };
78
102
  }
79
103
  /** Cria somente um pedido vinculado ao despacho corrente e ao prompt nativo observado. */
@@ -94,7 +118,18 @@ function abrirPedidoSessao(raiz, id, sessionId, opcoes, controle) {
94
118
  if (!mesmaInstancia(sessao, revalidada) || sessao.bloqueio !== revalidada.bloqueio)
95
119
  throw new Error('prompt ou instância mudou durante o pedido');
96
120
  const nativa = sessao.perguntaNativa;
97
- if (!nativa || JSON.stringify(nativa) !== JSON.stringify(revalidada.perguntaNativa) ||
121
+ if (!nativa) {
122
+ // RM-059 (F9): o codigo da limitacao (turno ausente, pergunta longa) diz ao operador por que nao abriu.
123
+ let codigo;
124
+ try {
125
+ codigo = ctl.consultar().sessoes.find(s => s.sessionId === sessionId)?.limitacao?.codigo;
126
+ }
127
+ catch {
128
+ codigo = undefined;
129
+ }
130
+ throw new Error('runtime.unavailable: conteúdo nativo da pergunta não comprovado' + (codigo ? ` (${codigo})` : ''));
131
+ }
132
+ if (JSON.stringify(nativa) !== JSON.stringify(revalidada.perguntaNativa) ||
98
133
  (0, codex_question_1.projetarPergunta)({ isBlocking: true, questions: [nativa] }).sha256 !== nativa.sha256)
99
134
  throw new Error('runtime.unavailable: conteúdo nativo da pergunta não comprovado');
100
135
  if (opcoes.pergunta !== undefined && opcoes.pergunta !== nativa.question)
@@ -156,7 +191,7 @@ function orientacaoDaResposta(tipo, quantasOpcoes) {
156
191
  * O núcleo da entrega, comum aos quatro canais: conferência do vínculo nativo, reserva
157
192
  * durável, envio único e confirmação correlacionada. Nenhum canal ganha atalho aqui.
158
193
  */
159
- function entregarNaSessao(raiz, id, pedido, prov, controle) {
194
+ function entregarNaSessao(raiz, id, pedido, prov, controle, caixa) {
160
195
  if (pedido.alvo.tipo !== 'session')
161
196
  throw new Error('pedido destina-se ao gate, não à sessão');
162
197
  const pedidoId = pedido.id;
@@ -169,7 +204,7 @@ function entregarNaSessao(raiz, id, pedido, prov, controle) {
169
204
  !sessao.instancia || !sessao.bloqueio || sessao.cwd !== path.resolve((0, thread_1.lerThread)(raiz, id).worktree ?? raiz)) {
170
205
  throw new Error('runtime.unavailable: pedido sem vínculo nativo exato');
171
206
  }
172
- const ctl = controleDeResposta(raiz, id, sessionId, runtime, controle);
207
+ const ctl = controleDeResposta(raiz, id, sessionId, runtime, controle, caixa);
173
208
  const pendente = eventos.find(e => e.tipo === 'session_answer_sending' && e.pedidoId === pedidoId);
174
209
  if (pendente && (pendente.recibo !== prov.recibo || pendente.mensagem !== prov.mensagem || pendente.autorizadoPor !== prov.autorizadoPor)) {
175
210
  throw new Error('envio já iniciado; resposta divergente recusada');
@@ -180,12 +215,18 @@ function entregarNaSessao(raiz, id, pedido, prov, controle) {
180
215
  const entrega = { contrato: 'ork.session-answer/v1',
181
216
  envioId: pendente ? String(pendente.envioId) : (0, node_crypto_1.randomUUID)(), pedidoId, thread: id, fase: pedido.fase, sessao, recibo: prov.recibo };
182
217
  if (!pendente) {
218
+ // RM-059 (F9, D4): sem quem leve a mensagem (sem caixa de saida, sem Mensageiro vivo), nada se reserva.
219
+ const impedimento = ctl.impedimentoDoEnvio?.() ?? null;
220
+ if (impedimento)
221
+ throw new Error(impedimento);
183
222
  for (let i = 0; i < 2; i++) {
184
223
  const atual = observarBloqueio(ctl, sessionId, runtime, sessao.cwd);
185
224
  if (!mesmaInstancia(atual, sessao) || atual.bloqueio !== sessao.bloqueio || JSON.stringify(atual.perguntaNativa) !== JSON.stringify(sessao.perguntaNativa))
186
225
  throw new Error('prompt ou instância mudou antes do envio');
187
226
  }
188
- (0, ledger_1.registrar)(dir, id, 'session_answer_sending', { ...prov.dados, sessionId, runtime,
227
+ // RM-059 (F9, D3): no envio por mod, a reconciliacao fecha pelo recibo do receptor, que confere o `recibo` deste
228
+ // evento; o ingresso local nao o levava aqui (so o `reciboEntrega`), e o Telegram ja leva o mesmo valor.
229
+ (0, ledger_1.registrar)(dir, id, 'session_answer_sending', { ...(ctl.assincrono ? { recibo: prov.recibo } : {}), ...prov.dados, sessionId, runtime,
189
230
  instancia: sessao.instancia, bloqueio: sessao.bloqueio, envioId: entrega.envioId });
190
231
  // O número só vira rótulo nativo quando o pedido aceita OPÇÃO. Em texto livre a
191
232
  // resposta humana chega literal ao receptor, inclusive quando é "1" ou "12".
@@ -206,6 +247,9 @@ function entregarNaSessao(raiz, id, pedido, prov, controle) {
206
247
  catch {
207
248
  throw new Error('runtime.unavailable: consulta do recibo falhou; envio não será repetido');
208
249
  }
250
+ // RM-059 (F9, D3): o envio por mod ainda sem recibo do receptor nao e falha; a reconciliacao fecha depois.
251
+ if (!ack && ctl.assincrono)
252
+ return { ...resultado, estado: 'aguardando-receptor', repetida: !!pendente };
209
253
  if (!ack || ack.estado !== 'recebida' || ack.contrato !== entrega.contrato || ack.envioId !== entrega.envioId ||
210
254
  ack.pedidoId !== pedidoId || ack.thread !== id || ack.fase !== pedido.fase || ack.recibo !== entrega.recibo ||
211
255
  !ack.sessao || !mesmaInstancia(ack.sessao, sessao) || ack.sessao.bloqueio !== sessao.bloqueio) {
@@ -221,6 +265,15 @@ function entregarNaSessao(raiz, id, pedido, prov, controle) {
221
265
  }
222
266
  /** Uma intenção durável impede reenvio após crash, timeout ou confirmação divergente. */
223
267
  function responderSessao(raiz, id, pedidoId, r, controle, quando) {
268
+ // RM-059 (F9, D4): a sessao `claude-bg` so recebe pelo Mensageiro, e este caminho (o `ork sessions answer` do
269
+ // Telegram) nao tem caixa de saida: recusa antes de gravar o ingresso, e o pedido segue aberto. Resposta ja
270
+ // entregue ou envio ja reservado seguem o caminho de antes (a repeticao e idempotente e nada reserva de novo).
271
+ const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id));
272
+ const solicitado = eventos.find(e => e.tipo === 'hitl_requested' && e.pedido?.id === pedidoId);
273
+ const andamento = eventos.some(e => ['session_answered', 'session_answer_sending'].includes(e.tipo) && e.pedidoId === pedidoId);
274
+ const impedimento = solicitado?.pedido && !andamento ? impedimentoDaEntrega(raiz, id, solicitado.pedido, controle) : null;
275
+ if (impedimento)
276
+ throw new Error(impedimento);
224
277
  (0, hitl_gates_1.receberResposta)(raiz, id, pedidoId, r, quando);
225
278
  return (0, hitl_gates_1.comLockHitl)(raiz, id, () => {
226
279
  const { pedido, anterior } = (0, hitl_gates_1.conferirResposta)(raiz, id, pedidoId, r, quando);
@@ -248,7 +301,7 @@ function responderSessao(raiz, id, pedidoId, r, controle, quando) {
248
301
  * Aceita texto livre quando a pergunta nativa aceita, porque uma pergunta aberta respondida
249
302
  * por menu vira outra pergunta.
250
303
  */
251
- function responderSessaoLocal(raiz, id, pedidoId, token, controle) {
304
+ function responderSessaoLocal(raiz, id, pedidoId, token, controle, caixa) {
252
305
  const atestado = (0, hitl_local_atestado_1.consumirAtestadoLocal)(token, raiz, id, pedidoId);
253
306
  return (0, hitl_gates_1.comLockHitl)(raiz, id, () => {
254
307
  const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id));
@@ -284,7 +337,7 @@ function responderSessaoLocal(raiz, id, pedidoId, token, controle) {
284
337
  evidenciar: (entrega) => (0, hitl_local_receipt_1.gravarEvidenciaLocalSessao)(atestado, { fase: String(pedido.fase),
285
338
  sessionId: entrega.sessao.sessionId, runtime: entrega.sessao.runtime,
286
339
  instancia: entrega.sessao.instancia, bloqueio: String(entrega.sessao.bloqueio), envioId: entrega.envioId }),
287
- }, controle);
340
+ }, controle, caixa);
288
341
  });
289
342
  }
290
343
  /**
@@ -42,6 +42,7 @@ const hitl_contract_1 = require("./hitl-contract");
42
42
  const horario_1 = require("./horario");
43
43
  const ledger_1 = require("./ledger");
44
44
  const thread_1 = require("./thread");
45
+ const locale_1 = require("./locale");
45
46
  /** A meta da RM-057: mediana de resposta abaixo de 5 minutos. */
46
47
  exports.META_DA_MEDIANA_DE_RESPOSTA_MS = 5 * 60_000;
47
48
  const RESPOSTAS = ['human_gate', 'session_answered'];
@@ -178,13 +179,12 @@ const emMinutos = (ms) => `${(ms / 60_000).toFixed(1)} min`;
178
179
  function textoDaMediana(h) {
179
180
  const s = h.seteDias;
180
181
  if (s.medianaRespostaMs === null)
181
- return 'mediana de 7 dias sem resposta medida';
182
- return `mediana de 7 dias ${emMinutos(s.medianaRespostaMs)} (${s.dentroDaMeta ? 'dentro' : 'acima'} da meta de 5 min, ` +
183
- `${s.respondidos} resposta(s))`;
182
+ return (0, locale_1.msg)().pulse.medianaSemResposta;
183
+ return (0, locale_1.msg)().pulse.mediana(emMinutos(s.medianaRespostaMs), s.dentroDaMeta, s.respondidos);
184
184
  }
185
185
  /** "<thread> (<fase>) parada ha 12min, desde 01:02": a hora no fuso do dono (RM-035). */
186
186
  function linhaDaPerguntaParada(p, opcoes) {
187
- return `${p.thread} (${p.fase}) parada há ${(0, horario_1.duracaoRelativa)(p.paradaHaMin)}, desde ${(0, horario_1.formatarHora)(p.desdeEm, opcoes)}`;
187
+ return (0, locale_1.msg)().pulse.perguntaParada(p.thread, p.fase, (0, horario_1.duracaoRelativa)(p.paradaHaMin), (0, horario_1.formatarHora)(p.desdeEm, opcoes));
188
188
  }
189
189
  /**
190
190
  * A linha unica do resumo do pulse, so quando passou da meta: quantas abertas, a mais antiga e a
@@ -34,11 +34,13 @@ exports.consentimentoDoTrecho = consentimentoDoTrecho;
34
34
  * com teste, e nunca efeito colateral de alguem achar que "entendeu" o dono.
35
35
  */
36
36
  exports.VOCABULARIO_LIVRE = Object.freeze({
37
+ // RM-057 (resposta curta, D8 da ork-rm057respost): "autorizo" e as variações, que o dono usa para o arco #Noctum.
37
38
  afirmar: ['sim', 's', 'ok', 'pode', 'pode seguir', 'pode ir', 'segue', 'siga', 'seguir', 'manda', 'aprovo', 'aprovado',
38
- 'aprovada', 'aprovar', 'aprova', 'confirmo', 'confirmado', 'de acordo'],
39
+ 'aprovada', 'aprovar', 'aprova', 'confirmo', 'confirmado', 'de acordo', 'autorizo', 'autorizado', 'autorizada', 'autorizar',
40
+ 'autoriza'],
39
41
  negar: ['nao', 'n'],
40
42
  revisar: ['recuso', 'recusado', 'recusar', 'reprovo', 'reprovado', 'revisar', 'revisao', 'refazer', 'volta', 'voltar'],
41
- esperar: ['esperar', 'espera', 'aguardar', 'aguarda', 'aguarde', 'depois', 'mais tarde', 'agora nao'],
43
+ esperar: ['esperar', 'espera', 'aguardar', 'aguarda', 'aguarde', 'depois', 'mais tarde', 'agora nao', 'adiar', 'adia', 'adio'],
42
44
  detalhe: ['detalhe', 'detalhes', 'evidencia', 'evidencias'],
43
45
  });
44
46
  /** Que acoes de alternativa cada intencao casa. `negar` casa duas de proposito: e ambigua num gate. */
@@ -59,8 +61,9 @@ exports.JANELA_DO_TEXTO_LIVRE_MIN = 60;
59
61
  * formas `lista` e `livre` de `GRAMATICA_DO_PULSE`, que os adaptadores copiam texto a texto.
60
62
  */
61
63
  const PALAVRAS_DA_FORMA = 'pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|' +
62
- 'confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|' +
63
- 'volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?';
64
+ 'confirmo|confirmado|de acordo|autorizo|autorizado|autorizada|autorizar|autoriza|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|' +
65
+ 'reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|adiar|adia|' +
66
+ 'adio|detalhes?|evid[eê]ncias?';
64
67
  /** Uma resposta: letra, ou palavra do vocabulario. */
65
68
  const RESPOSTA_DA_FORMA = `(?:[a-e]|${PALAVRAS_DA_FORMA})`;
66
69
  /**
package/dist/hitl.js CHANGED
@@ -88,6 +88,8 @@ const horario_1 = require("./horario");
88
88
  Object.defineProperty(exports, "duracaoCurta", { enumerable: true, get: function () { return horario_1.duracaoCurta; } });
89
89
  const hitl_estado_1 = require("./hitl-estado");
90
90
  const redacao_url_1 = require("./redacao-url");
91
+ const locale_1 = require("./locale");
92
+ const locale_pulse_1 = require("./locale-pulse");
91
93
  /** Limite de atencao padrao, em minutos, igual ao do monitor de orquestracao. */
92
94
  exports.ATENCAO_PADRAO_MIN = 30;
93
95
  function redigirSegredos(texto) {
@@ -110,28 +112,34 @@ function contextoSeguro(texto, linhas = 20) {
110
112
  * `stopped` NAO pede humano: a sessao foi parada por decisao de alguem. `failed` pede,
111
113
  * porque alguem precisa decidir entre retomar, corrigir ou abandonar.
112
114
  */
115
+ // RM-061 (F2b): o detalhe de cada estado tem a fonte no catalogo pt-BR (`locale-pulse.ts`), com o ingles ao lado.
113
116
  const REGRA_POR_ESTADO = {
114
117
  blocked: {
115
118
  classe: 'hitl',
116
119
  precisaDeHumano: true,
117
- detalhe: 'sessao parada esperando acao humana (prompt, permissao ou credencial)',
120
+ detalhe: locale_pulse_1.PULSE_PT_BR.sessao.blocked,
118
121
  },
119
122
  failed: {
120
123
  classe: 'falha',
121
124
  precisaDeHumano: true,
122
- detalhe: 'sessao terminou em erro: alguem decide entre retomar, corrigir ou abandonar',
125
+ detalhe: locale_pulse_1.PULSE_PT_BR.sessao.failed,
123
126
  },
124
- working: { classe: 'trabalhando', precisaDeHumano: false, detalhe: 'sessao em execucao' },
125
- done: { classe: 'concluida', precisaDeHumano: false, detalhe: 'sessao concluiu' },
127
+ working: { classe: 'trabalhando', precisaDeHumano: false, detalhe: locale_pulse_1.PULSE_PT_BR.sessao.working },
128
+ // RM-063 (fatia 3, achado a): a sessao interativa do Claude Code aparece `busy` enquanto executa um turno, e o
129
+ // runtime tambem diz `running`. Fora do catalogo elas viravam "possivel parada" no pulse e em "O que precisa de
130
+ // voce": e trabalho, como o observador (`session-watcher-claude.ts`) e a capacidade do #Noctum ja as liam.
131
+ busy: { classe: 'trabalhando', precisaDeHumano: false, detalhe: locale_pulse_1.PULSE_PT_BR.sessao.busy },
132
+ running: { classe: 'trabalhando', precisaDeHumano: false, detalhe: locale_pulse_1.PULSE_PT_BR.sessao.running },
133
+ done: { classe: 'concluida', precisaDeHumano: false, detalhe: locale_pulse_1.PULSE_PT_BR.sessao.done },
126
134
  stopped: {
127
135
  classe: 'interrompida',
128
136
  precisaDeHumano: false,
129
- detalhe: 'sessao parada por decisao humana (`claude stop`)',
137
+ detalhe: locale_pulse_1.PULSE_PT_BR.sessao.stopped,
130
138
  },
131
139
  idle: {
132
140
  classe: 'interativa',
133
141
  precisaDeHumano: false,
134
- detalhe: 'sessao interativa ociosa, conduzida por um humano no terminal',
142
+ detalhe: locale_pulse_1.PULSE_PT_BR.sessao.idle,
135
143
  },
136
144
  };
137
145
  /** Estado cru da sessao: `state` manda, `status` e o fallback historico. */
@@ -142,14 +150,13 @@ function estadoBruto(s) {
142
150
  /** Classifica o estado cru do runtime. Estado que nao esta no mapa avisa a mais. */
143
151
  function classificarEstado(estado) {
144
152
  const regra = REGRA_POR_ESTADO[estado];
153
+ // RM-061 (F2b, G2): o detalhe vem do catalogo (o mesmo pt-BR da tabela) e o pulse o remonta no locale.
145
154
  if (regra)
146
- return regra;
155
+ return { ...regra, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.sessao[estado] ?? regra.detalhe) };
147
156
  return {
148
157
  classe: 'desconhecida',
149
158
  precisaDeHumano: true,
150
- detalhe: estado === ''
151
- ? 'runtime nao informou estado desta sessao: tratada como possivel parada'
152
- : `estado "${estado}" nao esta no catalogo do ork: tratado como possivel parada`,
159
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => estado === '' ? m.pulse.sessaoSemEstado : m.pulse.sessaoEstadoForaDoCatalogo(estado)),
153
160
  };
154
161
  }
155
162
  /** Resposta do `claude logs` quando o job da sessao ja saiu do runtime. */
@@ -279,28 +286,22 @@ function lerPerguntaDaTela(textoLimpo) {
279
286
  * inventa opcao que a sessao nao deu.
280
287
  */
281
288
  function recomendarPara(classe, tipo, id) {
282
- if (classe === 'abandonada') {
283
- return ('nao responda: o job ja saiu. Confira o que ficou na worktree da sessao e ' +
284
- 'redespache so o resto do trabalho.');
285
- }
286
- if (classe === 'falha') {
287
- return `leia \`ork sessions logs ${id}\` e decida entre retomar, corrigir a causa ou abandonar a sessao.`;
288
- }
289
- if (classe === 'desconhecida') {
290
- return `estado fora do catalogo: confirme no \`ork sessions logs ${id}\` se a sessao esta mesmo parada.`;
291
- }
292
- switch (tipo) {
293
- case 'hitl.credencial':
294
- return (`entregue o segredo agora (\`claude attach ${id}\`) para nao segurar a entrega; ` +
295
- 'se este mesmo bloqueio ja se repetiu, troque por credencial de automacao e ele nao volta.');
296
- case 'hitl.permissao':
297
- return (`responda o prompt (\`claude attach ${id}\`); se o comando e rotineiro nesse projeto, ` +
298
- 'coloque-o na allowlist de permissoes para nao parar de novo pelo mesmo motivo.');
299
- case 'hitl.pergunta':
300
- return `abra a sessao (\`claude attach ${id}\`) e escolha entre as opcoes que ela listou.`;
301
- default:
302
- return `veja o que a sessao pede com \`ork sessions logs ${id}\` antes de responder.`;
303
- }
289
+ // RM-061 (F2b, G2): nasce em pt-BR pelo catalogo (o --json guarda) e o pulse a remonta no locale.
290
+ return (0, locale_1.textoDoCatalogo)((m) => {
291
+ const r = m.pulse.recomendacaoDoRadar;
292
+ if (classe === 'abandonada')
293
+ return r.abandonada;
294
+ if (classe === 'falha')
295
+ return r.falha(id);
296
+ if (classe === 'desconhecida')
297
+ return r.desconhecida(id);
298
+ switch (tipo) {
299
+ case 'hitl.credencial': return r.credencial(id);
300
+ case 'hitl.permissao': return r.permissao(id);
301
+ case 'hitl.pergunta': return r.pergunta(id);
302
+ default: return r.outra(id);
303
+ }
304
+ });
304
305
  }
305
306
  /** Minutos inteiros entre um epoch em ms e um carimbo ISO (nunca negativo). */
306
307
  function idadeEmMinutos(inicioMs, ateEm) {
@@ -440,7 +441,7 @@ function varrerSessoes(opcoes = {}) {
440
441
  }
441
442
  const consultaClaude = opcoes.consulta ?? (adapter.disponivel()
442
443
  ? adapter.consultarSessoes(opcoes.soDaRaiz && raiz ? raiz : undefined, true)
443
- : { ok: false, sessoes: [], detalhe: 'runtime adapter indisponivel nesta maquina (`claude` fora do PATH)' });
444
+ : { ok: false, sessoes: [], detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.adapterIndisponivel) });
444
445
  const consulta = { ...consultaClaude, ok: consultaClaude.ok || nativas.size > 0,
445
446
  sessoes: [...consultaClaude.sessoes, ...nativas.values()] };
446
447
  if (!consulta.ok) {
@@ -637,74 +638,72 @@ function dirCurto(cwd) {
637
638
  }
638
639
  /** Texto de `ork sessions hitl`. */
639
640
  function textoDoRadar(r) {
641
+ const m = (0, locale_1.msg)().operacao.restante.sessions.radar;
640
642
  const L = [];
641
- L.push(`Radar de sessoes do runtime (${r.resumo.total} sessao(oes) na maquina)`);
642
- L.push(` precisam de humano: ${r.resumo.precisamDeHumano} (HITL vivo ${r.resumo.hitl}, ` +
643
- `abandonada ${r.resumo.abandonadas}, falha ${r.resumo.falhas}, ` +
644
- `estado desconhecido ${r.resumo.desconhecidas}) | ` +
645
- `trabalhando: ${r.resumo.trabalhando} | fora do ork: ${r.resumo.foraDoOrk}`);
646
- L.push(` limite de atencao: ${r.atencaoMin} min (${r.resumo.acimaDoLimite} parada(s) acima, marcadas com !)`);
643
+ L.push(m.titulo(r.resumo.total));
644
+ L.push(m.resumo(r.resumo.precisamDeHumano, r.resumo.hitl, r.resumo.abandonadas, r.resumo.falhas, r.resumo.desconhecidas, r.resumo.trabalhando, r.resumo.foraDoOrk));
645
+ L.push(m.limite(r.atencaoMin, r.resumo.acimaDoLimite));
647
646
  if (!r.runtimeConsultado) {
648
- L.push(` [fail] ${r.runtimeDetalhe}: NAO da para saber quem esta parado`);
647
+ L.push(m.falha(r.runtimeDetalhe));
649
648
  return L.join('\n');
650
649
  }
651
650
  if (!r.logsLidos) {
652
- L.push(' [warn] --sem-logs: o radar diz QUEM esta parado, mas nao O QUE cada sessao pergunta');
651
+ L.push(m.semLogs);
653
652
  }
654
653
  L.push('');
655
654
  if (r.sessoes.length === 0) {
656
- L.push(' Nenhuma sessao na varredura.');
655
+ L.push(m.nenhuma);
657
656
  return L.join('\n');
658
657
  }
659
- L.push((0, util_1.tabela)(['ID', 'NOME', 'CLASSE', 'ESTADO', 'TIPO', 'DIRETORIO', 'THREAD', 'IDADE'], r.sessoes.map((s) => [
658
+ L.push((0, util_1.tabela)([...m.colunas], r.sessoes.map((s) => [
660
659
  s.id,
661
660
  s.nome,
662
661
  s.classe,
663
- s.estadoBruto || '(vazio)',
662
+ s.estadoBruto || m.vazio,
664
663
  s.tipoDeHitl ?? '-',
665
664
  dirCurto(s.cwd),
666
- s.thread ? `${s.thread.id}/${s.thread.fase}` : 'fora do ork',
665
+ s.thread ? `${s.thread.id}/${s.thread.fase}` : m.fora,
667
666
  `${(0, horario_1.duracaoRelativa)(s.idadeMin)}${s.precisaDeHumano && s.acimaDoLimite ? ' !' : ''}`,
668
667
  ])));
669
668
  const travadas = r.sessoes.filter((s) => s.precisaDeHumano);
670
669
  if (travadas.length === 0) {
671
670
  L.push('');
672
- L.push(' Nenhuma sessao esperando o humano.');
671
+ L.push(m.nenhumaEsperando);
673
672
  return L.join('\n');
674
673
  }
675
674
  const vivas = travadas.filter((s) => s.classe !== 'abandonada');
676
675
  if (vivas.length > 0) {
677
676
  L.push('');
678
- L.push('Esperando o HUMANO agora, com o job VIVO (responder destrava na hora):');
677
+ L.push(m.vivas);
679
678
  for (const s of vivas) {
680
679
  L.push(` ${s.id} ${s.nome} [${s.classe}${s.tipoDeHitl ? '/' + s.tipoDeHitl : ''}]`);
681
- L.push(` onde : ${s.cwd}` +
682
- (s.thread ? ` (thread ${s.thread.id}, fase ${s.thread.fase})` : ' (sessao fora do ork)'));
683
- L.push(` por que : ${s.detalhe}`);
680
+ L.push(` ${m.onde.padEnd(9)}: ${s.cwd}` +
681
+ ` (${s.thread ? m.thread(s.thread.id, s.thread.fase) : m.sessaoFora})`);
682
+ L.push(` ${m.porque.padEnd(9)}: ${s.detalhe}`);
684
683
  if (s.pergunta)
685
- L.push(` pergunta : ${s.pergunta}`);
684
+ L.push(` ${m.pergunta.padEnd(9)}: ${s.pergunta}`);
686
685
  for (const linha of s.contextoLogs ?? [])
687
- L.push(` log : ${linha}`);
686
+ L.push(` ${m.log.padEnd(9)}: ${linha}`);
688
687
  for (const a of s.alternativas)
689
- L.push(` opcao : ${a}`);
690
- L.push(` parada ha: ${s.paradaHaMin == null ? 'desconhecido; registre com --registrar' : (0, horario_1.duracaoRelativa)(s.paradaHaMin) + ' (desde a primeira observação)'}`);
691
- L.push(` viva ha : ${(0, horario_1.duracaoRelativa)(s.idadeMin)} (idade da sessao)`);
692
- L.push(` ver : ${s.comandos.logs}`);
693
- L.push(` responder: ${s.comandos.attach}`);
694
- L.push(` recomendo: ${s.recomendacao}`);
688
+ L.push(` ${m.opcao.padEnd(9)}: ${a}`);
689
+ L.push(` ${m.parada.padEnd(9)}: ${s.paradaHaMin == null ? m.paradaDesconhecida : (0, horario_1.duracaoRelativa)(s.paradaHaMin) + ` (${m.desdeObservacao})`}`);
690
+ L.push(` ${m.viva.padEnd(9)}: ${(0, horario_1.duracaoRelativa)(s.idadeMin)} (${m.idade})`);
691
+ L.push(` ${m.ver.padEnd(9)}: ${s.comandos.logs}`);
692
+ L.push(` ${m.responder.padEnd(9)}: ${s.comandos.attach}`);
693
+ L.push(` ${m.recomendo.padEnd(9)}: ${s.recomendacao}`);
695
694
  }
696
695
  }
697
696
  const abandonadas = travadas.filter((s) => s.classe === 'abandonada');
698
697
  if (abandonadas.length > 0) {
699
698
  L.push('');
700
- L.push('MORRERAM esperando resposta (job ja saiu: nao adianta responder, o trabalho parou):');
699
+ L.push(m.mortas);
701
700
  for (const s of abandonadas) {
702
701
  L.push(` ${s.id} ${s.nome}`);
703
- L.push(` onde : ${s.cwd}` +
704
- (s.thread ? ` (thread ${s.thread.id}, fase ${s.thread.fase})` : ' (sessao fora do ork)'));
705
- L.push(` por que : ${s.detalhe}`);
706
- L.push(` viva ha : ${(0, horario_1.duracaoRelativa)(s.idadeMin)} desde que a sessao comecou`);
707
- L.push(` recomendo: ${s.recomendacao}`);
702
+ L.push(` ${m.onde.padEnd(9)}: ${s.cwd}` +
703
+ ` (${s.thread ? m.thread(s.thread.id, s.thread.fase) : m.sessaoFora})`);
704
+ L.push(` ${m.porque.padEnd(9)}: ${s.detalhe}`);
705
+ L.push(` ${m.viva.padEnd(9)}: ${(0, horario_1.duracaoRelativa)(s.idadeMin)} ${m.desdeInicio}`);
706
+ L.push(` ${m.recomendo.padEnd(9)}: ${s.recomendacao}`);
708
707
  }
709
708
  }
710
709
  return L.join('\n');