@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
package/dist/ocupacao.js CHANGED
@@ -21,7 +21,7 @@
21
21
  * `slot_released` no ledger da thread devolvida.
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.EVENTOS_QUE_DESTRAVAM = exports.PAUSA_PREVISTA = void 0;
24
+ exports.CARENCIA_DO_TURNO_ENCERRADO_MIN = exports.EVENTOS_QUE_DESTRAVAM = exports.PAUSA_PREVISTA = void 0;
25
25
  exports.ehAprovacaoHumana = ehAprovacaoHumana;
26
26
  exports.ehPausaPrevista = ehPausaPrevista;
27
27
  exports.faseTemPausaPrevista = faseTemPausaPrevista;
@@ -29,6 +29,7 @@ exports.sessaoLivreDaVaga = sessaoLivreDaVaga;
29
29
  exports.avaliarOcupacao = avaliarOcupacao;
30
30
  const ledger_1 = require("./ledger");
31
31
  const impedimento_1 = require("./impedimento");
32
+ const types_1 = require("./types");
32
33
  const sessoes_adopt_1 = require("./sessoes-adopt");
33
34
  /** Estado que o `ork phase run` grava quando o bloco despachado pausa ao fim. */
34
35
  exports.PAUSA_PREVISTA = 'prevista ao fim do bloco';
@@ -90,7 +91,9 @@ function ultimaAtividadeEm(eventos) {
90
91
  * `human.pending` sem destravamento, ou sessao bloqueada no runtime), e a que o pulse declarou em silencio
91
92
  * (`runtime.silencio`). A pausa PREVISTA ao fim do bloco nao entra: ela e gravada no proprio
92
93
  * despacho e a sessao roda ate o fim do bloco. O impedimento de verify tambem nao: a sessao corrige e
93
- * verifica de novo. Somente leitura.
94
+ * verifica de novo. RM-058 N2 (D8): a quarta e a sessao com o turno encerrado pelo ledger (`turno-encerrado`), passada
95
+ * a carencia.
96
+ * Somente leitura.
94
97
  */
95
98
  function sessaoLivreDaVaga(doLedger, desde, agora, staleMin,
96
99
  /** A-3 do CHECK 4: o bloqueio no runtime e por sessao; o de outra sessao (a sucedida) nao libera esta. */
@@ -116,8 +119,33 @@ sessionId) {
116
119
  (!sessionId || e.sessionId === sessionId)).at(-1);
117
120
  if (bloqueio?.tipo === 'sessao_bloqueada')
118
121
  return 'human.pending';
122
+ if (sessionId && turnoEncerrado(eventos, sessionId, desde, agora))
123
+ return 'turno-encerrado';
119
124
  return null;
120
125
  }
