@orkastery/cli 0.2.0 → 0.3.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 (242) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/onboarding.md +21 -0
  7. package/adapters/claude-code/commands/ork.md +99 -27
  8. package/adapters/claude-code/hooks/hooks.json +6 -1
  9. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  10. package/adapters/codex/skills/ork/SKILL.md +57 -0
  11. package/adapters/hermes/README.md +163 -0
  12. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  13. package/adapters/hermes/bin/ork-brain.sh +4 -0
  14. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  15. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  16. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  17. package/adapters/hermes/bin/ork-objective-message.sh +17 -0
  18. package/adapters/hermes/bin/ork-objective-status.sh +12 -0
  19. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  20. package/adapters/hermes/hermes.plugin.json +26 -4
  21. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  22. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  23. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  24. package/adapters/openclaw/README.md +135 -26
  25. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  26. package/adapters/openclaw/construir.sh +19 -0
  27. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  28. package/adapters/openclaw/dist/index.js +437 -0
  29. package/adapters/openclaw/openclaw.plugin.json +39 -134
  30. package/adapters/openclaw/package.json +26 -0
  31. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  32. package/adapters/openclaw/src/index.ts +458 -0
  33. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  34. package/adapters/openclaw/tsconfig.json +15 -0
  35. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  36. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  37. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  38. package/assets/docs/produto/README.md +14 -0
  39. package/assets/docs/produto/_modelo-feature.md +59 -0
  40. package/assets/docs/roadmap/README.md +14 -0
  41. package/assets/docs/roadmap/_modelo-item.md +73 -0
  42. package/assets/orkmind-native-schema.json +32 -0
  43. package/assets/orkmind_bridge.py +357 -0
  44. package/assets/orkmind_fixture.py +67 -0
  45. package/assets/orkmind_prospective.py +138 -0
  46. package/assets/reference-tariffs-i07.json +23 -0
  47. package/dist/adapters/claude-bg.js +488 -39
  48. package/dist/adapters/codex-controller-sensor.js +449 -0
  49. package/dist/adapters/codex-controller-worker.js +361 -0
  50. package/dist/adapters/codex-controller.js +252 -0
  51. package/dist/adapters/codex-events.js +205 -0
  52. package/dist/adapters/codex-question.js +26 -0
  53. package/dist/adapters/codex-runner.js +133 -0
  54. package/dist/adapters/codex.js +394 -0
  55. package/dist/agents-md.js +84 -0
  56. package/dist/auditoria.js +11 -8
  57. package/dist/auditrun.js +5 -4
  58. package/dist/board.js +173 -22
  59. package/dist/branch-de-estado.js +136 -0
  60. package/dist/canarios-hitl.js +177 -0
  61. package/dist/canarios-i43.js +543 -0
  62. package/dist/canarios-pulse.js +147 -0
  63. package/dist/canarios-sensores.js +129 -0
  64. package/dist/canarios.js +111 -2
  65. package/dist/catalogo.js +9 -0
  66. package/dist/ci.js +216 -0
  67. package/dist/ciclos.js +2 -1
  68. package/dist/claim-lint.js +64 -0
  69. package/dist/claims.js +60 -0
  70. package/dist/company-brain-capture.js +195 -0
  71. package/dist/company-brain-cli.js +123 -0
  72. package/dist/company-brain-client.js +61 -0
  73. package/dist/company-brain-contract.js +166 -0
  74. package/dist/company-brain-journal.js +192 -0
  75. package/dist/company-brain-mcp.js +33 -0
  76. package/dist/company-brain-migration.js +60 -0
  77. package/dist/company-brain-source.js +177 -0
  78. package/dist/company-brain-worker.js +18 -0
  79. package/dist/conducao-texto.js +61 -0
  80. package/dist/conducao.js +876 -0
  81. package/dist/contrato-publico.js +39 -0
  82. package/dist/creation-operation-store.js +251 -0
  83. package/dist/creation-operation.js +148 -0
  84. package/dist/decisao-autonoma.js +183 -0
  85. package/dist/delegation.js +79 -0
  86. package/dist/demo.js +120 -0
  87. package/dist/docs.js +828 -0
  88. package/dist/doctor.js +183 -24
  89. package/dist/entrega-pr.js +117 -0
  90. package/dist/escopo-escrita.js +71 -0
  91. package/dist/estado-thread.js +222 -0
  92. package/dist/evalrunner.js +12 -0
  93. package/dist/fabrica-estado.js +329 -0
  94. package/dist/fabrica-publicar.js +76 -0
  95. package/dist/fix.js +21 -0
  96. package/dist/gates.js +55 -9
  97. package/dist/handoff.js +39 -23
  98. package/dist/hitl-canais.js +333 -0
  99. package/dist/hitl-classificacao.js +131 -0
  100. package/dist/hitl-contract.js +465 -0
  101. package/dist/hitl-estado.js +136 -0
  102. package/dist/hitl-gates.js +554 -0
  103. package/dist/hitl-ingress-receipt.js +382 -0
  104. package/dist/hitl-local-atestado.js +57 -0
  105. package/dist/hitl-local-receipt.js +328 -0
  106. package/dist/hitl-local.js +143 -0
  107. package/dist/hitl-lock.js +139 -0
  108. package/dist/hitl-lote.js +223 -0
  109. package/dist/hitl-native-offer.js +97 -0
  110. package/dist/hitl-native.js +65 -0
  111. package/dist/hitl-presentation.js +209 -0
  112. package/dist/hitl-public-receipt.js +176 -0
  113. package/dist/hitl-resumo.js +209 -0
  114. package/dist/hitl-sessions.js +475 -0
  115. package/dist/hitl.js +711 -0
  116. package/dist/horario.js +269 -0
  117. package/dist/hosts.js +198 -22
  118. package/dist/index.js +1736 -93
  119. package/dist/indice.js +99 -0
  120. package/dist/init.js +28 -3
  121. package/dist/integracoes-locais.js +17 -0
  122. package/dist/leases.js +65 -21
  123. package/dist/ledger-stats.js +272 -0
  124. package/dist/ledger.js +107 -2
  125. package/dist/licoes.js +215 -0
  126. package/dist/liveness.js +218 -0
  127. package/dist/maestro-actions.js +51 -0
  128. package/dist/maestro-authority.js +152 -0
  129. package/dist/maestro-cli.js +97 -0
  130. package/dist/maestro-contract.js +55 -0
  131. package/dist/maestro-discovery.js +132 -0
  132. package/dist/maestro-runtime.js +268 -0
  133. package/dist/maestro-snapshot.js +86 -0
  134. package/dist/maestro-sources.js +224 -0
  135. package/dist/manifest.js +165 -6
  136. package/dist/maquina.js +102 -0
  137. package/dist/master-audit.js +101 -0
  138. package/dist/master-batch.js +43 -0
  139. package/dist/master-digest.js +149 -0
  140. package/dist/master-migracao.js +155 -0
  141. package/dist/master.js +361 -77
  142. package/dist/mcp-artifacts.js +234 -0
  143. package/dist/mcp-git.js +433 -0
  144. package/dist/mcp-install.js +310 -0
  145. package/dist/mcp-maestro.js +25 -0
  146. package/dist/mcp-server.js +469 -0
  147. package/dist/mcp-ship.js +436 -0
  148. package/dist/mcp-verify.js +173 -0
  149. package/dist/memoria-humana.js +207 -0
  150. package/dist/memoria.js +314 -78
  151. package/dist/memory-migration.js +279 -0
  152. package/dist/memory-prospective.js +148 -0
  153. package/dist/modos-migracao.js +191 -0
  154. package/dist/modos.js +151 -15
  155. package/dist/monitor-lock.js +110 -0
  156. package/dist/objective.js +449 -0
  157. package/dist/ocupacao.js +267 -0
  158. package/dist/onboarding.js +303 -0
  159. package/dist/orkmind.js +389 -90
  160. package/dist/orquestracao.js +96 -69
  161. package/dist/phase.js +596 -150
  162. package/dist/playbook-capabilities.js +150 -0
  163. package/dist/playbook-contracts.js +188 -0
  164. package/dist/portfolio-context.js +61 -0
  165. package/dist/portfolio.js +180 -0
  166. package/dist/preflight.js +207 -0
  167. package/dist/process-audit.js +112 -0
  168. package/dist/project-state.js +93 -0
  169. package/dist/prompts.js +25 -5
  170. package/dist/prova-minima.js +112 -0
  171. package/dist/pulse-cadencia.js +163 -0
  172. package/dist/pulse-consentimento.js +260 -0
  173. package/dist/pulse-delivery.js +323 -0
  174. package/dist/pulse-resposta.js +542 -0
  175. package/dist/pulse.js +262 -0
  176. package/dist/ratelimit.js +35 -2
  177. package/dist/recall.js +80 -3
  178. package/dist/redacao-saida.js +45 -0
  179. package/dist/redacao-url.js +66 -0
  180. package/dist/retry.js +637 -115
  181. package/dist/roadmap-reservas.js +243 -0
  182. package/dist/runtime-ambiente.js +38 -0
  183. package/dist/runtime-context.js +215 -0
  184. package/dist/runtime-profiles.js +869 -0
  185. package/dist/runtimes.js +103 -0
  186. package/dist/sandbox.js +9 -0
  187. package/dist/session-events.js +203 -0
  188. package/dist/session-watcher-claude.js +637 -0
  189. package/dist/session-watcher.js +683 -0
  190. package/dist/sessoes-adopt.js +154 -0
  191. package/dist/sessoes-inventario.js +159 -0
  192. package/dist/sessoes.js +16 -35
  193. package/dist/setup.js +691 -0
  194. package/dist/ship.js +150 -15
  195. package/dist/slug.js +1 -1
  196. package/dist/thread-close.js +115 -0
  197. package/dist/thread.js +142 -28
  198. package/dist/tokens.js +1 -1
  199. package/dist/util.js +4 -2
  200. package/dist/verify-sandbox.js +265 -0
  201. package/dist/verify.js +270 -25
  202. package/dist/versao.js +60 -0
  203. package/dist/worktree.js +31 -2
  204. package/dist/write-activation.js +291 -0
  205. package/dist/yaml.js +2 -0
  206. package/eval/casos/onboarding.json +102 -0
  207. package/eval/casos/orkastery-bootstrap.json +35 -1
  208. package/eval/casos/scope-check-capability-map.json +45 -7
  209. package/eval/casos/ship-release.json +2 -2
  210. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  211. package/eval/fixtures/b2-master-log/caso.json +1 -1
  212. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  213. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  214. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  215. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  216. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  217. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  218. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  219. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  220. package/eval/fixtures/fx-happy/caso.json +6 -4
  221. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  222. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  223. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  224. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  225. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  226. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  227. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  228. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  229. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  230. package/monitor/company-brain.cjs +17 -0
  231. package/monitor/pulse-scope.cjs +45 -0
  232. package/monitor/pulse.cron +18 -0
  233. package/monitor/varredura-pulse.sh +27 -0
  234. package/package.json +25 -4
  235. package/schemas/claims.schema.json +25 -0
  236. package/schemas/company-brain.schema.json +1158 -0
  237. package/schemas/creation-operation.schema.json +365 -0
  238. package/schemas/maestro-snapshot.schema.json +2716 -0
  239. package/skills/core/onboarding/SKILL.md +50 -0
  240. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  241. package/skills/core/thread-state/SKILL.md +3 -1
  242. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
