@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.
- package/LICENSE +1 -1
- package/README.md +86 -65
- package/adapters/README.md +30 -15
- package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
- package/adapters/claude-code/README.md +110 -8
- package/adapters/claude-code/commands/onboarding.md +21 -0
- package/adapters/claude-code/commands/ork.md +99 -27
- package/adapters/claude-code/hooks/hooks.json +6 -1
- package/adapters/claude-code/hooks/ork-sensor.js +66 -0
- package/adapters/codex/skills/ork/SKILL.md +57 -0
- package/adapters/hermes/README.md +163 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
- package/adapters/hermes/bin/ork-brain.sh +4 -0
- package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
- package/adapters/hermes/bin/ork-maestro.sh +6 -0
- package/adapters/hermes/bin/ork-master-enviar.py +84 -0
- package/adapters/hermes/bin/ork-objective-message.sh +17 -0
- package/adapters/hermes/bin/ork-objective-status.sh +12 -0
- package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
- package/adapters/hermes/hermes.plugin.json +26 -4
- package/adapters/hermes/hitl-ingress/__init__.py +356 -0
- package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
- package/adapters/openclaw/README.md +135 -26
- package/adapters/openclaw/bin/ork-brain.sh +4 -0
- package/adapters/openclaw/construir.sh +19 -0
- package/adapters/openclaw/dist/hitl-ingress.js +199 -0
- package/adapters/openclaw/dist/index.js +437 -0
- package/adapters/openclaw/openclaw.plugin.json +39 -134
- package/adapters/openclaw/package.json +26 -0
- package/adapters/openclaw/src/hitl-ingress.ts +180 -0
- package/adapters/openclaw/src/index.ts +458 -0
- package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
- package/adapters/openclaw/tsconfig.json +15 -0
- package/assets/docs/markdownlint-cli2.jsonc +22 -0
- package/assets/docs/padroes/documentacao-de-produto.md +133 -0
- package/assets/docs/padroes/roadmap-de-produto.md +98 -0
- package/assets/docs/produto/README.md +14 -0
- package/assets/docs/produto/_modelo-feature.md +59 -0
- package/assets/docs/roadmap/README.md +14 -0
- package/assets/docs/roadmap/_modelo-item.md +73 -0
- package/assets/orkmind-native-schema.json +32 -0
- package/assets/orkmind_bridge.py +357 -0
- package/assets/orkmind_fixture.py +67 -0
- package/assets/orkmind_prospective.py +138 -0
- package/assets/reference-tariffs-i07.json +23 -0
- package/dist/adapters/claude-bg.js +488 -39
- package/dist/adapters/codex-controller-sensor.js +449 -0
- package/dist/adapters/codex-controller-worker.js +361 -0
- package/dist/adapters/codex-controller.js +252 -0
- package/dist/adapters/codex-events.js +205 -0
- package/dist/adapters/codex-question.js +26 -0
- package/dist/adapters/codex-runner.js +133 -0
- package/dist/adapters/codex.js +394 -0
- package/dist/agents-md.js +84 -0
- package/dist/auditoria.js +11 -8
- package/dist/auditrun.js +5 -4
- package/dist/board.js +173 -22
- package/dist/branch-de-estado.js +136 -0
- package/dist/canarios-hitl.js +177 -0
- package/dist/canarios-i43.js +543 -0
- package/dist/canarios-pulse.js +147 -0
- package/dist/canarios-sensores.js +129 -0
- package/dist/canarios.js +111 -2
- package/dist/catalogo.js +9 -0
- package/dist/ci.js +216 -0
- package/dist/ciclos.js +2 -1
- package/dist/claim-lint.js +64 -0
- package/dist/claims.js +60 -0
- package/dist/company-brain-capture.js +195 -0
- package/dist/company-brain-cli.js +123 -0
- package/dist/company-brain-client.js +61 -0
- package/dist/company-brain-contract.js +166 -0
- package/dist/company-brain-journal.js +192 -0
- package/dist/company-brain-mcp.js +33 -0
- package/dist/company-brain-migration.js +60 -0
- package/dist/company-brain-source.js +177 -0
- package/dist/company-brain-worker.js +18 -0
- package/dist/conducao-texto.js +61 -0
- package/dist/conducao.js +876 -0
- package/dist/contrato-publico.js +39 -0
- package/dist/creation-operation-store.js +251 -0
- package/dist/creation-operation.js +148 -0
- package/dist/decisao-autonoma.js +183 -0
- package/dist/delegation.js +79 -0
- package/dist/demo.js +120 -0
- package/dist/docs.js +828 -0
- package/dist/doctor.js +183 -24
- package/dist/entrega-pr.js +117 -0
- package/dist/escopo-escrita.js +71 -0
- package/dist/estado-thread.js +222 -0
- package/dist/evalrunner.js +12 -0
- package/dist/fabrica-estado.js +329 -0
- package/dist/fabrica-publicar.js +76 -0
- package/dist/fix.js +21 -0
- package/dist/gates.js +55 -9
- package/dist/handoff.js +39 -23
- package/dist/hitl-canais.js +333 -0
- package/dist/hitl-classificacao.js +131 -0
- package/dist/hitl-contract.js +465 -0
- package/dist/hitl-estado.js +136 -0
- package/dist/hitl-gates.js +554 -0
- package/dist/hitl-ingress-receipt.js +382 -0
- package/dist/hitl-local-atestado.js +57 -0
- package/dist/hitl-local-receipt.js +328 -0
- package/dist/hitl-local.js +143 -0
- package/dist/hitl-lock.js +139 -0
- package/dist/hitl-lote.js +223 -0
- package/dist/hitl-native-offer.js +97 -0
- package/dist/hitl-native.js +65 -0
- package/dist/hitl-presentation.js +209 -0
- package/dist/hitl-public-receipt.js +176 -0
- package/dist/hitl-resumo.js +209 -0
- package/dist/hitl-sessions.js +475 -0
- package/dist/hitl.js +711 -0
- package/dist/horario.js +269 -0
- package/dist/hosts.js +198 -22
- package/dist/index.js +1736 -93
- package/dist/indice.js +99 -0
- package/dist/init.js +28 -3
- package/dist/integracoes-locais.js +17 -0
- package/dist/leases.js +65 -21
- package/dist/ledger-stats.js +272 -0
- package/dist/ledger.js +107 -2
- package/dist/licoes.js +215 -0
- package/dist/liveness.js +218 -0
- package/dist/maestro-actions.js +51 -0
- package/dist/maestro-authority.js +152 -0
- package/dist/maestro-cli.js +97 -0
- package/dist/maestro-contract.js +55 -0
- package/dist/maestro-discovery.js +132 -0
- package/dist/maestro-runtime.js +268 -0
- package/dist/maestro-snapshot.js +86 -0
- package/dist/maestro-sources.js +224 -0
- package/dist/manifest.js +165 -6
- package/dist/maquina.js +102 -0
- package/dist/master-audit.js +101 -0
- package/dist/master-batch.js +43 -0
- package/dist/master-digest.js +149 -0
- package/dist/master-migracao.js +155 -0
- package/dist/master.js +361 -77
- package/dist/mcp-artifacts.js +234 -0
- package/dist/mcp-git.js +433 -0
- package/dist/mcp-install.js +310 -0
- package/dist/mcp-maestro.js +25 -0
- package/dist/mcp-server.js +469 -0
- package/dist/mcp-ship.js +436 -0
- package/dist/mcp-verify.js +173 -0
- package/dist/memoria-humana.js +207 -0
- package/dist/memoria.js +314 -78
- package/dist/memory-migration.js +279 -0
- package/dist/memory-prospective.js +148 -0
- package/dist/modos-migracao.js +191 -0
- package/dist/modos.js +151 -15
- package/dist/monitor-lock.js +110 -0
- package/dist/objective.js +449 -0
- package/dist/ocupacao.js +267 -0
- package/dist/onboarding.js +303 -0
- package/dist/orkmind.js +389 -90
- package/dist/orquestracao.js +96 -69
- package/dist/phase.js +596 -150
- package/dist/playbook-capabilities.js +150 -0
- package/dist/playbook-contracts.js +188 -0
- package/dist/portfolio-context.js +61 -0
- package/dist/portfolio.js +180 -0
- package/dist/preflight.js +207 -0
- package/dist/process-audit.js +112 -0
- package/dist/project-state.js +93 -0
- package/dist/prompts.js +25 -5
- package/dist/prova-minima.js +112 -0
- package/dist/pulse-cadencia.js +163 -0
- package/dist/pulse-consentimento.js +260 -0
- package/dist/pulse-delivery.js +323 -0
- package/dist/pulse-resposta.js +542 -0
- package/dist/pulse.js +262 -0
- package/dist/ratelimit.js +35 -2
- package/dist/recall.js +80 -3
- package/dist/redacao-saida.js +45 -0
- package/dist/redacao-url.js +66 -0
- package/dist/retry.js +637 -115
- package/dist/roadmap-reservas.js +243 -0
- package/dist/runtime-ambiente.js +38 -0
- package/dist/runtime-context.js +215 -0
- package/dist/runtime-profiles.js +869 -0
- package/dist/runtimes.js +103 -0
- package/dist/sandbox.js +9 -0
- package/dist/session-events.js +203 -0
- package/dist/session-watcher-claude.js +637 -0
- package/dist/session-watcher.js +683 -0
- package/dist/sessoes-adopt.js +154 -0
- package/dist/sessoes-inventario.js +159 -0
- package/dist/sessoes.js +16 -35
- package/dist/setup.js +691 -0
- package/dist/ship.js +150 -15
- package/dist/slug.js +1 -1
- package/dist/thread-close.js +115 -0
- package/dist/thread.js +142 -28
- package/dist/tokens.js +1 -1
- package/dist/util.js +4 -2
- package/dist/verify-sandbox.js +265 -0
- package/dist/verify.js +270 -25
- package/dist/versao.js +60 -0
- package/dist/worktree.js +31 -2
- package/dist/write-activation.js +291 -0
- package/dist/yaml.js +2 -0
- package/eval/casos/onboarding.json +102 -0
- package/eval/casos/orkastery-bootstrap.json +35 -1
- package/eval/casos/scope-check-capability-map.json +45 -7
- package/eval/casos/ship-release.json +2 -2
- package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
- package/eval/fixtures/b2-master-log/caso.json +1 -1
- package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
- package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
- package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
- package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
- package/eval/fixtures/fx-codex-dry/caso.json +18 -0
- package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
- package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
- package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
- package/eval/fixtures/fx-happy/caso.json +6 -4
- package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
- package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
- package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
- package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
- package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
- package/eval/fixtures/fx-omnicanal/caso.json +17 -0
- package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
- package/monitor/company-brain.cjs +17 -0
- package/monitor/pulse-scope.cjs +45 -0
- package/monitor/pulse.cron +18 -0
- package/monitor/varredura-pulse.sh +27 -0
- package/package.json +25 -4
- package/schemas/claims.schema.json +25 -0
- package/schemas/company-brain.schema.json +1158 -0
- package/schemas/creation-operation.schema.json +365 -0
- package/schemas/maestro-snapshot.schema.json +2716 -0
- package/skills/core/onboarding/SKILL.md +50 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
- package/skills/core/thread-state/SKILL.md +3 -1
- 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
|
+
}
|