@orkastery/cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.maquinaOciosa = maquinaOciosa;
37
+ /**
38
+ * RM-063 (F6): ociosidade e alerta.
39
+ *
40
+ * Pedido do dono de 12/10/2026: "Você não pode deixar a máquina parada sem me avisar." No maquina-b, de 03 a 12/10, a
41
+ * maquina ficou dias sem sessao viva com item do roadmap reservado para ela, e nenhum canal disse nada. Aqui mora a
42
+ * leitura que faz disso um alerta: a maquina esta ociosa quando o projeto tem vaga livre (as vagas ocupadas, pela mesma
43
+ * regra do portao de vaga do despacho, abaixo de `concurrency.max_parallel_threads`) e ha trabalho reservado para ela no
44
+ * roadmap (`ork/roadmap-reservas`) que ninguem trabalha agora. O alerta leva as proximas threads sugeridas, ate o numero
45
+ * de vagas livres, cada uma com o passo do condutor do nucleo e o comando.
46
+ *
47
+ * Leitura pura: as reservas vem da ultima copia local da branch de reservas (sem rede), e quem dedupe o alerta por
48
+ * episodio e a varredura (`pulse-delivery`).
49
+ */
50
+ const fs = __importStar(require("node:fs"));
51
+ const path = __importStar(require("node:path"));
52
+ const board_1 = require("./board");
53
+ const conducao_1 = require("./conducao");
54
+ const conducao_sentinela_1 = require("./conducao-sentinela");
55
+ const estado_thread_1 = require("./estado-thread");
56
+ const ledger_1 = require("./ledger");
57
+ const locale_1 = require("./locale");
58
+ const maquina_1 = require("./maquina");
59
+ const noctum_guarda_1 = require("./noctum-guarda");
60
+ const parado_no_condutor_1 = require("./parado-no-condutor");
61
+ const roadmap_reservas_1 = require("./roadmap-reservas");
62
+ const thread_1 = require("./thread");
63
+ const ITEM = /^RM-\d{3}$/;
64
+ /** O titulo do item, do frontmatter da pagina dele em `docs/roadmap/` (`null` sem a pagina). */
65
+ function tituloDoItem(raiz, item) {
66
+ const dir = path.join(raiz, 'docs', 'roadmap');
67
+ let arquivo;
68
+ try {
69
+ arquivo = fs.readdirSync(dir).find((f) => f.startsWith(`${item}-`) && f.endsWith('.md'));
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ if (!arquivo)
75
+ return null;
76
+ let texto;
77
+ try {
78
+ texto = fs.readFileSync(path.join(dir, arquivo), 'utf8').slice(0, 8192);
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ const m = /^titulo:\s*(.+)$/m.exec(texto);
84
+ return m ? m[1].trim().replace(/^["']|["']$/g, '').replace(/\p{Cc}/gu, ' ').slice(0, 120) || null : null;
85
+ }
86
+ /** A thread que trabalha o item: a da reserva, quando existe aqui; senao a aberta mais recente do item. */
87
+ function threadDoItem(threads, r) {
88
+ const daReserva = r.thread ? threads.find((t) => t.id === r.thread) ?? null : null;
89
+ if (daReserva)
90
+ return daReserva;
91
+ return threads.filter((t) => t.roadmap === r.item && t.status !== 'fechada')
92
+ .sort((a, b) => String(b.atualizadaEm ?? '').localeCompare(String(a.atualizadaEm ?? '')))[0] ?? null;
93
+ }
94
+ /** O passo do condutor de uma thread parada, como a sugestao o diz, com o comando. */
95
+ function passoDaSugestao(t, passo) {
96
+ if (passo?.acao === 'despachar' && passo.fase) {
97
+ const fase = passo.fase;
98
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.despachar(fase)),
99
+ comando: `ork phase run ${t.id} ${fase} --prompt "$(ork prompt render ${t.id} ${fase})"` };
100
+ }
101
+ if (passo?.acao === 'retomar')
102
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.retomar), comando: `ork retry run ${t.id}` };
103
+ if (passo?.acao === 'avisar' && passo.proximoPasso) {
104
+ const proximo = passo.proximoPasso;
105
+ return { passo: proximo, comando: `ork thread status ${t.id}` };
106
+ }
107
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.verAThread(t.faseAtual)), comando: `ork thread status ${t.id}` };
108
+ }
109
+ /**
110
+ * A maquina esta ociosa? `null` quando nao esta: sem vaga livre, ou sem trabalho reservado para ela que ninguem
111
+ * trabalha agora. Fica de fora do trabalho reservado o item cuja thread esta fechada (a reserva e orfa), cuja thread
112
+ * alguem conduz agora e cuja thread espera o dono (o passo e dele, e a fila do dono ja o mostra).
113
+ */
114
+ function maquinaOciosa(carregado, opcoes = {}) {
115
+ const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz);
116
+ const doProjeto = { ...carregado, raiz };
117
+ const quando = opcoes.quando ?? new Date().toISOString();
118
+ const maquina = opcoes.maquina ?? (0, maquina_1.nomeDaMaquina)();
119
+ const limite = Math.max(1, carregado.manifesto.concurrency.max_parallel_threads);
120
+ const ocupadas = opcoes.ocupadas ? opcoes.ocupadas() : (0, board_1.sessoesQueOcupam)(doProjeto, { quando }).length;
121
+ if (ocupadas >= limite)
122
+ return null;
123
+ const remoto = carregado.manifesto.fabrica.remoto;
124
+ const reservas = (opcoes.reservas ? opcoes.reservas() : (0, roadmap_reservas_1.reservasLocais)(raiz, remoto))
125
+ .filter((r) => r.maquina === maquina && ITEM.test(r.item));
126
+ if (!reservas.length)
127
+ return null;
128
+ const threads = [];
129
+ for (const id of (0, thread_1.listarIds)(raiz)) {
130
+ try {
131
+ threads.push((0, thread_1.lerThread)(raiz, id));
132
+ }
133
+ catch { /* thread ilegivel fica de fora */ }
134
+ }
135
+ // RM-058, integracao (T1.2): o trabalho de um arco #Noctum nao e sugerido. A thread que o arco segura ou retem fica com
136
+ // ele, e o item da lista de um arco que guarda (sem thread aberta ainda) e o arco que abre.
137
+ const arcos = (0, noctum_guarda_1.lerArcosDaRaiz)(raiz, quando);
138
+ const itensDosArcos = new Set();
139
+ for (const { estado, proposta } of arcos.lidos.values()) {
140
+ const guarda = (0, noctum_guarda_1.guardaOsCaminhosManuais)({ arco: estado.arco, situacao: estado.situacao, origem: 'envelope' });
141
+ for (const w of guarda ? estado.conteudo?.trabalhos ?? [] : [])
142
+ itensDosArcos.add(w.item);
143
+ for (const w of estado.situacao === 'proposto' || guarda ? proposta?.trabalhos ?? [] : [])
144
+ itensDosArcos.add(w.item);
145
+ }
146
+ const paradas = [];
147
+ for (const r of reservas) {
148
+ const t = threadDoItem(threads, r);
149
+ if (t?.status === 'fechada')
150
+ continue;
151
+ if (!t && itensDosArcos.has(r.item))
152
+ continue;
153
+ if (t) {
154
+ let conduzida = true;
155
+ try {
156
+ conduzida = (0, conducao_1.conducaoDaThread)(raiz, t.id, { agora: new Date(quando) }) !== null;
157
+ }
158
+ catch {
159
+ conduzida = true;
160
+ }
161
+ if (conduzida)
162
+ continue;
163
+ let eventos = [];
164
+ try {
165
+ eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.id));
166
+ }
167
+ catch {
168
+ eventos = [];
169
+ }
170
+ let doDono = null;
171
+ try {
172
+ doDono = (0, parado_no_condutor_1.pendenciaDoDono)(t, eventos, quando);
173
+ }
174
+ catch {
175
+ doDono = null;
176
+ }
177
+ if (doDono)
178
+ continue;
179
+ if ((0, noctum_guarda_1.arcoDoPasso)(raiz, arcos, t.id, eventos))
180
+ continue;
181
+ }
182
+ paradas.push({ r, t });
183
+ }
184
+ if (!paradas.length)
185
+ return null;
186
+ // A thread que ja existe vem antes (retomar custa menos que abrir), e a reserva mais antiga primeiro.
187
+ paradas.sort((a, b) => Number(!a.t) - Number(!b.t) || a.r.desdeEm.localeCompare(b.r.desdeEm) || a.r.item.localeCompare(b.r.item));
188
+ const livres = limite - ocupadas;
189
+ const escolhidas = paradas.slice(0, livres);
190
+ let passos = [];
191
+ if (escolhidas.some((x) => x.t)) {
192
+ try {
193
+ passos = opcoes.passos ? opcoes.passos() : (0, conducao_sentinela_1.passosDoCondutor)(doProjeto, { quando });
194
+ }
195
+ catch {
196
+ passos = [];
197
+ }
198
+ }
199
+ const sugeridas = escolhidas.map(({ r, t }) => {
200
+ const titulo = tituloDoItem(raiz, r.item);
201
+ if (!t) {
202
+ const nome = (titulo ?? r.item).replace(/"/g, "'");
203
+ return { item: r.item, titulo, thread: null, fase: null, passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.abrir),
204
+ comando: `ork thread new "${nome}" --modo auto --roadmap ${r.item}` };
205
+ }
206
+ const { passo, comando } = passoDaSugestao(t, passos.find((p) => p.thread === t.id));
207
+ return { item: r.item, titulo, thread: t.id, fase: t.faseAtual, passo, comando };
208
+ });
209
+ return { maquina, limite, ocupadas, livres, reservados: paradas.length, sugeridas,
210
+ fonte: `copia local de ${remoto}/ork/roadmap-reservas` };
211
+ }
package/dist/maquina.js CHANGED
@@ -59,11 +59,17 @@ exports.avisoDaFabricaPedida = avisoDaFabricaPedida;
59
59
  const fs = __importStar(require("node:fs"));
