@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -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/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-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-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 +121 -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-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/.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 +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 +3 -3
- package/adapters/openclaw/README.md +83 -10
- 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/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/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 +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- 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 +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- 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 +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- 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 +53 -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 +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- 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-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- 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 +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -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 +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -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 +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -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 +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -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 +188 -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 +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- 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 +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- 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 +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- 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
package/dist/session-watcher.js
CHANGED
|
@@ -33,10 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.BLOCO_WATCH_BYTES = exports.INTERVALO_WATCH_MS = exports.LIMITE_MORTE_MS = void 0;
|
|
36
|
+
exports.BLOCO_WATCH_BYTES = exports.MAX_FALHAS_WATCH = exports.MAX_ESPERA_ERRO_WATCH_MS = exports.INTERVALO_WATCH_MS = exports.LIMITE_MORTE_MS = void 0;
|
|
37
37
|
exports.observarSessao = observarSessao;
|
|
38
|
+
exports.reconciliarSessaoSemWatcher = reconciliarSessaoSemWatcher;
|
|
39
|
+
exports.validarRegistroWatcher = validarRegistroWatcher;
|
|
38
40
|
exports.validarFonteWatcher = validarFonteWatcher;
|
|
41
|
+
exports.prepararFonteWatcher = prepararFonteWatcher;
|
|
39
42
|
exports.iniciarWatcher = iniciarWatcher;
|
|
43
|
+
exports.acompanharSessao = acompanharSessao;
|
|
40
44
|
/** D6: observador restrito a uma sessão, cursor canônico e resultados idempotentes. */
|
|
41
45
|
const fs = __importStar(require("node:fs"));
|
|
42
46
|
const path = __importStar(require("node:path"));
|
|
@@ -54,6 +58,8 @@ const codex_controller_sensor_1 = require("./adapters/codex-controller-sensor");
|
|
|
54
58
|
const retry_1 = require("./retry");
|
|
55
59
|
const ratelimit_1 = require("./ratelimit");
|
|
56
60
|
const session_watcher_claude_1 = require("./session-watcher-claude");
|
|
61
|
+
const conta_esgotada_1 = require("./conta-esgotada");
|
|
62
|
+
const trabalho_thread_1 = require("./trabalho-thread");
|
|
57
63
|
/** Falhas operacionais e bloqueios sem retry automático não alegam conclusão do produto. */
|
|
58
64
|
function bloqueioPreservado(terminal) {
|
|
59
65
|
return terminal.classificacao === 'gate_blocked' && terminal.motivo !== null &&
|
|
@@ -110,6 +116,8 @@ function semProvaNativa(snapshot, terminal, fonteVencedora, fechamento, sessionI
|
|
|
110
116
|
}
|
|
111
117
|
exports.LIMITE_MORTE_MS = 600000;
|
|
112
118
|
exports.INTERVALO_WATCH_MS = 1000;
|
|
119
|
+
exports.MAX_ESPERA_ERRO_WATCH_MS = 30000;
|
|
120
|
+
exports.MAX_FALHAS_WATCH = 12;
|
|
113
121
|
exports.BLOCO_WATCH_BYTES = codex_events_1.LIMITE_LINHA_CODEX + 65536;
|
|
114
122
|
function lerJson(file) {
|
|
115
123
|
if (!fs.existsSync(file))
|
|
@@ -291,8 +299,195 @@ function desfazerNaThreadRemovida(pasta, criadas) {
|
|
|
291
299
|
catch { /* já removida ou não vazia */ }
|
|
292
300
|
}
|
|
293
301
|
}
|
|
302
|
+
/** Diagnóstico fechado: mensagens de E/S e JSON podem conter caminhos e segredos. */
|
|
303
|
+
function diagnosticoWatcher(e) {
|
|
304
|
+
const erro = e;
|
|
305
|
+
const code = ['ENOENT', 'EAGAIN', 'EBUSY', 'EINTR', 'EACCES', 'EPERM', 'EIO', 'ENOSPC', 'SESSION_STATE_SPLIT']
|
|
306
|
+
.includes(erro?.code ?? '') ? erro.code : null;
|
|
307
|
+
const nome = e instanceof Error ? e.constructor.name : '';
|
|
308
|
+
const construtor = ['Error', 'SyntaxError', 'TypeError', 'RangeError', 'ReferenceError', 'URIError', 'EvalError', 'AggregateError']
|
|
309
|
+
.includes(nome) ? nome : 'desconhecido';
|
|
310
|
+
const base = { code, construtor };
|
|
311
|
+
const mensagem = erro?.message ?? '';
|
|
312
|
+
if (mensagem === 'prazo de observação esgotado')
|
|
313
|
+
return { ...base, categoria: 'observacao.prazo',
|
|
314
|
+
erro: 'nenhuma observação bem-sucedida dentro do orçamento de espera', transitorio: false };
|
|
315
|
+
// Só motivos literais do núcleo saem no diagnóstico: nenhum conteúdo de metadado.
|
|
316
|
+
const motivos = ['sessão do controller divergente', 'instância do controller divergente',
|
|
317
|
+
'vínculo thread/fase/prompt do controller divergente', 'cwd do controller divergente',
|
|
318
|
+
'identidade do controller divergente da registrada', 'identidade do runtime divergente da registrada',
|
|
319
|
+
'rollout do controller ausente', 'rollout do controller divergente do registrado',
|
|
320
|
+
'rollout do controller rotacionado sem vínculo provado com a fonte fixada',
|
|
321
|
+
'descritor consumidor de rollout divergente da fonte fixada'];
|
|
322
|
+
const metadado = /^runtime\.unavailable: metadado (state\.json|launch\.json|process-launch\.json) de controller (inválido|ausente)$/.test(mensagem);
|
|
323
|
+
const categoria = metadado || motivos.some(m => mensagem === `runtime.unavailable: ${m}`) ? mensagem
|
|
324
|
+
: mensagem === 'controlador registrado divergente do despacho' ? 'controller.registro-divergente'
|
|
325
|
+
: mensagem === 'despacho do controller sem cwd registrado' ? 'controller.cwd-ausente'
|
|
326
|
+
: mensagem.startsWith('runtime.unavailable:') ? 'runtime.unavailable: motivo não categorizado'
|
|
327
|
+
: code ? `io.${code}` : construtor;
|
|
328
|
+
if (code === 'SESSION_STATE_SPLIT')
|
|
329
|
+
return { ...base, categoria: 'estado.dividido',
|
|
330
|
+
erro: 'estado canônico temporariamente sem vínculo; auditoria será repetida', transitorio: true };
|
|
331
|
+
if (['ENOENT', 'EAGAIN', 'EBUSY', 'EINTR'].includes(erro?.code ?? ''))
|
|
332
|
+
return { ...base, categoria, erro: `leitura temporariamente indisponível (${erro.code})`, transitorio: true };
|
|
333
|
+
if (mensagem === 'runtime.unavailable: rollout do controller ausente' ||
|
|
334
|
+
mensagem === 'runtime.unavailable: rollout do controller sem session_meta conferível')
|
|
335
|
+
return { ...base, categoria, erro: 'fonte do runtime ainda não está pronta', transitorio: true };
|
|
336
|
+
if (e instanceof SyntaxError || /^JSON invalido em /.test(erro?.message ?? '') ||
|
|
337
|
+
metadado)
|
|
338
|
+
return { ...base, categoria: metadado ? categoria : 'json.invalido', erro: 'metadado JSON indisponível ou incompleto', transitorio: true };
|
|
339
|
+
if (/^(ingestão ocupada|creation\.busy:)/.test(erro?.message ?? ''))
|
|
340
|
+
return { ...base, categoria: 'observacao.ocupada', erro: 'observação ocupada; nova tentativa agendada', transitorio: true };
|
|
341
|
+
return { ...base, categoria, erro: 'falha permanente na observação; confira vínculo e fonte do sensor', transitorio: false };
|
|
342
|
+
}
|
|
343
|
+
const errosRegistrados = new WeakSet();
|
|
344
|
+
function registrarErroWatcher(raiz, threadId, sessionId, e, serie) {
|
|
345
|
+
if (!serie && e && typeof e === 'object' && errosRegistrados.has(e))
|
|
346
|
+
return true;
|
|
347
|
+
const dados = diagnosticoWatcher(e);
|
|
348
|
+
if (dados.categoria === 'observacao.ocupada')
|
|
349
|
+
return true;
|
|
350
|
+
const registrado = (0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, threadId), threadId, 'session_watcher_error', {
|
|
351
|
+
sessionId, motivo: 'runtime.unavailable', ...dados, ...serie,
|
|
352
|
+
transitorio: dados.transitorio && (!serie?.encerramento || serie.encerramento === 'recuperado'), origem: 'sessions.watch',
|
|
353
|
+
});
|
|
354
|
+
if (registrado && e && typeof e === 'object')
|
|
355
|
+
errosRegistrados.add(e);
|
|
356
|
+
return registrado !== null;
|
|
357
|
+
}
|
|
358
|
+
/** Falhar ao diagnosticar não troca o erro observado nem interrompe o retry transitório. */
|
|
359
|
+
function tentarRegistrarErroWatcher(...args) {
|
|
360
|
+
try {
|
|
361
|
+
return registrarErroWatcher(...args);
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
function observarSemDiagnostico(carregado, sessionId, opcoes) {
|
|
368
|
+
return observarSessaoResolvida(carregado, sessionId, (0, session_events_1.resolverSessao)(carregado.raiz, sessionId, opcoes.threadId), opcoes);
|
|
369
|
+
}
|
|
294
370
|
function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
295
|
-
|
|
371
|
+
let threadId = opcoes.threadId;
|
|
372
|
+
try {
|
|
373
|
+
const resolvida = (0, session_events_1.resolverSessao)(carregado.raiz, sessionId, threadId);
|
|
374
|
+
// Recusa de entrada sem despacho não é falha de um watcher ancorado.
|
|
375
|
+
threadId = resolvida.sessao.origem !== 'adocao' && resolvida.sessao.despachadaEm
|
|
376
|
+
? resolvida.thread.id : undefined;
|
|
377
|
+
return observarSessaoResolvida(carregado, sessionId, resolvida, opcoes);
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
if (threadId)
|
|
381
|
+
tentarRegistrarErroWatcher(carregado.raiz, threadId, sessionId, e);
|
|
382
|
+
throw e;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* RM-064 T9: a batida não depende do processo watcher ter nascido. Para a última sessão
|
|
387
|
+
* despachada e verificada, recompõe a fonte do próprio despacho, observa o runtime diretamente
|
|
388
|
+
* e, depois do mesmo limite do watcher, registra uma parada tipada que o retry consegue tratar.
|
|
389
|
+
*/
|
|
390
|
+
function reconciliarSessaoSemWatcher(carregado, threadId, agoraMs = Date.now()) {
|
|
391
|
+
const thread = (0, thread_1.lerThread)(carregado.raiz, threadId);
|
|
392
|
+
const sessao = thread.sessoes.at(-1);
|
|
393
|
+
const ignorada = (detalhe) => ({ thread: threadId,
|
|
394
|
+
sessionId: sessao?.sessionId ?? null, estado: 'ignorada', detalhe });
|
|
395
|
+
if (thread.status === 'fechada' || !sessao || sessao.verificada !== true ||
|
|
396
|
+
!['codex', 'claude-bg'].includes(sessao.runtime) || typeof sessao.despachadaEm !== 'string')
|
|
397
|
+
return ignorada('sem sessão despachada e verificada que o watcher possa reconciliar');
|
|
398
|
+
const dir = (0, thread_1.dirThread)(carregado.raiz, threadId);
|
|
399
|
+
let eventos = (0, ledger_1.lerLedger)(dir);
|
|
400
|
+
if (eventos.some(e => e.tipo === 'phase_result' && e.sessionId === sessao.sessionId &&
|
|
401
|
+
(e.despachoEm === undefined || e.despachoEm === sessao.despachadaEm)))
|
|
402
|
+
return ignorada('sessão já possui phase_result');
|
|
403
|
+
const iniciado = eventos.filter(e => e.tipo === 'session_watcher_started' && e.sessionId === sessao.sessionId &&
|
|
404
|
+
e.despachoEm === sessao.despachadaEm).at(-1);
|
|
405
|
+
const identidade = iniciado?.identidade;
|
|
406
|
+
if (identidade && iniciado?.pid === identidade.pid && (0, codex_runner_1.estadoProcesso)(identidade) === 'vivo')
|
|
407
|
+
return ignorada('watcher verificado continua vivo');
|
|
408
|
+
try {
|
|
409
|
+
const registro = eventos.filter(e => e.tipo === 'session_sensor_registered' && e.sessionId === sessao.sessionId &&
|
|
410
|
+
e.despachoEm === sessao.despachadaEm).at(-1);
|
|
411
|
+
if (!registro && sessao.runtime === 'claude-bg') {
|
|
412
|
+
(0, session_watcher_claude_1.garantirFonteClaude)(carregado.raiz, thread, (0, session_events_1.exigirSessaoDespachada)(sessao, sessao.sessionId));
|
|
413
|
+
}
|
|
414
|
+
else if (!registro && sessao.runtime === 'codex') {
|
|
415
|
+
const despacho = eventos.filter(e => e.tipo === 'phase_dispatch' && e.sessionId === sessao.sessionId).at(-1);
|
|
416
|
+
const controlador = (despacho?.controlador ?? sessao.controlador);
|
|
417
|
+
const cwd = despacho?.cwd;
|
|
418
|
+
if (controlador && cwd) {
|
|
419
|
+
const fonte = { controlador, cwd };
|
|
420
|
+
validarRegistroWatcher(carregado.raiz, sessao.sessionId, fonte);
|
|
421
|
+
(0, session_events_1.comLockDeSessao)(dir, () => {
|
|
422
|
+
const atuais = (0, ledger_1.lerLedger)(dir);
|
|
423
|
+
if (!atuais.some(e => e.tipo === 'session_sensor_registered' && e.sessionId === sessao.sessionId &&
|
|
424
|
+
e.despachoEm === sessao.despachadaEm)) {
|
|
425
|
+
(0, ledger_1.registrar)(dir, threadId, 'session_sensor_registered', { fase: sessao.fase, sessionId: sessao.sessionId,
|
|
426
|
+
despachoEm: sessao.despachadaEm, ...fonte, origem: 'conducao.batida',
|
|
427
|
+
...(despacho?.perfil ? { perfil: despacho.perfil } : {}) });
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const observado = observarSessao(carregado, sessao.sessionId, { threadId, agoraMs });
|
|
433
|
+
if (!observado.ocupado) {
|
|
434
|
+
const observadoEm = new Date(agoraMs).toISOString();
|
|
435
|
+
(0, session_events_1.comLockDeSessao)(dir, () => {
|
|
436
|
+
const atuais = (0, ledger_1.lerLedger)(dir);
|
|
437
|
+
if (!atuais.some(e => e.tipo === 'session_watcher_observed' && e.sessionId === sessao.sessionId &&
|
|
438
|
+
e.despachoEm === sessao.despachadaEm && e.ts === observadoEm)) {
|
|
439
|
+
(0, ledger_1.registrar)(dir, threadId, 'session_watcher_observed', { ts: observadoEm, fase: sessao.fase,
|
|
440
|
+
sessionId: sessao.sessionId, despachoEm: sessao.despachadaEm, origem: 'conducao.batida' });
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
if (observado.concluido)
|
|
445
|
+
return { thread: threadId, sessionId: sessao.sessionId,
|
|
446
|
+
estado: 'concluida', detalhe: `runtime observado: ${observado.classificacao ?? 'terminal'}` };
|
|
447
|
+
return { thread: threadId, sessionId: sessao.sessionId, estado: 'acompanhada',
|
|
448
|
+
detalhe: observado.ocupado ? 'observação ocupada; nova batida repetirá' : 'runtime ainda sem terminal' };
|
|
449
|
+
}
|
|
450
|
+
catch (erro) {
|
|
451
|
+
// `observarSessao` diagnostica sua própria falha; a recomposição estrutural passa pelo mesmo
|
|
452
|
+
// recibo. Só depois do limite a batida transforma a ausência persistente em parada.
|
|
453
|
+
tentarRegistrarErroWatcher(carregado.raiz, threadId, sessao.sessionId, erro);
|
|
454
|
+
eventos = (0, ledger_1.lerLedger)(dir);
|
|
455
|
+
const doIntervalo = (0, session_watcher_claude_1.eventosDoIntervalo)(eventos, (0, session_events_1.exigirSessaoDespachada)(sessao, sessao.sessionId));
|
|
456
|
+
const uteis = doIntervalo.filter(e => ['runtime_heartbeat', 'runtime_event', 'runtime_stop', 'runtime_subagent_stop', 'commit',
|
|
457
|
+
'mcp_git_committed', 'sessao_bloqueada', 'sessao_destravada'].includes(e.tipo));
|
|
458
|
+
const observacoesBoas = doIntervalo.filter(e => e.sessionId === sessao.sessionId &&
|
|
459
|
+
(e.tipo === 'session_watcher_observed' || e.tipo === 'session_watcher_error' && e.encerramento === 'recuperado'));
|
|
460
|
+
const ultimaObservacao = Math.max(Date.parse(sessao.despachadaEm), ...[...uteis, ...observacoesBoas].map(e => Date.parse(e.ts)).filter(Number.isFinite));
|
|
461
|
+
const errosDaSerie = doIntervalo.filter(e => e.tipo === 'session_watcher_error' && e.sessionId === sessao.sessionId &&
|
|
462
|
+
e.encerramento !== 'recuperado').map(e => Date.parse(e.ts)).filter(ts => Number.isFinite(ts) && ts >= ultimaObservacao);
|
|
463
|
+
const primeiroErro = errosDaSerie.length > 0 ? Math.min(...errosDaSerie) : Number.NEGATIVE_INFINITY;
|
|
464
|
+
const ultimoUtil = Math.max(ultimaObservacao, primeiroErro);
|
|
465
|
+
if (agoraMs - ultimoUtil < exports.LIMITE_MORTE_MS)
|
|
466
|
+
return { thread: threadId, sessionId: sessao.sessionId,
|
|
467
|
+
estado: 'acompanhada', detalhe: 'fonte ainda indisponível dentro do limite de estabilidade' };
|
|
468
|
+
const sessionId = sessao.sessionId;
|
|
469
|
+
const chave = (0, node_crypto_1.createHash)('sha256').update(sessionId + '|' + sessao.despachadaEm).digest('hex');
|
|
470
|
+
const sensorResultId = `codex:${chave}`;
|
|
471
|
+
(0, session_events_1.comLockDeSessao)(dir, () => {
|
|
472
|
+
const atuais = (0, ledger_1.lerLedger)(dir);
|
|
473
|
+
if (atuais.some(e => e.tipo === 'phase_result' && e.sessionId === sessao.sessionId &&
|
|
474
|
+
e.despachoEm === sessao.despachadaEm))
|
|
475
|
+
return;
|
|
476
|
+
const dados = { fase: sessao.fase, sessionId: sessao.sessionId, despachoEm: sessao.despachadaEm,
|
|
477
|
+
sensorResultId, classificacao: 'gate_blocked', motivo: 'runtime.unavailable', runtime: sessao.runtime,
|
|
478
|
+
fonte: 'conducao.batida: sessão verificada sem watcher e sem evento útil', fonteVencedora: null,
|
|
479
|
+
ok: false, conclusaoNativa: false, conclusaoNativaAusente: 'watcher ausente e fonte indisponível além do limite',
|
|
480
|
+
estado: 'bloqueada', observadoEm: new Date(agoraMs).toISOString(), gate: 'phase.dispatch',
|
|
481
|
+
origem: 'conducao.batida', morteLatenciaMs: agoraMs - ultimoUtil };
|
|
482
|
+
(0, ledger_1.registrar)(dir, threadId, 'sessao_morta', dados);
|
|
483
|
+
(0, ledger_1.registrar)(dir, threadId, 'gate_blocked', dados);
|
|
484
|
+
(0, ledger_1.registrar)(dir, threadId, 'phase_result', dados);
|
|
485
|
+
});
|
|
486
|
+
return { thread: threadId, sessionId: sessao.sessionId, estado: 'parada',
|
|
487
|
+
detalhe: 'sessão verificada sem watcher e sem evento útil além do limite' };
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
function observarSessaoResolvida(carregado, sessionId, { thread, sessao: registrada }, opcoes) {
|
|
296
491
|
const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
|
|
297
492
|
if (sessao.runtime !== 'codex' && sessao.runtime !== 'claude-bg')
|
|
298
493
|
throw new Error('watch requer sessão Codex ou claude-bg registrada');
|
|
@@ -331,7 +526,8 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
331
526
|
thread, sessao, dir, pasta, chave, agoraMs: now, limiteMs: exports.LIMITE_MORTE_MS, consulta: opcoes.consultaClaude, carregado })) ?? { ...base, ocupado: true };
|
|
332
527
|
return (0, ledger_1.threadPresente)(dir) ? r : desfazer();
|
|
333
528
|
}
|
|
334
|
-
|
|
529
|
+
let contaParaReconciliar = null;
|
|
530
|
+
const observado = comLockWatcher(pasta, () => {
|
|
335
531
|
const eventos = (0, ledger_1.lerLedger)(dir), resultadoId = `codex:${chave}`;
|
|
336
532
|
const pronto = eventos.find(e => e.tipo === 'phase_result' && e.sensorResultId === resultadoId);
|
|
337
533
|
if (pronto)
|
|
@@ -398,6 +594,27 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
398
594
|
cursor.progressoEm = Math.max(cursor.progressoEm, leitura.quando);
|
|
399
595
|
}
|
|
400
596
|
}
|
|
597
|
+
// Commit MCP é produção do núcleo, mesmo quando app-server não avança o rollout.
|
|
598
|
+
// Só renova inatividade com ambos os processos vivos, dentro deste despacho e
|
|
599
|
+
// sem terminal/erro nativo. Não substitui terminal, close ou prova de conclusão.
|
|
600
|
+
let progressoMcpEventId;
|
|
601
|
+
if (snapshot?.estadoController === 'vivo' && snapshot.estadoRuntime === 'vivo' &&
|
|
602
|
+
['working', 'running'].includes(snapshot.estado) && !snapshot.fechamento &&
|
|
603
|
+
!snapshot.terminalNativo && !snapshot.erro && !snapshot.limitacao) {
|
|
604
|
+
for (const e of (0, session_watcher_claude_1.eventosDoIntervalo)(eventos, sessao)) {
|
|
605
|
+
const quando = Date.parse(e.ts);
|
|
606
|
+
if (e.tipo !== 'mcp_git_committed' || e.thread !== thread.id || e.origem !== 'mcp.git' ||
|
|
607
|
+
e.estadoAuditado !== true || typeof e.commit !== 'string' || !/^[a-f0-9]{40}$/.test(e.commit) ||
|
|
608
|
+
(e.sessionId !== undefined && e.sessionId !== sessionId) ||
|
|
609
|
+
(e.despachoEm !== undefined && e.despachoEm !== sessao.despachadaEm) ||
|
|
610
|
+
quando > now || quando <= cursor.progressoEm)
|
|
611
|
+
continue;
|
|
612
|
+
cresceu = true;
|
|
613
|
+
cursor.crescimentoEm = Math.max(cursor.crescimentoEm, quando);
|
|
614
|
+
cursor.progressoEm = quando;
|
|
615
|
+
progressoMcpEventId = e.eventId;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
401
618
|
// Erro de metadados posterior não obriga a reler o mesmo backlog no restart.
|
|
402
619
|
(0, codex_runner_1.gravarAtomico)(file, cursor);
|
|
403
620
|
const processo = registro?.processoPath ? lerJson(registro.processoPath) : null;
|
|
@@ -482,7 +699,8 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
482
699
|
if (!atuais.some(e => e.sensorEventId === heartbeatId))
|
|
483
700
|
(0, ledger_1.registrar)(dir, thread.id, 'runtime_heartbeat', {
|
|
484
701
|
ts: new Date(cursor.crescimentoEm).toISOString(), fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm,
|
|
485
|
-
sensorEventId: heartbeatId, fonte: 'progresso reconhecido do stream/rollout',
|
|
702
|
+
sensorEventId: heartbeatId, fonte: progressoMcpEventId ? 'mcp_git_committed do despacho' : 'progresso reconhecido do stream/rollout',
|
|
703
|
+
...(progressoMcpEventId ? { mcpEventId: progressoMcpEventId } : {}), bytesLidos,
|
|
486
704
|
});
|
|
487
705
|
cursor.heartbeatEm = cursor.crescimentoEm;
|
|
488
706
|
(0, codex_runner_1.gravarAtomico)(file, cursor);
|
|
@@ -506,10 +724,12 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
506
724
|
terminal = { ...terminal, classificacao: 'gate_blocked', motivo: 'runtime.unavailable' };
|
|
507
725
|
}
|
|
508
726
|
// I-33 (D12): o turno terminou pela CONTA (cota, credito ou login), dito pelo proprio runtime.
|
|
509
|
-
//
|
|
727
|
+
// É bloqueio, nunca conclusão; o retry deriva checkpoint quando já houve produção.
|
|
510
728
|
if (conta)
|
|
511
729
|
terminal = { ...terminal, classificacao: 'gate_blocked', motivo: conta.falha.motivo, falhaDeConta: conta.falha,
|
|
512
730
|
fonte: `${conta.fonte}: ${conta.falha.motivo} (${conta.falha.trecho})` };
|
|
731
|
+
const respostaFinal = terminal.respostaFinal
|
|
732
|
+
? (0, trabalho_thread_1.gravarRespostaFinalDaSessao)(carregado.raiz, thread.id, sessionId, terminal.respostaFinal) : null;
|
|
513
733
|
const dados = { fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm, sensorResultId: resultadoId,
|
|
514
734
|
classificacao: terminal.classificacao, motivo: terminal.motivo, runtime: 'codex', fonte: terminal.fonte,
|
|
515
735
|
fonteVencedora: incompleto || invalido || aberto || descorrelacionado ? null : terminais[0]?.nome ?? null,
|
|
@@ -523,13 +743,18 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
523
743
|
estado: terminal.classificacao === 'fase_concluida' ? 'concluida' : 'bloqueada',
|
|
524
744
|
observadoEm: terminal.timestamp, gate: 'phase.dispatch', origem: 'sessions.watch',
|
|
525
745
|
morteLatenciaMs: morte ? now - cursor.progressoEm : null, ...(perfil ? { perfil } : {}),
|
|
746
|
+
...(respostaFinal ? { respostaFinal: { arquivo: (0, trabalho_thread_1.caminhoDoTrabalho)(thread.id) + respostaFinal.arquivo,
|
|
747
|
+
sha256: respostaFinal.sha256, bytes: respostaFinal.bytes, truncada: respostaFinal.truncada } } : {}),
|
|
526
748
|
...(conta ? { falhaDeConta: { motivo: conta.falha.motivo, resetEm: conta.falha.resetEm, fonte: conta.falha.fonte,
|
|
527
749
|
trecho: conta.falha.trecho } } : {}) };
|
|
528
750
|
const tipo = semTerminal && morte && !incompleto && !conta ? 'sessao_morta' : terminal.classificacao;
|
|
529
751
|
// I-33 (D12): o perfil sai do rodizio na primeira gravacao do resultado, onde a evidencia esta.
|
|
530
752
|
if (conta && perfil && !atuais.some(e => e.tipo === 'phase_result' && e.sensorResultId === resultadoId)) {
|
|
531
753
|
try {
|
|
532
|
-
(0, ratelimit_1.marcarContaDaFalha)(carregado, perfil, conta.falha, now);
|
|
754
|
+
const marcado = (0, ratelimit_1.marcarContaDaFalha)(carregado, perfil, conta.falha, now);
|
|
755
|
+
if (marcado?.esgotadoAte)
|
|
756
|
+
contaParaReconciliar = { perfil, falha: conta.falha,
|
|
757
|
+
esgotadoAte: marcado.esgotadoAte, erroEm: terminal.timestamp };
|
|
533
758
|
}
|
|
534
759
|
catch { /* store ocupado ou invalido: o retry marca de novo pelo gate tipado */ }
|
|
535
760
|
}
|
|
@@ -542,24 +767,21 @@ function observarSessao(carregado, sessionId, opcoes = {}) {
|
|
|
542
767
|
(0, ledger_1.registrar)(dir, thread.id, 'phase_result', dados);
|
|
543
768
|
return { ...base, bytesLidos, concluido: true, classificacao: terminal.classificacao };
|
|
544
769
|
});
|
|
545
|
-
})
|
|
770
|
+
});
|
|
771
|
+
const episodio = contaParaReconciliar;
|
|
772
|
+
if (episodio)
|
|
773
|
+
(0, conta_esgotada_1.reconciliarContaEsgotada)({ raiz: carregado.raiz, agoraMs: now, ...episodio });
|
|
774
|
+
return observado ?? { ...base, ocupado: true };
|
|
546
775
|
}
|
|
547
776
|
catch (e) {
|
|
548
777
|
// Thread apagada no meio da observação: encerra sem erro, sem recriar a pasta e sem resíduo.
|
|
549
778
|
if (!(0, ledger_1.threadPresente)(dir))
|
|
550
779
|
return desfazer();
|
|
551
|
-
if (!/ocupad/.test(e.message) && !(0, ledger_1.registrarSeExiste)(dir, thread.id, 'session_watcher_error', {
|
|
552
|
-
fase: sessao.fase, sessionId, despachoEm: sessao.despachadaEm, motivo: 'runtime.unavailable',
|
|
553
|
-
// Não copiar conteúdo de metadados/logs em mensagens de JSON.parse.
|
|
554
|
-
erro: e instanceof SyntaxError ? 'metadado JSON inválido' : e.message,
|
|
555
|
-
origem: 'sessions.watch',
|
|
556
|
-
}))
|
|
557
|
-
return removida;
|
|
558
780
|
throw e;
|
|
559
781
|
}
|
|
560
782
|
}
|
|
561
|
-
/** Valida
|
|
562
|
-
function
|
|
783
|
+
/** Valida vínculo, variante e perfil sem exigir que o runtime já tenha publicado seus metadados. */
|
|
784
|
+
function validarRegistroWatcher(raiz, sessionId, fonte) {
|
|
563
785
|
const { thread, sessao: registrada } = (0, session_events_1.resolverSessao)(raiz, sessionId);
|
|
564
786
|
const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
|
|
565
787
|
const dir = (0, thread_1.dirThread)(raiz, thread.id);
|
|
@@ -572,9 +794,16 @@ function validarFonteWatcher(raiz, sessionId, fonte) {
|
|
|
572
794
|
// I-33 (D4): perfil invalido ou divergente do despacho reprova antes de observar pela conta errada.
|
|
573
795
|
(0, runtime_profiles_1.perfilDoRegistro)([...eventos, ...(fonte ? [{ tipo: 'session_sensor_registered', sessionId,
|
|
574
796
|
despachoEm: sessao.despachadaEm, ...fonte }] : [])], sessao);
|
|
797
|
+
if (registro.nativo !== undefined && sessao.runtime !== 'claude-bg')
|
|
798
|
+
throw new Error('fonte nativa claude-agents em sessão de outro runtime');
|
|
799
|
+
if (registro.controlador && sessao.runtime !== 'codex')
|
|
800
|
+
throw new Error('fonte do controller Codex em sessão de outro runtime');
|
|
801
|
+
return { thread, sessao, dir, eventos, registro };
|
|
802
|
+
}
|
|
803
|
+
/** Validação profunda feita pelo laço: prontidão eventual nunca impede o registro do vínculo. */
|
|
804
|
+
function validarFonteWatcher(raiz, sessionId, fonte) {
|
|
805
|
+
const { thread, sessao, dir, eventos, registro } = validarRegistroWatcher(raiz, sessionId, fonte);
|
|
575
806
|
if (registro.nativo !== undefined) {
|
|
576
|
-
if (sessao.runtime !== 'claude-bg')
|
|
577
|
-
throw new Error('fonte nativa claude-agents em sessão de outro runtime');
|
|
578
807
|
(0, session_watcher_claude_1.validarFonteClaude)(eventos, sessionId, registro);
|
|
579
808
|
return;
|
|
580
809
|
}
|
|
@@ -593,6 +822,20 @@ function validarFonteWatcher(raiz, sessionId, fonte) {
|
|
|
593
822
|
(0, codex_controller_sensor_1.lerSnapshotController)(fixada);
|
|
594
823
|
}
|
|
595
824
|
}
|
|
825
|
+
/**
|
|
826
|
+
* No despacho, fixa a fonte que já está pronta e recusa corrupção permanente antes de
|
|
827
|
+
* registrar ou iniciar o watcher. A publicação ainda incompleta do controller é deixada
|
|
828
|
+
* para o laço do watcher, que repete a mesma validação profunda com prazo e diagnóstico.
|
|
829
|
+
*/
|
|
830
|
+
function prepararFonteWatcher(raiz, sessionId, fonte) {
|
|
831
|
+
try {
|
|
832
|
+
validarFonteWatcher(raiz, sessionId, fonte);
|
|
833
|
+
}
|
|
834
|
+
catch (e) {
|
|
835
|
+
if (!diagnosticoWatcher(e).transitorio)
|
|
836
|
+
throw e;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
596
839
|
function iniciarWatcher(raiz, sessionId) {
|
|
597
840
|
const { thread, sessao: registrada } = (0, session_events_1.resolverSessao)(raiz, sessionId);
|
|
598
841
|
const sessao = (0, session_events_1.exigirSessaoDespachada)(registrada, sessionId);
|
|
@@ -600,7 +843,7 @@ function iniciarWatcher(raiz, sessionId) {
|
|
|
600
843
|
// I-34: sessão claude-bg despachada antes do registro nativo ganha a fonte derivada do despacho.
|
|
601
844
|
if (sessao.runtime === 'claude-bg')
|
|
602
845
|
(0, session_watcher_claude_1.garantirFonteClaude)(raiz, thread, sessao);
|
|
603
|
-
|
|
846
|
+
validarRegistroWatcher(raiz, sessionId);
|
|
604
847
|
const anterior = (0, ledger_1.lerLedger)(dir).filter(e => e.tipo === 'session_watcher_started' &&
|
|
605
848
|
e.sessionId === sessionId && e.despachoEm === sessao.despachadaEm).at(-1);
|
|
606
849
|
const identidadeAnterior = anterior?.identidade;
|
|
@@ -612,7 +855,7 @@ function iniciarWatcher(raiz, sessionId) {
|
|
|
612
855
|
const err = fs.openSync(path.join(dir, `watcher-${sessionId}.stderr`), 'a', 0o600);
|
|
613
856
|
let child;
|
|
614
857
|
try {
|
|
615
|
-
child = (0, node_child_process_1.spawn)(process.execPath, [__filename, '--run', raiz, sessionId, readyPath, token], {
|
|
858
|
+
child = (0, node_child_process_1.spawn)(process.execPath, [__filename, '--run', raiz, sessionId, readyPath, token, thread.id], {
|
|
616
859
|
cwd: raiz, detached: true, stdio: ['ignore', 'ignore', err],
|
|
617
860
|
});
|
|
618
861
|
}
|
|
@@ -661,47 +904,102 @@ function iniciarWatcher(raiz, sessionId) {
|
|
|
661
904
|
}
|
|
662
905
|
async function acompanhar() {
|
|
663
906
|
const carregado = (0, manifest_1.exigirManifesto)(process.argv[3]), sessionId = process.argv[4];
|
|
664
|
-
const
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
907
|
+
const threadId = process.argv[7] ?? (0, session_events_1.resolverSessao)(carregado.raiz, sessionId).thread.id;
|
|
908
|
+
try {
|
|
909
|
+
const readyPath = process.argv[5], token = process.argv[6];
|
|
910
|
+
if (readyPath && token) {
|
|
911
|
+
validarRegistroWatcher(carregado.raiz, sessionId);
|
|
912
|
+
const sessao = (0, session_events_1.exigirSessaoDespachada)((0, session_events_1.resolverSessao)(carregado.raiz, sessionId, threadId).sessao, sessionId);
|
|
913
|
+
const identidade = (0, codex_runner_1.identidadeProcesso)(process.pid);
|
|
914
|
+
if (!identidade)
|
|
915
|
+
throw new Error('watcher sem identidade propria');
|
|
916
|
+
(0, codex_runner_1.gravarAtomico)(readyPath, { token, sessionId, despachoEm: sessao.despachadaEm, identidade });
|
|
917
|
+
const deadline = Date.now() + 5000;
|
|
918
|
+
while (lerJson(readyPath + '.ack')?.token !== token) {
|
|
919
|
+
if (Date.now() >= deadline)
|
|
920
|
+
throw new Error('watcher sem confirmacao do pai');
|
|
921
|
+
await new Promise(r => setTimeout(r, 10));
|
|
922
|
+
}
|
|
678
923
|
}
|
|
924
|
+
await acompanharSessao(carregado, sessionId, { threadId });
|
|
679
925
|
}
|
|
680
|
-
|
|
926
|
+
catch (e) {
|
|
927
|
+
tentarRegistrarErroWatcher(carregado.raiz, threadId, sessionId, e);
|
|
928
|
+
throw e;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
/** Mesmo laço do processo destacado, com relógio e espera injetáveis para regressões. */
|
|
932
|
+
async function acompanharSessao(carregado, sessionId, opcoes) {
|
|
933
|
+
const dir = (0, thread_1.dirThread)(carregado.raiz, opcoes.threadId);
|
|
934
|
+
const esperar = opcoes.esperar ?? ((ms) => new Promise(r => setTimeout(r, ms)));
|
|
935
|
+
const agora = opcoes.agora ?? Date.now;
|
|
936
|
+
let falhas = 0, tentativas = 0, esperas = 0, ultimaObservacao = agora(), ultimoErro;
|
|
681
937
|
for (;;) {
|
|
682
938
|
// Projeto ou thread apagados encerram o laço em silêncio: nada a observar nem a recriar.
|
|
683
939
|
if (!(0, ledger_1.threadPresente)(dir))
|
|
684
940
|
return;
|
|
685
941
|
let atual;
|
|
686
942
|
try {
|
|
687
|
-
atual = (0, thread_1.lerThread)(carregado.raiz,
|
|
943
|
+
atual = (0, thread_1.lerThread)(carregado.raiz, opcoes.threadId);
|
|
688
944
|
if (atual.status !== 'aberta' || atual.sessoes.at(-1)?.sessionId !== sessionId)
|
|
689
945
|
return;
|
|
690
|
-
|
|
946
|
+
// O laço agrega sua série de erros; a API de observação avulsa diagnostica separadamente.
|
|
947
|
+
const r = observarSemDiagnostico(carregado, sessionId, { threadId: opcoes.threadId, agoraMs: opcoes.agora?.() });
|
|
948
|
+
if (r.ocupado)
|
|
949
|
+
throw new Error('ingestão ocupada; tente novamente');
|
|
950
|
+
if (!r.ocupado) {
|
|
951
|
+
if (falhas)
|
|
952
|
+
tentarRegistrarErroWatcher(carregado.raiz, opcoes.threadId, sessionId, ultimoErro, { falhasConsecutivas: falhas, etapa: 'final', encerramento: 'recuperado' });
|
|
953
|
+
falhas = 0;
|
|
954
|
+
tentativas = 0;
|
|
955
|
+
esperas = 0;
|
|
956
|
+
ultimaObservacao = agora();
|
|
957
|
+
}
|
|
691
958
|
if (r.concluido || r.encerrado)
|
|
692
959
|
return;
|
|
693
960
|
}
|
|
694
961
|
catch (e) {
|
|
695
962
|
if (!(0, ledger_1.threadPresente)(dir))
|
|
696
963
|
return;
|
|
697
|
-
|
|
698
|
-
|
|
964
|
+
esperas++;
|
|
965
|
+
const dados = diagnosticoWatcher(e), ocupado = dados.categoria === 'observacao.ocupada';
|
|
966
|
+
const expirou = agora() - ultimaObservacao >= exports.LIMITE_MORTE_MS;
|
|
967
|
+
// Contenção não é erro. Estado dividido exige nova auditoria; ambos consomem
|
|
968
|
+
// só tempo, sem antecipar os 600 s pelo teto das outras falhas.
|
|
969
|
+
if (!ocupado || expirou) {
|
|
970
|
+
if (ocupado)
|
|
971
|
+
e = new Error('prazo de observação esgotado');
|
|
972
|
+
falhas++;
|
|
973
|
+
if (!ocupado && dados.categoria !== 'estado.dividido')
|
|
974
|
+
tentativas++;
|
|
975
|
+
ultimoErro = e;
|
|
976
|
+
const encerramento = ocupado ? 'prazo' : !dados.transitorio ? 'permanente'
|
|
977
|
+
: expirou ? 'prazo' : tentativas >= exports.MAX_FALHAS_WATCH ? 'tentativas' : undefined;
|
|
978
|
+
if (falhas === 1 || encerramento)
|
|
979
|
+
tentarRegistrarErroWatcher(carregado.raiz, opcoes.threadId, sessionId, e, { falhasConsecutivas: falhas, etapa: encerramento ? 'final' : 'inicial', ...(encerramento ? { encerramento } : {}) });
|
|
980
|
+
if (encerramento)
|
|
981
|
+
throw e;
|
|
982
|
+
}
|
|
699
983
|
}
|
|
700
|
-
await
|
|
984
|
+
await esperar(esperas ? Math.min(exports.MAX_ESPERA_ERRO_WATCH_MS, exports.INTERVALO_WATCH_MS * 2 ** Math.min(esperas - 1, 5), Math.max(1, exports.LIMITE_MORTE_MS - (agora() - ultimaObservacao)))
|
|
985
|
+
: atual?.sessoes.at(-1)?.runtime === 'claude-bg' ? session_watcher_claude_1.INTERVALO_WATCH_CLAUDE_MS : exports.INTERVALO_WATCH_MS);
|
|
701
986
|
}
|
|
702
987
|
}
|
|
703
988
|
if (require.main === module && process.argv[2] === '--run')
|
|
704
|
-
acompanhar().catch(
|
|
705
|
-
|
|
989
|
+
acompanhar().catch(e => {
|
|
990
|
+
// O dispatcher fornece o vínculo antes do spawn: até falha ao carregar o manifesto
|
|
991
|
+
// precisa de diagnóstico. Sem ledger acessível, o stderr não promete um recibo inexistente.
|
|
992
|
+
let registroIndisponivel = !process.argv[7];
|
|
993
|
+
if (process.argv[7]) {
|
|
994
|
+
try {
|
|
995
|
+
registroIndisponivel = !registrarErroWatcher(process.argv[3], process.argv[7], process.argv[4], e);
|
|
996
|
+
}
|
|
997
|
+
catch {
|
|
998
|
+
registroIndisponivel = true;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
process.stderr.write(registroIndisponivel
|
|
1002
|
+
? 'ork watcher: observação interrompida; não foi possível registrar session_watcher_error.\n'
|
|
1003
|
+
: 'ork watcher: observação interrompida; confira session_watcher_error e estado canônico.\n');
|
|
706
1004
|
process.exitCode = 1;
|
|
707
1005
|
});
|
package/dist/sessoes-contas.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.pidVivo = pidVivo;
|
|
37
37
|
exports.ehFantasma = ehFantasma;
|
|
38
|
+
exports.encerradaNaLista = encerradaNaLista;
|
|
38
39
|
exports.contasDeSessoes = contasDeSessoes;
|
|
39
40
|
exports.consultarContas = consultarContas;
|
|
40
41
|
exports.estadosNasContas = estadosNasContas;
|
|
@@ -75,6 +76,14 @@ function pidVivo(pid) {
|
|
|
75
76
|
function ehFantasma(runtime, s, vivo = pidVivo) {
|
|
76
77
|
return runtime === 'claude-bg' && !TERMINAIS.includes(estadoDe(s)) && !vivo(s.pid);
|
|
77
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* RM-037 (ork-rm037esperas, D7): o runtime mostra a sessao encerrada: estado terminal (`done`, `completed`, `exited`,
|
|
81
|
+
* `stopped`, `failed`) ou fantasma, registro sem processo que trabalhe por ele. Domicilio unico dessa leitura: o portao
|
|
82
|
+
* de vaga do `ork phase run` (`vagaDoDespacho`) e a capacidade do #Noctum a usam.
|
|
83
|
+
*/
|
|
84
|
+
function encerradaNaLista(s) {
|
|
85
|
+
return s.fantasma || TERMINAIS.includes(estadoDe(s));
|
|
86
|
+
}
|
|
78
87
|
const real = (dir) => { try {
|
|
79
88
|
return fs.realpathSync(dir);
|
|
80
89
|
}
|
|
@@ -132,7 +141,7 @@ function consultarContas(raiz, opcoes = {}) {
|
|
|
132
141
|
fontes.push({ origem: `claude agents (${rotulo(conta)})`, ok: false, detalhe: e.message });
|
|
133
142
|
continue;
|
|
134
143
|
}
|
|
135
|
-
const r = (0, claude_bg_1.consultarSessoes)(undefined, opcoes.todas, ambiente);
|
|
144
|
+
const r = (0, claude_bg_1.consultarSessoes)(undefined, opcoes.todas, ambiente, opcoes.prazoMs);
|
|
136
145
|
const origem = `claude agents --json${opcoes.todas ? ' --all' : ''} (${rotulo(conta)})`;
|
|
137
146
|
// Fatia 2 do ensaio da 0.5.0 (P1): só o ENOENT antes da consulta prova a fonte ausente; qualquer
|
|
138
147
|
// outra falha do `claude` continua deixando o inventário incompleto.
|
|
@@ -71,7 +71,7 @@ function raizesDeRegistros(cwds) {
|
|
|
71
71
|
function inventariarSessoes(raiz, opcoes = {}) {
|
|
72
72
|
const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
73
73
|
// RM-056 (D4): a conta do processo e cada perfil do store, sem repetir diretorio.
|
|
74
|
-
const contas = (0, sessoes_contas_1.consultarContas)(canonica, { todas: opcoes.todas });
|
|
74
|
+
const contas = (0, sessoes_contas_1.consultarContas)(canonica, { todas: opcoes.todas, ...(opcoes.prazoMs ? { prazoMs: opcoes.prazoMs } : {}) });
|
|
75
75
|
const fontes = contas.fontes;
|
|
76
76
|
const todas = contas.sessoes.map(s => ({ ...s, vinculos: [] }));
|
|
77
77
|
// O cruzamento usa o universo global mesmo quando a apresentação é local.
|