@orkastery/cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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_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;
7
9
  exports.linhasDosImpedimentos = linhasDosImpedimentos;
@@ -64,9 +66,46 @@ function resumirHitl(itens, opcoes) {
64
66
  desdeEm: p.desdeEm, proximoPasso: p.proximoPasso })) } : {}),
65
67
  ...(opcoes.impedimentosDoDono?.length ? { impedimentosDoDono: opcoes.impedimentosDoDono.map(i => ({ thread: i.thread,
66
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 })) } } : {}),
67
72
  ...(opcoes.hitlDeConducao?.acimaDaMeta ? { hitlDeConducao: opcoes.hitlDeConducao } : {}),
68
73
  };
69
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
+ }
70
109
  /** Quantas linhas do condutor o resumo mostra antes de contar o resto. */
71
110
  exports.TETO_DE_PARADOS_NO_CONDUTOR = 5;
72
111
  /**
@@ -233,7 +272,9 @@ function textoTelegram(r, codigo) {
233
272
  ...(r.tecnicos ? [`🔧 ${linhaDosTecnicos(r)}`] : []),
234
273
  ...(r.consertos ? [`🔧 ${linhaDosConsertos(r.consertos)}`] : []),
235
274
  ...linhaDoHitlParado(r).map(l => `⏳ ${l}`),
275
+ ...(r.maquinaOciosa ? ['', ...linhasDaOciosidade(r, '💤 ', ' ')] : []),
236
276
  ...(r.impedimentosDoDono?.length ? ['', ...linhasDosImpedimentos(r, '🔑 ', ' ')] : []),
277
+ ...(r.acoesDaVarredura?.length || r.feitasPelaVarredura?.length ? ['', ...linhasDaVarredura(r, { dono: '🧹 ', feitas: '🤖 ' }, ' ')] : []),
237
278
  ...(r.paradosNoCondutor?.length ? ['', ...linhasDoCondutor(r, '🚧 ', ' ')] : []),
238
279
  ...(r.acumuladas ? ['', `📥 ${linhaDoLoteGuardado(r.acumuladas)}`] : []),
239
280
  ...(r.decisoes.length || r.acimaDoLimiar.length ? ['', ...linhasDasDecisoes(r, '🧭 ', ' ')] : []),
@@ -266,7 +307,9 @@ function textoTerminal(r, codigo) {
266
307
  ...(r.tecnicos ? ['', ` ${linhaDosTecnicos(r)}`] : []),
267
308
  ...(r.consertos ? ['', ` ${linhaDosConsertos(r.consertos)}`] : []),
268
309
  ...linhaDoHitlParado(r).flatMap(l => ['', ` ${l}`]),
310
+ ...(r.maquinaOciosa ? ['', ...linhasDaOciosidade(r, ' ', ' ')] : []),
269
311
  ...(r.impedimentosDoDono?.length ? ['', ...linhasDosImpedimentos(r, ' ', ' ')] : []),
312
+ ...(r.acoesDaVarredura?.length || r.feitasPelaVarredura?.length ? ['', ...linhasDaVarredura(r, { dono: ' ', feitas: ' ' }, ' ')] : []),
270
313
  ...(r.paradosNoCondutor?.length ? ['', ...linhasDoCondutor(r, ' ', ' ')] : []),
271
314
  ...(r.acumuladas ? ['', ` ${linhaDoLoteGuardado(r.acumuladas)}`] : []),
272
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
  /**
@@ -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
@@ -125,6 +125,11 @@ const REGRA_POR_ESTADO = {
125
125
  detalhe: locale_pulse_1.PULSE_PT_BR.sessao.failed,
126
126
  },
127
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 },
128
133
  done: { classe: 'concluida', precisaDeHumano: false, detalhe: locale_pulse_1.PULSE_PT_BR.sessao.done },
129
134
  stopped: {
130
135
  classe: 'interrompida',
@@ -633,74 +638,72 @@ function dirCurto(cwd) {
633
638
  }
634
639
  /** Texto de `ork sessions hitl`. */
635
640
  function textoDoRadar(r) {
641
+ const m = (0, locale_1.msg)().operacao.restante.sessions.radar;
636
642
  const L = [];
637
- L.push(`Radar de sessoes do runtime (${r.resumo.total} sessao(oes) na maquina)`);
638
- L.push(` precisam de humano: ${r.resumo.precisamDeHumano} (HITL vivo ${r.resumo.hitl}, ` +
639
- `abandonada ${r.resumo.abandonadas}, falha ${r.resumo.falhas}, ` +
640
- `estado desconhecido ${r.resumo.desconhecidas}) | ` +
641
- `trabalhando: ${r.resumo.trabalhando} | fora do ork: ${r.resumo.foraDoOrk}`);
642
- 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));
643
646
  if (!r.runtimeConsultado) {
644
- L.push(` [fail] ${r.runtimeDetalhe}: NAO da para saber quem esta parado`);
647
+ L.push(m.falha(r.runtimeDetalhe));
645
648
  return L.join('\n');
646
649
  }
647
650
  if (!r.logsLidos) {
648
- L.push(' [warn] --sem-logs: o radar diz QUEM esta parado, mas nao O QUE cada sessao pergunta');
651
+ L.push(m.semLogs);
649
652
  }
650
653
  L.push('');
651
654
  if (r.sessoes.length === 0) {
652
- L.push(' Nenhuma sessao na varredura.');
655
+ L.push(m.nenhuma);
653
656
  return L.join('\n');
654
657
  }