60
60
  const os = __importStar(require("node:os"));
61
61
  const path = __importStar(require("node:path"));
62
+ const locale_1 = require("./locale");
62
63
  exports.CONTRATO_CONFIG_DA_MAQUINA = 'ork.maquina/v1';
63
64
  const ARQUIVO = 'maquina.json';
64
- /** A pasta do usuario (`~/.orkastery`). `ORK_USUARIO_DIR` isola testes e `ork eval`. */
65
- function pastaDoUsuario() {
66
- return (process.env.ORK_USUARIO_DIR ?? '').trim() || path.join(os.homedir(), '.orkastery');
65
+ /**
66
+ * A pasta do usuario (`~/.orkastery`). `ORK_USUARIO_DIR` isola testes e `ork eval`; `ORKASTERY_HOME` e a casa do ork
67
+ * que o registro das sessoes (`hitl-estado.ts`) ja seguia. RM-063 (fatia 3, achado b): a suite inteira roda com
68
+ * `ORKASTERY_HOME` temporario, e o registro de projetos, a maquina e a rede passam a segui-lo tambem.
69
+ */
70
+ function pastaDoUsuario(env = process.env) {
71
+ return (env.ORK_USUARIO_DIR ?? '').trim() || (env.ORKASTERY_HOME ?? '').trim() ||
72
+ path.join(os.homedir(), '.orkastery');
67
73
  }
68
74
  function lerConfigDaMaquina() {
69
75
  try {
@@ -116,6 +122,5 @@ function fabricaCompartilhada(manifesto) {
116
122
  function avisoDaFabricaPedida(manifesto) {
117
123
  if (manifesto.fabrica?.compartilhada !== true || fabricaCompartilhada(manifesto))
118
124
  return null;
119
- return 'fabrica.nao-confirmada: o orkastery.yaml pede fabrica.compartilhada: true, mas quem liga a publicacao ' +
120
- 'do retrato desta maquina e a propria maquina, nao o repositorio. Nada foi publicado. Para entrar: ork fabrica entrar';
125
+ return (0, locale_1.msg)().operacao.restante.fabrica.pedida;
121
126
  }
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESPERA_DA_TRAVA_MS = exports.PRAZO_DO_DIALOGO_MS = exports.PORQUE_MAXIMO = exports.PORQUE_MINIMO = exports.NOTAS_DO_FORMULARIO = exports.ERRO_SEM_DIALOGO = void 0;
4
+ exports.esquemaDaNota = esquemaDaNota;
5
+ exports.apresentarPedidoDaNota = apresentarPedidoDaNota;
6
+ exports.lerRespostaDaNota = lerRespostaDaNota;
7
+ exports.criarIngressoDaNota = criarIngressoDaNota;
8
+ /**
9
+ * RM-059 (fatia F8, T8.1; DD2 do plano dos mods): a nota do MASTER pelo dialogo nativo do host.
10
+ *
11
+ * O caminho com prova da nota era o Telegram (`ork master pedir` + o codigo assinado pelo ingresso) e o terminal do
12
+ * dono. A sessao do Claude Code nao tinha como pedir a nota com recibo: o `--por` de processo de host e recusado por
13
+ * `exigirNotaSemHost`. Aqui a nota entra pelo MESMO ingresso local que o gate ja aceita: o servidor MCP pede ao
14
+ * cliente um formulario (elicitation), o dono escolhe de 0 a 5 e escreve o porque, e o nucleo grava o MASTER com
15
+ * `avaliadoPor` `dono (dialogo nativo)` (D12: uma identidade que o `autoriaHumana` de qualquer versao aceita), o host
16
+ * no `canal` e o recibo assinado em `hitl-ingress-local/`.
17
+ *
18
+ * Quem chama passa so o `threadId`. A nota e o porque nunca chegam por argumento de ferramenta: chegam pela resposta
19
+ * do formulario, que o callback do servidor recebe da propria conexao. O mod Ritual do MASTER (`ork-ritual`) so
20
+ * aperta o botao que chama a ferramenta.
21
+ *
22
+ * Ordem das conferencias (D4 da thread ork-rm059ritual): nota humana ja registrada devolve `repetida` sem dialogo;
23
+ * sem entrega, a recusa do nucleo; sem formulario no cliente, `master.nota.sem-dialogo` ANTES de qualquer escrita
24
+ * (nem o pedido de nota nasce); so entao o pedido de nota do `ork master pedir` (o mesmo codigo do Telegram) e o
25
+ * dialogo. A gravacao roda sob a trava da thread, como a resposta do Telegram (`responderNota`) e o aceite por omissao:
26
+ * a nota humana que chegou no meio, por qualquer caminho, vence, e a omissao nunca troca a nota gravada aqui. A trava
27
+ * ocupada e esperada por ate um minuto (D17), e a soltura do que a thread segurava roda depois dela.
28
+ *
29
+ * LIMITE DITO: o recibo prova o caminho (esta conexao MCP, esta solicitacao, esta nota), nao a pessoa. A chave local e
30
+ * legivel pelo mesmo usuario do sistema, entao quem ja roda como ele forja o recibo; e a mesma fronteira do gate pelo
31
+ * ingresso local (`core/src/hitl-local.ts`).
32
+ */
33
+ const node_crypto_1 = require("node:crypto");
34
+ const thread_1 = require("./thread");
35
+ const hitl_gates_1 = require("./hitl-gates");
36
+ const thread_close_1 = require("./thread-close");
37
+ const claims_1 = require("./claims");
38
+ const horario_1 = require("./horario");
39
+ const master_1 = require("./master");
40
+ const fechamento_1 = require("./fechamento");
41
+ const master_nota_1 = require("./master-nota");
42
+ const pulse_resposta_1 = require("./pulse-resposta");
43
+ const hitl_local_receipt_1 = require("./hitl-local-receipt");
44
+ exports.ERRO_SEM_DIALOGO = 'master.nota.sem-dialogo';
45
+ /** As notas que o formulario oferece, da melhor para a pior. */
46
+ exports.NOTAS_DO_FORMULARIO = ['5', '4', '3', '2', '1', '0'];
47
+ exports.PORQUE_MINIMO = 3;
48
+ exports.PORQUE_MAXIMO = 1000;
49
+ /** O mesmo teto do dialogo do gate pelo ingresso local. */
50
+ exports.PRAZO_DO_DIALOGO_MS = 300000;
51
+ /**
52
+ * D17: com a nota respondida, a gravacao espera ate isto pela trava da thread (um aceite por omissao, uma resposta pelo
53
+ * Telegram ou um despacho a seguram por pouco), para o porque que o dono escreveu nao se perder num instante ocupado.
54
+ */
55
+ exports.ESPERA_DA_TRAVA_MS = 60000;
56
+ const PASSO_DA_TRAVA_MS = 250;
57
+ const ID = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/;
58
+ const sha = (v) => (0, node_crypto_1.createHash)('sha256').update(v).digest('hex');
59
+ function esquemaDaNota() {
60
+ const rotulo = { '5': '5 · a melhor', '0': '0 · a pior' };
61
+ return {
62
+ type: 'object',
63
+ properties: {
64
+ nota: { type: 'string', title: 'Nota de 0 a 5', oneOf: exports.NOTAS_DO_FORMULARIO.map((n) => ({ const: n, title: rotulo[n] ?? n })) },
65
+ porque: { type: 'string', title: 'Por quê (vira lição do próximo GOAL)', minLength: exports.PORQUE_MINIMO, maxLength: exports.PORQUE_MAXIMO },
66
+ },
67
+ required: ['nota', 'porque'],
68
+ };
69
+ }
70
+ /** A mensagem do formulario: a entrega, o que vale agora, o indice derivado do ledger e as claims por estado. */
71
+ function apresentarPedidoDaNota(raiz, threadId) {
72
+ const t = (0, thread_1.lerThread)(raiz, threadId);
73
+ const entrega = (0, thread_close_1.provaDeEntrega)(raiz, threadId);
74
+ const indice = (0, master_1.indiceDaThread)(raiz, threadId);
75
+ const ultimas = new Map();
76
+ for (const c of (0, claims_1.lerClaims)(raiz, threadId))
77
+ ultimas.set(c.id, c.estado);
78
+ const contar = (estado) => [...ultimas.values()].filter((e) => e === estado).length;
79
+ const parcelas = indice.parcelas.length
80
+ ? indice.parcelas.map((p) => `${p.evento} x${p.ocorrencias}`).join(', ')
81
+ : 'sem desconto';
82
+ const agora = t.score?.regime === 'omissao' ? `aceita por omissão com ${t.score.valor}/5`
83
+ : t.score_proposto ? `proposta de ${t.score_proposto.valor}/5 esperando você` : 'sem nota';
84
+ const quando = entrega?.tipo === 'ship'
85
+ ? `Entregue em ${(0, horario_1.formatarDataHoraRotulada)(entrega.ts)}${entrega.mergeSha ? ` (merge ${entrega.mergeSha.slice(0, 8)})` : ''}.`
86
+ : entrega ? `Entregue pelo artefato ${entrega.arquivo}.` : 'Sem entrega registrada.';
87
+ return {
88
+ thread: threadId,
89
+ mensagem: [
90
+ `Nota do MASTER da ${t.id} (${t.nome.slice(0, 80)})`,
91
+ `${quando} Agora: ${agora}.`,
92
+ `Índice derivado do ledger: ${indice.valor} de ${indice.base} (${parcelas}).`,
93
+ `Claims: ${contar('verificado')} verificadas, ${contar('reprovado')} reprovadas, ${contar('pendente')} pendentes.`,
94
+ 'Dê de 0 a 5 e diga por quê. A sua nota sobrescreve a aceita por omissão.',
95
+ ].join('\n'),
96
+ esquema: esquemaDaNota(),
97
+ };
98
+ }
99
+ /** A resposta aceita, conferida campo a campo: so `nota` e `porque`, nos limites do formulario. */
100
+ function lerRespostaDaNota(content) {
101
+ const c = content;
102
+ if (!c || typeof c !== 'object' || Array.isArray(c) || Object.keys(c).sort().join(',') !== 'nota,porque' ||
103
+ typeof c.nota !== 'string' || !exports.NOTAS_DO_FORMULARIO.includes(c.nota) ||
104
+ typeof c.porque !== 'string' || c.porque.trim().length < exports.PORQUE_MINIMO || c.porque.length > exports.PORQUE_MAXIMO) {
105
+ throw new Error('master.nota.resposta-invalida: a resposta do formulário não é uma nota de 0 a 5 com o porquê');
106
+ }
107
+ return { score: Number(c.nota), justificativa: c.porque.trim() };
108
+ }
109
+ /**
110
+ * O ingresso da nota numa conexao MCP. O `elicitar` e o `temFormulario` vem do servidor, nunca dos argumentos da
111
+ * ferramenta; o `connectionId` e o mesmo do ingresso local do gate nesta conexao.
112
+ */
113
+ function criarIngressoDaNota(raiz, origem, elicitar, temFormulario, opcoes = {}) {
114
+ if (!['claude-code', 'codex'].includes(origem.host) || !ID.test(origem.connectionId))
115
+ throw new Error('master.nota.origem-invalida');
116
+ const conexao = { ...origem }, ativos = new Map();
117
+ let fechada = false;
118
+ const pendente = (threadId) => ({ ok: false, threadId, estado: 'pendente', repetida: false });
119
+ const esperaDaTrava = opcoes.esperaDaTravaMs ?? exports.ESPERA_DA_TRAVA_MS;
120
+ /** A trava da thread, esperada em passos curtos: ocupada alem da espera, a recusa diz que a nota nao foi gravada. */
121
+ const comTrava = async (threadId, executar) => {
122
+ const ate = Date.now() + esperaDaTrava;
123
+ for (;;) {
124
+ try {
125
+ return (0, hitl_gates_1.comLockHitl)(raiz, threadId, executar);
126
+ }
127
+ catch (e) {
128
+ if (!/^HITL ocupado/.test(e.message))
129
+ throw e;
130
+ if (Date.now() >= ate) {
131
+ throw new Error(`master.nota.trava-ocupada: a thread ${threadId} seguiu ocupada por ${Math.round(esperaDaTrava / 1000)} s; ` +
132
+ 'a nota não foi gravada, dê de novo');
133
+ }
134
+ }
135
+ await new Promise((r) => setTimeout(r, PASSO_DA_TRAVA_MS));
136
+ }
137
+ };
138
+ return {
139
+ fechar() { fechada = true; for (const c of ativos.values())
140
+ c.abort(); },
141
+ async solicitar(threadId, signal) {
142
+ if (fechada)
143
+ throw new Error('master.nota.conexao-fechada');
144
+ if (!ID.test(threadId))
145
+ throw new Error('master.nota.identificador-invalido');
146
+ if (signal?.aborted)
147
+ return pendente(threadId);
148
+ const t = (0, thread_1.lerThread)(raiz, threadId);
149
+ if ((0, master_1.notaHumanaRegistrada)(t))
150
+ return { ok: true, threadId, estado: 'registrada', repetida: true, score: t.score.valor };
151
+ (0, thread_close_1.exigirEntrega)(raiz, threadId);
152
+ if (!temFormulario()) {
153
+ throw new Error(`${exports.ERRO_SEM_DIALOGO}: este cliente MCP não abre formulário; peça a nota pelo Telegram com ork master pedir ${threadId}`);
154
+ }
155
+ if (ativos.has(threadId))
156
+ throw new Error('master.nota.em-curso: o diálogo da nota desta thread já está aberto nesta sessão');
157
+ const controller = new AbortController();
158
+ ativos.set(threadId, controller);
159
+ const abortar = () => controller.abort();
160
+ signal?.addEventListener('abort', abortar, { once: true });
161
+ const timer = setTimeout(abortar, exports.PRAZO_DO_DIALOGO_MS);
162
+ try {
163
+ const pedido = (0, master_nota_1.pedirNota)(raiz, threadId, { codigosEmUso: (0, pulse_resposta_1.codigosEmUso)(raiz) });
164
+ const apresentacao = apresentarPedidoDaNota(raiz, threadId);
165
+ const requestId = (0, node_crypto_1.randomUUID)();
166
+ const cancelar = new Promise((resolve) => controller.signal.addEventListener('abort', () => resolve({ action: 'cancel' }), { once: true }));
167
+ const resposta = await Promise.race([elicitar(apresentacao, controller.signal), cancelar]);
168
+ if (fechada || controller.signal.aborted || resposta?.action !== 'accept')
169
+ return pendente(threadId);
170
+ const nota = lerRespostaDaNota(resposta.content);
171
+ const recebidoEm = new Date().toISOString();
172
+ const gravada = await comTrava(threadId, () => {
173
+ const atual = (0, thread_1.lerThread)(raiz, threadId);
174
+ if ((0, master_1.notaHumanaRegistrada)(atual))
175
+ return { ok: true, threadId, estado: 'registrada', repetida: true, score: atual.score.valor };
176
+ const recibo = (0, hitl_local_receipt_1.gravarEvidenciaLocalNota)(raiz, { thread: threadId, pedidoId: pedido.pedidoId, host: conexao.host,
177
+ connectionId: conexao.connectionId, requestId, recebidoEm, score: nota.score, justificativaSha256: sha(nota.justificativa) });
178
+ (0, master_1.gravarMaster)(raiz, threadId, {
179
+ score: nota.score, justificativa: nota.justificativa, por: master_1.AUTOR_DA_NOTA_NATIVA, refazer: !!atual.score,
180
+ prova: {
181
+ origem: 'mcp-local', canal: conexao.host, contratoResposta: hitl_local_receipt_1.CONTRATO_RECIBO_DA_NOTA, conexao: conexao.connectionId,
182
+ solicitacao: requestId, recebidoEm, recibo: recibo.recibo, evidencia: recibo.arquivo, evidenciaSha256: recibo.sha256,
183
+ notaPedida: { contrato: master_nota_1.CONTRATO_PEDIDO_DE_NOTA, pedidoId: pedido.pedidoId, codigo: pedido.codigo },
184
+ },
185
+ });
186
+ return { ok: true, threadId, estado: 'registrada', repetida: false, score: nota.score };
187
+ });
188
+ // D17: a thread fechada solta o que segurava depois da trava, como no `registrarMaster`.
189
+ if (!gravada.repetida)
190
+ (0, fechamento_1.liberarAoFechar)(raiz, threadId);
191
+ return gravada;
192
+ }
193
+ finally {
194
+ clearTimeout(timer);
195
+ signal?.removeEventListener('abort', abortar);
196
+ ativos.delete(threadId);
197
+ }
198
+ },
199
+ };
200
+ }
@@ -68,8 +68,16 @@ exports.mensagemJaUsadaEmNota = mensagemJaUsadaEmNota;
68
68
  *
69
69
  * LIMITE DITO: o canal do processo e declarado pelo ambiente (`canalDoProcesso`). Ele serve para
70
70
  * RECUSAR, nunca para autorizar, e um agente que apague as variaveis do proprio host de proposito
71
- * passa como terminal. Essa e a mesma fronteira do `humano-no-cli` do SHIP; fecha-la de vez exige o
72
- * dialogo nativo do host para a nota, que fica fora desta entrega.
71
+ * passa como terminal. Essa e a mesma fronteira do `humano-no-cli` do SHIP.
72
+ *
73
+ * RM-059 (fatia F8, T8.1): a sessao de host ganhou o caminho com recibo que faltava, o dialogo
74
+ * nativo (`ork_request_master_note`, em `master-nota-local.ts`): so o `threadId` entra pela
75
+ * ferramenta, a nota e o porque vem do formulario do host, e o MASTER grava `dono (dialogo nativo)`
76
+ * com o host no canal e o recibo assinado do ingresso local; essa identidade nao se digita no `--por`.
77
+ * O que fica: o `--por` do terminal continua sem prova, a recusa pelo ambiente continua sendo so
78
+ * recusa, e um `ork` anterior a esta versao aceita aquela identidade no `--por` como qualquer nome.
79
+ * O recibo local prova o caminho, nao a pessoa: quem ja
80
+ * roda como o mesmo usuario do sistema le a chave local e forja o recibo.
73
81
  */
74
82
  const fs = __importStar(require("node:fs"));
75
83
  const path = __importStar(require("node:path"));