@orkastery/cli 0.6.0 → 0.6.2
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/agents/ork-check.md +1 -1
- package/adapters/claude-code/agents/ork-go.md +1 -1
- package/adapters/claude-code/agents/ork-goal.md +1 -1
- package/adapters/claude-code/agents/ork-master.md +1 -1
- package/adapters/claude-code/agents/ork-plan.md +1 -1
- package/adapters/claude-code/agents/ork-ship.md +1 -1
- package/adapters/claude-code/commands/ork.md +1 -1
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +2 -0
- package/adapters/codex/skills/ork/SKILL.md +1 -1
- package/adapters/openclaw/openclaw.plugin.json +1 -1
- package/adapters/openclaw/package.json +1 -1
- package/assets/adapters-en/claude-code/agents/ork-check.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-go.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-goal.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-master.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-plan.md +1 -1
- package/assets/adapters-en/claude-code/agents/ork-ship.md +1 -1
- package/assets/adapters-en/claude-code/commands/ork.md +1 -1
- package/assets/adapters-en/codex/skills/ork/SKILL.md +1 -1
- package/assets/orkmind_fixture.py +4 -1
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +1 -1
- package/assets/skills-en/phases/check-quality/SKILL.md +1 -1
- package/assets/skills-en/phases/go-implementation/SKILL.md +1 -1
- package/dist/adapters/claude-bg.js +9 -7
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +622 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/branch-de-estado.js +7 -2
- package/dist/changelog-check.js +217 -0
- package/dist/check-agil.js +289 -25
- package/dist/check-paralelo.js +73 -18
- package/dist/ci.js +3 -2
- package/dist/claim-lint.js +29 -0
- package/dist/claims.js +4 -0
- package/dist/conducao.js +5 -0
- package/dist/docs.js +16 -16
- package/dist/doctor-forja.js +1 -3
- package/dist/doctor.js +1 -1
- package/dist/entrega-pr.js +10 -10
- package/dist/fabrica-estado.js +20 -11
- package/dist/fila-pesada.js +121 -11
- package/dist/hitl-classificacao.js +1 -0
- package/dist/horario.js +4 -1
- package/dist/index.js +63 -35
- package/dist/integracoes-locais.js +2 -0
- package/dist/intelligence-graph-cli.js +27 -9
- package/dist/locale-accounts.js +11 -3
- package/dist/locale-ajuda.js +10 -6
- package/dist/locale-claims.js +16 -2
- package/dist/locale-forja.js +2 -4
- package/dist/locale-grafo.js +56 -1
- package/dist/locale-maestro.js +38 -0
- package/dist/locale-network.js +8 -6
- package/dist/locale-onboarding.js +14 -0
- package/dist/locale-operacao-restante.js +2 -2
- package/dist/locale-preflight.js +80 -0
- package/dist/locale-projetos.js +6 -0
- package/dist/locale-prompts.js +8 -8
- package/dist/locale-pulse.js +4 -0
- package/dist/locale-retry.js +56 -2
- package/dist/locale-security-scan.js +35 -1
- package/dist/locale-ship.js +10 -2
- package/dist/locale-verify.js +15 -0
- package/dist/locale.js +24 -7
- package/dist/maestro-cli.js +12 -17
- package/dist/manifest.js +6 -1
- package/dist/mcp-install.js +24 -13
- package/dist/mcp-server.js +62 -33
- package/dist/mcp-verify-async.js +353 -0
- package/dist/mcp-verify-worker.js +17 -0
- package/dist/mcp-verify.js +10 -1
- package/dist/merge-da-entrega.js +85 -0
- package/dist/network-roadmap.js +18 -14
- package/dist/noctum-aceite.js +154 -14
- package/dist/noctum-cli.js +69 -12
- package/dist/noctum-entrega.js +55 -7
- package/dist/noctum-envelope.js +1 -1
- package/dist/noctum-execucao.js +5 -1
- package/dist/noctum-fechamento.js +18 -7
- package/dist/noctum-fila.js +6 -1
- package/dist/noctum-guarda.js +81 -4
- package/dist/noctum-maquinas.js +5 -1
- package/dist/noctum-modo.js +35 -7
- package/dist/noctum-reconciliacao.js +4 -1
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-relatorio.js +44 -10
- package/dist/noctum-retomada-rede.js +71 -0
- package/dist/noctum-vigia.js +49 -9
- package/dist/parado-no-condutor.js +14 -15
- package/dist/pedido-conducao.js +51 -0
- package/dist/phase.js +43 -15
- package/dist/postura-local.js +7 -3
- package/dist/preflight.js +27 -27
- package/dist/prompts.js +4 -2
- package/dist/pulse.js +4 -2
- package/dist/ratelimit.js +1 -0
- package/dist/rede.js +24 -12
- package/dist/retry.js +115 -10
- package/dist/runtime-context.js +165 -45
- package/dist/runtime-escada.js +7 -1
- package/dist/runtime-profiles.js +27 -17
- package/dist/runtimes.js +42 -5
- package/dist/security-scan/agil.js +18 -7
- package/dist/security-scan/cli.js +2 -2
- package/dist/security-scan/executor.js +8 -0
- package/dist/security-scan/report.js +1 -1
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +52 -11
- package/dist/sessoes-contas.js +33 -5
- package/dist/setup.js +11 -11
- package/dist/varredura-acoes.js +8 -15
- package/dist/verify.js +191 -43
- package/package.json +2 -2
- package/skills/core/orkastery-bootstrap/SKILL.md +1 -1
- package/skills/phases/check-quality/SKILL.md +1 -1
- package/skills/phases/go-implementation/SKILL.md +1 -1
package/dist/preflight.js
CHANGED
|
@@ -46,6 +46,7 @@ const manifest_1 = require("./manifest");
|
|
|
46
46
|
const estado_thread_1 = require("./estado-thread");
|
|
47
47
|
const claude_bg_1 = require("./adapters/claude-bg");
|
|
48
48
|
const codex_1 = require("./adapters/codex");
|
|
49
|
+
const grok_1 = require("./adapters/grok");
|
|
49
50
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
50
51
|
const modos_1 = require("./modos");
|
|
51
52
|
const setup_1 = require("./setup");
|
|
@@ -57,7 +58,7 @@ const runtime_ambiente_1 = require("./runtime-ambiente");
|
|
|
57
58
|
const slug_1 = require("./slug");
|
|
58
59
|
const util_1 = require("./util");
|
|
59
60
|
const horario_1 = require("./horario");
|
|
60
|
-
const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
|
|
61
|
+
const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : p.runtime === 'grok' ? (0, grok_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
|
|
61
62
|
const sensoresPadrao = {
|
|
62
63
|
runtime: nome => !!(0, runtimes_1.resolverRuntime)(nome).disponivel(),
|
|
63
64
|
sandboxCodex: () => (0, codex_2.sondarSandbox)().ok,
|
|
@@ -125,49 +126,46 @@ function sondasDeAmbiente(raiz, umask = umaskDoProcesso()) {
|
|
|
125
126
|
* com login conferido pelo proprio CLI. A sonda nao marca o store: quem marca e o despacho.
|
|
126
127
|
*/
|
|
127
128
|
function checkDeContas(raiz, runtime, auth = authPadrao) {
|
|
129
|
+
const m = (0, locale_1.msg)().preflight;
|
|
128
130
|
let perfis;
|
|
129
131
|
try {
|
|
130
132
|
perfis = (0, runtime_profiles_1.perfisDoRuntime)((0, runtime_profiles_1.lerPerfisComContas)(raiz), runtime).filter(p => p.estado !== 'desativado');
|
|
131
133
|
}
|
|
132
134
|
catch (e) {
|
|
133
|
-
return { nome: 'contas', nivel: 'fail', detalhe:
|
|
135
|
+
return { nome: 'contas', nivel: 'fail', detalhe: m.storeInvalido(e.message) };
|
|
134
136
|
}
|
|
135
137
|
if (!perfis.length)
|
|
136
|
-
return { nome: 'contas', nivel: 'ok', detalhe:
|
|
138
|
+
return { nome: 'contas', nivel: 'ok', detalhe: m.semPerfil(runtime) };
|
|
137
139
|
const estados = perfis.map(p => {
|
|
138
140
|
const a = auth((0, runtime_profiles_1.perfilDeDespacho)(p));
|
|
139
141
|
return { id: p.id, pronto: a.ok && (0, runtime_profiles_1.perfilDisponivel)(p),
|
|
140
|
-
texto: !a.ok ? `${a.pago ?
|
|
142
|
+
texto: !a.ok ? `${a.pago ? m.estadoConta.providerPago : a.transitorio ? m.estadoConta.loginInconclusivo : m.estadoConta.semLogin} (${a.detalhe})`
|
|
143
|
+
: (0, runtime_profiles_1.perfilDisponivel)(p) ? m.estadoConta.pronto : m.estadoConta.esgotadoAte(p.estado, p.esgotadoAte ?? '') };
|
|
141
144
|
});
|
|
142
145
|
const prontos = estados.filter(e => e.pronto).length;
|
|
143
146
|
return { nome: 'contas', nivel: prontos === 0 ? 'fail' : prontos < estados.length ? 'warn' : 'ok',
|
|
144
|
-
detalhe:
|
|
145
|
-
...(prontos < estados.length ? { correcao:
|
|
147
|
+
detalhe: m.contas(runtime, estados.map(e => `${e.id} ${e.texto}`).join('; ')),
|
|
148
|
+
...(prontos < estados.length ? { correcao: m.contasCorrecao } : {}) };
|
|
146
149
|
}
|
|
147
|
-
const limites = [
|
|
148
|
-
'Sonda contextual local: não inventaria sessões, não inicia modelo e não autoriza despacho.',
|
|
149
|
-
'Aceitação do modelo, instalação do adaptador/MCP, contexto da thread, gates e policies do pedido são revalidados no despacho; com perfis, o login de cada conta é conferido aqui e de novo no despacho.',
|
|
150
|
-
'Trio sem override; um override posterior exige resolver e verificar novamente o despacho.',
|
|
151
|
-
'VERIFY/SHIP MCP exigem executor Codex isolado próprio e transporte SHIP válido; a sonda de despacho não comprova entrega.',
|
|
152
|
-
];
|
|
153
150
|
function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDeProviderAtivos)(), sensores = sensoresPadrao) {
|
|
151
|
+
const t = (0, locale_1.msg)().preflight;
|
|
154
152
|
// I-43: a matriz tem os cinco (para LER thread antiga); quem entra aqui e ESCRITA.
|
|
155
153
|
if (!modos_1.ORDEM_DOS_MODOS.includes(modo))
|
|
156
154
|
throw Error('preflight.mode.invalid');
|
|
157
155
|
const checks = [];
|
|
158
|
-
checks.push({ nome: 'node', nivel: Number(process.versions.node.split('.')[0]) >= 20 ? 'ok' : 'fail', detalhe:
|
|
156
|
+
checks.push({ nome: 'node', nivel: Number(process.versions.node.split('.')[0]) >= 20 ? 'ok' : 'fail', detalhe: t.node });
|
|
159
157
|
const git = !!(0, util_1.noPath)('git');
|
|
160
|
-
checks.push({ nome: 'git', nivel: git ? 'ok' : 'fail', detalhe: git ?
|
|
158
|
+
checks.push({ nome: 'git', nivel: git ? 'ok' : 'fail', detalhe: git ? t.gitOk : t.gitAusente });
|
|
161
159
|
const repo = git ? (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], raiz, 10000) : null;
|
|
162
|
-
checks.push({ nome: 'repositorio', nivel: repo?.ok && repo.stdout.trim() === 'true' ? 'ok' : 'fail', detalhe:
|
|
160
|
+
checks.push({ nome: 'repositorio', nivel: repo?.ok && repo.stdout.trim() === 'true' ? 'ok' : 'fail', detalhe: t.repo });
|
|
163
161
|
checks.push(...sondasDeAmbiente(raiz));
|
|
164
162
|
const carregado = (0, manifest_1.carregarManifesto)(raiz);
|
|
165
163
|
const blocos = [];
|
|
166
|
-
checks.push({ nome: 'manifesto', nivel: !carregado || carregado.erros.length ? 'fail' : 'ok', detalhe: !carregado ?
|
|
164
|
+
checks.push({ nome: 'manifesto', nivel: !carregado || carregado.erros.length ? 'fail' : 'ok', detalhe: !carregado ? t.manifestoAusente : carregado.erros.length ? t.manifestoInvalido : t.manifestoValido });
|
|
167
165
|
if (carregado && !carregado.erros.length) {
|
|
168
166
|
const m = carregado.manifesto;
|
|
169
|
-
checks.push({ nome: 'modo', nivel: m.conduction.allowed_modes.includes(modo) ? 'ok' : 'fail', detalhe:
|
|
170
|
-
checks.push({ nome: 'abbrev', nivel: (0, slug_1.validarAbbrev)(m.project.abbrev).ok ? 'ok' : 'fail', detalhe:
|
|
167
|
+
checks.push({ nome: 'modo', nivel: m.conduction.allowed_modes.includes(modo) ? 'ok' : 'fail', detalhe: t.modo(modo) });
|
|
168
|
+
checks.push({ nome: 'abbrev', nivel: (0, slug_1.validarAbbrev)(m.project.abbrev).ok ? 'ok' : 'fail', detalhe: t.abbrev });
|
|
171
169
|
const setup = (0, setup_1.lerSetup)(carregado.raiz), observados = new Map(), contas = new Map();
|
|
172
170
|
let sandbox;
|
|
173
171
|
for (const [i, bloco] of modos_1.MODOS[modo].blocos.entries()) {
|
|
@@ -176,11 +174,11 @@ function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDePro
|
|
|
176
174
|
try {
|
|
177
175
|
trio = (0, phase_1.resolverDespacho)(m, {}, (0, setup_1.configDoBloco)(setup, modo, bloco.fases[0]));
|
|
178
176
|
(0, runtimes_1.resolverRuntime)(trio.runtime);
|
|
179
|
-
locais.push({ nome: 'trio', nivel: 'ok', detalhe:
|
|
177
|
+
locais.push({ nome: 'trio', nivel: 'ok', detalhe: t.trio });
|
|
180
178
|
if (!observados.has(trio.runtime))
|
|
181
179
|
observados.set(trio.runtime, sensores.runtime(trio.runtime));
|
|
182
180
|
const presente = observados.get(trio.runtime);
|
|
183
|
-
locais.push({ nome: 'runtime', nivel: presente ? 'ok' : 'fail', detalhe: presente ?
|
|
181
|
+
locais.push({ nome: 'runtime', nivel: presente ? 'ok' : 'fail', detalhe: presente ? t.runtimeOk(trio.runtime) : t.runtimeAusente(trio.runtime) });
|
|
184
182
|
if (presente) {
|
|
185
183
|
if (!contas.has(trio.runtime))
|
|
186
184
|
contas.set(trio.runtime, checkDeContas(carregado.raiz, trio.runtime, sensores.auth ?? authPadrao));
|
|
@@ -188,14 +186,15 @@ function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDePro
|
|
|
188
186
|
}
|
|
189
187
|
if (trio.runtime === 'codex' && presente) {
|
|
190
188
|
sandbox ??= sensores.sandboxCodex();
|
|
191
|
-
locais.push({ nome: 'sandbox de despacho', nivel: sandbox ? 'ok' : m.runtime.sandbox === 'danger-full-access' ? 'warn' : 'fail', detalhe: sandbox ?
|
|
189
|
+
locais.push({ nome: 'sandbox de despacho', nivel: sandbox ? 'ok' : m.runtime.sandbox === 'danger-full-access' ? 'warn' : 'fail', detalhe: sandbox ? t.sandboxOk : t.sandboxFalhou });
|
|
192
190
|
}
|
|
193
191
|
const ativos = nomesHerdados.filter(n => runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO.includes(n));
|
|
194
192
|
const relevantes = ativos.filter(n => trio.runtime === 'claude-bg' ? /^(ANTHROPIC_|CLAUDE_CODE_USE_)/.test(n) : /^(OPENAI_|OPENROUTER_)/.test(n));
|
|
195
|
-
locais.push({ nome: 'provider', nivel: m.runtime.provider_policy === 'subscription-only' && relevantes.length ? 'fail' : ativos.length ? 'warn' : 'ok',
|
|
193
|
+
locais.push({ nome: 'provider', nivel: m.runtime.provider_policy === 'subscription-only' && relevantes.length ? 'fail' : ativos.length ? 'warn' : 'ok',
|
|
194
|
+
detalhe: relevantes.length ? t.providerIncompativel(relevantes.join(', ')) : ativos.length ? t.providerAlheio : t.providerNenhum });
|
|
196
195
|
}
|
|
197
196
|
catch {
|
|
198
|
-
locais.push({ nome: 'trio', nivel: 'fail', detalhe:
|
|
197
|
+
locais.push({ nome: 'trio', nivel: 'fail', detalhe: t.trioInvalido });
|
|
199
198
|
}
|
|
200
199
|
blocos.push({ numero: i + 1, fases: [...bloco.fases], trio, checks: locais, pronto: locais.every(c => c.nivel !== 'fail') });
|
|
201
200
|
}
|
|
@@ -204,16 +203,17 @@ function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDePro
|
|
|
204
203
|
return { modo, scope: 'dispatch-local', checks, blocos,
|
|
205
204
|
prontoPrimeiroBloco: basePronta && !!blocos[0]?.pronto,
|
|
206
205
|
prontoTodosBlocos: basePronta && blocos.length > 0 && blocos.every(b => b.pronto),
|
|
207
|
-
entrega: { verificada: false, dependencias: ['executor Codex isolado', 'transporte SHIP instalado', 'gates e HEADs correntes'] }, limites: [...limites] };
|
|
206
|
+
entrega: { verificada: false, dependencias: ['executor Codex isolado', 'transporte SHIP instalado', 'gates e HEADs correntes'] }, limites: [...t.limites] };
|
|
208
207
|
}
|
|
209
208
|
function textoPreflight(r) {
|
|
210
209
|
// I-35: o Check guarda o ISO (dado de maquina); quem imprime para o dono localiza.
|
|
211
210
|
let localizou = false;
|
|
212
211
|
const local = (t) => { const l = (0, horario_1.localizarTexto)(t); if (l !== t)
|
|
213
212
|
localizou = true; return l; };
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
213
|
+
const m = (0, locale_1.msg)().preflight, nome = (v) => m.nomes[v] ?? v;
|
|
214
|
+
const linhas = [m.titulo(r.modo), ...r.checks.map(c => m.check(c.nivel, nome(c.nome), local(c.detalhe))),
|
|
215
|
+
...r.blocos.flatMap(b => [m.bloco(b.numero, b.fases.join('→'), b.trio ? `${b.trio.runtime}/${b.trio.model}/${b.trio.effort}` : null),
|
|
216
|
+
...b.checks.map(c => m.checkDoBloco(c.nivel, nome(c.nome), local(c.detalhe)))]), m.resumo(r.prontoPrimeiroBloco, r.prontoTodosBlocos), ...r.limites];
|
|
217
217
|
// O fuso sai uma vez por mensagem, depois dos limites.
|
|
218
218
|
if (localizou)
|
|
219
219
|
linhas.push((0, horario_1.legendaDoFuso)());
|
package/dist/prompts.js
CHANGED
|
@@ -292,7 +292,7 @@ function lintTemplate(t, contrato) {
|
|
|
292
292
|
*/
|
|
293
293
|
exports.TEMPLATE_FASE_PADRAO = `---
|
|
294
294
|
id: fase-padrao
|
|
295
|
-
versao:
|
|
295
|
+
versao: 5
|
|
296
296
|
descricao: Prompt canonico de uma fase do ciclo GOAL..MASTER, com nomenclatura, modo de conducao, contexto da thread, memoria injetada e regras de evidencia.
|
|
297
297
|
fases: [GOAL, PLAN, GO, CHECK, SHIP, MASTER]
|
|
298
298
|
variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, trabalho, pedido, fecho_go, memoria_injetada, regras_de_evidencia]
|
|
@@ -307,6 +307,7 @@ Quando disponiveis, use ork_artifact_read/write para objetivo, plano e parecer,
|
|
|
307
307
|
Decisao que voce tomar sem perguntar ao dono vai ao ledger por \`ork decisao registrar <thread>\` (no MCP, \`ork_decision_record\`, pois o sandbox do codex nao grava o ledger), com o que foi decidido, o porque, como mudar, o custo de reverter agora e depois, o criterio escrito, quem decidiu e a evidencia; e assim que ela chega ao dono no resumo, em vez de sumir na conversa.
|
|
308
308
|
Artefato de autoria do agente nao e recibo oficial; cadastrar claim nao significa verifica-la.
|
|
309
309
|
Para registrar produto, prefira ork_git_commit com HEAD atual e paths com claims; use ork_verify para verificacao real e ork_ship com HEADs fonte/destino conferidos para entrega. Commit local nao e SHIP; retorno incomplete exige reconciliar estado e remoto antes de repetir. Permissao para consultar nao concede essas operacoes: respeite a autorizacao nativa e os gates.
|
|
310
|
+
Quando o MCP expuser \`ork_verify_status\`, chame \`ork_verify\` uma vez, guarde o \`rodadaId\` e consulte a mesma rodada a cada 30–60 s. Enquanto ela estiver na fila ou rodando, retenha apenas estado e lane atuais no contexto; nao repita o pedido nem copie payloads intermediarios. So avance com o veredito terminal verde; falha tipada ou veredito vermelho bloqueia o ciclo.
|
|
310
311
|
Decisao do dono deve ser apresentada pela sessao condutora ao host; a sessao filha nao responde nem assume a identidade do dono.
|
|
311
312
|
Preserve o perfil filho configurado: \`interactive\` concede consultas; \`worktree\` exige opt-in da instalacao e autoriza ferramentas exatas na WT validada, sem aprovar gates ou assumir o dono. Nao mude configuracao para contornar bloqueio.
|
|
312
313
|
Consulte \`ork_git_status\` para HEADs reais e estado Git; use \`ork_git_commit\`, \`ork_verify\` e \`ork_ship\` pelos contratos do nucleo, sem Bash Git nem inventar SHAs. Use \`source.head\` como \`expectedHead\` do commit; consulte novamente apos commit e use \`source.head\`/\`destination.head\` como \`expectedSource\`/\`expectedDestination\` do SHIP. Base historica nao substitui a consulta atual. As regras Edit/deny sao permissoes nativas de ferramentas, nao sandbox de processos.
|
|
@@ -351,7 +352,7 @@ Falha de autenticação permanece impedimento; não troque provider, sandbox ou
|
|
|
351
352
|
/** English counterpart of the canonical phase prompt. The pt-BR template above remains the source contract. */
|
|
352
353
|
exports.TEMPLATE_FASE_PADRAO_EN = `---
|
|
353
354
|
id: fase-padrao.en
|
|
354
|
-
versao:
|
|
355
|
+
versao: 5
|
|
355
356
|
descricao: Canonical prompt for a GOAL..MASTER cycle phase, with naming, conduction mode, thread context, injected memory, and evidence rules.
|
|
356
357
|
fases: [GOAL, PLAN, GO, CHECK, SHIP, MASTER]
|
|
357
358
|
variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, trabalho, pedido, fecho_go, memoria_injetada, regras_de_evidencia]
|
|
@@ -366,6 +367,7 @@ When available, use ork_artifact_read/write for the goal, plan, and review, and
|
|
|
366
367
|
Record every decision you make without asking the owner in the ledger with \`ork decisao registrar <thread>\` (or \`ork_decision_record\` in MCP because the Codex sandbox cannot write the ledger), including what was decided, why, how to change it, reversal cost now and later, the written criterion, who decided, and the evidence. This is how it reaches the owner in the summary instead of disappearing in the conversation.
|
|
367
368
|
An agent-authored artifact is not an official receipt; registering a claim does not verify it.
|
|
368
369
|
To record product changes, prefer ork_git_commit with the current HEAD and paths with claims; use ork_verify for real verification and ork_ship with checked source/destination HEADs for delivery. A local commit is not SHIP; an incomplete result requires reconciling state and remote before retrying. Permission to query does not grant those operations: respect native authorization and gates.
|
|
370
|
+
When MCP exposes \`ork_verify_status\`, call \`ork_verify\` once, keep its \`rodadaId\`, and query that same round every 30–60 seconds. While queued or running, retain only the current state and lane in context; do not repeat the request or copy intermediate payloads. Continue only after a terminal green verdict; a typed failure or red verdict blocks the cycle.
|
|
369
371
|
The conducting session presents an owner decision to the host; a child session neither answers nor assumes the owner's identity.
|
|
370
372
|
Preserve the configured child profile: \`interactive\` grants queries; \`worktree\` requires installation opt-in and authorizes exact tools in the validated worktree, without approving gates or assuming the owner. Do not change configuration to bypass a block.
|
|
371
373
|
Query \`ork_git_status\` for real HEADs and Git state; use \`ork_git_commit\`, \`ork_verify\`, and \`ork_ship\` through the core contracts, without Bash Git or invented SHAs. Use \`source.head\` as the commit \`expectedHead\`; query again after the commit and use \`source.head\`/\`destination.head\` as SHIP \`expectedSource\`/\`expectedDestination\`. A historical base does not replace the current query. Edit/deny rules are native tool permissions, not process sandbox rules.
|
package/dist/pulse.js
CHANGED
|
@@ -157,7 +157,8 @@ function comporPulse(carregado, entrada) {
|
|
|
157
157
|
if (p.motivo === 'human.pending' && p.fonte === 'ledger' && entregas?.doCondutor.gates.has(`${l.thread}|${p.fase}`))
|
|
158
158
|
continue;
|
|
159
159
|
if (ehRegistro(l.thread)) {
|
|
160
|
-
if (p.fonte === 'escalonador' || ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'vaga.stale',
|
|
160
|
+
if (p.fonte === 'escalonador' || ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'vaga.stale',
|
|
161
|
+
'runtime.silencio', 'concurrency.lease-indeterminado', 'conducao.acao-necessaria'].includes(p.motivo))
|
|
161
162
|
continue;
|
|
162
163
|
const sessoes = radar.sessoes.filter(s => s.thread?.id === l.thread && s.thread.fase === p.fase);
|
|
163
164
|
// Escalada explícita de ledger não é apagada pela conclusão de uma sessão.
|
|
@@ -213,7 +214,8 @@ function comporPulse(carregado, entrada) {
|
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
216
|
// I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
|
|
216
|
-
const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'
|
|
217
|
+
const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale',
|
|
218
|
+
'concurrency.lease-indeterminado', 'conducao.acao-necessaria'].includes(p.motivo);
|
|
217
219
|
(esperaAutomatica ? automaticas : humanos).push(item);
|
|
218
220
|
}
|
|
219
221
|
// RM-063 (F5): o MASTER por omissao da varredura nao vira item do dono (I-45: a entrega sem nota fica na faixa
|
package/dist/ratelimit.js
CHANGED
|
@@ -142,6 +142,7 @@ function enfileirar(carregado, novo, agoraMs = Date.now()) {
|
|
|
142
142
|
detalhe: novo.detalhe,
|
|
143
143
|
...(novo.runtime !== undefined ? { runtime: novo.runtime } : {}),
|
|
144
144
|
...(novo.perfil !== undefined ? { perfil: novo.perfil } : {}),
|
|
145
|
+
...(novo.perfilPedido ? { perfilPedido: novo.perfilPedido } : {}),
|
|
145
146
|
...(novo.motivo !== undefined ? { motivo: novo.motivo } : {}),
|
|
146
147
|
...(novo.correlacao ? { correlacao: novo.correlacao } : {}),
|
|
147
148
|
};
|
package/dist/rede.js
CHANGED
|
@@ -73,7 +73,7 @@ exports.painelDaRede = painelDaRede;
|
|
|
73
73
|
* fora de qualquer clone de projeto.
|
|
74
74
|
*
|
|
75
75
|
* D3: publicar exige o repositorio privado, conferido na forja antes de cada publicacao.
|
|
76
|
-
* D5: o retrato e uma LISTA DE PERMISSAO (maquina,
|
|
76
|
+
* D5: o retrato e uma LISTA DE PERMISSAO (maquina, alias legado, forjas, runtimes, hosts, projetos,
|
|
77
77
|
* versao do `ork`, batida) e passa por uma varredura de segredo antes do push: um achado recusa a
|
|
78
78
|
* publicacao inteira, e o erro diz o padrao e o campo, nunca o valor.
|
|
79
79
|
* D6: cada maquina so escreve o proprio retrato; o `REDE.md` e indice derivado que quem publica
|
|
@@ -191,6 +191,17 @@ function hostnameSeguro() {
|
|
|
191
191
|
const bruto = os.hostname().trim();
|
|
192
192
|
return /^[A-Za-z0-9][A-Za-z0-9._-]{0,252}$/.test(bruto) ? bruto : bruto.replace(/[^A-Za-z0-9._-]+/g, '-').slice(0, 253) || 'desconhecido';
|
|
193
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* RM-062 F3: o nome que sai da maquina precisa ter sido escolhido localmente. O fallback historico
|
|
196
|
+
* para `os.hostname()` transformava um detalhe privado em nome de arquivo e em JSON. A configuracao
|
|
197
|
+
* fica em `~/.orkastery/maquina.json`; `--maquina` e `ORK_MAQUINA` cobrem a primeira entrada.
|
|
198
|
+
*/
|
|
199
|
+
function nomeGenericoDaRede(explicito) {
|
|
200
|
+
const nome = (explicito ?? '').trim() || (0, maquina_1.lerConfigDaMaquina)()?.nome || (process.env.ORK_MAQUINA ?? '').trim();
|
|
201
|
+
if (!nome)
|
|
202
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.nomeGenericoAusente);
|
|
203
|
+
return nomeSeguro(nome);
|
|
204
|
+
}
|
|
194
205
|
/** O retrato desta maquina, montado so com os campos da lista de permissao (D5). */
|
|
195
206
|
function retratoDaMaquina(opcoes = {}) {
|
|
196
207
|
return retratoComDescartes(opcoes).retrato;
|
|
@@ -199,7 +210,7 @@ function retratoDaMaquina(opcoes = {}) {
|
|
|
199
210
|
* O retrato e os projetos que ficaram fora dele. Projeto vem de fora do nucleo (o registro da
|
|
200
211
|
* RM-052, o cwd, o ultimo retrato): um valor dele com cara de segredo tira SO aquele projeto, com
|
|
201
212
|
* aviso, em vez de travar a publicacao da maquina para sempre (A1 do CHECK 1). O que o nucleo monta
|
|
202
|
-
* (maquina,
|
|
213
|
+
* (maquina, alias legado, forjas, runtimes, hosts) continua falhando fechado em `exigirRetratoSeguro`.
|
|
203
214
|
*/
|
|
204
215
|
function retratoComDescartes(opcoes = {}) {
|
|
205
216
|
const amb = opcoes.amb ?? {};
|
|
@@ -248,11 +259,12 @@ function retratoComDescartes(opcoes = {}) {
|
|
|
248
259
|
descartados.push({ campo: `projetos[${exports.MAXIMO_DE_ITENS}..]`, padrao: `limite de ${exports.MAXIMO_DE_ITENS} projetos` });
|
|
249
260
|
limpos.length = exports.MAXIMO_DE_ITENS;
|
|
250
261
|
}
|
|
262
|
+
const maquina = nomeGenericoDaRede(opcoes.maquina);
|
|
251
263
|
const retrato = {
|
|
252
264
|
contrato: exports.CONTRATO_DO_RETRATO,
|
|
253
|
-
maquina
|
|
265
|
+
maquina,
|
|
254
266
|
...(opcoes.id ? { id: opcoes.id } : {}),
|
|
255
|
-
hostname:
|
|
267
|
+
hostname: maquina,
|
|
256
268
|
adesao: opcoes.adesao ?? (0, rede_adesao_1.adesaoDaRede)().adesao ?? 'rede',
|
|
257
269
|
forjas: identidades.map((i) => ({ forja: i.forja, host: i.host, cli: i.cli, versao: i.versao, usuario: i.usuario })),
|
|
258
270
|
runtimes,
|
|
@@ -785,10 +797,9 @@ function gravarNaCasa(conferida, retrato, descartados, opcoes) {
|
|
|
785
797
|
const idDoOutro = atual ? atual.id ?? null : idNoArquivo(cache, ponta, arquivoDoRetrato(maquina));
|
|
786
798
|
const alheio = !!idDoOutro && idDoOutro !== retrato.id;
|
|
787
799
|
if (alheio && !opcoes.tomarNome) {
|
|
788
|
-
//
|
|
789
|
-
const mesmoHostname = atual?.hostname === hostnameSeguro();
|
|
800
|
+
// O campo legado `hostname` agora repete o alias generico e nao distingue instalacoes.
|
|
790
801
|
const outro = atual ? { hostname: atual.hostname, publicadoEm: atual.publicadoEm } : null;
|
|
791
|
-
throw new locale_1.ErroDoCatalogo((m) => m.network.nomeEmUso(maquina, outro ? m.network.quemHostname(String(outro.hostname), (0, horario_1.formatarDataHora)(outro.publicadoEm)) : m.network.quemIlegivel,
|
|
802
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.nomeEmUso(maquina, outro ? m.network.quemHostname(String(outro.hostname), (0, horario_1.formatarDataHora)(outro.publicadoEm)) : m.network.quemIlegivel, m.network.dicaNomeEmUso));
|
|
792
803
|
}
|
|
793
804
|
const mudancas = [
|
|
794
805
|
{ caminho: arquivoDoRetrato(maquina), conteudo: JSON.stringify(retrato, null, 2) + '\n' },
|
|
@@ -819,7 +830,7 @@ function publicarRede(opcoes = {}) {
|
|
|
819
830
|
if (!adesao.membro)
|
|
820
831
|
throw new locale_1.ErroDoCatalogo((m) => m.network.foraDaRede);
|
|
821
832
|
const amb = opcoes.amb ?? {};
|
|
822
|
-
const maquina =
|
|
833
|
+
const maquina = nomeGenericoDaRede(opcoes.maquina);
|
|
823
834
|
const id = (0, rede_adesao_1.idDaMaquina)();
|
|
824
835
|
const agora = opcoes.agora ?? new Date().toISOString();
|
|
825
836
|
const marca = lerMarcaDaRede();
|
|
@@ -860,12 +871,13 @@ const NOME_DE_MAQUINA = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
|
860
871
|
* `ork network entrar`. M2 do CHECK 1: atomico do ponto de vista da maquina. Confere (e cria,
|
|
861
872
|
* privada) a casa, publica o primeiro retrato e SO ENTAO grava o nome e a adesao; se a publicacao
|
|
862
873
|
* falha, nada muda aqui. M3: o nome que vale e gravado, como no `ork fabrica entrar`: `--maquina`,
|
|
863
|
-
* senao o ja gravado, senao `ORK_MAQUINA
|
|
874
|
+
* senao o ja gravado, senao `ORK_MAQUINA`; assim o cron publica com o mesmo nome. RM-062 F3:
|
|
875
|
+
* hostname nunca e fallback, porque nome de arquivo e JSON sao evidencia publicada.
|
|
864
876
|
*/
|
|
865
877
|
function entrarNaRede(opcoes = {}) {
|
|
866
|
-
// O nome explicito tem de ser valido; o que vem do arquivo
|
|
878
|
+
// O nome explicito tem de ser valido; o que vem do arquivo ou de ORK_MAQUINA e saneado.
|
|
867
879
|
const explicito = (opcoes.maquina ?? '').trim();
|
|
868
|
-
const maquina = explicito ||
|
|
880
|
+
const maquina = explicito || nomeGenericoDaRede();
|
|
869
881
|
if (!NOME_DE_MAQUINA.test(maquina)) {
|
|
870
882
|
throw new locale_1.ErroDoCatalogo((m) => m.network.nomeInvalido(maquina));
|
|
871
883
|
}
|
|
@@ -896,7 +908,7 @@ function entrarNaRede(opcoes = {}) {
|
|
|
896
908
|
function sairDaRede(opcoes = {}) {
|
|
897
909
|
// U3 da revisao 3: a saida local vem primeiro; nada depois dela pode deixar a maquina membro.
|
|
898
910
|
(0, rede_adesao_1.gravarConfigDaRede)({ membro: false });
|
|
899
|
-
const maquina =
|
|
911
|
+
const maquina = nomeGenericoDaRede(opcoes.maquina);
|
|
900
912
|
const r = resolverCasa(opcoes);
|
|
901
913
|
if (r.casa)
|
|
902
914
|
(0, rede_adesao_1.gravarConfigDaRede)({ forja: r.casa.forja, host: r.casa.host, dono: r.casa.dono, repositorio: r.casa.repositorio });
|
package/dist/retry.js
CHANGED
|
@@ -99,6 +99,7 @@ const slug_1 = require("./slug");
|
|
|
99
99
|
const policies_1 = require("./policies");
|
|
100
100
|
const ratelimit_1 = require("./ratelimit");
|
|
101
101
|
const session_watcher_claude_1 = require("./session-watcher-claude");
|
|
102
|
+
const session_watcher_grok_1 = require("./session-watcher-grok");
|
|
102
103
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
103
104
|
const modos_1 = require("./modos");
|
|
104
105
|
const thread_1 = require("./thread");
|
|
@@ -287,6 +288,12 @@ exports.POLITICA_DE_RETRY = {
|
|
|
287
288
|
automatica: true,
|
|
288
289
|
...TEXTOS_DA_POLITICA['lease.busy'],
|
|
289
290
|
},
|
|
291
|
+
'concurrency.lease-indeterminado': {
|
|
292
|
+
motivo: 'concurrency.lease-indeterminado',
|
|
293
|
+
acao: 'esperar-janela',
|
|
294
|
+
automatica: false,
|
|
295
|
+
...TEXTOS_DA_POLITICA['concurrency.lease-indeterminado'],
|
|
296
|
+
},
|
|
290
297
|
// I-36 (T6): a vez chega quando a conducao atual terminar. Redespachar agora so recebe a mesma recusa,
|
|
291
298
|
// e passar na frente de quem conduz e exatamente o incidente de 19/09/2026.
|
|
292
299
|
'conducao.em-andamento': {
|
|
@@ -295,6 +302,12 @@ exports.POLITICA_DE_RETRY = {
|
|
|
295
302
|
automatica: true,
|
|
296
303
|
...TEXTOS_DA_POLITICA['conducao.em-andamento'],
|
|
297
304
|
},
|
|
305
|
+
'conducao.acao-necessaria': {
|
|
306
|
+
motivo: 'conducao.acao-necessaria',
|
|
307
|
+
acao: 'esperar-janela',
|
|
308
|
+
automatica: false,
|
|
309
|
+
...TEXTOS_DA_POLITICA['conducao.acao-necessaria'],
|
|
310
|
+
},
|
|
298
311
|
// I-41 (D10): formato e defeito de quem escreveu o pedido, e a spec dirigida conserta.
|
|
299
312
|
// Escalar isto para o dono seria pedir que ele revise a sintaxe do robo.
|
|
300
313
|
'hitl.formato': {
|
|
@@ -660,6 +673,7 @@ tomadaPrevia) {
|
|
|
660
673
|
slug,
|
|
661
674
|
origem: opcoes.origem ?? 'retry',
|
|
662
675
|
evidencia: `prompt sha256 ${promptExecutadoSha} (origem ${sha}; retomada recusada antes de despachar)`,
|
|
676
|
+
...(opcoes.perfilPedido ? { perfilPedido: opcoes.perfilPedido } : {}),
|
|
663
677
|
});
|
|
664
678
|
return { ...vazio, ok: false, motivo, detalhe, dryRun: opcoes.dryRun === true };
|
|
665
679
|
}
|
|
@@ -749,6 +763,14 @@ tomadaPrevia) {
|
|
|
749
763
|
}
|
|
750
764
|
catch (e) {
|
|
751
765
|
const erro = e.message;
|
|
766
|
+
if (!opcoes.dryRun && opcoes.perfilPedido)
|
|
767
|
+
(0, gates_1.registrarGateBloqueado)((0, thread_1.dirThread)(raiz, thread.id), thread.id, {
|
|
768
|
+
gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
|
|
769
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.perfilPedidoRecusado(opcoes.perfilPedido.id, opcoes.perfilPedido.runtime, 'runtime.unavailable', erro)),
|
|
770
|
+
correcao: (0, locale_1.textoDoCatalogo)((m) => m.retry.correcaoDoPerfilPedido(opcoes.perfilPedido.id, opcoes.perfilPedido.runtime, 'runtime.unavailable', thread.id)),
|
|
771
|
+
fase, slug, origem: opcoes.origem ?? 'retry', promptPath: promptExecutadoPath,
|
|
772
|
+
promptSha256: promptExecutadoSha, perfilPedido: opcoes.perfilPedido,
|
|
773
|
+
});
|
|
752
774
|
return { ...vazio, ok: false, motivo: 'runtime.unavailable',
|
|
753
775
|
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeIndisponivel(erro)), dryRun: opcoes.dryRun === true };
|
|
754
776
|
}
|
|
@@ -766,12 +788,23 @@ tomadaPrevia) {
|
|
|
766
788
|
if (escolha.erro) {
|
|
767
789
|
const motivo = escolha.motivo ?? 'runtime.unavailable';
|
|
768
790
|
const prazo = motivo === 'runtime.quota-exhausted' ? (0, runtime_profiles_1.prazoDoRuntime)((0, runtime_profiles_1.lerPerfisComContas)(raiz), runtime, (0, runtime_profiles_1.politicaDeRotacao)(manifesto)) : null;
|
|
769
|
-
|
|
791
|
+
const detalhe = opcoes.perfilPedido
|
|
792
|
+
? (0, locale_1.textoDoCatalogo)((m) => m.retry.perfilPedidoRecusado(opcoes.perfilPedido.id, opcoes.perfilPedido.runtime, motivo, escolha.erro))
|
|
793
|
+
: `${motivo}: ${escolha.erro}`;
|
|
794
|
+
if (!opcoes.dryRun && opcoes.perfilPedido)
|
|
795
|
+
(0, gates_1.registrarGateBloqueado)((0, thread_1.dirThread)(raiz, thread.id), thread.id, {
|
|
796
|
+
gate: 'phase.dispatch', motivo, modo: thread.modo, detalhe,
|
|
797
|
+
correcao: (0, locale_1.textoDoCatalogo)((m) => m.retry.correcaoDoPerfilPedido(opcoes.perfilPedido.id, opcoes.perfilPedido.runtime, motivo, thread.id)), fase, slug, origem: opcoes.origem ?? 'retry',
|
|
798
|
+
promptPath: promptExecutadoPath, promptSha256: promptExecutadoSha, perfilPedido: opcoes.perfilPedido,
|
|
799
|
+
});
|
|
800
|
+
return { ...vazio, ok: false, motivo, detalhe, dryRun: opcoes.dryRun === true,
|
|
770
801
|
sinal: prazo ? { resetEm: prazo, fonte: 'iso', trecho: `menor esgotadoAte dos perfis ${runtime}` } : null };
|
|
771
802
|
}
|
|
772
803
|
const perfil = escolha.perfil ?? undefined;
|
|
773
|
-
// I-33 (N1): o HEAD do GO codex sai antes do despacho, como no `ork phase run`.
|
|
774
|
-
const headNoDespacho = fase === 'GO' && runtime === 'codex' && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
|
|
804
|
+
// I-33 (N1): o HEAD do GO codex sai antes do despacho, como no `ork phase run`. RM-067: o grok tambem.
|
|
805
|
+
const headNoDespacho = fase === 'GO' && (runtime === 'codex' || runtime === 'grok') && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
|
|
806
|
+
// RM-067 (D8): a base do artefato do grok tambem sai antes do redespacho, como no `ork phase run`.
|
|
807
|
+
const artefatoNoDespacho = runtime === 'grok' && !opcoes.dryRun ? (0, session_watcher_grok_1.baseDoArtefato)(raiz, thread.id, fase) : undefined;
|
|
775
808
|
const resultado = rt.despachar({
|
|
776
809
|
prompt,
|
|
777
810
|
nome: slug,
|
|
@@ -785,7 +818,8 @@ tomadaPrevia) {
|
|
|
785
818
|
...(perfil ? { perfil } : {}),
|
|
786
819
|
// RM-037 (defeito 2): o modo plano segue a mesma regra do `ork phase run`, pelo bloco.
|
|
787
820
|
contextoRuntime,
|
|
788
|
-
|
|
821
|
+
// RM-067 (GO-FIX 1, A3): o grok tambem; no PLAN que fecha o bloco, ele roda em read-only.
|
|
822
|
+
...((runtime === 'claude-bg' || runtime === 'grok') && (0, phase_1.modoDaSessaoDoBloco)(thread, fase).plano ? { colaboracao: 'plan' } : {}),
|
|
789
823
|
// I-36 (D4): a sessao retomada herda a identidade do despacho e o canal, como no `ork phase run`.
|
|
790
824
|
ambienteExtra: (0, conducao_1.ambienteDaConducao)(identidade.dispatchId, thread.id, canal),
|
|
791
825
|
});
|
|
@@ -812,7 +846,7 @@ tomadaPrevia) {
|
|
|
812
846
|
...(retomada ? { promptOriginalPath: absoluto, promptOriginalSha256: sha } : {}),
|
|
813
847
|
controlador: resultado.controlador, model, effort,
|
|
814
848
|
erro: resultado.erro ?? 'runtime.unavailable: sem sessionId', stderr: (resultado.stderr ?? '').slice(0, 500),
|
|
815
|
-
origem: 'retry', ...(perfil ? { perfil } : {}), ...daSessao });
|
|
849
|
+
origem: 'retry', ...(perfil ? { perfil } : {}), ...(opcoes.perfilPedido ? { perfilPedido: opcoes.perfilPedido } : {}), ...daSessao });
|
|
816
850
|
const sinal = resultado.rateLimit ?? null;
|
|
817
851
|
// RM-055: o redespacho recusado pelo que so o dono resolve reabre a pausa dele, com o mesmo comando.
|
|
818
852
|
const impedimento = !resultado.falhaDeConta && !sinal
|
|
@@ -865,9 +899,13 @@ tomadaPrevia) {
|
|
|
865
899
|
effort,
|
|
866
900
|
origem: opcoes.origem ?? 'retry',
|
|
867
901
|
...(perfil ? { perfil } : {}),
|
|
902
|
+
...(opcoes.perfilPedido ? { perfilPedido: opcoes.perfilPedido } : {}),
|
|
868
903
|
...(headNoDespacho !== undefined ? { headNoDespacho } : {}),
|
|
904
|
+
...(artefatoNoDespacho !== undefined ? { artefatoNoDespacho } : {}),
|
|
869
905
|
};
|
|
870
|
-
(
|
|
906
|
+
// RM-067 (D14 da ork-grokbuild): o redespacho do grok leva os sensores do supervisor ao registro do watcher; o caminho
|
|
907
|
+
// do codex e do claude-bg segue sem eles, como antes.
|
|
908
|
+
(0, phase_1.concluirDespacho)(ctx, resultado.sessionId, resultado.verificada, resultado.comando, rt.fonteVerificacao, resultado.controlador, runtime === 'grok' ? { logPath: resultado.logPath, processoPath: resultado.processoPath, reciboPath: resultado.reciboPath } : undefined);
|
|
871
909
|
return {
|
|
872
910
|
ok: true,
|
|
873
911
|
slug,
|
|
@@ -1014,6 +1052,7 @@ function retomarPedido(carregado, pedidoOriginal, opcoes = {}) {
|
|
|
1014
1052
|
slug,
|
|
1015
1053
|
runtime: alvo.runtime,
|
|
1016
1054
|
perfil: alvo.perfil ?? doPedido.perfil ?? null,
|
|
1055
|
+
...(doPedido.perfilPedido ? { perfilPedido: doPedido.perfilPedido } : {}),
|
|
1017
1056
|
model: alvo.model,
|
|
1018
1057
|
effort: alvo.effort,
|
|
1019
1058
|
cwd: pedido.cwd,
|
|
@@ -1124,6 +1163,9 @@ function retomarPedido(carregado, pedidoOriginal, opcoes = {}) {
|
|
|
1124
1163
|
function alvoDaRetomada(carregado, thread, pedido) {
|
|
1125
1164
|
const { raiz, manifesto } = carregado;
|
|
1126
1165
|
const original = { runtime: pedido.runtime ?? null, model: pedido.model, effort: pedido.effort };
|
|
1166
|
+
if (pedido.perfilPedido)
|
|
1167
|
+
return { runtime: pedido.perfilPedido.runtime, perfil: pedido.perfilPedido.id,
|
|
1168
|
+
model: pedido.model, effort: pedido.effort, destino: true, runtimes: [pedido.perfilPedido.runtime], contas: false };
|
|
1127
1169
|
if (pedido.motivo !== 'runtime.quota-exhausted' && pedido.motivo !== 'runtime.auth-missing')
|
|
1128
1170
|
return { ...original, destino: true, runtimes: original.runtime ? [original.runtime] : [], contas: false };
|
|
1129
1171
|
const doBloco = (0, setup_1.configDoBloco)((0, setup_1.lerSetup)(raiz), thread.modo, pedido.fase);
|
|
@@ -1131,7 +1173,8 @@ function alvoDaRetomada(carregado, thread, pedido) {
|
|
|
1131
1173
|
const candidatos = [{ runtime: principal, model: pedido.model, effort: pedido.effort },
|
|
1132
1174
|
...alvosDeFallback(doBloco, doBloco?.runtime ?? manifesto.runtime.adapter).filter(f => f.runtime !== principal)
|
|
1133
1175
|
.map(f => ({ runtime: f.runtime, model: f.model, effort: f.effort ?? pedido.effort }))]
|
|
1134
|
-
|
|
1176
|
+
// RM-067 (F4): a troca de conta do runtime principal vale tambem para o runtime sem host MCP (o grok).
|
|
1177
|
+
.filter(c => (0, runtime_context_1.capacidadeDaRotacao)(raiz, c.runtime, c.runtime === principal).capaz);
|
|
1135
1178
|
const runtimes = candidatos.map(c => c.runtime);
|
|
1136
1179
|
const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz), politica = (0, runtime_profiles_1.politicaDeRotacao)(manifesto);
|
|
1137
1180
|
for (const c of candidatos) {
|
|
@@ -1192,7 +1235,7 @@ function alvosDeFallback(bloco, principal) {
|
|
|
1192
1235
|
function proximoAlvo(raiz, atual, fallback, excluir, politica, agoraMs = Date.now()) {
|
|
1193
1236
|
const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz, agoraMs);
|
|
1194
1237
|
const perfis = [...excluir.perfis, ...(atual.perfil ? [atual.perfil.id] : [])];
|
|
1195
|
-
const mesmo = (0, runtime_context_1.
|
|
1238
|
+
const mesmo = (0, runtime_context_1.capacidadeDaRotacao)(raiz, atual.runtime, true).capaz
|
|
1196
1239
|
? (0, runtime_profiles_1.proximoPerfilDisponivel)(store, atual.runtime, politica, { excluir: perfis, agoraMs }) : null;
|
|
1197
1240
|
if (mesmo)
|
|
1198
1241
|
return { runtime: atual.runtime, perfil: (0, runtime_profiles_1.perfilDeDespacho)(mesmo), model: null, effort: null };
|
|
@@ -1268,6 +1311,41 @@ function despachoDaFalha(eventos, gate, fase) {
|
|
|
1268
1311
|
function perfilDoEvento(e) {
|
|
1269
1312
|
return e && e.perfil !== undefined && e.perfil !== null ? (0, runtime_profiles_1.validarPerfilDeDespacho)(e.perfil) : null;
|
|
1270
1313
|
}
|
|
1314
|
+
/** O marcador distinto do destino efetivo: ausente em despacho sem `--perfil` e em rotacao interna. */
|
|
1315
|
+
function perfilPedidoDoEvento(e) {
|
|
1316
|
+
if (!e || e.perfilPedido === undefined || e.perfilPedido === null)
|
|
1317
|
+
return null;
|
|
1318
|
+
if (typeof e.perfilPedido !== 'object' || Array.isArray(e.perfilPedido))
|
|
1319
|
+
return null;
|
|
1320
|
+
const p = e.perfilPedido;
|
|
1321
|
+
if (typeof p.runtime !== 'string' || p.runtime.length === 0 || p.runtime.length > 64)
|
|
1322
|
+
return null;
|
|
1323
|
+
try {
|
|
1324
|
+
return { id: (0, runtime_profiles_1.validarIdDePerfil)(p.id), runtime: p.runtime };
|
|
1325
|
+
}
|
|
1326
|
+
catch {
|
|
1327
|
+
return null;
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
/** Recupera o pedido do mesmo prompt; eventos antigos sem o campo preservam o comportamento anterior. */
|
|
1331
|
+
function perfilPedidoDoDespacho(eventos, fase, despacho, gate) {
|
|
1332
|
+
for (const e of [gate, despacho]) {
|
|
1333
|
+
const p = perfilPedidoDoEvento(e);
|
|
1334
|
+
if (p)
|
|
1335
|
+
return p;
|
|
1336
|
+
}
|
|
1337
|
+
const sha = typeof despacho?.promptSha256 === 'string' ? despacho.promptSha256
|
|
1338
|
+
: typeof gate?.promptSha256 === 'string' ? gate.promptSha256 : null;
|
|
1339
|
+
for (let i = eventos.length - 1; i >= 0; i--) {
|
|
1340
|
+
const e = eventos[i];
|
|
1341
|
+
if (e.fase !== fase || (sha !== null && e.promptSha256 !== sha))
|
|
1342
|
+
continue;
|
|
1343
|
+
const p = perfilPedidoDoEvento(e);
|
|
1344
|
+
if (p)
|
|
1345
|
+
return p;
|
|
1346
|
+
}
|
|
1347
|
+
return null;
|
|
1348
|
+
}
|
|
1271
1349
|
/** O perfil ja esta fora do rodizio por esta falha (cota com prazo futuro, ou sem login)? */
|
|
1272
1350
|
function jaMarcado(raiz, perfil, falha, agoraMs = Date.now()) {
|
|
1273
1351
|
let atual;
|
|
@@ -1476,7 +1554,29 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1476
1554
|
registrarTentativa(rodada.correcoes.length > 0, detalhe);
|
|
1477
1555
|
return { ...vazio, executada: rodada.correcoes.length > 0, rodada, reverify, detalhe };
|
|
1478
1556
|
}
|
|
1557
|
+
const redespacharNoPerfilPedido = (falho, pedido) => {
|
|
1558
|
+
const r = redespachar(carregado, thread, plano.fase, String(falho.promptPath), String(falho.promptSha256), {
|
|
1559
|
+
runtime: pedido.runtime,
|
|
1560
|
+
perfil: pedido.id,
|
|
1561
|
+
perfilPedido: pedido,
|
|
1562
|
+
model: typeof falho.model === 'string' ? falho.model : null,
|
|
1563
|
+
effort: plano.effort ?? (typeof falho.effort === 'string' ? falho.effort : null),
|
|
1564
|
+
origem: 'retry.run',
|
|
1565
|
+
dryRun: opcoes.dryRun,
|
|
1566
|
+
});
|
|
1567
|
+
registrarTentativa(r.ok, r.detalhe, { perfilPedido: pedido, ...(!r.ok ? { conta: false } : {}) });
|
|
1568
|
+
return { ...vazio, executada: r.ok, redespacho: r, detalhe: r.detalhe };
|
|
1569
|
+
};
|
|
1479
1570
|
if (plano.motivo === 'runtime.quota-exhausted' || plano.motivo === 'runtime.auth-missing') {
|
|
1571
|
+
const eventos = (0, ledger_1.lerLedger)(dir);
|
|
1572
|
+
const gate = ultimaReprovacao(raiz, threadId);
|
|
1573
|
+
const falho = despachoParaRedespachar(eventos, plano.fase, gate);
|
|
1574
|
+
const pedido = perfilPedidoDoDespacho(eventos, plano.fase, falho, gate);
|
|
1575
|
+
// Falha observada na propria conta continua na rotacao I-33 D5/RM-064 T3. A indisponibilidade
|
|
1576
|
+
// detectada antes de abrir a conta preserva o pedido do dono e nunca escolhe outra em silencio.
|
|
1577
|
+
if (pedido && gate?.falhaDeConta === undefined && falho && typeof falho.promptPath === 'string' &&
|
|
1578
|
+
typeof falho.promptSha256 === 'string')
|
|
1579
|
+
return redespacharNoPerfilPedido(falho, pedido);
|
|
1480
1580
|
return rotacionarConta(carregado, thread, plano, opcoes, vazio, registrarTentativa);
|
|
1481
1581
|
}
|
|
1482
1582
|
if (plano.motivo === 'runtime.model-unavailable') {
|
|
@@ -1493,6 +1593,7 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1493
1593
|
registrarTentativa(false, detalhe);
|
|
1494
1594
|
return { ...vazio, detalhe };
|
|
1495
1595
|
}
|
|
1596
|
+
const perfilPedidoDoRetry = perfilPedidoDoDespacho((0, ledger_1.lerLedger)(dir), plano.fase, falho, gateDoPlano);
|
|
1496
1597
|
// RM-055: o impedimento do dono com prova local (confianca do diretorio) so volta ao runtime depois de
|
|
1497
1598
|
// resolvido. Sem a prova, nada e despachado e a tentativa nao conta: a pausa do dono continua aberta.
|
|
1498
1599
|
if (plano.motivo && (0, impedimento_1.ehImpedimentoDoDono)(plano.motivo) && typeof falho.cwd === 'string') {
|
|
@@ -1523,6 +1624,7 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1523
1624
|
}
|
|
1524
1625
|
// O destino de origem e o do pedido novo que abriu o episodio; o despacho do gate completa o que faltar.
|
|
1525
1626
|
const origem = (0, runtime_escada_1.destinoDoEpisodio)((0, ledger_1.lerLedger)(dir), plano.fase);
|
|
1627
|
+
const perfilPedido = perfilPedidoDoDespacho((0, ledger_1.lerLedger)(dir), plano.fase, falho, gateDoPlano);
|
|
1526
1628
|
const sha = falho.promptSha256;
|
|
1527
1629
|
// GO-FIX (achado 10): o caminho do ledger e relativo a quem despachou; o absoluto e o que o dono roda de qualquer lugar.
|
|
1528
1630
|
const promptPath = localizarPromptGravado(raiz, threadId, falho.promptPath, sha) ?? falho.promptPath;
|
|
@@ -1552,6 +1654,8 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1552
1654
|
}
|
|
1553
1655
|
return { ...vazio, detalhe };
|
|
1554
1656
|
}
|
|
1657
|
+
if (perfilPedido)
|
|
1658
|
+
return redespacharNoPerfilPedido(falho, perfilPedido);
|
|
1555
1659
|
const saida = (0, runtime_escada_1.subirAEscada)({
|
|
1556
1660
|
carregado, thread, fase: plano.fase, despacho,
|
|
1557
1661
|
tentativas: plano.tentativas, limite: plano.limite, dryRun: opcoes.dryRun, daemon: opcoes.daemon, daemonJaReerguido,
|
|
@@ -1572,8 +1676,9 @@ function executarRetry(carregado, threadId, opcoes = {}) {
|
|
|
1572
1676
|
}
|
|
1573
1677
|
const redespacho = redespachar(carregado, thread, plano.fase, falho.promptPath, falho.promptSha256, {
|
|
1574
1678
|
effort: plano.effort,
|
|
1575
|
-
runtime: typeof falho.runtime === 'string' ? falho.runtime : null,
|
|
1679
|
+
runtime: perfilPedidoDoRetry?.runtime ?? (typeof falho.runtime === 'string' ? falho.runtime : null),
|
|
1576
1680
|
model: typeof falho.model === 'string' ? falho.model : null,
|
|
1681
|
+
...(perfilPedidoDoRetry ? { perfil: perfilPedidoDoRetry.id, perfilPedido: perfilPedidoDoRetry } : {}),
|
|
1577
1682
|
origem: 'retry.run',
|
|
1578
1683
|
dryRun: opcoes.dryRun,
|
|
1579
1684
|
});
|
|
@@ -1772,7 +1877,7 @@ function destinosQueRecusaramOModelo(eventos, fase) {
|
|
|
1772
1877
|
*/
|
|
1773
1878
|
function proximoDestinoDoModelo(raiz, runtime, model, fallback, recusados) {
|
|
1774
1879
|
const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz);
|
|
1775
|
-
const mesmo = (0, runtime_context_1.
|
|
1880
|
+
const mesmo = (0, runtime_context_1.capacidadeDaRotacao)(raiz, runtime, true).capaz
|
|
1776
1881
|
? (0, runtime_profiles_1.perfisDisponiveis)(store, runtime).find(p => !recusados.has(chaveDoModelo(runtime, p.id, model))) : null;
|
|
1777
1882
|
if (mesmo)
|
|
1778
1883
|
return { runtime, perfil: (0, runtime_profiles_1.perfilDeDespacho)(mesmo), model, effort: null };
|