655
- 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) => [
656
659
  s.id,
657
660
  s.nome,
658
661
  s.classe,
659
- s.estadoBruto || '(vazio)',
662
+ s.estadoBruto || m.vazio,
660
663
  s.tipoDeHitl ?? '-',
661
664
  dirCurto(s.cwd),
662
- s.thread ? `${s.thread.id}/${s.thread.fase}` : 'fora do ork',
665
+ s.thread ? `${s.thread.id}/${s.thread.fase}` : m.fora,
663
666
  `${(0, horario_1.duracaoRelativa)(s.idadeMin)}${s.precisaDeHumano && s.acimaDoLimite ? ' !' : ''}`,
664
667
  ])));
665
668
  const travadas = r.sessoes.filter((s) => s.precisaDeHumano);
666
669
  if (travadas.length === 0) {
667
670
  L.push('');
668
- L.push(' Nenhuma sessao esperando o humano.');
671
+ L.push(m.nenhumaEsperando);
669
672
  return L.join('\n');
670
673
  }
671
674
  const vivas = travadas.filter((s) => s.classe !== 'abandonada');
672
675
  if (vivas.length > 0) {
673
676
  L.push('');
674
- L.push('Esperando o HUMANO agora, com o job VIVO (responder destrava na hora):');
677
+ L.push(m.vivas);
675
678
  for (const s of vivas) {
676
679
  L.push(` ${s.id} ${s.nome} [${s.classe}${s.tipoDeHitl ? '/' + s.tipoDeHitl : ''}]`);
677
- L.push(` onde : ${s.cwd}` +
678
- (s.thread ? ` (thread ${s.thread.id}, fase ${s.thread.fase})` : ' (sessao fora do ork)'));
679
- 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}`);
680
683
  if (s.pergunta)
681
- L.push(` pergunta : ${s.pergunta}`);
684
+ L.push(` ${m.pergunta.padEnd(9)}: ${s.pergunta}`);
682
685
  for (const linha of s.contextoLogs ?? [])
683
- L.push(` log : ${linha}`);
686
+ L.push(` ${m.log.padEnd(9)}: ${linha}`);
684
687
  for (const a of s.alternativas)
685
- L.push(` opcao : ${a}`);
686
- L.push(` parada ha: ${s.paradaHaMin == null ? 'desconhecido; registre com --registrar' : (0, horario_1.duracaoRelativa)(s.paradaHaMin) + ' (desde a primeira observação)'}`);
687
- L.push(` viva ha : ${(0, horario_1.duracaoRelativa)(s.idadeMin)} (idade da sessao)`);
688
- L.push(` ver : ${s.comandos.logs}`);
689
- L.push(` responder: ${s.comandos.attach}`);
690
- 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}`);
691
694
  }
692
695
  }
693
696
  const abandonadas = travadas.filter((s) => s.classe === 'abandonada');
694
697
  if (abandonadas.length > 0) {
695
698
  L.push('');
696
- L.push('MORRERAM esperando resposta (job ja saiu: nao adianta responder, o trabalho parou):');
699
+ L.push(m.mortas);
697
700
  for (const s of abandonadas) {
698
701
  L.push(` ${s.id} ${s.nome}`);
699
- L.push(` onde : ${s.cwd}` +
700
- (s.thread ? ` (thread ${s.thread.id}, fase ${s.thread.fase})` : ' (sessao fora do ork)'));
701
- L.push(` por que : ${s.detalhe}`);
702
- L.push(` viva ha : ${(0, horario_1.duracaoRelativa)(s.idadeMin)} desde que a sessao comecou`);
703
- 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}`);
704
707
  }
705
708
  }
706
709
  return L.join('\n');
package/dist/horario.js CHANGED
@@ -22,6 +22,7 @@ exports.definirFusoDoDono = definirFusoDoDono;
22
22
  exports.fusoDoDono = fusoDoDono;
23
23
  exports.partesLocais = partesLocais;
24
24
  exports.dataLocal = dataLocal;
25
+ exports.isoComFuso = isoComFuso;
25
26
  exports.instanteNoFuso = instanteNoFuso;
26
27
  exports.duracaoCurta = duracaoCurta;
27
28
  exports.duracaoRelativa = duracaoRelativa;
@@ -161,6 +162,21 @@ function desvioDoFuso(ms, fuso) {
161
162
  return Date.UTC(Number(p.ano), Number(p.mes) - 1, Number(p.dia), Number(p.hora), Number(p.minuto), Number(p.segundo)) -
162
163
  Math.floor(ms / 1000) * 1000;
163
164
  }
165
+ /**
166
+ * RM-063 (F7): o instante em ISO com o deslocamento do fuso escrito (`2026-10-18T23:59:00-03:00`, ou `Z` no UTC). O
167
+ * prazo da autorização durável é gravado assim: quem o lê em outro fuso chega ao mesmo instante.
168
+ */
169
+ function isoComFuso(quando, fuso = fusoDoDono().fuso) {
170
+ const ms = instante(quando);
171
+ if (!Number.isFinite(ms))
172
+ throw new Error('data inválida');
173
+ const p = partesLocais(ms, fuso);
174
+ const desvio = Math.round(desvioDoFuso(ms, fuso) / 60000);
175
+ const abs = Math.abs(desvio);
176
+ const deslocamento = desvio === 0 ? 'Z'
177
+ : `${desvio < 0 ? '-' : '+'}${String(Math.floor(abs / 60)).padStart(2, '0')}:${String(abs % 60).padStart(2, '0')}`;
178
+ return `${p.ano}-${p.mes}-${p.dia}T${p.hora}:${p.minuto}:${p.segundo}${deslocamento}`;
179
+ }
164
180
  /**
165
181
  * RM-037 (fatia 5): o instante de um relógio num fuso IANA (mês de 1 a 12). O runtime diz a hora de
166
182
  * volta da cota no fuso dele (`resets 4:40am (<fuso>)`), e lê-la no relógio desta máquina errava o