@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
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fatosLocaisDaMaquina = fatosLocaisDaMaquina;
|
|
37
|
+
exports.reconciliarMaquina = reconciliarMaquina;
|
|
38
|
+
exports.passoDaMaquina = passoDaMaquina;
|
|
39
|
+
/**
|
|
40
|
+
* RM-058, fatia N3 (D10 a D14 da ork-rm058n3): o passo de uma máquina num arco #Noctum entre máquinas.
|
|
41
|
+
*
|
|
42
|
+
* Com o envelope `v1` ou `v2`, o passo é o da N2, como está. Com a `v3`, sob a trava `.orkastery/noctum/maquina.lock` (um
|
|
43
|
+
* passo de máquina por raiz de estado), a máquina:
|
|
44
|
+
*
|
|
45
|
+
* 1. reconcilia o que é dela: primeiro a vez de integrar (o merge provado que chegou à base vira entrega, sem integrar de
|
|
46
|
+
* novo; o que chegou fora da base provada espera a inspeção), depois as ordens (conclui pela thread local, encerra a
|
|
47
|
+
* vencida sem sessão viva) e as vagas (pelo desfecho local do despacho), e solta a reserva do arco nos itens sem ordem
|
|
48
|
+
* viva dela. Com o arco revogado aqui, a revogação vai ao ramo e vale em todas; fora do envelope vigente (uma emenda a
|
|
49
|
+
* tirou), o passo para aqui: ela só fecha o que é dela;
|
|
50
|
+
* 2. assume a autoridade quando o arco ainda não tem uma (a primeira vence pela troca atômica), bate e, sendo a
|
|
51
|
+
* autoridade, abandona a vez de integrar de quem não dá sinal e distribui as ordens dos trabalhos livres, com as
|
|
52
|
+
* reservas lidas agora (o item reservado fora do arco espera);
|
|
53
|
+
* 3. com o arco vigente nela, responde as ordens emitidas para ela (aceita ou recusa, com o motivo; antes de a janela
|
|
54
|
+
* abrir aqui, a ordem fica emitida) e toma a reserva da RM-047 de cada ordem aceita, revalidada com leitura nova;
|
|
55
|
+
* reserva de fora, ou item que o roadmap daqui não tem, encerra a ordem que nunca despachou;
|
|
56
|
+
* 4. chama o passo da N2 só com os trabalhos das ordens aceitas e vivas, a reserva revalidada agora e a vaga global tomada
|
|
57
|
+
* no gancho `reservar` da coordenação, depois da reserva local: a sessão só começa se a máquina e a soma das máquinas
|
|
58
|
+
* admitirem.
|
|
59
|
+
*
|
|
60
|
+
* Sem leitura nova do ramo, nada disso acontece e o passo espera (D7). Ninguém chama este passo ainda: o vigia é da N4,
|
|
61
|
+
* que usa a mesma interface para a retomada em outra máquina.
|
|
62
|
+
*/
|
|
63
|
+
const fs = __importStar(require("node:fs"));
|
|
64
|
+
const path = __importStar(require("node:path"));
|
|
65
|
+
const estado_thread_1 = require("./estado-thread");
|
|
66
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
67
|
+
const ledger_1 = require("./ledger");
|
|
68
|
+
const maquina_1 = require("./maquina");
|
|
69
|
+
const noctum_arco_1 = require("./noctum-arco");
|
|
70
|
+
const noctum_capacidade_1 = require("./noctum-capacidade");
|
|
71
|
+
const noctum_coordenacao_1 = require("./noctum-coordenacao");
|
|
72
|
+
const noctum_envelope_1 = require("./noctum-envelope");
|
|
73
|
+
const noctum_execucao_1 = require("./noctum-execucao");
|
|
74
|
+
const noctum_integracao_1 = require("./noctum-integracao");
|
|
75
|
+
const noctum_transporte_1 = require("./noctum-transporte");
|
|
76
|
+
const roadmap_reservas_1 = require("./roadmap-reservas");
|
|
77
|
+
const runtime_profiles_1 = require("./runtime-profiles");
|
|
78
|
+
const thread_1 = require("./thread");
|
|
79
|
+
/** Quanto o passo espera a vez de outro passo desta máquina antes de devolver `aguardar`. */
|
|
80
|
+
const ESPERA_DA_VEZ_DA_MAQUINA_MS = 30_000;
|
|
81
|
+
const primeiraLinha = (e) => String(e?.message ?? e).split('\n')[0].slice(0, 300);
|
|
82
|
+
const pausa = new Int32Array(new SharedArrayBuffer(4));
|
|
83
|
+
/** A trava do passo da máquina: um passo por raiz de estado, para duas reconciliações não soltarem a mesma coisa. */
|
|
84
|
+
function vezDaMaquina(raiz, esperarMs) {
|
|
85
|
+
const principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
86
|
+
(0, estado_thread_1.exigirEstadoSemLink)(principal, ['.orkastery', 'noctum']);
|
|
87
|
+
const dir = path.join(principal, '.orkastery', 'noctum');
|
|
88
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
89
|
+
const prazo = Date.now() + esperarMs;
|
|
90
|
+
for (;;) {
|
|
91
|
+
const fd = (0, fila_pesada_1.tentarTravaExclusiva)(path.join(dir, 'maquina.lock'));
|
|
92
|
+
if (fd !== null || Date.now() >= prazo)
|
|
93
|
+
return fd;
|
|
94
|
+
Atomics.wait(pausa, 0, 0, 200);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Os perfis do store que podem receber despacho agora, como no passo da N2; store ilegível é nenhum perfil. */
|
|
98
|
+
function perfisDoStore(raiz, agoraMs) {
|
|
99
|
+
try {
|
|
100
|
+
return (0, runtime_profiles_1.lerPerfis)(raiz).perfis.filter(p => (0, runtime_profiles_1.perfilDisponivel)(p, agoraMs)).map(p => ({ id: p.id, runtime: p.runtime }));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** A thread local de um trabalho: a do `thread`, ou a única que casa com o item e o sha256 do pedido. */
|
|
107
|
+
function threadDoTrabalho(raiz, t) {
|
|
108
|
+
try {
|
|
109
|
+
if (t.thread)
|
|
110
|
+
return (0, thread_1.lerThread)(raiz, t.thread);
|
|
111
|
+
const sha = (0, noctum_envelope_1.shaDoPedido)(t.pedido ?? '');
|
|
112
|
+
const casam = [];
|
|
113
|
+
for (const id of (0, thread_1.listarIds)(raiz)) {
|
|
114
|
+
try {
|
|
115
|
+
const th = (0, thread_1.lerThread)(raiz, id);
|
|
116
|
+
if (th.roadmap === t.item && th.pedido?.sha256 === sha)
|
|
117
|
+
casam.push(th);
|
|
118
|
+
}
|
|
119
|
+
catch { /* ilegível não decide */ }
|
|
120
|
+
}
|
|
121
|
+
return casam.length === 1 ? casam[0] : null;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* O que esta máquina sabe de si para reconciliar: a janela do arco, o desfecho local de cada reserva de despacho, as
|
|
129
|
+
* sessões que ocupam agora (com lacuna, `null`: incerta é viva) e a thread local de cada trabalho.
|
|
130
|
+
*/
|
|
131
|
+
function fatosLocaisDaMaquina(carregado, arco, estado, quando, consultar) {
|
|
132
|
+
const { raiz } = carregado;
|
|
133
|
+
const local = (0, noctum_arco_1.lerArco)(raiz, arco, quando);
|
|
134
|
+
let sessoesVivas;
|
|
135
|
+
try {
|
|
136
|
+
const cap = (0, noctum_capacidade_1.fatosDeCapacidade)(carregado, { quando, consultar });
|
|
137
|
+
sessoesVivas = cap.lacunas.length ? null : new Set(cap.ocupantes.map(o => o.sessionId).filter((x) => !!x));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
sessoesVivas = null;
|
|
141
|
+
}
|
|
142
|
+
const threads = new Map();
|
|
143
|
+
// Os trabalhos de todas as versões autorizadas: a ordem de uma versão anterior também conclui pela thread local (A4).
|
|
144
|
+
const trabalhos = new Map();
|
|
145
|
+
for (const v of estado.versoes)
|
|
146
|
+
for (const t of v.conteudo.trabalhos ?? [])
|
|
147
|
+
trabalhos.set(t.id, t);
|
|
148
|
+
for (const t of trabalhos.values()) {
|
|
149
|
+
const th = threadDoTrabalho(raiz, t);
|
|
150
|
+
if (!th)
|
|
151
|
+
continue;
|
|
152
|
+
let entregue = false;
|
|
153
|
+
try {
|
|
154
|
+
entregue = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, th.id)).some(e => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
threads.set(t.id, { id: th.id, entregue, fechada: th.status === 'fechada' });
|
|
160
|
+
}
|
|
161
|
+
return { arcoVigente: local?.situacao === 'vigente', sessoesVivas, threads,
|
|
162
|
+
despachos: new Map((local?.despachos ?? []).map(d => [d.seq, { desfecho: d.desfecho, sessionId: d.sessionId, idempotente: d.idempotente }])) };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* A reconciliação desta máquina, na volta ou a cada passo: a integração primeiro (o merge que chegou à base vira entrega
|
|
166
|
+
* sem integrar de novo, e só então a ordem dela pode encerrar), depois as ordens e as vagas, e por fim as reservas do arco
|
|
167
|
+
* nos itens sem ordem viva desta máquina. Lança a recusa tipada da leitura (sem remoto, adulterado).
|
|
168
|
+
*/
|
|
169
|
+
function reconciliarMaquinaComTravaTomada(carregado, arco, opcoes) {
|
|
170
|
+
const quando = opcoes.quando ?? new Date().toISOString();
|
|
171
|
+
const integracao = (0, noctum_integracao_1.reconciliarIntegracao)(carregado, arco, opcoes);
|
|
172
|
+
const estado = (0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, opcoes);
|
|
173
|
+
const fatos = { ...fatosLocaisDaMaquina(carregado, arco, estado, quando, opcoes.consultarSessoes),
|
|
174
|
+
vezesConferidas: new Set(integracao.abandonadasConferidas), vezesSemProva: new Set(integracao.semProva) };
|
|
175
|
+
const reconciliacao = (0, noctum_coordenacao_1.reconciliarCoordenacao)(carregado, arco, fatos, opcoes);
|
|
176
|
+
const reservasSoltas = [];
|
|
177
|
+
const eu = (0, roadmap_reservas_1.quemSouEu)(carregado.raiz, { maquina: opcoes.maquina });
|
|
178
|
+
let painel;
|
|
179
|
+
try {
|
|
180
|
+
painel = (0, roadmap_reservas_1.listarReservas)(carregado.raiz, { remoto: opcoes.remoto ?? carregado.manifesto.fabrica.remoto, rede: opcoes.rede });
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
painel = null;
|
|
184
|
+
}
|
|
185
|
+
if (painel?.atualizado) {
|
|
186
|
+
const soltar = painel.reservas.filter(r => r.maquina === eu.maquina && r.por === eu.por && r.nota === (0, noctum_coordenacao_1.notaDaReserva)(arco) &&
|
|
187
|
+
reconciliacao.itensSemOrdemViva.includes(r.item));
|
|
188
|
+
for (const r of soltar) {
|
|
189
|
+
try {
|
|
190
|
+
if ((0, noctum_coordenacao_1.soltarReservaDoArco)(carregado, arco, r.item, opcoes))
|
|
191
|
+
reservasSoltas.push(r.item);
|
|
192
|
+
}
|
|
193
|
+
catch { /* fica para o passo seguinte */ }
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return { integracao, reconciliacao, reservasSoltas };
|
|
197
|
+
}
|
|
198
|
+
/** A retomada exportada toma a mesma trava do passo; assim, N4 e o passo nunca reconciliam esta máquina em paralelo. */
|
|
199
|
+
function reconciliarMaquina(carregado, arco, opcoes = {}) {
|
|
200
|
+
if (!(0, fila_pesada_1.kernelDisponivel)())
|
|
201
|
+
throw new noctum_envelope_1.RecusaDoArco('noctum.coordenacao.concorrencia', 'sem /usr/bin/flock não há a trava da máquina, e a reconciliação não roda');
|
|
202
|
+
const trava = vezDaMaquina(carregado.raiz, 0);
|
|
203
|
+
if (trava === null)
|
|
204
|
+
throw new noctum_envelope_1.RecusaDoArco('noctum.coordenacao.concorrencia', 'outro passo ou reconciliação desta máquina está em curso');
|
|
205
|
+
try {
|
|
206
|
+
return reconciliarMaquinaComTravaTomada(carregado, arco, opcoes);
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
fs.closeSync(trava);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const aguardar = (motivo, detalhe, relatorio) => ({ acao: 'aguardar', motivo, detalhe, relatorio });
|
|
213
|
+
/**
|
|
214
|
+
* Um passo desta máquina no arco. Com o envelope `v3`, coordena pelo ramo e chama o passo da N2 com a ordem, a reserva e a
|
|
215
|
+
* vaga global; com `v1` ou `v2`, é o passo da N2 como está. Toda recusa tipada da coordenação volta como `aguardar`.
|
|
216
|
+
*/
|
|
217
|
+
function passoDaMaquina(carregado, arco, opcoes = {}) {
|
|
218
|
+
const quando = opcoes.quando ?? new Date().toISOString();
|
|
219
|
+
const { raiz } = carregado;
|
|
220
|
+
const local = (0, noctum_arco_1.lerArco)(raiz, arco, quando);
|
|
221
|
+
if (!local?.conteudo || !(0, noctum_envelope_1.envelopeMultimaquina)(local.conteudo)) {
|
|
222
|
+
return { acao: 'uma-maquina', passo: (0, noctum_execucao_1.passoDoArco)(carregado, arco, { ...opcoes.n2, quando, maquina: opcoes.maquina }) };
|
|
223
|
+
}
|
|
224
|
+
const eu = (0, maquina_1.nomeDaMaquina)(opcoes.maquina);
|
|
225
|
+
const relatorio = { maquina: eu, autoridade: null, integracao: null, reconciliacao: null, reservasSoltas: [],
|
|
226
|
+
ordensEmitidas: [], vezesAbandonadas: [], respostas: [], reservas: [], trabalhos: [] };
|
|
227
|
+
if (!(0, fila_pesada_1.kernelDisponivel)())
|
|
228
|
+
return aguardar('sem-trava-do-kernel', 'o arco entre máquinas só anda com /usr/bin/flock', relatorio);
|
|
229
|
+
const trava = vezDaMaquina(raiz, ESPERA_DA_VEZ_DA_MAQUINA_MS);
|
|
230
|
+
if (trava === null)
|
|
231
|
+
return aguardar('noctum.coordenacao.concorrencia', 'outro passo desta máquina está em curso', relatorio);
|
|
232
|
+
const op = { remoto: opcoes.remoto, maquina: opcoes.maquina, quando, rede: opcoes.rede };
|
|
233
|
+
try {
|
|
234
|
+
// 1. A reconciliação do que é desta máquina; vale até fora do envelope vigente e com o arco revogado.
|
|
235
|
+
const rec = reconciliarMaquinaComTravaTomada(carregado, arco, { ...op, consultarSessoes: opcoes.consultarSessoes ?? opcoes.n2?.consultarSessoes });
|
|
236
|
+
Object.assign(relatorio, { integracao: rec.integracao, reconciliacao: rec.reconciliacao, reservasSoltas: rec.reservasSoltas });
|
|
237
|
+
let estado = (0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, op);
|
|
238
|
+
relatorio.autoridade = estado.autoridade;
|
|
239
|
+
const c = estado.vigente.conteudo;
|
|
240
|
+
const chave = (0, noctum_transporte_1.identidadeDaMaquina)(raiz, opcoes.maquina).chave;
|
|
241
|
+
// S1 da rodada 2: a revogação do dono vai ao ramo antes de tudo, também da máquina que uma emenda tirou do arco (ela
|
|
242
|
+
// assina sob a última versão em que estava, como o resto do que fecha).
|
|
243
|
+
if (local.situacao === 'revogado') {
|
|
244
|
+
(0, noctum_coordenacao_1.revogarNaRede)(carregado, arco, op);
|
|
245
|
+
return aguardar('noctum.efeito.revogado', `o arco ${arco} foi revogado pelo dono nesta máquina; a revogação foi ao ramo e vale nas outras`, relatorio);
|
|
246
|
+
}
|
|
247
|
+
if (!(0, noctum_envelope_1.envelopeMultimaquina)(c) || !c.maquinas.some(m => m.nome === eu && m.chave === chave)) {
|
|
248
|
+
return aguardar('noctum.coordenacao.fora-do-envelope', `a máquina ${eu} não está no envelope vigente do arco; ela só fecha o que é dela`, relatorio);
|
|
249
|
+
}
|
|
250
|
+
if (estado.revogada) {
|
|
251
|
+
return aguardar('noctum.coordenacao.revogada', `o arco ${arco} foi revogado na máquina ${estado.revogada.por}; esta só fecha o que é dela`, relatorio);
|
|
252
|
+
}
|
|
253
|
+
// 2. A autoridade vaga, a batida, o abandono da vez de quem não dá sinal e a distribuição, com as reservas lidas agora.
|
|
254
|
+
if (!estado.autoridade && local.situacao === 'vigente') {
|
|
255
|
+
try {
|
|
256
|
+
(0, noctum_coordenacao_1.assumirAutoridade)(carregado, arco, op);
|
|
257
|
+
}
|
|
258
|
+
catch (e) {
|
|
259
|
+
if (!(e instanceof noctum_envelope_1.RecusaDoArco) || e.motivo !== 'noctum.coordenacao.autoridade-ativa')
|
|
260
|
+
throw e;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const quem = (0, roadmap_reservas_1.quemSouEu)(raiz, { maquina: opcoes.maquina });
|
|
264
|
+
let painel;
|
|
265
|
+
try {
|
|
266
|
+
painel = (0, roadmap_reservas_1.listarReservas)(raiz, { remoto: op.remoto ?? carregado.manifesto.fabrica.remoto, rede: op.rede });
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
painel = null;
|
|
270
|
+
}
|
|
271
|
+
const vistas = painel?.atualizado ? (0, noctum_coordenacao_1.vistasDasReservas)(painel.reservas) : null;
|
|
272
|
+
const distribuicao = (0, noctum_coordenacao_1.gravarNaCoordenacao)(carregado, arco, op, (leitura) => {
|
|
273
|
+
const e = (0, noctum_coordenacao_1.derivarCoordenacao)(leitura);
|
|
274
|
+
// Sem a leitura das reservas, nenhuma ordem sai: o item reservado fora do arco iria e voltaria.
|
|
275
|
+
const ordens = local.situacao === 'vigente' && vistas ? (0, noctum_coordenacao_1.registrosDaDistribuicao)(e, eu, quando, vistas) : [];
|
|
276
|
+
const abandonos = (0, noctum_coordenacao_1.registrosDosAbandonos)(e, eu, quando);
|
|
277
|
+
// A2 da revisão do merge com a N6: a máquina em que o fechamento encerrou o arco para de bater. Sem sinal há mais de 15
|
|
278
|
+
// min, a autoridade não manda mais ordem para ela, e a tomada forçada da autoridade dela passa a valer.
|
|
279
|
+
const batida = local.situacao === 'encerrado' ? [] : [{ tipo: 'batida' }];
|
|
280
|
+
return { novos: [...batida, ...abandonos, ...ordens],
|
|
281
|
+
resultado: { ordens: ordens.map(o => String(o.ordem)), abandonos: abandonos.map(x => `${String(x.chave)}/${String(x.n)}`) } };
|
|
282
|
+
});
|
|
283
|
+
relatorio.ordensEmitidas = distribuicao.resultado.ordens;
|
|
284
|
+
relatorio.vezesAbandonadas = distribuicao.resultado.abandonos;
|
|
285
|
+
// 3. As respostas às ordens desta máquina e as reservas das aceitas: o item que outra máquina ou pessoa reservou é
|
|
286
|
+
// recusado de saída, e a reserva que já é desta máquina está revalidada pela leitura de agora.
|
|
287
|
+
const threadsLocais = new Map();
|
|
288
|
+
for (const id of (0, thread_1.listarIds)(raiz)) {
|
|
289
|
+
try {
|
|
290
|
+
const th = (0, thread_1.lerThread)(raiz, id);
|
|
291
|
+
threadsLocais.set(id, { roadmap: th.roadmap ?? null, modo: th.modo });
|
|
292
|
+
}
|
|
293
|
+
catch { /* ilegível não é aceita */ }
|
|
294
|
+
}
|
|
295
|
+
const itensDeOutros = painel?.atualizado
|
|
296
|
+
? new Set(painel.reservas.filter(r => r.maquina !== quem.maquina || r.por !== quem.por).map(r => r.item)) : undefined;
|
|
297
|
+
// A-R2A-3 da rodada 2: com o arco ainda não vigente aqui (o relógio daqui atrás do da autoridade, na borda da janela), a
|
|
298
|
+
// máquina não responde: a ordem fica emitida até a janela abrir, em vez de virar recusa que a exclui nesta versão. Com o
|
|
299
|
+
// arco encerrado aqui pela N6, que é terminal, ela recusa o que chegar, e o trabalho vai a outra máquina (A2 da revisão).
|
|
300
|
+
const respostas = (0, noctum_coordenacao_1.gravarNaCoordenacao)(carregado, arco, op, (leitura) => {
|
|
301
|
+
const novos = local.situacao === 'vigente' || local.situacao === 'encerrado'
|
|
302
|
+
? (0, noctum_coordenacao_1.registrosDasRespostas)((0, noctum_coordenacao_1.derivarCoordenacao)(leitura), eu, { arcoVigente: local.situacao === 'vigente', arcoEncerrado: local.situacao === 'encerrado', threadsLocais, itensDeOutros })
|
|
303
|
+
: [];
|
|
304
|
+
return { novos, resultado: novos.map(r => ({ ordem: String(r.ordem), recibo: String(r.recibo), motivo: String(r.motivo) })) };
|
|
305
|
+
});
|
|
306
|
+
relatorio.respostas = respostas.resultado;
|
|
307
|
+
estado = (0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, op);
|
|
308
|
+
relatorio.autoridade = estado.autoridade;
|
|
309
|
+
const minhas = [...estado.ordens.values()].filter(o => o.maquina === eu && o.estado === 'aceita' && o.envelopeSha256 === estado.vigente.envelopeSha256);
|
|
310
|
+
const reservadas = [];
|
|
311
|
+
const permitidos = new Set();
|
|
312
|
+
for (const o of minhas) {
|
|
313
|
+
const t = estado.vigente.conteudo.trabalhos.find(x => x.id === o.trabalho);
|
|
314
|
+
const thread = threadDoTrabalho(raiz, t)?.id ?? null;
|
|
315
|
+
const atual = painel?.atualizado ? painel.reservas.find(x => x.item === o.item) : undefined;
|
|
316
|
+
// A thread da reserva é informativa: renovar a cada passo por ela só faria commit novo no ramo de reservas.
|
|
317
|
+
const jaMinha = !!atual && atual.maquina === quem.maquina && atual.por === quem.por;
|
|
318
|
+
const r = !painel?.atualizado ? { ok: false, motivo: 'noctum.coordenacao.sem-remoto', detalhe: 'as reservas não se leram agora' }
|
|
319
|
+
: jaMinha ? { ok: true, acao: 'revalidada' } : (0, noctum_coordenacao_1.tomarReservaDoTrabalho)(carregado, arco, o.ordem, thread, op);
|
|
320
|
+
relatorio.reservas.push({ ordem: o.ordem, item: o.item, ok: r.ok, motivo: r.ok ? null : r.motivo });
|
|
321
|
+
if (r.ok) {
|
|
322
|
+
permitidos.add(o.trabalho);
|
|
323
|
+
if (!reservadas.some(x => x.item === o.item))
|
|
324
|
+
reservadas.push({ item: o.item, thread });
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
// A reserva de outra máquina ou pessoa, ou o item que o roadmap daqui não tem: a ordem que nunca despachou acaba aqui,
|
|
328
|
+
// com o motivo tipado e só o item (o nome de quem reservou nunca vai ao ramo); a que tem vaga fica.
|
|
329
|
+
if (r.motivo !== 'noctum.coordenacao.sem-remoto' && !estado.vagas.some(v => v.ordem === o.ordem)) {
|
|
330
|
+
const motivo = r.motivo === 'noctum.reserva.item-invalido'
|
|
331
|
+
? `noctum.reserva.item-invalido: o item ${o.item} não está no roadmap desta máquina` : (0, noctum_coordenacao_1.motivoDaReservaDeFora)(o.item);
|
|
332
|
+
try {
|
|
333
|
+
(0, noctum_coordenacao_1.encerrarOrdem)(carregado, arco, o.ordem, { motivo, checkpoint: { thread, vagasSoltas: [] } }, op);
|
|
334
|
+
}
|
|
335
|
+
catch (e) {
|
|
336
|
+
// N1 do CHECK-REVERIFY do GO-FIX 8: a ordem cuja vez de integrar ainda não tem prova espera a reconciliação (ou a
|
|
337
|
+
// inspeção do dono), e o passo segue com as outras ordens desta máquina.
|
|
338
|
+
if (!(e instanceof noctum_envelope_1.RecusaDoArco) || (e.motivo !== 'noctum.integracao.nao-provada' && e.motivo !== 'noctum.integracao.base-nao-provada'))
|
|
339
|
+
throw e;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
relatorio.trabalhos = [...permitidos].sort();
|
|
344
|
+
// A conta sem vaga global agora não entra na escolha da N2, para o despacho sair por outra que tenha (a vaga do gancho
|
|
345
|
+
// continua sendo a conferência de verdade). Sem nenhuma, o passo espera a vaga em vez de despachar para ouvir a recusa.
|
|
346
|
+
const semVaga = (0, noctum_coordenacao_1.contasSemVagaGlobal)(estado);
|
|
347
|
+
const cv = estado.vigente.conteudo;
|
|
348
|
+
if (permitidos.size && (0, noctum_envelope_1.envelopeMultimaquina)(cv) && cv.capacidadeGlobal.porConta.every(x => semVaga.has(x.conta))) {
|
|
349
|
+
return aguardar('noctum.coordenacao.vaga-global', 'nenhuma conta do envelope tem vaga somando as máquinas agora', relatorio);
|
|
350
|
+
}
|
|
351
|
+
const perfisDaN2 = opcoes.n2?.perfis ?? (() => perfisDoStore(raiz, Date.parse(quando)));
|
|
352
|
+
// 4. O passo da N2, só com o que o ramo deu a esta máquina, e a vaga global no gancho da reserva da coordenação.
|
|
353
|
+
const ordemDoTrabalho = new Map(minhas.filter(o => permitidos.has(o.trabalho)).map(o => [o.trabalho, o.ordem]));
|
|
354
|
+
const reservar = (raizDoPasso, pedido, q) => {
|
|
355
|
+
const ordem = ordemDoTrabalho.get(pedido.trabalho);
|
|
356
|
+
if (!ordem)
|
|
357
|
+
throw new noctum_envelope_1.RecusaDoArco('noctum.coordenacao.ordem-vencida', `o trabalho ${pedido.trabalho} não tem ordem aceita desta máquina`);
|
|
358
|
+
const r = (0, noctum_arco_1.reservarDespacho)(raizDoPasso, pedido, q);
|
|
359
|
+
try {
|
|
360
|
+
(0, noctum_coordenacao_1.tomarVagaGlobal)(carregado, arco, { ordem, conta: pedido.conta, runtime: pedido.runtime, reserva: r.seq }, { ...op, quando: q });
|
|
361
|
+
}
|
|
362
|
+
catch (e) {
|
|
363
|
+
const recusa = e instanceof noctum_envelope_1.RecusaDoArco ? e : new noctum_envelope_1.RecusaDoArco('noctum.coordenacao.sem-remoto', primeiraLinha(e));
|
|
364
|
+
(0, noctum_arco_1.concluirDespacho)(raizDoPasso, arco, r.seq, { motivo: recusa.motivo });
|
|
365
|
+
throw recusa;
|
|
366
|
+
}
|
|
367
|
+
return r;
|
|
368
|
+
};
|
|
369
|
+
const passo = (0, noctum_execucao_1.passoDoArco)(carregado, arco, { ...opcoes.n2, quando, maquina: opcoes.maquina,
|
|
370
|
+
perfis: () => perfisDaN2().filter(p => !semVaga.has(p.id)),
|
|
371
|
+
lerReservas: () => ({ leitura: 'copia-local', reservas: reservadas.map(x => ({ item: x.item, maquina: eu, thread: x.thread })) }),
|
|
372
|
+
coordenacao: { trabalhos: permitidos, entregues: (0, noctum_coordenacao_1.entreguesNaRede)(estado), encerrados: (0, noctum_coordenacao_1.encerradosNaRede)(estado), reservar } });
|
|
373
|
+
return { acao: 'passo', passo, relatorio };
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
if (!(e instanceof noctum_envelope_1.RecusaDoArco))
|
|
377
|
+
throw e;
|
|
378
|
+
return aguardar(e.motivo, e.message, relatorio);
|
|
379
|
+
}
|
|
380
|
+
finally {
|
|
381
|
+
fs.closeSync(trava);
|
|
382
|
+
}
|
|
383
|
+
}
|