@orkastery/cli 0.5.1 → 0.5.6
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/adapters/claude-code/README.md +158 -0
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
- package/adapters/openclaw/README.md +26 -5
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +46 -11
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +49 -11
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +116 -18
- package/dist/adapters/codex.js +14 -4
- package/dist/agents-md.js +24 -14
- package/dist/auditrun.js +22 -3
- package/dist/board.js +20 -17
- package/dist/branch-de-estado.js +88 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +21 -8
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +41 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +36 -1
- package/dist/conducao-sentinela.js +388 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +122 -30
- package/dist/conhecimento.js +490 -0
- package/dist/docs.js +70 -17
- package/dist/doctor-pulse-cron.js +349 -0
- package/dist/doctor-rede.js +150 -0
- package/dist/doctor.js +195 -111
- package/dist/entrega-pr.js +42 -29
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +181 -0
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +52 -14
- package/dist/fabrica-publicar.js +9 -1
- package/dist/fechamento.js +20 -66
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +31 -7
- package/dist/gates.js +3 -24
- package/dist/handoff.js +10 -6
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +38 -3
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/hitl.js +29 -33
- package/dist/horario.js +41 -7
- package/dist/hosts.js +104 -11
- package/dist/impedimento.js +299 -0
- package/dist/index.js +961 -542
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +9 -1
- package/dist/init.js +56 -43
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +170 -16
- package/dist/intelligence-graph-contexto.js +254 -0
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/leases.js +664 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +18 -1
- package/dist/licoes.js +1 -0
- package/dist/liveness.js +6 -3
- package/dist/locale-ajuda.js +761 -0
- package/dist/locale-gerados.js +160 -0
- package/dist/locale-master.js +99 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-pulse.js +211 -0
- package/dist/locale-retry.js +385 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-ship.js +494 -0
- package/dist/locale-thread.js +277 -0
- package/dist/locale-verify.js +125 -0
- package/dist/locale.js +714 -0
- package/dist/maestro-runtime.js +4 -1
- package/dist/manifest.js +149 -4
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +18 -11
- package/dist/master.js +145 -31
- package/dist/mcp-artifacts.js +43 -3
- package/dist/mcp-git.js +42 -8
- package/dist/mcp-grafo-worker.js +5 -3
- package/dist/mcp-grafo.js +55 -6
- package/dist/mcp-server.js +22 -3
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +48 -6
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +196 -18
- package/dist/noctum-arco.js +911 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-envelope.js +810 -0
- package/dist/noctum-execucao.js +304 -0
- package/dist/noctum-fila.js +280 -0
- package/dist/ocupacao.js +40 -5
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +99 -7
- package/dist/orquestracao.js +24 -21
- package/dist/parado-no-condutor.js +219 -38
- package/dist/phase.js +160 -52
- package/dist/policies.js +56 -5
- package/dist/portfolio.js +8 -3
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +132 -5
- package/dist/prompts.js +40 -1
- package/dist/prova-ativacao.js +75 -6
- package/dist/pulse-delivery.js +47 -4
- package/dist/pulse.js +98 -19
- package/dist/ratelimit.js +24 -6
- package/dist/recall.js +3 -1
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +337 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +291 -140
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +150 -34
- package/dist/runtime-context.js +181 -3
- package/dist/runtime-profiles.js +22 -1
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +120 -24
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -18
- package/dist/sessoes.js +83 -2
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +157 -88
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +299 -49
- package/dist/util.js +8 -1
- package/dist/verify.js +141 -52
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +165 -0
- package/dist/worktree.js +25 -2
- package/dist/yaml.js +27 -8
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -1
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
package/dist/maestro-runtime.js
CHANGED
|
@@ -75,8 +75,11 @@ const shipView = zod_1.z.union([
|
|
|
75
75
|
zod_1.z.object({
|
|
76
76
|
tipo: zod_1.z.literal('ship_done'), ts: shipTs, pushVerificado: zod_1.z.boolean(), mergeSha: shipSha,
|
|
77
77
|
shaRemoto: shipSha.nullable().optional(),
|
|
78
|
+
// RM-037 (fatia 5, A1): o push prova a ponta da base; o `mergeSha` e o merge que entregou, que pode ser mais
|
|
79
|
+
// velho que ela. Recibo sem o campo continua valendo pela regra de antes.
|
|
80
|
+
pontaDaBase: shipSha.nullable().optional(),
|
|
78
81
|
fonteDaProva: zod_1.z.string().min(1).max(512).refine(v => !/[\u0000-\u001f\u007f]/.test(v)).nullable().optional(),
|
|
79
|
-
}).refine(s => !s.pushVerificado || (s.shaRemoto === s.mergeSha && typeof s.fonteDaProva === 'string')),
|
|
82
|
+
}).refine(s => !s.pushVerificado || (s.shaRemoto === (s.pontaDaBase ?? s.mergeSha) && typeof s.fonteDaProva === 'string')),
|
|
80
83
|
zod_1.z.object({ tipo: zod_1.z.enum(['ship_started', 'ship_blocked']), ts: shipTs }),
|
|
81
84
|
]);
|
|
82
85
|
function operationalSources(reader, threads, native = [], now = new Date().toISOString(), threadScope) {
|
package/dist/manifest.js
CHANGED
|
@@ -37,7 +37,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
37
37
|
};
|
|
38
38
|
})();
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.EMBEDDING_PADRAO = exports.LIMITE_MANIFESTO_BYTES = exports.DIR_ESTADO = exports.NOME_MANIFESTO_LEGADO = exports.NOME_MANIFESTO = void 0;
|
|
40
|
+
exports.EMBEDDING_PADRAO = exports.TETO_MAXIMO_DE_CUSTO_USD = exports.TETO_MAXIMO_DE_TEAMMATES = exports.LIMITE_MANIFESTO_BYTES = exports.DIR_ESTADO = exports.NOME_MANIFESTO_LEGADO = exports.NOME_MANIFESTO = void 0;
|
|
41
41
|
exports.fixarDiretorioDoProjeto = fixarDiretorioDoProjeto;
|
|
42
42
|
exports.diretorioDoProjeto = diretorioDoProjeto;
|
|
43
43
|
exports.acharRaiz = acharRaiz;
|
|
@@ -45,6 +45,8 @@ exports.dirEstado = dirEstado;
|
|
|
45
45
|
exports.validarOptInPlaybook = validarOptInPlaybook;
|
|
46
46
|
exports.configDeEmbedding = configDeEmbedding;
|
|
47
47
|
exports.carregarManifesto = carregarManifesto;
|
|
48
|
+
exports.cliDaMemoriaValido = cliDaMemoriaValido;
|
|
49
|
+
exports.comandosDoTextoDoManifesto = comandosDoTextoDoManifesto;
|
|
48
50
|
exports.exigirManifesto = exigirManifesto;
|
|
49
51
|
const fs = __importStar(require("node:fs"));
|
|
50
52
|
const path = __importStar(require("node:path"));
|
|
@@ -59,6 +61,8 @@ const horario_1 = require("./horario");
|
|
|
59
61
|
const experiencia_1 = require("./experiencia");
|
|
60
62
|
const runtime_ambiente_1 = require("./runtime-ambiente");
|
|
61
63
|
const orkmind_1 = require("./orkmind");
|
|
64
|
+
const locale_1 = require("./locale");
|
|
65
|
+
const branch_de_estado_1 = require("./branch-de-estado");
|
|
62
66
|
exports.NOME_MANIFESTO = 'orkastery.yaml';
|
|
63
67
|
exports.NOME_MANIFESTO_LEGADO = 'devmaster.yaml';
|
|
64
68
|
exports.DIR_ESTADO = '.orkastery';
|
|
@@ -91,7 +95,12 @@ function acharRaiz(dirInicial = diretorioDoProjeto()) {
|
|
|
91
95
|
}
|
|
92
96
|
/** Caminho do diretorio de estado da raiz informada. */
|
|
93
97
|
function dirEstado(raiz) {
|
|
94
|
-
|
|
98
|
+
// RM-047 (fronteira de confiança): `.orkastery` versionado como link levaria o estado para fora da raiz.
|
|
99
|
+
const dir = path.join(raiz, exports.DIR_ESTADO);
|
|
100
|
+
if (fs.lstatSync(dir, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
101
|
+
throw new Error(`estado.link: ${exports.DIR_ESTADO} é link simbólico; o estado do ork fica numa pasta de verdade dentro da raiz. Remova o link.`);
|
|
102
|
+
}
|
|
103
|
+
return dir;
|
|
95
104
|
}
|
|
96
105
|
function texto(v, padrao) {
|
|
97
106
|
return typeof v === 'string' ? v : typeof v === 'number' ? String(v) : padrao;
|
|
@@ -99,6 +108,15 @@ function texto(v, padrao) {
|
|
|
99
108
|
function numero(v, padrao) {
|
|
100
109
|
return typeof v === 'number' ? v : typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v)) ? Number(v) : padrao;
|
|
101
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* RM-058 N2: as vagas da fila pesada, inteiras de 0 a 64. So o 0 escrito desliga a fila; fracao positiva sobe para 1 e
|
|
113
|
+
* valor sem sentido volta ao padrao 1, nunca a "sem fila".
|
|
114
|
+
*/
|
|
115
|
+
function vagasPesadas(v) {
|
|
116
|
+
if (!Number.isFinite(v) || v < 0)
|
|
117
|
+
return 1;
|
|
118
|
+
return v === 0 ? 0 : Math.min(64, Math.max(1, Math.trunc(v)));
|
|
119
|
+
}
|
|
102
120
|
/**
|
|
103
121
|
* I-37 (D2): `verify.timeout_ms` e `verify.timeout_ms_por_comando`. Prazo so vale inteiro
|
|
104
122
|
* positivo em milissegundos, entre 1 s e 24 h; o resto e erro do manifesto, porque um prazo
|
|
@@ -187,6 +205,65 @@ function lerGrafo(v, avisos) {
|
|
|
187
205
|
avisos.push(`grafo.mcp deve ser true ou false; vale false (${mostrar(mcp)} nao reconhecido)`);
|
|
188
206
|
return { mcp: false };
|
|
189
207
|
}
|
|
208
|
+
/** RM-059 (T10.4): os limites dos tetos de agent teams, os mesmos que o Portao de Tarefas aceita do ambiente. */
|
|
209
|
+
exports.TETO_MAXIMO_DE_TEAMMATES = 8;
|
|
210
|
+
exports.TETO_MAXIMO_DE_CUSTO_USD = 500;
|
|
211
|
+
/**
|
|
212
|
+
* RM-059 (T10.4, D11 da thread ork-rm059portao): agent teams no despacho do GO, so em piloto. `runtime.agent_teams`
|
|
213
|
+
* liga com `ligado: true` e os dois tetos validos: `teammates` inteiro de 1 a 8 e `custo_usd` maior que 0 e ate 500,
|
|
214
|
+
* escrito como numero decimal simples. Ausente ou `ligado: false` fica desligado sem aviso; ligado com teto invalido,
|
|
215
|
+
* outro tipo ou chave desconhecida avisa e fica desligado, nunca erro: a chave e experimental e nao para a fabrica.
|
|
216
|
+
*/
|
|
217
|
+
function lerAgentTeams(v, avisos) {
|
|
218
|
+
const mostrar = (x) => (x === undefined ? 'ausente' : JSON.stringify(x).slice(0, 80));
|
|
219
|
+
if (v === undefined || v === null)
|
|
220
|
+
return undefined;
|
|
221
|
+
if (typeof v !== 'object' || Array.isArray(v)) {
|
|
222
|
+
avisos.push(`runtime.agent_teams deve ser um mapa com ligado, teammates e custo_usd; fica desligado (${mostrar(v)} nao reconhecido)`);
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
for (const chave of Object.keys(v)) {
|
|
226
|
+
if (!['ligado', 'teammates', 'custo_usd'].includes(chave))
|
|
227
|
+
avisos.push(`runtime.agent_teams.${chave} desconhecida; o bloco so tem ligado, teammates e custo_usd`);
|
|
228
|
+
}
|
|
229
|
+
if (v.ligado !== true) {
|
|
230
|
+
if (v.ligado !== undefined && v.ligado !== null && v.ligado !== false) {
|
|
231
|
+
avisos.push(`runtime.agent_teams.ligado deve ser true ou false; fica desligado (${mostrar(v.ligado)} nao reconhecido)`);
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const teammates = v.teammates;
|
|
236
|
+
const custo = v.custo_usd;
|
|
237
|
+
const tetoOk = typeof teammates === 'number' && Number.isInteger(teammates) && teammates >= 1 && teammates <= exports.TETO_MAXIMO_DE_TEAMMATES;
|
|
238
|
+
const custoOk = typeof custo === 'number' && /^\d+(?:\.\d+)?$/.test(String(custo)) && custo > 0 && custo <= exports.TETO_MAXIMO_DE_CUSTO_USD;
|
|
239
|
+
if (!tetoOk || !custoOk) {
|
|
240
|
+
avisos.push(`runtime.agent_teams ligado sem teto valido (teammates inteiro de 1 a ${exports.TETO_MAXIMO_DE_TEAMMATES} e custo_usd maior que 0 ` +
|
|
241
|
+
`e ate ${exports.TETO_MAXIMO_DE_CUSTO_USD}; recebido teammates ${mostrar(teammates)} e custo_usd ${mostrar(custo)}); fica desligado`);
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
return { teammates: teammates, custo_usd: custo };
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* RM-026 K7 (D1): `conhecimento.dir`, a pasta dos documentos `ork.conhecimento/v1`. Sem o bloco, o projeto nao
|
|
248
|
+
* declarou conhecimento. Bloco que nao e mapa e `dir` vazio avisam e ficam declarados com `dir` vazio, que o
|
|
249
|
+
* leitor (`conhecimento.ts`) recusa com `conhecimento.dir-invalido`: quem declarou nao ouve que nao declarou.
|
|
250
|
+
* Chave desconhecida so avisa. Ler a pasta nao executa nada, e a regra do caminho mora no leitor.
|
|
251
|
+
*/
|
|
252
|
+
function lerBlocoConhecimento(v, avisos) {
|
|
253
|
+
if (v === undefined || v === null)
|
|
254
|
+
return undefined;
|
|
255
|
+
if (typeof v !== 'object' || Array.isArray(v)) {
|
|
256
|
+
avisos.push('conhecimento deve ser um mapa com dir: <pasta dentro da raiz>; o leitor recusa ate corrigir');
|
|
257
|
+
return { dir: '' };
|
|
258
|
+
}
|
|
259
|
+
for (const chave of Object.keys(v))
|
|
260
|
+
if (chave !== 'dir')
|
|
261
|
+
avisos.push(`conhecimento.${chave} desconhecida; o bloco conhecimento so tem dir`);
|
|
262
|
+
const dir = texto(v.dir, '').trim();
|
|
263
|
+
if (!dir)
|
|
264
|
+
avisos.push('conhecimento.dir deve ser uma pasta dentro da raiz, como docs/conhecimento; o leitor recusa ate corrigir');
|
|
265
|
+
return { dir };
|
|
266
|
+
}
|
|
190
267
|
/** Mesmo contrato na leitura do YAML e nos consumidores de manifesto em memoria. */
|
|
191
268
|
function validarOptInPlaybook(valor) {
|
|
192
269
|
if (valor === undefined)
|
|
@@ -334,6 +411,12 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
334
411
|
erros.push('conduction.delegation exige thread, escopo premissas, prazo ISO, evidencia e delegado');
|
|
335
412
|
}
|
|
336
413
|
const worktree = mapa(dados.worktree);
|
|
414
|
+
// RM-047 (fronteira de confiança): a base vai ao git em rev-parse, log, fetch e worktree add. Nome que o
|
|
415
|
+
// git não aceita como branch (começa com `-`, tem `..`) viraria opção dele; a regra é a do check-ref-format.
|
|
416
|
+
if (worktree.base_branch !== undefined && worktree.base_branch !== null && !(0, branch_de_estado_1.branchValida)(texto(worktree.base_branch, ''))) {
|
|
417
|
+
erros.push(`worktree.base_branch invalido: ${JSON.stringify(texto(worktree.base_branch, '')).slice(0, 60)} ` +
|
|
418
|
+
'(esperado nome de branch do git, sem "-" no começo e sem "..")');
|
|
419
|
+
}
|
|
337
420
|
const verify = mapa(dados.verify);
|
|
338
421
|
const ci = mapa(dados.ci);
|
|
339
422
|
const concurrency = mapa(dados.concurrency);
|
|
@@ -356,6 +439,16 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
356
439
|
avisos.push(`runtime_profiles.${nome} deve ser true ou false; vale o padrao ${padrao} (${JSON.stringify(v)} nao reconhecido)`);
|
|
357
440
|
return padrao;
|
|
358
441
|
};
|
|
442
|
+
// RM-056 (D2): opt-in. Valor desconhecido vale o padrao `ordem`, com aviso.
|
|
443
|
+
const distribuicaoDePerfis = () => {
|
|
444
|
+
const v = perfisDeRuntime.distribuir;
|
|
445
|
+
if (v === undefined || v === null || v === 'ordem')
|
|
446
|
+
return 'ordem';
|
|
447
|
+
if (v === 'carga')
|
|
448
|
+
return 'carga';
|
|
449
|
+
avisos.push(`runtime_profiles.distribuir aceita ordem ou carga; vale o padrao ordem (${JSON.stringify(v)} nao reconhecido)`);
|
|
450
|
+
return 'ordem';
|
|
451
|
+
};
|
|
359
452
|
const liveness = mapa(dados.liveness);
|
|
360
453
|
const silencioMaxMin = numero(liveness.silencio_max_min, 10);
|
|
361
454
|
if (!Number.isFinite(silencioMaxMin) || silencioMaxMin <= 0)
|
|
@@ -435,6 +528,8 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
435
528
|
if (!codex_1.SANDBOXES_DO_CODEX.includes(sandboxDoRuntime)) {
|
|
436
529
|
erros.push(`runtime.sandbox invalido: "${sandboxDoRuntime}" (aceitos: ${codex_1.SANDBOXES_DO_CODEX.join(', ')})`);
|
|
437
530
|
}
|
|
531
|
+
// RM-059 (T10.4): agent teams no despacho do GO, so no piloto e desligado por padrao.
|
|
532
|
+
const agentTeams = lerAgentTeams(runtime.agent_teams, avisos);
|
|
438
533
|
// Bloco B6, isolamento por tenant (precedente do incidente memory-orkmind):
|
|
439
534
|
// `database_url_env` recebe o NOME da variavel de ambiente, nunca a string de conexao.
|
|
440
535
|
// Uma DSN colada aqui e exatamente o defeito que fez a memoria de um produto escrever
|
|
@@ -451,11 +546,24 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
451
546
|
else if (variavelDaDsn !== '' && !/^[A-Z][A-Z0-9_]*$/.test(variavelDaDsn)) {
|
|
452
547
|
erros.push(`memory.database_url_env invalido: "${variavelDaDsn}" (esperado nome de variavel de ambiente, [A-Z][A-Z0-9_]*)`);
|
|
453
548
|
}
|
|
549
|
+
// RM-047 (fronteira de confiança): `memory.cli` escolhe o executável que o `ork doctor`, a memória e o
|
|
550
|
+
// `ork brain` rodam. Caminho relativo apontaria para um arquivo do próprio clone; só nome procurado no
|
|
551
|
+
// PATH (o `orkmind` instalado) ou caminho absoluto escolhido por quem instalou.
|
|
552
|
+
const cliDaMemoria = texto(memory.cli, 'orkmind');
|
|
553
|
+
if (!cliDaMemoriaValido(cliDaMemoria)) {
|
|
554
|
+
erros.push(`memory.cli invalido: ${JSON.stringify(cliDaMemoria).slice(0, 60)} ` +
|
|
555
|
+
'(esperado nome de executável no PATH, como orkmind, ou caminho absoluto; caminho relativo não é aceito)');
|
|
556
|
+
}
|
|
454
557
|
if (modoDeMemoria === 'orkmind' && variavelDaDsn === '') {
|
|
455
558
|
avisos.push('memory.mode: orkmind sem memory.database_url_env: o regime efetivo cai para files ' +
|
|
456
559
|
'(o `ork` nao adivinha DSN, e base alheia e pior do que base nenhuma)');
|
|
457
560
|
}
|
|
458
561
|
const embedding = lerEmbedding(memory.embedding, variavelDaDsn, erros);
|
|
562
|
+
const prazoDoUniverso = memory.universo_timeout_ms === undefined ? orkmind_1.TIMEOUT_DO_UNIVERSO_MS : memory.universo_timeout_ms;
|
|
563
|
+
if (typeof prazoDoUniverso !== 'number' || !Number.isSafeInteger(prazoDoUniverso) || prazoDoUniverso <= 0 ||
|
|
564
|
+
prazoDoUniverso > orkmind_1.LIMITE_TIMEOUT_DO_UNIVERSO_MS) {
|
|
565
|
+
erros.push('memory.universo_timeout_ms: esperado inteiro em ms entre 1 e 86400000 (24 h; valor omitido)');
|
|
566
|
+
}
|
|
459
567
|
const bytes = Buffer.byteLength(bruto, 'utf8');
|
|
460
568
|
if (bytes > exports.LIMITE_MANIFESTO_BYTES) {
|
|
461
569
|
erros.push(`manifesto com ${bytes} bytes, acima do limite duro de ${exports.LIMITE_MANIFESTO_BYTES} (prosa vai para memoria com tag, nao para o YAML)`);
|
|
@@ -463,6 +571,7 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
463
571
|
if (achado.legado) {
|
|
464
572
|
avisos.push(`lendo ${exports.NOME_MANIFESTO_LEGADO} como fallback; migre para ${exports.NOME_MANIFESTO}`);
|
|
465
573
|
}
|
|
574
|
+
const conhecimento = lerBlocoConhecimento(dados.conhecimento, avisos);
|
|
466
575
|
const manifesto = {
|
|
467
576
|
project: {
|
|
468
577
|
name: nomeProjeto,
|
|
@@ -481,6 +590,7 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
481
590
|
effort: texto(runtime.effort, 'high'),
|
|
482
591
|
provider_policy: providerPolicy,
|
|
483
592
|
sandbox: sandboxDoRuntime,
|
|
593
|
+
...(agentTeams ? { agent_teams: agentTeams } : {}),
|
|
484
594
|
},
|
|
485
595
|
conduction: {
|
|
486
596
|
default_mode: defaultModo ?? 'classic',
|
|
@@ -491,7 +601,9 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
491
601
|
worktree: {
|
|
492
602
|
base_branch: texto(worktree.base_branch, 'main'),
|
|
493
603
|
dir: texto(worktree.dir, '.claude/worktrees'),
|
|
494
|
-
|
|
604
|
+
// P4 do ensaio da 0.5.0: o `ork thread new` cria a worktree sem flag quando a chave diz true. Ausente le
|
|
605
|
+
// false, para o projeto que nunca a declarou seguir como era.
|
|
606
|
+
por_thread: booleano(worktree.por_thread, false),
|
|
495
607
|
},
|
|
496
608
|
verify: {
|
|
497
609
|
build: verify.build === null || verify.build === undefined ? undefined : texto(verify.build, ''),
|
|
@@ -512,6 +624,8 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
512
624
|
concurrency: {
|
|
513
625
|
max_parallel_threads: numero(concurrency.max_parallel_threads, 3),
|
|
514
626
|
stale_after_min: Math.max(1, Math.trunc(numero(concurrency.stale_after_min, 240))),
|
|
627
|
+
// RM-058 N2 (D9): uma operacao pesada por vez nesta raiz, por padrao; 0 desliga a fila.
|
|
628
|
+
max_parallel_heavy: vagasPesadas(numero(concurrency.max_parallel_heavy, 1)),
|
|
515
629
|
},
|
|
516
630
|
liveness: { silencio_max_min: silencioMaxMin },
|
|
517
631
|
handoff: {
|
|
@@ -522,6 +636,7 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
522
636
|
runtime_profiles: {
|
|
523
637
|
rotate_same_runtime_on_quota: chaveDeRotacao('rotate_same_runtime_on_quota', true),
|
|
524
638
|
rotate_same_runtime_on_auth: chaveDeRotacao('rotate_same_runtime_on_auth', true),
|
|
639
|
+
distribuir: distribuicaoDePerfis(),
|
|
525
640
|
},
|
|
526
641
|
// Bloco B3: o limite de escalacao tem padrao, e o padrao e conservador. Manifesto
|
|
527
642
|
// sem bloco `retry:` continua andando com 3 tentativas e janela estimada de 60 min,
|
|
@@ -540,6 +655,7 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
540
655
|
cli: texto(memory.cli, 'orkmind'),
|
|
541
656
|
tenant: texto(memory.tenant, '') || nomeProjeto,
|
|
542
657
|
timeout_ms: numero(memory.timeout_ms, 15000),
|
|
658
|
+
universo_timeout_ms: typeof prazoDoUniverso === 'number' ? prazoDoUniverso : orkmind_1.TIMEOUT_DO_UNIVERSO_MS,
|
|
543
659
|
...(embedding ? { embedding } : {}),
|
|
544
660
|
},
|
|
545
661
|
// Bloco B5: governanca de custo dos auditores. Ausente no manifesto quer dizer
|
|
@@ -558,15 +674,44 @@ function carregarManifesto(dirInicial = diretorioDoProjeto()) {
|
|
|
558
674
|
},
|
|
559
675
|
// RM-031 KG5 (D2): expor as tools do grafo no MCP e opt-in do dono.
|
|
560
676
|
grafo: lerGrafo(dados.grafo, avisos),
|
|
677
|
+
...(conhecimento ? { conhecimento } : {}),
|
|
561
678
|
policies: Object.fromEntries(Object.entries(mapa(dados.policies)).map(([k, v]) => [k, texto(v, '')])),
|
|
562
679
|
};
|
|
563
680
|
return { caminho: achado.caminho, raiz, legado: achado.legado, bytes, manifesto, erros, avisos };
|
|
564
681
|
}
|
|
682
|
+
/**
|
|
683
|
+
* RM-047: `memory.cli` aceito. Nome simples (procurado no PATH, sem barra e sem `-` no começo) ou caminho
|
|
684
|
+
* absoluto normalizado. Caminho relativo (`./bin/x`, `bin/x`) resolveria dentro do repositório clonado.
|
|
685
|
+
*/
|
|
686
|
+
function cliDaMemoriaValido(cli) {
|
|
687
|
+
// eslint-disable-next-line no-control-regex
|
|
688
|
+
if (cli === '' || /[\x00-\x1f\x7f]/.test(cli))
|
|
689
|
+
return false;
|
|
690
|
+
if (/^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/.test(cli))
|
|
691
|
+
return true;
|
|
692
|
+
return path.isAbsolute(cli) && path.normalize(cli) === cli;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* RM-059 (A15 da revisao da ork-rm059pista): os comandos de verify e o do CI de um `orkastery.yaml` lido como texto (o
|
|
696
|
+
* do HEAD de uma branch, pelo `git show`), com as mesmas regras do `carregarManifesto`. `null` quando o texto nao abre.
|
|
697
|
+
*/
|
|
698
|
+
function comandosDoTextoDoManifesto(bruto) {
|
|
699
|
+
let dados;
|
|
700
|
+
try {
|
|
701
|
+
dados = mapa((0, yaml_1.lerYaml)(bruto));
|
|
702
|
+
}
|
|
703
|
+
catch {
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
const verify = mapa(dados.verify), ci = mapa(dados.ci);
|
|
707
|
+
const opcional = (v) => (v === null || v === undefined ? undefined : texto(v, ''));
|
|
708
|
+
return { typecheck: opcional(verify.typecheck), build: opcional(verify.build), test: opcional(verify.test), ciCommand: opcional(ci.command) };
|
|
709
|
+
}
|
|
565
710
|
/** Carrega o manifesto ou encerra com mensagem acionavel (uso nos subcomandos). */
|
|
566
711
|
function exigirManifesto(dirInicial = diretorioDoProjeto()) {
|
|
567
712
|
const carregado = carregarManifesto(dirInicial);
|
|
568
713
|
if (!carregado) {
|
|
569
|
-
throw new
|
|
714
|
+
throw new locale_1.ErroDoCatalogo((m) => m.cli.manifestoNaoEncontrado(exports.NOME_MANIFESTO, dirInicial));
|
|
570
715
|
}
|
|
571
716
|
if (carregado.erros.length > 0) {
|
|
572
717
|
throw new Error(`manifesto invalido (${carregado.caminho}):\n - ${carregado.erros.join('\n - ')}`);
|
package/dist/maquina.js
CHANGED
|
@@ -39,6 +39,7 @@ exports.lerConfigDaMaquina = lerConfigDaMaquina;
|
|
|
39
39
|
exports.gravarConfigDaMaquina = gravarConfigDaMaquina;
|
|
40
40
|
exports.nomeDaMaquina = nomeDaMaquina;
|
|
41
41
|
exports.fabricaCompartilhada = fabricaCompartilhada;
|
|
42
|
+
exports.avisoDaFabricaPedida = avisoDaFabricaPedida;
|
|
42
43
|
/**
|
|
43
44
|
* I-51 (RM-047): esta maquina na fabrica.
|
|
44
45
|
*
|
|
@@ -49,8 +50,11 @@ exports.fabricaCompartilhada = fabricaCompartilhada;
|
|
|
49
50
|
* nao carregam o perfil do shell, e a mesma maquina apareceria com dois nomes.
|
|
50
51
|
*
|
|
51
52
|
* Precedencia do nome: `--maquina`, `ORK_MAQUINA`, o arquivo, o hostname.
|
|
52
|
-
* Precedencia da adesao: `ORK_FABRICA_COMPARTILHADA` (1 liga, 0 desliga), senao o
|
|
53
|
-
*
|
|
53
|
+
* Precedencia da adesao: `ORK_FABRICA_COMPARTILHADA` (1 liga, 0 desliga), senao o arquivo.
|
|
54
|
+
*
|
|
55
|
+
* RM-047 (fronteira de confianca, P5): o `fabrica.compartilhada` do manifesto vem com o repositorio e
|
|
56
|
+
* nao liga a publicacao desta maquina. Ele so diz que o time pede a fabrica compartilhada; o `ork`
|
|
57
|
+
* avisa, e quem liga e a maquina, com `ork fabrica entrar` (ou a variavel de ambiente).
|
|
54
58
|
*/
|
|
55
59
|
const fs = __importStar(require("node:fs"));
|
|
56
60
|
const os = __importStar(require("node:os"));
|
|
@@ -91,12 +95,27 @@ function gravarConfigDaMaquina(mudanca) {
|
|
|
91
95
|
function nomeDaMaquina(explicito) {
|
|
92
96
|
return (explicito ?? '').trim() || (process.env.ORK_MAQUINA ?? '').trim() || lerConfigDaMaquina()?.nome || os.hostname();
|
|
93
97
|
}
|
|
94
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Esta maquina publica o estado da fabrica deste projeto (e le o das outras)? Decide a maquina: a
|
|
100
|
+
* variavel de ambiente ou o `~/.orkastery/maquina.json`. O manifesto nao entra (RM-047, P5); o
|
|
101
|
+
* parametro fica para quem chama dizer de que projeto se trata.
|
|
102
|
+
*/
|
|
95
103
|
function fabricaCompartilhada(manifesto) {
|
|
104
|
+
void manifesto;
|
|
96
105
|
const env = (process.env.ORK_FABRICA_COMPARTILHADA ?? '').trim();
|
|
97
106
|
if (env === '1')
|
|
98
107
|
return true;
|
|
99
108
|
if (env === '0')
|
|
100
109
|
return false;
|
|
101
|
-
return
|
|
110
|
+
return lerConfigDaMaquina()?.fabricaCompartilhada === true;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* RM-047 (P5): o manifesto pede a fabrica compartilhada e esta maquina nao entrou. Devolve o aviso,
|
|
114
|
+
* com o comando que liga, ou `null`.
|
|
115
|
+
*/
|
|
116
|
+
function avisoDaFabricaPedida(manifesto) {
|
|
117
|
+
if (manifesto.fabrica?.compartilhada !== true || fabricaCompartilhada(manifesto))
|
|
118
|
+
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';
|
|
102
121
|
}
|
package/dist/master-digest.js
CHANGED
|
@@ -46,6 +46,7 @@ const node_crypto_1 = require("node:crypto");
|
|
|
46
46
|
const master_batch_1 = require("./master-batch");
|
|
47
47
|
const master_1 = require("./master");
|
|
48
48
|
const estado_thread_1 = require("./estado-thread");
|
|
49
|
+
const procedencia_1 = require("./procedencia");
|
|
49
50
|
const hitl_1 = require("./hitl");
|
|
50
51
|
const pulse_delivery_1 = require("./pulse-delivery");
|
|
51
52
|
const util_1 = require("./util");
|
|
@@ -125,7 +126,11 @@ function enviarDigest(opcoes) {
|
|
|
125
126
|
if (job.concluidoEm)
|
|
126
127
|
return { code: 0, detalhe: 'semana já confirmada', enviadas, semana };
|
|
127
128
|
salvar(file, job);
|
|
128
|
-
|
|
129
|
+
// RM-047 (P2): o executavel do transporte so sai do arquivo local, nunca de um versionado no git.
|
|
130
|
+
const hostLocal = path.join(raiz, '.orkastery/monitor/master-host.json');
|
|
131
|
+
if (!opcoes.transporte && !opcoes.enviar)
|
|
132
|
+
(0, procedencia_1.exigirHostLocal)(raiz, hostLocal);
|
|
133
|
+
const config = opcoes.transporte ?? (!opcoes.enviar ? (0, util_1.lerJson)(hostLocal) : undefined);
|
|
129
134
|
for (const [indice, p] of job.paginas.entries()) {
|
|
130
135
|
if (job.recibos.some(r => r.pagina === indice && r.sha256 === hash(p)))
|
|
131
136
|
continue;
|
package/dist/master-nota.js
CHANGED
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.ERRO_PROVA_DE_CANAL = exports.CONTRATO_PEDIDO_DE_NOTA = void 0;
|
|
37
|
+
exports.marcaDeHost = marcaDeHost;
|
|
37
38
|
exports.exigirNotaSemHost = exigirNotaSemHost;
|
|
38
39
|
exports.arquivoDasNotas = arquivoDasNotas;
|
|
39
40
|
exports.pedirNota = pedirNota;
|
|
@@ -80,14 +81,16 @@ const thread_close_1 = require("./thread-close");
|
|
|
80
81
|
const conducao_1 = require("./conducao");
|
|
81
82
|
const pulse_consentimento_1 = require("./pulse-consentimento");
|
|
82
83
|
const monitor_lock_1 = require("./monitor-lock");
|
|
84
|
+
const locale_1 = require("./locale");
|
|
83
85
|
exports.CONTRATO_PEDIDO_DE_NOTA = 'ork.master-nota/v1';
|
|
84
86
|
exports.ERRO_PROVA_DE_CANAL = 'master.prova-de-canal';
|
|
85
87
|
const sha = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');
|
|
86
88
|
/**
|
|
87
|
-
*
|
|
88
|
-
* ambiente
|
|
89
|
+
* A marca de host ou de despacho do processo, ou `undefined` no terminal do dono. Lida SO do
|
|
90
|
+
* ambiente. Serve para RECUSAR (D8) e para AVISAR (RM-008, aceite por omissao sem thread), nunca
|
|
91
|
+
* para autorizar.
|
|
89
92
|
*/
|
|
90
|
-
function
|
|
93
|
+
function marcaDeHost(ambiente = process.env) {
|
|
91
94
|
let canal;
|
|
92
95
|
try {
|
|
93
96
|
canal = (0, conducao_1.canalDoProcesso)(undefined, ambiente);
|
|
@@ -97,12 +100,19 @@ function exigirNotaSemHost(ambiente = process.env) {
|
|
|
97
100
|
}
|
|
98
101
|
// B2 do CHECK: `ORK_CANAL=cli` NAO absolve. A sessao despachada herda `ORK_CANAL=cli` quando a
|
|
99
102
|
// thread e conduzida do terminal, e o Claude Code e o Codex marcam os proprios processos. Qualquer
|
|
100
|
-
// marca de host ou de despacho
|
|
101
|
-
|
|
102
|
-
: ambiente.ORK_DISPATCH_ID ?
|
|
103
|
+
// marca de host ou de despacho conta, mesmo com o canal declarado como terminal.
|
|
104
|
+
return canal !== 'cli' ? canal
|
|
105
|
+
: ambiente.ORK_DISPATCH_ID ? (0, locale_1.msg)().master.marcaDespachada
|
|
103
106
|
: ambiente.CLAUDECODE === '1' ? 'claude-code (CLAUDECODE)'
|
|
104
107
|
: ambiente.CODEX_SANDBOX || ambiente.CODEX_SANDBOX_NETWORK_DISABLED ? 'codex (CODEX_SANDBOX)'
|
|
105
108
|
: (ambiente.HERMES_HOME ?? '').trim() ? 'hermes (HERMES_HOME)' : undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* D8: nota em nome de pessoa, vinda de processo de host, e recusada. O canal e lido SO do
|
|
112
|
+
* ambiente: `--canal` em argv nao conta, porque quem escreve argv e justamente quem chama.
|
|
113
|
+
*/
|
|
114
|
+
function exigirNotaSemHost(ambiente = process.env) {
|
|
115
|
+
const marca = marcaDeHost(ambiente);
|
|
106
116
|
if (marca) {
|
|
107
117
|
throw new Error(`${exports.ERRO_PROVA_DE_CANAL}: nota em nome de pessoa vinda de ${marca} exige a prova de canal do ingresso. ` +
|
|
108
118
|
'Peça a nota com ork master pedir <thread>: o dono responde pelo Telegram com o código, e a nota é gravada com o recibo.');
|
|
@@ -168,11 +178,8 @@ function pedidoDeNotaDoCodigo(raiz, codigo, estadoDir) {
|
|
|
168
178
|
function textoDoPedidoDeNota(raiz, p, canal) {
|
|
169
179
|
const t = (0, thread_1.lerThread)(raiz, p.thread);
|
|
170
180
|
const tg = canal === 'telegram';
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
`${tg ? '• ' : '- '}Sem nota, vale a aceita por omissão, com o índice derivado do ledger ao lado.`,
|
|
174
|
-
`${tg ? '↩️ ' : ''}Responda: ${p.codigo} <0 a 5> <porquê>, por exemplo: ${p.codigo} 4 entregou o que pedi.`,
|
|
175
|
-
].join('\n');
|
|
181
|
+
const m = (0, locale_1.msg)().master;
|
|
182
|
+
return [m.notaTitulo(tg, p.thread, t.nome.slice(0, 80)), m.notaSemNota(tg), m.notaResponda(tg, p.codigo)].join('\n');
|
|
176
183
|
}
|
|
177
184
|
/** "4 entregou o que pedi" vira nota e justificativa; o resto e devolvido como pergunta. */
|
|
178
185
|
function lerNota(resto) {
|