@orkastery/cli 0.5.6 → 0.6.1
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/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +37 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
- package/adapters/openclaw/README.md +81 -9
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -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/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +123 -80
- package/dist/handoff.js +23 -13
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +51 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +196 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +10 -5
- package/references/security-checklist.md +3 -3
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEGRAUS_DA_ESCADA = void 0;
|
|
4
|
+
exports.inicioDoEpisodio = inicioDoEpisodio;
|
|
5
|
+
exports.destinoDoEpisodio = destinoDoEpisodio;
|
|
6
|
+
exports.estadoDaEscada = estadoDaEscada;
|
|
7
|
+
exports.planoDoDegrau = planoDoDegrau;
|
|
8
|
+
exports.reerguerDaemon = reerguerDaemon;
|
|
9
|
+
exports.falhaDoDestino = falhaDoDestino;
|
|
10
|
+
exports.subirAEscada = subirAEscada;
|
|
11
|
+
exports.resumoDosDegraus = resumoDosDegraus;
|
|
12
|
+
exports.comandoDeConferir = comandoDeConferir;
|
|
13
|
+
exports.comandoDeRetomar = comandoDeRetomar;
|
|
14
|
+
exports.alternativasDaEscada = alternativasDaEscada;
|
|
15
|
+
exports.escalarEscada = escalarEscada;
|
|
16
|
+
exports.escadaDoEvento = escadaDoEvento;
|
|
17
|
+
exports.pedidoCurtoDaEscada = pedidoCurtoDaEscada;
|
|
18
|
+
/**
|
|
19
|
+
* RM-063 (F4): a escada de recuperacao do runtime.
|
|
20
|
+
*
|
|
21
|
+
* Incidente de 12/10/2026 (P2 e P3 da pagina da RM-063): o despacho do GO da K7 morreu com o daemon do claude-bg
|
|
22
|
+
* (`cc-daemon`) fora do ar, e o retry so sabia repetir o MESMO destino. A fabrica ficou parada 318 min ate o dono
|
|
23
|
+
* perceber. Agora `runtime.unavailable` sobe uma escada, sempre com o MESMO prompt e o MESMO sha256:
|
|
24
|
+
*
|
|
25
|
+
* 1. reerguer o daemon do runtime: no claude-bg, o `claude daemon status` diz se o `control.sock` responde; daemon
|
|
26
|
+
* de pe com o socket mudo e derrubado (`claude daemon stop --any --keep-workers`, as sessoes destacadas ficam), e
|
|
27
|
+
* o proximo `claude --bg` sobe outro sob demanda. O prompt volta ao mesmo destino (runtime, perfil, modelo e
|
|
28
|
+
* esforco do despacho que falhou);
|
|
29
|
+
* 2. o fallback do bloco (I-33): o primeiro alvo da ordem `--fallback` com destino disponivel;
|
|
30
|
+
* 3. outro perfil do mesmo runtime (RM-056): outra conta, outro daemon.
|
|
31
|
+
*
|
|
32
|
+
* Cada degrau vai ao ledger da thread (`runtime_recuperacao`), feito, pulado ou falho, com o destino e a prova. A
|
|
33
|
+
* escada vale por episodio: recomeca a cada pedido novo da fase (`ork phase run`, que grava `phase_prompt_recorded`
|
|
34
|
+
* com origem `phase.run`). So depois dos tres degraus o dono e chamado, com tres alternativas e uma recomendada no
|
|
35
|
+
* contrato curto da RM-048/RM-057 (`ork.hitl-curto/v1`), e o comando que retoma com o mesmo prompt.
|
|
36
|
+
*
|
|
37
|
+
* O `redespachar` e injetado por quem chama (o `ork retry run`): este modulo nao importa o retry, so o tipo.
|
|
38
|
+
*/
|
|
39
|
+
const claude_bg_1 = require("./adapters/claude-bg");
|
|
40
|
+
const gates_1 = require("./gates");
|
|
41
|
+
const hitl_curto_1 = require("./hitl-curto");
|
|
42
|
+
const ledger_1 = require("./ledger");
|
|
43
|
+
const locale_1 = require("./locale");
|
|
44
|
+
const modos_1 = require("./modos");
|
|
45
|
+
const runtime_profiles_1 = require("./runtime-profiles");
|
|
46
|
+
const setup_1 = require("./setup");
|
|
47
|
+
const runtimes_1 = require("./runtimes");
|
|
48
|
+
const runtime_context_1 = require("./runtime-context");
|
|
49
|
+
const thread_1 = require("./thread");
|
|
50
|
+
/** Os degraus, na ordem do pedido do dono de 12/10/2026. */
|
|
51
|
+
exports.DEGRAUS_DA_ESCADA = ['reerguer-daemon', 'fallback-do-bloco', 'outro-perfil'];
|
|
52
|
+
const TIPOS_DO_PEDIDO_NOVO = [ledger_1.TIPOS_DE_EVENTO.promptGravado, ledger_1.TIPOS_DE_EVENTO.faseDespachada,
|
|
53
|
+
ledger_1.TIPOS_DE_EVENTO.despachoFalhou];
|
|
54
|
+
const doPedidoNovo = (e, fase) => e.fase === fase && e.origem === 'phase.run' && TIPOS_DO_PEDIDO_NOVO.includes(e.tipo);
|
|
55
|
+
/**
|
|
56
|
+
* O indice do pedido novo da fase que abre o episodio da escada: o ultimo pedido do `ork phase run` (o redespacho do
|
|
57
|
+
* retry tem origem `retry.*` e continua o mesmo episodio), a partir do `phase_prompt_recorded` dele quando ha. `-1`
|
|
58
|
+
* sem nenhum.
|
|
59
|
+
*/
|
|
60
|
+
function inicioDoEpisodio(eventos, fase) {
|
|
61
|
+
let ultimo = -1;
|
|
62
|
+
for (let i = eventos.length - 1; i >= 0 && ultimo < 0; i--)
|
|
63
|
+
if (doPedidoNovo(eventos[i], fase))
|
|
64
|
+
ultimo = i;
|
|
65
|
+
if (ultimo < 0)
|
|
66
|
+
return -1;
|
|
67
|
+
const sha = eventos[ultimo].promptSha256;
|
|
68
|
+
for (let i = ultimo; i >= 0; i--) {
|
|
69
|
+
const e = eventos[i];
|
|
70
|
+
if (!doPedidoNovo(e, fase))
|
|
71
|
+
continue;
|
|
72
|
+
if (e.promptSha256 !== sha)
|
|
73
|
+
break;
|
|
74
|
+
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.promptGravado)
|
|
75
|
+
return i;
|
|
76
|
+
}
|
|
77
|
+
return ultimo;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* O destino do pedido novo que abriu o episodio: o runtime, o perfil, o modelo e o esforco com que o `ork phase run`
|
|
81
|
+
* despachou ou tentou (o `phase_prompt_recorded` guarda o modelo e o esforco; a falha e o despacho, o perfil). E o
|
|
82
|
+
* "mesmo destino" do degrau 1 e a conta que o degrau 3 troca. `null` sem pedido novo no ledger (despacho de antes da F3).
|
|
83
|
+
*/
|
|
84
|
+
function destinoDoEpisodio(eventos, fase) {
|
|
85
|
+
const inicio = inicioDoEpisodio(eventos, fase);
|
|
86
|
+
if (inicio < 0)
|
|
87
|
+
return null;
|
|
88
|
+
const sha = eventos[inicio].promptSha256;
|
|
89
|
+
const doPedido = eventos.slice(inicio).filter((e) => doPedidoNovo(e, fase) && e.promptSha256 === sha);
|
|
90
|
+
const campo = (k) => doPedido.map((e) => e[k]).find((v) => typeof v === 'string' && v !== '') ?? null;
|
|
91
|
+
let perfil = null;
|
|
92
|
+
const bruto = doPedido.map((e) => e.perfil).find((v) => v !== undefined && v !== null);
|
|
93
|
+
try {
|
|
94
|
+
perfil = bruto ? (0, runtime_profiles_1.validarPerfilDeDespacho)(bruto) : null;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
perfil = null;
|
|
98
|
+
}
|
|
99
|
+
return { runtime: campo('runtime'), perfil, model: campo('model'), effort: campo('effort') };
|
|
100
|
+
}
|
|
101
|
+
function lerDegrau(e) {
|
|
102
|
+
const n = Number(e.degrau);
|
|
103
|
+
if (n !== 1 && n !== 2 && n !== 3)
|
|
104
|
+
return null;
|
|
105
|
+
const resultado = e.resultado === 'redespachada' || e.resultado === 'falhou' || e.resultado === 'pulado' ||
|
|
106
|
+
e.resultado === 'interrompido' ? e.resultado : null;
|
|
107
|
+
if (!resultado)
|
|
108
|
+
return null;
|
|
109
|
+
const para = e.para;
|
|
110
|
+
return {
|
|
111
|
+
degrau: n, tipo: exports.DEGRAUS_DA_ESCADA[n - 1], resultado, em: e.ts,
|
|
112
|
+
destino: para && typeof para.runtime === 'string' ? { runtime: para.runtime, perfil: typeof para.perfil === 'string' ? para.perfil : null,
|
|
113
|
+
model: typeof para.model === 'string' ? para.model : null, effort: typeof para.effort === 'string' ? para.effort : null } : null,
|
|
114
|
+
motivo: typeof e.motivoDoDegrau === 'string' ? e.motivoDoDegrau : null,
|
|
115
|
+
detalhe: typeof e.detalhe === 'string' ? e.detalhe : '',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Os degraus ja subidos neste episodio e o proximo. */
|
|
119
|
+
function estadoDaEscada(eventos, fase) {
|
|
120
|
+
const inicio = inicioDoEpisodio(eventos, fase);
|
|
121
|
+
const consumidos = [];
|
|
122
|
+
for (let i = inicio + 1; i < eventos.length; i++) {
|
|
123
|
+
const e = eventos[i];
|
|
124
|
+
if (e.tipo !== ledger_1.TIPOS_DE_EVENTO.recuperacaoDoRuntime || e.fase !== fase)
|
|
125
|
+
continue;
|
|
126
|
+
const d = lerDegrau(e);
|
|
127
|
+
// O degrau interrompido (o motivo nao era do destino) fica para depois: nao e consumido.
|
|
128
|
+
if (d && d.resultado !== 'interrompido')
|
|
129
|
+
consumidos.push(d);
|
|
130
|
+
}
|
|
131
|
+
const feitos = new Set(consumidos.map((d) => d.degrau));
|
|
132
|
+
const proximo = [1, 2, 3].find((n) => !feitos.has(n)) ?? null;
|
|
133
|
+
return { inicioEm: inicio >= 0 ? eventos[inicio].ts : null, consumidos, proximo };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* O destino do degrau `n`. O 1 e o proprio destino que falhou. O 2 e o primeiro alvo da ordem de fallback do bloco
|
|
137
|
+
* com destino agora: o perfil da vez do runtime dele, ou o ambiente do processo quando ele nao tem perfil. O 3 e
|
|
138
|
+
* outra conta do runtime que falhou: um perfil disponivel, que nao seja o do despacho nem tenha o mesmo diretorio
|
|
139
|
+
* dele, e que nao tenha sido tentado neste episodio.
|
|
140
|
+
*/
|
|
141
|
+
function planoDoDegrau(carregado, thread, fase, n, despacho, tentados, agoraMs = Date.now()) {
|
|
142
|
+
const { raiz, manifesto } = carregado;
|
|
143
|
+
const original = { runtime: despacho.runtime, perfil: despacho.perfil?.id ?? null, model: despacho.model,
|
|
144
|
+
effort: despacho.effort };
|
|
145
|
+
if (n === 1)
|
|
146
|
+
return { destino: original };
|
|
147
|
+
const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz, agoraMs);
|
|
148
|
+
if (n === 2) {
|
|
149
|
+
const doBloco = (0, setup_1.configDoBloco)((0, setup_1.lerSetup)(raiz), thread.modo, fase);
|
|
150
|
+
const configurados = (0, setup_1.alvosDaOrdemDeFallback)(doBloco?.fallback, doBloco?.runtime ?? manifesto.runtime.adapter).filter((f) => f.runtime !== despacho.runtime);
|
|
151
|
+
if (configurados.length === 0)
|
|
152
|
+
return { pulo: 'sem-fallback' };
|
|
153
|
+
const ordem = configurados.filter((f) => (0, runtime_context_1.capacidadeDoRuntimeNoProjeto)(raiz, f.runtime).capaz);
|
|
154
|
+
if (ordem.length === 0)
|
|
155
|
+
return { pulo: 'adaptador-ausente' };
|
|
156
|
+
for (const f of ordem) {
|
|
157
|
+
const perfis = (0, runtime_profiles_1.perfisDoRuntime)(store, f.runtime);
|
|
158
|
+
const effort = f.effort ?? despacho.effort;
|
|
159
|
+
if (perfis.length === 0)
|
|
160
|
+
return { destino: { runtime: f.runtime, perfil: null, model: f.model, effort } };
|
|
161
|
+
const p = (0, runtime_profiles_1.perfisDisponiveis)(store, f.runtime, agoraMs)[0];
|
|
162
|
+
if (p)
|
|
163
|
+
return { destino: { runtime: f.runtime, perfil: p.id, model: f.model, effort } };
|
|
164
|
+
}
|
|
165
|
+
return { pulo: 'fallback-sem-destino' };
|
|
166
|
+
}
|
|
167
|
+
// RM-067 (F3, F4): o runtime sem cota esgotada tipada (o grok) fica fora do degrau "outra conta": a escada nunca troca a
|
|
168
|
+
// conta dele, ate o formato da cota esgotada ser confirmado no ensaio real. Como alvo de fallback (degrau 2) ele vale no
|
|
169
|
+
// projeto sem o MCP do ork e, desde a F4c (o servidor do ork fora do sandbox dele), tambem no preparado.
|
|
170
|
+
if (runtimes_1.RUNTIMES_SEM_COTA_TIPADA.includes(despacho.runtime))
|
|
171
|
+
return { pulo: 'cota-sem-sinal-tipado' };
|
|
172
|
+
// Degrau 3: outra conta do runtime que falhou. O diretorio de cada conta e o que separa um daemon do outro. Os perfis
|
|
173
|
+
// tentados sao os efetivos (o redespacho sem perfil pedido escolhe um, e e ele que falhou); o despacho que nasceu sem
|
|
174
|
+
// perfil (o runtime caiu antes da escolha) tem como conta de origem a que o degrau 1 de fato usou.
|
|
175
|
+
const jaTentados = new Set(tentados.flatMap((d) => d.destino?.runtime === despacho.runtime && d.destino.perfil ? [d.destino.perfil] : []));
|
|
176
|
+
const doDegrau1 = tentados.find((d) => d.degrau === 1 && d.destino?.runtime === despacho.runtime)?.destino?.perfil ?? null;
|
|
177
|
+
let contaDeOrigem = despacho.perfil;
|
|
178
|
+
if (!contaDeOrigem && doDegrau1) {
|
|
179
|
+
const usado = (0, runtime_profiles_1.perfisDoRuntime)(store, despacho.runtime).find((x) => x.id === doDegrau1);
|
|
180
|
+
if (usado)
|
|
181
|
+
contaDeOrigem = (0, runtime_profiles_1.perfilDeDespacho)(usado);
|
|
182
|
+
}
|
|
183
|
+
let dirOriginal = null;
|
|
184
|
+
if ((0, runtime_profiles_1.runtimeComPerfil)(despacho.runtime)) {
|
|
185
|
+
try {
|
|
186
|
+
dirOriginal = (0, runtime_profiles_1.diretorioEfetivo)(despacho.runtime, contaDeOrigem);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
dirOriginal = null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const outro = (0, runtime_profiles_1.perfisDisponiveis)(store, despacho.runtime, agoraMs).find((p) => {
|
|
193
|
+
if (p.id === contaDeOrigem?.id || jaTentados.has(p.id))
|
|
194
|
+
return false;
|
|
195
|
+
const d = (0, runtime_profiles_1.perfilDeDespacho)(p);
|
|
196
|
+
return !dirOriginal || (0, runtime_profiles_1.diretorioDoPerfil)(d) !== dirOriginal;
|
|
197
|
+
});
|
|
198
|
+
return outro ? { destino: { ...original, perfil: outro.id } } : { pulo: 'sem-outro-perfil' };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Degrau 1 no claude-bg: o daemon de pe com o `control.sock` mudo e derrubado, para o proximo `claude --bg` subir
|
|
202
|
+
* outro. Daemon parado (o `--bg` sobe um), que responde ou que nao se deixa ler fica como esta: sem prova, nada cai.
|
|
203
|
+
*/
|
|
204
|
+
function reerguerDaemon(daemon, perfil) {
|
|
205
|
+
const antes = daemon.sondar(perfil);
|
|
206
|
+
if (antes.estado !== 'nao-responde')
|
|
207
|
+
return { antes: antes.estado, acao: 'nenhuma', depois: null, detalhe: antes.detalhe };
|
|
208
|
+
const derrubada = daemon.derrubar(perfil);
|
|
209
|
+
const depois = daemon.sondar(perfil);
|
|
210
|
+
return { antes: antes.estado, acao: derrubada.ok ? 'derrubado' : 'derrubada-falhou', depois: depois.estado,
|
|
211
|
+
detalhe: `${antes.detalhe}; stop: ${derrubada.detalhe}; depois: ${depois.detalhe}`.slice(0, 400) };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* As falhas do redespacho em que o degrau seguinte ainda vale: o destino nao recebeu o prompt agora (runtime fora,
|
|
215
|
+
* conta sem cota ou login, modelo que a conta nao tem, janela de rate limit). O resto (impedimento do dono, policy,
|
|
216
|
+
* worktree, conducao, prompt que mudou) para a escada: outro destino nao resolve.
|
|
217
|
+
*/
|
|
218
|
+
const FALHAS_DO_DESTINO = ['runtime.unavailable', 'runtime.quota-exhausted', 'runtime.auth-missing',
|
|
219
|
+
'runtime.model-unavailable', 'runtime.rate-limited'];
|
|
220
|
+
function falhaDoDestino(motivo) {
|
|
221
|
+
return FALHAS_DO_DESTINO.includes(String(motivo ?? ''));
|
|
222
|
+
}
|
|
223
|
+
function rotuloDoDestino(d) {
|
|
224
|
+
if (!d)
|
|
225
|
+
return '-';
|
|
226
|
+
return [d.runtime, d.perfil ? `perfil ${d.perfil}` : null, d.model, d.effort].filter(Boolean).join(' ');
|
|
227
|
+
}
|
|
228
|
+
const linhaCurta = (texto) => texto.replace(/\p{Cc}/gu, ' ').replace(/\s+/g, ' ').trim().slice(0, 300);
|
|
229
|
+
/** O redespacho que lanca vira falha do destino: o degrau fica no ledger, e a escada segue. */
|
|
230
|
+
function redespacharSemLancar(e, destino) {
|
|
231
|
+
try {
|
|
232
|
+
return e.redespachar(destino);
|
|
233
|
+
}
|
|
234
|
+
catch (erro) {
|
|
235
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.lancou(linhaCurta(erro.message ?? String(erro))));
|
|
236
|
+
return { ok: false, slug: '', sessionId: null, verificada: false, motivo: 'runtime.unavailable', detalhe, sinal: null,
|
|
237
|
+
comando: [], dryRun: false };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Sobe a escada a partir do proximo degrau do episodio, ate um degrau abrir a sessao, uma falha que nao e do destino
|
|
242
|
+
* parar, a prova de vida achar sessao (ou o runtime nao responder), o limite de tentativas do manifesto ou o fim dos
|
|
243
|
+
* degraus. No fim sem sessao, chama o dono (`escalarEscada`).
|
|
244
|
+
*/
|
|
245
|
+
function subirAEscada(e) {
|
|
246
|
+
const { carregado, thread, fase, despacho } = e;
|
|
247
|
+
const dir = (0, thread_1.dirThread)(carregado.raiz, thread.id);
|
|
248
|
+
const daemon = e.daemon ?? claude_bg_1.DAEMON_DO_CLAUDE;
|
|
249
|
+
const estado = estadoDaEscada((0, ledger_1.lerLedger)(dir), fase);
|
|
250
|
+
const feitos = [];
|
|
251
|
+
const tentados = [...estado.consumidos];
|
|
252
|
+
const ids = [...(e.idsConhecidos ?? [])];
|
|
253
|
+
let tentativas = e.tentativas;
|
|
254
|
+
let ultimo = null;
|
|
255
|
+
const original = { runtime: despacho.runtime, perfil: despacho.perfil?.id ?? null, model: despacho.model,
|
|
256
|
+
effort: despacho.effort };
|
|
257
|
+
for (const n of [1, 2, 3]) {
|
|
258
|
+
if (tentados.some((d) => d.degrau === n))
|
|
259
|
+
continue;
|
|
260
|
+
if (tentativas >= e.limite)
|
|
261
|
+
break;
|
|
262
|
+
const tipo = exports.DEGRAUS_DA_ESCADA[n - 1];
|
|
263
|
+
const plano = planoDoDegrau(carregado, thread, fase, n, despacho, tentados, e.agoraMs);
|
|
264
|
+
if (e.dryRun) {
|
|
265
|
+
const detalhe = 'pulo' in plano
|
|
266
|
+
? (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.ensaioPulado(n, m.retry.escada.degraus[tipo], m.retry.escada.pulos[plano.pulo]))
|
|
267
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.ensaio(n, m.retry.escada.degraus[tipo], rotuloDoDestino(plano.destino)));
|
|
268
|
+
if ('pulo' in plano)
|
|
269
|
+
continue;
|
|
270
|
+
const r = redespacharSemLancar(e, plano.destino);
|
|
271
|
+
return { executada: false, redespacho: r, detalhe, degraus: [], escalada: false };
|
|
272
|
+
}
|
|
273
|
+
const base = { fase, motivo: 'runtime.unavailable', degrau: n, tipoDoDegrau: tipo, origem: 'retry.escada',
|
|
274
|
+
promptSha256: despacho.promptSha256, modo: thread.modo, de: original,
|
|
275
|
+
autorizadoPor: `politica de retry da RM-063 (F4), bloco sem pausa ou delegado no modo ${thread.modo}` };
|
|
276
|
+
if ('pulo' in plano) {
|
|
277
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.pulos[plano.pulo]);
|
|
278
|
+
const ev = (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.recuperacaoDoRuntime, { ...base, resultado: 'pulado', para: null,
|
|
279
|
+
motivoDoDegrau: plano.pulo, detalhe });
|
|
280
|
+
const d = { degrau: n, tipo, resultado: 'pulado', em: ev.ts, destino: null, motivo: plano.pulo, detalhe };
|
|
281
|
+
feitos.push(d);
|
|
282
|
+
tentados.push(d);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
// GO-FIX (achado 1 da revisao): o degrau anterior pode ter aberto a sessao e falhado depois (o `claude --bg` lento).
|
|
286
|
+
// Antes de outro destino, a prova de que ninguem trabalha na worktree; sem ela, nada mais sai e o degrau fica.
|
|
287
|
+
if (ultimo) {
|
|
288
|
+
const viva = e.provaDeVida(ids);
|
|
289
|
+
if (!viva.respondeu || viva.sessionId) {
|
|
290
|
+
const sessao = viva.sessionId;
|
|
291
|
+
const detalhe = sessao ? (0, locale_1.textoDoCatalogo)((m) => m.retry.sessaoAindaViva(sessao.slice(0, 8), thread.id))
|
|
292
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.retry.runtimeSemProva(viva.detalhe ?? '', thread.id));
|
|
293
|
+
return { executada: false, redespacho: ultimo, detalhe, degraus: feitos, escalada: false };
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const noDaemon = n === 1 && despacho.runtime === 'claude-bg'
|
|
297
|
+
? (e.daemonJaReerguido ?? reerguerDaemon(daemon, despacho.perfil)) : null;
|
|
298
|
+
const r = redespacharSemLancar(e, plano.destino);
|
|
299
|
+
ultimo = r;
|
|
300
|
+
if (r.sessionId)
|
|
301
|
+
ids.push(r.sessionId);
|
|
302
|
+
const resultado = r.ok ? 'redespachada' : falhaDoDestino(r.motivo) ? 'falhou' : 'interrompido';
|
|
303
|
+
e.registrarTentativa(r.ok, r.detalhe, { degrau: n, tipoDoDegrau: tipo, tentativa: tentativas + 1,
|
|
304
|
+
...(r.ok ? {} : { motivoDoRedespacho: r.motivo }), ...(resultado === 'interrompido' ? { conta: false } : {}) });
|
|
305
|
+
if (resultado !== 'interrompido')
|
|
306
|
+
tentativas += 1;
|
|
307
|
+
// O perfil efetivo: o redespacho sem perfil pedido escolhe um, e e ele que o degrau 3 nao repete.
|
|
308
|
+
const efetivo = { ...plano.destino, perfil: r.perfil?.id ?? plano.destino.perfil };
|
|
309
|
+
const ev = (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.recuperacaoDoRuntime, { ...base, resultado, para: efetivo,
|
|
310
|
+
...(noDaemon ? { daemon: noDaemon } : {}), motivoDoDegrau: r.ok ? null : r.motivo, detalhe: r.detalhe,
|
|
311
|
+
...(r.sessionId ? { sessionId: r.sessionId } : {}) });
|
|
312
|
+
const d = { degrau: n, tipo, resultado, em: ev.ts, destino: efetivo, motivo: r.ok ? null : r.motivo,
|
|
313
|
+
detalhe: r.detalhe };
|
|
314
|
+
feitos.push(d);
|
|
315
|
+
if (resultado !== 'interrompido')
|
|
316
|
+
tentados.push(d);
|
|
317
|
+
if (r.ok)
|
|
318
|
+
return { executada: true, redespacho: r, detalhe: r.detalhe, degraus: feitos, escalada: false };
|
|
319
|
+
if (resultado === 'interrompido')
|
|
320
|
+
return { executada: false, redespacho: r, detalhe: r.detalhe, degraus: feitos, escalada: false };
|
|
321
|
+
}
|
|
322
|
+
if (e.dryRun) {
|
|
323
|
+
return { executada: false, redespacho: null, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.ensaioEsgotada), degraus: [],
|
|
324
|
+
escalada: false };
|
|
325
|
+
}
|
|
326
|
+
const detalhe = escalarEscada(carregado, thread, fase, despacho, tentados, tentativas, e.limite);
|
|
327
|
+
return { executada: false, redespacho: ultimo, detalhe, degraus: feitos, escalada: true };
|
|
328
|
+
}
|
|
329
|
+
/** "degrau 1 (reerguer o daemon do runtime): falhou (runtime.unavailable)", uma por degrau. */
|
|
330
|
+
function resumoDosDegraus(degraus) {
|
|
331
|
+
return [...degraus].sort((a, b) => a.degrau - b.degrau)
|
|
332
|
+
.map((d) => (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.linhaDoDegrau(d.degrau, m.retry.escada.degraus[d.tipo], m.retry.escada.resultados[d.resultado], d.motivo)))
|
|
333
|
+
.join('; ');
|
|
334
|
+
}
|
|
335
|
+
/** O comando que confere o runtime do despacho no terminal do dono. */
|
|
336
|
+
function comandoDeConferir(runtime, perfil) {
|
|
337
|
+
if (runtime === 'claude-bg')
|
|
338
|
+
return perfil?.configDir ? `CLAUDE_CONFIG_DIR=${citar(perfil.configDir)} claude daemon status` : 'claude daemon status';
|
|
339
|
+
if (runtime === 'codex')
|
|
340
|
+
return perfil?.codexHome ? `CODEX_HOME=${citar(perfil.codexHome)} codex login status` : 'codex login status';
|
|
341
|
+
return 'ork doctor';
|
|
342
|
+
}
|
|
343
|
+
/** Aspas simples do shell, com a aspa de dentro escapada. */
|
|
344
|
+
function citar(caminho) {
|
|
345
|
+
return `'${caminho.replace(/'/g, `'\\''`)}'`;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* O comando que devolve a fase ao runtime com o MESMO prompt: um pedido novo, e a escada recomeca. O caminho e o
|
|
349
|
+
* absoluto do prompt gravado (o do ledger e relativo a quem despachou), entre aspas.
|
|
350
|
+
*/
|
|
351
|
+
function comandoDeRetomar(thread, fase, promptPath) {
|
|
352
|
+
return `ork phase run ${thread} ${fase} --prompt "$(cat ${citar(promptPath)})"`;
|
|
353
|
+
}
|
|
354
|
+
/** O bloco do modo que conduz a fase, para a alternativa de trocar o runtime. */
|
|
355
|
+
function numeroDoBloco(thread, fase) {
|
|
356
|
+
const i = modos_1.MODOS[thread.modo]?.blocos.findIndex((b) => b.fases.includes(fase)) ?? -1;
|
|
357
|
+
return i >= 0 ? String(i + 1) : 'N';
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* RM-057: as tres alternativas, uma recomendada, em linguagem simples. A recomendada e o despacho de novo com o mesmo
|
|
361
|
+
* pedido depois de conferir o runtime: o dono nao reescreve nada.
|
|
362
|
+
*/
|
|
363
|
+
function alternativasDaEscada(thread, fase, retomar) {
|
|
364
|
+
const bloco = numeroDoBloco(thread, fase);
|
|
365
|
+
return [
|
|
366
|
+
{ chave: 'a', texto: 'Conferir o runtime e despachar de novo com o mesmo pedido',
|
|
367
|
+
consequencia: `\`${retomar}\` devolve ${fase} ao runtime com o mesmo prompt, e a escada recomeça`,
|
|
368
|
+
recomendada: { porque: 'a fábrica não religou o runtime sozinha; o pedido volta igual, sem você reescrever nada' } },
|
|
369
|
+
{ chave: 'b', texto: 'Trocar o runtime do bloco',
|
|
370
|
+
consequencia: `ork setup ${thread.modo} --bloco ${bloco} --runtime <outro> (ou --fallback), e depois o mesmo despacho` },
|
|
371
|
+
{ chave: 'c', texto: 'Deixar parada', consequencia: 'nada é despachado; a thread segue esperando você' },
|
|
372
|
+
];
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Chama o dono: o `gate_blocked human.pending` com a escada e as alternativas, e o `retry_escalated`. Tambem quem acha a
|
|
376
|
+
* escada esgotada pelo plano (a sessao do ultimo degrau morreu depois) e quem desiste do runtime que nao responde chamam
|
|
377
|
+
* por aqui, com o detalhe deles.
|
|
378
|
+
*/
|
|
379
|
+
function escalarEscada(carregado, thread, fase, despacho, degraus, tentativas, limite, detalheProprio) {
|
|
380
|
+
const dir = (0, thread_1.dirThread)(carregado.raiz, thread.id);
|
|
381
|
+
const resumo = resumoDosDegraus(degraus);
|
|
382
|
+
const detalhe = detalheProprio ?? (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.esgotada(resumo || '-'));
|
|
383
|
+
// O dono ja foi chamado pela escada nesta fase e nada foi despachado depois: o mesmo pedido nao e gravado de novo.
|
|
384
|
+
const eventos = (0, ledger_1.lerLedger)(dir);
|
|
385
|
+
const aberto = [...eventos].reverse().find((x) => x.tipo === ledger_1.TIPOS_DE_EVENTO.gateBloqueado && x.origem === 'retry.escada' && x.fase === fase);
|
|
386
|
+
if (aberto && !eventos.slice(eventos.indexOf(aberto) + 1).some((x) => x.fase === fase &&
|
|
387
|
+
(x.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada || x.tipo === ledger_1.TIPOS_DE_EVENTO.promptGravado))) {
|
|
388
|
+
return typeof aberto.detalhe === 'string' ? aberto.detalhe : detalhe;
|
|
389
|
+
}
|
|
390
|
+
const retomar = comandoDeRetomar(thread.id, fase, despacho.promptPath);
|
|
391
|
+
const escada = {
|
|
392
|
+
degraus: [...degraus].sort((a, b) => a.degrau - b.degrau).map((d) => ({ degrau: d.degrau, tipo: d.tipo, resultado: d.resultado,
|
|
393
|
+
motivo: d.motivo })),
|
|
394
|
+
conferir: comandoDeConferir(despacho.runtime, despacho.perfil), retomar,
|
|
395
|
+
alternativas: alternativasDaEscada(thread, fase, retomar),
|
|
396
|
+
};
|
|
397
|
+
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'human.pending', modo: thread.modo,
|
|
398
|
+
detalhe, correcao: (0, locale_1.textoDoCatalogo)((m) => m.retry.escada.correcao(escada.conferir, retomar)), fase, origem: 'retry.escada',
|
|
399
|
+
promptPath: despacho.promptPath, promptSha256: despacho.promptSha256, escada, pausaQualquerModo: true,
|
|
400
|
+
evidencia: 'runtime_recuperacao no ledger da thread: os degraus da escada deste episodio' });
|
|
401
|
+
(0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.retryEscalado, { fase, motivo: 'runtime.unavailable', origem: 'retry.escada',
|
|
402
|
+
acao: 'reexecutar', tentativas, limite, modo: thread.modo, razao: detalhe });
|
|
403
|
+
return detalhe;
|
|
404
|
+
}
|
|
405
|
+
/** A escada gravada num `gate_blocked`, lida de volta com tipos; `null` quando o evento nao a traz. */
|
|
406
|
+
function escadaDoEvento(e) {
|
|
407
|
+
const x = e.escada;
|
|
408
|
+
if (!x || typeof x.conferir !== 'string' || typeof x.retomar !== 'string' || !Array.isArray(x.alternativas) ||
|
|
409
|
+
!Array.isArray(x.degraus))
|
|
410
|
+
return null;
|
|
411
|
+
const alternativas = x.alternativas.filter((a) => !!a && typeof a.chave === 'string' &&
|
|
412
|
+
typeof a.texto === 'string' && typeof a.consequencia === 'string');
|
|
413
|
+
if (alternativas.length < 3 || alternativas.length > 5 || alternativas.filter((a) => a.recomendada).length !== 1)
|
|
414
|
+
return null;
|
|
415
|
+
return { degraus: x.degraus, conferir: x.conferir, retomar: x.retomar, alternativas };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* RM-057: o pedido da escada no contrato curto da RM-048 (`ork.hitl-curto/v1`): o que parou, os degraus que a
|
|
419
|
+
* fabrica ja subiu e as tres alternativas. O dono responde no terminal, com o comando que retoma.
|
|
420
|
+
*/
|
|
421
|
+
function pedidoCurtoDaEscada(d, quando) {
|
|
422
|
+
const subidos = d.escada.degraus.map((x) => `${x.degrau} ${x.resultado}`).join(', ') || '-';
|
|
423
|
+
return (0, hitl_curto_1.montarPedidoCurto)({
|
|
424
|
+
thread: d.thread, fase: d.fase, desde: d.desdeEm,
|
|
425
|
+
pergunta: 'A fábrica não conseguiu religar o runtime sozinha: como seguimos?',
|
|
426
|
+
corpo: [`Degraus: ${subidos} (o mesmo prompt em todos).`, `Conferir: ${d.escada.conferir}.`],
|
|
427
|
+
alternativas: d.escada.alternativas,
|
|
428
|
+
}, { quando, responder: { tipo: 'terminal', comando: d.escada.retomar } });
|
|
429
|
+
}
|