126
+ /**
127
+ * RM-058 N2 (A8 do CHECK da ork-rm058n2): a carencia do turno encerrado. O Stop do Claude Code dispara a cada fim de
128
+ * turno, e a sessao que espera uma tarefa em segundo plano volta sozinha quando ela acaba; nesse intervalo a vaga
129
+ * continua dela. Sem atividade da sessao por toda a carencia, o turno acabou de vez e a vaga sai.
130
+ */
131
+ exports.CARENCIA_DO_TURNO_ENCERRADO_MIN = 15;
132
+ /**
133
+ * RM-058 N2 (D8 da ork-rm058n2): a sessao cujo turno o ledger prova encerrado (o Stop correlacionado e nenhuma
134
+ * atividade dela depois, ha pelo menos `CARENCIA_DO_TURNO_ENCERRADO_MIN`) nao trabalha mais, mesmo com o lease de pe:
135
+ * e a mesma leitura do pulse (P7). Em 12/10/2026 o `runtime_stop` sem `phase_result` (sessao parada com `claude stop`
136
+ * antes do resultado) prendia a vaga ate a thread fechar. A sessao que volta a trabalhar tem atividade depois do Stop
137
+ * e volta a ocupar.
138
+ */
139
+ function turnoEncerrado(eventos, sessionId, desde, agora) {
140
+ const despacho = [...eventos].reverse().find((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada && e.sessionId === sessionId);
141
+ if (!despacho)
142
+ return false;
143
+ // Carregado na hora: `parado-no-condutor` importa este modulo, e o import no topo fecharia um ciclo de modulos.
144
+ const { fimDoTurno } = require('./parado-no-condutor');
145
+ const fim = fimDoTurno(eventos, despacho);
146
+ return !!fim && fim.tipo !== 'outro' && fim.sessionId === sessionId && Date.parse(fim.em) >= Date.parse(desde) &&
147
+ minutos(fim.em, agora) >= exports.CARENCIA_DO_TURNO_ENCERRADO_MIN;
148
+ }
121
149
  /** A thread tem pausa humana ABERTA? Mesmas tres fontes do monitor, resumidas. */
122
150
  function pausaHumanaAberta(thread, eventos) {
123
151
  if (thread.status === 'pausada' && faseTemPausaPrevista(thread)) {
@@ -224,7 +252,8 @@ function avaliarOcupacao(thread, doLedger, opcoes) {
224
252
  };
225
253
  }
226
254
  const registro = (0, sessoes_adopt_1.ehRegistroDeAdocao)(thread);
227
- if (!registro && (sessaoEstado === 'working' || (sessaoEstado === '' && sessionId !== null))) {
255
+ // RM-063 (fatia 3, achado a): `busy` e `running` tambem sao a sessao trabalhando.
256
+ if (!registro && ((0, types_1.estadoDeTrabalho)(sessaoEstado) || (sessaoEstado === '' && sessionId !== null))) {
228
257
  return {
229
258
  ...base,
230
259
  classe: 'ativa',
@@ -33,7 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ETAPAS_ONBOARDING = exports.PAUTA_ONBOARDING = exports.ONDE_FICAM_OS_SEGREDOS = exports.CONTRATO_ONBOARDING = void 0;
36
+ exports.PAUTA_ONBOARDING = exports.ETAPAS_ONBOARDING = exports.ONDE_FICAM_OS_SEGREDOS = exports.CONTRATO_ONBOARDING = void 0;
37
+ exports.perguntaDaEtapa = perguntaDaEtapa;
37
38
  exports.caminhoOnboarding = caminhoOnboarding;
38
39
  exports.validarConteudo = validarConteudo;
39
40
  exports.jsonCanonico = jsonCanonico;
@@ -42,6 +43,7 @@ exports.lerOnboarding = lerOnboarding;
42
43
  exports.gravarEtapa = gravarEtapa;
43
44
  exports.resetarOnboarding = resetarOnboarding;
44
45
  exports.textoDaPauta = textoDaPauta;
46
+ exports.validarPedidoDeEtapa = validarPedidoDeEtapa;
45
47
  /** Entrevista determinística; hosts conduzem a conversa a partir desta pauta. */
46
48
  const fs = __importStar(require("node:fs"));
47
49
  const path = __importStar(require("node:path"));
@@ -49,28 +51,33 @@ const node_crypto_1 = require("node:crypto");
49
51
  const manifest_1 = require("./manifest");
50
52
  const project_state_1 = require("./project-state");
51
53
  const ledger_1 = require("./ledger");
54
+ const transporte_do_canal_1 = require("./transporte-do-canal");
52
55
  const policies_1 = require("./policies");
53
56
  const horario_1 = require("./horario");
54
57
  const experiencia_1 = require("./experiencia");
55
58
  const yaml_1 = require("./yaml");
59
+ const locale_1 = require("./locale");
56
60
  exports.CONTRATO_ONBOARDING = 'ork.onboarding/v1';
57
61
  /**
58
62
  * Fatia 2 do ensaio da 0.5.0 (P5): onde ficam os segredos, para quem usa o Hermes e para quem nao
59
63
  * usa. Perguntas, erro e ajuda leem daqui; as docs e os hosts repetem a frase, conferida por teste.
60
64
  */
61
- exports.ONDE_FICAM_OS_SEGREDOS = 'no ambiente do processo ou no cofre do host (no Hermes, ~/.hermes/.env)';
62
- exports.PAUTA_ONBOARDING = [
63
- { etapa: 'maestro', pergunta: `Quem conduz o projeto, quais são seus objetivos e preferências, e em qual fuso horário o Orkastery deve mostrar horários? Informe o fuso como nome IANA, ex.: {"fuso":"${horario_1.FUSO_DE_BRASILIA}"}; ele orienta ${horario_1.CHAVE_DO_FUSO} no manifesto, sem editá-lo. Preferências em {"owner":{...}} gravam owner no manifesto.` },
64
- { etapa: 'credenciais', pergunta: `Quais provedores públicos e nomes de variáveis em env serão usados? Segredos ficam ${exports.ONDE_FICAM_OS_SEGREDOS}; nunca informe valores.` },
65
- { etapa: 'bancos', pergunta: `Quais bancos públicos e nomes de variáveis em env configuram as conexões? Nunca informe DSN ou senha; valores ficam ${exports.ONDE_FICAM_OS_SEGREDOS}.` },
66
- { etapa: 'memoria', pergunta: 'Deseja OrkMind? Informe {"modo":"orkmind"} ou {"modo":"files"}; a escolha orienta memory.mode no manifesto, sem editá-lo.' },
67
- { etapa: 'produtos', pergunta: 'Quais produtos e repositórios públicos pertencem ao projeto?' },
68
- { etapa: 'topologia', pergunta: 'Como se distribuem ambientes e serviços? Informe identificadores públicos.' },
69
- { etapa: 'arquitetura', pergunta: 'Quais decisões e restrições de arquitetura devem orientar o trabalho?' },
70
- { etapa: 'skills', pergunta: 'Quais capacidades e skills serão necessárias?' },
71
- { etapa: 'auditores', pergunta: 'Quais auditorias e cadências são desejadas?' },
72
- ];
73
- exports.ETAPAS_ONBOARDING = exports.PAUTA_ONBOARDING.map(p => p.etapa);
65
+ exports.ONDE_FICAM_OS_SEGREDOS = (0, locale_1.msg)('pt-BR').onboarding.segredos;
66
+ /** RM-061 (F2a): as etapas, na ordem da entrevista; a pergunta de cada uma sai do catalogo. */
67
+ exports.ETAPAS_ONBOARDING = ['maestro', 'credenciais', 'bancos', 'memoria', 'produtos', 'topologia', 'arquitetura', 'skills', 'auditores'];
68
+ /** A pergunta da etapa no locale pedido (ou no ativo, que so os comandos cobertos trocam). */
69
+ function perguntaDaEtapa(etapa, locale) {
70
+ const m = (0, locale_1.msg)(locale).onboarding, p = m.perguntas;
71
+ if (etapa === 'maestro')
72
+ return p.maestro(horario_1.FUSO_DE_BRASILIA, horario_1.CHAVE_DO_FUSO);
73
+ if (etapa === 'credenciais')
74
+ return p.credenciais(m.segredos);
75
+ if (etapa === 'bancos')
76
+ return p.bancos(m.segredos);
77
+ return p[etapa];
78
+ }
79
+ /** A pauta em pt-BR, como dado (testes e docs a leem); o texto do CLI usa `perguntaDaEtapa`. */
80
+ exports.PAUTA_ONBOARDING = exports.ETAPAS_ONBOARDING.map((etapa) => ({ etapa, pergunta: perguntaDaEtapa(etapa, 'pt-BR') }));
74
81
  function caminhoOnboarding(raiz) {
75
82
  return (0, project_state_1.stateFile)(raiz, 'onboarding.json');
76
83
  }
@@ -79,7 +86,7 @@ function objeto(v) {
79
86
  [Object.prototype, null].includes(Object.getPrototypeOf(v));
80
87
  }
81
88
  /** Recusa antes de persistir. Diagnósticos nunca incluem a entrada recebida. */
82
- function invalido() { throw new Error(`onboarding.input.invalid: use JSON público e referências de variáveis; segredos ficam ${exports.ONDE_FICAM_OS_SEGREDOS}`); }
89
+ function invalido() { throw new Error((0, locale_1.msg)().onboarding.entradaInvalida((0, locale_1.msg)().onboarding.segredos)); }
83
90
  function textoSeguro(v) {
84
91
  return !(0, policies_1.procurarSegredos)(v).length &&
85
92
  !/[a-z][a-z0-9+.-]*:\/\/[^\s/]*@/i.test(v) &&
@@ -135,6 +142,9 @@ function validarConteudo(etapa, conteudo) {
135
142
  invalido();
136
143
  }
137
144
  }
145
+ // RM-063 (fatia 3, H3): o canal do dono, com o host e o chat autorizado; o transporte pronto sai dele.
146
+ if (etapa === 'maestro' && objeto(conteudo) && Object.hasOwn(conteudo, 'canal') && !(0, transporte_do_canal_1.canalValido)(conteudo.canal))
147
+ invalido();
138
148
  // Etapas sensíveis usam um formato fechado: não há espaço para texto de credenciais.
139
149
  if (etapa === 'credenciais' || etapa === 'bancos') {
140
150
  if (!objeto(conteudo))
@@ -336,16 +346,23 @@ function gravarEtapa(raiz, nome, conteudo, por = 'owner') {
336
346
  const etapa = exigirEtapa(nome);
337
347
  exigirAutor(por);
338
348
  validarConteudo(etapa, conteudo);
349
+ // RM-063 (fatia 3, H3): o transporte pronto do host do canal, resolvido nesta maquina antes de qualquer gravacao.
350
+ const transporte = etapa === 'maestro' && objeto(conteudo) && (0, transporte_do_canal_1.canalValido)(conteudo.canal)
351
+ ? (0, transporte_do_canal_1.transporteDoCanal)(raiz, conteudo.canal) : null;
339
352
  return comTrava(raiz, () => {
340
353
  const solicitadas = conteudo;
341
354
  const { estado } = lerParaMutacao(raiz), anterior = estado.etapas[etapa];
342
- // Configurar preferências não apaga objetivos ou outras respostas da etapa maestro.
343
- if (etapa === 'maestro' && objeto(conteudo) && objeto(conteudo.owner) && anterior && objeto(anterior.conteudo)) {
344
- conteudo = { ...anterior.conteudo, ...conteudo, owner: {
345
- ...(objeto(anterior.conteudo.owner) ? anterior.conteudo.owner : {}), ...conteudo.owner,
346
- } };
355
+ // Configurar preferências (ou o canal, RM-063) não apaga objetivos ou outras respostas da etapa maestro.
356
+ if (etapa === 'maestro' && objeto(conteudo) && (objeto(conteudo.owner) || objeto(conteudo.canal)) && anterior && objeto(anterior.conteudo)) {
357
+ conteudo = { ...anterior.conteudo, ...conteudo, ...(objeto(conteudo.owner) ? { owner: {
358
+ ...(objeto(anterior.conteudo.owner) ? anterior.conteudo.owner : {}), ...conteudo.owner,
359
+ } } : {}) };
347
360
  validarConteudo(etapa, conteudo);
348
361
  }
362
+ // RM-063 (fatia 3, H3): o transporte do pulse sai junto com o canal do dono, e antes da resposta: sem o host nesta
363
+ // maquina, nada e gravado. A mesma resposta de novo regrava o transporte (a maquina nunca fica sem ele).
364
+ if (transporte)
365
+ (0, transporte_do_canal_1.gravarTransporteDoCanal)(raiz, transporte);
349
366
  validarConteudo(etapa, conteudo);
350
367
  // Persistir só chaves deste pedido: uma resposta antiga não vence edição explícita do manifesto.
351
368
  validarConteudo(etapa, solicitadas);
@@ -405,10 +422,23 @@ function resetarOnboarding(raiz, nome, por = 'owner') {
405
422
  });
406
423
  }
407
424
  function textoDaPauta(estado = onboardingPadrao(), owner = {}) {
408
- const p = (0, experiencia_1.resolverExperiencia)(owner);
409
- return ['Onboarding do projeto (' + exports.CONTRATO_ONBOARDING + ')',
410
- `Experiência recomendada: ${p.language}, ${p.timezone}, resposta ${p.depth}. Ativar com esses valores, configurar ou desativar?`,
411
- 'Registre a escolha em maestro com {"owner":{"language":"' + p.language + '","timezone":"' + p.timezone + '","depth":"' + p.depth + '","experience":true}}; use experience:false para desativar. Consulta não registra resposta.',
412
- ...exports.PAUTA_ONBOARDING.map(({ etapa, pergunta }) => `${estado.etapas[etapa] ? '[respondida]' : '[pendente]'} ${etapa}: ${pergunta}`),
413
- 'Responda com ork onboarding set <etapa> --conteudo <JSON> --por <quem>.'].join('\n');
425
+ const p = (0, experiencia_1.resolverExperiencia)(owner), m = (0, locale_1.msg)().onboarding;
426
+ return [m.titulo(exports.CONTRATO_ONBOARDING),
427
+ m.recomendada(p.language, p.timezone, p.depth),
428
+ m.registre(p.language, p.timezone, p.depth),
429
+ ...exports.ETAPAS_ONBOARDING.map((etapa) => `${estado.etapas[etapa] ? m.respondida : m.pendente} ${etapa}: ${perguntaDaEtapa(etapa)}`),
430
+ m.responda].join('\n');
431
+ }
432
+ /**
433
+ * RM-061 (F2a): a mesma recusa que `gravarEtapa` e `resetarOnboarding` dariam, antes de gravar: o CLI a
434
+ * chama no locale do comando e grava depois em `comLocale('pt-BR')`, entao a recusa de uso sai na
435
+ * lingua do texto e o dado gravado nao muda.
436
+ */
437
+ function validarPedidoDeEtapa(nome, conteudo, por) {
438
+ exigirAutor(por);
439
+ if (nome !== undefined) {
440
+ const etapa = exigirEtapa(nome);
441
+ if (conteudo !== undefined)
442
+ validarConteudo(etapa, conteudo);
443
+ }
414
444
  }
package/dist/orkmind.js CHANGED
@@ -84,6 +84,7 @@ const node_child_process_1 = require("node:child_process");
84
84
  const node_crypto_1 = require("node:crypto");
85
85
  const node_util_1 = require("node:util");
86
86
  const node_perf_hooks_1 = require("node:perf_hooks");
87
+ const dsn_da_memoria_1 = require("./dsn-da-memoria");
87
88
  /** As colecoes do OrkMind que o `ork` grava (guia: docs/guias/memoria-e-handoff.md). */
88
89
  exports.COLECOES_DO_ORK = [
89
90
  'decision',
@@ -393,8 +394,12 @@ class DriverCliOrkMind {
393
394
  }
394
395
  python() {
395
396
  const cli = this.config.cli;
396
- const candidatos = cli.includes(path.sep) ? [path.resolve(cli)] :
397
- (process.env.PATH ?? '').split(path.delimiter).map(p => path.join(p, cli));
397
+ // RM-047 (fronteira de confiança): caminho relativo resolveria no diretório atual, que é o clone, e
398
+ // entrada relativa do PATH também. Só caminho absoluto ou nome procurado em entrada absoluta do PATH.
399
+ if (cli.includes(path.sep) && !path.isAbsolute(cli))
400
+ throw new Error('cli.ausente: memory.cli relativo recusado');
401
+ const candidatos = path.isAbsolute(cli) ? [cli] :
402
+ (process.env.PATH ?? '').split(path.delimiter).filter(p => path.isAbsolute(p)).map(p => path.join(p, cli));
398
403
  const executavel = candidatos.find(p => {
399
404
  try {
400
405
  fs.accessSync(p, fs.constants.X_OK);
@@ -410,6 +415,9 @@ class DriverCliOrkMind {
410
415
  const match = /^#!(\S+)(?:\s+(\S+))?\s*$/.exec(linha);
411
416
  if (!match)
412
417
  throw new Error('memory.transport.interpreter: shebang nao suportado');
418
+ // RM-047: interpretador relativo resolveria no diretório atual (o clone).
419
+ if (!path.isAbsolute(match[1]))
420
+ throw new Error('memory.transport.interpreter: shebang nao suportado');
413
421
  return match[2] ? [match[1], match[2]] : [match[1]];
414
422
  }
415
423
  /** Valor da chave de embedding no ambiente do `ork`; nunca guardado no driver. */
@@ -419,26 +427,17 @@ class DriverCliOrkMind {
419
427
  return chaveDeEmbeddingAceita(valor, this.config.dsn) ? valor : '';
420
428
  }
421
429
  contemSegredo(valor) {
422
- const segredo = this.config.dsn;
423
- const proibidos = [segredo];
430
+ // RM-069 (D6, D20, D21): a DSN e a senha dela, de qualquer tamanho, pelos fragmentos e pela barreira de domicilio unico.
431
+ const proibidos = (0, dsn_da_memoria_1.fragmentosDaDsn)(this.config.dsn);
424
432
  const nome = this.config.variavelDaChaveDeEmbedding ?? '';
425
433
  const chave = nome ? (process.env[nome] ?? '').trim() : '';
426
434
  if (chave.length >= 12)
427
435
  proibidos.push(chave);
428
- try {
429
- const senha = new URL(segredo).password;
430
- if (senha.length >= 12)
431
- proibidos.push(senha, decodeURIComponent(senha));
432
- }
433
- catch { /* DSN opaca */ }
434
- const examinar = (x) => typeof x === 'string'
435
- ? proibidos.some(p => p && x.includes(p))
436
- : !!x && typeof x === 'object' && Object.entries(x).some(([k, v]) => examinar(k) || examinar(v));
437
- return examinar(valor);
436
+ return (0, dsn_da_memoria_1.contemFragmento)(valor, proibidos);
438
437
  }
439
438
  rodar(pedido, timeoutMs = this.config.timeoutMs) {
440
439
  if (!this.config.dsn.trim())
441
- throw new Error('dsn.env-ausente');
440
+ throw new Error(this.config.falhaDaDsn ?? 'dsn.env-ausente');
442
441
  if (this.contemSegredo(pedido))
443
442
  throw new Error('memory.transport.secret: conteudo recusado');
444
443
  const [python, ...prefixo] = this.python();
@@ -913,14 +912,21 @@ class DriverEmMemoria {
913
912
  }
914
913
  }
915
914
  exports.DriverEmMemoria = DriverEmMemoria;
916
- /** Config de memoria efetiva a partir do manifesto, ja com o tenant resolvido. */
917
- function configDoManifesto(manifesto) {
918
- const variavel = manifesto.memory.database_url_env ?? '';
915
+ /**
916
+ * Config de memoria efetiva a partir do manifesto, ja com o tenant resolvido. RM-069: a DSN vem da fonte declarada
917
+ * (a variavel de `database_url_env` ou o arquivo de `database_url_file`) pelo resolvedor unico, lida a cada chamada (D12).
918
+ */
919
+ function configDoManifesto(manifesto, env = process.env) {
920
+ const fonte = (0, dsn_da_memoria_1.resolverDsn)(manifesto.memory, { env });
919
921
  return {
920
922
  modo: manifesto.memory.mode,
921
923
  cli: manifesto.memory.cli || 'orkmind',
922
- variavel,
923
- dsn: variavel ? (process.env[variavel] ?? '') : '',
924
+ variavel: fonte.fonte === 'ambiente' ? fonte.rotulo : '',
925
+ dsn: fonte.dsn,
926
+ fonteDaDsn: fonte.fonte,
927
+ rotuloDaDsn: fonte.rotulo,
928
+ falhaDaDsn: fonte.falha,
929
+ detalheDaDsn: fonte.detalhe,
924
930
  timeoutMs: manifesto.memory.timeout_ms || 15000,
925
931
  universoTimeoutMs: prazoDoUniversoMs(manifesto.memory.universo_timeout_ms),
926
932
  tenant: manifesto.memory.tenant || manifesto.project.name,
@@ -936,9 +942,18 @@ function correcaoDe(motivo, config) {
936
942
  case 'modo.desconhecido':
937
943
  return 'memory.mode aceita files ou orkmind';
938
944
  case 'dsn.nao-declarado':
939
- return 'declare memory.database_url_env com o NOME da variavel de ambiente da base do tenant';
945
+ return 'declare memory.database_url_file (arquivo 0600 em ~/.orkastery/segredos/) ou memory.database_url_env ' +
946
+ 'com o NOME da variavel de ambiente da base do tenant';
940
947
  case 'dsn.env-ausente':
941
948
  return `exporte ${config.variavel} com a DSN da base propria do tenant (o ork nao adivinha base)`;
949
+ case 'dsn.arquivo-ausente':
950
+ return `grave a DSN da base propria do tenant em ${config.rotuloDaDsn}, numa linha e com permissao 0600 (o ork nao adivinha base)`;
951
+ case 'dsn.arquivo-inseguro':
952
+ return `deixe ${config.rotuloDaDsn} como arquivo do usuario que roda o ork, numa pasta dele, com chmod 600 ` +
953
+ '(DSN que outro usuario pode ler nao e lida)';
954
+ case 'dsn.arquivo-invalido':
955
+ return `regrave ${config.rotuloDaDsn} como arquivo comum numa pasta de segredos comum, dentro da casa do usuario e ` +
956
+ 'sem link simbolico no caminho, so com a DSN (esquema://...), numa linha e sem NOME= na frente';
942
957
  case 'cli.ausente':
943
958
  return `instale o OrkMind e garanta "${config.cli}" no PATH`;
944
959
  case 'orkmind.indisponivel':
@@ -959,6 +974,9 @@ function resolverRegime(manifesto, driver) {
959
974
  dsnPresente: config.dsn.trim() !== '',
960
975
  cli: config.cli,
961
976
  tenant: config.tenant,
977
+ // RM-069 (D5): a fonte da DSN, aditiva; o arquivo so pelo rotulo com `~`.
978
+ fonteDaDsn: config.fonteDaDsn ?? 'nenhuma',
979
+ ...(config.fonteDaDsn === 'arquivo' ? { arquivoDaDsn: config.rotuloDaDsn } : {}),
962
980
  };
963
981
  const degradar = (motivo, detalhe) => ({
964
982
  estado: {
@@ -976,9 +994,13 @@ function resolverRegime(manifesto, driver) {
976
994
  if (config.modo !== 'orkmind') {
977
995
  return degradar('modo.desconhecido', `memory.mode "${config.modo}" nao e um regime conhecido`);
978
996
  }
979
- // Isolamento por tenant: sem NOME de variavel declarado nao ha base, e nao ha palpite.
980
- if (config.variavel === '') {
981
- return degradar('dsn.nao-declarado', 'memory.database_url_env vazio: sem base declarada o ork nao conecta em base nenhuma');
997
+ // Isolamento por tenant: sem fonte declarada (variavel ou arquivo) nao ha base, e nao ha palpite.
998
+ if (config.fonteDaDsn === 'nenhuma') {
999
+ return degradar('dsn.nao-declarado', 'memory.database_url_file e memory.database_url_env vazios: sem base declarada o ork nao conecta em base nenhuma');
1000
+ }
1001
+ // RM-069: o arquivo que falha degrada com o motivo dele e nunca cai para a variavel.
1002
+ if (config.dsn.trim() === '' && !driver && config.fonteDaDsn === 'arquivo') {
1003
+ return degradar(config.falhaDaDsn ?? 'dsn.arquivo-ausente', `${config.detalheDaDsn}: o ork nao cai para outra fonte (precedente memory-orkmind)`);
982
1004
  }
983
1005
  if (config.dsn.trim() === '' && !driver) {
984
1006
  return degradar('dsn.env-ausente', `${config.variavel} nao esta no ambiente: o ork nao cai para outra DSN (precedente memory-orkmind)`);
@@ -996,7 +1018,8 @@ function resolverRegime(manifesto, driver) {
996
1018
  ...base,
997
1019
  efetivo: 'orkmind',
998
1020
  motivo: null,
999
- detalhe: `${efetivoDriver.nome} ativo na base declarada por ${config.variavel}: ${saude.detalhe}`,
1021
+ detalhe: `${efetivoDriver.nome} ativo na base declarada por ${config.fonteDaDsn === 'arquivo' ? config.rotuloDaDsn : config.variavel}: ` +
1022
+ saude.detalhe,
1000
1023
  correcao: '',
1001
1024
  },
1002
1025
  driver: efetivoDriver,
@@ -74,12 +74,15 @@ const modos_1 = require("./modos");
74
74
  const ocupacao_1 = require("./ocupacao");
75
75
  const ratelimit_1 = require("./ratelimit");
76
76
  const impedimento_1 = require("./impedimento");
77
+ const runtime_escada_1 = require("./runtime-escada");
77
78
  const thread_1 = require("./thread");
79
+ const types_1 = require("./types");
78
80
  const util_1 = require("./util");
79
81
  const horario_1 = require("./horario");
80
82
  Object.defineProperty(exports, "duracaoCurta", { enumerable: true, get: function () { return horario_1.duracaoCurta; } });
81
83
  const conducao_1 = require("./conducao");
82
84
  const conducao_texto_1 = require("./conducao-texto");
85
+ const locale_1 = require("./locale");
83
86
  /** Limite de atencao padrao, em minutos: parada mais velha que isso e destacada. */
84
87
  exports.ATENCAO_PADRAO_MIN = 30;
85
88
  /** Minutos inteiros entre dois carimbos ISO (nunca negativo). */
@@ -157,7 +160,8 @@ function pausasAbertas(thread, eventos, estados, quando) {
157
160
  // continua listada, e o monitor a lia como uma sessao que ainda ia terminar. Uma
158
161
  // sessao `blocked` e o contrario disso -- ela e a pausa, ja chegada.
159
162
  const sessaoEstado = estados === null ? null : estados.get(sessionId) ?? null;
160
- const sessaoViva = estados === null ? null : sessaoEstado === 'working' || sessaoEstado === '';
163
+ // RM-063 (fatia 3, achado a): `busy` e `running` tambem sao a sessao trabalhando.
164
+ const sessaoViva = estados === null ? null : (0, types_1.estadoDeTrabalho)(sessaoEstado) || sessaoEstado === '';
161
165
  const sobre = typeof e.previstaSobre === 'string' && e.previstaSobre !== ''
162
166
  ? e.previstaSobre
163
167
  : blocoDaFase(thread, fase).pausaSobre;
@@ -168,16 +172,17 @@ function pausasAbertas(thread, eventos, estados, quando) {
168
172
  fase,
169
173
  bloco: blocoDaFase(thread, fase).bloco,
170
174
  pausaSobre: sobre,
171
- detalhe: sessaoViva === true
172
- ? `a sessao ${sessionId.slice(0, 8)} do bloco ainda esta trabalhando no runtime: a pausa chega quando ela terminar`
175
+ // RM-061 (F2b, G2): a parada nasce em pt-BR (o --json do monitor) e o pulse a remonta no locale.
176
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => sessaoViva === true
177
+ ? m.pulse.pausaTrabalhando(sessionId.slice(0, 8))
173
178
  : sessaoEstado === 'blocked'
174
- ? `a sessao ${sessionId.slice(0, 8)} do bloco esta BLOQUEADA no runtime esperando acao humana (prompt, permissao ou credencial): veja \`ork sessions hitl\``
175
- : `bloco fechado em ${fase ?? '?'}: espera o veredito humano sobre ${sobre || 'a pausa do bloco'}`,
179
+ ? m.pulse.pausaBloqueada(sessionId.slice(0, 8))
180
+ : m.pulse.blocoFechado(fase ?? '?', sobre ? m.thread.pausaSobre(sobre) : m.pulse.aPausaDoBloco)),
176
181
  evidencia: `ledger ${ledger_1.TIPOS_DE_EVENTO.pausaHumana} (${ocupacao_1.PAUSA_PREVISTA})` +
177
182
  `${sessionId ? `, sessao ${sessionId.slice(0, 8)}` : ''}` +
178
183
  `${sessaoEstado ? ` em state=${sessaoEstado}` : ''}`,
179
184
  correcao: sessaoEstado === 'blocked'
180
- ? `ork sessions logs ${sessionId.slice(0, 8)} para ver o que a sessao pede, e claude attach ${sessionId} para responder`
185
+ ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.responderSessao(sessionId.slice(0, 8), sessionId))
181
186
  : comandoDeAprovacao(thread.id, sobre),
182
187
  desdeEm: e.ts,
183
188
  sessaoViva,
@@ -203,16 +208,20 @@ function pausasAbertas(thread, eventos, estados, quando) {
203
208
  return;
204
209
  const { bloco, pausaSobre } = blocoDaFase(thread, fase);
205
210
  const imp = (0, impedimento_1.ehImpedimentoDoDono)(e.motivo) ? (0, impedimento_1.impedimentoDoEvento)(e) : null;
211
+ // RM-063 (F4): a escada de recuperacao do runtime que acabou chama o dono com as alternativas e o comando que retoma.
212
+ const escada = !imp && e.motivo === 'human.pending' ? (0, runtime_escada_1.escadaDoEvento)(e) : null;
206
213
  porFase.set(chave, parada({
207
214
  natureza: 'pausa-humana',
208
215
  motivo: imp ? e.motivo : 'human.pending',
209
216
  fase,
210
217
  bloco,
211
- pausaSobre: imp ? `rodar \`${imp.comando}\` no terminal` : pausaSobre || 'autorizacao da retomada',
218
+ pausaSobre: imp ? `rodar \`${imp.comando}\` no terminal` : escada ? 'a escada de recuperacao do runtime'
219
+ : pausaSobre || 'autorizacao da retomada',
212
220
  ...(imp ? { impedimento: imp } : {}),
221
+ ...(escada ? { escada } : {}),
213
222
  detalhe: typeof e.detalhe === 'string' && e.detalhe !== ''
214
223
  ? e.detalhe
215
- : gates_1.DESCRICAO_DO_MOTIVO['human.pending'],
224
+ : (0, locale_1.textoDoCatalogo)((m) => m.pulse.motivos['human.pending']),
216
225
  evidencia: `ledger ${ledger_1.TIPOS_DE_EVENTO.gateBloqueado} (gate ${String(e.gate ?? '?')})`,
217
226
  correcao: typeof e.correcao === 'string' && e.correcao !== ''
218
227
  ? e.correcao
@@ -233,7 +242,7 @@ function pausasAbertas(thread, eventos, estados, quando) {
233
242
  fase: thread.faseAtual,
234
243
  bloco,
235
244
  pausaSobre: pausaSobre || 'veredito do bloco',
236
- detalhe: `thread carimbada como pausada na fase ${thread.faseAtual}`,
245
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.threadPausada(thread.faseAtual)),
237
246
  evidencia: 'thread.json (status: pausada)',
238
247
  correcao: comandoDeAprovacao(thread.id, pausaSobre),
239
248
  desdeEm: thread.atualizadaEm,
@@ -258,9 +267,9 @@ function impedimentosAbertos(item, eventos, raizDoProjeto, quando) {
258
267
  fase: thread.faseAtual,
259
268
  bloco: blocoDaFase(thread, thread.faseAtual).bloco,
260
269
  pausaSobre: '',
261
- detalhe: `na fila de ${p.nome}, atras da thread ${p.bloqueadaPor} (colide com ${p.colidiuCom})`,
270
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.naFilaDoLease(p.nome, p.bloqueadaPor, p.colidiuCom)),
262
271
  evidencia: `.orkastery/leases/fila.json (${p.tipo})`,
263
- correcao: `espere a thread ${p.bloqueadaPor} liberar (ork lease release ${(0, leases_1.argumentoDeLease)(p.colidiuCom)} --thread ${(0, leases_1.argumentoDeLease)(p.bloqueadaPor)}), ou reduza a regiao pedida`,
272
+ correcao: (0, locale_1.textoDoCatalogo)((m) => m.pulse.espereOLease(p.bloqueadaPor, (0, leases_1.argumentoDeLease)(p.colidiuCom), (0, leases_1.argumentoDeLease)(p.bloqueadaPor))),
264
273
  desdeEm: p.desdeEm,
265
274
  sessaoViva: null,
266
275
  fonte: 'fila-de-lease',
@@ -277,8 +286,7 @@ function impedimentosAbertos(item, eventos, raizDoProjeto, quando) {
277
286
  fase: p.fase,
278
287
  bloco: blocoDaFase(thread, p.fase).bloco,
279
288
  pausaSobre: '',
280
- detalhe: `pedido ${p.id} na fila de rate limit, libera ${(0, ratelimit_1.faltaPara)(p, quando)} ` +
281
- `(${p.liberaEm}, ${p.janelaEstimada ? 'janela estimada' : 'hora dita pelo runtime'})`,
289
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.naFilaDeRateLimit(p.id, (0, ratelimit_1.faltaPara)(p, quando), p.liberaEm, p.janelaEstimada)),
282
290
  evidencia: `.orkastery/retry/fila.jsonl (${p.id}, ${p.sinal.fonte})`,
283
291
  correcao: `ork retry resume --id ${p.id}`,
284
292
  desdeEm: p.criadoEm,
@@ -314,7 +322,7 @@ function impedimentosAbertos(item, eventos, raizDoProjeto, quando) {
314
322
  pausaSobre: '',
315
323
  detalhe: typeof e.detalhe === 'string' && e.detalhe !== ''
316
324
  ? e.detalhe
317
- : gates_1.DESCRICAO_DO_MOTIVO[motivo],
325
+ : (0, locale_1.textoDoCatalogo)((m) => m.pulse.motivos[motivo]),
318
326
  evidencia: `ledger ${e.tipo} (gate ${String(e.gate ?? '?')})`,
319
327
  correcao: typeof e.correcao === 'string' && e.correcao !== ''
320
328
  ? e.correcao
@@ -492,61 +500,50 @@ function montarMonitor(carregado, opcoes = {}) {
492
500
  * ISO (o `--json` e o ledger nao mudam); aqui o horario sai no fuso do dono.
493
501
  */
494
502
  function linhaDaParada(p, agora) {
503
+ const m = (0, locale_1.msg)().operacao.restante.monitor;
495
504
  const local = (texto) => (0, horario_1.localizarTexto)(texto, { agora });
496
505
  const L = [];
497
- L.push(` [${p.motivo}] parada ha ${(0, horario_1.duracaoRelativa)(p.paradaHaMin)} (desde ${(0, horario_1.formatarHora)(p.desdeEm, { agora })})`);
506
+ L.push(m.parada(p.motivo, (0, horario_1.duracaoRelativa)(p.paradaHaMin), (0, horario_1.formatarHora)(p.desdeEm, { agora })));
498
507
  if (p.pausaSobre)
499
- L.push(` o humano decide: ${p.pausaSobre}`);
500
- L.push(` detalhe : ${local(p.detalhe)}`);
501
- L.push(` evidencia: ${local(p.evidencia)}`);
502
- L.push(` correcao : ${local(p.correcao)}`);
508
+ L.push(m.humanoDecide(local(p.pausaSobre)));
509
+ L.push(m.detalhe(local(p.detalhe)));
510
+ L.push(m.evidencia(local(p.evidencia)));
511
+ L.push(m.correcao(local(p.correcao)));
503
512
  return L;
504
513
  }
505
514
  /** Texto de `ork orquestracao status`. */
506
515
  function textoDoMonitor(m) {
516
+ const t = (0, locale_1.msg)().operacao.restante.monitor;
507
517
  const L = [];
508
- L.push(`Monitor de orquestracao, projeto ${m.projeto} ` +
509
- `(${m.resumo.threads} thread(s) em ${m.perfis.length} perfil(is): ${m.perfis.join(', ')})`);
510
- L.push(` aguardando humano: ${m.resumo.aguardandoHumano} | com impedimento: ${m.resumo.comImpedimento} | ` +
511
- `em andamento: ${m.resumo.emAndamento} | podem avancar: ${m.resumo.podemAvancar} | ` +
512
- `fechadas: ${m.resumo.fechadas}`);
513
- L.push(` limite de atencao: ${m.atencaoMin} min (${m.resumo.acimaDoLimite} parada(s) acima, marcadas com !)`);
518
+ L.push(t.titulo(m.projeto, m.resumo.threads, m.perfis.length, m.perfis.join(', ')));
519
+ L.push(t.resumo(m.resumo.aguardandoHumano, m.resumo.comImpedimento, m.resumo.emAndamento, m.resumo.podemAvancar, m.resumo.fechadas));
520
+ L.push(t.limite(m.atencaoMin, m.resumo.acimaDoLimite));
514
521
  L.push(` ${(0, horario_1.legendaDoFuso)(undefined, m.consultadoEm)}`);
515
522
  if (!m.runtimeConsultado) {
516
- L.push(` [warn] ${m.runtimeDetalhe}: pausa prevista e reportada como valendo`);
523
+ L.push(t.runtime(m.runtimeDetalhe));
517
524
  }
518
525
  L.push('');
519
526
  // I-36 (T17): conducao em andamento nao e parada; ela aparece antes, com a linha unica.
520
527
  const conduzidas = m.linhas.filter((l) => l.conducao);
521
528
  if (conduzidas.length > 0) {
522
- L.push('Conduzidas agora:');
529
+ L.push(t.conduzidas);
523
530
  for (const l of conduzidas)
524
531
  L.push(` ${l.thread}: ${(0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: m.consultadoEm })}`);
525
532
  L.push('');
526
533
  }
527
534
  if (m.linhas.length === 0) {
528
- L.push(' Nenhuma thread parada: ninguem esperando veredito humano nem impedido.');
535
+ L.push(t.nenhuma);
529
536
  return L.join('\n');
530
537
  }
531
- L.push((0, util_1.tabela)([
532
- 'PERFIL',
533
- 'THREAD',
534
- 'FASE',
535
- 'STATUS',
536
- 'BLOCO QUE PAUSA',
537
- 'AGUARDA DO HUMANO',
538
- 'IMPEDIMENTO',
539
- 'ULTIMO EVENTO',
540
- 'PARADA HA',
541
- ], m.linhas.map((l) => [
538
+ L.push((0, util_1.tabela)([...t.colunas], m.linhas.map((l) => [
542
539
  l.perfil,
543
540
  l.thread,
544
541
  l.faseAtual,
545
- l.situacao,
542
+ t.situacoes[l.situacao] ?? l.situacao,
546
543
  l.pausas.map((p) => p.bloco || '?').join(' ') || '-',
547
544
  l.pausas.map((p) => p.pausaSobre).filter((s) => s !== '').join('; ') || '-',
548
- l.impedimentos.map((p) => p.motivo).join(' ') || 'nao',
549
- l.ultimoEvento ? l.ultimoEvento.tipo : '(sem ledger)',
545
+ l.impedimentos.map((p) => p.motivo).join(' ') || t.nao,
546
+ l.ultimoEvento ? l.ultimoEvento.tipo : t.semLedger,
550
547
  l.paradaHaMin === null
551
548
  ? '-'
552
549
  : `${(0, horario_1.duracaoRelativa)(l.paradaHaMin)}${l.acimaDoLimite ? ' !' : ''}`,
@@ -554,7 +551,7 @@ function textoDoMonitor(m) {
554
551
  const hitl = m.linhas.filter((l) => l.precisaDeHumano);
555
552
  if (hitl.length > 0) {
556
553
  L.push('');
557
- L.push('Esperando VEREDITO HUMANO agora (o orquestrador deve avisar o humano):');
554
+ L.push(t.esperando);
558
555
  for (const l of hitl) {
559
556
  L.push(` ${l.thread} (${l.tag}, ${l.nome})`);
560
557
  for (const p of l.pausas.filter((x) => x.sessaoViva !== true))
@@ -564,7 +561,7 @@ function textoDoMonitor(m) {
564
561
  const impedidas = m.linhas.filter((l) => l.temImpedimento);
565
562
  if (impedidas.length > 0) {
566
563
  L.push('');
567
- L.push('Com IMPEDIMENTO (nao e veredito humano: e colisao, gate, limite ou janela):');
564
+ L.push(t.impedidas);
568
565
  for (const l of impedidas) {
569
566
  L.push(` ${l.thread} (${l.tag}, ${l.nome})`);
570
567
  for (const p of l.impedimentos)
@@ -574,16 +571,16 @@ function textoDoMonitor(m) {
574
571
  const emCurso = m.linhas.filter((l) => l.pausas.some((p) => p.sessaoViva === true));
575
572
  if (emCurso.length > 0) {
576
573
  L.push('');
577
- L.push('Pausa PREVISTA, sessao ainda viva (nao avise ainda, mas ja e a proxima fila):');
574
+ L.push(t.previstas);
578
575
  for (const l of emCurso) {
579
576
  for (const p of l.pausas.filter((x) => x.sessaoViva === true)) {
580
- L.push(` ${l.thread}: ${p.bloco || '?'} vai pausar sobre "${p.pausaSobre}"`);
577
+ L.push(t.vaiPausar(l.thread, p.bloco || '?', (0, horario_1.localizarTexto)(p.pausaSobre, { agora: m.consultadoEm })));
581
578
  }
582
579
  }
583
580
  }
584
581
  if (m.resumo.aguardandoHumano === 0 && m.resumo.comImpedimento === 0) {
585
582
  L.push('');
586
- L.push(' Nenhuma thread parada: ninguem esperando veredito humano nem impedido.');
583
+ L.push(t.nenhuma);
587
584
  }
588
585
  return L.join('\n');
589
586
  }