@@ -0,0 +1,207 @@
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.eventoAutomatico = eventoAutomatico;
37
+ exports.evidenciaDeGate = evidenciaDeGate;
38
+ exports.inventariarGatesHumanos = inventariarGatesHumanos;
39
+ exports.publicarGatesHumanos = publicarGatesHumanos;
40
+ exports.publicarAprovacaoHumana = publicarAprovacaoHumana;
41
+ const write_activation_1 = require("./write-activation");
42
+ /** Publicacao de atos humanos comprovados. Texto automatico nunca autentica uma pessoa. */
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const node_crypto_1 = require("node:crypto");
46
+ const manifest_1 = require("./manifest");
47
+ const thread_1 = require("./thread");
48
+ const ledger_1 = require("./ledger");
49
+ const estado_thread_1 = require("./estado-thread");
50
+ const escopo_escrita_1 = require("./escopo-escrita");
51
+ const gates_1 = require("./gates");
52
+ const hitl_contract_1 = require("./hitl-contract");
53
+ function eventoAutomatico(e) {
54
+ return e.automatico === true || e.automated === true ||
55
+ /watchdog|automatizad|autom[aá]ti[cz]|auto[- ]?(?:aprov|avan[cç])/i.test([e.autorizadoPor, e.autor, e.observacao, e.origem, e.via].filter(v => typeof v === 'string').join(' '));
56
+ }
57
+ /** Evidencia deve existir no estado canonico da propria thread, inclusive apos SHIP. */
58
+ function evidenciaDeGate(raiz, threadId, referencia) {
59
+ const dir = (0, thread_1.dirThread)(raiz, threadId);
60
+ const nome = referencia.split('#')[0];
61
+ if (!nome)
62
+ return null;
63
+ const candidatos = [path.resolve(dir, nome), path.resolve(raiz, nome), path.resolve((0, estado_thread_1.raizDoEstado)(raiz), nome)];
64
+ for (const candidato of candidatos) {
65
+ if (!fs.existsSync(candidato) || !fs.statSync(candidato).isFile())
66
+ continue;
67
+ const real = fs.realpathSync(candidato), canonico = fs.realpathSync(dir);
68
+ if (!real.startsWith(canonico + path.sep))
69
+ continue;
70
+ const bytes = fs.readFileSync(real);
71
+ if (!bytes.length)
72
+ return null;
73
+ return { arquivo: `.orkastery/threads/${threadId}/${path.relative(canonico, real).split(path.sep).join('/')}`,
74
+ sha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') };
75
+ }
76
+ return null;
77
+ }
78
+ /** Inventario somente leitura, incluindo pendencias, automacao e autoria ambigua. */
79
+ function inventariarGatesHumanos(carregado, somenteThread) {
80
+ const { raiz, manifesto } = carregado;
81
+ const tenant = manifesto.memory.tenant || manifesto.project.name;
82
+ const resultado = [];
83
+ for (const id of somenteThread ? [somenteThread] : (0, thread_1.listarIds)(raiz)) {
84
+ if (escopo_escrita_1.THREADS_PROTEGIDAS.has(id.toLowerCase()))
85
+ continue;
86
+ const thread = (0, thread_1.lerThread)(raiz, id);
87
+ const arquivo = path.join((0, thread_1.dirThread)(raiz, id), 'ledger.jsonl');
88
+ if (!fs.existsSync(arquivo))
89
+ continue;
90
+ const linhas = fs.readFileSync(arquivo, 'utf8').split('\n');
91
+ for (let i = 0; i < linhas.length; i++) {
92
+ if (!linhas[i].trim())
93
+ continue;
94
+ let e;
95
+ try {
96
+ e = JSON.parse(linhas[i]);
97
+ }
98
+ catch {
99
+ throw new Error('memory.human.ledger-invalid');
100
+ }
101
+ if (e.tipo !== 'human_gate')
102
+ continue;
103
+ const autor = typeof e.autorizadoPor === 'string' ? e.autorizadoPor.trim() : typeof e.autor === 'string' ? e.autor.trim() : '';
104
+ const evidencia = typeof e.evidencia === 'string' ? evidenciaDeGate(raiz, id, e.evidencia) : null;
105
+ let motivo = 'elegivel';
106
+ if (thread.projeto.name !== manifesto.project.name || (e.tenant && e.tenant !== tenant))
107
+ motivo = 'tenant_nao_confirmado';
108
+ else if (e.thread !== id)
109
+ motivo = 'evento_de_outra_thread';
110
+ else if (e.estado !== 'aprovado')
111
+ motivo = 'nao_confirmado';
112
+ else if (eventoAutomatico(e))
113
+ motivo = 'automacao_declarada';
114
+ // I-41 (T4c): as duas versoes entram na memoria, por lista fechada. O que torna a autoria
115
+ // ambigua e o contrato ser DESCONHECIDO, nao ser a versao nova; recusar v2 faria a
116
+ // aprovacao do dono deixar de ser dele aos olhos da memoria.
117
+ else if (e.source !== 'human' || !(0, hitl_contract_1.ehContratoDePedido)(e.contrato))
118
+ motivo = 'autoria_ambigua';
119
+ else if (!evidencia)
120
+ motivo = 'evidencia_ausente';
121
+ else if (e.evidenciaSha256 && e.evidenciaSha256 !== evidencia.sha256)
122
+ motivo = 'evidencia_divergente';
123
+ else if (!(0, gates_1.aprovacaoHumanaProvada)(raiz, id, e))
124
+ motivo = 'autoria_ambigua';
125
+ resultado.push({ tenant, thread: id, linha: i + 1,
126
+ evento: `.orkastery/threads/${id}/ledger.jsonl#evento:${i + 1}`,
127
+ sha256: (0, node_crypto_1.createHash)('sha256').update(linhas[i]).digest('hex'), elegivel: motivo === 'elegivel', motivo, autor,
128
+ evidencia: evidencia?.arquivo ?? null, evidenciaSha256: evidencia?.sha256 ?? null });
129
+ }
130
+ }
131
+ return resultado;
132
+ }
133
+ function entradaDoGate(carregado, item) {
134
+ const linhas = fs.readFileSync(path.join((0, thread_1.dirThread)(carregado.raiz, item.thread), 'ledger.jsonl'), 'utf8').split('\n');
135
+ const linha = linhas[item.linha - 1];
136
+ if ((0, node_crypto_1.createHash)('sha256').update(linha).digest('hex') !== item.sha256)
137
+ throw new Error('memory.human.event-changed');
138
+ if (evidenciaDeGate(carregado.raiz, item.thread, item.evidencia)?.sha256 !== item.evidenciaSha256) {
139
+ throw new Error('memory.human.evidence-changed');
140
+ }
141
+ const e = JSON.parse(linha);
142
+ const fase = typeof e.fase === 'string' ? e.fase : 'desconhecida';
143
+ return { collection: 'decision', source: 'human', priority: 'high',
144
+ content: `Decisao humana confirmada por ${item.autor} na thread ${item.thread}.\n` +
145
+ `Assunto: ${typeof e.sobre === 'string' ? e.sobre : 'nao declarado'}.\n` +
146
+ `Resposta registrada: ${typeof e.observacao === 'string' && e.observacao ? e.observacao : 'Aprovacao confirmada no evento original, sem observacao adicional.'}\n` +
147
+ `Evento: ${item.evento}, em ${e.ts}.\nEvidencia humana: ${item.evidencia}`,
148
+ tags: { project: [item.tenant], skill: [fase, 'orkastery-decision'],
149
+ situation: ['human_gate', `thread:${item.thread}`, `fase:${fase}`], agent: ['desconhecido:desconhecido', 'ork'] },
150
+ metadata: { tenant: item.tenant, thread: item.thread, eventoOriginal: e,
151
+ proveniencia: { tipo: 'human_gate', source: 'human', confirmado: true, autor: item.autor,
152
+ origem: e.origem, canal: typeof e.canal === 'string' ? e.canal : null,
153
+ evento: item.evento, sha256: item.sha256, evidencia: item.evidencia, evidenciaSha256: item.evidenciaSha256 } } };
154
+ }
155
+ /** Publica eventos apenas da thread autorizada; inventario nao autoriza escrita cruzada. */
156
+ function publicarGatesHumanos(carregado, memoria, somenteThread) {
157
+ if (!somenteThread)
158
+ throw new Error('scope.write.required');
159
+ (0, escopo_escrita_1.validarDiretorioDeThread)(carregado.raiz, somenteThread);
160
+ const inventario = inventariarGatesHumanos(carregado, somenteThread);
161
+ const resultados = inventario.filter(i => i.elegivel).map(item => {
162
+ let gravacao;
163
+ try {
164
+ (0, escopo_escrita_1.validarDiretorioDeThread)(carregado.raiz, item.thread);
165
+ gravacao = memoria.gravar(entradaDoGate(carregado, item));
166
+ }
167
+ catch {
168
+ gravacao = { ok: false, id: null, duplicada: false, collection: 'decision', detalhe: 'memory.human.publication-failed' };
169
+ }
170
+ return { evento: item.evento, gravacao };
171
+ });
172
+ const resultado = { inventario, resultados, elegiveis: resultados.length,
173
+ excluidos: inventario.filter(i => !i.elegivel).length,
174
+ falhas: resultados.filter(r => !r.gravacao.ok).length };
175
+ for (const id of new Set(inventario.map(i => i.thread))) {
176
+ const daThread = resultados.filter(r => r.evento.startsWith(`.orkastery/threads/${id}/`));
177
+ if (!daThread.length)
178
+ continue;
179
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(carregado.raiz, id), id, 'human_memory_sync', {
180
+ tenant: memoria.estado.tenant, regime: memoria.regime, resultados: daThread,
181
+ excluidos: inventario.filter(i => i.thread === id && !i.elegivel).map(i => ({ evento: i.evento, motivo: i.motivo }))
182
+ });
183
+ }
184
+ return resultado;
185
+ }
186
+ /** O gate ja e durable. Falha posterior e uma pendencia de publicacao recuperavel. */
187
+ function publicarAprovacaoHumana(raiz, threadId, aprovacao) {
188
+ const recuperar = `ork memory sync ${threadId}`;
189
+ try {
190
+ const carregado = (0, manifest_1.exigirManifesto)(raiz);
191
+ if (carregado.manifesto.memory.mode === 'orkmind')
192
+ (0, write_activation_1.exigirAtivacao)(carregado, threadId, 'memory');
193
+ const { abrirMemoria } = require('./memoria');
194
+ const r = publicarGatesHumanos(carregado, abrirMemoria(carregado), threadId);
195
+ const sha256 = (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(aprovacao)).digest('hex');
196
+ const alvo = r.inventario.find(i => i.sha256 === sha256 && i.elegivel);
197
+ if (r.falhas === 0 && alvo && r.resultados.some(i => i.evento === alvo.evento && i.gravacao.ok)) {
198
+ return { estado: 'publicada', motivo: null, recuperar };
199
+ }
200
+ }
201
+ catch { /* Erros arbitrarios de driver, manifesto ou evidencia nao entram no ledger. */ }
202
+ const motivo = 'memory.human.publication-pending';
203
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, 'human_memory_sync_failed', {
204
+ motivo, aprovacaoPersistida: true, recuperar,
205
+ });
206
+ return { estado: 'pendente', motivo, recuperar };
207
+ }