@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/pulse.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.JANELA_DAS_DECISOES_MS = exports.CONTRATO_PULSE = void 0;
|
|
|
4
4
|
exports.apresentacaoCurtaDoItem = apresentacaoCurtaDoItem;
|
|
5
5
|
exports.comporPulse = comporPulse;
|
|
6
6
|
exports.montarPulse = montarPulse;
|
|
7
|
+
exports.filaDoDono = filaDoDono;
|
|
7
8
|
exports.textoDoPulse = textoDoPulse;
|
|
8
9
|
const escopo_escrita_1 = require("./escopo-escrita");
|
|
9
10
|
/** D4: uma fila para quem precisa de humano, com fontes e espera observada. */
|
|
@@ -13,12 +14,14 @@ const liveness_1 = require("./liveness");
|
|
|
13
14
|
const master_1 = require("./master");
|
|
14
15
|
const master_batch_1 = require("./master-batch");
|
|
15
16
|
const orquestracao_1 = require("./orquestracao");
|
|
17
|
+
const impedimento_1 = require("./impedimento");
|
|
16
18
|
const thread_1 = require("./thread");
|
|
17
19
|
const sessoes_adopt_1 = require("./sessoes-adopt");
|
|
18
20
|
const ledger_1 = require("./ledger");
|
|
19
21
|
const types_1 = require("./types");
|
|
20
22
|
const util_1 = require("./util");
|
|
21
23
|
const horario_1 = require("./horario");
|
|
24
|
+
const locale_1 = require("./locale");
|
|
22
25
|
const hitl_presentation_1 = require("./hitl-presentation");
|
|
23
26
|
const hitl_contract_1 = require("./hitl-contract");
|
|
24
27
|
const hitl_curto_1 = require("./hitl-curto");
|
|
@@ -27,6 +30,7 @@ const docs_1 = require("./docs");
|
|
|
27
30
|
const conducao_1 = require("./conducao");
|
|
28
31
|
const conducao_texto_1 = require("./conducao-texto");
|
|
29
32
|
const hitl_resumo_1 = require("./hitl-resumo");
|
|
33
|
+
const hitl_tempo_parado_1 = require("./hitl-tempo-parado");
|
|
30
34
|
const parado_no_condutor_1 = require("./parado-no-condutor");
|
|
31
35
|
exports.CONTRATO_PULSE = 'ork.pulse/v1';
|
|
32
36
|
/** Uma semana: o resumo cita a decisao uma vez, e ela continua lida ate sair da janela. */
|
|
@@ -169,6 +173,20 @@ function comporPulse(carregado, entrada) {
|
|
|
169
173
|
thread: l.thread, fase: p.fase, sessionId: null, desdeEm: p.desdeEm, paradaHaMin: p.paradaHaMin, impacto: impacto(p.fase),
|
|
170
174
|
pergunta: p.detalhe, opcoes: [], recomendacao: p.correcao, comandoResposta: p.correcao, evidencia: [p.evidencia],
|
|
171
175
|
fontes: ['monitor'], contextoLogs: [] };
|
|
176
|
+
// RM-055: o impedimento do despacho sai no contrato curto, com o comando exato e o re-despacho depois.
|
|
177
|
+
if (p.impedimento) {
|
|
178
|
+
item.impedimento = { motivo: p.motivo, comando: p.impedimento.comando, retry: `ork retry run ${l.thread}` };
|
|
179
|
+
try {
|
|
180
|
+
const curto = (0, impedimento_1.pedidoCurtoDoImpedimento)({ thread: l.thread, fase: p.fase, motivo: p.motivo, detalhe: p.detalhe,
|
|
181
|
+
desdeEm: p.desdeEm, impedimento: p.impedimento }, quando);
|
|
182
|
+
item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
|
|
183
|
+
item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
|
|
184
|
+
item.comandoResposta = item.impedimento.retry;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
172
190
|
// I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
|
|
173
191
|
const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
|
|
174
192
|
(esperaAutomatica ? automaticas : humanos).push(item);
|
|
@@ -195,7 +213,7 @@ function comporPulse(carregado, entrada) {
|
|
|
195
213
|
continue;
|
|
196
214
|
const item = { id: `orfa:${o.thread}:${o.fase}:${o.sessionId}`, classe: o.classe, motivo: o.motivo,
|
|
197
215
|
thread: o.thread, fase: o.fase, sessionId: o.sessionId, desdeEm: o.desdeEm, paradaHaMin: minutos(o.desdeEm, quando),
|
|
198
|
-
impacto: impacto(o.fase), pergunta:
|
|
216
|
+
impacto: impacto(o.fase), pergunta: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semHeartbeat(o.fase, o.ultimoHeartbeatEm)),
|
|
199
217
|
opcoes: [], recomendacao: o.retry.razao,
|
|
200
218
|
comandoResposta: o.retry.automatica ? `ork retry run ${o.thread} --motivo runtime.silencio --fase ${o.fase}` :
|
|
201
219
|
`ork retry plan ${o.thread} --motivo runtime.silencio --fase ${o.fase}`,
|
|
@@ -246,11 +264,12 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
246
264
|
const diagnosticos = [];
|
|
247
265
|
const quando = opcoes.quando ?? (0, util_1.agora)();
|
|
248
266
|
const consulta = opcoes.consulta ?? (opcoes.semRuntime
|
|
249
|
-
? { ok: false, sessoes: [], detalhe:
|
|
267
|
+
? { ok: false, sessoes: [], detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semRuntime) } : (0, claude_bg_1.consultarSessoes)(undefined, true));
|
|
250
268
|
const estados = consulta.ok ? new Map(consulta.sessoes.map(s => [s.sessionId ?? '', (0, hitl_1.estadoBruto)(s)])) : null;
|
|
251
269
|
const radar = (0, hitl_1.varrerSessoes)({ raiz: carregado.raiz, consulta, agora: quando, registrar: opcoes.registrar, escopo: opcoes.escopo, linhasLogs: opcoes.linhasLogs });
|
|
252
|
-
|
|
253
|
-
|
|
270
|
+
const telasAdiadas = radar.telasAdiadas;
|
|
271
|
+
if (telasAdiadas)
|
|
272
|
+
diagnosticos.push((0, locale_1.textoDoCatalogo)((m) => m.pulse.telasAdiadas(telasAdiadas)));
|
|
254
273
|
// Falha de observação não prova silêncio: Claude indisponível preserva sua guarda de HITL e Codex mantém sua coleta independente.
|
|
255
274
|
const orfas = (0, liveness_1.detectarFasesOrfas)(carregado, { quando, registrar: opcoes.registrar, escopo: opcoes.escopo, diagnosticos,
|
|
256
275
|
fontes: opcoes.fontes, estados: estados ?? undefined, runtimes: consulta.ok ? undefined : ['codex'] });
|
|
@@ -269,24 +288,41 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
269
288
|
// retrato que o status do roadmap le sem rede. Falha de leitura e diagnostico, nunca "sem PR".
|
|
270
289
|
let entregas;
|
|
271
290
|
try {
|
|
272
|
-
entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: (candidatas) => {
|
|
291
|
+
entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
|
|
273
292
|
const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas });
|
|
274
293
|
if (leitura.ok) {
|
|
275
294
|
try {
|
|
276
295
|
(0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
|
|
277
296
|
}
|
|
278
297
|
catch { /* o retrato e economia do status */ }
|
|
298
|
+
try {
|
|
299
|
+
(0, parado_no_condutor_1.esquecerForjaSemLeitura)(carregado.raiz);
|
|
300
|
+
}
|
|
301
|
+
catch { /* sem a marca, a proxima perda de leitura e dita de novo */ }
|
|
279
302
|
}
|
|
280
303
|
return leitura;
|
|
281
304
|
} });
|
|
282
|
-
|
|
283
|
-
|
|
305
|
+
const leitura = entregas.prs;
|
|
306
|
+
if (leitura && !leitura.ok && leitura.semLeitura) {
|
|
307
|
+
// RM-037 (fatia 5, A5): a forja sem leitura de PR e dita uma vez por remoto e host; as batidas seguintes nao repetem.
|
|
308
|
+
let novidade = true;
|
|
309
|
+
try {
|
|
310
|
+
novidade = (0, parado_no_condutor_1.avisarForjaSemLeitura)(carregado.raiz, leitura.semLeitura, leitura.erro, quando);
|
|
311
|
+
}
|
|
312
|
+
catch { /* sem marca, diz de novo */ }
|
|
313
|
+
if (novidade)
|
|
314
|
+
diagnosticos.push(`prs.sem-leitura: ${leitura.erro.slice(0, 160)}`);
|
|
315
|
+
}
|
|
316
|
+
else if (leitura && !leitura.ok)
|
|
317
|
+
diagnosticos.push(`prs.nao-lidos: ${leitura.erro.slice(0, 160)}`);
|
|
284
318
|
}
|
|
285
319
|
catch (e) {
|
|
286
320
|
diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
|
|
287
321
|
}
|
|
288
322
|
const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}) });
|
|
289
|
-
|
|
323
|
+
// RM-061 (F2b, G2): a linha de conducao e da familia `thread` e segue o locale ativo; o JSON a guarda em pt-BR.
|
|
324
|
+
const conducoes = monitor.linhas.filter((l) => l.conducao)
|
|
325
|
+
.map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
|
|
290
326
|
if (conducoes.length > 0)
|
|
291
327
|
pulse.conducoes = conducoes;
|
|
292
328
|
// B4: a metade que presta contas. Leitura pura; falhar aqui nunca derruba a fila de atencao.
|
|
@@ -298,36 +334,79 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
298
334
|
catch (e) {
|
|
299
335
|
diagnosticos.push(`decisoes.indisponiveis: ${e.message.slice(0, 120)}`);
|
|
300
336
|
}
|
|
337
|
+
// RM-057 (fatia 3): leitura pura do ledger; falhar aqui nunca derruba a fila de atencao.
|
|
338
|
+
try {
|
|
339
|
+
const hitl = (0, hitl_tempo_parado_1.lerHitlDeConducaoAgora)(carregado.raiz, quando);
|
|
340
|
+
if (hitl.abertas.length || hitl.seteDias.pedidos || hitl.seteDias.respondidos)
|
|
341
|
+
pulse.hitlDeConducao = hitl;
|
|
342
|
+
}
|
|
343
|
+
catch (e) {
|
|
344
|
+
diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
|
|
345
|
+
}
|
|
301
346
|
if (diagnosticos.length)
|
|
302
347
|
pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
|
|
303
348
|
return pulse;
|
|
304
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* RM-063 (F2): a fila do dono que o `ork roadmap status` le, a MESMA do `ork pulse` (`precisaDeHumanoAgora`). Em 12/10/2026
|
|
352
|
+
* o status disse "Nada agora" com o pulse contando 3: as duas superficies montavam a fila cada uma do seu jeito. Sem
|
|
353
|
+
* forja e sem registrar; o texto de cada item sai numa linha, redigido.
|
|
354
|
+
*/
|
|
355
|
+
function filaDoDono(carregado, opcoes = {}) {
|
|
356
|
+
const linha = (texto, teto) => {
|
|
357
|
+
const limpo = (0, hitl_1.redigirSegredos)(texto).replace(/[\p{Cc}\s]+/gu, ' ').trim();
|
|
358
|
+
return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
|
|
359
|
+
};
|
|
360
|
+
try {
|
|
361
|
+
const p = montarPulse(carregado, { quando: opcoes.quando, semForja: true });
|
|
362
|
+
// Sem o `claude` nesta maquina nao ha sessao dele a perder: a fila do monitor e do ledger esta inteira.
|
|
363
|
+
const lida = p.runtime.ok || !(0, util_1.noPath)('claude');
|
|
364
|
+
return { lida, detalhe: lida ? null : linha(p.runtime.detalhe, 160),
|
|
365
|
+
itens: p.precisaDeHumanoAgora.map(i => ({ id: i.id, thread: i.thread, sessionId: i.sessionId, fase: i.fase, classe: i.classe,
|
|
366
|
+
motivo: i.motivo, pergunta: linha(i.pergunta || i.motivo, 200), comando: linha(i.comandoResposta, 160), paradaHaMin: i.paradaHaMin })) };
|
|
367
|
+
}
|
|
368
|
+
catch (e) {
|
|
369
|
+
return { lida: false, detalhe: linha(e.message, 160), itens: [] };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
305
372
|
function textoDoPulse(p) {
|
|
373
|
+
const m = (0, locale_1.msg)().pulse;
|
|
306
374
|
// I-35: o pulse guarda ISO; o texto ao dono sai no fuso dele, rotulado no cabeçalho.
|
|
307
|
-
|
|
308
|
-
const
|
|
375
|
+
// RM-061 (F2b, G2): o que o pulse montou pelo catalogo sai remontado; o resto (pedido HITL, ledger) como veio.
|
|
376
|
+
const local = (texto) => (0, horario_1.localizarTexto)((0, locale_1.remontar)(texto), { agora: p.consultadoEm });
|
|
377
|
+
// O detalhe do runtime junta partes separadas por "; ": cada uma e remontada.
|
|
378
|
+
const detalhe = (texto) => (0, horario_1.localizarTexto)(texto.split('; ').map(locale_1.remontar).join('; '), { agora: p.consultadoEm });
|
|
379
|
+
const linhas = [m.cabecalho(p.contrato, (0, horario_1.formatarDataHoraRotulada)(p.consultadoEm, { agora: p.consultadoEm })), m.precisaDeHumano(p.resumo.humanos), m.semNota(p.resumo.scores)];
|
|
309
380
|
// RM-037 (fatia 4): PR nao lido tambem e dito, para a falta de linha do condutor nao parecer "nada parado".
|
|
310
|
-
if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
|
|
311
|
-
linhas.push(
|
|
381
|
+
if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'prs.sem-leitura', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
|
|
382
|
+
linhas.push(m.diagnostico(detalhe(p.runtime.detalhe)));
|
|
312
383
|
}
|
|
313
384
|
if (!p.runtime.ok)
|
|
314
|
-
linhas.push(
|
|
385
|
+
linhas.push(m.consultaIncompleta(detalhe(p.runtime.detalhe)));
|
|
315
386
|
for (const i of p.precisaDeHumanoAgora) {
|
|
316
|
-
linhas.push('',
|
|
387
|
+
linhas.push('', m.item(String(i.thread ?? i.sessionId), m.classe(i.classe), i.paradaHaMin == null ? m.desconhecido : i.paradaHaMin < 1 ? m.menosDeUm : String(i.paradaHaMin)), local(i.pergunta), ...i.opcoes.map(o => m.opcao((0, locale_1.remontar)(o))), m.recomendacao((0, locale_1.remontar)(i.recomendacao)), m.responder((0, locale_1.remontar)(i.comandoResposta)), ...i.contextoLogs.map(l => m.log(l)));
|
|
317
388
|
}
|
|
318
389
|
if (p.conducoes?.length) {
|
|
319
|
-
linhas.push('',
|
|
390
|
+
linhas.push('', m.conduzidas(p.conducoes.length));
|
|
320
391
|
for (const c of p.conducoes)
|
|
321
|
-
linhas.push(
|
|
392
|
+
linhas.push(m.conducao(c.thread, (0, locale_1.remontar)(c.linha)));
|
|
322
393
|
}
|
|
323
394
|
// RM-037 (fatia 4): o que espera o condutor, uma linha por thread; nao e pergunta ao dono.
|
|
324
395
|
if (p.paradoNoCondutor?.length) {
|
|
325
|
-
linhas.push('',
|
|
396
|
+
linhas.push('', m.paradoNoCondutor(p.paradoNoCondutor.length));
|
|
326
397
|
for (const x of p.paradoNoCondutor)
|
|
327
398
|
linhas.push((0, hitl_resumo_1.linhaDoParadoNoCondutor)(x, { agora: p.consultadoEm }));
|
|
328
399
|
}
|
|
329
|
-
|
|
400
|
+
// RM-057 (fatia 3): quanto tempo cada pergunta de conducao aberta ja parou a thread, e a mediana da semana.
|
|
401
|
+
if (p.hitlDeConducao) {
|
|
402
|
+
const h = p.hitlDeConducao;
|
|
403
|
+
linhas.push('', m.hitlDeConducao(h.abertas.length, (0, hitl_tempo_parado_1.textoDaMediana)(h)));
|
|
404
|
+
for (const a of h.abertas)
|
|
405
|
+
linhas.push((0, hitl_tempo_parado_1.linhaDaPerguntaParada)(a, { agora: p.consultadoEm }));
|
|
406
|
+
}
|
|
407
|
+
linhas.push('', m.automaticas(p.resumo.automaticas));
|
|
408
|
+
// RM-061 (F2b, D4): o item do radar sem tipo de HITL usa a classe como motivo; ela sai pelo id, o motivo tipado fica.
|
|
330
409
|
for (const i of p.acoesAutomaticas)
|
|
331
|
-
linhas.push(
|
|
410
|
+
linhas.push(m.automatica(String(i.thread), i.motivo === i.classe ? m.classe(i.motivo) : i.motivo, (0, locale_1.remontar)(i.comandoResposta)));
|
|
332
411
|
return linhas.join('\n');
|
|
333
412
|
}
|
package/dist/ratelimit.js
CHANGED
|
@@ -61,6 +61,7 @@ exports.lerFilaDeRetomada = lerFilaDeRetomada;
|
|
|
61
61
|
exports.janelaPadraoMs = janelaPadraoMs;
|
|
62
62
|
exports.enfileirar = enfileirar;
|
|
63
63
|
exports.prazoDaConta = prazoDaConta;
|
|
64
|
+
exports.prazoDaCotaVista = prazoDaCotaVista;
|
|
64
65
|
exports.marcarContaDaFalha = marcarContaDaFalha;
|
|
65
66
|
exports.gravarPedido = gravarPedido;
|
|
66
67
|
exports.exigirPedido = exigirPedido;
|
|
@@ -72,6 +73,7 @@ const path = __importStar(require("node:path"));
|
|
|
72
73
|
const manifest_1 = require("./manifest");
|
|
73
74
|
const util_1 = require("./util");
|
|
74
75
|
const horario_1 = require("./horario");
|
|
76
|
+
const locale_1 = require("./locale");
|
|
75
77
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
76
78
|
var claude_bg_1 = require("./adapters/claude-bg");
|
|
77
79
|
Object.defineProperty(exports, "parseRateLimit", { enumerable: true, get: function () { return claude_bg_1.parseRateLimit; } });
|
|
@@ -151,15 +153,30 @@ function prazoDaConta(manifesto, falha, agoraMs = Date.now()) {
|
|
|
151
153
|
return falha.resetEm;
|
|
152
154
|
return new Date(agoraMs + janelaPadraoMs(manifesto)).toISOString();
|
|
153
155
|
}
|
|
154
|
-
/**
|
|
155
|
-
|
|
156
|
+
/**
|
|
157
|
+
* RM-037 (fatia 5): ate quando a conta sai do rodizio pela cota que o observador viu na transcricao, com a
|
|
158
|
+
* sessao viva. Vale a hora dita (ja ancorada no instante da mensagem) ou a janela padrao contada da mensagem,
|
|
159
|
+
* nunca do relogio de quem leu. Prazo que ja venceu volta `null`: a conta ja voltou, e marcar agora tiraria do
|
|
160
|
+
* rodizio uma conta boa (a regra A10 do despacho recusado nao vale aqui, porque ninguem acabou de recusar nada).
|
|
161
|
+
*/
|
|
162
|
+
function prazoDaCotaVista(manifesto, falha, mensagemMs, agoraMs = Date.now()) {
|
|
163
|
+
if (falha.motivo !== 'runtime.quota-exhausted' || !Number.isFinite(mensagemMs))
|
|
164
|
+
return null;
|
|
165
|
+
const prazo = falha.resetEm ?? new Date(mensagemMs + janelaPadraoMs(manifesto)).toISOString();
|
|
166
|
+
return Date.parse(prazo) > agoraMs ? prazo : null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Marca no store o perfil que falhou pela conta. Sem perfil (ambiente do processo), nada a marcar. `prazo`,
|
|
170
|
+
* quando vem, e o ja calculado por quem viu a falha (`prazoDaCotaVista`); sem ele, vale `prazoDaConta`.
|
|
171
|
+
*/
|
|
172
|
+
function marcarContaDaFalha(carregado, perfil, falha, agoraMs = Date.now(), prazo) {
|
|
156
173
|
// RM-037 (defeitosdeco D-6): modelo inacessivel nao e falha da conta inteira; o perfil fica no rodizio.
|
|
157
174
|
if (!perfil || falha.motivo === 'runtime.model-unavailable')
|
|
158
175
|
return null;
|
|
159
176
|
const esgotado = falha.motivo === 'runtime.quota-exhausted';
|
|
160
177
|
return (0, runtime_profiles_1.marcarFalhaDePerfil)(carregado.raiz, perfil.id, { estado: esgotado ? 'esgotado' : 'sem-auth',
|
|
161
|
-
esgotadoAte: prazoDaConta(carregado.manifesto, falha, agoraMs), motivo: falha.motivo,
|
|
162
|
-
em: new Date(agoraMs).toISOString() });
|
|
178
|
+
esgotadoAte: esgotado && prazo ? prazo : prazoDaConta(carregado.manifesto, falha, agoraMs), motivo: falha.motivo,
|
|
179
|
+
detalhe: falha.trecho, em: new Date(agoraMs).toISOString() });
|
|
163
180
|
}
|
|
164
181
|
/** Regrava um pedido (append-only: a versao nova vence, o historico fica). */
|
|
165
182
|
function gravarPedido(raiz, pedido) {
|
|
@@ -188,10 +205,11 @@ function vencidos(raiz, quando = (0, util_1.agora)()) {
|
|
|
188
205
|
/** Quanto falta para a janela de um pedido, em texto curto para o CLI. */
|
|
189
206
|
function faltaPara(pedido, quando = (0, util_1.agora)()) {
|
|
190
207
|
const ms = new Date(pedido.liberaEm).getTime() - new Date(quando).getTime();
|
|
208
|
+
const m = (0, locale_1.msg)().horario;
|
|
191
209
|
if (ms <= 0)
|
|
192
|
-
return
|
|
210
|
+
return m.jaLiberou;
|
|
193
211
|
const min = Math.ceil(ms / 60000);
|
|
194
|
-
return min < 60 ?
|
|
212
|
+
return min < 60 ? m.emMinutos(min) : m.emHoras(Math.floor(min / 60), String(min % 60).padStart(2, '0'));
|
|
195
213
|
}
|
|
196
214
|
/** Tabela de `ork retry list`. */
|
|
197
215
|
function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
|
package/dist/recall.js
CHANGED
|
@@ -257,7 +257,9 @@ function recallDaThread(carregado, memoria, threadId, opcoes = {}) {
|
|
|
257
257
|
falhas.push({ id: 'memoria-busca', titulo: 'Descoberta de handoffs da fase', location: '',
|
|
258
258
|
orkmind: null, retrieve_when: fase, resolvido: false, motivo: 'orkmind-indisponivel', via: null,
|
|
259
259
|
conteudo: '', metodo: '', sha256: '', intervalo: null,
|
|
260
|
-
|
|
260
|
+
// RM-038: a janela cheia do export tem codigo proprio; o resto segue como falha de transporte.
|
|
261
|
+
detalhe: `${memoria.leituraRestrita ? falhaDeConsulta(erro) : erro instanceof Error && erro.message === 'memory.query.window-saturated'
|
|
262
|
+
? erro.message : 'memory.transport.export'}: busca semantica falhou; resultado nao comprova colecao vazia` });
|
|
261
263
|
}
|
|
262
264
|
}
|
|
263
265
|
if (opcoes.id !== undefined && resolvidos.length === 0 && falhas.length === 0 && adiados.length === 0) {
|
package/dist/redacao-saida.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LIMITE_DE_TESTES = exports.LIMITE_DO_TRECHO = void 0;
|
|
4
4
|
exports.redigirSaida = redigirSaida;
|
|
5
5
|
exports.testesQueCairam = testesQueCairam;
|
|
6
|
+
exports.falhasDeTeste = falhasDeTeste;
|
|
6
7
|
/**
|
|
7
8
|
* I-37 (D9): a saida de um comando que falhou, pronta para ir ao ledger.
|
|
8
9
|
*
|
|
@@ -41,5 +42,67 @@ function testesQueCairam(saida) {
|
|
|
41
42
|
if (nomes.length === exports.LIMITE_DE_TESTES)
|
|
42
43
|
break;
|
|
43
44
|
}
|
|
45
|
+
// RM-037 (fatia 6): o reporter `spec`, o padrao do `node --test` 24 fora de TTY, nao imprime `not ok`;
|
|
46
|
+
// os nomes moram na secao "failing tests" do fim da saida.
|
|
47
|
+
if (nomes.length === 0)
|
|
48
|
+
return falhasDeTeste(saida).map((f) => f.nome).slice(0, exports.LIMITE_DE_TESTES);
|
|
44
49
|
return nomes;
|
|
45
50
|
}
|
|
51
|
+
/** As frases do `node --test` para a falha que e do relogio, e nao da asercao. */
|
|
52
|
+
const ASSINATURA_DE_RELOGIO = /test timed out after \d+ms|test did not finish before its parent and was cancelled/;
|
|
53
|
+
const TIPO_DE_RELOGIO = /failureType:\s*'(?:testTimeoutFailure|cancelledByParent)'/;
|
|
54
|
+
/** O teste que so agrega os filhos (subtestes ou arquivo) nao e uma falha por si. */
|
|
55
|
+
const TIPO_DE_AGREGADO = /failureType:\s*'subtestsFailed'/;
|
|
56
|
+
/**
|
|
57
|
+
* RM-037 (fatia 6): os testes reprovados, folha a folha, com a natureza da falha, para o verify saber
|
|
58
|
+
* se a reprovacao e so de relogio. Le o TAP do `node --test` (o bloco YAML depois do `not ok`, pulando
|
|
59
|
+
* o agregado `subtestsFailed`) e a secao "failing tests" do reporter `spec`. Outros runners (jest,
|
|
60
|
+
* vitest) nao dizem a natureza: os nomes saem com `relogio: false`, e nada e atenuado.
|
|
61
|
+
*/
|
|
62
|
+
function falhasDeTeste(saida) {
|
|
63
|
+
const linhas = saida.split('\n');
|
|
64
|
+
const falhas = [];
|
|
65
|
+
const somar = (nome, relogio) => {
|
|
66
|
+
const limpo = nome.trim().slice(0, LIMITE_DO_NOME);
|
|
67
|
+
if (!limpo)
|
|
68
|
+
return;
|
|
69
|
+
const ja = falhas.find((f) => f.nome === limpo);
|
|
70
|
+
if (ja)
|
|
71
|
+
ja.relogio = ja.relogio && relogio;
|
|
72
|
+
else
|
|
73
|
+
falhas.push({ nome: limpo, relogio });
|
|
74
|
+
};
|
|
75
|
+
for (let i = 0; i < linhas.length; i++) {
|
|
76
|
+
const tap = /^\s*not ok \d+ - (.+?)\s*(?:#.*)?$/.exec(linhas[i]);
|
|
77
|
+
if (!tap)
|
|
78
|
+
continue;
|
|
79
|
+
const bloco = [];
|
|
80
|
+
for (let j = i + 1; j < linhas.length && !/^\s*(?:not )?ok \d+ /.test(linhas[j]); j++)
|
|
81
|
+
bloco.push(linhas[j]);
|
|
82
|
+
const texto = bloco.join('\n');
|
|
83
|
+
if (TIPO_DE_AGREGADO.test(texto))
|
|
84
|
+
continue;
|
|
85
|
+
somar(tap[1], TIPO_DE_RELOGIO.test(texto) || ASSINATURA_DE_RELOGIO.test(texto));
|
|
86
|
+
}
|
|
87
|
+
const inicio = linhas.findIndex((l) => /^\s*✖ failing tests:\s*$/.test(l));
|
|
88
|
+
if (inicio >= 0) {
|
|
89
|
+
for (let i = inicio + 1; i < linhas.length; i++) {
|
|
90
|
+
const cabeca = /^✖ (.+?)(?: \([\d.]+m?s\))?\s*$/.exec(linhas[i]);
|
|
91
|
+
if (!cabeca)
|
|
92
|
+
continue;
|
|
93
|
+
const corpo = [];
|
|
94
|
+
for (let j = i + 1; j < linhas.length && !/^(?:✖ |test at )/.test(linhas[j]); j++)
|
|
95
|
+
corpo.push(linhas[j]);
|
|
96
|
+
const primeira = corpo.find((l) => l.trim() !== '') ?? '';
|
|
97
|
+
somar(cabeca[1], ASSINATURA_DE_RELOGIO.test(primeira));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (falhas.length === 0) {
|
|
101
|
+
for (const linha of linhas) {
|
|
102
|
+
const fail = /^\s*(?:FAIL|✕|×)\s+(\S.*?)\s*$/.exec(linha);
|
|
103
|
+
if (fail)
|
|
104
|
+
somar(fail[1], false);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return falhas;
|
|
108
|
+
}
|